diff options
Diffstat (limited to 'java')
357 files changed, 9467 insertions, 11337 deletions
diff --git a/java/proguard.flags b/java/proguard.flags index f7b7f2898..35b3ac3d3 100644 --- a/java/proguard.flags +++ b/java/proguard.flags @@ -17,7 +17,8 @@ # 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.utils.LanguageModelParam -keep class com.android.inputmethod.latin.AssetFileAddress --keep class com.android.inputmethod.latin.makedict.ProbabilityInfo -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/emoji_category_tab_selected_lxx_dark.9.png b/java/res/drawable-hdpi/emoji_category_tab_selected_lxx_dark.9.png Binary files differdeleted file mode 100644 index ca981f4f4..000000000 --- a/java/res/drawable-hdpi/emoji_category_tab_selected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/drawable-hdpi/emoji_category_tab_unselected_lxx_dark.9.png b/java/res/drawable-hdpi/emoji_category_tab_unselected_lxx_dark.9.png Binary files differdeleted file mode 100644 index 10b1dd2cb..000000000 --- a/java/res/drawable-hdpi/emoji_category_tab_unselected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/emoji_category_tab_selected_lxx_dark.9.png b/java/res/drawable-mdpi/emoji_category_tab_selected_lxx_dark.9.png Binary files differdeleted file mode 100644 index a08735cb4..000000000 --- a/java/res/drawable-mdpi/emoji_category_tab_selected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/drawable-mdpi/emoji_category_tab_unselected_lxx_dark.9.png b/java/res/drawable-mdpi/emoji_category_tab_unselected_lxx_dark.9.png Binary files differdeleted file mode 100644 index 4cf8f5c41..000000000 --- a/java/res/drawable-mdpi/emoji_category_tab_unselected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/emoji_category_tab_selected_lxx_dark.9.png b/java/res/drawable-xhdpi/emoji_category_tab_selected_lxx_dark.9.png Binary files differdeleted file mode 100644 index 65a54b813..000000000 --- a/java/res/drawable-xhdpi/emoji_category_tab_selected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/drawable-xhdpi/emoji_category_tab_unselected_lxx_dark.9.png b/java/res/drawable-xhdpi/emoji_category_tab_unselected_lxx_dark.9.png Binary files differdeleted file mode 100644 index 666b35471..000000000 --- a/java/res/drawable-xhdpi/emoji_category_tab_unselected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/drawable-xxhdpi/emoji_category_tab_selected_lxx_dark.9.png b/java/res/drawable-xxhdpi/emoji_category_tab_selected_lxx_dark.9.png Binary files differdeleted file mode 100644 index 084554f3d..000000000 --- a/java/res/drawable-xxhdpi/emoji_category_tab_selected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/drawable-xxhdpi/emoji_category_tab_unselected_lxx_dark.9.png b/java/res/drawable-xxhdpi/emoji_category_tab_unselected_lxx_dark.9.png Binary files differdeleted file mode 100644 index 62547a90f..000000000 --- a/java/res/drawable-xxhdpi/emoji_category_tab_unselected_lxx_dark.9.png +++ /dev/null diff --git a/java/res/layout/emoji_palettes_view.xml b/java/res/layout/emoji_palettes_view.xml index e2933f96f..68fd37261 100644 --- a/java/res/layout/emoji_palettes_view.xml +++ b/java/res/layout/emoji_palettes_view.xml @@ -41,9 +41,7 @@ android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="match_parent" - android:divider="@null" - android:tabStripEnabled="true" - style="?attr/emojiTabWidgetStyle" /> + android:divider="@null" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dip" @@ -77,8 +75,7 @@ <com.android.inputmethod.keyboard.emoji.EmojiCategoryPageIndicatorView android:id="@+id/emoji_category_page_id_view" android:layout_width="match_parent" - android:layout_height="2dip" - style="?attr/emojiCategoryPageIndicatorViewStyle" /> + android:layout_height="2dip" /> <LinearLayout android:id="@+id/emoji_action_bar" android:orientation="horizontal" 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 fb5c27815..000000000 --- a/java/res/layout/research_feedback_fragment_layout.xml +++ /dev/null @@ -1,115 +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 - 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> -</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/values-af/strings-action-keys.xml b/java/res/values-af/strings-action-keys.xml index c5cd71ab7..bef175b16 100644 --- a/java/res/values-af/strings-action-keys.xml +++ b/java/res/values-af/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-af/strings-talkback-descriptions.xml index 439b39119..aee891bf0 100644 --- a/java/res/values-af/strings-talkback-descriptions.xml +++ b/java/res/values-af/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml index ce7cb18fc..187aa4b89 100644 --- a/java/res/values-af/strings.xml +++ b/java/res/values-af/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-am/strings-action-keys.xml b/java/res/values-am/strings-action-keys.xml index 1813a86d8..26e45135b 100644 --- a/java/res/values-am/strings-action-keys.xml +++ b/java/res/values-am/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"ቀዳሚ"</string> <string name="label_done_key" msgid="7564866296502630852">"ተደርጓል"</string> <string name="label_send_key" msgid="482252074224462163">"ላክ"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-am/strings-talkback-descriptions.xml index 79c4d08ec..aab15878d 100644 --- a/java/res/values-am/strings-talkback-descriptions.xml +++ b/java/res/values-am/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml index 32eed413b..651c642cb 100644 --- a/java/res/values-am/strings.xml +++ b/java/res/values-am/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-ar/strings-action-keys.xml b/java/res/values-ar/strings-action-keys.xml index 481b22f20..1ee4f7a2d 100644 --- a/java/res/values-ar/strings-action-keys.xml +++ b/java/res/values-ar/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"سابق"</string> <string name="label_done_key" msgid="7564866296502630852">"تم"</string> <string name="label_send_key" msgid="482252074224462163">"إرسال"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-ar/strings-talkback-descriptions.xml index a9110a7b5..1e5ec4494 100644 --- a/java/res/values-ar/strings-talkback-descriptions.xml +++ b/java/res/values-ar/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index 13aef2a67..a907ba885 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-az-rAZ/strings-action-keys.xml b/java/res/values-az-rAZ/strings-action-keys.xml index 513712c40..7f982d686 100644 --- a/java/res/values-az-rAZ/strings-action-keys.xml +++ b/java/res/values-az-rAZ/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-az-rAZ/strings-emoji-descriptions.xml b/java/res/values-az-rAZ/strings-emoji-descriptions.xml index 60e9de947..a9bfb7763 100644 --- a/java/res/values-az-rAZ/strings-emoji-descriptions.xml +++ b/java/res/values-az-rAZ/strings-emoji-descriptions.xml @@ -25,7 +25,7 @@ <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">"Informasiya mənbəyi"</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> @@ -55,7 +55,7 @@ <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">"Damcılı çətir"</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> @@ -63,7 +63,7 @@ <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">"Leo"</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> @@ -74,12 +74,12 @@ <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 qaval"</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"</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> @@ -91,12 +91,12 @@ <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">"Bayraqda deşik"</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ğ ağır qeyd nişanı"</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> @@ -104,8 +104,8 @@ <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">"Ağır qeyd nişanı"</string> - <string name="spoken_emoji_2716" msgid="511941294762977228">"Ağır vurma x"</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> @@ -116,23 +116,23 @@ <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">"Ağır nida işarəsi"</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">"Ağır toplama işarəsi"</string> - <string name="spoken_emoji_2796" msgid="5990926508250772777">"Ağır çıxma işarəsi"</string> - <string name="spoken_emoji_2797" msgid="24694184172879174">"Ağır bölmə işarəsi"</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">"Buruq petlə"</string> - <string name="spoken_emoji_27BF" msgid="4940514642375640510">"İkiqat buruq petlə"</string> - <string name="spoken_emoji_2934" msgid="9062130477982973457">"Yuxarı əyilən sağa ox"</string> - <string name="spoken_emoji_2935" msgid="6198710960720232074">"Aşağı əyilən 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">"Ağır böyük çevrə"</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> @@ -163,18 +163,18 @@ <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 ideoqraf"</string> - <string name="spoken_emoji_1F238" msgid="5504414186438196912">"Kvadrat tətbiq ideoqrafı"</string> - <string name="spoken_emoji_1F239" msgid="1634067311597618959">"Kvadrat endirim ideoqrafı"</string> - <string name="spoken_emoji_1F23A" msgid="3107862957630169536">"Kvadrat biznes ideoqrafı"</string> - <string name="spoken_emoji_1F250" msgid="6586943922806727907">"Çevrəli üstünlük ideoqrafı"</string> - <string name="spoken_emoji_1F251" msgid="9099032855993346948">"Çevrəli qəbul ideoqrafı"</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">"Sunrise"</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> @@ -213,14 +213,14 @@ <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">"Blossom"</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">"Küləyin apardığı 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> @@ -245,11 +245,11 @@ <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">"Buxarlı fincan"</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">"Qovulmuş şirin 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> @@ -267,7 +267,7 @@ <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">"Qida dibçəyi"</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> @@ -282,8 +282,8 @@ <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">"Midal yolkası"</string> - <string name="spoken_emoji_1F385" msgid="1754174063483626367">"Noel ata"</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> @@ -291,14 +291,14 @@ <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 dekorasiya"</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_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> @@ -307,7 +307,7 @@ <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">"Papaq"</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> @@ -316,8 +316,8 @@ <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">"Oyun ölüm"</string> - <string name="spoken_emoji_1F3B3" msgid="5180870610771027520">"Bowling"</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> @@ -327,15 +327,15 @@ <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">"Qaçan qurşaqlı köynək"</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">"Ski və ski çəkməsi"</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çağan"</string> - <string name="spoken_emoji_1F3C4" msgid="8468355585994639838">"Sörfer"</string> - <string name="spoken_emoji_1F3C6" msgid="9094474706847545409">"Qənimət"</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> @@ -353,14 +353,14 @@ <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">"Fabrika"</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 qəsri"</string> - <string name="spoken_emoji_1F3F0" msgid="1544632297502291578">"Avropa qəsri"</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">"Buyvol"</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> @@ -369,7 +369,7 @@ <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">"Ilan"</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> @@ -382,7 +382,7 @@ <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">"Spiral qabıq"</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> @@ -393,8 +393,8 @@ <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">"Balaca cücə üz tərəfdən"</string> - <string name="spoken_emoji_1F426" msgid="2163979138772892755">"Bird"</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> @@ -407,7 +407,7 @@ <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">"Fontanlı balina"</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> @@ -424,12 +424,12 @@ <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">"Ağ yuxarı göstərən bekhend indeks"</string> - <string name="spoken_emoji_1F447" msgid="8794022344940891388">"Ağ aşağı göstərən bekhend indeks"</string> - <string name="spoken_emoji_1F448" msgid="3261812959215550650">"Ağ sola göstərən bekhend indeks"</string> - <string name="spoken_emoji_1F449" msgid="4764447975177805991">"Ağ sağa göstərən bekhend indeks"</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 ən 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> @@ -439,14 +439,14 @@ <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">"T-shirt"</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">"Sumka"</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> @@ -460,13 +460,13 @@ <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əvi"</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">"Örtüklü gəlin"</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> @@ -480,29 +480,29 @@ <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 monster"</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">"Pomada"</string> - <string name="spoken_emoji_1F485" msgid="6133507975565116339">"Lak"</string> - <string name="spoken_emoji_1F486" msgid="9085459968247394155">"Üz massajı"</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üş"</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">"Səs"</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_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">"Qırılmış ürək"</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> @@ -520,7 +520,7 @@ <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">"Sıçrayan damcı işarəsi"</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> @@ -534,13 +534,13 @@ <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əsi əskinaz"</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">"Oturac"</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> @@ -549,17 +549,17 @@ <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">"Əyilmiş səhifə"</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">"Cırılan 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">"Kanselyar düyməsi"</string> - <string name="spoken_emoji_1F4CD" msgid="4266572175361190231">"Yumru kanselyar düyməsi"</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> @@ -578,12 +578,12 @@ <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">"Fak cihazı"</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">"İctimai meqafon"</string> - <string name="spoken_emoji_1F4E3" msgid="5588916572878599224">"Sevincli meqafon"</string> - <string name="spoken_emoji_1F4E4" msgid="2063561529097749707">"Gedən sənəd siyirtməsi"</string> - <string name="spoken_emoji_1F4E5" msgid="3232462702926143576">"Gələn sənəd siyirtməsi"</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> @@ -600,23 +600,23 @@ <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">"Çubuqlu antenna"</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">"Əyilmiş sağa oxlar"</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əttli dinamik"</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 səs xəttli dinamik"</string> - <string name="spoken_emoji_1F50A" msgid="5818194948677277197">"Üç səs xəttli 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> @@ -624,18 +624,18 @@ <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">"Kilidlə"</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">"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">"Tezliklə üzərində sağa oxlarla"</string> - <string name="spoken_emoji_1F51D" msgid="4087697222026095447">"Yuxarıda üzərində yuxarıya oxlarla"</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> @@ -704,7 +704,7 @@ <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ümsyə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> @@ -714,7 +714,7 @@ <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">"Ifadəsiz 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> @@ -724,9 +724,9 @@ <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 çıxardan sima"</string> - <string name="spoken_emoji_1F61C" msgid="198943912107589389">"Dil çıxardan və göz vuran sima"</string> - <string name="spoken_emoji_1F61D" msgid="7643546385877816182">"Qapalı gözlərlə dil çıxardan 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> @@ -741,7 +741,7 @@ <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">"Qrimaslı 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> @@ -811,10 +811,10 @@ <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 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">"Postda üçbucaq bayraq"</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> diff --git a/java/res/values-az-rAZ/strings-talkback-descriptions.xml b/java/res/values-az-rAZ/strings-talkback-descriptions.xml index 0ff31f3b4..3a0596e56 100644 --- a/java/res/values-az-rAZ/strings-talkback-descriptions.xml +++ b/java/res/values-az-rAZ/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-az-rAZ/strings.xml b/java/res/values-az-rAZ/strings.xml index 5a40e9f14..f1f3e22ab 100644 --- a/java/res/values-az-rAZ/strings.xml +++ b/java/res/values-az-rAZ/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">"Daxiletmə seçimləri"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Araşdırma Jurnalı Əmrlə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> @@ -84,8 +83,6 @@ <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="prefs_enable_log" msgid="6620424505072963557">"İstifadəçi əks əlaqəsini aktiv et"</string> - <string name="prefs_description_log" msgid="7525225584555429211">"İstifadə statistikası və xəta haqqında hesabatları avtomatik göndərməklə daxiletmə metodu redaktəsini təkmilləşdirməyə kömək edin."</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> @@ -118,7 +115,6 @@ <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_usability_study_mode" msgid="1261130555134595254">"Rahat işləmə rejimi"</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> diff --git a/java/res/values-bg/strings-action-keys.xml b/java/res/values-bg/strings-action-keys.xml index 13374a29c..3d295bba4 100644 --- a/java/res/values-bg/strings-action-keys.xml +++ b/java/res/values-bg/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string> <string name="label_done_key" msgid="7564866296502630852">"Готово"</string> <string name="label_send_key" msgid="482252074224462163">"Изпр."</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-bg/strings-talkback-descriptions.xml index 6997424c1..3f0ac83fc 100644 --- a/java/res/values-bg/strings-talkback-descriptions.xml +++ b/java/res/values-bg/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index 562e71b4f..c18b1083c 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-ca/strings-action-keys.xml b/java/res/values-ca/strings-action-keys.xml index 9dcf219cc..5dcf4a337 100644 --- a/java/res/values-ca/strings-action-keys.xml +++ b/java/res/values-ca/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-ca/strings-talkback-descriptions.xml index bd6077ad0..4097d9375 100644 --- a/java/res/values-ca/strings-talkback-descriptions.xml +++ b/java/res/values-ca/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index e946ba78b..bb5b05413 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-cs/strings-action-keys.xml b/java/res/values-cs/strings-action-keys.xml index e9545feca..0ff3506b5 100644 --- a/java/res/values-cs/strings-action-keys.xml +++ b/java/res/values-cs/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-cs/strings-talkback-descriptions.xml index 0e35c8239..dae9b7886 100644 --- a/java/res/values-cs/strings-talkback-descriptions.xml +++ b/java/res/values-cs/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index c093d8c50..b805d2820 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-da/strings-action-keys.xml b/java/res/values-da/strings-action-keys.xml index 757dc00d4..96021e5a9 100644 --- a/java/res/values-da/strings-action-keys.xml +++ b/java/res/values-da/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-da/strings-talkback-descriptions.xml b/java/res/values-da/strings-talkback-descriptions.xml index 669c18375..53326b344 100644 --- a/java/res/values-da/strings-talkback-descriptions.xml +++ b/java/res/values-da/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index 65025b7a8..36263c65e 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/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">"Indstillinger for input"</string> - <string name="english_ime_research_log" msgid="8492602295696577851">"Forskningslogkommandoer"</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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-de/strings-action-keys.xml b/java/res/values-de/strings-action-keys.xml index 95d3d7119..b55c2802f 100644 --- a/java/res/values-de/strings-action-keys.xml +++ b/java/res/values-de/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-de/strings-talkback-descriptions.xml index d5c54e04a..f926b9a59 100644 --- a/java/res/values-de/strings-talkback-descriptions.xml +++ b/java/res/values-de/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index f2074b762..aaa4c50db 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-el/strings-action-keys.xml b/java/res/values-el/strings-action-keys.xml index a4093e3dc..8b5e395f0 100644 --- a/java/res/values-el/strings-action-keys.xml +++ b/java/res/values-el/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"Προηγούμενο"</string> <string name="label_done_key" msgid="7564866296502630852">"Τέλος"</string> <string name="label_send_key" msgid="482252074224462163">"Αποστολή"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-el/strings-talkback-descriptions.xml index aef593cd7..3b990ad3f 100644 --- a/java/res/values-el/strings-talkback-descriptions.xml +++ b/java/res/values-el/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 7f0e3f3d7..aa7d60c3f 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-en-rGB/strings-action-keys.xml b/java/res/values-en-rGB/strings-action-keys.xml index 366cf3cdf..b8b02e149 100644 --- a/java/res/values-en-rGB/strings-action-keys.xml +++ b/java/res/values-en-rGB/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-en-rGB/strings-talkback-descriptions.xml index c6c8f6d79..225df1ad6 100644 --- a/java/res/values-en-rGB/strings-talkback-descriptions.xml +++ b/java/res/values-en-rGB/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index 89e978925..dbc3712d0 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-en-rIN/strings-action-keys.xml b/java/res/values-en-rIN/strings-action-keys.xml index 366cf3cdf..b8b02e149 100644 --- a/java/res/values-en-rIN/strings-action-keys.xml +++ b/java/res/values-en-rIN/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-en-rIN/strings-talkback-descriptions.xml index c6c8f6d79..225df1ad6 100644 --- a/java/res/values-en-rIN/strings-talkback-descriptions.xml +++ b/java/res/values-en-rIN/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-en-rIN/strings.xml b/java/res/values-en-rIN/strings.xml index 89e978925..dbc3712d0 100644 --- a/java/res/values-en-rIN/strings.xml +++ b/java/res/values-en-rIN/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-es-rUS/strings-action-keys.xml b/java/res/values-es-rUS/strings-action-keys.xml index d375617f4..5921ff43d 100644 --- a/java/res/values-es-rUS/strings-action-keys.xml +++ b/java/res/values-es-rUS/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-es-rUS/strings-talkback-descriptions.xml index 7ccc35f86..bdf2babbd 100644 --- a/java/res/values-es-rUS/strings-talkback-descriptions.xml +++ b/java/res/values-es-rUS/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index d440c0ce6..db34dd227 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-es/strings-action-keys.xml b/java/res/values-es/strings-action-keys.xml index 2701146c8..4b3039d29 100644 --- a/java/res/values-es/strings-action-keys.xml +++ b/java/res/values-es/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-es/strings-talkback-descriptions.xml index 2e21b6c44..9cc6f5de4 100644 --- a/java/res/values-es/strings-talkback-descriptions.xml +++ b/java/res/values-es/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 3476ac5dd..87671f428 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-et-rEE/strings-action-keys.xml b/java/res/values-et-rEE/strings-action-keys.xml index 64ba6d6d7..fa054dff0 100644 --- a/java/res/values-et-rEE/strings-action-keys.xml +++ b/java/res/values-et-rEE/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-et-rEE/strings-talkback-descriptions.xml index 000107195..092298730 100644 --- a/java/res/values-et-rEE/strings-talkback-descriptions.xml +++ b/java/res/values-et-rEE/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-et-rEE/strings.xml b/java/res/values-et-rEE/strings.xml index 6fbc4b40c..e9c3f84ee 100644 --- a/java/res/values-et-rEE/strings.xml +++ b/java/res/values-et-rEE/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-fa/strings-action-keys.xml b/java/res/values-fa/strings-action-keys.xml index 78faa8c0b..ae393bbf6 100644 --- a/java/res/values-fa/strings-action-keys.xml +++ b/java/res/values-fa/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"قبلی"</string> <string name="label_done_key" msgid="7564866296502630852">"اتمام"</string> <string name="label_send_key" msgid="482252074224462163">"ارسال"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-fa/strings-talkback-descriptions.xml index c4d4b2525..bc3a5bf7c 100644 --- a/java/res/values-fa/strings-talkback-descriptions.xml +++ b/java/res/values-fa/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index 04c6a5aca..16a53b3f9 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-fi/strings-action-keys.xml b/java/res/values-fi/strings-action-keys.xml index da7f11197..5472fc31a 100644 --- a/java/res/values-fi/strings-action-keys.xml +++ b/java/res/values-fi/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-fi/strings-emoji-descriptions.xml new file mode 100644 index 000000000..74f8a091d --- /dev/null +++ b/java/res/values-fi/strings-emoji-descriptions.xml @@ -0,0 +1,846 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under 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_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-talkback-descriptions.xml b/java/res/values-fi/strings-talkback-descriptions.xml index b12b742cf..ffc7eef33 100644 --- a/java/res/values-fi/strings-talkback-descriptions.xml +++ b/java/res/values-fi/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index 756684ae0..9ccc8c3c7 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-fr-rCA/strings-action-keys.xml b/java/res/values-fr-rCA/strings-action-keys.xml index bb5568e79..b35dd61bd 100644 --- a/java/res/values-fr-rCA/strings-action-keys.xml +++ b/java/res/values-fr-rCA/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-fr-rCA/strings-talkback-descriptions.xml index 7f9eaaab7..2ddffc86d 100644 --- a/java/res/values-fr-rCA/strings-talkback-descriptions.xml +++ b/java/res/values-fr-rCA/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-fr-rCA/strings.xml b/java/res/values-fr-rCA/strings.xml index 5b1308166..fa4304776 100644 --- a/java/res/values-fr-rCA/strings.xml +++ b/java/res/values-fr-rCA/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-fr/strings-action-keys.xml b/java/res/values-fr/strings-action-keys.xml index 1c36552d4..e69351c07 100644 --- a/java/res/values-fr/strings-action-keys.xml +++ b/java/res/values-fr/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-fr/strings-talkback-descriptions.xml index 97f5c6cac..d0b5c3bd5 100644 --- a/java/res/values-fr/strings-talkback-descriptions.xml +++ b/java/res/values-fr/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 1bb856783..0fa8e638c 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-hi/strings-action-keys.xml b/java/res/values-hi/strings-action-keys.xml index 92cb194ea..a90434329 100644 --- a/java/res/values-hi/strings-action-keys.xml +++ b/java/res/values-hi/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"पिछला"</string> <string name="label_done_key" msgid="7564866296502630852">"पूर्ण"</string> <string name="label_send_key" msgid="482252074224462163">"भेजें"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-hi/strings-talkback-descriptions.xml index 39e53ad96..582314e93 100644 --- a/java/res/values-hi/strings-talkback-descriptions.xml +++ b/java/res/values-hi/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml index 3129d86cc..cb1ad60eb 100644 --- a/java/res/values-hi/strings.xml +++ b/java/res/values-hi/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-hr/strings-action-keys.xml b/java/res/values-hr/strings-action-keys.xml index 564f70363..c13da1897 100644 --- a/java/res/values-hr/strings-action-keys.xml +++ b/java/res/values-hr/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-hr/strings-talkback-descriptions.xml index c3a2da015..75d168447 100644 --- a/java/res/values-hr/strings-talkback-descriptions.xml +++ b/java/res/values-hr/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index 0882faad4..14e408f47 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-hu/strings-action-keys.xml b/java/res/values-hu/strings-action-keys.xml index 257f30f34..94445f58b 100644 --- a/java/res/values-hu/strings-action-keys.xml +++ b/java/res/values-hu/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-hu/strings-talkback-descriptions.xml index 2bf2a8aeb..a03895b25 100644 --- a/java/res/values-hu/strings-talkback-descriptions.xml +++ b/java/res/values-hu/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index 8a953ab9d..4c751b724 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-hy-rAM/strings-action-keys.xml b/java/res/values-hy-rAM/strings-action-keys.xml index af9dd5d9d..574ae5a42 100644 --- a/java/res/values-hy-rAM/strings-action-keys.xml +++ b/java/res/values-hy-rAM/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"Նախորդը"</string> <string name="label_done_key" msgid="7564866296502630852">"Պատրաստ է"</string> <string name="label_send_key" msgid="482252074224462163">"Ուղարկել"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-hy-rAM/strings-emoji-descriptions.xml new file mode 100644 index 000000000..21a439fa5 --- /dev/null +++ b/java/res/values-hy-rAM/strings-emoji-descriptions.xml @@ -0,0 +1,846 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under 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_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-talkback-descriptions.xml b/java/res/values-hy-rAM/strings-talkback-descriptions.xml index 149e91a53..7df498ee7 100644 --- a/java/res/values-hy-rAM/strings-talkback-descriptions.xml +++ b/java/res/values-hy-rAM/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-hy-rAM/strings.xml b/java/res/values-hy-rAM/strings.xml index 03d56a626..a43e67916 100644 --- a/java/res/values-hy-rAM/strings.xml +++ b/java/res/values-hy-rAM/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-in/strings-action-keys.xml b/java/res/values-in/strings-action-keys.xml index 26f32254d..052798d02 100644 --- a/java/res/values-in/strings-action-keys.xml +++ b/java/res/values-in/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-in/strings-talkback-descriptions.xml index 8f51fb709..1f206ee85 100644 --- a/java/res/values-in/strings-talkback-descriptions.xml +++ b/java/res/values-in/strings-talkback-descriptions.xml @@ -27,14 +27,10 @@ <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="2382510329910793539">"Kode tombol %d"</string> <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> - <!-- 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 /> + <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> @@ -53,8 +49,7 @@ <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> - <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> - <skip /> + <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> @@ -76,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index e3c551629..a625da03e 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-is/strings.xml b/java/res/values-is/strings.xml index 1588534c9..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 /> @@ -140,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 /> @@ -198,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..0a0cf9b7b 100644 --- a/java/res/values-it/strings-action-keys.xml +++ b/java/res/values-it/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-it/strings-talkback-descriptions.xml index f1d0dae81..3b4cca377 100644 --- a/java/res/values-it/strings-talkback-descriptions.xml +++ b/java/res/values-it/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 6685095be..fc9834e12 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-iw/strings-action-keys.xml b/java/res/values-iw/strings-action-keys.xml index f0f466b8e..398c081d6 100644 --- a/java/res/values-iw/strings-action-keys.xml +++ b/java/res/values-iw/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"הקודם"</string> <string name="label_done_key" msgid="7564866296502630852">"בוצע"</string> <string name="label_send_key" msgid="482252074224462163">"שלח"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-iw/strings-talkback-descriptions.xml index eee16eb0a..d6c2878cd 100644 --- a/java/res/values-iw/strings-talkback-descriptions.xml +++ b/java/res/values-iw/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index dab2d8ed8..7ab16370e 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-ja/strings-action-keys.xml b/java/res/values-ja/strings-action-keys.xml index 68aa6479e..ba8d06c78 100644 --- a/java/res/values-ja/strings-action-keys.xml +++ b/java/res/values-ja/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"前へ"</string> <string name="label_done_key" msgid="7564866296502630852">"完了"</string> <string name="label_send_key" msgid="482252074224462163">"送信"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-ja/strings-talkback-descriptions.xml index 24796037c..b218b49ba 100644 --- a/java/res/values-ja/strings-talkback-descriptions.xml +++ b/java/res/values-ja/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 7d749a6a2..3845bd759 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-ka-rGE/strings-action-keys.xml b/java/res/values-ka-rGE/strings-action-keys.xml index e2dd05f7b..3ad6c3395 100644 --- a/java/res/values-ka-rGE/strings-action-keys.xml +++ b/java/res/values-ka-rGE/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"წინა"</string> <string name="label_done_key" msgid="7564866296502630852">"დასრ."</string> <string name="label_send_key" msgid="482252074224462163">"გაგზ."</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-ka-rGE/strings-emoji-descriptions.xml new file mode 100644 index 000000000..81c6661ef --- /dev/null +++ b/java/res/values-ka-rGE/strings-emoji-descriptions.xml @@ -0,0 +1,846 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under 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_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-talkback-descriptions.xml b/java/res/values-ka-rGE/strings-talkback-descriptions.xml index dc6af527e..147031664 100644 --- a/java/res/values-ka-rGE/strings-talkback-descriptions.xml +++ b/java/res/values-ka-rGE/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ka-rGE/strings.xml b/java/res/values-ka-rGE/strings.xml index 547bf29ca..4677b1844 100644 --- a/java/res/values-ka-rGE/strings.xml +++ b/java/res/values-ka-rGE/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-kk/strings.xml b/java/res/values-kk/strings.xml index 83ac0daf7..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> @@ -82,8 +81,6 @@ <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> @@ -113,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/strings-action-keys.xml b/java/res/values-km-rKH/strings-action-keys.xml index ff747d9f5..d6b11b7ce 100644 --- a/java/res/values-km-rKH/strings-action-keys.xml +++ b/java/res/values-km-rKH/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"មុន"</string> <string name="label_done_key" msgid="7564866296502630852">"រួចរាល់"</string> <string name="label_send_key" msgid="482252074224462163">"ផ្ញើ"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-km-rKH/strings-emoji-descriptions.xml new file mode 100644 index 000000000..c81e5e1ca --- /dev/null +++ b/java/res/values-km-rKH/strings-emoji-descriptions.xml @@ -0,0 +1,846 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under 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_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-talkback-descriptions.xml b/java/res/values-km-rKH/strings-talkback-descriptions.xml index 7a2c71042..bb8c38376 100644 --- a/java/res/values-km-rKH/strings-talkback-descriptions.xml +++ b/java/res/values-km-rKH/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-km-rKH/strings.xml b/java/res/values-km-rKH/strings.xml index 4d7de93c8..337d08676 100644 --- a/java/res/values-km-rKH/strings.xml +++ b/java/res/values-km-rKH/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> @@ -29,7 +28,7 @@ <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="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> @@ -39,7 +38,7 @@ <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> @@ -49,7 +48,7 @@ <string name="use_personalized_dicts" msgid="5167396352105467626">"ការស្នើផ្ទាល់ខ្លួន"</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> @@ -60,7 +59,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> @@ -84,8 +83,6 @@ <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> @@ -118,12 +115,11 @@ <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="4782116251651288054">"ពិតជាដំឡើងឯកសារនេះសម្រាប់ <xliff:g id="LANGUAGE_NAME">%s</xliff:g>?"</string> <string name="error" msgid="8940763624668513648">"មានកំហុស"</string> @@ -154,7 +150,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> @@ -170,10 +166,10 @@ <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="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="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> @@ -191,7 +187,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-ko/strings-action-keys.xml b/java/res/values-ko/strings-action-keys.xml index 04febeeea..34cd8a21d 100644 --- a/java/res/values-ko/strings-action-keys.xml +++ b/java/res/values-ko/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"이전"</string> <string name="label_done_key" msgid="7564866296502630852">"완료"</string> <string name="label_send_key" msgid="482252074224462163">"전송"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-ko/strings-talkback-descriptions.xml index c02976d89..459571627 100644 --- a/java/res/values-ko/strings-talkback-descriptions.xml +++ b/java/res/values-ko/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index 4037abd02..98427b32a 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-ky/strings.xml b/java/res/values-ky/strings.xml index 3758c2df1..8165a3c7d 100644 --- a/java/res/values-ky/strings.xml +++ b/java/res/values-ky/strings.xml @@ -126,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 /> @@ -138,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-lo-rLA/strings-action-keys.xml b/java/res/values-lo-rLA/strings-action-keys.xml index 08dc983e0..239930583 100644 --- a/java/res/values-lo-rLA/strings-action-keys.xml +++ b/java/res/values-lo-rLA/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-lo-rLA/strings-emoji-descriptions.xml index 83935a594..ae66e1474 100644 --- a/java/res/values-lo-rLA/strings-emoji-descriptions.xml +++ b/java/res/values-lo-rLA/strings-emoji-descriptions.xml @@ -20,1627 +20,827 @@ <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_emoji_00A9 (2859822817116803638) --> - <skip /> - <!-- no translation found for spoken_emoji_00AE (7708335454134589027) --> - <skip /> - <!-- no translation found for spoken_emoji_203C (153340916701508663) --> - <skip /> - <!-- no translation found for spoken_emoji_2049 (4877256448299555371) --> - <skip /> - <!-- no translation found for spoken_emoji_2122 (9188440722954720429) --> - <skip /> - <!-- no translation found for spoken_emoji_2139 (9114342638917304327) --> - <skip /> - <!-- no translation found for spoken_emoji_2194 (8055202727034946680) --> - <skip /> - <!-- no translation found for spoken_emoji_2195 (8028122253301087407) --> - <skip /> - <!-- no translation found for spoken_emoji_2196 (4019164898967854363) --> - <skip /> - <!-- no translation found for spoken_emoji_2197 (4255723717709017801) --> - <skip /> - <!-- no translation found for spoken_emoji_2198 (1452063451313622090) --> - <skip /> - <!-- no translation found for spoken_emoji_2199 (6942722693368807849) --> - <skip /> - <!-- no translation found for spoken_emoji_21A9 (5204750172335111188) --> - <skip /> - <!-- no translation found for spoken_emoji_21AA (3950259884359247006) --> - <skip /> - <!-- no translation found for spoken_emoji_231A (6751448803233874993) --> - <skip /> - <!-- no translation found for spoken_emoji_231B (5956428809948426182) --> - <skip /> - <!-- no translation found for spoken_emoji_23E9 (4022497733535162237) --> - <skip /> - <!-- no translation found for spoken_emoji_23EA (2251396938087774944) --> - <skip /> - <!-- no translation found for spoken_emoji_23EB (3746885195641491865) --> - <skip /> - <!-- no translation found for spoken_emoji_23EC (7852372752901163416) --> - <skip /> - <!-- no translation found for spoken_emoji_23F0 (8474219588750627870) --> - <skip /> - <!-- no translation found for spoken_emoji_23F3 (166900119581024371) --> - <skip /> - <!-- no translation found for spoken_emoji_24C2 (3948348737566038470) --> - <skip /> - <!-- no translation found for spoken_emoji_25AA (7865181015100227349) --> - <skip /> - <!-- no translation found for spoken_emoji_25AB (6446532820937381457) --> - <skip /> - <!-- no translation found for spoken_emoji_25B6 (2423897708496040947) --> - <skip /> - <!-- no translation found for spoken_emoji_25C0 (3595083440074484934) --> - <skip /> - <!-- no translation found for spoken_emoji_25FB (4838691986881215419) --> - <skip /> - <!-- no translation found for spoken_emoji_25FC (7008859564991191050) --> - <skip /> - <!-- no translation found for spoken_emoji_25FD (7673439755069217479) --> - <skip /> - <!-- no translation found for spoken_emoji_25FE (6782214109919768923) --> - <skip /> - <!-- no translation found for spoken_emoji_2600 (2272722634618990413) --> - <skip /> - <!-- no translation found for spoken_emoji_2601 (6205136889311537150) --> - <skip /> - <!-- no translation found for spoken_emoji_260E (8670395193046424238) --> - <skip /> - <!-- no translation found for spoken_emoji_2611 (4530550203347054611) --> - <skip /> - <!-- no translation found for spoken_emoji_2614 (1612791247861229500) --> - <skip /> - <!-- no translation found for spoken_emoji_2615 (3320562382424018588) --> - <skip /> - <!-- no translation found for spoken_emoji_261D (4690554173549768467) --> - <skip /> - <!-- no translation found for spoken_emoji_263A (3170094381521989300) --> - <skip /> - <!-- no translation found for spoken_emoji_2648 (4621241062667020673) --> - <skip /> - <!-- no translation found for spoken_emoji_2649 (7694461245947059086) --> - <skip /> - <!-- no translation found for spoken_emoji_264A (1258074605878705030) --> - <skip /> - <!-- no translation found for spoken_emoji_264B (4409219914377810956) --> - <skip /> - <!-- no translation found for spoken_emoji_264C (6520255367817054163) --> - <skip /> - <!-- no translation found for spoken_emoji_264D (1504758945499854018) --> - <skip /> - <!-- no translation found for spoken_emoji_264E (2354847104530633519) --> - <skip /> - <!-- no translation found for spoken_emoji_264F (5822933280406416112) --> - <skip /> - <!-- no translation found for spoken_emoji_2650 (4832481156714796163) --> - <skip /> - <!-- no translation found for spoken_emoji_2651 (840953134601595090) --> - <skip /> - <!-- no translation found for spoken_emoji_2652 (3586925968718775281) --> - <skip /> - <!-- no translation found for spoken_emoji_2653 (8420547731496254492) --> - <skip /> - <!-- no translation found for spoken_emoji_2660 (4541170554542412536) --> - <skip /> - <!-- no translation found for spoken_emoji_2663 (3669352721942285724) --> - <skip /> - <!-- no translation found for spoken_emoji_2665 (6347941599683765843) --> - <skip /> - <!-- no translation found for spoken_emoji_2666 (8296769213401115999) --> - <skip /> - <!-- no translation found for spoken_emoji_2668 (7063148281053820386) --> - <skip /> - <!-- no translation found for spoken_emoji_267B (21716857176812762) --> - <skip /> - <!-- no translation found for spoken_emoji_267F (8833496533226475443) --> - <skip /> - <!-- no translation found for spoken_emoji_2693 (7443148847598433088) --> - <skip /> - <!-- no translation found for spoken_emoji_26A0 (6272635532992727510) --> - <skip /> - <!-- no translation found for spoken_emoji_26A1 (5604749644693339145) --> - <skip /> - <!-- no translation found for spoken_emoji_26AA (8005748091690377153) --> - <skip /> - <!-- no translation found for spoken_emoji_26AB (1655910278422753244) --> - <skip /> - <!-- no translation found for spoken_emoji_26BD (1545218197938889737) --> - <skip /> - <!-- no translation found for spoken_emoji_26BE (8959760533076498209) --> - <skip /> - <!-- no translation found for spoken_emoji_26C4 (3045791757044255626) --> - <skip /> - <!-- no translation found for spoken_emoji_26C5 (5580129409712578639) --> - <skip /> - <!-- no translation found for spoken_emoji_26CE (8963656417276062998) --> - <skip /> - <!-- no translation found for spoken_emoji_26D4 (2231451988209604130) --> - <skip /> - <!-- no translation found for spoken_emoji_26EA (7513319636103804907) --> - <skip /> - <!-- no translation found for spoken_emoji_26F2 (7134115206158891037) --> - <skip /> - <!-- no translation found for spoken_emoji_26F3 (4912302210162075465) --> - <skip /> - <!-- no translation found for spoken_emoji_26F5 (4766328116769075217) --> - <skip /> - <!-- no translation found for spoken_emoji_26FA (5888017494809199037) --> - <skip /> - <!-- no translation found for spoken_emoji_26FD (2417060622927453534) --> - <skip /> - <!-- no translation found for spoken_emoji_2702 (4005741160717451912) --> - <skip /> - <!-- no translation found for spoken_emoji_2705 (164605766946697759) --> - <skip /> - <!-- no translation found for spoken_emoji_2708 (7153840886849268988) --> - <skip /> - <!-- no translation found for spoken_emoji_2709 (2217319160724311369) --> - <skip /> - <!-- no translation found for spoken_emoji_270A (508347232762319473) --> - <skip /> - <!-- no translation found for spoken_emoji_270B (6640562128327753423) --> - <skip /> - <!-- no translation found for spoken_emoji_270C (1344288035704944581) --> - <skip /> - <!-- no translation found for spoken_emoji_270F (6108251586067318718) --> - <skip /> - <!-- no translation found for spoken_emoji_2712 (6320544535087710482) --> - <skip /> - <!-- no translation found for spoken_emoji_2714 (1968242800064001654) --> - <skip /> - <!-- no translation found for spoken_emoji_2716 (511941294762977228) --> - <skip /> - <!-- no translation found for spoken_emoji_2728 (5650330815808691881) --> - <skip /> - <!-- no translation found for spoken_emoji_2733 (8915809595141157327) --> - <skip /> - <!-- no translation found for spoken_emoji_2734 (4846583547980754332) --> - <skip /> - <!-- no translation found for spoken_emoji_2744 (4350636647760161042) --> - <skip /> - <!-- no translation found for spoken_emoji_2747 (3718282973916474455) --> - <skip /> - <!-- no translation found for spoken_emoji_274C (2752145886733295314) --> - <skip /> - <!-- no translation found for spoken_emoji_274E (4262918689871098338) --> - <skip /> - <!-- no translation found for spoken_emoji_2753 (6935897159942119808) --> - <skip /> - <!-- no translation found for spoken_emoji_2754 (7277504915105532954) --> - <skip /> - <!-- no translation found for spoken_emoji_2755 (6853076969826960210) --> - <skip /> - <!-- no translation found for spoken_emoji_2757 (3707907828776912174) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_2795 (6563954833786162168) --> - <skip /> - <!-- no translation found for spoken_emoji_2796 (5990926508250772777) --> - <skip /> - <!-- no translation found for spoken_emoji_2797 (24694184172879174) --> - <skip /> - <!-- no translation found for spoken_emoji_27A1 (3513434778263100580) --> - <skip /> - <!-- no translation found for spoken_emoji_27B0 (203395646864662198) --> - <skip /> - <!-- no translation found for spoken_emoji_27BF (4940514642375640510) --> - <skip /> - <!-- no translation found for spoken_emoji_2934 (9062130477982973457) --> - <skip /> - <!-- no translation found for spoken_emoji_2935 (6198710960720232074) --> - <skip /> - <!-- no translation found for spoken_emoji_2B05 (4813405635410707690) --> - <skip /> - <!-- no translation found for spoken_emoji_2B06 (1223172079106250748) --> - <skip /> - <!-- no translation found for spoken_emoji_2B07 (1599124424746596150) --> - <skip /> - <!-- no translation found for spoken_emoji_2B1B (3461247311988501626) --> - <skip /> - <!-- no translation found for spoken_emoji_2B1C (5793146430145248915) --> - <skip /> - <!-- no translation found for spoken_emoji_2B50 (3850845519526950524) --> - <skip /> - <!-- no translation found for spoken_emoji_2B55 (9137882158811541824) --> - <skip /> - <!-- no translation found for spoken_emoji_3030 (4609172241893565639) --> - <skip /> - <!-- no translation found for spoken_emoji_303D (2545833934975907505) --> - <skip /> - <!-- no translation found for spoken_emoji_3297 (928912923628973800) --> - <skip /> - <!-- no translation found for spoken_emoji_3299 (3930347573693668426) --> - <skip /> - <!-- no translation found for spoken_emoji_1F004 (1705216181345894600) --> - <skip /> - <!-- no translation found for spoken_emoji_1F0CF (7601493592085987866) --> - <skip /> - <!-- no translation found for spoken_emoji_1F170 (3817698686602826773) --> - <skip /> - <!-- no translation found for spoken_emoji_1F171 (3684218589626650242) --> - <skip /> - <!-- no translation found for spoken_emoji_1F17E (2978809190364779029) --> - <skip /> - <!-- no translation found for spoken_emoji_1F17F (463634348668462040) --> - <skip /> - <!-- no translation found for spoken_emoji_1F18E (1650705325221496768) --> - <skip /> - <!-- no translation found for spoken_emoji_1F191 (5386969264431429221) --> - <skip /> - <!-- no translation found for spoken_emoji_1F192 (8324226436829162496) --> - <skip /> - <!-- no translation found for spoken_emoji_1F193 (4731758603321515364) --> - <skip /> - <!-- no translation found for spoken_emoji_1F194 (4903128609556175887) --> - <skip /> - <!-- no translation found for spoken_emoji_1F195 (1433142500411060924) --> - <skip /> - <!-- no translation found for spoken_emoji_1F196 (8825160701159634202) --> - <skip /> - <!-- no translation found for spoken_emoji_1F197 (7841079241554176535) --> - <skip /> - <!-- no translation found for spoken_emoji_1F198 (7020298909426960622) --> - <skip /> - <!-- no translation found for spoken_emoji_1F199 (5971252667136235630) --> - <skip /> - <!-- no translation found for spoken_emoji_1F19A (4557270135899843959) --> - <skip /> - <!-- no translation found for spoken_emoji_1F201 (7000490044681139002) --> - <skip /> - <!-- no translation found for spoken_emoji_1F202 (8560906958695043947) --> - <skip /> - <!-- no translation found for spoken_emoji_1F21A (1496435317324514033) --> - <skip /> - <!-- no translation found for spoken_emoji_1F22F (609797148862445402) --> - <skip /> - <!-- no translation found for spoken_emoji_1F232 (8125716331632035820) --> - <skip /> - <!-- no translation found for spoken_emoji_1F233 (8749401090457355028) --> - <skip /> - <!-- no translation found for spoken_emoji_1F234 (3546951604285970768) --> - <skip /> - <!-- no translation found for spoken_emoji_1F235 (5320186982841793711) --> - <skip /> - <!-- no translation found for spoken_emoji_1F236 (879755752069393034) --> - <skip /> - <!-- no translation found for spoken_emoji_1F237 (6741807001205851437) --> - <skip /> - <!-- no translation found for spoken_emoji_1F238 (5504414186438196912) --> - <skip /> - <!-- no translation found for spoken_emoji_1F239 (1634067311597618959) --> - <skip /> - <!-- no translation found for spoken_emoji_1F23A (3107862957630169536) --> - <skip /> - <!-- no translation found for spoken_emoji_1F250 (6586943922806727907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F251 (9099032855993346948) --> - <skip /> - <!-- no translation found for spoken_emoji_1F300 (4720098285295840383) --> - <skip /> - <!-- no translation found for spoken_emoji_1F301 (3601962477653752974) --> - <skip /> - <!-- no translation found for spoken_emoji_1F302 (3404357123421753593) --> - <skip /> - <!-- no translation found for spoken_emoji_1F303 (3899301321538188206) --> - <skip /> - <!-- no translation found for spoken_emoji_1F304 (2767148930689050040) --> - <skip /> - <!-- no translation found for spoken_emoji_1F305 (9165812924292061196) --> - <skip /> - <!-- no translation found for spoken_emoji_1F306 (5889294736109193104) --> - <skip /> - <!-- no translation found for spoken_emoji_1F307 (2714290867291163713) --> - <skip /> - <!-- no translation found for spoken_emoji_1F308 (688704703985173377) --> - <skip /> - <!-- no translation found for spoken_emoji_1F309 (6217981957992313528) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30A (4329309263152110893) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30B (5729430693700923112) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30C (2961230863217543082) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30D (1113905673331547953) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30E (5278512600749223671) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30F (5718144880978707493) --> - <skip /> - <!-- no translation found for spoken_emoji_1F310 (2959618582975247601) --> - <skip /> - <!-- no translation found for spoken_emoji_1F311 (623906380914895542) --> - <skip /> - <!-- no translation found for spoken_emoji_1F312 (4458575672576125401) --> - <skip /> - <!-- no translation found for spoken_emoji_1F313 (7599181787989497294) --> - <skip /> - <!-- no translation found for spoken_emoji_1F314 (4898293184964365413) --> - <skip /> - <!-- no translation found for spoken_emoji_1F315 (3218117051779496309) --> - <skip /> - <!-- no translation found for spoken_emoji_1F316 (2061317145777689569) --> - <skip /> - <!-- no translation found for spoken_emoji_1F317 (2721090687319539049) --> - <skip /> - <!-- no translation found for spoken_emoji_1F318 (3814091755648887570) --> - <skip /> - <!-- no translation found for spoken_emoji_1F319 (4074299824890459465) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31A (3092285278116977103) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31B (2658562138386927881) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31C (7914768515547867384) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31D (1925730459848297182) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31E (8022112382524084418) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31F (1051661214137766369) --> - <skip /> - <!-- no translation found for spoken_emoji_1F320 (5450591979068216115) --> - <skip /> - <!-- no translation found for spoken_emoji_1F330 (3115760035618051575) --> - <skip /> - <!-- no translation found for spoken_emoji_1F331 (5658888205290008691) --> - <skip /> - <!-- no translation found for spoken_emoji_1F332 (2935650450421165938) --> - <skip /> - <!-- no translation found for spoken_emoji_1F333 (5898847427062482675) --> - <skip /> - <!-- no translation found for spoken_emoji_1F334 (6183375224678417894) --> - <skip /> - <!-- no translation found for spoken_emoji_1F335 (5352418412103584941) --> - <skip /> - <!-- no translation found for spoken_emoji_1F337 (3839107352363566289) --> - <skip /> - <!-- no translation found for spoken_emoji_1F338 (6389970364260468490) --> - <skip /> - <!-- no translation found for spoken_emoji_1F339 (9128891447985256151) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33A (2025828400095233078) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33B (8163868254348448552) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33C (6850371206262335812) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33D (9033484052864509610) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33E (2540173396638444120) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33F (4384823344364908558) --> - <skip /> - <!-- no translation found for spoken_emoji_1F340 (3494255459156499305) --> - <skip /> - <!-- no translation found for spoken_emoji_1F341 (4581959481754990158) --> - <skip /> - <!-- no translation found for spoken_emoji_1F342 (3119068426871821222) --> - <skip /> - <!-- no translation found for spoken_emoji_1F343 (2663317495805149004) --> - <skip /> - <!-- no translation found for spoken_emoji_1F344 (2738517881678722159) --> - <skip /> - <!-- no translation found for spoken_emoji_1F345 (6135288642349085554) --> - <skip /> - <!-- no translation found for spoken_emoji_1F346 (2075395322785406367) --> - <skip /> - <!-- no translation found for spoken_emoji_1F347 (7753453754963890571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F348 (1247076837284932788) --> - <skip /> - <!-- no translation found for spoken_emoji_1F349 (5563054555180611086) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34A (4688661208570160524) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F34C (3712827239858159474) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34D (7712521967162622936) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34E (1859466882598614228) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34F (8251711032295005633) --> - <skip /> - <!-- no translation found for spoken_emoji_1F350 (625802980159197701) --> - <skip /> - <!-- no translation found for spoken_emoji_1F351 (4269460120610911895) --> - <skip /> - <!-- no translation found for spoken_emoji_1F352 (965600953360182635) --> - <skip /> - <!-- no translation found for spoken_emoji_1F353 (7068623879906925592) --> - <skip /> - <!-- no translation found for spoken_emoji_1F354 (45162285238888494) --> - <skip /> - <!-- no translation found for spoken_emoji_1F355 (9157587635526433283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F356 (2667196119149852244) --> - <skip /> - <!-- no translation found for spoken_emoji_1F357 (8022817413851052256) --> - <skip /> - <!-- no translation found for spoken_emoji_1F358 (3042693264748036476) --> - <skip /> - <!-- no translation found for spoken_emoji_1F359 (3988148661730121958) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35A (1763824172198327268) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35B (62530406745717835) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35C (7537756539198945509) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35D (8173523083861875196) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35E (2935428307894662571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35F (4840297386785728443) --> - <skip /> - <!-- no translation found for spoken_emoji_1F360 (4094659855684686801) --> - <skip /> - <!-- no translation found for spoken_emoji_1F361 (6475486395784096109) --> - <skip /> - <!-- no translation found for spoken_emoji_1F362 (5004692577661076275) --> - <skip /> - <!-- no translation found for spoken_emoji_1F363 (1606603765717743806) --> - <skip /> - <!-- no translation found for spoken_emoji_1F364 (6550457766169570811) --> - <skip /> - <!-- no translation found for spoken_emoji_1F365 (4963815540953316307) --> - <skip /> - <!-- no translation found for spoken_emoji_1F366 (7862401745277049404) --> - <skip /> - <!-- no translation found for spoken_emoji_1F367 (7447972978281980414) --> - <skip /> - <!-- no translation found for spoken_emoji_1F368 (7790003146142724913) --> - <skip /> - <!-- no translation found for spoken_emoji_1F369 (7383712944084857350) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36A (2726271795913042295) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36B (6342163604299875931) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36C (2168934753998218790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36D (3671507903799975792) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36E (4630541402785165902) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F370 (7243244547866114951) --> - <skip /> - <!-- no translation found for spoken_emoji_1F371 (6731527040552916358) --> - <skip /> - <!-- no translation found for spoken_emoji_1F372 (1635035323832181733) --> - <skip /> - <!-- no translation found for spoken_emoji_1F373 (7799289534289221045) --> - <skip /> - <!-- no translation found for spoken_emoji_1F374 (5973820884987069131) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F376 (6499274685584852067) --> - <skip /> - <!-- no translation found for spoken_emoji_1F377 (1762398562314172075) --> - <skip /> - <!-- no translation found for spoken_emoji_1F378 (5528234560590117516) --> - <skip /> - <!-- no translation found for spoken_emoji_1F379 (790581290787943325) --> - <skip /> - <!-- no translation found for spoken_emoji_1F37A (391966822450619516) --> - <skip /> - <!-- no translation found for spoken_emoji_1F37B (9015043286465670662) --> - <skip /> - <!-- no translation found for spoken_emoji_1F37C (2532113819464508894) --> - <skip /> - <!-- no translation found for spoken_emoji_1F380 (3487363857092458827) --> - <skip /> - <!-- no translation found for spoken_emoji_1F381 (614180683680675444) --> - <skip /> - <!-- no translation found for spoken_emoji_1F382 (4720497171946687501) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F384 (1797870204479059004) --> - <skip /> - <!-- no translation found for spoken_emoji_1F385 (1754174063483626367) --> - <skip /> - <!-- no translation found for spoken_emoji_1F386 (2130445450758114746) --> - <skip /> - <!-- no translation found for spoken_emoji_1F387 (3403182563117999933) --> - <skip /> - <!-- no translation found for spoken_emoji_1F388 (2903047203723251804) --> - <skip /> - <!-- no translation found for spoken_emoji_1F389 (2352830665883549388) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38A (6280428984773641322) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38B (4902225837479015489) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38C (7623268024030989365) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38D (8237542796124408528) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F38F (8754091376829552844) --> - <skip /> - <!-- no translation found for spoken_emoji_1F390 (8903307048095431374) --> - <skip /> - <!-- no translation found for spoken_emoji_1F391 (2134952069191911841) --> - <skip /> - <!-- no translation found for spoken_emoji_1F392 (6380405493914304737) --> - <skip /> - <!-- no translation found for spoken_emoji_1F393 (6947890064872470996) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A0 (3572095190082826057) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A1 (4300565511681058798) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A2 (15486093912232140) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A3 (921739319504942924) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A4 (7497596355346856950) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A5 (4290497821228183002) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A6 (26019057872319055) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A7 (837856608794094105) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A8 (2332260356509244587) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A9 (9045869366525115256) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AA (5728760354237132) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AB (1657997517193216284) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AC (4317366554314492152) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AD (607157286336130470) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AE (2902308174671548150) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AF (5420539221790296407) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B0 (7440244806527891956) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B1 (545544382391379234) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B2 (8302262034774787493) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B3 (5180870610771027520) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B4 (4723852033266071564) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B5 (1998470239850548554) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B6 (3827730457113941705) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B7 (5503403099445042180) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F3B9 (5596295757967881451) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BA (4284064120340683558) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BB (2856598510069988745) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BC (1608424748821446230) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BD (5490786111375627777) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F3BF (6862405997423247921) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C0 (7421420756115104085) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C1 (6926537251677319922) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C2 (5708596929237987082) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C3 (5850982999510115824) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C4 (8468355585994639838) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C6 (9094474706847545409) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C7 (8172206200368370116) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C8 (5619171461277597709) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C9 (6371294008765871043) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3CA (130977831787806932) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E0 (6277213201655811842) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E1 (233476176077538885) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E2 (919736380093964570) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E3 (6177606081825094184) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E4 (717377871070970293) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E5 (1350532500431776780) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E6 (342132788513806214) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E7 (6322352038284944265) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E8 (5864918444350599907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E9 (7830416185375326938) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3EA (5081084413084360479) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F3EC (4845978861878295154) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3ED (3980316226665215370) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3EE (1253964276770550248) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3EF (1128975573507389883) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3F0 (1544632297502291578) --> - <skip /> - <!-- no translation found for spoken_emoji_1F400 (2063034795679578294) --> - <skip /> - <!-- no translation found for spoken_emoji_1F401 (6736421616217369594) --> - <skip /> - <!-- no translation found for spoken_emoji_1F402 (7276670995895485604) --> - <skip /> - <!-- no translation found for spoken_emoji_1F403 (8045709541897118928) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F406 (5163461930159540018) --> - <skip /> - <!-- no translation found for spoken_emoji_1F407 (6905370221172708160) --> - <skip /> - <!-- no translation found for spoken_emoji_1F408 (1362164550508207284) --> - <skip /> - <!-- no translation found for spoken_emoji_1F409 (8476130983168866013) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40A (1149626786411545043) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40B (5199104921208397643) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40C (2704006052881702675) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40D (8648186663643157522) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40E (7219137467573327268) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40F (7834336676729040395) --> - <skip /> - <!-- no translation found for spoken_emoji_1F410 (8686765722255775031) --> - <skip /> - <!-- no translation found for spoken_emoji_1F411 (3585715397876383525) --> - <skip /> - <!-- no translation found for spoken_emoji_1F412 (4924794582980077838) --> - <skip /> - <!-- no translation found for spoken_emoji_1F413 (1460475310405677377) --> - <skip /> - <!-- no translation found for spoken_emoji_1F414 (5857296282631892219) --> - <skip /> - <!-- no translation found for spoken_emoji_1F415 (5920041074892949527) --> - <skip /> - <!-- no translation found for spoken_emoji_1F416 (4362403392912540286) --> - <skip /> - <!-- no translation found for spoken_emoji_1F417 (6836978415840795128) --> - <skip /> - <!-- no translation found for spoken_emoji_1F418 (7926161463897783691) --> - <skip /> - <!-- no translation found for spoken_emoji_1F419 (1055233959755784186) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41A (5195666556511558060) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41B (7652480167465557832) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41C (1123461148697574239) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41D (718579308764058851) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41E (6766305509608115467) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41F (1207261298343160838) --> - <skip /> - <!-- no translation found for spoken_emoji_1F420 (1041145003133609221) --> - <skip /> - <!-- no translation found for spoken_emoji_1F421 (1748378324417438751) --> - <skip /> - <!-- no translation found for spoken_emoji_1F422 (4106724877523329148) --> - <skip /> - <!-- no translation found for spoken_emoji_1F423 (4077407945958691907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F424 (6911326019270172283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F425 (5466514196557885577) --> - <skip /> - <!-- no translation found for spoken_emoji_1F426 (2163979138772892755) --> - <skip /> - <!-- no translation found for spoken_emoji_1F427 (3585670324511212961) --> - <skip /> - <!-- no translation found for spoken_emoji_1F428 (7955440808647898579) --> - <skip /> - <!-- no translation found for spoken_emoji_1F429 (5028269352809819035) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42A (4681926706404032484) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42B (2725166074981558322) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42C (6764791873413727085) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42D (1033643138546864251) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42E (8099223337120508820) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42F (2104743989330781572) --> - <skip /> - <!-- no translation found for spoken_emoji_1F430 (525492897063150160) --> - <skip /> - <!-- no translation found for spoken_emoji_1F431 (6051358666235016851) --> - <skip /> - <!-- no translation found for spoken_emoji_1F432 (7698001871193018305) --> - <skip /> - <!-- no translation found for spoken_emoji_1F433 (3762356053512899326) --> - <skip /> - <!-- no translation found for spoken_emoji_1F434 (3619943222159943226) --> - <skip /> - <!-- no translation found for spoken_emoji_1F435 (59199202683252958) --> - <skip /> - <!-- no translation found for spoken_emoji_1F436 (340544719369009828) --> - <skip /> - <!-- no translation found for spoken_emoji_1F437 (1219818379784982585) --> - <skip /> - <!-- no translation found for spoken_emoji_1F438 (9128124743321008210) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F43A (6727645488430385584) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43B (5397170068392865167) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43C (2715995734367032431) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43D (6005480717951776597) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43E (8917626103219080547) --> - <skip /> - <!-- no translation found for spoken_emoji_1F440 (7144338258163384433) --> - <skip /> - <!-- no translation found for spoken_emoji_1F442 (1905515392292676124) --> - <skip /> - <!-- no translation found for spoken_emoji_1F443 (1491504447758933115) --> - <skip /> - <!-- no translation found for spoken_emoji_1F444 (3654613047946080332) --> - <skip /> - <!-- no translation found for spoken_emoji_1F445 (7024905244040509204) --> - <skip /> - <!-- no translation found for spoken_emoji_1F446 (2150365643636471745) --> - <skip /> - <!-- no translation found for spoken_emoji_1F447 (8794022344940891388) --> - <skip /> - <!-- no translation found for spoken_emoji_1F448 (3261812959215550650) --> - <skip /> - <!-- no translation found for spoken_emoji_1F449 (4764447975177805991) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44A (7197417095486424841) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44B (1975968945250833117) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44C (3185919567897876562) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44D (6182553970602667815) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44E (8030851867365111809) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44F (5148753662268213389) --> - <skip /> - <!-- no translation found for spoken_emoji_1F450 (1012021072085157054) --> - <skip /> - <!-- no translation found for spoken_emoji_1F451 (8257466714629051320) --> - <skip /> - <!-- no translation found for spoken_emoji_1F452 (4567394011149905466) --> - <skip /> - <!-- no translation found for spoken_emoji_1F453 (5978410551173163010) --> - <skip /> - <!-- no translation found for spoken_emoji_1F454 (348469036193323252) --> - <skip /> - <!-- no translation found for spoken_emoji_1F455 (5665118831861433578) --> - <skip /> - <!-- no translation found for spoken_emoji_1F456 (1890991330923356408) --> - <skip /> - <!-- no translation found for spoken_emoji_1F457 (3904310482655702620) --> - <skip /> - <!-- no translation found for spoken_emoji_1F458 (5704243858031107692) --> - <skip /> - <!-- no translation found for spoken_emoji_1F459 (3553148747050035251) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45A (1389654639484716101) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45B (1113293170254222904) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45C (3410257778598006936) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45D (812176504300064819) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45E (2901741399934723562) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45F (6828566359287798863) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F461 (5160493217831417630) --> - <skip /> - <!-- no translation found for spoken_emoji_1F462 (1722897795554863734) --> - <skip /> - <!-- no translation found for spoken_emoji_1F463 (5850772903593010699) --> - <skip /> - <!-- no translation found for spoken_emoji_1F464 (1228335905487734913) --> - <skip /> - <!-- no translation found for spoken_emoji_1F465 (4461307702499679879) --> - <skip /> - <!-- no translation found for spoken_emoji_1F466 (1938873085514108889) --> - <skip /> - <!-- no translation found for spoken_emoji_1F467 (8237080594860144998) --> - <skip /> - <!-- no translation found for spoken_emoji_1F468 (6081300722526675382) --> - <skip /> - <!-- no translation found for spoken_emoji_1F469 (1090140923076108158) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46A (5063570981942606595) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46B (6795882374287327952) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46C (6844464165783964495) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46D (2316773068014053180) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46E (5897625605860822401) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46F (7716871657717641490) --> - <skip /> - <!-- no translation found for spoken_emoji_1F470 (6409995400510338892) --> - <skip /> - <!-- no translation found for spoken_emoji_1F471 (3058247860441670806) --> - <skip /> - <!-- no translation found for spoken_emoji_1F472 (3928854667819339142) --> - <skip /> - <!-- no translation found for spoken_emoji_1F473 (5921952095808988381) --> - <skip /> - <!-- no translation found for spoken_emoji_1F474 (1082237499496725183) --> - <skip /> - <!-- no translation found for spoken_emoji_1F475 (7280323988642212761) --> - <skip /> - <!-- no translation found for spoken_emoji_1F476 (4713322657821088296) --> - <skip /> - <!-- no translation found for spoken_emoji_1F477 (2197036131029221370) --> - <skip /> - <!-- no translation found for spoken_emoji_1F478 (7245521193493488875) --> - <skip /> - <!-- no translation found for spoken_emoji_1F479 (6876475321015553972) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47A (3900813633102703571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47B (2608250873194079390) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47C (3838699131276537421) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47D (2874077455888369538) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47E (3642607168625579507) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47F (441605977269926252) --> - <skip /> - <!-- no translation found for spoken_emoji_1F480 (3696253485164878739) --> - <skip /> - <!-- no translation found for spoken_emoji_1F481 (320408708521966893) --> - <skip /> - <!-- no translation found for spoken_emoji_1F482 (3424354860245608949) --> - <skip /> - <!-- no translation found for spoken_emoji_1F483 (3221113594843849083) --> - <skip /> - <!-- no translation found for spoken_emoji_1F484 (7348014979080444885) --> - <skip /> - <!-- no translation found for spoken_emoji_1F485 (6133507975565116339) --> - <skip /> - <!-- no translation found for spoken_emoji_1F486 (9085459968247394155) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F488 (6922559285234100252) --> - <skip /> - <!-- no translation found for spoken_emoji_1F489 (8114863680950147305) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48A (8526843630145963032) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48B (2538528967897640292) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48C (1681173271652890232) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48D (8259886164999042373) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48E (8777981696011111101) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48F (741593675183677907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F490 (4482549128959806736) --> - <skip /> - <!-- no translation found for spoken_emoji_1F491 (2305245307882441500) --> - <skip /> - <!-- no translation found for spoken_emoji_1F492 (3884119934804475732) --> - <skip /> - <!-- no translation found for spoken_emoji_1F493 (1208828371565525121) --> - <skip /> - <!-- no translation found for spoken_emoji_1F494 (6198876398509338718) --> - <skip /> - <!-- no translation found for spoken_emoji_1F495 (9206202744967130919) --> - <skip /> - <!-- no translation found for spoken_emoji_1F496 (5436953041732207775) --> - <skip /> - <!-- no translation found for spoken_emoji_1F497 (7285142863951448473) --> - <skip /> - <!-- no translation found for spoken_emoji_1F498 (7940131245037575715) --> - <skip /> - <!-- no translation found for spoken_emoji_1F499 (4453235040265550009) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49A (6262178648366971405) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49B (8085384999750714368) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49C (453829540120898698) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49D (3460534750224161888) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49E (4490636226072523867) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49F (2059319756421226336) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A0 (1954850380550212038) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A1 (403137413540909021) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A2 (2604192053295622063) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A3 (6378351742957821735) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A4 (7217736258870346625) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A5 (5401995723541239858) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A6 (3837802182716483848) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A7 (5718438987757885141) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A8 (4472108229720006377) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A9 (1240958472788430032) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AA (8427525538635146416) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AB (5484114759939427459) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AC (5571196638219612682) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AD (353174619257798652) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AE (1223142786927162641) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AF (3526278354452138397) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B0 (4124102195175124156) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B1 (8339494003418572905) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B2 (3179159430187243132) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B3 (5375412518221759596) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B4 (1068592463669453204) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F4B6 (8289249930736444837) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B7 (5245100496860739429) --> - <skip /> + <string name="spoken_emoji_1F4B6" msgid="8289249930736444837">"ທະນະບັດເງິນຢູໂຣ"</string> + <string name="spoken_emoji_1F4B7" msgid="5245100496860739429">"ທະນະບັດເງິນພາວດ໌"</string> <string name="spoken_emoji_1F4B8" msgid="4401099580477164440">"ເງິນຕິດປີກ"</string> - <!-- no translation found for spoken_emoji_1F4B9 (647509393536679903) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BA (1269737854891046321) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BB (6252883563347816451) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BC (6182597732218446206) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BD (5820961044768829176) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BE (4754542485835379808) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BF (2237481756984721795) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C0 (491582501089694461) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C1 (6645461382494158111) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F4C3 (3727274466173970142) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C4 (4382570710795501612) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C5 (8693944622627762487) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C6 (8469908708708424640) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C7 (2665313547987324495) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C8 (8007686702282833600) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C9 (2271951411192893684) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CA (3525692829622381444) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CB (977639227554095521) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CC (156107396088741574) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CD (4266572175361190231) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CE (6294288509864968290) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CF (149679400831136810) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D0 (8130339336619202915) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D1 (5852176364856284968) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D2 (2276810154105920052) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D3 (5873386492793610808) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D4 (4754469936418776360) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D5 (4642713351802778905) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D6 (6987347918381807186) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D7 (7813394163241379223) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D8 (7189799718984979521) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D9 (3874664073186440225) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DA (872212072924287762) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DB (2015183603583392969) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F4DD (2494006707147586786) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DE (7883008605002117671) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DF (3538610110623780465) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E0 (2960778342609543077) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E1 (6269733703719242108) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E2 (1987535386302883116) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E3 (5588916572878599224) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E4 (2063561529097749707) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E5 (3232462702926143576) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E6 (3399454337197561635) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E7 (5557136988503873238) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E8 (30698793974124123) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E9 (5947550337678643166) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EA (772614045207213751) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EB (6491414165464146137) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EC (7369517138779988438) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4ED (5657520436285454241) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EE (8464138906243608614) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EF (8801427577198798226) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F0 (6330208624731662525) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F1 (3966503935581675695) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F2 (1057540341746100087) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F3 (5003984447315754658) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F4 (5549847566968306253) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F5 (3660199448671699238) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F6 (2676974903233268860) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F7 (2643891943105989039) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F9 (4475626303058218048) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4FA (1079796186652960775) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4FB (3848729587403760645) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4FC (8370432508874310054) --> - <skip /> - <!-- no translation found for spoken_emoji_1F500 (2389947994502144547) --> - <skip /> - <!-- no translation found for spoken_emoji_1F501 (2132188352433347009) --> - <skip /> - <!-- no translation found for spoken_emoji_1F502 (2361976580513178391) --> - <skip /> - <!-- no translation found for spoken_emoji_1F503 (8936283551917858793) --> - <skip /> - <!-- no translation found for spoken_emoji_1F504 (708290317843535943) --> - <skip /> - <!-- no translation found for spoken_emoji_1F505 (6348909939004951860) --> - <skip /> - <!-- no translation found for spoken_emoji_1F506 (4449609297521280173) --> - <skip /> - <!-- no translation found for spoken_emoji_1F507 (7136386694923708448) --> - <skip /> - <!-- no translation found for spoken_emoji_1F508 (5063567689831527865) --> - <skip /> - <!-- no translation found for spoken_emoji_1F509 (3948050077992370791) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50A (5818194948677277197) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50B (8083470451266295876) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50C (7793219132036431680) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50D (8140244710637926780) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50E (4751821352839693365) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50F (915079280472199605) --> - <skip /> - <!-- no translation found for spoken_emoji_1F510 (7658381761691758318) --> - <skip /> - <!-- no translation found for spoken_emoji_1F511 (262319867774655688) --> - <skip /> - <!-- no translation found for spoken_emoji_1F512 (5628688337255115175) --> - <skip /> - <!-- no translation found for spoken_emoji_1F513 (8579201846619420981) --> - <skip /> - <!-- no translation found for spoken_emoji_1F514 (7027268683047322521) --> - <skip /> - <!-- no translation found for spoken_emoji_1F515 (8903179856036069242) --> - <skip /> - <!-- no translation found for spoken_emoji_1F516 (108097933937925381) --> - <skip /> - <!-- no translation found for spoken_emoji_1F517 (2450846665734313397) --> - <skip /> - <!-- no translation found for spoken_emoji_1F518 (7028220286841437832) --> - <skip /> - <!-- no translation found for spoken_emoji_1F519 (8211189165075445687) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51A (823966751787338892) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51B (5920570742107943382) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51C (110609810659826676) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51D (4087697222026095447) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51E (8512873526157201775) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51F (8673370823728653973) --> - <skip /> - <!-- no translation found for spoken_emoji_1F520 (7335109890337048900) --> - <skip /> - <!-- no translation found for spoken_emoji_1F521 (2693185864450925778) --> - <skip /> - <!-- no translation found for spoken_emoji_1F522 (8419130286280673347) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F524 (1625073997522316331) --> - <skip /> - <!-- no translation found for spoken_emoji_1F525 (4083884189172963790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F526 (2035494936742643580) --> - <skip /> - <!-- no translation found for spoken_emoji_1F527 (134257142354034271) --> - <skip /> - <!-- no translation found for spoken_emoji_1F528 (700627429570609375) --> - <skip /> - <!-- no translation found for spoken_emoji_1F529 (7480548235904988573) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52A (7613580031502317893) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52B (4554906608328118613) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52C (1330294501371770790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52D (7549551775445177140) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52E (4457099417872625141) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F530 (3572898444281774023) --> - <skip /> - <!-- no translation found for spoken_emoji_1F531 (5225633376450025396) --> - <skip /> - <!-- no translation found for spoken_emoji_1F532 (9169568490485180779) --> - <skip /> - <!-- no translation found for spoken_emoji_1F533 (6554193837201918598) --> - <skip /> - <!-- no translation found for spoken_emoji_1F534 (8339298801331865340) --> - <skip /> - <!-- no translation found for spoken_emoji_1F535 (1227403104835533512) --> - <skip /> - <!-- no translation found for spoken_emoji_1F536 (5477372445510469331) --> - <skip /> - <!-- no translation found for spoken_emoji_1F537 (3158915214347274626) --> - <skip /> - <!-- no translation found for spoken_emoji_1F538 (4300084249474451991) --> - <skip /> - <!-- no translation found for spoken_emoji_1F539 (6535159756325742275) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53A (3728196273988781389) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53B (7182097039614128707) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53C (4077022046319615029) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53D (3939112784894620713) --> - <skip /> - <!-- no translation found for spoken_emoji_1F550 (7761392621689986218) --> - <skip /> - <!-- no translation found for spoken_emoji_1F551 (2699448504113431716) --> - <skip /> - <!-- no translation found for spoken_emoji_1F552 (5872107867411853750) --> - <skip /> - <!-- no translation found for spoken_emoji_1F553 (8490966286158640743) --> - <skip /> - <!-- no translation found for spoken_emoji_1F554 (7662585417832909280) --> - <skip /> - <!-- no translation found for spoken_emoji_1F555 (5564698204520412009) --> - <skip /> - <!-- no translation found for spoken_emoji_1F556 (7325712194836512205) --> - <skip /> - <!-- no translation found for spoken_emoji_1F557 (4398343183682848693) --> - <skip /> - <!-- no translation found for spoken_emoji_1F558 (3110507820404018172) --> - <skip /> - <!-- no translation found for spoken_emoji_1F559 (2972160366448337839) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55A (5568112876681714834) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55B (6731739890330659276) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55C (7838853679879115890) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55D (3518832144255922544) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55E (3092760695634993002) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55F (2326720311892906763) --> - <skip /> - <!-- no translation found for spoken_emoji_1F560 (5771339179963924448) --> - <skip /> - <!-- no translation found for spoken_emoji_1F561 (3139944777062475382) --> - <skip /> - <!-- no translation found for spoken_emoji_1F562 (8273944611162457084) --> - <skip /> - <!-- no translation found for spoken_emoji_1F563 (8643976903718136299) --> - <skip /> - <!-- no translation found for spoken_emoji_1F564 (3511070239796141638) --> - <skip /> - <!-- no translation found for spoken_emoji_1F565 (4567451985272963088) --> - <skip /> - <!-- no translation found for spoken_emoji_1F566 (2790552288169929810) --> - <skip /> - <!-- no translation found for spoken_emoji_1F567 (9026037362100689337) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FB (9037503671676124015) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FC (1409415995817242150) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FD (2562726956654429582) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FE (1184469756905210580) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FF (6003594799354942297) --> - <skip /> - <!-- no translation found for spoken_emoji_1F600 (7601109464776835283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F601 (746026523967444503) --> - <skip /> - <!-- no translation found for spoken_emoji_1F602 (8354558091785198246) --> - <skip /> - <!-- no translation found for spoken_emoji_1F603 (3861022912544159823) --> - <skip /> - <!-- no translation found for spoken_emoji_1F604 (5119021072966343531) --> - <skip /> - <!-- no translation found for spoken_emoji_1F605 (6140813923973561735) --> - <skip /> - <!-- no translation found for spoken_emoji_1F606 (3549936813966832799) --> - <skip /> - <!-- no translation found for spoken_emoji_1F607 (2826424078212384817) --> - <skip /> - <!-- no translation found for spoken_emoji_1F608 (7343559595089811640) --> - <skip /> - <!-- no translation found for spoken_emoji_1F609 (5481030187207504405) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60A (5023337769148679767) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60B (3005248217216195694) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60C (349384012958268496) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60D (7921853137164938391) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60E (441718886380605643) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60F (2674453144890180538) --> - <skip /> - <!-- no translation found for spoken_emoji_1F610 (3225675825334102369) --> - <skip /> - <!-- no translation found for spoken_emoji_1F611 (7199179827619679668) --> - <skip /> - <!-- no translation found for spoken_emoji_1F612 (985081329745137998) --> - <skip /> - <!-- no translation found for spoken_emoji_1F613 (5548607684830303562) --> - <skip /> - <!-- no translation found for spoken_emoji_1F614 (3196305665259916390) --> - <skip /> - <!-- no translation found for spoken_emoji_1F615 (3051674239303969101) --> - <skip /> - <!-- no translation found for spoken_emoji_1F616 (8124887056243813089) --> - <skip /> - <!-- no translation found for spoken_emoji_1F617 (7052733625511122870) --> - <skip /> - <!-- no translation found for spoken_emoji_1F618 (408207170572303753) --> - <skip /> - <!-- no translation found for spoken_emoji_1F619 (8645430335143153645) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61A (2882157190974340247) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61B (3765927202787211499) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61C (198943912107589389) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61D (7643546385877816182) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61E (1528732952202098364) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61F (1853664164636082404) --> - <skip /> - <!-- no translation found for spoken_emoji_1F620 (6051942001307375830) --> - <skip /> - <!-- no translation found for spoken_emoji_1F621 (2114711878097257704) --> - <skip /> - <!-- no translation found for spoken_emoji_1F622 (29291014645931822) --> - <skip /> - <!-- no translation found for spoken_emoji_1F623 (7803959833595184773) --> - <skip /> - <!-- no translation found for spoken_emoji_1F624 (8637637647725752799) --> - <skip /> - <!-- no translation found for spoken_emoji_1F625 (6153625183493635030) --> - <skip /> - <!-- no translation found for spoken_emoji_1F626 (6179485689935562950) --> - <skip /> - <!-- no translation found for spoken_emoji_1F627 (8566204052903012809) --> - <skip /> - <!-- no translation found for spoken_emoji_1F628 (8875777401624904224) --> - <skip /> - <!-- no translation found for spoken_emoji_1F629 (1411538490319190118) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62A (4726686726690289969) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62B (3221980473921623613) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62C (4616356691941225182) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62D (4283677508698812232) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62E (726083405284353894) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62F (7746620088234710962) --> - <skip /> - <!-- no translation found for spoken_emoji_1F630 (3298804852155581163) --> - <skip /> - <!-- no translation found for spoken_emoji_1F631 (1603391150954646779) --> - <skip /> - <!-- no translation found for spoken_emoji_1F632 (4846193232203976013) --> - <skip /> - <!-- no translation found for spoken_emoji_1F633 (4023593836629700443) --> - <skip /> - <!-- no translation found for spoken_emoji_1F634 (3155265083246248129) --> - <skip /> - <!-- no translation found for spoken_emoji_1F635 (4616691133452764482) --> - <skip /> - <!-- no translation found for spoken_emoji_1F636 (947000211822375683) --> - <skip /> - <!-- no translation found for spoken_emoji_1F637 (1269551267347165774) --> - <skip /> - <!-- no translation found for spoken_emoji_1F638 (3410766467496872301) --> - <skip /> - <!-- no translation found for spoken_emoji_1F639 (1833417519781022031) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63A (8566294484007152613) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63B (74417995938927571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63C (6472812005729468870) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63D (1638398369553349509) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63E (6788969063020278986) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63F (1207234562459550185) --> - <skip /> - <!-- no translation found for spoken_emoji_1F640 (6023054549904329638) --> - <skip /> - <!-- no translation found for spoken_emoji_1F645 (5202090629227587076) --> - <skip /> - <!-- no translation found for spoken_emoji_1F646 (6734425134415138134) --> - <skip /> - <!-- no translation found for spoken_emoji_1F647 (1090285518444205483) --> - <skip /> - <!-- no translation found for spoken_emoji_1F648 (8978535230610522356) --> - <skip /> - <!-- no translation found for spoken_emoji_1F649 (8486145279809495102) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64A (1237524974033228660) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64B (4251150782016370475) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F64D (4646485595309482342) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64E (3376579939836656097) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64F (1044439574356230711) --> - <skip /> - <!-- no translation found for spoken_emoji_1F680 (513263736012689059) --> - <skip /> - <!-- no translation found for spoken_emoji_1F681 (9201341783850525339) --> - <skip /> - <!-- no translation found for spoken_emoji_1F682 (8046933583867498698) --> - <skip /> - <!-- no translation found for spoken_emoji_1F683 (8772750354339223092) --> - <skip /> - <!-- no translation found for spoken_emoji_1F684 (346396777356203608) --> - <skip /> - <!-- no translation found for spoken_emoji_1F685 (1237059817190832730) --> - <skip /> - <!-- no translation found for spoken_emoji_1F686 (3525197227223620343) --> - <skip /> - <!-- no translation found for spoken_emoji_1F687 (5110143437960392837) --> - <skip /> - <!-- no translation found for spoken_emoji_1F688 (4702085029871797965) --> - <skip /> - <!-- no translation found for spoken_emoji_1F689 (2375851019798817094) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68A (6368370859718717198) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68B (2920160427117436633) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68C (1061520934758810864) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68D (2890059031360969304) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68E (6234042976027309654) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68F (5871099334672012107) --> - <skip /> - <!-- no translation found for spoken_emoji_1F690 (8080964620200195262) --> - <skip /> - <!-- no translation found for spoken_emoji_1F691 (999173032408730501) --> - <skip /> - <!-- no translation found for spoken_emoji_1F692 (1712863785341849487) --> - <skip /> - <!-- no translation found for spoken_emoji_1F693 (7987109037389768934) --> - <skip /> - <!-- no translation found for spoken_emoji_1F694 (6061658916653884608) --> - <skip /> - <!-- no translation found for spoken_emoji_1F695 (6913445460364247283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F696 (6391604457418285404) --> - <skip /> - <!-- no translation found for spoken_emoji_1F697 (7978399334396733790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F698 (7006050861129732018) --> - <skip /> - <!-- no translation found for spoken_emoji_1F699 (630317052666590607) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69A (4739797891735823577) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F69C (5557395610750818161) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69D (5467164189942951047) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69E (169238196389832234) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69F (7508128757012845102) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A0 (8733056213790160147) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A1 (4666516337749347253) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A2 (4511220588943129583) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A3 (8412962252222205387) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A4 (8867571300266339211) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F6A6 (485575967773793454) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A7 (6411048933816976794) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A8 (6345717218374788364) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A9 (6586380356807600412) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AA (8954448167261738885) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AB (5313946262888343544) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AC (6946858177965948288) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F6AE (1062469925352817189) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AF (2286668056123642208) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B0 (179424763882990952) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B1 (5585212805429161877) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B2 (1771885082068421875) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B3 (8033779581263314408) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B4 (1999538449018476947) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B5 (340846352660993117) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B6 (4351024386495098336) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B7 (4564800655866838802) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B8 (3020531906940267349) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B9 (1207095844125041251) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BA (2346879310071017531) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BB (2370172469642078526) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BC (5558827593563530851) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BD (9213590243049835957) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BE (394016533781742491) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BF (906336365928291207) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C0 (4592099854378821599) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C1 (2845056048320031158) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C2 (8117262514698011877) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C3 (1176342001834630675) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C4 (1477622834179978886) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C5 (2495834050856617451) --> - <skip /> + <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-talkback-descriptions.xml b/java/res/values-lo-rLA/strings-talkback-descriptions.xml index 4b9294c6e..9d07735b2 100644 --- a/java/res/values-lo-rLA/strings-talkback-descriptions.xml +++ b/java/res/values-lo-rLA/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-lo-rLA/strings.xml b/java/res/values-lo-rLA/strings.xml index 76fe5e042..9d012b6a4 100644 --- a/java/res/values-lo-rLA/strings.xml +++ b/java/res/values-lo-rLA/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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">"ໂໝດການສຶກສາ 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> diff --git a/java/res/values-lt/strings-action-keys.xml b/java/res/values-lt/strings-action-keys.xml index 39b3894be..20d5ca04d 100644 --- a/java/res/values-lt/strings-action-keys.xml +++ b/java/res/values-lt/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-lt/strings-talkback-descriptions.xml index 63b52a1d4..a5cb62c21 100644 --- a/java/res/values-lt/strings-talkback-descriptions.xml +++ b/java/res/values-lt/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index c049a165e..73003c25f 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/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">"Į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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-lv/strings-action-keys.xml b/java/res/values-lv/strings-action-keys.xml index c2fbda26b..a3ada38a6 100644 --- a/java/res/values-lv/strings-action-keys.xml +++ b/java/res/values-lv/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-lv/strings-talkback-descriptions.xml index 81a65c496..544fe9a4d 100644 --- a/java/res/values-lv/strings-talkback-descriptions.xml +++ b/java/res/values-lv/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index 901c3486f..d689182fb 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-mk/strings.xml b/java/res/values-mk/strings.xml index 1588534c9..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 /> @@ -140,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 /> @@ -198,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-mn-rMN/strings-action-keys.xml b/java/res/values-mn-rMN/strings-action-keys.xml index 77b8f2c05..a855386d0 100644 --- a/java/res/values-mn-rMN/strings-action-keys.xml +++ b/java/res/values-mn-rMN/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"Өмнөх"</string> <string name="label_done_key" msgid="7564866296502630852">"Дууссан"</string> <string name="label_send_key" msgid="482252074224462163">"Илгээх"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-mn-rMN/strings-talkback-descriptions.xml index fb0d382a8..982495044 100644 --- a/java/res/values-mn-rMN/strings-talkback-descriptions.xml +++ b/java/res/values-mn-rMN/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-mn-rMN/strings.xml b/java/res/values-mn-rMN/strings.xml index 4c64b3354..f6233b5f6 100644 --- a/java/res/values-mn-rMN/strings.xml +++ b/java/res/values-mn-rMN/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-ms-rMY/strings-action-keys.xml b/java/res/values-ms-rMY/strings-action-keys.xml index f1a75d2ef..1910c0dc3 100644 --- a/java/res/values-ms-rMY/strings-action-keys.xml +++ b/java/res/values-ms-rMY/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-ms-rMY/strings-emoji-descriptions.xml new file mode 100644 index 000000000..c945c81fb --- /dev/null +++ b/java/res/values-ms-rMY/strings-emoji-descriptions.xml @@ -0,0 +1,846 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under 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_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-talkback-descriptions.xml b/java/res/values-ms-rMY/strings-talkback-descriptions.xml index e47b63909..842a2bf69 100644 --- a/java/res/values-ms-rMY/strings-talkback-descriptions.xml +++ b/java/res/values-ms-rMY/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ms-rMY/strings.xml b/java/res/values-ms-rMY/strings.xml index cea20217e..04ea273ac 100644 --- a/java/res/values-ms-rMY/strings.xml +++ b/java/res/values-ms-rMY/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-nb/strings-action-keys.xml b/java/res/values-nb/strings-action-keys.xml index d4acd36c9..af67b0073 100644 --- a/java/res/values-nb/strings-action-keys.xml +++ b/java/res/values-nb/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-nb/strings-talkback-descriptions.xml index cdf80575a..27c68fdc4 100644 --- a/java/res/values-nb/strings-talkback-descriptions.xml +++ b/java/res/values-nb/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index e4f16032c..f4a3a2da0 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-ne-rNP/strings-action-keys.xml b/java/res/values-ne-rNP/strings-action-keys.xml index 34b0a14a7..5c0a46225 100644 --- a/java/res/values-ne-rNP/strings-action-keys.xml +++ b/java/res/values-ne-rNP/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"पहिलो"</string> <string name="label_done_key" msgid="7564866296502630852">"भयो"</string> <string name="label_send_key" msgid="482252074224462163">"पठाउनुहोस्"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-ne-rNP/strings-emoji-descriptions.xml index cb13f5067..3cf2971c8 100644 --- a/java/res/values-ne-rNP/strings-emoji-descriptions.xml +++ b/java/res/values-ne-rNP/strings-emoji-descriptions.xml @@ -20,1627 +20,827 @@ <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_emoji_00A9 (2859822817116803638) --> - <skip /> - <!-- no translation found for spoken_emoji_00AE (7708335454134589027) --> - <skip /> - <!-- no translation found for spoken_emoji_203C (153340916701508663) --> - <skip /> - <!-- no translation found for spoken_emoji_2049 (4877256448299555371) --> - <skip /> - <!-- no translation found for spoken_emoji_2122 (9188440722954720429) --> - <skip /> - <!-- no translation found for spoken_emoji_2139 (9114342638917304327) --> - <skip /> - <!-- no translation found for spoken_emoji_2194 (8055202727034946680) --> - <skip /> - <!-- no translation found for spoken_emoji_2195 (8028122253301087407) --> - <skip /> - <!-- no translation found for spoken_emoji_2196 (4019164898967854363) --> - <skip /> - <!-- no translation found for spoken_emoji_2197 (4255723717709017801) --> - <skip /> - <!-- no translation found for spoken_emoji_2198 (1452063451313622090) --> - <skip /> - <!-- no translation found for spoken_emoji_2199 (6942722693368807849) --> - <skip /> - <!-- no translation found for spoken_emoji_21A9 (5204750172335111188) --> - <skip /> - <!-- no translation found for spoken_emoji_21AA (3950259884359247006) --> - <skip /> - <!-- no translation found for spoken_emoji_231A (6751448803233874993) --> - <skip /> - <!-- no translation found for spoken_emoji_231B (5956428809948426182) --> - <skip /> - <!-- no translation found for spoken_emoji_23E9 (4022497733535162237) --> - <skip /> - <!-- no translation found for spoken_emoji_23EA (2251396938087774944) --> - <skip /> - <!-- no translation found for spoken_emoji_23EB (3746885195641491865) --> - <skip /> - <!-- no translation found for spoken_emoji_23EC (7852372752901163416) --> - <skip /> - <!-- no translation found for spoken_emoji_23F0 (8474219588750627870) --> - <skip /> - <!-- no translation found for spoken_emoji_23F3 (166900119581024371) --> - <skip /> - <!-- no translation found for spoken_emoji_24C2 (3948348737566038470) --> - <skip /> - <!-- no translation found for spoken_emoji_25AA (7865181015100227349) --> - <skip /> - <!-- no translation found for spoken_emoji_25AB (6446532820937381457) --> - <skip /> - <!-- no translation found for spoken_emoji_25B6 (2423897708496040947) --> - <skip /> - <!-- no translation found for spoken_emoji_25C0 (3595083440074484934) --> - <skip /> - <!-- no translation found for spoken_emoji_25FB (4838691986881215419) --> - <skip /> - <!-- no translation found for spoken_emoji_25FC (7008859564991191050) --> - <skip /> - <!-- no translation found for spoken_emoji_25FD (7673439755069217479) --> - <skip /> - <!-- no translation found for spoken_emoji_25FE (6782214109919768923) --> - <skip /> - <!-- no translation found for spoken_emoji_2600 (2272722634618990413) --> - <skip /> - <!-- no translation found for spoken_emoji_2601 (6205136889311537150) --> - <skip /> - <!-- no translation found for spoken_emoji_260E (8670395193046424238) --> - <skip /> - <!-- no translation found for spoken_emoji_2611 (4530550203347054611) --> - <skip /> - <!-- no translation found for spoken_emoji_2614 (1612791247861229500) --> - <skip /> - <!-- no translation found for spoken_emoji_2615 (3320562382424018588) --> - <skip /> - <!-- no translation found for spoken_emoji_261D (4690554173549768467) --> - <skip /> - <!-- no translation found for spoken_emoji_263A (3170094381521989300) --> - <skip /> - <!-- no translation found for spoken_emoji_2648 (4621241062667020673) --> - <skip /> - <!-- no translation found for spoken_emoji_2649 (7694461245947059086) --> - <skip /> - <!-- no translation found for spoken_emoji_264A (1258074605878705030) --> - <skip /> - <!-- no translation found for spoken_emoji_264B (4409219914377810956) --> - <skip /> - <!-- no translation found for spoken_emoji_264C (6520255367817054163) --> - <skip /> - <!-- no translation found for spoken_emoji_264D (1504758945499854018) --> - <skip /> - <!-- no translation found for spoken_emoji_264E (2354847104530633519) --> - <skip /> - <!-- no translation found for spoken_emoji_264F (5822933280406416112) --> - <skip /> - <!-- no translation found for spoken_emoji_2650 (4832481156714796163) --> - <skip /> - <!-- no translation found for spoken_emoji_2651 (840953134601595090) --> - <skip /> - <!-- no translation found for spoken_emoji_2652 (3586925968718775281) --> - <skip /> - <!-- no translation found for spoken_emoji_2653 (8420547731496254492) --> - <skip /> - <!-- no translation found for spoken_emoji_2660 (4541170554542412536) --> - <skip /> - <!-- no translation found for spoken_emoji_2663 (3669352721942285724) --> - <skip /> - <!-- no translation found for spoken_emoji_2665 (6347941599683765843) --> - <skip /> - <!-- no translation found for spoken_emoji_2666 (8296769213401115999) --> - <skip /> - <!-- no translation found for spoken_emoji_2668 (7063148281053820386) --> - <skip /> - <!-- no translation found for spoken_emoji_267B (21716857176812762) --> - <skip /> - <!-- no translation found for spoken_emoji_267F (8833496533226475443) --> - <skip /> - <!-- no translation found for spoken_emoji_2693 (7443148847598433088) --> - <skip /> - <!-- no translation found for spoken_emoji_26A0 (6272635532992727510) --> - <skip /> - <!-- no translation found for spoken_emoji_26A1 (5604749644693339145) --> - <skip /> - <!-- no translation found for spoken_emoji_26AA (8005748091690377153) --> - <skip /> - <!-- no translation found for spoken_emoji_26AB (1655910278422753244) --> - <skip /> - <!-- no translation found for spoken_emoji_26BD (1545218197938889737) --> - <skip /> - <!-- no translation found for spoken_emoji_26BE (8959760533076498209) --> - <skip /> - <!-- no translation found for spoken_emoji_26C4 (3045791757044255626) --> - <skip /> - <!-- no translation found for spoken_emoji_26C5 (5580129409712578639) --> - <skip /> - <!-- no translation found for spoken_emoji_26CE (8963656417276062998) --> - <skip /> - <!-- no translation found for spoken_emoji_26D4 (2231451988209604130) --> - <skip /> - <!-- no translation found for spoken_emoji_26EA (7513319636103804907) --> - <skip /> - <!-- no translation found for spoken_emoji_26F2 (7134115206158891037) --> - <skip /> - <!-- no translation found for spoken_emoji_26F3 (4912302210162075465) --> - <skip /> - <!-- no translation found for spoken_emoji_26F5 (4766328116769075217) --> - <skip /> - <!-- no translation found for spoken_emoji_26FA (5888017494809199037) --> - <skip /> - <!-- no translation found for spoken_emoji_26FD (2417060622927453534) --> - <skip /> - <!-- no translation found for spoken_emoji_2702 (4005741160717451912) --> - <skip /> - <!-- no translation found for spoken_emoji_2705 (164605766946697759) --> - <skip /> - <!-- no translation found for spoken_emoji_2708 (7153840886849268988) --> - <skip /> - <!-- no translation found for spoken_emoji_2709 (2217319160724311369) --> - <skip /> - <!-- no translation found for spoken_emoji_270A (508347232762319473) --> - <skip /> - <!-- no translation found for spoken_emoji_270B (6640562128327753423) --> - <skip /> - <!-- no translation found for spoken_emoji_270C (1344288035704944581) --> - <skip /> - <!-- no translation found for spoken_emoji_270F (6108251586067318718) --> - <skip /> - <!-- no translation found for spoken_emoji_2712 (6320544535087710482) --> - <skip /> - <!-- no translation found for spoken_emoji_2714 (1968242800064001654) --> - <skip /> - <!-- no translation found for spoken_emoji_2716 (511941294762977228) --> - <skip /> - <!-- no translation found for spoken_emoji_2728 (5650330815808691881) --> - <skip /> - <!-- no translation found for spoken_emoji_2733 (8915809595141157327) --> - <skip /> - <!-- no translation found for spoken_emoji_2734 (4846583547980754332) --> - <skip /> - <!-- no translation found for spoken_emoji_2744 (4350636647760161042) --> - <skip /> - <!-- no translation found for spoken_emoji_2747 (3718282973916474455) --> - <skip /> - <!-- no translation found for spoken_emoji_274C (2752145886733295314) --> - <skip /> - <!-- no translation found for spoken_emoji_274E (4262918689871098338) --> - <skip /> - <!-- no translation found for spoken_emoji_2753 (6935897159942119808) --> - <skip /> - <!-- no translation found for spoken_emoji_2754 (7277504915105532954) --> - <skip /> - <!-- no translation found for spoken_emoji_2755 (6853076969826960210) --> - <skip /> - <!-- no translation found for spoken_emoji_2757 (3707907828776912174) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_2795 (6563954833786162168) --> - <skip /> - <!-- no translation found for spoken_emoji_2796 (5990926508250772777) --> - <skip /> - <!-- no translation found for spoken_emoji_2797 (24694184172879174) --> - <skip /> - <!-- no translation found for spoken_emoji_27A1 (3513434778263100580) --> - <skip /> - <!-- no translation found for spoken_emoji_27B0 (203395646864662198) --> - <skip /> - <!-- no translation found for spoken_emoji_27BF (4940514642375640510) --> - <skip /> - <!-- no translation found for spoken_emoji_2934 (9062130477982973457) --> - <skip /> - <!-- no translation found for spoken_emoji_2935 (6198710960720232074) --> - <skip /> - <!-- no translation found for spoken_emoji_2B05 (4813405635410707690) --> - <skip /> - <!-- no translation found for spoken_emoji_2B06 (1223172079106250748) --> - <skip /> - <!-- no translation found for spoken_emoji_2B07 (1599124424746596150) --> - <skip /> - <!-- no translation found for spoken_emoji_2B1B (3461247311988501626) --> - <skip /> - <!-- no translation found for spoken_emoji_2B1C (5793146430145248915) --> - <skip /> - <!-- no translation found for spoken_emoji_2B50 (3850845519526950524) --> - <skip /> - <!-- no translation found for spoken_emoji_2B55 (9137882158811541824) --> - <skip /> - <!-- no translation found for spoken_emoji_3030 (4609172241893565639) --> - <skip /> - <!-- no translation found for spoken_emoji_303D (2545833934975907505) --> - <skip /> - <!-- no translation found for spoken_emoji_3297 (928912923628973800) --> - <skip /> - <!-- no translation found for spoken_emoji_3299 (3930347573693668426) --> - <skip /> - <!-- no translation found for spoken_emoji_1F004 (1705216181345894600) --> - <skip /> - <!-- no translation found for spoken_emoji_1F0CF (7601493592085987866) --> - <skip /> - <!-- no translation found for spoken_emoji_1F170 (3817698686602826773) --> - <skip /> - <!-- no translation found for spoken_emoji_1F171 (3684218589626650242) --> - <skip /> - <!-- no translation found for spoken_emoji_1F17E (2978809190364779029) --> - <skip /> - <!-- no translation found for spoken_emoji_1F17F (463634348668462040) --> - <skip /> - <!-- no translation found for spoken_emoji_1F18E (1650705325221496768) --> - <skip /> - <!-- no translation found for spoken_emoji_1F191 (5386969264431429221) --> - <skip /> - <!-- no translation found for spoken_emoji_1F192 (8324226436829162496) --> - <skip /> - <!-- no translation found for spoken_emoji_1F193 (4731758603321515364) --> - <skip /> - <!-- no translation found for spoken_emoji_1F194 (4903128609556175887) --> - <skip /> - <!-- no translation found for spoken_emoji_1F195 (1433142500411060924) --> - <skip /> - <!-- no translation found for spoken_emoji_1F196 (8825160701159634202) --> - <skip /> - <!-- no translation found for spoken_emoji_1F197 (7841079241554176535) --> - <skip /> - <!-- no translation found for spoken_emoji_1F198 (7020298909426960622) --> - <skip /> - <!-- no translation found for spoken_emoji_1F199 (5971252667136235630) --> - <skip /> - <!-- no translation found for spoken_emoji_1F19A (4557270135899843959) --> - <skip /> - <!-- no translation found for spoken_emoji_1F201 (7000490044681139002) --> - <skip /> - <!-- no translation found for spoken_emoji_1F202 (8560906958695043947) --> - <skip /> - <!-- no translation found for spoken_emoji_1F21A (1496435317324514033) --> - <skip /> - <!-- no translation found for spoken_emoji_1F22F (609797148862445402) --> - <skip /> - <!-- no translation found for spoken_emoji_1F232 (8125716331632035820) --> - <skip /> - <!-- no translation found for spoken_emoji_1F233 (8749401090457355028) --> - <skip /> - <!-- no translation found for spoken_emoji_1F234 (3546951604285970768) --> - <skip /> - <!-- no translation found for spoken_emoji_1F235 (5320186982841793711) --> - <skip /> - <!-- no translation found for spoken_emoji_1F236 (879755752069393034) --> - <skip /> - <!-- no translation found for spoken_emoji_1F237 (6741807001205851437) --> - <skip /> - <!-- no translation found for spoken_emoji_1F238 (5504414186438196912) --> - <skip /> - <!-- no translation found for spoken_emoji_1F239 (1634067311597618959) --> - <skip /> - <!-- no translation found for spoken_emoji_1F23A (3107862957630169536) --> - <skip /> - <!-- no translation found for spoken_emoji_1F250 (6586943922806727907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F251 (9099032855993346948) --> - <skip /> - <!-- no translation found for spoken_emoji_1F300 (4720098285295840383) --> - <skip /> - <!-- no translation found for spoken_emoji_1F301 (3601962477653752974) --> - <skip /> - <!-- no translation found for spoken_emoji_1F302 (3404357123421753593) --> - <skip /> - <!-- no translation found for spoken_emoji_1F303 (3899301321538188206) --> - <skip /> - <!-- no translation found for spoken_emoji_1F304 (2767148930689050040) --> - <skip /> - <!-- no translation found for spoken_emoji_1F305 (9165812924292061196) --> - <skip /> - <!-- no translation found for spoken_emoji_1F306 (5889294736109193104) --> - <skip /> - <!-- no translation found for spoken_emoji_1F307 (2714290867291163713) --> - <skip /> - <!-- no translation found for spoken_emoji_1F308 (688704703985173377) --> - <skip /> - <!-- no translation found for spoken_emoji_1F309 (6217981957992313528) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30A (4329309263152110893) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30B (5729430693700923112) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30C (2961230863217543082) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30D (1113905673331547953) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30E (5278512600749223671) --> - <skip /> - <!-- no translation found for spoken_emoji_1F30F (5718144880978707493) --> - <skip /> - <!-- no translation found for spoken_emoji_1F310 (2959618582975247601) --> - <skip /> - <!-- no translation found for spoken_emoji_1F311 (623906380914895542) --> - <skip /> - <!-- no translation found for spoken_emoji_1F312 (4458575672576125401) --> - <skip /> - <!-- no translation found for spoken_emoji_1F313 (7599181787989497294) --> - <skip /> - <!-- no translation found for spoken_emoji_1F314 (4898293184964365413) --> - <skip /> - <!-- no translation found for spoken_emoji_1F315 (3218117051779496309) --> - <skip /> - <!-- no translation found for spoken_emoji_1F316 (2061317145777689569) --> - <skip /> - <!-- no translation found for spoken_emoji_1F317 (2721090687319539049) --> - <skip /> - <!-- no translation found for spoken_emoji_1F318 (3814091755648887570) --> - <skip /> - <!-- no translation found for spoken_emoji_1F319 (4074299824890459465) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31A (3092285278116977103) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31B (2658562138386927881) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31C (7914768515547867384) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31D (1925730459848297182) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31E (8022112382524084418) --> - <skip /> - <!-- no translation found for spoken_emoji_1F31F (1051661214137766369) --> - <skip /> - <!-- no translation found for spoken_emoji_1F320 (5450591979068216115) --> - <skip /> - <!-- no translation found for spoken_emoji_1F330 (3115760035618051575) --> - <skip /> - <!-- no translation found for spoken_emoji_1F331 (5658888205290008691) --> - <skip /> - <!-- no translation found for spoken_emoji_1F332 (2935650450421165938) --> - <skip /> - <!-- no translation found for spoken_emoji_1F333 (5898847427062482675) --> - <skip /> - <!-- no translation found for spoken_emoji_1F334 (6183375224678417894) --> - <skip /> - <!-- no translation found for spoken_emoji_1F335 (5352418412103584941) --> - <skip /> - <!-- no translation found for spoken_emoji_1F337 (3839107352363566289) --> - <skip /> - <!-- no translation found for spoken_emoji_1F338 (6389970364260468490) --> - <skip /> - <!-- no translation found for spoken_emoji_1F339 (9128891447985256151) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33A (2025828400095233078) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33B (8163868254348448552) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33C (6850371206262335812) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33D (9033484052864509610) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33E (2540173396638444120) --> - <skip /> - <!-- no translation found for spoken_emoji_1F33F (4384823344364908558) --> - <skip /> - <!-- no translation found for spoken_emoji_1F340 (3494255459156499305) --> - <skip /> - <!-- no translation found for spoken_emoji_1F341 (4581959481754990158) --> - <skip /> - <!-- no translation found for spoken_emoji_1F342 (3119068426871821222) --> - <skip /> - <!-- no translation found for spoken_emoji_1F343 (2663317495805149004) --> - <skip /> - <!-- no translation found for spoken_emoji_1F344 (2738517881678722159) --> - <skip /> - <!-- no translation found for spoken_emoji_1F345 (6135288642349085554) --> - <skip /> - <!-- no translation found for spoken_emoji_1F346 (2075395322785406367) --> - <skip /> - <!-- no translation found for spoken_emoji_1F347 (7753453754963890571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F348 (1247076837284932788) --> - <skip /> - <!-- no translation found for spoken_emoji_1F349 (5563054555180611086) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34A (4688661208570160524) --> - <skip /> - <string name="spoken_emoji_1F34B" msgid="4335318423164185706">"कागती"</string> - <!-- no translation found for spoken_emoji_1F34C (3712827239858159474) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34D (7712521967162622936) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34E (1859466882598614228) --> - <skip /> - <!-- no translation found for spoken_emoji_1F34F (8251711032295005633) --> - <skip /> - <!-- no translation found for spoken_emoji_1F350 (625802980159197701) --> - <skip /> - <!-- no translation found for spoken_emoji_1F351 (4269460120610911895) --> - <skip /> - <!-- no translation found for spoken_emoji_1F352 (965600953360182635) --> - <skip /> - <!-- no translation found for spoken_emoji_1F353 (7068623879906925592) --> - <skip /> - <!-- no translation found for spoken_emoji_1F354 (45162285238888494) --> - <skip /> - <!-- no translation found for spoken_emoji_1F355 (9157587635526433283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F356 (2667196119149852244) --> - <skip /> - <!-- no translation found for spoken_emoji_1F357 (8022817413851052256) --> - <skip /> - <!-- no translation found for spoken_emoji_1F358 (3042693264748036476) --> - <skip /> - <!-- no translation found for spoken_emoji_1F359 (3988148661730121958) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35A (1763824172198327268) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35B (62530406745717835) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35C (7537756539198945509) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35D (8173523083861875196) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35E (2935428307894662571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F35F (4840297386785728443) --> - <skip /> - <!-- no translation found for spoken_emoji_1F360 (4094659855684686801) --> - <skip /> - <!-- no translation found for spoken_emoji_1F361 (6475486395784096109) --> - <skip /> - <!-- no translation found for spoken_emoji_1F362 (5004692577661076275) --> - <skip /> - <!-- no translation found for spoken_emoji_1F363 (1606603765717743806) --> - <skip /> - <!-- no translation found for spoken_emoji_1F364 (6550457766169570811) --> - <skip /> - <!-- no translation found for spoken_emoji_1F365 (4963815540953316307) --> - <skip /> - <!-- no translation found for spoken_emoji_1F366 (7862401745277049404) --> - <skip /> - <!-- no translation found for spoken_emoji_1F367 (7447972978281980414) --> - <skip /> - <!-- no translation found for spoken_emoji_1F368 (7790003146142724913) --> - <skip /> - <!-- no translation found for spoken_emoji_1F369 (7383712944084857350) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36A (2726271795913042295) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36B (6342163604299875931) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36C (2168934753998218790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36D (3671507903799975792) --> - <skip /> - <!-- no translation found for spoken_emoji_1F36E (4630541402785165902) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F370 (7243244547866114951) --> - <skip /> - <!-- no translation found for spoken_emoji_1F371 (6731527040552916358) --> - <skip /> - <!-- no translation found for spoken_emoji_1F372 (1635035323832181733) --> - <skip /> - <!-- no translation found for spoken_emoji_1F373 (7799289534289221045) --> - <skip /> - <!-- no translation found for spoken_emoji_1F374 (5973820884987069131) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F376 (6499274685584852067) --> - <skip /> - <!-- no translation found for spoken_emoji_1F377 (1762398562314172075) --> - <skip /> - <!-- no translation found for spoken_emoji_1F378 (5528234560590117516) --> - <skip /> - <!-- no translation found for spoken_emoji_1F379 (790581290787943325) --> - <skip /> - <!-- no translation found for spoken_emoji_1F37A (391966822450619516) --> - <skip /> - <!-- no translation found for spoken_emoji_1F37B (9015043286465670662) --> - <skip /> - <!-- no translation found for spoken_emoji_1F37C (2532113819464508894) --> - <skip /> - <!-- no translation found for spoken_emoji_1F380 (3487363857092458827) --> - <skip /> - <!-- no translation found for spoken_emoji_1F381 (614180683680675444) --> - <skip /> - <!-- no translation found for spoken_emoji_1F382 (4720497171946687501) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F384 (1797870204479059004) --> - <skip /> - <!-- no translation found for spoken_emoji_1F385 (1754174063483626367) --> - <skip /> - <!-- no translation found for spoken_emoji_1F386 (2130445450758114746) --> - <skip /> - <!-- no translation found for spoken_emoji_1F387 (3403182563117999933) --> - <skip /> - <!-- no translation found for spoken_emoji_1F388 (2903047203723251804) --> - <skip /> - <!-- no translation found for spoken_emoji_1F389 (2352830665883549388) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38A (6280428984773641322) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38B (4902225837479015489) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38C (7623268024030989365) --> - <skip /> - <!-- no translation found for spoken_emoji_1F38D (8237542796124408528) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F38F (8754091376829552844) --> - <skip /> - <!-- no translation found for spoken_emoji_1F390 (8903307048095431374) --> - <skip /> - <!-- no translation found for spoken_emoji_1F391 (2134952069191911841) --> - <skip /> - <!-- no translation found for spoken_emoji_1F392 (6380405493914304737) --> - <skip /> - <!-- no translation found for spoken_emoji_1F393 (6947890064872470996) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A0 (3572095190082826057) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A1 (4300565511681058798) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A2 (15486093912232140) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A3 (921739319504942924) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A4 (7497596355346856950) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A5 (4290497821228183002) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A6 (26019057872319055) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A7 (837856608794094105) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A8 (2332260356509244587) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3A9 (9045869366525115256) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AA (5728760354237132) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AB (1657997517193216284) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AC (4317366554314492152) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AD (607157286336130470) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AE (2902308174671548150) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3AF (5420539221790296407) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B0 (7440244806527891956) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B1 (545544382391379234) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B2 (8302262034774787493) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B3 (5180870610771027520) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B4 (4723852033266071564) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B5 (1998470239850548554) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B6 (3827730457113941705) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3B7 (5503403099445042180) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F3B9 (5596295757967881451) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BA (4284064120340683558) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BB (2856598510069988745) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BC (1608424748821446230) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3BD (5490786111375627777) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F3BF (6862405997423247921) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C0 (7421420756115104085) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C1 (6926537251677319922) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C2 (5708596929237987082) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C3 (5850982999510115824) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C4 (8468355585994639838) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C6 (9094474706847545409) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C7 (8172206200368370116) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C8 (5619171461277597709) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3C9 (6371294008765871043) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3CA (130977831787806932) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E0 (6277213201655811842) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E1 (233476176077538885) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E2 (919736380093964570) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E3 (6177606081825094184) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E4 (717377871070970293) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E5 (1350532500431776780) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E6 (342132788513806214) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E7 (6322352038284944265) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E8 (5864918444350599907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3E9 (7830416185375326938) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3EA (5081084413084360479) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F3EC (4845978861878295154) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3ED (3980316226665215370) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3EE (1253964276770550248) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3EF (1128975573507389883) --> - <skip /> - <!-- no translation found for spoken_emoji_1F3F0 (1544632297502291578) --> - <skip /> - <!-- no translation found for spoken_emoji_1F400 (2063034795679578294) --> - <skip /> - <!-- no translation found for spoken_emoji_1F401 (6736421616217369594) --> - <skip /> - <!-- no translation found for spoken_emoji_1F402 (7276670995895485604) --> - <skip /> - <!-- no translation found for spoken_emoji_1F403 (8045709541897118928) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F406 (5163461930159540018) --> - <skip /> - <!-- no translation found for spoken_emoji_1F407 (6905370221172708160) --> - <skip /> - <!-- no translation found for spoken_emoji_1F408 (1362164550508207284) --> - <skip /> - <!-- no translation found for spoken_emoji_1F409 (8476130983168866013) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40A (1149626786411545043) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40B (5199104921208397643) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40C (2704006052881702675) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40D (8648186663643157522) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40E (7219137467573327268) --> - <skip /> - <!-- no translation found for spoken_emoji_1F40F (7834336676729040395) --> - <skip /> - <!-- no translation found for spoken_emoji_1F410 (8686765722255775031) --> - <skip /> - <!-- no translation found for spoken_emoji_1F411 (3585715397876383525) --> - <skip /> - <!-- no translation found for spoken_emoji_1F412 (4924794582980077838) --> - <skip /> - <!-- no translation found for spoken_emoji_1F413 (1460475310405677377) --> - <skip /> - <!-- no translation found for spoken_emoji_1F414 (5857296282631892219) --> - <skip /> - <!-- no translation found for spoken_emoji_1F415 (5920041074892949527) --> - <skip /> - <!-- no translation found for spoken_emoji_1F416 (4362403392912540286) --> - <skip /> - <!-- no translation found for spoken_emoji_1F417 (6836978415840795128) --> - <skip /> - <!-- no translation found for spoken_emoji_1F418 (7926161463897783691) --> - <skip /> - <!-- no translation found for spoken_emoji_1F419 (1055233959755784186) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41A (5195666556511558060) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41B (7652480167465557832) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41C (1123461148697574239) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41D (718579308764058851) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41E (6766305509608115467) --> - <skip /> - <!-- no translation found for spoken_emoji_1F41F (1207261298343160838) --> - <skip /> - <!-- no translation found for spoken_emoji_1F420 (1041145003133609221) --> - <skip /> - <!-- no translation found for spoken_emoji_1F421 (1748378324417438751) --> - <skip /> - <!-- no translation found for spoken_emoji_1F422 (4106724877523329148) --> - <skip /> - <!-- no translation found for spoken_emoji_1F423 (4077407945958691907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F424 (6911326019270172283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F425 (5466514196557885577) --> - <skip /> - <!-- no translation found for spoken_emoji_1F426 (2163979138772892755) --> - <skip /> - <!-- no translation found for spoken_emoji_1F427 (3585670324511212961) --> - <skip /> - <!-- no translation found for spoken_emoji_1F428 (7955440808647898579) --> - <skip /> - <!-- no translation found for spoken_emoji_1F429 (5028269352809819035) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42A (4681926706404032484) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42B (2725166074981558322) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42C (6764791873413727085) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42D (1033643138546864251) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42E (8099223337120508820) --> - <skip /> - <!-- no translation found for spoken_emoji_1F42F (2104743989330781572) --> - <skip /> - <!-- no translation found for spoken_emoji_1F430 (525492897063150160) --> - <skip /> - <!-- no translation found for spoken_emoji_1F431 (6051358666235016851) --> - <skip /> - <!-- no translation found for spoken_emoji_1F432 (7698001871193018305) --> - <skip /> - <!-- no translation found for spoken_emoji_1F433 (3762356053512899326) --> - <skip /> - <!-- no translation found for spoken_emoji_1F434 (3619943222159943226) --> - <skip /> - <!-- no translation found for spoken_emoji_1F435 (59199202683252958) --> - <skip /> - <!-- no translation found for spoken_emoji_1F436 (340544719369009828) --> - <skip /> - <!-- no translation found for spoken_emoji_1F437 (1219818379784982585) --> - <skip /> - <!-- no translation found for spoken_emoji_1F438 (9128124743321008210) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F43A (6727645488430385584) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43B (5397170068392865167) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43C (2715995734367032431) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43D (6005480717951776597) --> - <skip /> - <!-- no translation found for spoken_emoji_1F43E (8917626103219080547) --> - <skip /> - <!-- no translation found for spoken_emoji_1F440 (7144338258163384433) --> - <skip /> - <!-- no translation found for spoken_emoji_1F442 (1905515392292676124) --> - <skip /> - <!-- no translation found for spoken_emoji_1F443 (1491504447758933115) --> - <skip /> - <!-- no translation found for spoken_emoji_1F444 (3654613047946080332) --> - <skip /> - <!-- no translation found for spoken_emoji_1F445 (7024905244040509204) --> - <skip /> - <!-- no translation found for spoken_emoji_1F446 (2150365643636471745) --> - <skip /> - <!-- no translation found for spoken_emoji_1F447 (8794022344940891388) --> - <skip /> - <!-- no translation found for spoken_emoji_1F448 (3261812959215550650) --> - <skip /> - <!-- no translation found for spoken_emoji_1F449 (4764447975177805991) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44A (7197417095486424841) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44B (1975968945250833117) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44C (3185919567897876562) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44D (6182553970602667815) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44E (8030851867365111809) --> - <skip /> - <!-- no translation found for spoken_emoji_1F44F (5148753662268213389) --> - <skip /> - <!-- no translation found for spoken_emoji_1F450 (1012021072085157054) --> - <skip /> - <!-- no translation found for spoken_emoji_1F451 (8257466714629051320) --> - <skip /> - <!-- no translation found for spoken_emoji_1F452 (4567394011149905466) --> - <skip /> - <!-- no translation found for spoken_emoji_1F453 (5978410551173163010) --> - <skip /> - <!-- no translation found for spoken_emoji_1F454 (348469036193323252) --> - <skip /> - <!-- no translation found for spoken_emoji_1F455 (5665118831861433578) --> - <skip /> - <!-- no translation found for spoken_emoji_1F456 (1890991330923356408) --> - <skip /> - <!-- no translation found for spoken_emoji_1F457 (3904310482655702620) --> - <skip /> - <!-- no translation found for spoken_emoji_1F458 (5704243858031107692) --> - <skip /> - <!-- no translation found for spoken_emoji_1F459 (3553148747050035251) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45A (1389654639484716101) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45B (1113293170254222904) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45C (3410257778598006936) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45D (812176504300064819) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45E (2901741399934723562) --> - <skip /> - <!-- no translation found for spoken_emoji_1F45F (6828566359287798863) --> - <skip /> - <string name="spoken_emoji_1F460" msgid="305863879170420855">"अग्लो-कुर्कुच्चा भएको जुत्ता"</string> - <!-- no translation found for spoken_emoji_1F461 (5160493217831417630) --> - <skip /> - <!-- no translation found for spoken_emoji_1F462 (1722897795554863734) --> - <skip /> - <!-- no translation found for spoken_emoji_1F463 (5850772903593010699) --> - <skip /> - <!-- no translation found for spoken_emoji_1F464 (1228335905487734913) --> - <skip /> - <!-- no translation found for spoken_emoji_1F465 (4461307702499679879) --> - <skip /> - <!-- no translation found for spoken_emoji_1F466 (1938873085514108889) --> - <skip /> - <!-- no translation found for spoken_emoji_1F467 (8237080594860144998) --> - <skip /> - <!-- no translation found for spoken_emoji_1F468 (6081300722526675382) --> - <skip /> - <!-- no translation found for spoken_emoji_1F469 (1090140923076108158) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46A (5063570981942606595) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46B (6795882374287327952) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46C (6844464165783964495) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46D (2316773068014053180) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46E (5897625605860822401) --> - <skip /> - <!-- no translation found for spoken_emoji_1F46F (7716871657717641490) --> - <skip /> - <!-- no translation found for spoken_emoji_1F470 (6409995400510338892) --> - <skip /> - <!-- no translation found for spoken_emoji_1F471 (3058247860441670806) --> - <skip /> - <!-- no translation found for spoken_emoji_1F472 (3928854667819339142) --> - <skip /> - <!-- no translation found for spoken_emoji_1F473 (5921952095808988381) --> - <skip /> - <!-- no translation found for spoken_emoji_1F474 (1082237499496725183) --> - <skip /> - <!-- no translation found for spoken_emoji_1F475 (7280323988642212761) --> - <skip /> - <!-- no translation found for spoken_emoji_1F476 (4713322657821088296) --> - <skip /> - <!-- no translation found for spoken_emoji_1F477 (2197036131029221370) --> - <skip /> - <!-- no translation found for spoken_emoji_1F478 (7245521193493488875) --> - <skip /> - <!-- no translation found for spoken_emoji_1F479 (6876475321015553972) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47A (3900813633102703571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47B (2608250873194079390) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47C (3838699131276537421) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47D (2874077455888369538) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47E (3642607168625579507) --> - <skip /> - <!-- no translation found for spoken_emoji_1F47F (441605977269926252) --> - <skip /> - <!-- no translation found for spoken_emoji_1F480 (3696253485164878739) --> - <skip /> - <!-- no translation found for spoken_emoji_1F481 (320408708521966893) --> - <skip /> - <!-- no translation found for spoken_emoji_1F482 (3424354860245608949) --> - <skip /> - <!-- no translation found for spoken_emoji_1F483 (3221113594843849083) --> - <skip /> - <!-- no translation found for spoken_emoji_1F484 (7348014979080444885) --> - <skip /> - <!-- no translation found for spoken_emoji_1F485 (6133507975565116339) --> - <skip /> - <!-- no translation found for spoken_emoji_1F486 (9085459968247394155) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F488 (6922559285234100252) --> - <skip /> - <!-- no translation found for spoken_emoji_1F489 (8114863680950147305) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48A (8526843630145963032) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48B (2538528967897640292) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48C (1681173271652890232) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48D (8259886164999042373) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48E (8777981696011111101) --> - <skip /> - <!-- no translation found for spoken_emoji_1F48F (741593675183677907) --> - <skip /> - <!-- no translation found for spoken_emoji_1F490 (4482549128959806736) --> - <skip /> - <!-- no translation found for spoken_emoji_1F491 (2305245307882441500) --> - <skip /> - <!-- no translation found for spoken_emoji_1F492 (3884119934804475732) --> - <skip /> - <!-- no translation found for spoken_emoji_1F493 (1208828371565525121) --> - <skip /> - <!-- no translation found for spoken_emoji_1F494 (6198876398509338718) --> - <skip /> - <!-- no translation found for spoken_emoji_1F495 (9206202744967130919) --> - <skip /> - <!-- no translation found for spoken_emoji_1F496 (5436953041732207775) --> - <skip /> - <!-- no translation found for spoken_emoji_1F497 (7285142863951448473) --> - <skip /> - <!-- no translation found for spoken_emoji_1F498 (7940131245037575715) --> - <skip /> - <!-- no translation found for spoken_emoji_1F499 (4453235040265550009) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49A (6262178648366971405) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49B (8085384999750714368) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49C (453829540120898698) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49D (3460534750224161888) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49E (4490636226072523867) --> - <skip /> - <!-- no translation found for spoken_emoji_1F49F (2059319756421226336) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A0 (1954850380550212038) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A1 (403137413540909021) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A2 (2604192053295622063) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A3 (6378351742957821735) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A4 (7217736258870346625) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A5 (5401995723541239858) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A6 (3837802182716483848) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A7 (5718438987757885141) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A8 (4472108229720006377) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4A9 (1240958472788430032) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AA (8427525538635146416) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AB (5484114759939427459) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AC (5571196638219612682) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AD (353174619257798652) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AE (1223142786927162641) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4AF (3526278354452138397) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B0 (4124102195175124156) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B1 (8339494003418572905) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B2 (3179159430187243132) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B3 (5375412518221759596) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B4 (1068592463669453204) --> - <skip /> - <string name="spoken_emoji_1F4B5" msgid="1426708699891832564">"डलर हस्ताक्षरित बैकनोट"</string> - <!-- no translation found for spoken_emoji_1F4B6 (8289249930736444837) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4B7 (5245100496860739429) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F4B9 (647509393536679903) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BA (1269737854891046321) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BB (6252883563347816451) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BC (6182597732218446206) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BD (5820961044768829176) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BE (4754542485835379808) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4BF (2237481756984721795) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C0 (491582501089694461) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C1 (6645461382494158111) --> - <skip /> - <string name="spoken_emoji_1F4C2" msgid="8095638715523765338">"खुला फाइल फोल्डर"</string> - <!-- no translation found for spoken_emoji_1F4C3 (3727274466173970142) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C4 (4382570710795501612) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C5 (8693944622627762487) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C6 (8469908708708424640) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C7 (2665313547987324495) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C8 (8007686702282833600) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4C9 (2271951411192893684) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CA (3525692829622381444) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CB (977639227554095521) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CC (156107396088741574) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CD (4266572175361190231) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CE (6294288509864968290) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4CF (149679400831136810) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D0 (8130339336619202915) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D1 (5852176364856284968) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D2 (2276810154105920052) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D3 (5873386492793610808) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D4 (4754469936418776360) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D5 (4642713351802778905) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D6 (6987347918381807186) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D7 (7813394163241379223) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D8 (7189799718984979521) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4D9 (3874664073186440225) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DA (872212072924287762) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DB (2015183603583392969) --> - <skip /> - <string name="spoken_emoji_1F4DC" msgid="5075845110932456783">"सार्नु"</string> - <!-- no translation found for spoken_emoji_1F4DD (2494006707147586786) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DE (7883008605002117671) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4DF (3538610110623780465) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E0 (2960778342609543077) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E1 (6269733703719242108) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E2 (1987535386302883116) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E3 (5588916572878599224) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E4 (2063561529097749707) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E5 (3232462702926143576) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E6 (3399454337197561635) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E7 (5557136988503873238) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E8 (30698793974124123) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4E9 (5947550337678643166) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EA (772614045207213751) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EB (6491414165464146137) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EC (7369517138779988438) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4ED (5657520436285454241) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EE (8464138906243608614) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4EF (8801427577198798226) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F0 (6330208624731662525) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F1 (3966503935581675695) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F2 (1057540341746100087) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F3 (5003984447315754658) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F4 (5549847566968306253) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F5 (3660199448671699238) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F6 (2676974903233268860) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F7 (2643891943105989039) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4F9 (4475626303058218048) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4FA (1079796186652960775) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4FB (3848729587403760645) --> - <skip /> - <!-- no translation found for spoken_emoji_1F4FC (8370432508874310054) --> - <skip /> - <!-- no translation found for spoken_emoji_1F500 (2389947994502144547) --> - <skip /> - <!-- no translation found for spoken_emoji_1F501 (2132188352433347009) --> - <skip /> - <!-- no translation found for spoken_emoji_1F502 (2361976580513178391) --> - <skip /> - <!-- no translation found for spoken_emoji_1F503 (8936283551917858793) --> - <skip /> - <!-- no translation found for spoken_emoji_1F504 (708290317843535943) --> - <skip /> - <!-- no translation found for spoken_emoji_1F505 (6348909939004951860) --> - <skip /> - <!-- no translation found for spoken_emoji_1F506 (4449609297521280173) --> - <skip /> - <!-- no translation found for spoken_emoji_1F507 (7136386694923708448) --> - <skip /> - <!-- no translation found for spoken_emoji_1F508 (5063567689831527865) --> - <skip /> - <!-- no translation found for spoken_emoji_1F509 (3948050077992370791) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50A (5818194948677277197) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50B (8083470451266295876) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50C (7793219132036431680) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50D (8140244710637926780) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50E (4751821352839693365) --> - <skip /> - <!-- no translation found for spoken_emoji_1F50F (915079280472199605) --> - <skip /> - <!-- no translation found for spoken_emoji_1F510 (7658381761691758318) --> - <skip /> - <!-- no translation found for spoken_emoji_1F511 (262319867774655688) --> - <skip /> - <!-- no translation found for spoken_emoji_1F512 (5628688337255115175) --> - <skip /> - <!-- no translation found for spoken_emoji_1F513 (8579201846619420981) --> - <skip /> - <!-- no translation found for spoken_emoji_1F514 (7027268683047322521) --> - <skip /> - <!-- no translation found for spoken_emoji_1F515 (8903179856036069242) --> - <skip /> - <!-- no translation found for spoken_emoji_1F516 (108097933937925381) --> - <skip /> - <!-- no translation found for spoken_emoji_1F517 (2450846665734313397) --> - <skip /> - <!-- no translation found for spoken_emoji_1F518 (7028220286841437832) --> - <skip /> - <!-- no translation found for spoken_emoji_1F519 (8211189165075445687) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51A (823966751787338892) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51B (5920570742107943382) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51C (110609810659826676) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51D (4087697222026095447) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51E (8512873526157201775) --> - <skip /> - <!-- no translation found for spoken_emoji_1F51F (8673370823728653973) --> - <skip /> - <!-- no translation found for spoken_emoji_1F520 (7335109890337048900) --> - <skip /> - <!-- no translation found for spoken_emoji_1F521 (2693185864450925778) --> - <skip /> - <!-- no translation found for spoken_emoji_1F522 (8419130286280673347) --> - <skip /> - <string name="spoken_emoji_1F523" msgid="3318053476401719421">"प्रतीकको लागि प्रतीक प्रविष्ट गर्नुस्"</string> - <!-- no translation found for spoken_emoji_1F524 (1625073997522316331) --> - <skip /> - <!-- no translation found for spoken_emoji_1F525 (4083884189172963790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F526 (2035494936742643580) --> - <skip /> - <!-- no translation found for spoken_emoji_1F527 (134257142354034271) --> - <skip /> - <!-- no translation found for spoken_emoji_1F528 (700627429570609375) --> - <skip /> - <!-- no translation found for spoken_emoji_1F529 (7480548235904988573) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52A (7613580031502317893) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52B (4554906608328118613) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52C (1330294501371770790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52D (7549551775445177140) --> - <skip /> - <!-- no translation found for spoken_emoji_1F52E (4457099417872625141) --> - <skip /> - <string name="spoken_emoji_1F52F" msgid="8899031001317442792">"बिचमा थोप्ला निहित छ चुच्चे तारा"</string> - <!-- no translation found for spoken_emoji_1F530 (3572898444281774023) --> - <skip /> - <!-- no translation found for spoken_emoji_1F531 (5225633376450025396) --> - <skip /> - <!-- no translation found for spoken_emoji_1F532 (9169568490485180779) --> - <skip /> - <!-- no translation found for spoken_emoji_1F533 (6554193837201918598) --> - <skip /> - <!-- no translation found for spoken_emoji_1F534 (8339298801331865340) --> - <skip /> - <!-- no translation found for spoken_emoji_1F535 (1227403104835533512) --> - <skip /> - <!-- no translation found for spoken_emoji_1F536 (5477372445510469331) --> - <skip /> - <!-- no translation found for spoken_emoji_1F537 (3158915214347274626) --> - <skip /> - <!-- no translation found for spoken_emoji_1F538 (4300084249474451991) --> - <skip /> - <!-- no translation found for spoken_emoji_1F539 (6535159756325742275) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53A (3728196273988781389) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53B (7182097039614128707) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53C (4077022046319615029) --> - <skip /> - <!-- no translation found for spoken_emoji_1F53D (3939112784894620713) --> - <skip /> - <!-- no translation found for spoken_emoji_1F550 (7761392621689986218) --> - <skip /> - <!-- no translation found for spoken_emoji_1F551 (2699448504113431716) --> - <skip /> - <!-- no translation found for spoken_emoji_1F552 (5872107867411853750) --> - <skip /> - <!-- no translation found for spoken_emoji_1F553 (8490966286158640743) --> - <skip /> - <!-- no translation found for spoken_emoji_1F554 (7662585417832909280) --> - <skip /> - <!-- no translation found for spoken_emoji_1F555 (5564698204520412009) --> - <skip /> - <!-- no translation found for spoken_emoji_1F556 (7325712194836512205) --> - <skip /> - <!-- no translation found for spoken_emoji_1F557 (4398343183682848693) --> - <skip /> - <!-- no translation found for spoken_emoji_1F558 (3110507820404018172) --> - <skip /> - <!-- no translation found for spoken_emoji_1F559 (2972160366448337839) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55A (5568112876681714834) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55B (6731739890330659276) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55C (7838853679879115890) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55D (3518832144255922544) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55E (3092760695634993002) --> - <skip /> - <!-- no translation found for spoken_emoji_1F55F (2326720311892906763) --> - <skip /> - <!-- no translation found for spoken_emoji_1F560 (5771339179963924448) --> - <skip /> - <!-- no translation found for spoken_emoji_1F561 (3139944777062475382) --> - <skip /> - <!-- no translation found for spoken_emoji_1F562 (8273944611162457084) --> - <skip /> - <!-- no translation found for spoken_emoji_1F563 (8643976903718136299) --> - <skip /> - <!-- no translation found for spoken_emoji_1F564 (3511070239796141638) --> - <skip /> - <!-- no translation found for spoken_emoji_1F565 (4567451985272963088) --> - <skip /> - <!-- no translation found for spoken_emoji_1F566 (2790552288169929810) --> - <skip /> - <!-- no translation found for spoken_emoji_1F567 (9026037362100689337) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FB (9037503671676124015) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FC (1409415995817242150) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FD (2562726956654429582) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FE (1184469756905210580) --> - <skip /> - <!-- no translation found for spoken_emoji_1F5FF (6003594799354942297) --> - <skip /> - <!-- no translation found for spoken_emoji_1F600 (7601109464776835283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F601 (746026523967444503) --> - <skip /> - <!-- no translation found for spoken_emoji_1F602 (8354558091785198246) --> - <skip /> - <!-- no translation found for spoken_emoji_1F603 (3861022912544159823) --> - <skip /> - <!-- no translation found for spoken_emoji_1F604 (5119021072966343531) --> - <skip /> - <!-- no translation found for spoken_emoji_1F605 (6140813923973561735) --> - <skip /> - <!-- no translation found for spoken_emoji_1F606 (3549936813966832799) --> - <skip /> - <!-- no translation found for spoken_emoji_1F607 (2826424078212384817) --> - <skip /> - <!-- no translation found for spoken_emoji_1F608 (7343559595089811640) --> - <skip /> - <!-- no translation found for spoken_emoji_1F609 (5481030187207504405) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60A (5023337769148679767) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60B (3005248217216195694) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60C (349384012958268496) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60D (7921853137164938391) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60E (441718886380605643) --> - <skip /> - <!-- no translation found for spoken_emoji_1F60F (2674453144890180538) --> - <skip /> - <!-- no translation found for spoken_emoji_1F610 (3225675825334102369) --> - <skip /> - <!-- no translation found for spoken_emoji_1F611 (7199179827619679668) --> - <skip /> - <!-- no translation found for spoken_emoji_1F612 (985081329745137998) --> - <skip /> - <!-- no translation found for spoken_emoji_1F613 (5548607684830303562) --> - <skip /> - <!-- no translation found for spoken_emoji_1F614 (3196305665259916390) --> - <skip /> - <!-- no translation found for spoken_emoji_1F615 (3051674239303969101) --> - <skip /> - <!-- no translation found for spoken_emoji_1F616 (8124887056243813089) --> - <skip /> - <!-- no translation found for spoken_emoji_1F617 (7052733625511122870) --> - <skip /> - <!-- no translation found for spoken_emoji_1F618 (408207170572303753) --> - <skip /> - <!-- no translation found for spoken_emoji_1F619 (8645430335143153645) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61A (2882157190974340247) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61B (3765927202787211499) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61C (198943912107589389) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61D (7643546385877816182) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61E (1528732952202098364) --> - <skip /> - <!-- no translation found for spoken_emoji_1F61F (1853664164636082404) --> - <skip /> - <!-- no translation found for spoken_emoji_1F620 (6051942001307375830) --> - <skip /> - <!-- no translation found for spoken_emoji_1F621 (2114711878097257704) --> - <skip /> - <!-- no translation found for spoken_emoji_1F622 (29291014645931822) --> - <skip /> - <!-- no translation found for spoken_emoji_1F623 (7803959833595184773) --> - <skip /> - <!-- no translation found for spoken_emoji_1F624 (8637637647725752799) --> - <skip /> - <!-- no translation found for spoken_emoji_1F625 (6153625183493635030) --> - <skip /> - <!-- no translation found for spoken_emoji_1F626 (6179485689935562950) --> - <skip /> - <!-- no translation found for spoken_emoji_1F627 (8566204052903012809) --> - <skip /> - <!-- no translation found for spoken_emoji_1F628 (8875777401624904224) --> - <skip /> - <!-- no translation found for spoken_emoji_1F629 (1411538490319190118) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62A (4726686726690289969) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62B (3221980473921623613) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62C (4616356691941225182) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62D (4283677508698812232) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62E (726083405284353894) --> - <skip /> - <!-- no translation found for spoken_emoji_1F62F (7746620088234710962) --> - <skip /> - <!-- no translation found for spoken_emoji_1F630 (3298804852155581163) --> - <skip /> - <!-- no translation found for spoken_emoji_1F631 (1603391150954646779) --> - <skip /> - <!-- no translation found for spoken_emoji_1F632 (4846193232203976013) --> - <skip /> - <!-- no translation found for spoken_emoji_1F633 (4023593836629700443) --> - <skip /> - <!-- no translation found for spoken_emoji_1F634 (3155265083246248129) --> - <skip /> - <!-- no translation found for spoken_emoji_1F635 (4616691133452764482) --> - <skip /> - <!-- no translation found for spoken_emoji_1F636 (947000211822375683) --> - <skip /> - <!-- no translation found for spoken_emoji_1F637 (1269551267347165774) --> - <skip /> - <!-- no translation found for spoken_emoji_1F638 (3410766467496872301) --> - <skip /> - <!-- no translation found for spoken_emoji_1F639 (1833417519781022031) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63A (8566294484007152613) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63B (74417995938927571) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63C (6472812005729468870) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63D (1638398369553349509) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63E (6788969063020278986) --> - <skip /> - <!-- no translation found for spoken_emoji_1F63F (1207234562459550185) --> - <skip /> - <!-- no translation found for spoken_emoji_1F640 (6023054549904329638) --> - <skip /> - <!-- no translation found for spoken_emoji_1F645 (5202090629227587076) --> - <skip /> - <!-- no translation found for spoken_emoji_1F646 (6734425134415138134) --> - <skip /> - <!-- no translation found for spoken_emoji_1F647 (1090285518444205483) --> - <skip /> - <!-- no translation found for spoken_emoji_1F648 (8978535230610522356) --> - <skip /> - <!-- no translation found for spoken_emoji_1F649 (8486145279809495102) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64A (1237524974033228660) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64B (4251150782016370475) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F64D (4646485595309482342) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64E (3376579939836656097) --> - <skip /> - <!-- no translation found for spoken_emoji_1F64F (1044439574356230711) --> - <skip /> - <!-- no translation found for spoken_emoji_1F680 (513263736012689059) --> - <skip /> - <!-- no translation found for spoken_emoji_1F681 (9201341783850525339) --> - <skip /> - <!-- no translation found for spoken_emoji_1F682 (8046933583867498698) --> - <skip /> - <!-- no translation found for spoken_emoji_1F683 (8772750354339223092) --> - <skip /> - <!-- no translation found for spoken_emoji_1F684 (346396777356203608) --> - <skip /> - <!-- no translation found for spoken_emoji_1F685 (1237059817190832730) --> - <skip /> - <!-- no translation found for spoken_emoji_1F686 (3525197227223620343) --> - <skip /> - <!-- no translation found for spoken_emoji_1F687 (5110143437960392837) --> - <skip /> - <!-- no translation found for spoken_emoji_1F688 (4702085029871797965) --> - <skip /> - <!-- no translation found for spoken_emoji_1F689 (2375851019798817094) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68A (6368370859718717198) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68B (2920160427117436633) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68C (1061520934758810864) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68D (2890059031360969304) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68E (6234042976027309654) --> - <skip /> - <!-- no translation found for spoken_emoji_1F68F (5871099334672012107) --> - <skip /> - <!-- no translation found for spoken_emoji_1F690 (8080964620200195262) --> - <skip /> - <!-- no translation found for spoken_emoji_1F691 (999173032408730501) --> - <skip /> - <!-- no translation found for spoken_emoji_1F692 (1712863785341849487) --> - <skip /> - <!-- no translation found for spoken_emoji_1F693 (7987109037389768934) --> - <skip /> - <!-- no translation found for spoken_emoji_1F694 (6061658916653884608) --> - <skip /> - <!-- no translation found for spoken_emoji_1F695 (6913445460364247283) --> - <skip /> - <!-- no translation found for spoken_emoji_1F696 (6391604457418285404) --> - <skip /> - <!-- no translation found for spoken_emoji_1F697 (7978399334396733790) --> - <skip /> - <!-- no translation found for spoken_emoji_1F698 (7006050861129732018) --> - <skip /> - <!-- no translation found for spoken_emoji_1F699 (630317052666590607) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69A (4739797891735823577) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F69C (5557395610750818161) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69D (5467164189942951047) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69E (169238196389832234) --> - <skip /> - <!-- no translation found for spoken_emoji_1F69F (7508128757012845102) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A0 (8733056213790160147) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A1 (4666516337749347253) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A2 (4511220588943129583) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A3 (8412962252222205387) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A4 (8867571300266339211) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F6A6 (485575967773793454) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A7 (6411048933816976794) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A8 (6345717218374788364) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6A9 (6586380356807600412) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AA (8954448167261738885) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AB (5313946262888343544) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AC (6946858177965948288) --> - <skip /> + <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> - <!-- no translation found for spoken_emoji_1F6AE (1062469925352817189) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6AF (2286668056123642208) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B0 (179424763882990952) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B1 (5585212805429161877) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B2 (1771885082068421875) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B3 (8033779581263314408) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B4 (1999538449018476947) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B5 (340846352660993117) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B6 (4351024386495098336) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B7 (4564800655866838802) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B8 (3020531906940267349) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6B9 (1207095844125041251) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BA (2346879310071017531) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BB (2370172469642078526) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BC (5558827593563530851) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BD (9213590243049835957) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BE (394016533781742491) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6BF (906336365928291207) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C0 (4592099854378821599) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C1 (2845056048320031158) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C2 (8117262514698011877) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C3 (1176342001834630675) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C4 (1477622834179978886) --> - <skip /> - <!-- no translation found for spoken_emoji_1F6C5 (2495834050856617451) --> - <skip /> + <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-talkback-descriptions.xml b/java/res/values-ne-rNP/strings-talkback-descriptions.xml index d5bcea943..c8e5a7529 100644 --- a/java/res/values-ne-rNP/strings-talkback-descriptions.xml +++ b/java/res/values-ne-rNP/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ne-rNP/strings.xml b/java/res/values-ne-rNP/strings.xml index f467443b3..60321466f 100644 --- a/java/res/values-ne-rNP/strings.xml +++ b/java/res/values-ne-rNP/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-nl/strings-action-keys.xml b/java/res/values-nl/strings-action-keys.xml index c1ce25acf..c9c68bd25 100644 --- a/java/res/values-nl/strings-action-keys.xml +++ b/java/res/values-nl/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-nl/strings-talkback-descriptions.xml index 7d61d5660..a7fe2073d 100644 --- a/java/res/values-nl/strings-talkback-descriptions.xml +++ b/java/res/values-nl/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 342464fc8..a651f7e06 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-pl/strings-action-keys.xml b/java/res/values-pl/strings-action-keys.xml index 2984b98b8..d641cbc9e 100644 --- a/java/res/values-pl/strings-action-keys.xml +++ b/java/res/values-pl/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-pl/strings-talkback-descriptions.xml index da5f46b25..1ec691e46 100644 --- a/java/res/values-pl/strings-talkback-descriptions.xml +++ b/java/res/values-pl/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index c4261c60e..e78b7f267 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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óź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> diff --git a/java/res/values-pt-rPT/strings-action-keys.xml b/java/res/values-pt-rPT/strings-action-keys.xml index 7a7559fea..1b5921f3e 100644 --- a/java/res/values-pt-rPT/strings-action-keys.xml +++ b/java/res/values-pt-rPT/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-pt-rPT/strings-talkback-descriptions.xml index b49b58bc2..854136479 100644 --- a/java/res/values-pt-rPT/strings-talkback-descriptions.xml +++ b/java/res/values-pt-rPT/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 8b75dd0dd..d13fca3ba 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-pt/strings-action-keys.xml b/java/res/values-pt/strings-action-keys.xml index 1d8e760e7..470846b21 100644 --- a/java/res/values-pt/strings-action-keys.xml +++ b/java/res/values-pt/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-pt/strings-emoji-descriptions.xml new file mode 100644 index 000000000..1c6ad71f9 --- /dev/null +++ b/java/res/values-pt/strings-emoji-descriptions.xml @@ -0,0 +1,846 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under 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_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-talkback-descriptions.xml b/java/res/values-pt/strings-talkback-descriptions.xml index b9a70f397..7ad42ad19 100644 --- a/java/res/values-pt/strings-talkback-descriptions.xml +++ b/java/res/values-pt/strings-talkback-descriptions.xml @@ -27,14 +27,10 @@ <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="2382510329910793539">"Código de tecla %d"</string> <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> - <!-- 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 /> + <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> @@ -53,8 +49,7 @@ <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> - <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> - <skip /> + <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> @@ -76,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index afee26d25..f19ce5ed4 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 2ea98cf53..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 /> @@ -134,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 /> @@ -191,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..bee4b12ea 100644 --- a/java/res/values-ro/strings-action-keys.xml +++ b/java/res/values-ro/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-emoji-descriptions.xml b/java/res/values-ro/strings-emoji-descriptions.xml new file mode 100644 index 000000000..a4a1a9527 --- /dev/null +++ b/java/res/values-ro/strings-emoji-descriptions.xml @@ -0,0 +1,846 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under 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_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-talkback-descriptions.xml b/java/res/values-ro/strings-talkback-descriptions.xml index 8a6ceb315..40821758b 100644 --- a/java/res/values-ro/strings-talkback-descriptions.xml +++ b/java/res/values-ro/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index 51d3c5901..5d5330d3b 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-ru/strings-action-keys.xml b/java/res/values-ru/strings-action-keys.xml index d5080ceb5..3edf2285c 100644 --- a/java/res/values-ru/strings-action-keys.xml +++ b/java/res/values-ru/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string> <string name="label_done_key" msgid="7564866296502630852">"Готово"</string> <string name="label_send_key" msgid="482252074224462163">"Отправить"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-ru/strings-talkback-descriptions.xml index b1cdbb20b..09fbb454c 100644 --- a/java/res/values-ru/strings-talkback-descriptions.xml +++ b/java/res/values-ru/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index bef248385..e78874948 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-sk/strings-action-keys.xml b/java/res/values-sk/strings-action-keys.xml index 3586fb140..ffc5be2d6 100644 --- a/java/res/values-sk/strings-action-keys.xml +++ b/java/res/values-sk/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-sk/strings-talkback-descriptions.xml index 9c0a85752..68bd175ae 100644 --- a/java/res/values-sk/strings-talkback-descriptions.xml +++ b/java/res/values-sk/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index 9a3564782..179960f50 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-sl/strings-action-keys.xml b/java/res/values-sl/strings-action-keys.xml index 0235887af..f8b764723 100644 --- a/java/res/values-sl/strings-action-keys.xml +++ b/java/res/values-sl/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-sl/strings-talkback-descriptions.xml index 9cb296c27..ec6289b53 100644 --- a/java/res/values-sl/strings-talkback-descriptions.xml +++ b/java/res/values-sl/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index 2594aaec4..64eedc623 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-sr/strings-action-keys.xml b/java/res/values-sr/strings-action-keys.xml index 1ce0ed7fb..b3d9411c7 100644 --- a/java/res/values-sr/strings-action-keys.xml +++ b/java/res/values-sr/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"Претх"</string> <string name="label_done_key" msgid="7564866296502630852">"Готов"</string> <string name="label_send_key" msgid="482252074224462163">"Шаљи"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-sr/strings-talkback-descriptions.xml index 0f062ab70..f8d1eb43c 100644 --- a/java/res/values-sr/strings-talkback-descriptions.xml +++ b/java/res/values-sr/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 7bd7f67e5..a37d22e7e 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-sv/strings-action-keys.xml b/java/res/values-sv/strings-action-keys.xml index e13860811..053461d07 100644 --- a/java/res/values-sv/strings-action-keys.xml +++ b/java/res/values-sv/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-sv/strings-talkback-descriptions.xml index 062d337b4..cb241c8af 100644 --- a/java/res/values-sv/strings-talkback-descriptions.xml +++ b/java/res/values-sv/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 7092e6876..1cb57dda9 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-sw/strings-action-keys.xml b/java/res/values-sw/strings-action-keys.xml index 7d8822e80..587cbfa6a 100644 --- a/java/res/values-sw/strings-action-keys.xml +++ b/java/res/values-sw/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-sw/strings-talkback-descriptions.xml index 703dc4db7..f03287036 100644 --- a/java/res/values-sw/strings-talkback-descriptions.xml +++ b/java/res/values-sw/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml index 56312899d..361e9f67d 100644 --- a/java/res/values-sw/strings.xml +++ b/java/res/values-sw/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-th/strings-action-keys.xml b/java/res/values-th/strings-action-keys.xml index f23bfbc2a..6cbd491f9 100644 --- a/java/res/values-th/strings-action-keys.xml +++ b/java/res/values-th/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"ก่อน"</string> <string name="label_done_key" msgid="7564866296502630852">"เสร็จ"</string> <string name="label_send_key" msgid="482252074224462163">"ส่ง"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-th/strings-talkback-descriptions.xml index 0a7133020..48b21b72b 100644 --- a/java/res/values-th/strings-talkback-descriptions.xml +++ b/java/res/values-th/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index ece0c4ba9..5bbff3dc8 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-tl/strings-action-keys.xml b/java/res/values-tl/strings-action-keys.xml index a7f4cc78f..ac511d03f 100644 --- a/java/res/values-tl/strings-action-keys.xml +++ b/java/res/values-tl/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-tl/strings-talkback-descriptions.xml index 4c34ad46f..97905ad57 100644 --- a/java/res/values-tl/strings-talkback-descriptions.xml +++ b/java/res/values-tl/strings-talkback-descriptions.xml @@ -27,14 +27,10 @@ <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="2382510329910793539">"Key code %d"</string> <string name="spoken_description_shift" msgid="7209798151676638728">"Shift"</string> - <!-- 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 /> + <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> @@ -53,8 +49,7 @@ <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> - <!-- no translation found for spoken_description_mode_symbol_shift (4305607977537665389) --> - <skip /> + <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> @@ -76,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index ce1207a5f..d1b665c72 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-tr/strings-action-keys.xml b/java/res/values-tr/strings-action-keys.xml index b34c576b6..5592e6c69 100644 --- a/java/res/values-tr/strings-action-keys.xml +++ b/java/res/values-tr/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-tr/strings-talkback-descriptions.xml index 829fe6109..970f5848a 100644 --- a/java/res/values-tr/strings-talkback-descriptions.xml +++ b/java/res/values-tr/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 3584ec5db..adbd67690 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-uk/strings-action-keys.xml b/java/res/values-uk/strings-action-keys.xml index 3e5762b3f..8b71498c1 100644 --- a/java/res/values-uk/strings-action-keys.xml +++ b/java/res/values-uk/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"Назад"</string> <string name="label_done_key" msgid="7564866296502630852">"ОК"</string> <string name="label_send_key" msgid="482252074224462163">"Слати"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-uk/strings-talkback-descriptions.xml index ddb821436..20f164740 100644 --- a/java/res/values-uk/strings-talkback-descriptions.xml +++ b/java/res/values-uk/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index 15a30805e..8ce96561f 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-vi/strings-action-keys.xml b/java/res/values-vi/strings-action-keys.xml index ceb780ed1..16b7c959e 100644 --- a/java/res/values-vi/strings-action-keys.xml +++ b/java/res/values-vi/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-vi/strings-talkback-descriptions.xml index 10a64a7ee..6da8cec09 100644 --- a/java/res/values-vi/strings-talkback-descriptions.xml +++ b/java/res/values-vi/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index 529dcec17..5d4705892 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values-zh-rCN/strings-action-keys.xml b/java/res/values-zh-rCN/strings-action-keys.xml index aacbb5fc7..a3629da2f 100644 --- a/java/res/values-zh-rCN/strings-action-keys.xml +++ b/java/res/values-zh-rCN/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"上个"</string> <string name="label_done_key" msgid="7564866296502630852">"完成"</string> <string name="label_send_key" msgid="482252074224462163">"发送"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-zh-rCN/strings-talkback-descriptions.xml index 3d25cd1da..ee025f689 100644 --- a/java/res/values-zh-rCN/strings-talkback-descriptions.xml +++ b/java/res/values-zh-rCN/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 41fe0bfb6..4f5cddda7 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-zh-rHK/strings-action-keys.xml b/java/res/values-zh-rHK/strings-action-keys.xml index e95251696..4dc5c8450 100644 --- a/java/res/values-zh-rHK/strings-action-keys.xml +++ b/java/res/values-zh-rHK/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"上一步"</string> <string name="label_done_key" msgid="7564866296502630852">"完成"</string> <string name="label_send_key" msgid="482252074224462163">"傳送"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-zh-rHK/strings-talkback-descriptions.xml index baa56e4cd..3484bf33b 100644 --- a/java/res/values-zh-rHK/strings-talkback-descriptions.xml +++ b/java/res/values-zh-rHK/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-zh-rHK/strings.xml b/java/res/values-zh-rHK/strings.xml index 34fa9c037..1d6030e0a 100644 --- a/java/res/values-zh-rHK/strings.xml +++ b/java/res/values-zh-rHK/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-zh-rTW/strings-action-keys.xml b/java/res/values-zh-rTW/strings-action-keys.xml index 00daa5c63..9b8be9426 100644 --- a/java/res/values-zh-rTW/strings-action-keys.xml +++ b/java/res/values-zh-rTW/strings-action-keys.xml @@ -25,6 +25,8 @@ <string name="label_previous_key" msgid="1421141755779895275">"返回"</string> <string name="label_done_key" msgid="7564866296502630852">"完成"</string> <string name="label_send_key" msgid="482252074224462163">"傳送"</string> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-zh-rTW/strings-talkback-descriptions.xml index d8a0cc4e7..4d0352ec2 100644 --- a/java/res/values-zh-rTW/strings-talkback-descriptions.xml +++ b/java/res/values-zh-rTW/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index 9c9f5e052..ae74d055c 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,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-zu/strings-action-keys.xml b/java/res/values-zu/strings-action-keys.xml index 6cd5e8c99..5d60a6cca 100644 --- a/java/res/values-zu/strings-action-keys.xml +++ b/java/res/values-zu/strings-action-keys.xml @@ -25,6 +25,8 @@ <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> + <!-- no translation found for label_search_key (7965186050435796642) --> + <skip /> <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-talkback-descriptions.xml b/java/res/values-zu/strings-talkback-descriptions.xml index 3f7ae7e50..ff7c3c999 100644 --- a/java/res/values-zu/strings-talkback-descriptions.xml +++ b/java/res/values-zu/strings-talkback-descriptions.xml @@ -71,4 +71,12 @@ <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> + <!-- no translation found for spoken_description_upper_case (4904835255229433916) --> + <skip /> + <!-- no translation found for spoken_letter_0049 (4743162182646977944) --> + <skip /> + <!-- no translation found for spoken_letter_0130 (4766619646231612274) --> + <skip /> + <!-- no translation found for spoken_emoji_unknown (5981009928135394306) --> + <skip /> </resources> diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml index c79d81dcc..a0054cbde 100644 --- a/java/res/values-zu/strings.xml +++ b/java/res/values-zu/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">"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> @@ -84,8 +83,6 @@ <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> @@ -118,7 +115,6 @@ <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> diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 307ef1351..775a90c48 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -30,10 +30,6 @@ <attr name="keyPreviewTextViewStyle" format="reference"/> <!-- EmojiPalettesView style --> <attr name="emojiPalettesViewStyle" format="reference" /> - <!-- TabWidget of EmojiPlettesView style --> - <attr name="emojiTabWidgetStyle" format="reference" /> - <!-- EmojiCategoryPageIndicatorView style --> - <attr name="emojiCategoryPageIndicatorViewStyle" format="reference" /> <!-- MoreKeysKeyboard style --> <attr name="moreKeysKeyboardStyle" format="reference" /> <!-- MoreKeysKeyboardView style --> @@ -176,6 +172,11 @@ </declare-styleable> <declare-styleable name="EmojiPalettesView"> + <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" /> @@ -185,10 +186,6 @@ <attr name="iconEmojiCategory6Tab" format="reference" /> </declare-styleable> - <declare-styleable name="EmojiCategoryPageIndicatorView"> - <attr name="emojiCategoryPageIndicatorColor" format="color" /> - </declare-styleable> - <declare-styleable name="SuggestionStripView"> <attr name="suggestionStripOptions" format="integer"> <!-- This should be aligned with SuggestionStripLayoutHelper.AUTO_CORRECT_* and etc. --> diff --git a/java/res/values/donottranslate.xml b/java/res/values/donottranslate.xml index 415dd0b65..83d082f82 100644 --- a/java/res/values/donottranslate.xml +++ b/java/res/values/donottranslate.xml @@ -137,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/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/strings-talkback-descriptions.xml b/java/res/values/strings-talkback-descriptions.xml index 14455d088..d7978b0c8 100644 --- a/java/res/values/strings-talkback-descriptions.xml +++ b/java/res/values/strings-talkback-descriptions.xml @@ -128,11 +128,13 @@ <string name="spoken_descrption_emoji_category_emoticons">Emoticons</string> <!-- Description of an upper case letter of LOWER_LETTER. --> - <string name="spoke_description_upper_case">Capital <xliff:g id="LOWER_LETTER" example="A, E, ligature">%s</xliff:g></string> + <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 emoji code point. --> + <string name="spoken_emoji_unknown">Unknown emoji</string> </resources> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 9f93055e2..2ad7ce592 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> @@ -166,68 +163,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> @@ -238,11 +175,6 @@ <!-- 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> @@ -390,8 +322,6 @@ mobile devices. [CHAR LIMIT=25] --> <!-- 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" 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] --> diff --git a/java/res/values/themes-common.xml b/java/res/values/themes-common.xml index c5d3f55a1..df26fb3b4 100644 --- a/java/res/values/themes-common.xml +++ b/java/res/values/themes-common.xml @@ -110,8 +110,6 @@ <!-- Though {@link EmojiPalettesView} doesn't extend {@link KeyboardView}, some views inside it, for instance delete button, need themed {@link KeyboardView} attributes. --> <style name="EmojiPalettesView" /> - <style name="EmojiTabWidget" /> - <style name="EmojiCategoryPageIndicatorView" /> <style name="MoreKeysKeyboard" /> <style name="MoreKeysKeyboardView" diff --git a/java/res/values/themes-ics.xml b/java/res/values/themes-ics.xml index f7ca5a340..319b4aeed 100644 --- a/java/res/values/themes-ics.xml +++ b/java/res/values/themes-ics.xml @@ -25,8 +25,6 @@ <item name="mainKeyboardViewStyle">@style/MainKeyboardView.ICS</item> <item name="keyPreviewTextViewStyle">@style/KeyPreviewTextView.ICS</item> <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.ICS</item> - <item name="emojiTabWidgetStyle">@style/EmojiTabWidget.ICS</item> - <item name="emojiCategoryPageIndicatorViewStyle">@style/EmojiCategoryPageIndicatorView.ICS</item> <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.ICS</item> <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.ICS</item> <item name="suggestionStripViewStyle">@style/SuggestionStripView.ICS</item> @@ -89,6 +87,11 @@ name="EmojiPalettesView.ICS" parent="MainKeyboardView.ICS" > + <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> @@ -97,15 +100,6 @@ <item name="iconEmojiCategory5Tab">@drawable/ic_emoji_symbols_holo_dark</item> <item name="iconEmojiCategory6Tab">@drawable/ic_emoji_emoticons_holo_dark</item> </style> - <style name="EmojiCategoryPageIndicatorView.ICS"> - <item name="android:background">@color/emoji_tab_page_indicator_background_holo</item> - <item name="emojiCategoryPageIndicatorColor">@color/highlight_color_ics</item> - </style> - <style name="EmojiTabWidget.ICS"> - <item name="android:background">@drawable/emoji_category_tab_selected_ics</item> - <item name="android:tabStripLeft">@drawable/emoji_category_tab_unselected_holo_dark</item> - <item name="android:tabStripRight">@drawable/emoji_category_tab_unselected_holo_dark</item> - </style> <style name="MoreKeysKeyboard.ICS" parent="Keyboard.ICS" diff --git a/java/res/values/themes-klp.xml b/java/res/values/themes-klp.xml index 96d0478ba..208723dd3 100644 --- a/java/res/values/themes-klp.xml +++ b/java/res/values/themes-klp.xml @@ -25,8 +25,6 @@ <item name="mainKeyboardViewStyle">@style/MainKeyboardView.KLP</item> <item name="keyPreviewTextViewStyle">@style/KeyPreviewTextView.KLP</item> <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.KLP</item> - <item name="emojiTabWidgetStyle">@style/EmojiTabWidget.KLP</item> - <item name="emojiCategoryPageIndicatorViewStyle">@style/EmojiCategoryPageIndicatorView.KLP</item> <item name="moreKeysKeyboardStyle">@style/MoreKeysKeyboard.KLP</item> <item name="moreKeysKeyboardViewStyle">@style/MoreKeysKeyboardView.KLP</item> <item name="suggestionStripViewStyle">@style/SuggestionStripView.KLP</item> @@ -89,6 +87,11 @@ name="EmojiPalettesView.KLP" parent="MainKeyboardView.KLP" > + <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> @@ -97,15 +100,6 @@ <item name="iconEmojiCategory5Tab">@drawable/ic_emoji_symbols_holo_dark</item> <item name="iconEmojiCategory6Tab">@drawable/ic_emoji_emoticons_holo_dark</item> </style> - <style name="EmojiCategoryPageIndicatorView.KLP"> - <item name="android:background">@color/emoji_tab_page_indicator_background_holo</item> - <item name="emojiCategoryPageIndicatorColor">@color/highlight_color_klp</item> - </style> - <style name="EmojiTabWidget.KLP"> - <item name="android:background">@drawable/emoji_category_tab_selected_klp</item> - <item name="android:tabStripLeft">@drawable/emoji_category_tab_unselected_holo_dark</item> - <item name="android:tabStripRight">@drawable/emoji_category_tab_unselected_holo_dark</item> - </style> <style name="MoreKeysKeyboard.KLP" parent="Keyboard.KLP" diff --git a/java/res/values/themes-lxx-dark.xml b/java/res/values/themes-lxx-dark.xml index 98c045def..e9a295c67 100644 --- a/java/res/values/themes-lxx-dark.xml +++ b/java/res/values/themes-lxx-dark.xml @@ -25,8 +25,6 @@ <item name="mainKeyboardViewStyle">@style/MainKeyboardView.LXX_Dark</item> <item name="keyPreviewTextViewStyle">@style/KeyPreviewTextView.LXX_Dark</item> <item name="emojiPalettesViewStyle">@style/EmojiPalettesView.LXX_Dark</item> - <item name="emojiTabWidgetStyle">@style/EmojiTabWidget.LXX_Dark</item> - <item name="emojiCategoryPageIndicatorViewStyle">@style/EmojiCategoryPageIndicatorView.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> @@ -90,6 +88,9 @@ 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> @@ -99,15 +100,6 @@ <item name="iconEmojiCategory5Tab">@drawable/ic_emoji_symbols_holo_dark</item> <item name="iconEmojiCategory6Tab">@drawable/ic_emoji_emoticons_holo_dark</item> </style> - <style name="EmojiCategoryPageIndicatorView.LXX_Dark"> - <item name="android:background">@color/emoji_tab_page_indicator_background_lxx_dark</item> - <item name="emojiCategoryPageIndicatorColor">@color/highlight_color_lxx_dark</item> - </style> - <style name="EmojiTabWidget.LXX_Dark"> - <item name="android:background">@drawable/emoji_category_tab_selected_lxx_dark</item> - <item name="android:tabStripLeft">@drawable/emoji_category_tab_unselected_lxx_dark</item> - <item name="android:tabStripRight">@drawable/emoji_category_tab_unselected_lxx_dark</item> - </style> <style name="MoreKeysKeyboard.LXX_Dark" parent="Keyboard.LXX_Dark" diff --git a/java/res/values/urls.xml b/java/res/values/urls.xml deleted file mode 100644 index a8e9ad7d3..000000000 --- a/java/res/values/urls.xml +++ /dev/null @@ -1,22 +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> - <string name="research_logger_upload_url" translatable="false"></string> -</resources> diff --git a/java/res/xml-sw600dp/key_styles_enter.xml b/java/res/xml-sw600dp/key_styles_enter.xml index 55f00ef7d..740bf3543 100644 --- a/java/res/xml-sw600dp/key_styles_enter.xml +++ b/java/res/xml-sw600dp/key_styles_enter.xml @@ -131,7 +131,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_go_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -150,7 +149,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_next_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -169,7 +167,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_previous_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -188,7 +185,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_done_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -207,11 +203,11 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_send_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionSearch" + latin:isIconDefined="search_key" > <key-style latin:styleName="enterKeyStyle" @@ -220,13 +216,20 @@ 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:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <!-- imeAction is either actionNone or actionUnspecified. --> diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml index 1a60bcce8..50530e1bf 100644 --- a/java/res/xml/key_styles_enter.xml +++ b/java/res/xml/key_styles_enter.xml @@ -298,7 +298,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_go_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -317,7 +316,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_next_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -336,7 +334,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_previous_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -355,7 +352,6 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_done_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case @@ -374,11 +370,11 @@ <key-style latin:styleName="enterKeyStyle" latin:keySpec="!text/label_send_key|!code/key_enter" - latin:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <case latin:imeAction="actionSearch" + latin:isIconDefined="search_key" > <key-style latin:styleName="enterKeyStyle" @@ -387,13 +383,20 @@ 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:backgroundType="action" latin:parentStyle="defaultEnterKeyStyle" /> </case> <!-- imeAction is either actionNone or actionUnspecified. --> diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index 61ebb6992..a62986228 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -153,6 +153,7 @@ android:defaultValue="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:persistent="true" diff --git a/java/res/xml/prefs_for_debug.xml b/java/res/xml/prefs_for_debug.xml index c333b0751..1a7fe71fe 100644 --- a/java/res/xml/prefs_for_debug.xml +++ b/java/res/xml/prefs_for_debug.xml @@ -21,12 +21,6 @@ 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" /> - <CheckBoxPreference android:key="debug_mode" android:title="@string/prefs_debug_mode" android:persistent="true" @@ -37,11 +31,6 @@ 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" /> - <CheckBoxPreference android:key="pref_sliding_key_input_preview" android:title="@string/sliding_key_input_preview" android:summary="@string/sliding_key_input_preview_summary" diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java index d50dd3ee6..27896fd11 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibilityUtils.java @@ -114,7 +114,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 diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java index 2c87fc1e9..58672ace7 100644 --- a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java +++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java @@ -285,15 +285,14 @@ public final class KeyCodeDescriptionMapper { if (index >= 0) { return context.getString(mKeyCodeMap.valueAt(index)); } - final String accentedLetter = getSpokenAccentedLetterDescriptionId(context, code); + final String accentedLetter = getSpokenAccentedLetterDescription(context, code); if (accentedLetter != null) { return accentedLetter; } - // Here, <code>code</code> may be a base letter. - final int spokenEmojiId = getSpokenDescriptionId( - context, code, SPOKEN_EMOJI_RESOURCE_NAME_FORMAT); - if (spokenEmojiId != 0) { - return context.getString(spokenEmojiId); + // Here, <code>code</code> may be a base (non-accented) letter. + final String emojiDescription = getSpokenEmojiDescription(context, code); + if (emojiDescription != null) { + return emojiDescription; } if (isDefinedNonCtrl) { return Character.toString((char) code); @@ -304,7 +303,7 @@ public final class KeyCodeDescriptionMapper { return context.getString(R.string.spoken_description_unknown, code); } - private String getSpokenAccentedLetterDescriptionId(final Context context, final int code) { + 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); @@ -314,7 +313,17 @@ public final class KeyCodeDescriptionMapper { return null; } final String spokenText = context.getString(resId); - return isUpperCase ? context.getString(R.string.spoke_description_upper_case, spokenText) + return isUpperCase ? context.getString(R.string.spoken_description_upper_case, spokenText) + : spokenText; + } + + 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); + return TextUtils.isEmpty(spokenText) ? context.getString(R.string.spoken_emoji_unknown) : spokenText; } diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java index eed40f4a9..7cae9861c 100644 --- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java +++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityDelegate.java @@ -16,11 +16,12 @@ package com.android.inputmethod.accessibility; -import android.os.SystemClock; +import android.content.Context; 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.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewParent; @@ -30,6 +31,7 @@ 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.keyboard.PointerTracker; public class KeyboardAccessibilityDelegate<KV extends KeyboardView> extends AccessibilityDelegateCompat { @@ -37,7 +39,7 @@ public class KeyboardAccessibilityDelegate<KV extends KeyboardView> protected final KeyDetector mKeyDetector; private Keyboard mKeyboard; private KeyboardAccessibilityNodeProvider mAccessibilityNodeProvider; - private Key mLastHoverKey; + private Key mCurrentHoverKey; public KeyboardAccessibilityDelegate(final KV keyboardView, final KeyDetector keyDetector) { super(); @@ -65,10 +67,31 @@ public class KeyboardAccessibilityDelegate<KV extends KeyboardView> mKeyboard = keyboard; } - protected Keyboard getKeyboard() { + protected final Keyboard getKeyboard() { return mKeyboard; } + protected final void setCurrentHoverKey(final Key key) { + mCurrentHoverKey = key; + } + + protected final Key getCurrentHoverKey() { + return mCurrentHoverKey; + } + + /** + * 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. * @@ -114,119 +137,157 @@ public class KeyboardAccessibilityDelegate<KV extends KeyboardView> } /** + * 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 getHoverKey(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 + * @return {@code true} if the event is handled. */ - public boolean dispatchHoverEvent(final MotionEvent event) { - final int x = (int) event.getX(); - final int y = (int) event.getY(); - final Key previousKey = mLastHoverKey; - final Key key = mKeyDetector.detectHitKey(x, y); - 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) { - final long downTime = simulateKeyPress(key); - simulateKeyRelease(key, downTime); - } - //$FALL-THROUGH$ + public boolean onHoverEvent(final MotionEvent event) { + switch (event.getActionMasked()) { case MotionEvent.ACTION_HOVER_ENTER: - return onHoverKey(key, event); + onHoverEnter(event); + break; case MotionEvent.ACTION_HOVER_MOVE: - if (key != previousKey) { - return onTransitionKey(key, previousKey, event); + 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 = getHoverKey(event); + if (key != null) { + onHoverEnterKey(key); + } + setCurrentHoverKey(key); + } + + /** + * Process {@link MotionEvent#ACTION_HOVER_MOVE} event. + * + * @param event A hover move event. + */ + protected void onHoverMove(final MotionEvent event) { + final Key previousKey = getCurrentHoverKey(); + final Key key = getHoverKey(event); + if (key != previousKey) { + if (previousKey != null) { + onHoverExitKey(previousKey); } - return onHoverKey(key, event); + if (key != null) { + onHoverEnterKey(key); + } + } + if (key != null) { + onHoverMoveKey(key); } - return false; + setCurrentHoverKey(key); } /** - * Simulates a key press by injecting touch an event into the keyboard view. - * This avoids the complexity of trackers and listeners within the keyboard. + * Process {@link MotionEvent#ACTION_HOVER_EXIT} event. * - * @param key The key to press. + * @param event A hover exit event. */ - private long 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); - mKeyboardView.onTouchEvent(downEvent); - downEvent.recycle(); - return downTime; + protected void onHoverExit(final MotionEvent event) { + final Key key = getHoverKey(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) { + simulateTouchEvent(MotionEvent.ACTION_DOWN, event); + simulateTouchEvent(MotionEvent.ACTION_UP, event); + onHoverExitKey(key); + } + setCurrentHoverKey(null); } /** - * Simulates a key release by injecting touch an event into the keyboard view. - * This avoids the complexity of trackers and listeners within the keyboard. + * Simulating a touch event by injecting a synthesized touch event into {@link PointerTracker}. * - * @param key The key to release. + * @param touchAction The action of the synthesizing touch event. + * @param hoverEvent The base hover event from that the touch event is synthesized. */ - private void simulateKeyRelease(final Key key, final long downTime) { - final int x = key.getHitBox().centerX(); - final int y = key.getHitBox().centerY(); - final MotionEvent upEvent = MotionEvent.obtain( - downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0); - mKeyboardView.onTouchEvent(upEvent); - upEvent.recycle(); + protected void simulateTouchEvent(final int touchAction, final MotionEvent hoverEvent) { + final MotionEvent touchEvent = synthesizeTouchEvent(touchAction, hoverEvent); + final int actionIndex = touchEvent.getActionIndex(); + final int pointerId = touchEvent.getPointerId(actionIndex); + final PointerTracker tracker = PointerTracker.getPointerTracker(pointerId); + tracker.processMotionEvent(touchEvent, mKeyDetector); + touchEvent.recycle(); } /** - * 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. + * Synthesize a touch event from a hover event. * - * @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. + * @param touchAction The action of the synthesizing touch event. + * @param event The base hover event from that the touch event is synthesized. + * @return The synthesized touch event of <code>touchAction</code> that has pointer information + * of <code>event</code>. */ - private boolean onTransitionKey(final Key currentKey, final Key previousKey, + protected static MotionEvent synthesizeTouchEvent(final int touchAction, 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; + final long downTime = event.getDownTime(); + final long eventTime = event.getEventTime(); + final int actionIndex = event.getActionIndex(); + final float x = event.getX(actionIndex); + final float y = event.getY(actionIndex); + final int pointerId = event.getPointerId(actionIndex); + return MotionEvent.obtain(downTime, eventTime, touchAction, x, y, pointerId); } /** - * Handles a hover event on a key. If {@link Key} extended View, this would be analogous to - * calling View.onHoverEvent(MotionEvent). + * Handles a hover enter event on a key. * * @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; - } + protected void onHoverEnterKey(final Key key) { + key.onPressed(); + mKeyboardView.invalidateKey(key); final KeyboardAccessibilityNodeProvider provider = getAccessibilityNodeProvider(); + provider.sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_ENTER); + provider.performActionForKey(key, AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS); + } - 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; + /** + * Handles a hover move event on a key. + * + * @param key The currently hovered key. + */ + protected void onHoverMoveKey(final Key key) { } + + /** + * Handles a hover exit event on a key. + * + * @param key The currently hovered key. + */ + protected void onHoverExitKey(final Key key) { + key.onReleased(); + mKeyboardView.invalidateKey(key); + final KeyboardAccessibilityNodeProvider provider = getAccessibilityNodeProvider(); + provider.sendAccessibilityEventForKey(key, AccessibilityEventCompat.TYPE_VIEW_HOVER_EXIT); } } diff --git a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java index cddd1c7ed..a6997e2f9 100644 --- a/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java +++ b/java/src/com/android/inputmethod/accessibility/KeyboardAccessibilityNodeProvider.java @@ -134,7 +134,7 @@ public final class KeyboardAccessibilityNodeProvider extends AccessibilityNodePr 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; } @@ -229,7 +229,7 @@ public final class KeyboardAccessibilityNodeProvider extends AccessibilityNodePr if (key == null) { return false; } - return performActionForKey(key, action, arguments); + return performActionForKey(key, action); } /** @@ -237,25 +237,16 @@ public final class KeyboardAccessibilityNodeProvider extends AccessibilityNodePr * * @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 = getVirtualViewIdOf(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); diff --git a/java/src/com/android/inputmethod/accessibility/MainKeyboardAccessibilityDelegate.java b/java/src/com/android/inputmethod/accessibility/MainKeyboardAccessibilityDelegate.java index c114551c8..ec6bb0156 100644 --- a/java/src/com/android/inputmethod/accessibility/MainKeyboardAccessibilityDelegate.java +++ b/java/src/com/android/inputmethod/accessibility/MainKeyboardAccessibilityDelegate.java @@ -17,13 +17,8 @@ package com.android.inputmethod.accessibility; import android.content.Context; -import android.os.SystemClock; -import android.support.v4.view.accessibility.AccessibilityEventCompat; -import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; 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; @@ -168,17 +163,13 @@ public final class MainKeyboardAccessibilityDelegate default: return; } - final String text = mKeyboardView.getContext().getString(resId); - sendWindowStateChanged(text); + sendWindowStateChanged(resId); } /** * Announces that the keyboard has been hidden. */ private void announceKeyboardHidden() { - final Context context = mKeyboardView.getContext(); - final String text = context.getString(R.string.announce_keyboard_hidden); - - sendWindowStateChanged(text); + sendWindowStateChanged(R.string.announce_keyboard_hidden); } } diff --git a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java index 60f7e2def..4d51821f2 100644 --- a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java +++ b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java @@ -27,7 +27,6 @@ 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; @@ -73,13 +72,13 @@ public final class SuggestionSpanUtils { return 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.mKind == SuggestedWordInfo.KIND_PREDICTION) { + if (info.isKindOf(SuggestedWordInfo.KIND_PREDICTION)) { continue; } final String word = suggestedWords.getWord(i); diff --git a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java index dec739d39..767cc423d 100644 --- a/java/src/com/android/inputmethod/compat/ViewCompatUtils.java +++ b/java/src/com/android/inputmethod/compat/ViewCompatUtils.java @@ -24,23 +24,13 @@ import java.lang.reflect.Method; // 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. @@ -61,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 3f69cedee..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; @@ -600,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/DictionaryDownloadProgressBar.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryDownloadProgressBar.java index 2623eff56..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; @@ -119,7 +118,6 @@ public class DictionaryDownloadProgressBar extends ProgressBar { try { final UpdateHelper updateHelper = new UpdateHelper(); final Query query = new Query().setFilterById(mId); - int lastProgress = 0; setIndeterminate(true); while (!isInterrupted()) { final Cursor cursor = mDownloadManagerWrapper.query(query); 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 c35995b24..f5bd84c8c 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java @@ -357,7 +357,7 @@ public final class DictionaryProvider extends ContentProvider { return Collections.<WordListInfo>emptyList(); } try { - final HashMap<String, WordListInfo> dicts = new HashMap<String, WordListInfo>(); + 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 = diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java index dae2f22a4..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,19 +280,18 @@ 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; } try { if (!cursor.moveToFirst()) { - final ArrayList<Preference> result = new ArrayList<Preference>(); + 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<String, WordListPreference>(); + 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); 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/MetadataDbHelper.java b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java index 668eb925b..17dd781d5 100644 --- a/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java +++ b/java/src/com/android/inputmethod/dictionarypack/MetadataDbHelper.java @@ -47,7 +47,7 @@ public class MetadataDbHelper extends SQLiteOpenHelper { // used to identify the versions for upgrades. This should never change going forward. private static final int METADATA_DATABASE_VERSION_WITH_CLIENTID = 6; // The current database version. - private static final int CURRENT_METADATA_DATABASE_VERSION = 8; + private static final int CURRENT_METADATA_DATABASE_VERSION = 9; private final static long NOT_A_DOWNLOAD_ID = -1; @@ -160,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); @@ -639,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 { @@ -923,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 63e419871..d66b69050 100644 --- a/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java +++ b/java/src/com/android/inputmethod/dictionarypack/MetadataHandler.java @@ -43,7 +43,7 @@ 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>(); + 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); diff --git a/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java b/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java index a88173e8e..52290cadc 100644 --- a/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java +++ b/java/src/com/android/inputmethod/dictionarypack/MetadataParser.java @@ -52,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(); @@ -100,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 dcff490db..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 { @@ -557,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); } /** @@ -740,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/event/CombinerChain.java b/java/src/com/android/inputmethod/event/CombinerChain.java index 9e7f04d4f..61bc11b39 100644 --- a/java/src/com/android/inputmethod/event/CombinerChain.java +++ b/java/src/com/android/inputmethod/event/CombinerChain.java @@ -20,7 +20,6 @@ import android.text.SpannableStringBuilder; import android.text.TextUtils; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.ArrayList; import java.util.HashMap; @@ -44,8 +43,8 @@ public class CombinerChain { private SpannableStringBuilder mStateFeedback; private final ArrayList<Combiner> mCombiners; - private static final HashMap<String, Class> IMPLEMENTED_COMBINERS - = new HashMap<String, Class>(); + private static final HashMap<String, Class<? extends Combiner>> IMPLEMENTED_COMBINERS = + new HashMap<>(); static { IMPLEMENTED_COMBINERS.put("MyanmarReordering", MyanmarReordering.class); } @@ -63,7 +62,7 @@ public class CombinerChain { * @param combinerList A list of combiners to be applied in order. */ public CombinerChain(final String initialText, final Combiner... combinerList) { - mCombiners = CollectionUtils.newArrayList(); + mCombiners = new ArrayList<>(); // The dead key combiner is always active, and always first mCombiners.add(new DeadKeyCombiner()); for (final Combiner combiner : combinerList) { @@ -87,7 +86,7 @@ public class CombinerChain { * @param newEvent the new event to process */ public void processEvent(final ArrayList<Event> previousEvents, final Event newEvent) { - final ArrayList<Event> modifiablePreviousEvents = new ArrayList<Event>(previousEvents); + 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 @@ -136,12 +135,13 @@ public class CombinerChain { final Combiner[] combiners = new Combiner[combinerDescriptors.length]; int i = 0; for (final String combinerDescriptor : combinerDescriptors) { - final Class combinerClass = IMPLEMENTED_COMBINERS.get(combinerDescriptor); + final Class<? extends Combiner> combinerClass = + IMPLEMENTED_COMBINERS.get(combinerDescriptor); if (null == combinerClass) { throw new RuntimeException("Unknown combiner descriptor: " + combinerDescriptor); } try { - combiners[i++] = (Combiner)combinerClass.newInstance(); + combiners[i++] = combinerClass.newInstance(); } catch (InstantiationException e) { throw new RuntimeException("Unable to instantiate combiner: " + combinerDescriptor, e); diff --git a/java/src/com/android/inputmethod/event/MyanmarReordering.java b/java/src/com/android/inputmethod/event/MyanmarReordering.java index da0228bd2..32919932d 100644 --- a/java/src/com/android/inputmethod/event/MyanmarReordering.java +++ b/java/src/com/android/inputmethod/event/MyanmarReordering.java @@ -17,7 +17,6 @@ package com.android.inputmethod.event; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.ArrayList; import java.util.Arrays; @@ -32,7 +31,7 @@ public class MyanmarReordering implements Combiner { // U+200B ZERO WIDTH SPACE private final static int ZERO_WIDTH_NON_JOINER = 0x200B; // should be 0x200C - private final ArrayList<Event> mCurrentEvents = CollectionUtils.newArrayList(); + private final ArrayList<Event> mCurrentEvents = new ArrayList<>(); // List of consonants : // U+1000 MYANMAR LETTER KA diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java index f646a03c2..85dfea4e7 100644 --- a/java/src/com/android/inputmethod/keyboard/Keyboard.java +++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java @@ -22,9 +22,9 @@ 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; @@ -83,7 +83,7 @@ public class Keyboard { 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; @@ -103,8 +103,7 @@ public class Keyboard { mTopPadding = params.mTopPadding; mVerticalGap = params.mVerticalGap; - mSortedKeys = Collections.unmodifiableList( - CollectionUtils.newArrayList(params.mSortedKeys)); + mSortedKeys = Collections.unmodifiableList(new ArrayList<>(params.mSortedKeys)); mShiftKeys = Collections.unmodifiableList(params.mShiftKeys); mAltCodeKeysWhileTyping = Collections.unmodifiableList(params.mAltCodeKeysWhileTyping); mIconsSet = params.mIconsSet; @@ -159,7 +158,7 @@ public class Keyboard { /** * 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 Spacer} object as well. + * 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() { diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java index cde5091c4..aa646994c 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java @@ -41,7 +41,6 @@ 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.SubtypeLocaleUtils; import com.android.inputmethod.latin.utils.XmlParseUtils; @@ -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") @@ -117,7 +116,7 @@ public final class KeyboardLayoutSet { int mKeyboardHeight; // 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) { diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 61d51d1c9..ef5fabb41 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -33,7 +33,6 @@ 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; @@ -127,7 +126,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { 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; } } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java index 1f14aa2e3..60d9a054d 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardTheme.java @@ -81,20 +81,6 @@ public final class KeyboardTheme { return mThemeId; } - // TODO: This method should be removed when {@link LatinImeLogger} is removed. - public int getCompatibleThemeIdForLogging() { - switch (mThemeId) { - case THEME_ID_ICS: - return 5; - case THEME_ID_KLP: - return 9; - case THEME_ID_LXX_DARK: - return 10; - default: // Invalid theme - return -1; - } - } - private static KeyboardTheme searchKeyboardThemeById(final int themeId) { // TODO: This search algorithm isn't optimal if there are many themes. for (final KeyboardTheme theme : KEYBOARD_THEMES) { diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index edfc5fded..c4ca1c495 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -35,12 +35,8 @@ 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; @@ -110,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 */ @@ -188,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); @@ -318,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; } @@ -363,9 +351,6 @@ public class KeyboardView extends View { } 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); } @@ -377,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; @@ -462,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. @@ -507,12 +482,6 @@ public class KeyboardView extends View { paint.setTextAlign(Align.CENTER); } canvas.drawText(hintLabel, 0, hintLabel.length(), hintX, hintY + adjustmentY, paint); - - if (LatinImeLogger.sVISUALDEBUG) { - final Paint line = new Paint(); - drawHorizontalLine(canvas, (int)hintY, keyWidth, 0xc0808000, line); - drawVerticalLine(canvas, (int)hintX, keyHeight, 0xc0808000, line); - } } // Draw key icon. @@ -524,26 +493,17 @@ public class KeyboardView extends View { iconWidth = Math.min(icon.getIntrinsicWidth(), keyWidth); } final int iconHeight = icon.getIntrinsicHeight(); - final int iconX, alignX; 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) { @@ -565,12 +525,6 @@ public class KeyboardView extends View { - 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, @@ -581,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); diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 86036ccc1..95258ccdc 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -52,17 +52,12 @@ import com.android.inputmethod.keyboard.internal.NonDistinctMultitouchHelper; 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.SpacebarLanguageUtils; import com.android.inputmethod.latin.utils.TypefaceUtils; -import com.android.inputmethod.latin.utils.UsabilityStudyLogUtils; -import com.android.inputmethod.research.ResearchLogger; import java.util.WeakHashMap; @@ -150,8 +145,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack 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 @@ -389,10 +383,6 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack mSpaceKey = keyboard.getKey(Constants.CODE_SPACE); final int keyHeight = keyboard.mMostCommonKeyHeight - keyboard.mVerticalGap; mLanguageOnSpacebarTextSize = keyHeight * mLanguageOnSpacebarTextRatio; - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - final int orientation = getContext().getResources().getConfiguration().orientation; - ResearchLogger.mainKeyboardView_setKeyboard(keyboard, orientation); - } mAccessibilityDelegate.setKeyboard(keyboard); } @@ -554,24 +544,12 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack protected void onAttachedToWindow() { super.onAttachedToWindow(); installPreviewPlacerView(); - // 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); - } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); mDrawingPreviewPlacerView.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(); - } } private MoreKeysPanel onCreateMoreKeysPanel(final Key key, final Context context) { @@ -607,9 +585,6 @@ 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; @@ -722,14 +697,6 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack } 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); @@ -765,19 +732,14 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack } /** - * 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()) { - // Reflection doesn't support calling superclass methods. - return false; + public boolean onHoverEvent(final MotionEvent event) { + if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { + return mAccessibilityDelegate.onHoverEvent(event); } - return mAccessibilityDelegate.dispatchHoverEvent(event); + return super.onHoverEvent(event); } public void updateShortcutKey(final boolean available) { diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 4777166ea..f80761132 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -35,12 +35,9 @@ 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; @@ -144,7 +141,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element, // TODO: Device specific parameter would be better for device specific hack? private static final float PHANTOM_SUDDEN_MOVE_THRESHOLD = 0.25f; // in keyWidth - 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; @@ -336,10 +333,6 @@ 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; } @@ -374,10 +367,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, withSliding ? " sliding" : "", ignoreModifierKey ? " ignoreModifier" : "", key.isEnabled() ? "": " disabled")); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.pointerTracker_callListenerOnRelease(key, primaryCode, withSliding, - ignoreModifierKey); - } if (ignoreModifierKey) { return; } @@ -397,9 +386,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element, if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onCancelInput", mPointerId)); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.pointerTracker_callListenerOnCancelInput(); - } sListener.onCancelInput(); } @@ -703,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; } @@ -877,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); } diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java index c89bda40e..c19cd671a 100644 --- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java +++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java @@ -22,7 +22,6 @@ import android.util.Log; import com.android.inputmethod.keyboard.internal.TouchPositionCorrection; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.JniUtils; import java.util.ArrayList; @@ -55,6 +54,7 @@ public class ProximityInfo { 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 List<Key> sortedKeys, @@ -360,7 +360,7 @@ y |---+---+---+---+-v-+-|-+---+---+---+---+---| | thresholdBase and get for (int i = 0; i < gridSize; ++i) { final int indexStart = i * keyCount; final int indexEnd = indexStart + neighborCountPerCell[i]; - final ArrayList<Key> neighbors = CollectionUtils.newArrayList(indexEnd - indexStart); + final ArrayList<Key> neighbors = new ArrayList<>(indexEnd - indexStart); for (int index = indexStart; index < indexEnd; index++) { neighbors.add(neighborsFlatBuffer[index]); } diff --git a/java/src/com/android/inputmethod/keyboard/emoji/DynamicGridKeyboard.java b/java/src/com/android/inputmethod/keyboard/emoji/DynamicGridKeyboard.java index c7a9025c0..daeb1f928 100644 --- a/java/src/com/android/inputmethod/keyboard/emoji/DynamicGridKeyboard.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/DynamicGridKeyboard.java @@ -23,7 +23,6 @@ import android.util.Log; 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.JsonUtils; import java.util.ArrayDeque; @@ -47,8 +46,8 @@ final 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 List<Key> mCachedGridKeys; @@ -131,7 +130,7 @@ final class DynamicGridKeyboard extends Keyboard { } 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()); diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java index 859099110..512d4615d 100644 --- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategory.java @@ -31,7 +31,6 @@ 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 com.android.inputmethod.latin.utils.CollectionUtils; import java.util.ArrayList; import java.util.Collections; @@ -101,12 +100,11 @@ final class EmojiCategory { private final Resources mRes; private final int mMaxPageKeyCount; private final KeyboardLayoutSet mLayoutSet; - private final HashMap<String, Integer> mCategoryNameToIdMap = CollectionUtils.newHashMap(); + private final HashMap<String, Integer> mCategoryNameToIdMap = new HashMap<>(); private final int[] mCategoryTabIconId = new int[sCategoryName.length]; - private final ArrayList<CategoryProperties> mShownCategories = - CollectionUtils.newArrayList(); - private final ConcurrentHashMap<Long, DynamicGridKeyboard> - mCategoryKeyboardMap = new ConcurrentHashMap<Long, DynamicGridKeyboard>(); + 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; @@ -257,7 +255,7 @@ final class EmojiCategory { final int temp = sum; sum += properties.mPageCount; if (sum > position) { - return new Pair<Integer, Integer>(properties.mCategoryId, position - temp); + return new Pair<>(properties.mCategoryId, position - temp); } } return null; @@ -343,7 +341,7 @@ final class EmojiCategory { }; private static Key[][] sortKeysIntoPages(final List<Key> inKeys, final int maxPageCount) { - final ArrayList<Key> keys = CollectionUtils.newArrayList(inKeys); + 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]; diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java index a6b089169..43d62c71a 100644 --- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java @@ -17,14 +17,11 @@ package com.android.inputmethod.keyboard.emoji; import android.content.Context; -import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; -import com.android.inputmethod.latin.R; - public final class EmojiCategoryPageIndicatorView extends View { private static final float BOTTOM_MARGIN_RATIO = 1.0f; private final Paint mPaint = new Paint(); @@ -33,19 +30,17 @@ public final class EmojiCategoryPageIndicatorView extends View { private float mOffset = 0.0f; public EmojiCategoryPageIndicatorView(final Context context, final AttributeSet attrs) { - this(context, attrs, R.attr.emojiCategoryPageIndicatorViewStyle); + this(context, attrs, 0); } public EmojiCategoryPageIndicatorView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); - final TypedArray indicatorViewAttr = context.obtainStyledAttributes(attrs, - R.styleable.EmojiCategoryPageIndicatorView, defStyle, - R.style.EmojiCategoryPageIndicatorView); - final int indicatorColor = indicatorViewAttr.getColor( - R.styleable.EmojiCategoryPageIndicatorView_emojiCategoryPageIndicatorColor, 0); - indicatorViewAttr.recycle(); - mPaint.setColor(indicatorColor); + } + + public void setColors(final int foregroundColor, final int backgroundColor) { + mPaint.setColor(foregroundColor); + setBackgroundColor(backgroundColor); } public void setCategoryPageId(final int size, final int id, final float offset) { diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java index 48efa17ad..0166802a4 100644 --- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java @@ -83,13 +83,15 @@ final class EmojiPageKeyboardView extends KeyboardView implements mKeyDetector.setKeyboard(keyboard, 0 /* correctionX */, 0 /* correctionY */); } + /** + * {@inheritDoc} + */ @Override - public boolean dispatchHoverEvent(final MotionEvent event) { - if (!AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { - // Reflection doesn't support calling superclass methods. - return false; + public boolean onHoverEvent(final MotionEvent event) { + if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { + return mAccessibilityDelegate.onHoverEvent(event); } - return mAccessibilityDelegate.dispatchHoverEvent(event); + return super.onHoverEvent(event); } /** @@ -102,7 +104,7 @@ final class EmojiPageKeyboardView extends KeyboardView implements } final Key key = getKey(e); if (key != null && key != mCurrentKey) { - releaseCurrentKey(); + releaseCurrentKey(false /* withKeyRegistering */); } return true; } @@ -119,7 +121,7 @@ final class EmojiPageKeyboardView extends KeyboardView implements return mKeyDetector.detectHitKey(x, y); } - public void releaseCurrentKey() { + public void releaseCurrentKey(final boolean withKeyRegistering) { mHandler.removeCallbacks(mPendingKeyDown); mPendingKeyDown = null; final Key currentKey = mCurrentKey; @@ -128,13 +130,16 @@ final class EmojiPageKeyboardView extends KeyboardView implements } currentKey.onReleased(); invalidateKey(currentKey); + if (withKeyRegistering) { + mListener.onReleaseKey(currentKey); + } mCurrentKey = null; } @Override public boolean onDown(final MotionEvent e) { final Key key = getKey(e); - releaseCurrentKey(); + releaseCurrentKey(false /* withKeyRegistering */); mCurrentKey = key; if (key == null) { return false; @@ -163,7 +168,7 @@ final class EmojiPageKeyboardView extends KeyboardView implements final Key key = getKey(e); final Runnable pendingKeyDown = mPendingKeyDown; final Key currentKey = mCurrentKey; - releaseCurrentKey(); + releaseCurrentKey(false /* withKeyRegistering */); if (key == null) { return false; } @@ -189,14 +194,14 @@ final class EmojiPageKeyboardView extends KeyboardView implements @Override public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX, final float distanceY) { - releaseCurrentKey(); + releaseCurrentKey(false /* withKeyRegistering */); return false; } @Override public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY) { - releaseCurrentKey(); + releaseCurrentKey(false /* withKeyRegistering */); return false; } diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java index 52a4dde97..68056e0eb 100644 --- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java @@ -27,7 +27,6 @@ import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.KeyboardView; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.utils.CollectionUtils; final class EmojiPalettesAdapter extends PagerAdapter { private static final String TAG = EmojiPalettesAdapter.class.getSimpleName(); @@ -35,8 +34,7 @@ final class EmojiPalettesAdapter extends PagerAdapter { private final EmojiPageKeyboardView.OnKeyEventListener mListener; private final DynamicGridKeyboard mRecentsKeyboard; - private final SparseArray<EmojiPageKeyboardView> mActiveKeyboardViews = - CollectionUtils.newSparseArray(); + private final SparseArray<EmojiPageKeyboardView> mActiveKeyboardViews = new SparseArray<>(); private final EmojiCategory mEmojiCategory; private int mActivePosition = 0; @@ -70,13 +68,18 @@ final class EmojiPalettesAdapter extends PagerAdapter { } 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) { - currentKeyboardView.releaseCurrentKey(); + if (currentKeyboardView == null) { + return; } + currentKeyboardView.releaseCurrentKey(withKeyRegistering); } @Override @@ -92,7 +95,7 @@ final class EmojiPalettesAdapter extends PagerAdapter { } final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(mActivePosition); if (oldKeyboardView != null) { - oldKeyboardView.releaseCurrentKey(); + oldKeyboardView.releaseCurrentKey(false /* withKeyRegistering */); oldKeyboardView.deallocateMemory(); } mActivePosition = position; diff --git a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java index 7b4bd3d36..0c4f902f4 100644 --- a/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java +++ b/java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java @@ -36,6 +36,7 @@ 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; @@ -68,6 +69,11 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange 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; @@ -114,6 +120,16 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange 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); } @@ -152,7 +168,15 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange addTab(mTabHost, properties.mCategoryId); } mTabHost.setOnTabChangedListener(this); - mTabHost.getTabWidget().setStripEnabled(true); + 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); @@ -165,6 +189,8 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange mEmojiCategoryPageIndicatorView = (EmojiCategoryPageIndicatorView)findViewById(R.id.emoji_category_page_id_view); + mEmojiCategoryPageIndicatorView.setColors( + mCategoryPageIndicatorColor, mCategoryPageIndicatorBackground); mEmojiLayoutParams.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView); setCurrentCategoryId(mEmojiCategory.getCurrentCategoryId(), true /* force */); @@ -360,6 +386,7 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange } public void stopEmojiPalettes() { + mEmojiPalettesAdapter.releaseCurrentKey(true /* withKeyRegistering */); mEmojiPalettesAdapter.flushPendingRecentKeys(); mEmojiPager.setAdapter(null); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java index fdc2458d4..3b4c43418 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java +++ b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java @@ -24,7 +24,6 @@ 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; @@ -32,7 +31,7 @@ import java.util.ArrayList; 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 DrawingPreviewPlacerView(final Context context, final AttributeSet attrs) { super(context, attrs); diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java index d8b00c707..72628e38a 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java @@ -29,15 +29,13 @@ import android.util.SparseArray; import android.view.View; import com.android.inputmethod.keyboard.PointerTracker; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper; /** * Draw preview graphics of multiple gesture trails during gesture input. */ public final class GestureTrailsDrawingPreview extends AbstractDrawingPreview { - private final SparseArray<GestureTrailDrawingPoints> mGestureTrails = - CollectionUtils.newSparseArray(); + private final SparseArray<GestureTrailDrawingPoints> mGestureTrails = new SparseArray<>(); private final GestureTrailDrawingParams mDrawingParams; private final Paint mGesturePaint; private int mOffscreenWidth; diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java index 625d1f0a4..605519b02 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyPreviewChoreographer.java @@ -32,7 +32,6 @@ import android.widget.TextView; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; import com.android.inputmethod.latin.utils.ViewLayoutUtils; @@ -48,9 +47,9 @@ import java.util.HashSet; */ public final class KeyPreviewChoreographer { // Free {@link TextView} pool that can be used for key preview. - private final ArrayDeque<TextView> mFreeKeyPreviewTextViews = CollectionUtils.newArrayDeque(); + private final ArrayDeque<TextView> mFreeKeyPreviewTextViews = new ArrayDeque<>(); // Map from {@link Key} to {@link TextView} that is currently being displayed as key preview. - private final HashMap<Key,TextView> mShowingKeyPreviewTextViews = CollectionUtils.newHashMap(); + private final HashMap<Key,TextView> mShowingKeyPreviewTextViews = new HashMap<>(); private final KeyPreviewDrawParams mParams; @@ -83,7 +82,7 @@ public final class KeyPreviewChoreographer { } public void dismissAllKeyPreviews() { - for (final Key key : new HashSet<Key>(mShowingKeyPreviewTextViews.keySet())) { + for (final Key key : new HashSet<>(mShowingKeyPreviewTextViews.keySet())) { dismissKeyPreview(key, false /* withAnimation */); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java index 700c9b07c..0b0e761d2 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyStylesSet.java @@ -21,7 +21,6 @@ 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; @@ -34,7 +33,7 @@ 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; @@ -75,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) { diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java index 06da5719b..62b69dcc9 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java @@ -17,14 +17,13 @@ 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 { public static final String PREFIX_CODE = "!code/"; - private static final HashMap<String, Integer> sNameToIdMap = CollectionUtils.newHashMap(); + private static final HashMap<String, Integer> sNameToIdMap = new HashMap<>(); private KeyboardCodesSet() { // This utility class is not publicly instantiable. diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java index f79bde017..7146deb4b 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java @@ -23,7 +23,6 @@ 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; @@ -60,7 +59,7 @@ public final class KeyboardIconsSet { 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 = { NAME_UNDEFINED, ATTR_UNDEFINED, diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java index a61a79b85..5df9d3ece 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardParams.java @@ -21,7 +21,6 @@ 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; @@ -61,9 +60,9 @@ public class KeyboardParams { public int GRID_HEIGHT; // Keys are sorted from top-left to bottom-right order. - public final SortedSet<Key> mSortedKeys = new TreeSet<Key>(ROW_COLUMN_COMPARATOR); - public final ArrayList<Key> mShiftKeys = CollectionUtils.newArrayList(); - public final ArrayList<Key> mAltCodeKeysWhileTyping = CollectionUtils.newArrayList(); + 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 KeyboardTextsSet mTextsSet = new KeyboardTextsSet(); public final KeyStylesSet mKeyStyles = new KeyStylesSet(mTextsSet); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardRow.java index 0f9497c27..6db1d02c9 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,7 +43,7 @@ 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<>(); private static class RowAttributes { /** Default width of a key in this row. */ diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java index 0047aa4a1..cd6abeed3 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java @@ -22,7 +22,6 @@ import android.text.TextUtils; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.Constants; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.RunInLocale; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; @@ -38,7 +37,7 @@ public final class KeyboardTextsSet { private String[] mTextsTable; // Resource name to text map. - private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap(); + private HashMap<String, String> mResourceNameToTextsMap = new HashMap<>(); public void setLocale(final Locale locale, final Context context) { mTextsTable = KeyboardTextsTable.getTextsTable(locale); @@ -141,6 +140,7 @@ public final class KeyboardTextsSet { "label_send_key", "label_next_key", "label_done_key", + "label_search_key", "label_previous_key", // Other labels. "label_pause_key", diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java index 7e6181a4e..40c915c8d 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsTable.java @@ -16,8 +16,6 @@ package com.android.inputmethod.keyboard.internal; -import com.android.inputmethod.latin.utils.CollectionUtils; - import java.util.HashMap; import java.util.Locale; @@ -44,14 +42,12 @@ import java.util.Locale; */ public final class KeyboardTextsTable { // Name to index map. - private static final HashMap<String, Integer> sNameToIndexesMap = CollectionUtils.newHashMap(); + private static final HashMap<String, Integer> sNameToIndexesMap = new HashMap<>(); // Locale to texts table map. - private static final HashMap<String, String[]> sLocaleToTextsTableMap = - CollectionUtils.newHashMap(); + 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 = - CollectionUtils.newHashMap(); + 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); 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/MoreKeySpec.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java index 56ef4767f..e0d5173ac 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java +++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpec.java @@ -149,7 +149,7 @@ public final class MoreKeySpec { // Skip empty entry. if (pos - start > 0) { if (list == null) { - list = CollectionUtils.newArrayList(); + list = new ArrayList<>(); } list.add(text.substring(start, pos)); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java index 5ac34188c..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 { @@ -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() { diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java index e7ab02ac1..096b946d2 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java @@ -30,7 +30,6 @@ import com.android.inputmethod.latin.makedict.UnsupportedFormatException; import com.android.inputmethod.latin.makedict.WordProperty; import com.android.inputmethod.latin.settings.NativeSuggestOptions; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.FileUtils; import com.android.inputmethod.latin.utils.JniUtils; import com.android.inputmethod.latin.utils.LanguageModelParam; @@ -104,8 +103,7 @@ public final class BinaryDictionary extends Dictionary { 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}. @@ -185,13 +183,14 @@ public final class BinaryDictionary extends Dictionary { private static native void getHeaderInfoNative(long dict, int[] outHeaderSize, int[] outFormatVersion, ArrayList<int[]> outAttributeKeys, ArrayList<int[]> outAttributeValues); - private static native void flushNative(long dict, String filePath); + 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 getBigramProbabilityNative(long dict, int[] word0, + boolean isBeginningOfSentence, int[] word1); private static native void getWordPropertyNative(long dict, int[] word, int[] outCodePoints, boolean[] outFlags, int[] outProbabilityInfo, ArrayList<int[]> outBigramTargets, ArrayList<int[]> outBigramProbabilityInfo, @@ -200,15 +199,17 @@ public final class BinaryDictionary extends Dictionary { private static native void getSuggestionsNative(long dict, long proximityInfo, long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times, int[] pointerIds, int[] inputCodePoints, int inputSize, int[] suggestOptions, - int[] prevWordCodePointArray, int[] outputSuggestionCount, int[] outputCodePoints, - int[] outputScores, int[] outputIndices, int[] outputTypes, - int[] outputAutoCommitFirstWordConfidence, float[] inOutLanguageWeight); - private static native void addUnigramWordNative(long dict, int[] word, int probability, - int[] shortcutTarget, int shortcutProbability, boolean isNotAWord, - boolean isBlacklisted, int timestamp); - private static native void addBigramWordsNative(long dict, int[] word0, int[] word1, - int probability, int timestamp); - private static native void removeBigramWordsNative(long dict, int[] word0, int[] word1); + int[] prevWordCodePointArray, boolean isBeginningOfSentence, + int[] outputSuggestionCount, int[] outputCodePoints, int[] outputScores, + int[] outputIndices, int[] outputTypes, int[] outputAutoCommitFirstWordConfidence, + float[] inOutLanguageWeight); + private static native boolean addUnigramWordNative(long dict, int[] word, int probability, + int[] shortcutTarget, int shortcutProbability, boolean isBeginningOfSentence, + boolean isNotAWord, boolean isBlacklisted, int timestamp); + private static native boolean addBigramWordsNative(long dict, int[] word0, + boolean isBeginningOfSentence, int[] word1, int probability, int timestamp); + private static native boolean removeBigramWordsNative(long dict, int[] word0, + boolean isBeginningOfSentence, int[] word1); private static native int addMultipleDictionaryEntriesNative(long dict, LanguageModelParam[] languageModelParams, int startIndex); private static native String getPropertyNative(long dict, String query); @@ -245,11 +246,11 @@ public final class BinaryDictionary extends Dictionary { } final int[] outHeaderSize = new int[1]; final int[] outFormatVersion = new int[1]; - final ArrayList<int[]> outAttributeKeys = CollectionUtils.newArrayList(); - final ArrayList<int[]> outAttributeValues = CollectionUtils.newArrayList(); + 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<String, String>(); + final HashMap<String, String> attributes = new HashMap<>(); for (int i = 0; i < outAttributeKeys.size(); i++) { final String attributeKey = StringUtils.getStringFromNullTerminatedCodePointArray( outAttributeKeys.get(i)); @@ -301,14 +302,15 @@ public final class BinaryDictionary extends Dictionary { getTraverseSession(sessionId).getSession(), inputPointers.getXCoordinates(), inputPointers.getYCoordinates(), inputPointers.getTimes(), inputPointers.getPointerIds(), mInputCodePoints, inputSize, - mNativeSuggestOptions.getOptions(), prevWordCodePointArray, mOutputSuggestionCount, + mNativeSuggestOptions.getOptions(), prevWordCodePointArray, + prevWordsInfo.mIsBeginningOfSentence, mOutputSuggestionCount, mOutputCodePoints, mOutputScores, mSpaceIndices, mOutputTypes, mOutputAutoCommitFirstWordConfidence, mInputOutputLanguageWeight); if (inOutLanguageWeight != null) { inOutLanguageWeight[0] = mInputOutputLanguageWeight[0]; } final int count = mOutputSuggestionCount[0]; - final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); + final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<>(); for (int j = 0; j < count; ++j) { final int start = j * MAX_WORD_LENGTH; int len = 0; @@ -316,23 +318,18 @@ public final class BinaryDictionary extends Dictionary { ++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)) { + final SuggestedWordInfo suggestedWordInfo = + new SuggestedWordInfo(new String(mOutputCodePoints, start, len), + mOutputScores[j], mOutputTypes[j], this /* sourceDict */, + mSpaceIndices[j] /* indexOfTouchPointOfSecondWord */, + mOutputAutoCommitFirstWordConfidence[0]); + if (blockOffensiveWords && suggestedWordInfo.isPossiblyOffensive() + && !suggestedWordInfo.isExactMatch()) { // 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(suggestedWordInfo); } } return suggestions; @@ -364,12 +361,13 @@ public final class BinaryDictionary extends Dictionary { } public int getNgramProbability(final PrevWordsInfo prevWordsInfo, final String word) { - if (TextUtils.isEmpty(prevWordsInfo.mPrevWord) || TextUtils.isEmpty(word)) { + if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) { return NOT_A_PROBABILITY; } final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord); final int[] codePoints1 = StringUtils.toCodePointArray(word); - return getBigramProbabilityNative(mNativeDict, codePoints0, codePoints1); + return getBigramProbabilityNative(mNativeDict, codePoints0, + prevWordsInfo.mIsBeginningOfSentence, codePoints1); } public WordProperty getWordProperty(final String word) { @@ -381,10 +379,10 @@ public final class BinaryDictionary extends Dictionary { 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 = CollectionUtils.newArrayList(); - final ArrayList<int[]> outBigramProbabilityInfo = CollectionUtils.newArrayList(); - final ArrayList<int[]> outShortcutTargets = CollectionUtils.newArrayList(); - final ArrayList<Integer> outShortcutProbabilities = CollectionUtils.newArrayList(); + 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, outCodePoints, outFlags, outProbabilityInfo, outBigramTargets, outBigramProbabilityInfo, outShortcutTargets, outShortcutProbabilities); @@ -419,42 +417,53 @@ public final class BinaryDictionary extends Dictionary { } // Add a unigram entry to binary dictionary with unigram attributes in native code. - public void addUnigramEntry(final String word, final int probability, - final String shortcutTarget, final int shortcutProbability, final boolean isNotAWord, + 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 (TextUtils.isEmpty(word)) { - return; + if (word == null || (word.isEmpty() && !isBeginningOfSentence)) { + return false; } final int[] codePoints = StringUtils.toCodePointArray(word); final int[] shortcutTargetCodePoints = (shortcutTarget != null) ? StringUtils.toCodePointArray(shortcutTarget) : null; - addUnigramWordNative(mNativeDict, codePoints, probability, shortcutTargetCodePoints, - shortcutProbability, isNotAWord, isBlacklisted, timestamp); + if (!addUnigramWordNative(mNativeDict, codePoints, probability, shortcutTargetCodePoints, + shortcutProbability, isBeginningOfSentence, isNotAWord, isBlacklisted, timestamp)) { + return false; + } mHasUpdated = true; + return true; } // Add an n-gram entry to the binary dictionary with timestamp in native code. - public void addNgramEntry(final PrevWordsInfo prevWordsInfo, final String word, - final int probability, - final int timestamp) { - if (TextUtils.isEmpty(prevWordsInfo.mPrevWord) || TextUtils.isEmpty(word)) { - return; + 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(prevWordsInfo.mPrevWord); final int[] codePoints1 = StringUtils.toCodePointArray(word); - addBigramWordsNative(mNativeDict, codePoints0, codePoints1, probability, timestamp); + if (!addBigramWordsNative(mNativeDict, codePoints0, prevWordsInfo.mIsBeginningOfSentence, + codePoints1, probability, timestamp)) { + return false; + } mHasUpdated = true; + return true; } // Remove an n-gram entry from the binary dictionary in native code. - public void removeNgramEntry(final PrevWordsInfo prevWordsInfo, final String word) { - if (TextUtils.isEmpty(prevWordsInfo.mPrevWord) || TextUtils.isEmpty(word)) { - return; + public boolean removeNgramEntry(final PrevWordsInfo prevWordsInfo, final String word) { + if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) { + return false; } final int[] codePoints0 = StringUtils.toCodePointArray(prevWordsInfo.mPrevWord); final int[] codePoints1 = StringUtils.toCodePointArray(word); - removeBigramWordsNative(mNativeDict, codePoints0, codePoints1); + if (!removeBigramWordsNative(mNativeDict, codePoints0, prevWordsInfo.mIsBeginningOfSentence, + codePoints1)) { + return false; + } mHasUpdated = true; + return true; } public void addMultipleDictionaryEntries(final LanguageModelParam[] languageModelParams) { @@ -484,26 +493,33 @@ public final class BinaryDictionary extends Dictionary { } // Flush to dict file if the dictionary has been updated. - public void flush() { - if (!isValidDictionary()) return; + public boolean flush() { + if (!isValidDictionary()) return false; if (mHasUpdated) { - flushNative(mNativeDict, mDictFilePath); + if (!flushNative(mNativeDict, mDictFilePath)) { + return false; + } reopen(); } + return true; } // Run GC and flush to dict file if the dictionary has been updated. - public void flushWithGCIfHasUpdated() { + public boolean flushWithGCIfHasUpdated() { if (mHasUpdated) { - flushWithGC(); + return flushWithGC(); } + return true; } // Run GC and flush to dict file. - public void flushWithGC() { - if (!isValidDictionary()) return; - flushWithGCNative(mNativeDict, mDictFilePath); + public boolean flushWithGC() { + if (!isValidDictionary()) return false; + if (!flushWithGCNative(mNativeDict, mDictFilePath)) { + return false; + } reopen(); + return true; } /** diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java index 72757e086..10b1f1b77 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java @@ -29,7 +29,6 @@ import android.util.Log; import com.android.inputmethod.dictionarypack.DictionaryPackConstants; import com.android.inputmethod.dictionarypack.MD5Calculator; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils.DictionaryInfo; import com.android.inputmethod.latin.utils.FileTransforms; @@ -44,8 +43,8 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -165,7 +164,7 @@ public final class BinaryDictionaryFileDumper { 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 = cursor.getString(0); final String wordListLocale = cursor.getString(1); diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java index 4c49cb31c..867c18686 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java @@ -24,7 +24,6 @@ import android.util.Log; import com.android.inputmethod.latin.makedict.DictionaryHeader; import com.android.inputmethod.latin.makedict.UnsupportedFormatException; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils; import com.android.inputmethod.latin.utils.LocaleUtils; @@ -160,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 = @@ -273,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 67ca59540..05d34767c 100644 --- a/java/src/com/android/inputmethod/latin/Constants.java +++ b/java/src/com/android/inputmethod/latin/Constants.java @@ -158,6 +158,10 @@ 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; @@ -192,7 +196,6 @@ public final class Constants { public static final int CODE_SPACE = ' '; public static final int CODE_PERIOD = '.'; public static final int CODE_COMMA = ','; - public static final int CODE_ARMENIAN_PERIOD = 0x0589; public static final int CODE_DASH = '-'; public static final int CODE_SINGLE_QUOTE = '\''; public static final int CODE_DOUBLE_QUOTE = '"'; @@ -208,6 +211,8 @@ 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; // ¡ /** * Special keys code. Must be negative. diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java index 3fb76b142..dd5b376a1 100644 --- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java @@ -31,7 +31,6 @@ import android.util.Log; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.personalization.AccountUtils; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.ExecutorUtils; import com.android.inputmethod.latin.utils.StringUtils; @@ -180,7 +179,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { private void addWordsLocked(final Cursor cursor) { int count = 0; - final ArrayList<String> names = CollectionUtils.newArrayList(); + final ArrayList<String> names = new ArrayList<>(); while (!cursor.isAfterLast() && count < MAX_CONTACT_COUNT) { String name = cursor.getString(INDEX_NAME); if (isValidName(name)) { @@ -224,7 +223,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { */ private void addNameLocked(final String name) { int len = StringUtils.codePointCount(name); - PrevWordsInfo prevWordsInfo = new PrevWordsInfo(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))) { @@ -298,7 +297,7 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary { if (null == cursor) { return false; } - final ArrayList<String> names = CollectionUtils.newArrayList(); + final ArrayList<String> names = new ArrayList<>(); try { if (cursor.moveToFirst()) { while (!cursor.isAfterLast()) { diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java index e6e4e0938..53be28139 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,22 +35,22 @@ 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)); } @@ -67,7 +66,7 @@ public final class DictionaryCollection extends Dictionary { ArrayList<SuggestedWordInfo> suggestions = dictionaries.get(0).getSuggestions(composer, prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions, sessionId, inOutLanguageWeight); - if (null == suggestions) suggestions = CollectionUtils.newArrayList(); + 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, diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java index 301b832b6..7fa3d0479 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java +++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java @@ -19,14 +19,17 @@ 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.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.utils.CollectionUtils; +import com.android.inputmethod.latin.settings.SpacingAndPunctuations; +import com.android.inputmethod.latin.utils.DistracterFilter; import com.android.inputmethod.latin.utils.ExecutorUtils; import com.android.inputmethod.latin.utils.LanguageModelParam; import com.android.inputmethod.latin.utils.SuggestionResults; @@ -37,16 +40,17 @@ 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.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; // TODO: Consolidate dictionaries in native code. -public class DictionaryFacilitatorForSuggest { - public static final String TAG = DictionaryFacilitatorForSuggest.class.getSimpleName(); +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. @@ -57,6 +61,7 @@ public class DictionaryFacilitatorForSuggest { 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_SUGGESTION = new String[] { @@ -69,7 +74,7 @@ public class DictionaryFacilitatorForSuggest { }; private static final Map<String, Class<? extends ExpandableBinaryDictionary>> - DICT_TYPE_TO_CLASS = CollectionUtils.newHashMap(); + DICT_TYPE_TO_CLASS = new HashMap<>(); static { DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER_HISTORY, UserHistoryDictionary.class); @@ -94,7 +99,7 @@ public class DictionaryFacilitatorForSuggest { public final Locale mLocale; private Dictionary mMainDict; public final ConcurrentHashMap<String, ExpandableBinaryDictionary> mSubDictMap = - CollectionUtils.newConcurrentHashMap(); + new ConcurrentHashMap<>(); public Dictionaries() { mLocale = null; @@ -162,7 +167,17 @@ public class DictionaryFacilitatorForSuggest { public void onUpdateMainDictionaryAvailability(boolean isMainDictionaryAvailable); } - public DictionaryFacilitatorForSuggest() {} + 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; @@ -196,7 +211,7 @@ public class DictionaryFacilitatorForSuggest { // 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 Set<String> subDictTypesToUse = CollectionUtils.newHashSet(); + final HashSet<String> subDictTypesToUse = new HashSet<>(); if (useContactsDict) { subDictTypesToUse.add(Dictionary.TYPE_CONTACTS); } @@ -215,7 +230,7 @@ public class DictionaryFacilitatorForSuggest { newMainDict = mDictionaries.getDict(Dictionary.TYPE_MAIN); } - final Map<String, ExpandableBinaryDictionary> subDicts = CollectionUtils.newHashMap(); + final Map<String, ExpandableBinaryDictionary> subDicts = new HashMap<>(); for (final String dictType : SUB_DICT_TYPES) { if (!subDictTypesToUse.contains(dictType)) { // This dictionary will not be used. @@ -288,7 +303,7 @@ public class DictionaryFacilitatorForSuggest { final ArrayList<String> dictionaryTypes, final HashMap<String, File> dictionaryFiles, final Map<String, Map<String, String>> additionalDictAttributes) { Dictionary mainDictionary = null; - final Map<String, ExpandableBinaryDictionary> subDicts = CollectionUtils.newHashMap(); + final Map<String, ExpandableBinaryDictionary> subDicts = new HashMap<>(); for (final String dictType : dictionaryTypes) { if (dictType.equals(Dictionary.TYPE_MAIN)) { @@ -321,6 +336,7 @@ public class DictionaryFacilitatorForSuggest { for (final String dictType : DICT_TYPES_ORDERED_TO_GET_SUGGESTION) { dictionaries.closeDict(dictType); } + mDistracterFilter.close(); } // The main dictionary could have been loaded asynchronously. Don't cache the return value @@ -392,7 +408,7 @@ public class DictionaryFacilitatorForSuggest { if (userHistoryDictionary == null) { return; } - final int maxFreq = getMaxFrequency(word); + final int maxFreq = getFrequency(word); if (maxFreq == 0 && blockPotentiallyOffensive) { return; } @@ -432,7 +448,7 @@ public class DictionaryFacilitatorForSuggest { // 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); + isValid, timeStampInSeconds, mDistracterFilter); } public void cancelAddingUserHistory(final PrevWordsInfo prevWordsInfo, @@ -500,7 +516,7 @@ public class DictionaryFacilitatorForSuggest { return false; } - private int getMaxFrequency(final String word) { + public int getFrequency(final String word) { if (TextUtils.isEmpty(word)) { return Dictionary.NOT_A_PROBABILITY; } @@ -537,9 +553,16 @@ public class DictionaryFacilitatorForSuggest { personalizationDict.clear(); } - public void addMultipleDictionaryEntriesToPersonalizationDictionary( - final ArrayList<LanguageModelParam> languageModelParams, + public void addEntriesToPersonalizationDictionary( + final PersonalizationDataChunk personalizationDataChunk, + final SpacingAndPunctuations spacingAndPunctuations, final ExpandableBinaryDictionary.AddMultipleDictionaryEntriesCallback callback) { + final ArrayList<LanguageModelParam> languageModelParams = + LanguageModelParam.createLanguageModelParamsFrom( + personalizationDataChunk.mTokens, + personalizationDataChunk.mTimestampInSeconds, + this /* dictionaryFacilitator */, spacingAndPunctuations, + mDistracterFilter); final ExpandableBinaryDictionary personalizationDict = mDictionaries.getSubDict(Dictionary.TYPE_PERSONALIZATION); if (personalizationDict == null || languageModelParams == null diff --git a/java/src/com/android/inputmethod/latin/DictionaryFactory.java b/java/src/com/android/inputmethod/latin/DictionaryFactory.java index e09c309ea..59de4f82a 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryFactory.java +++ b/java/src/com/android/inputmethod/latin/DictionaryFactory.java @@ -23,7 +23,6 @@ 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; @@ -55,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) { diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java index d67253c3b..b10bae01a 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java @@ -27,6 +27,7 @@ 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.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; @@ -53,7 +54,6 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { private static final String TAG = ExpandableBinaryDictionary.class.getSimpleName(); /** Whether to print debug output to log */ - private static boolean DEBUG = false; private static final boolean DBG_STRESS_TEST = false; private static final int TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS = 100; @@ -114,7 +114,8 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { 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; + return formatVersion == FormatSpec.VERSION4_ONLY_FOR_TESTING + || formatVersion == FormatSpec.VERSION401; } public boolean isValidDictionaryLocked() { @@ -191,7 +192,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { } protected Map<String, String> getHeaderAttributeMap() { - HashMap<String, String> attributeMap = new HashMap<String, String>(); + HashMap<String, String> attributeMap = new HashMap<>(); if (mAdditionalAttributeMap != null) { attributeMap.putAll(mAdditionalAttributeMap); } @@ -271,9 +272,10 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { /** * Adds unigram information of a word to the dictionary. May overwrite an existing entry. */ - public void addUnigramEntry(final String word, final int frequency, + 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 boolean isBlacklisted, final int timestamp, + final DistracterFilter distracterFilter) { reloadDictionaryIfRequired(); asyncExecuteTaskWithWriteLock(new Runnable() { @Override @@ -281,6 +283,11 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { 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); @@ -291,8 +298,10 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { protected void addUnigramLocked(final String word, final int frequency, final String shortcutTarget, final int shortcutFreq, final boolean isNotAWord, final boolean isBlacklisted, final int timestamp) { - mBinaryDictionary.addUnigramEntry(word, frequency, shortcutTarget, shortcutFreq, - isNotAWord, isBlacklisted, timestamp); + if (!mBinaryDictionary.addUnigramEntry(word, frequency, shortcutTarget, shortcutFreq, + false /* isBeginningOfSentence */, isNotAWord, isBlacklisted, timestamp)) { + Log.e(TAG, "Cannot add unigram entry. word: " + word); + } } /** @@ -315,7 +324,11 @@ abstract public class ExpandableBinaryDictionary extends Dictionary { protected void addNgramEntryLocked(final PrevWordsInfo prevWordsInfo, final String word, final int frequency, final int timestamp) { - mBinaryDictionary.addNgramEntry(prevWordsInfo, word, frequency, timestamp); + if (!mBinaryDictionary.addNgramEntry(prevWordsInfo, word, frequency, timestamp)) { + Log.e(TAG, "Cannot add n-gram entry."); + Log.e(TAG, " PrevWordsInfo: " + prevWordsInfo); + Log.e(TAG, " word: " + word); + } } /** diff --git a/java/src/com/android/inputmethod/latin/InputAttributes.java b/java/src/com/android/inputmethod/latin/InputAttributes.java index df4948322..e778a14f6 100644 --- a/java/src/com/android/inputmethod/latin/InputAttributes.java +++ b/java/src/com/android/inputmethod/latin/InputAttributes.java @@ -20,7 +20,6 @@ import android.text.InputType; import android.util.Log; import android.view.inputmethod.EditorInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.InputTypeUtils; import com.android.inputmethod.latin.utils.StringUtils; @@ -214,7 +213,7 @@ public final class InputAttributes { } private static String toFlagsString(final int flags) { - final ArrayList<String> flagsArray = CollectionUtils.newArrayList(); + 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)) diff --git a/java/src/com/android/inputmethod/latin/LastComposedWord.java b/java/src/com/android/inputmethod/latin/LastComposedWord.java index 9caec3e01..8cbf8379b 100644 --- a/java/src/com/android/inputmethod/latin/LastComposedWord.java +++ b/java/src/com/android/inputmethod/latin/LastComposedWord.java @@ -69,7 +69,7 @@ public final class LastComposedWord { mInputPointers.copy(inputPointers); } mTypedWord = typedWord; - mEvents = new ArrayList<Event>(events); + mEvents = new ArrayList<>(events); mCommittedWord = committedWord; mSeparatorString = separatorString; mActive = true; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index ab7e66a09..d329d2ce6 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -28,7 +28,6 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.IntentFilter; -import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; @@ -38,7 +37,6 @@ import android.net.ConnectivityManager; import android.os.Debug; import android.os.IBinder; import android.os.Message; -import android.preference.PreferenceManager; import android.text.InputType; import android.text.TextUtils; import android.util.Log; @@ -83,18 +81,18 @@ import com.android.inputmethod.latin.utils.ApplicationUtils; import com.android.inputmethod.latin.utils.CapsModeUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; import com.android.inputmethod.latin.utils.DialogUtils; -import com.android.inputmethod.latin.utils.DistracterFilter; +import com.android.inputmethod.latin.utils.DistracterFilterUsingSuggestion; 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.LeakGuardHandlerWrapper; import com.android.inputmethod.latin.utils.StatsUtils; import com.android.inputmethod.latin.utils.SubtypeLocaleUtils; -import com.android.inputmethod.research.ResearchLogger; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.List; import java.util.Locale; import java.util.concurrent.TimeUnit; @@ -103,7 +101,7 @@ import java.util.concurrent.TimeUnit; */ public class LatinIME extends InputMethodService implements KeyboardActionListener, SuggestionStripView.Listener, SuggestionStripViewAccessor, - DictionaryFacilitatorForSuggest.DictionaryInitializationListener, + DictionaryFacilitator.DictionaryInitializationListener, ImportantNoticeDialog.ImportantNoticeDialogListener { private static final String TAG = LatinIME.class.getSimpleName(); private static final boolean TRACE = false; @@ -122,12 +120,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private static final String SCHEME_PACKAGE = "package"; private final Settings mSettings; + private final DictionaryFacilitator mDictionaryFacilitator = + new DictionaryFacilitator(new DistracterFilterUsingSuggestion(this /* context */)); private final InputLogic mInputLogic = new InputLogic(this /* LatinIME */, - this /* SuggestionStripViewAccessor */); + 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<HardwareEventDecoder>(1); + final SparseArray<HardwareEventDecoder> mHardwareEventDecoders = new SparseArray<>(1); private View mExtractArea; private View mKeyPreviewBackingView; @@ -256,7 +255,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen if (latinIme == null) { return; } - if (!latinIme.mSettings.getCurrent().isSuggestionStripVisible()) { + if (!latinIme.mSettings.getCurrent() + .isCurrentOrientationAllowingSuggestionsPerUserSettings()) { return; } removeMessages(MSG_RESUME_SUGGESTIONS); @@ -491,12 +491,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen loadSettings(); resetSuggest(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().init(this, mKeyboardSwitcher); - ResearchLogger.getInstance().initDictionary( - mInputLogic.mSuggest.mDictionaryFacilitator); - } - // Register to receive ringer mode change and network state change. // Also receive installation and removal of a dictionary pack. final IntentFilter filter = new IntentFilter(); @@ -538,13 +532,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen if (!mHandler.hasPendingReopenDictionaries()) { resetSuggestForLocale(locale); } + mDictionaryFacilitator.updateEnabledSubtypes(mRichImm.getMyEnabledInputMethodSubtypeList( + true /* allowsImplicitlySelectedSubtypes */)); refreshPersonalizationDictionarySession(); StatsUtils.onLoadSettings(currentSettingsValues); } private void refreshPersonalizationDictionarySession() { - final DictionaryFacilitatorForSuggest dictionaryFacilitator = - mInputLogic.mSuggest.mDictionaryFacilitator; final boolean shouldKeepUserHistoryDictionaries; final boolean shouldKeepPersonalizationDictionaries; if (mSettings.getCurrent().mUsePersonalizedDicts) { @@ -559,16 +553,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen if (!shouldKeepUserHistoryDictionaries) { // Remove user history dictionaries. PersonalizationHelper.removeAllUserHistoryDictionaries(this); - dictionaryFacilitator.clearUserHistoryDictionary(); + mDictionaryFacilitator.clearUserHistoryDictionary(); } if (!shouldKeepPersonalizationDictionaries) { // Remove personalization dictionaries. PersonalizationHelper.removeAllPersonalizationDictionaries(this); PersonalizationDictionarySessionRegistrar.resetAll(this); } else { - final DistracterFilter distracterFilter = createDistracterFilter(); - PersonalizationDictionarySessionRegistrar.init( - this, dictionaryFacilitator, distracterFilter); + PersonalizationDictionarySessionRegistrar.init(this, mDictionaryFacilitator); } } @@ -606,10 +598,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen * @param locale the locale */ private void resetSuggestForLocale(final Locale locale) { - final DictionaryFacilitatorForSuggest dictionaryFacilitator = - mInputLogic.mSuggest.mDictionaryFacilitator; final SettingsValues settingsValues = mSettings.getCurrent(); - dictionaryFacilitator.resetDictionaries(this /* context */, locale, + mDictionaryFacilitator.resetDictionaries(this /* context */, locale, settingsValues.mUseContactsDict, settingsValues.mUsePersonalizedDicts, false /* forceReloadMainDictionary */, this); if (settingsValues.mCorrectionEnabled) { @@ -622,27 +612,20 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen * Reset suggest by loading the main dictionary of the current locale. */ /* package private */ void resetSuggestMainDict() { - final DictionaryFacilitatorForSuggest dictionaryFacilitator = - mInputLogic.mSuggest.mDictionaryFacilitator; final SettingsValues settingsValues = mSettings.getCurrent(); - dictionaryFacilitator.resetDictionaries(this /* context */, - dictionaryFacilitator.getLocale(), settingsValues.mUseContactsDict, + mDictionaryFacilitator.resetDictionaries(this /* context */, + mDictionaryFacilitator.getLocale(), settingsValues.mUseContactsDict, settingsValues.mUsePersonalizedDicts, true /* forceReloadMainDictionary */, this); } @Override public void onDestroy() { - mInputLogic.mSuggest.mDictionaryFacilitator.closeDictionaries(); + mDictionaryFacilitator.closeDictionaries(); mSettings.onDestroy(); unregisterReceiver(mConnectivityAndRingerModeChangeReceiver); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().onDestroy(); - } unregisterReceiver(mDictionaryPackInstallReceiver); unregisterReceiver(mDictionaryDumpBroadcastReceiver); PersonalizationDictionarySessionRegistrar.close(this); - LatinImeLogger.commit(); - LatinImeLogger.onDestroy(); StatsUtils.onDestroy(); super.onDestroy(); } @@ -666,9 +649,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mInputLogic.mConnection.finishComposingText(); mInputLogic.mConnection.endBatchEdit(); } - final DistracterFilter distracterFilter = createDistracterFilter(); PersonalizationDictionarySessionRegistrar.onConfigurationChanged(this, conf, - mInputLogic.mSuggest.mDictionaryFacilitator, distracterFilter); + mDictionaryFacilitator); super.onConfigurationChanged(conf); } @@ -687,9 +669,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen if (hasSuggestionStripView()) { mSuggestionStripView.setListener(this, view); } - if (LatinImeLogger.sVISUALDEBUG) { - mKeyPreviewBackingView.setBackgroundColor(0x10FF0000); - } } @Override @@ -762,10 +741,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } Log.i(TAG, "Starting input. Cursor position = " + editorInfo.initialSelStart + "," + editorInfo.initialSelEnd); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - ResearchLogger.latinIME_onStartInputViewInternal(editorInfo, prefs); - } if (InputAttributes.inPrivateImeOptions(null, NO_MICROPHONE_COMPAT, editorInfo)) { Log.w(TAG, "Deprecated private IME option specified: " + editorInfo.privateImeOptions); Log.w(TAG, "Use " + getPackageName() + "." + NO_MICROPHONE + " instead"); @@ -775,7 +750,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen Log.w(TAG, "Use EditorInfo.IME_FLAG_FORCE_ASCII flag instead"); } - LatinImeLogger.onStartInputView(editorInfo); // In landscape mode, this method gets called without the input view being created. if (mainKeyboardView == null) { return; @@ -841,7 +815,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen currentSettingsValues = mSettings.getCurrent(); if (currentSettingsValues.mCorrectionEnabled) { - suggest.setAutoCorrectionThreshold(currentSettingsValues.mAutoCorrectionThreshold); + suggest.setAutoCorrectionThreshold( + currentSettingsValues.mAutoCorrectionThreshold); } switcher.loadKeyboard(editorInfo, currentSettingsValues, getCurrentAutoCapsState(), @@ -870,7 +845,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mHandler.cancelUpdateSuggestionStrip(); mainKeyboardView.setMainDictionaryAvailability( - suggest.mDictionaryFacilitator.hasInitializedMainDictionary()); + mDictionaryFacilitator.hasInitializedMainDictionary()); mainKeyboardView.setKeyPreviewPopupEnabled(currentSettingsValues.mKeyPreviewPopupOn, currentSettingsValues.mKeyPreviewPopupDismissDelay); mainKeyboardView.setSlidingKeyInputPreviewEnabled( @@ -895,7 +870,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(); @@ -909,10 +883,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mHandler.cancelUpdateSuggestionStrip(); // Should do the following in onFinishInputInternal but until JB MR2 it's not called :( mInputLogic.finishInput(); - // Notify ResearchLogger - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onFinishInputViewInternal(finishingInput); - } } @Override @@ -926,11 +896,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen + ", nss=" + newSelStart + ", nse=" + newSelEnd + ", cs=" + composingSpanStart + ", ce=" + composingSpanEnd); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onUpdateSelection(oldSelStart, oldSelEnd, - oldSelStart, oldSelEnd, newSelStart, newSelEnd, composingSpanStart, - composingSpanEnd, mInputLogic.mConnection); - } // 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. @@ -991,7 +956,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen @Override public void hideWindow() { - LatinImeLogger.commit(); mKeyboardSwitcher.onHideWindow(); if (TRACE) Debug.stopMethodTracing(); @@ -1017,9 +981,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } if (applicationSpecifiedCompletions == null) { setNeutralSuggestionStrip(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onDisplayCompletions(null); - } return; } @@ -1031,9 +992,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen false /* isObsoleteSuggestions */, false /* isPrediction */); // When in fullscreen mode, show completions generated by the application forcibly setSuggestedWords(suggestedWords, true /* isSuggestionStripVisible */); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onDisplayCompletions(applicationSpecifiedCompletions); - } } private int getAdjustedBackingViewHeight() { @@ -1167,8 +1125,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } else { wordToEdit = word; } - mInputLogic.mSuggest.mDictionaryFacilitator.addWordToUserDictionary( - this /* context */, wordToEdit); + mDictionaryFacilitator.addWordToUserDictionary(this /* context */, wordToEdit); } // Callback for the {@link SuggestionStripView}, to call when the important notice strip is @@ -1352,7 +1309,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen currentSettings.mInputAttributes)) { return true; } - if (!currentSettings.isSuggestionStripVisible()) { + if (!currentSettings.isCurrentOrientationAllowingSuggestionsPerUserSettings()) { return false; } if (currentSettings.isApplicationSpecifiedCompletionsOn()) { @@ -1397,8 +1354,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final SettingsValues currentSettings = mSettings.getCurrent(); final boolean showSuggestions; - if (SuggestedWords.EMPTY == suggestedWords || suggestedWords.isPunctuationSuggestions() - || !currentSettings.isSuggestionsRequested()) { + // May show the important notice when there are no suggestions to show, + if (SuggestedWords.EMPTY == suggestedWords + // or the suggestion strip is expected to show punctuation suggestions, + || suggestedWords.isPunctuationSuggestions() + // or it's not requested to show suggestions by the input field, + || !currentSettings.isSuggestionsRequested() + // or the "show correction suggestions" settings is off by users preference. + || !currentSettings.isCurrentOrientationAllowingSuggestionsPerUserSettings()) { showSuggestions = !mSuggestionStripView.maybeShowImportantNoticeTitle( currentSettings.mInputAttributes); } else { @@ -1725,15 +1688,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen @UsedForTesting /* package for test */ void waitForLoadingDictionaries(final long timeout, final TimeUnit unit) throws InterruptedException { - mInputLogic.mSuggest.mDictionaryFacilitator.waitForLoadingDictionariesForTesting( - timeout, unit); + mDictionaryFacilitator.waitForLoadingDictionariesForTesting(timeout, unit); } // DO NOT USE THIS for any other purpose than testing. This can break the keyboard badly. @UsedForTesting /* package for test */ void replaceDictionariesForTest(final Locale locale) { final SettingsValues settingsValues = mSettings.getCurrent(); - mInputLogic.mSuggest.mDictionaryFacilitator.resetDictionaries(this, locale, + mDictionaryFacilitator.resetDictionaries(this, locale, settingsValues.mUseContactsDict, settingsValues.mUsePersonalizedDicts, false /* forceReloadMainDictionary */, this /* listener */); } @@ -1741,24 +1703,21 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // DO NOT USE THIS for any other purpose than testing. @UsedForTesting /* package for test */ void clearPersonalizedDictionariesForTest() { - mInputLogic.mSuggest.mDictionaryFacilitator.clearUserHistoryDictionary(); - mInputLogic.mSuggest.mDictionaryFacilitator.clearPersonalizationDictionary(); + mDictionaryFacilitator.clearUserHistoryDictionary(); + mDictionaryFacilitator.clearPersonalizationDictionary(); } @UsedForTesting - /* package for test */ DistracterFilter createDistracterFilter() { - return new DistracterFilter(this /* Context */, - mRichImm.getMyEnabledInputMethodSubtypeList( - true /* allowsImplicitlySelectedSubtypes */)); + /* package for test */ List<InputMethodSubtype> getEnabledSubtypesForTest() { + return (mRichImm != null) ? mRichImm.getMyEnabledInputMethodSubtypeList( + true /* allowsImplicitlySelectedSubtypes */) : new ArrayList<InputMethodSubtype>(); } public void dumpDictionaryForDebug(final String dictName) { - final DictionaryFacilitatorForSuggest dictionaryFacilitator = - mInputLogic.mSuggest.mDictionaryFacilitator; - if (dictionaryFacilitator.getLocale() == null) { + if (mDictionaryFacilitator.getLocale() == null) { resetSuggest(); } - mInputLogic.mSuggest.mDictionaryFacilitator.dumpDictionaryForDebug(dictName); + mDictionaryFacilitator.dumpDictionaryForDebug(dictName); } public void debugDumpStateAndCrashWithException(final String context) { 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 index ecc8947db..42b311c69 100644 --- a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java +++ b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java @@ -16,23 +16,32 @@ package com.android.inputmethod.latin; -import android.util.Log; - +/** + * 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. + */ // TODO: Support multiple previous words for n-gram. public class PrevWordsInfo { - // The previous word. May be null after resetting and before starting a new composing word, or - // when there is no context like at the start of text for example. It can also be set to null - // externally when the user enters a separator that does not let bigrams across, like a period - // or a comma. + public static final PrevWordsInfo EMPTY_PREV_WORDS_INFO = new PrevWordsInfo(null); + public static final PrevWordsInfo BEGINNING_OF_SENTENCE = new PrevWordsInfo(); + + // The word immediately before the considered word. null means we don't have any context + // including the "beginning of sentence context" - we just don't know what to predict. + // An example of that is after a comma. + // For simplicity of implementation, this may also be null transiently after the WordComposer + // was reset and before starting a new composing word, but we should never be calling + // getSuggetions* in this situation. + // This is an empty string when mIsBeginningOfSentence is true. public final String mPrevWord; // TODO: Have sentence separator. - // Whether the current context is beginning of sentence or not. + // 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 PrevWordsInfo() { - mPrevWord = null; + mPrevWord = ""; mIsBeginningOfSentence = true; } @@ -40,4 +49,14 @@ public class PrevWordsInfo { mPrevWord = prevWord; mIsBeginningOfSentence = false; } + + public boolean isValid() { + return mPrevWord != null; + } + + @Override + public String toString() { + return "PrevWord: " + mPrevWord + ", isBeginningOfSentence: " + + mIsBeginningOfSentence + "."; + } } diff --git a/java/src/com/android/inputmethod/latin/PunctuationSuggestions.java b/java/src/com/android/inputmethod/latin/PunctuationSuggestions.java index 4911bcdf6..0fba37c8a 100644 --- a/java/src/com/android/inputmethod/latin/PunctuationSuggestions.java +++ b/java/src/com/android/inputmethod/latin/PunctuationSuggestions.java @@ -17,8 +17,6 @@ package com.android.inputmethod.latin; import com.android.inputmethod.keyboard.internal.KeySpecParser; -import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.StringUtils; import java.util.ArrayList; @@ -49,7 +47,7 @@ public final class PunctuationSuggestions extends SuggestedWords { */ public static PunctuationSuggestions newPunctuationSuggestions( final String[] punctuationSpecs) { - final ArrayList<SuggestedWordInfo> puncuationsList = CollectionUtils.newArrayList(); + final ArrayList<SuggestedWordInfo> puncuationsList = new ArrayList<>(); for (final String puncSpec : punctuationSpecs) { puncuationsList.add(newHardCodedWordInfo(puncSpec)); } diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java index 2c54e10aa..9d72c64fc 100644 --- a/java/src/com/android/inputmethod/latin/RichInputConnection.java +++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java @@ -26,14 +26,12 @@ 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.SpacingAndPunctuations; import com.android.inputmethod.latin.utils.CapsModeUtils; import com.android.inputmethod.latin.utils.DebugLogUtils; 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.Arrays; import java.util.regex.Pattern; @@ -174,9 +172,6 @@ public final class RichInputConnection { } if (null != mIC && shouldFinishComposition) { mIC.finishComposingText(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_finishComposingText(); - } } return true; } @@ -223,9 +218,6 @@ public final class RichInputConnection { mComposingText.setLength(0); if (null != mIC) { mIC.finishComposingText(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_finishComposingText(); - } } } @@ -363,9 +355,6 @@ public final class RichInputConnection { } if (null != mIC) { mIC.deleteSurroundingText(beforeLength, afterLength); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_deleteSurroundingText(beforeLength, afterLength); - } } if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); } @@ -374,9 +363,6 @@ public final class RichInputConnection { mIC = mParent.getCurrentInputConnection(); if (null != mIC) { mIC.performEditorAction(actionId); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_performEditorAction(actionId); - } } } @@ -429,9 +415,6 @@ public final class RichInputConnection { } if (null != mIC) { mIC.sendKeyEvent(keyEvent); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_sendKeyEvent(keyEvent); - } } } @@ -469,9 +452,6 @@ public final class RichInputConnection { // 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(); } @@ -500,9 +480,6 @@ public final class RichInputConnection { if (!isIcValid) { return false; } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_setSelection(start, end); - } } return reloadTextCache(); } @@ -530,9 +507,6 @@ public final class RichInputConnection { mComposingText.setLength(0); if (null != mIC) { mIC.commitCompletion(completionInfo); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.richInputConnection_commitCompletion(completionInfo); - } } if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); } @@ -542,7 +516,7 @@ public final class RichInputConnection { final SpacingAndPunctuations spacingAndPunctuations, final int n) { mIC = mParent.getCurrentInputConnection(); if (null == mIC) { - return new PrevWordsInfo(null); + return PrevWordsInfo.EMPTY_PREV_WORDS_INFO; } final CharSequence prev = getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); if (DEBUG_PREVIOUS_TEXT && null != prev) { @@ -573,14 +547,17 @@ public final class RichInputConnection { // Get information of 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 information represents beginning-of-sentence). + // ends in a separator, it returns information representing beginning-of-sentence). // Example : // (n = 1) "abc def|" -> def // (n = 1) "abc def |" -> def + // (n = 1) "abc 'def|" -> 'def // (n = 1) "abc def. |" -> beginning-of-sentence // (n = 1) "abc def . |" -> beginning-of-sentence // (n = 2) "abc def|" -> abc // (n = 2) "abc def |" -> 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. // (n = 2) "abc def. |" -> abc // (n = 2) "abc def . |" -> def // (n = 2) "abc|" -> beginning-of-sentence @@ -588,30 +565,43 @@ public final class RichInputConnection { // (n = 2) "abc. def|" -> beginning-of-sentence public static PrevWordsInfo getPrevWordsInfoFromNthPreviousWord(final CharSequence prev, final SpacingAndPunctuations spacingAndPunctuations, final int n) { - if (prev == null) return new PrevWordsInfo(null); + if (prev == null) return PrevWordsInfo.EMPTY_PREV_WORDS_INFO; final String[] w = spaceRegex.split(prev); + // Referring to the word after the nth word. + if ((n - 1) > 0 && (n - 1) <= w.length) { + final String wordFollowingTheNthPrevWord = w[w.length - n + 1]; + if (!wordFollowingTheNthPrevWord.isEmpty()) { + final char firstChar = wordFollowingTheNthPrevWord.charAt(0); + if (spacingAndPunctuations.isWordConnector(firstChar)) { + // The word following the n-th prev word is starting with a word connector. + // TODO: Return meaningful context for this case. + return PrevWordsInfo.EMPTY_PREV_WORDS_INFO; + } + } + } + // If we can't find n words, or we found an empty word, the context is // beginning-of-sentence. if (w.length < n) { - return new PrevWordsInfo(); + return PrevWordsInfo.BEGINNING_OF_SENTENCE; } final String nthPrevWord = w[w.length - n]; final int length = nthPrevWord.length(); if (length <= 0) { - return new PrevWordsInfo(); + return PrevWordsInfo.BEGINNING_OF_SENTENCE; } // If ends in a sentence separator, the context is beginning-of-sentence. final char lastChar = nthPrevWord.charAt(length - 1); if (spacingAndPunctuations.isSentenceSeparator(lastChar)) { - new PrevWordsInfo(); + return PrevWordsInfo.BEGINNING_OF_SENTENCE; } // 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)) { - return new PrevWordsInfo(null); + return PrevWordsInfo.EMPTY_PREV_WORDS_INFO; } return new PrevWordsInfo(nthPrevWord); } @@ -765,9 +755,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; } @@ -790,9 +777,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; } diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java index 64cc562c8..cbdc4b9eb 100644 --- a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java +++ b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java @@ -31,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; @@ -53,9 +52,9 @@ public final class RichInputMethodManager { private InputMethodManagerCompatWrapper mImmWrapper; 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; diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java index c8a2fb2f9..a3d09565c 100644 --- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java +++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java @@ -255,8 +255,7 @@ public final class SubtypeSwitcher { public boolean isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes() { final Locale systemLocale = mResources.getConfiguration().locale; - final Set<InputMethodSubtype> enabledSubtypesOfEnabledImes = - new HashSet<InputMethodSubtype>(); + final Set<InputMethodSubtype> enabledSubtypesOfEnabledImes = new HashSet<>(); final InputMethodManager inputMethodManager = mRichImm.getInputMethodManager(); final List<InputMethodInfo> enabledInputMethodInfoList = inputMethodManager.getEnabledInputMethodList(); diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index 43daee4d2..9da0f8451 100644 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -23,7 +23,6 @@ import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.utils.AutoCorrectionUtils; import com.android.inputmethod.latin.utils.BinaryDictionaryUtils; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.StringUtils; import com.android.inputmethod.latin.utils.SuggestionResults; @@ -52,11 +51,14 @@ public final class Suggest { private static final int SUPPRESS_SUGGEST_THRESHOLD = -2000000000; private static final boolean DBG = LatinImeLogger.sDBG; - public final DictionaryFacilitatorForSuggest mDictionaryFacilitator = - new DictionaryFacilitatorForSuggest(); + private final DictionaryFacilitator mDictionaryFacilitator; private float mAutoCorrectionThreshold; + public Suggest(final DictionaryFacilitator dictionaryFacilitator) { + mDictionaryFacilitator = dictionaryFacilitator; + } + public Locale getLocale() { return mDictionaryFacilitator.getLocale(); } @@ -74,7 +76,6 @@ public final class Suggest { final boolean blockOffensiveWords, final boolean isCorrectionEnabled, final int[] additionalFeaturesOptions, final int sessionId, final int sequenceNumber, final OnGetSuggestedWordsCallback callback) { - LatinImeLogger.onStartSuggestion(prevWordsInfo.mPrevWord); if (wordComposer.isBatchMode()) { getSuggestedWordsForBatchInput(wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions, sessionId, sequenceNumber, @@ -98,11 +99,10 @@ public final class Suggest { final String consideredWord = trailingSingleQuotesCount > 0 ? typedWord.substring(0, typedWord.length() - trailingSingleQuotesCount) : typedWord; - LatinImeLogger.onAddSuggestedWord(typedWord, Dictionary.TYPE_USER_TYPED); final ArrayList<SuggestedWordInfo> rawSuggestions; if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) { - rawSuggestions = CollectionUtils.newArrayList(); + rawSuggestions = new ArrayList<>(); } else { rawSuggestions = null; } @@ -124,7 +124,7 @@ public final class Suggest { suggestionResults.first(), suggestionResults.mLocale, isAllUpperCase, isFirstCharCapitalized, trailingSingleQuotesCount); firstSuggestion = firstSuggestedWordInfo.mWord; - if (SuggestedWordInfo.KIND_WHITELIST != firstSuggestedWordInfo.mKind) { + if (!firstSuggestedWordInfo.isKindOf(SuggestedWordInfo.KIND_WHITELIST)) { whitelistedWord = null; } else { whitelistedWord = firstSuggestion; @@ -155,7 +155,7 @@ public final class Suggest { || suggestionResults.isEmpty() || wordComposer.hasDigits() || wordComposer.isMostlyCaps() || wordComposer.isResumed() || !mDictionaryFacilitator.hasInitializedMainDictionary() - || SuggestedWordInfo.KIND_SHORTCUT == suggestionResults.first().mKind) { + || 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 @@ -171,7 +171,7 @@ public final class Suggest { } final ArrayList<SuggestedWordInfo> suggestionsContainer = - CollectionUtils.newArrayList(suggestionResults); + new ArrayList<>(suggestionResults); final int suggestionsCount = suggestionsContainer.size(); if (isFirstCharCapitalized || isAllUpperCase || 0 != trailingSingleQuotesCount) { for (int i = 0; i < suggestionsCount; ++i) { @@ -183,12 +183,6 @@ public final class Suggest { } } - for (int i = 0; i < suggestionsCount; ++i) { - final SuggestedWordInfo wordInfo = suggestionsContainer.get(i); - LatinImeLogger.onAddSuggestedWord(wordInfo.mWord.toString(), - wordInfo.mSourceDict.mDictType); - } - if (!TextUtils.isEmpty(typedWord)) { suggestionsContainer.add(0, new SuggestedWordInfo(typedWord, SuggestedWordInfo.MAX_SCORE, SuggestedWordInfo.KIND_TYPED, @@ -223,19 +217,15 @@ public final class Suggest { final OnGetSuggestedWordsCallback callback) { final ArrayList<SuggestedWordInfo> rawSuggestions; if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) { - rawSuggestions = CollectionUtils.newArrayList(); + rawSuggestions = new ArrayList<>(); } else { rawSuggestions = null; } final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults( wordComposer, prevWordsInfo, proximityInfo, blockOffensiveWords, additionalFeaturesOptions, sessionId, rawSuggestions); - for (SuggestedWordInfo wordInfo : suggestionResults) { - LatinImeLogger.onAddSuggestedWord(wordInfo.mWord, wordInfo.mSourceDict.mDictType); - } - final ArrayList<SuggestedWordInfo> suggestionsContainer = - CollectionUtils.newArrayList(suggestionResults); + new ArrayList<>(suggestionResults); final int suggestionsCount = suggestionsContainer.size(); final boolean isFirstCharCapitalized = wordComposer.wasShiftedNoLock(); final boolean isAllUpperCase = wordComposer.isAllUpperCase(); @@ -278,8 +268,7 @@ 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. @@ -320,7 +309,7 @@ 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); } diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java index dc2c9fd0e..72461e17a 100644 --- a/java/src/com/android/inputmethod/latin/SuggestedWords.java +++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java @@ -19,7 +19,6 @@ 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; @@ -34,8 +33,7 @@ public class SuggestedWords { // The maximum number of suggestions available. public static final int MAX_SUGGESTIONS = 18; - private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST = - CollectionUtils.newArrayList(0); + private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST = new ArrayList<>(0); public static final SuggestedWords EMPTY = new SuggestedWords( EMPTY_WORD_INFO_LIST, null /* rawSuggestions */, false, false, false, false); @@ -165,7 +163,7 @@ public class SuggestedWords { 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 (null == info || null == info.getText()) { continue; @@ -179,8 +177,8 @@ public 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 */, @@ -209,7 +207,8 @@ public 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) @@ -224,16 +223,16 @@ public 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 @@ -249,18 +248,19 @@ public 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; @@ -276,7 +276,7 @@ public class SuggestedWords { mWord = applicationSpecifiedCompletion.getText().toString(); mApplicationSpecifiedCompletionInfo = applicationSpecifiedCompletion; mScore = SuggestedWordInfo.MAX_SCORE; - mKind = SuggestedWordInfo.KIND_APP_DEFINED; + mKindAndFlags = SuggestedWordInfo.KIND_APP_DEFINED; mSourceDict = Dictionary.DICTIONARY_APPLICATION_DEFINED; mCodePointCount = StringUtils.codePointCount(mWord); mIndexOfTouchPointOfSecondWord = SuggestedWordInfo.NOT_AN_INDEX; @@ -284,7 +284,27 @@ public class SuggestedWords { } 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) { @@ -337,11 +357,11 @@ public class SuggestedWords { // 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); @@ -361,12 +381,12 @@ public 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)); } diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java index 6ecb37346..864942d04 100644 --- a/java/src/com/android/inputmethod/latin/WordComposer.java +++ b/java/src/com/android/inputmethod/latin/WordComposer.java @@ -18,7 +18,6 @@ package com.android.inputmethod.latin; import com.android.inputmethod.event.CombinerChain; import com.android.inputmethod.event.Event; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CoordinateUtils; import com.android.inputmethod.latin.utils.StringUtils; @@ -79,13 +78,13 @@ public final class WordComposer { public WordComposer() { mCombinerChain = new CombinerChain(""); - mEvents = CollectionUtils.newArrayList(); + mEvents = new ArrayList<>(); mAutoCorrection = null; mIsResumed = false; mIsBatchMode = false; mCursorPositionWithinWord = 0; mRejectedBatchModeSuggestion = null; - mPrevWordsInfo = new PrevWordsInfo(null); + mPrevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; refreshTypedWordCache(); } @@ -117,7 +116,7 @@ public final class WordComposer { mIsBatchMode = false; mCursorPositionWithinWord = 0; mRejectedBatchModeSuggestion = null; - mPrevWordsInfo = new PrevWordsInfo(null); + mPrevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; refreshTypedWordCache(); } @@ -445,7 +444,7 @@ public final class WordComposer { // when the user inputs a separator that's not whitespace (including the case of the // double-space-to-period feature). public void discardPreviousWordForSuggestion() { - mPrevWordsInfo = new PrevWordsInfo(null); + mPrevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; } public void resumeSuggestionOnLastComposedWord(final LastComposedWord lastComposedWord, diff --git a/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java b/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java index 139e73aa4..7071d8689 100644 --- a/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java +++ b/java/src/com/android/inputmethod/latin/debug/ExternalDictionaryGetterForDebug.java @@ -27,7 +27,6 @@ import com.android.inputmethod.latin.BinaryDictionaryFileDumper; import com.android.inputmethod.latin.BinaryDictionaryGetter; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.makedict.DictionaryHeader; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.DialogUtils; import com.android.inputmethod.latin.utils.DictionaryInfoUtils; import com.android.inputmethod.latin.utils.LocaleUtils; @@ -50,7 +49,7 @@ 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 DictionaryHeader header = DictionaryInfoUtils.getDictionaryFileHeaderOrNull(f); if (null == header) continue; diff --git a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java index 761f457ea..972580298 100644 --- a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java +++ b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java @@ -21,13 +21,6 @@ public final class ProductionFlag { // This class is not publicly instantiable. } - public static final boolean USES_DEVELOPMENT_ONLY_DIAGNOSTICS = 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; - public static final boolean IS_HARDWARE_KEYBOARD_SUPPORTED = false; // When true, enable {@link InputMethodService#onUpdateCursor} callback with diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index 7536ff94c..f36b42a40 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -32,7 +32,7 @@ import com.android.inputmethod.event.InputTransaction; import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Dictionary; -import com.android.inputmethod.latin.DictionaryFacilitatorForSuggest; +import com.android.inputmethod.latin.DictionaryFacilitator; import com.android.inputmethod.latin.InputPointers; import com.android.inputmethod.latin.LastComposedWord; import com.android.inputmethod.latin.LatinIME; @@ -44,18 +44,14 @@ 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.define.ProductionFlag; 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.CollectionUtils; import com.android.inputmethod.latin.utils.InputTypeUtils; -import com.android.inputmethod.latin.utils.LatinImeLoggerUtils; import com.android.inputmethod.latin.utils.RecapitalizeStatus; import com.android.inputmethod.latin.utils.StringUtils; import com.android.inputmethod.latin.utils.TextRange; -import com.android.inputmethod.research.ResearchLogger; import java.util.ArrayList; import java.util.TreeSet; @@ -79,7 +75,8 @@ public final class InputLogic { private int mSpaceState; // Never null public SuggestedWords mSuggestedWords = SuggestedWords.EMPTY; - public final Suggest mSuggest = new Suggest(); + public final Suggest mSuggest; + private final DictionaryFacilitator mDictionaryFacilitator; public LastComposedWord mLastComposedWord = LastComposedWord.NOT_A_COMPOSED_WORD; public final WordComposer mWordComposer; @@ -88,7 +85,7 @@ public final class InputLogic { private int mDeleteCount; private long mLastKeyTime; - public final TreeSet<Long> mCurrentlyPressedHardwareKeys = CollectionUtils.newTreeSet(); + public final TreeSet<Long> mCurrentlyPressedHardwareKeys = new TreeSet<>(); // Keeps track of most recently inserted text (multi-character key) for reverting private String mEnteredText; @@ -102,14 +99,19 @@ public final class InputLogic { * 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 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; } /** @@ -173,7 +175,7 @@ public final class InputLogic { final InputLogicHandler inputLogicHandler = mInputLogicHandler; mInputLogicHandler = InputLogicHandler.NULL_HANDLER; inputLogicHandler.destroy(); - mSuggest.mDictionaryFacilitator.closeDictionaries(); + mDictionaryFacilitator.closeDictionaries(); } /** @@ -196,19 +198,11 @@ public final class InputLogic { resetComposingState(true /* alsoResetLastComposedWord */); } handler.postUpdateSuggestionStrip(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS - && ResearchLogger.RESEARCH_KEY_OUTPUT_TEXT.equals(rawText)) { - ResearchLogger.getInstance().onResearchKeySelected(mLatinIME); - return; - } final String text = performSpecificTldProcessingOnTextInput(rawText); if (SpaceState.PHANTOM == mSpaceState) { promotePhantomSpace(settingsValues); } 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 = SpaceState.NONE; @@ -235,14 +229,8 @@ public final class InputLogic { // 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. - // 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 Event event = Event.createPunctuationSuggestionPickedEvent(suggestionInfo); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_punctuationSuggestion(index, suggestion, - false /* isBatchMode */, suggestedWords.mIsPrediction); - } return onCodeInput(settingsValues, event, keyboardShiftState, handler); } @@ -265,7 +253,7 @@ public final class InputLogic { // 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 (SuggestedWordInfo.KIND_APP_DEFINED == suggestionInfo.mKind) { + if (suggestionInfo.isKindOf(SuggestedWordInfo.KIND_APP_DEFINED)) { mSuggestedWords = SuggestedWords.EMPTY; mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); @@ -278,14 +266,8 @@ public final class InputLogic { // 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); commitChosenWord(settingsValues, 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(); @@ -295,18 +277,12 @@ public final class InputLogic { // 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 DictionaryFacilitatorForSuggest dictionaryFacilitator = - mSuggest.mDictionaryFacilitator; final boolean showingAddToDictionaryHint = - (SuggestedWordInfo.KIND_TYPED == suggestionInfo.mKind - || SuggestedWordInfo.KIND_OOV_CORRECTION == suggestionInfo.mKind) - && !dictionaryFacilitator.isValidWord(suggestion, true /* ignoreCase */); + (suggestionInfo.isKindOf(SuggestedWordInfo.KIND_TYPED) + || suggestionInfo.isKindOf(SuggestedWordInfo.KIND_OOV_CORRECTION)) + && !mDictionaryFacilitator.isValidWord(suggestion, true /* ignoreCase */); - if (settingsValues.mIsInternal) { - LatinImeLoggerUtils.onSeparator((char)Constants.CODE_SPACE, - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); - } - if (showingAddToDictionaryHint && dictionaryFacilitator.isUserDictionaryEnabled()) { + if (showingAddToDictionaryHint && mDictionaryFacilitator.isUserDictionaryEnabled()) { mSuggestionStripViewAccessor.showAddToDictionaryHint(suggestion); } else { // If we're not showing the "Touch again to save", then update the suggestion strip. @@ -400,9 +376,6 @@ public final class InputLogic { final InputTransaction inputTransaction = new InputTransaction(settingsValues, event, SystemClock.uptimeMillis(), mSpaceState, getActualCapsMode(settingsValues, keyboardShiftMode)); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onCodeInput(code, event.mX, event.mY); - } if (event.mKeyCode != Constants.CODE_DELETE || inputTransaction.mTimestamp > mLastKeyTime + Constants.LONG_PRESS_MILLISECONDS) { mDeleteCount = 0; @@ -424,7 +397,6 @@ public final class InputLogic { switch (event.mKeyCode) { case Constants.CODE_DELETE: handleBackspace(inputTransaction); - LatinImeLogger.logOnDelete(event.mX, event.mY); break; case Constants.CODE_SHIFT: performRecapitalization(inputTransaction.mSettingsValues); @@ -530,12 +502,6 @@ public final class InputLogic { ++mAutoCommitSequenceNumber; mConnection.beginBatchEdit(); if (mWordComposer.isComposingWord()) { - if (settingsValues.mIsInternal) { - if (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 batch input at the current cursor position. @@ -675,19 +641,9 @@ public final class InputLogic { || Character.getType(codePoint) == Character.OTHER_SYMBOL) { didAutoCorrect = handleSeparator(inputTransaction, inputTransaction.mEvent.isSuggestionStripPress(), handler); - if (inputTransaction.mSettingsValues.mIsInternal) { - LatinImeLoggerUtils.onSeparator((char)codePoint, - inputTransaction.mEvent.mX, inputTransaction.mEvent.mY); - } } else { didAutoCorrect = false; if (SpaceState.PHANTOM == inputTransaction.mSpaceState) { - if (inputTransaction.mSettingsValues.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. @@ -748,11 +704,10 @@ public final class InputLogic { (!mConnection.isCursorTouchingWord(settingsValues.mSpacingAndPunctuations) || !settingsValues.mSpacingAndPunctuations.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 != codePoint - && Constants.CODE_DASH != codePoint); + // 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 @@ -763,12 +718,15 @@ public final class InputLogic { mWordComposer.processEvent(inputTransaction.mEvent); // If it's the first letter, make note of auto-caps state if (mWordComposer.isSingleLetter()) { - // We pass 1 to getPreviousWordForSuggestion because we were not composing a word - // yet, so the word we want is the 1st word before the cursor. + // We pass 2 to getPreviousWordForSuggestion when the previous code point is a word + // connector. Otherwise, we pass 1 because we were not composing a word yet, so the + // word we want is the 1st word before the cursor. mWordComposer.setCapitalizedModeAndPreviousWordAtStartComposingTime( inputTransaction.mShiftState, getPrevWordsInfoFromNthPreviousWordForSuggestion( - settingsValues.mSpacingAndPunctuations, 1 /* nthPreviousWord */)); + settingsValues.mSpacingAndPunctuations, + settingsValues.mSpacingAndPunctuations.isWordConnector( + mConnection.getCodePointBeforeCursor()) ? 2 : 1)); } mConnection.setComposingText(getTextWithUnderline( mWordComposer.getTypedWord()), 1); @@ -786,10 +744,6 @@ public final class InputLogic { mSuggestionStripViewAccessor.dismissAddToDictionaryHint(); } inputTransaction.setRequiresUpdateSuggestions(); - if (settingsValues.mIsInternal) { - LatinImeLoggerUtils.onNonSeparator((char)codePoint, inputTransaction.mEvent.mX, - inputTransaction.mEvent.mY); - } } /** @@ -852,9 +806,6 @@ public final class InputLogic { if (needsPrecedingSpace) { promotePhantomSpace(settingsValues); } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_handleSeparator(codePoint, wasComposingWord); - } if (!shouldAvoidSendingCode) { sendKeyCodePoint(settingsValues, codePoint); @@ -863,6 +814,7 @@ public final class InputLogic { if (Constants.CODE_SPACE == codePoint) { if (maybeDoubleSpacePeriod(inputTransaction)) { inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); + inputTransaction.setRequiresUpdateSuggestions(); mSpaceState = SpaceState.DOUBLE; } else if (!mSuggestedWords.isPunctuationSuggestions()) { mSpaceState = SpaceState.WEAK; @@ -932,10 +884,6 @@ public final class InputLogic { } 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); @@ -950,9 +898,6 @@ public final class InputLogic { inputTransaction.setRequiresUpdateSuggestions(); } else { if (mLastComposedWord.canRevertCommit()) { - if (inputTransaction.mSettingsValues.mIsInternal) { - LatinImeLoggerUtils.onAutoCorrectionCancellation(); - } revertCommit(inputTransaction); return; } @@ -961,9 +906,6 @@ public final class InputLogic { // 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 @@ -975,6 +917,11 @@ public final class InputLogic { 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.setCapitalizedModeAndPreviousWordAtStartComposingTime( + WordComposer.CAPS_MODE_OFF, + getPrevWordsInfoFromNthPreviousWordForSuggestion( + inputTransaction.mSettingsValues.mSpacingAndPunctuations, 1)); return; } } else if (SpaceState.SWAP_PUNCTUATION == inputTransaction.mSpaceState) { @@ -993,10 +940,6 @@ public final class InputLogic { mConnection.setSelection(mConnection.getExpectedSelectionEnd(), mConnection.getExpectedSelectionEnd()); mConnection.deleteSurroundingText(numCharsDeleted, 0); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_handleBackspace(numCharsDeleted, - false /* shouldUncommitLogUnit */); - } } else { // There is no selection, just delete one character. if (Constants.NOT_A_CURSOR_POSITION == mConnection.getExpectedSelectionEnd()) { @@ -1031,10 +974,6 @@ public final class InputLogic { final int lengthToDelete = Character.isSupplementaryCodePoint(codePointBeforeCursor) ? 2 : 1; mConnection.deleteSurroundingText(lengthToDelete, 0); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_handleBackspace(lengthToDelete, - true /* shouldUncommitLogUnit */); - } if (mDeleteCount > Constants.DELETE_ACCELERATE_AT) { final int codePointBeforeCursorToDeleteAgain = mConnection.getCodePointBeforeCursor(); @@ -1042,15 +981,12 @@ public final class InputLogic { final int lengthToDeleteAgain = Character.isSupplementaryCodePoint( codePointBeforeCursorToDeleteAgain) ? 2 : 1; mConnection.deleteSurroundingText(lengthToDeleteAgain, 0); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_handleBackspace(lengthToDeleteAgain, - true /* shouldUncommitLogUnit */); - } } } } } - if (inputTransaction.mSettingsValues.isSuggestionStripVisible() + if (inputTransaction.mSettingsValues + .isCurrentOrientationAllowingSuggestionsPerUserSettings() && inputTransaction.mSettingsValues.mSpacingAndPunctuations .mCurrentLanguageHasSpaces && !mConnection.isCursorFollowedByWordCharacter( @@ -1082,9 +1018,6 @@ public final class InputLogic { 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); - } inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); } } @@ -1168,10 +1101,6 @@ public final class InputLogic { final String textToInsert = inputTransaction.mSettingsValues.mSpacingAndPunctuations .mSentenceSeparatorAndSpace; mConnection.commitText(textToInsert, 1); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_maybeDoubleSpacePeriod(textToInsert, - false /* isBatchMode */); - } mWordComposer.discardPreviousWordForSuggestion(); return true; } @@ -1212,15 +1141,21 @@ public final class InputLogic { if (!mConnection.hasSelection()) { return; // No selection } + 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, create a new one. if (!mRecapitalizeStatus.isActive() - || !mRecapitalizeStatus.isSetAt(mConnection.getExpectedSelectionStart(), - mConnection.getExpectedSelectionEnd())) { + || !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.initialize(mConnection.getExpectedSelectionStart(), - mConnection.getExpectedSelectionEnd(), selectedText.toString(), + mRecapitalizeStatus.initialize(selectionStart, selectionEnd, selectedText.toString(), settingsValues.mLocale, settingsValues.mSpacingAndPunctuations.mSortedWordSeparators); // We trim leading and trailing whitespace. @@ -1228,11 +1163,8 @@ public final class InputLogic { } mConnection.finishComposingText(); mRecapitalizeStatus.rotate(); - final int numCharsDeleted = mConnection.getExpectedSelectionEnd() - - mConnection.getExpectedSelectionStart(); - mConnection.setSelection(mConnection.getExpectedSelectionEnd(), - mConnection.getExpectedSelectionEnd()); - mConnection.deleteSurroundingText(numCharsDeleted, 0); + mConnection.setSelection(selectionEnd, selectionEnd); + mConnection.deleteSurroundingText(numCharsSelected, 0); mConnection.commitText(mRecapitalizeStatus.getRecapitalizedString(), 0); mConnection.setSelection(mRecapitalizeStatus.getNewCursorStart(), mRecapitalizeStatus.getNewCursorEnd()); @@ -1250,7 +1182,7 @@ public final class InputLogic { mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps(); final int timeStampInSeconds = (int)TimeUnit.MILLISECONDS.toSeconds( System.currentTimeMillis()); - mSuggest.mDictionaryFacilitator.addToUserHistory(suggestion, wasAutoCapitalized, + mDictionaryFacilitator.addToUserHistory(suggestion, wasAutoCapitalized, prevWordsInfo, timeStampInSeconds, settingsValues.mBlockPotentiallyOffensive); } @@ -1269,7 +1201,7 @@ public final class InputLogic { return; } - final AsyncResultHolder<SuggestedWords> holder = new AsyncResultHolder<SuggestedWords>(); + final AsyncResultHolder<SuggestedWords> holder = new AsyncResultHolder<>(); mInputLogicHandler.getSuggestedWords(Suggest.SESSION_TYPING, SuggestedWords.NOT_A_SEQUENCE_NUMBER, new OnGetSuggestedWordsCallback() { @Override @@ -1349,7 +1281,7 @@ public final class InputLogic { // we just do not resume because it's safer. final int numberOfCharsInWordBeforeCursor = range.getNumberOfCharsInWordBeforeCursor(); if (numberOfCharsInWordBeforeCursor > expectedCursorPosition) return; - final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); + final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<>(); final String typedWord = range.mWord.toString(); if (includeResumedWordInSuggestions) { suggestions.add(new SuggestedWordInfo(typedWord, @@ -1462,8 +1394,7 @@ public final class InputLogic { } mConnection.deleteSurroundingText(deleteLength, 0); if (!TextUtils.isEmpty(prevWordsInfo.mPrevWord) && !TextUtils.isEmpty(committedWord)) { - mSuggest.mDictionaryFacilitator.cancelAddingUserHistory( - prevWordsInfo, committedWordString); + mDictionaryFacilitator.cancelAddingUserHistory(prevWordsInfo, committedWordString); } final String stringToCommit = originallyTypedWord + mLastComposedWord.mSeparatorString; final SpannableString textToCommit = new SpannableString(stringToCommit); @@ -1473,7 +1404,7 @@ public final class InputLogic { committedWord.length(), Object.class); final int lastCharIndex = textToCommit.length() - 1; // We will collect all suggestions in the following array. - final ArrayList<String> suggestions = CollectionUtils.newArrayList(); + final ArrayList<String> suggestions = new ArrayList<>(); // First, add the committed word to the list of suggestions. suggestions.add(committedWordString); for (final Object span : spans) { @@ -1515,17 +1446,7 @@ public final class InputLogic { mLatinIME.getCoordinatesForCurrentKeyboard(codePoints), prevWordsInfo); mConnection.setComposingText(textToCommit, 1); } - if (inputTransaction.mSettingsValues.mIsInternal) { - LatinImeLoggerUtils.onSeparator(mLastComposedWord.mSeparatorString, - Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); - } - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_revertCommit(committedWord.toString(), - originallyTypedWord.toString(), - mWordComposer.isBatchMode(), mLastComposedWord.mSeparatorString); - } - // Don't restart suggestion yet. We'll restart if the user deletes the - // separator. + // 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(); @@ -1609,8 +1530,9 @@ public final class InputLogic { return mConnection.getPrevWordsInfoFromNthPreviousWord( spacingAndPunctuations, nthPreviousWord); } else { - return LastComposedWord.NOT_A_COMPOSED_WORD == mLastComposedWord ? new PrevWordsInfo() - : new PrevWordsInfo(mLastComposedWord.mCommittedWord.toString()); + return LastComposedWord.NOT_A_COMPOSED_WORD == mLastComposedWord ? + PrevWordsInfo.BEGINNING_OF_SENTENCE : + new PrevWordsInfo(mLastComposedWord.mCommittedWord.toString()); } } @@ -1788,9 +1710,6 @@ public final class InputLogic { */ // TODO: replace these two parameters with an InputTransaction private void sendKeyCodePoint(final SettingsValues settingsValues, final int codePoint) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_sendKeyCodePoint(codePoint); - } // TODO: Remove this special handling of digit letters. // For backward compatibility. See {@link InputMethodService#sendKeyChar(char)}. if (codePoint >= '0' && codePoint <= '9') { @@ -1822,9 +1741,6 @@ public final class InputLogic { if (settingsValues.shouldInsertSpacesAutomatically() && settingsValues.mSpacingAndPunctuations.mCurrentLanguageHasSpaces && !mConnection.textBeforeCursorLooksLikeURL()) { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_promotePhantomSpace(); - } sendKeyCodePoint(settingsValues, Constants.CODE_SPACE); } } @@ -1866,9 +1782,6 @@ public final class InputLogic { mConnection.setComposingText(batchInputText, 1); } mConnection.endBatchEdit(); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onEndBatchInput(batchInputText, 0, suggestedWords); - } // Space state must be updated before calling updateShiftState mSpaceState = SpaceState.PHANTOM; keyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(settingsValues), @@ -1895,9 +1808,6 @@ public final class InputLogic { 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(settingsValues, typedWord, LastComposedWord.COMMIT_TYPE_USER_TYPED_WORD, separatorString); } @@ -1937,15 +1847,6 @@ public final class InputLogic { throw new RuntimeException("We have an auto-correction but the typed word " + "is empty? Impossible! I must commit suicide."); } - if (settingsValues.mIsInternal) { - 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); - } commitChosenWord(settingsValues, autoCorrection, LastComposedWord.COMMIT_TYPE_DECIDED_WORD, separator); if (!typedWord.equals(autoCorrection)) { diff --git a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java index f5f072b7a..a2ae74b20 100644 --- a/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java +++ b/java/src/com/android/inputmethod/latin/makedict/FormatSpec.java @@ -192,8 +192,9 @@ public final class FormatSpec { public static final int VERSION2 = 2; // Dictionary version used for testing. public static final int VERSION4_ONLY_FOR_TESTING = 399; - public static final int VERSION4 = 401; - public static final int VERSION4_DEV = 402; + 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; diff --git a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java index 853392200..31cb59756 100644 --- a/java/src/com/android/inputmethod/latin/makedict/WordProperty.java +++ b/java/src/com/android/inputmethod/latin/makedict/WordProperty.java @@ -18,7 +18,6 @@ package com.android.inputmethod.latin.makedict; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.BinaryDictionary; -import com.android.inputmethod.latin.utils.CollectionUtils; import com.android.inputmethod.latin.utils.CombinedFormatUtils; import com.android.inputmethod.latin.utils.StringUtils; @@ -35,6 +34,8 @@ public final class WordProperty implements Comparable<WordProperty> { 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; @@ -51,6 +52,7 @@ public final class WordProperty implements Comparable<WordProperty> { mProbabilityInfo = probabilityInfo; mShortcutTargets = shortcutTargets; mBigrams = bigrams; + mIsBeginningOfSentence = false; mIsNotAWord = isNotAWord; mIsBlacklistEntry = isBlacklistEntry; mHasBigrams = bigrams != null && !bigrams.isEmpty(); @@ -75,8 +77,9 @@ public final class WordProperty implements Comparable<WordProperty> { final ArrayList<Integer> shortcutProbabilities) { mWord = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints); mProbabilityInfo = createProbabilityInfoFromArray(probabilityInfo); - mShortcutTargets = CollectionUtils.newArrayList(); - mBigrams = CollectionUtils.newArrayList(); + mShortcutTargets = new ArrayList<>(); + mBigrams = new ArrayList<>(); + mIsBeginningOfSentence = false; mIsNotAWord = isNotAWord; mIsBlacklistEntry = isBlacklisted; mHasShortcuts = hasShortcuts; 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/DecayingExpandableBinaryDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java index 06bdba054..be658ceff 100644 --- a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java +++ b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java @@ -31,7 +31,6 @@ import java.util.Map; * model. */ public abstract class DecayingExpandableBinaryDictionaryBase extends ExpandableBinaryDictionary { - private static final String TAG = DecayingExpandableBinaryDictionaryBase.class.getSimpleName(); private static final boolean DBG_DUMP_ON_CLOSE = false; /** Any pair being typed or picked */ 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/PersonalizationDictionarySessionRegistrar.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegistrar.java index 9bef7a198..450644032 100644 --- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegistrar.java +++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationDictionarySessionRegistrar.java @@ -19,18 +19,15 @@ package com.android.inputmethod.latin.personalization; import android.content.Context; import android.content.res.Configuration; -import com.android.inputmethod.latin.DictionaryFacilitatorForSuggest; -import com.android.inputmethod.latin.utils.DistracterFilter; +import com.android.inputmethod.latin.DictionaryFacilitator; public class PersonalizationDictionarySessionRegistrar { public static void init(final Context context, - final DictionaryFacilitatorForSuggest dictionaryFacilitator, - final DistracterFilter distracterFilter) { + final DictionaryFacilitator dictionaryFacilitator) { } public static void onConfigurationChanged(final Context context, final Configuration conf, - final DictionaryFacilitatorForSuggest dictionaryFacilitator, - final DistracterFilter distracterFilter) { + final DictionaryFacilitator dictionaryFacilitator) { } public static void onUpdateData(final Context context, final String type) { diff --git a/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java b/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java index 6ef505e76..aac40940b 100644 --- a/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java +++ b/java/src/com/android/inputmethod/latin/personalization/PersonalizationHelper.java @@ -16,12 +16,11 @@ package com.android.inputmethod.latin.personalization; -import com.android.inputmethod.latin.utils.CollectionUtils; -import com.android.inputmethod.latin.utils.FileUtils; - import android.content.Context; import android.util.Log; +import com.android.inputmethod.latin.utils.FileUtils; + import java.io.File; import java.io.FilenameFilter; import java.lang.ref.SoftReference; @@ -33,9 +32,9 @@ 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(); + sLangPersonalizationDictCache = new ConcurrentHashMap<>(); public static UserHistoryDictionary getUserHistoryDictionary( final Context context, final Locale locale) { @@ -54,8 +53,7 @@ public class PersonalizationHelper { } } final UserHistoryDictionary dict = new UserHistoryDictionary(context, locale); - sLangUserHistoryDictCache.put(localeStr, - new SoftReference<UserHistoryDictionary>(dict)); + sLangUserHistoryDictCache.put(localeStr, new SoftReference<>(dict)); return dict; } } @@ -108,8 +106,7 @@ public class PersonalizationHelper { } } final PersonalizationDictionary dict = new PersonalizationDictionary(context, locale); - sLangPersonalizationDictCache.put( - localeStr, new SoftReference<PersonalizationDictionary>(dict)); + sLangPersonalizationDictCache.put(localeStr, new SoftReference<>(dict)); return dict; } } diff --git a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java index f89caf921..67ad54fb7 100644 --- a/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java +++ b/java/src/com/android/inputmethod/latin/personalization/UserHistoryDictionary.java @@ -23,6 +23,7 @@ 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 java.io.File; import java.util.Locale; @@ -60,10 +61,11 @@ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBas * @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 int timestamp, final DistracterFilter distracterFilter) { final String prevWord = prevWordsInfo.mPrevWord; if (word.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH || (prevWord != null && prevWord.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH)) { @@ -71,8 +73,9 @@ public class UserHistoryDictionary extends DecayingExpandableBinaryDictionaryBas } final int frequency = isValid ? FREQUENCY_FOR_WORDS_IN_DICTS : FREQUENCY_FOR_WORDS_NOT_IN_DICTS; - userHistoryDictionary.addUnigramEntry(word, frequency, null /* shortcutTarget */, - 0 /* shortcutFreq */, false /* isNotAWord */, false /* isBlacklisted */, timestamp); + 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; diff --git a/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java b/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java index 39977e76f..31fa86774 100644 --- a/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java +++ b/java/src/com/android/inputmethod/latin/settings/AdditionalSubtypeSettings.java @@ -47,7 +47,6 @@ 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; @@ -101,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(); @@ -369,7 +368,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 @@ -516,8 +514,7 @@ public final class AdditionalSubtypeSettings extends PreferenceFragment { localeString, keyboardLayoutSetName); } - private AlertDialog createDialog( - @SuppressWarnings("unused") final SubtypePreference subtypePref) { + private AlertDialog createDialog(final SubtypePreference subtypePref) { final AlertDialog.Builder builder = new AlertDialog.Builder( DialogUtils.getPlatformDialogThemeContext(getActivity())); builder.setTitle(R.string.custom_input_styles_title) @@ -555,7 +552,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 c4c1234fc..9e7e07e11 100644 --- a/java/src/com/android/inputmethod/latin/settings/DebugSettings.java +++ b/java/src/com/android/inputmethod/latin/settings/DebugSettings.java @@ -29,7 +29,6 @@ import android.preference.PreferenceScreen; import com.android.inputmethod.latin.Dictionary; import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver; -import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug; import com.android.inputmethod.latin.utils.ApplicationUtils; @@ -40,8 +39,6 @@ public final class DebugSettings extends PreferenceFragment 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_KEY_PREVIEW_SHOW_UP_START_SCALE = "pref_key_preview_show_up_start_scale"; public static final String PREF_KEY_PREVIEW_DISMISS_END_SCALE = @@ -58,11 +55,8 @@ public final class DebugSettings extends PreferenceFragment 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 static final boolean SHOW_STATISTICS_LOGGING = false; - private boolean mServiceNeedsRestart = false; private CheckBoxPreference mDebugMode; - private CheckBoxPreference mStatisticsLoggingPref; @Override public void onCreate(Bundle icicle) { @@ -71,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) { @@ -163,27 +142,22 @@ public final class DebugSettings extends PreferenceFragment @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)) { + 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; } } diff --git a/java/src/com/android/inputmethod/latin/settings/Settings.java b/java/src/com/android/inputmethod/latin/settings/Settings.java index d4f6bcd10..235847799 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; @@ -60,6 +61,10 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang "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 = @@ -327,10 +332,6 @@ public final class Settings implements SharedPreferences.OnSharedPreferenceChang R.array.keypress_vibration_durations, DEFAULT_KEYPRESS_VIBRATION_DURATION)); } - public static boolean readUsabilityStudyMode(final SharedPreferences prefs) { - return prefs.getBoolean(DebugSettings.PREF_USABILITY_STUDY_MODE, true); - } - public static float readKeyPreviewAnimationScale(final SharedPreferences prefs, final String prefKey, final float defaultValue) { final float fraction = prefs.getFloat(prefKey, UNDEFINED_PREFERENCE_VALUE_FLOAT); diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java index e1d38e7c4..af46aad96 100644 --- a/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java +++ b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java @@ -41,7 +41,6 @@ import com.android.inputmethod.keyboard.KeyboardTheme; import com.android.inputmethod.latin.AudioAndHapticFeedbackManager; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.SubtypeSwitcher; -import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.setup.LauncherIconVisibilityManager; import com.android.inputmethod.latin.userdictionary.UserDictionaryList; import com.android.inputmethod.latin.userdictionary.UserDictionarySettings; @@ -59,7 +58,7 @@ 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 void setPreferenceEnabled(final String preferenceKey, final boolean enabled) { final Preference preference = findPreference(preferenceKey); @@ -152,10 +151,6 @@ public final class SettingsFragment extends InputMethodSettingsFragment 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 boolean showVoiceKeyOption = res.getBoolean( R.bool.config_enable_show_voice_key_option); @@ -169,6 +164,13 @@ public final class SettingsFragment extends InputMethodSettingsFragment removePreference(Settings.PREF_VIBRATE_ON, generalSettings); removePreference(Settings.PREF_VIBRATION_DURATION_SETTINGS, advancedSettings); } + if (!Settings.ENABLE_SHOW_LANGUAGE_SWITCH_KEY_SETTINGS) { + removePreference( + Settings.PREF_SHOW_LANGUAGE_SWITCH_KEY, advancedSettings); + removePreference( + Settings.PREF_INCLUDE_OTHER_IMES_IN_LANGUAGE_SWITCH_LIST, advancedSettings); + } + // TODO: consolidate key preview dismiss delay with the key preview animation parameters. if (!Settings.readFromBuildConfigIfToShowKeyPreviewPopupOption(res)) { @@ -199,9 +201,6 @@ public final class SettingsFragment extends InputMethodSettingsFragment removePreference(Settings.PREF_SHOW_SETUP_WIZARD_ICON, advancedSettings); } - 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 = @@ -299,9 +298,6 @@ 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()); } diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java index 16fd05877..6c6e79e0f 100644 --- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java +++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java @@ -125,9 +125,11 @@ public final class SettingsValues { 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); @@ -171,7 +173,7 @@ public final class SettingsValues { ResourceUtils.getFloatFromFraction( res, R.fraction.config_key_preview_dismiss_end_scale)); mDisplayOrientation = res.getConfiguration().orientation; - mAppWorkarounds = new AsyncResultHolder<AppWorkaroundsUtils>(); + mAppWorkarounds = new AsyncResultHolder<>(); final PackageInfo packageInfo = TargetPackageInfoGetterTask.getCachedPackageInfo( mInputAttributes.mTargetApplicationPackageName); if (null != packageInfo) { @@ -188,10 +190,11 @@ public final class SettingsValues { public boolean isSuggestionsRequested() { return mInputAttributes.mIsSettingsSuggestionStripOn - && (mCorrectionEnabled || isSuggestionStripVisible()); + && (mCorrectionEnabled + || isCurrentOrientationAllowingSuggestionsPerUserSettings()); } - public boolean isSuggestionStripVisible() { + public boolean isCurrentOrientationAllowingSuggestionsPerUserSettings() { return (mSuggestionVisibility == SUGGESTION_VISIBILITY_SHOW_VALUE) || (mSuggestionVisibility == SUGGESTION_VISIBILITY_SHOW_ONLY_PORTRAIT_VALUE && mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT); 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 5072fabd6..bcac05a6a 100644 --- a/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java +++ b/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java @@ -37,7 +37,6 @@ 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.LeakGuardHandlerWrapper; import java.util.ArrayList; @@ -482,7 +481,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 65ebcf5f1..8d495646d 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -27,7 +27,6 @@ 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; @@ -77,7 +76,7 @@ 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; @@ -94,7 +93,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService // 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 = new TreeMap<>(); mLanguageToScript.put("cs", SCRIPT_LATIN); mLanguageToScript.put("da", SCRIPT_LATIN); mLanguageToScript.put("de", SCRIPT_LATIN); @@ -255,7 +254,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]; } @@ -441,8 +440,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 e951f5a89..cc80e6f21 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerSession.java @@ -24,7 +24,6 @@ import android.view.textservice.SuggestionsInfo; import android.view.textservice.TextInfo; import com.android.inputmethod.latin.PrevWordsInfo; -import com.android.inputmethod.latin.utils.CollectionUtils; import java.util.ArrayList; @@ -44,10 +43,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); diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java index cf26000d5..d7953e6e7 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java @@ -28,7 +28,6 @@ import android.view.textservice.SuggestionsInfo; import android.view.textservice.TextInfo; import com.android.inputmethod.compat.SuggestionsInfoCompatUtils; -import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.latin.Constants; import com.android.inputmethod.latin.Dictionary; import com.android.inputmethod.latin.PrevWordsInfo; @@ -69,7 +68,7 @@ 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(final String query, final PrevWordsInfo prevWordsInfo) { diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java b/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java index 1ffe50681..b33739fc1 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/DictAndKeyboard.java @@ -16,11 +16,11 @@ 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. @@ -28,19 +28,15 @@ import com.android.inputmethod.keyboard.ProximityInfo; public final class DictAndKeyboard { public final Dictionary mDictionary; public final Keyboard mKeyboard; - private final Keyboard mManualShiftedKeyboard; 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 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 ba2e0c309..1331d52d5 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java @@ -23,7 +23,6 @@ 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; @@ -47,7 +46,7 @@ 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. diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java index e90b15ca5..346aea34a 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java +++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestions.java @@ -23,23 +23,17 @@ 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 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; diff --git a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java index 7fd64c4bf..aa59db678 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/MoreSuggestionsView.java @@ -22,11 +22,12 @@ 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.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestionKey; -import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestionsListener; /** * A view that renders a virtual {@link MoreSuggestions}. It handles rendering of keys and detecting @@ -35,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 int index, final SuggestedWordInfo info); + } + public MoreSuggestionsView(final Context context, final AttributeSet attrs) { this(context, attrs, R.attr.moreKeysKeyboardViewStyle); } diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java index 619804afa..4a5a7f004 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java @@ -47,12 +47,9 @@ 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.settings.Settings; -import com.android.inputmethod.latin.suggestions.MoreSuggestions.MoreSuggestionsListener; -import com.android.inputmethod.latin.utils.CollectionUtils; +import com.android.inputmethod.latin.suggestions.MoreSuggestionsView.MoreSuggestionsListener; import com.android.inputmethod.latin.utils.ImportantNoticeUtils; -import com.android.inputmethod.research.ResearchLogger; import java.util.ArrayList; @@ -78,9 +75,9 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick 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; @@ -90,13 +87,16 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick private final StripVisibilityGroup mStripVisibilityGroup; private static class StripVisibilityGroup { + private final View mSuggestionStripView; private final View mSuggestionsStrip; private final View mVoiceKey; private final View mAddToDictionaryStrip; private final View mImportantNoticeStrip; - public StripVisibilityGroup(final View suggestionsStrip, final View voiceKey, - final View addToDictionaryStrip, final View importantNoticeStrip) { + public StripVisibilityGroup(final View suggestionStripView, + final ViewGroup suggestionsStrip, final ImageButton voiceKey, + final ViewGroup addToDictionaryStrip, final View importantNoticeStrip) { + mSuggestionStripView = suggestionStripView; mSuggestionsStrip = suggestionsStrip; mVoiceKey = voiceKey; mAddToDictionaryStrip = addToDictionaryStrip; @@ -104,7 +104,10 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick showSuggestionsStrip(false /* voiceKeyEnabled */); } - public void setLayoutDirection(final int layoutDirection) { + 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); @@ -156,7 +159,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick 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(mSuggestionsStrip, mVoiceKey, + mStripVisibilityGroup = new StripVisibilityGroup(this, mSuggestionsStrip, mVoiceKey, mAddToDictionaryStrip, mImportantNoticeStrip); for (int pos = 0; pos < SuggestedWords.MAX_SUGGESTIONS; pos++) { @@ -217,16 +220,10 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick public void setSuggestions(final SuggestedWords suggestedWords, final boolean isRtlLanguage) { clear(); - final int layoutDirection = isRtlLanguage ? ViewCompat.LAYOUT_DIRECTION_RTL - : ViewCompat.LAYOUT_DIRECTION_LTR; - setLayoutDirection(layoutDirection); - mStripVisibilityGroup.setLayoutDirection(layoutDirection); + mStripVisibilityGroup.setLayoutDirection(isRtlLanguage); mSuggestedWords = suggestedWords; mSuggestionsCountInStrip = mLayoutHelper.layoutAndReturnSuggestionCountInStrip( mSuggestedWords, mSuggestionsStrip, this); - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.suggestionStripView_setSuggestions(mSuggestedWords); - } mStripVisibilityGroup.showSuggestionsStrip(isVoiceKeyEnabled()); } diff --git a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java index 21426d1eb..80d4cc44f 100644 --- a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java +++ b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryAddWordContents.java @@ -256,7 +256,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 97a924d7b..624783a70 100644 --- a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryList.java +++ b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionaryList.java @@ -56,7 +56,7 @@ public class UserDictionaryList extends PreferenceFragment { 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; diff --git a/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java b/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java index 2bb30a2ba..3ca7c7e1c 100644 --- a/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/AdditionalSubtypeUtils.java @@ -95,8 +95,7 @@ public final class AdditionalSubtypeUtils { 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 String elems[] = prefSubtype.split(LOCALE_AND_LAYOUT_SEPARATOR); if (elems.length != LENGTH_WITHOUT_EXTRA_VALUE diff --git a/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java b/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java index 22b9b77d2..34ee2152a 100644 --- a/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/AutoCorrectionUtils.java @@ -16,12 +16,11 @@ package com.android.inputmethod.latin.utils; -import com.android.inputmethod.latin.BinaryDictionary; +import android.util.Log; + import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; -import android.util.Log; - public final class AutoCorrectionUtils { private static final boolean DBG = LatinImeLogger.sDBG; private static final String TAG = AutoCorrectionUtils.class.getSimpleName(); @@ -36,7 +35,9 @@ public final class AutoCorrectionUtils { 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. diff --git a/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java b/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java index 702688f93..936219332 100644 --- a/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/CapsModeUtils.java @@ -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 @@ -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; } } @@ -210,11 +225,14 @@ public final class CapsModeUtils { // 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) @@ -228,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. @@ -235,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; @@ -247,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; } @@ -275,6 +301,15 @@ public final class CapsModeUtils { } 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 bbfa0f091..e3aef29ba 100644 --- a/java/src/com/android/inputmethod/latin/utils/CollectionUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/CollectionUtils.java @@ -16,93 +16,21 @@ 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> SparseArray<E> newSparseArray() { - return new SparseArray<E>(); - } - public static <E> ArrayList<E> arrayAsList(final E[] array, final int start, final int end) { if (array == null) { throw new NullPointerException(); @@ -111,7 +39,7 @@ public final class CollectionUtils { throw new IllegalArgumentException(); } - final ArrayList<E> list = newArrayList(end - start); + final ArrayList<E> list = new ArrayList<>(end - start); for (int i = start; i < end; i++) { list.add(array[i]); } diff --git a/java/src/com/android/inputmethod/latin/utils/CsvUtils.java b/java/src/com/android/inputmethod/latin/utils/CsvUtils.java index b18a1d83b..a21a1373b 100644 --- a/java/src/com/android/inputmethod/latin/utils/CsvUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/CsvUtils.java @@ -209,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/DictionaryInfoUtils.java b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java index 315913e2f..d76ea10c0 100644 --- a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java @@ -336,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); diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java index f1057da0b..787e4a59d 100644 --- a/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java +++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilter.java @@ -16,129 +16,14 @@ package com.android.inputmethod.latin.utils; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import android.content.Context; -import android.content.res.Resources; -import android.text.InputType; -import android.util.Log; -import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodSubtype; -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.PrevWordsInfo; -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; - -/** - * This class is used to prevent distracters being added to personalization - * or user history dictionaries - */ -public class DistracterFilter { - private static final String TAG = DistracterFilter.class.getSimpleName(); - - private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120; - - private final Context mContext; - private final Map<Locale, InputMethodSubtype> mLocaleToSubtypeMap; - private final Map<Locale, Keyboard> mLocaleToKeyboardMap; - private final Suggest mSuggest; - private Keyboard mKeyboard; - - // If the score of the top suggestion exceeds this value, the tested word (e.g., - // an OOV, a misspelling, or an in-vocabulary word) would be considered as a distracter to - // words in dictionary. The greater the threshold is, the less likely the tested word would - // become a distracter, which means the tested word will be more likely to be added to - // the dictionary. - private static final float DISTRACTER_WORD_SCORE_THRESHOLD = 2.0f; - - // Create empty distracter filter. - public DistracterFilter() { - this(null, new ArrayList<InputMethodSubtype>()); - } - - /** - * Create a DistracterFilter instance. - * - * @param context the context. - * @param enabledSubtypes the enabled subtypes. - */ - public DistracterFilter(final Context context, final List<InputMethodSubtype> enabledSubtypes) { - mContext = context; - mLocaleToSubtypeMap = new HashMap<>(); - if (enabledSubtypes != null) { - for (final InputMethodSubtype subtype : enabledSubtypes) { - final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype); - if (mLocaleToSubtypeMap.containsKey(locale)) { - // Multiple subtypes are enabled for one locale. - // TODO: Investigate what we should do for this case. - continue; - } - mLocaleToSubtypeMap.put(locale, subtype); - } - } - mLocaleToKeyboardMap = new HashMap<>(); - mSuggest = new Suggest(); - mKeyboard = null; - } - - private static boolean suggestionExceedsDistracterThreshold( - final SuggestedWordInfo suggestion, final String consideredWord, - final float distracterThreshold) { - if (null != suggestion) { - final int suggestionScore = suggestion.mScore; - final float normalizedScore = BinaryDictionaryUtils.calcNormalizedScore( - consideredWord, suggestion.mWord, suggestionScore); - if (normalizedScore > distracterThreshold) { - return true; - } - } - return false; - } - - private void loadKeyboardForLocale(final Locale newLocale) { - final Keyboard cachedKeyboard = mLocaleToKeyboardMap.get(newLocale); - if (cachedKeyboard != null) { - mKeyboard = cachedKeyboard; - return; - } - final InputMethodSubtype subtype = mLocaleToSubtypeMap.get(newLocale); - if (subtype == null) { - return; - } - final EditorInfo editorInfo = new EditorInfo(); - editorInfo.inputType = InputType.TYPE_CLASS_TEXT; - final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder( - mContext, editorInfo); - final Resources res = mContext.getResources(); - final int keyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res); - final int keyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res); - builder.setKeyboardGeometry(keyboardWidth, keyboardHeight); - builder.setSubtype(subtype); - builder.setIsSpellChecker(false /* isSpellChecker */); - final KeyboardLayoutSet layoutSet = builder.build(); - mKeyboard = layoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET); - } - - private void loadDictionariesForLocale(final Locale newlocale) throws InterruptedException { - mSuggest.mDictionaryFacilitator.resetDictionaries(mContext, newlocale, - false /* useContactsDict */, false /* usePersonalizedDicts */, - false /* forceReloadMainDictionary */, null /* listener */); - mSuggest.mDictionaryFacilitator.waitForLoadingMainDictionary( - TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS, TimeUnit.SECONDS); - } +public interface DistracterFilter { /** * Determine whether a word is a distracter to words in dictionaries. * @@ -149,56 +34,25 @@ public class DistracterFilter { * @return true if testedWord is a distracter, otherwise false. */ public boolean isDistracterToWordsInDictionaries(final PrevWordsInfo prevWordsInfo, - final String testedWord, final Locale locale) { - if (locale == null) { - return false; - } - if (!locale.equals(mSuggest.mDictionaryFacilitator.getLocale())) { - if (!mLocaleToSubtypeMap.containsKey(locale)) { - Log.e(TAG, "Locale " + locale + " is not enabled."); - // TODO: Investigate what we should do for disabled locales. - return false; - } - loadKeyboardForLocale(locale); - // Reset dictionaries for the locale. - try { - loadDictionariesForLocale(locale); - } catch (final InterruptedException e) { - Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter", e); - return false; - } - } - if (mKeyboard == null) { + 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; } - final WordComposer composer = new WordComposer(); - final int[] codePoints = StringUtils.toCodePointArray(testedWord); - final int[] coordinates = mKeyboard.getCoordinates(codePoints); - composer.setComposingWord(codePoints, coordinates, prevWordsInfo); - final int trailingSingleQuotesCount = StringUtils.getTrailingSingleQuotesCount(testedWord); - final String consideredWord = trailingSingleQuotesCount > 0 ? - testedWord.substring(0, testedWord.length() - trailingSingleQuotesCount) : - testedWord; - final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<Boolean>(); - final OnGetSuggestedWordsCallback callback = new OnGetSuggestedWordsCallback() { - @Override - public void onGetSuggestedWords(final SuggestedWords suggestedWords) { - if (suggestedWords != null && suggestedWords.size() > 1) { - // The suggestedWordInfo at 0 is the typed word. The 1st suggestion from - // the decoder is at index 1. - final SuggestedWordInfo firstSuggestion = suggestedWords.getInfo(1); - final boolean hasStrongDistractor = suggestionExceedsDistracterThreshold( - firstSuggestion, consideredWord, DISTRACTER_WORD_SCORE_THRESHOLD); - holder.set(hasStrongDistractor); - } - } - }; - mSuggest.getSuggestedWords(composer, prevWordsInfo, mKeyboard.getProximityInfo(), - true /* blockOffensiveWords */, true /* isCorrectionEnbaled */, - null /* additionalFeaturesOptions */, 0 /* sessionId */, - SuggestedWords.NOT_A_SEQUENCE_NUMBER, callback); + @Override + public void close() { + } - return holder.get(false /* defaultValue */, Constants.GET_SUGGESTED_WORDS_TIMEOUT); - } + @Override + public void updateEnabledSubtypes(List<InputMethodSubtype> enabledSubtypes) { + } + }; } diff --git a/java/src/com/android/inputmethod/latin/utils/DistracterFilterUsingSuggestion.java b/java/src/com/android/inputmethod/latin/utils/DistracterFilterUsingSuggestion.java new file mode 100644 index 000000000..b9c7f5671 --- /dev/null +++ b/java/src/com/android/inputmethod/latin/utils/DistracterFilterUsingSuggestion.java @@ -0,0 +1,243 @@ +/* + * 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.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import android.content.Context; +import android.content.res.Resources; +import android.text.InputType; +import android.util.Log; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodSubtype; + +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.Dictionary; +import com.android.inputmethod.latin.DictionaryFacilitator; +import com.android.inputmethod.latin.PrevWordsInfo; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; +import com.android.inputmethod.latin.WordComposer; + +/** + * This class is used to prevent distracters being added to personalization + * or user history dictionaries + */ +public class DistracterFilterUsingSuggestion implements DistracterFilter { + private static final String TAG = DistracterFilterUsingSuggestion.class.getSimpleName(); + private static final boolean DEBUG = false; + + private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120; + + private final Context mContext; + private final Map<Locale, InputMethodSubtype> mLocaleToSubtypeMap; + private final Map<Locale, Keyboard> mLocaleToKeyboardMap; + private final DictionaryFacilitator mDictionaryFacilitator; + private Keyboard mKeyboard; + private final Object mLock = new Object(); + + /** + * Create a DistracterFilter instance. + * + * @param context the context. + */ + public DistracterFilterUsingSuggestion(final Context context) { + mContext = context; + mLocaleToSubtypeMap = new HashMap<>(); + mLocaleToKeyboardMap = new HashMap<>(); + mDictionaryFacilitator = new DictionaryFacilitator(); + mKeyboard = null; + } + + @Override + public void close() { + mDictionaryFacilitator.closeDictionaries(); + } + + @Override + public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) { + final Map<Locale, InputMethodSubtype> newLocaleToSubtypeMap = new HashMap<>(); + if (enabledSubtypes != null) { + for (final InputMethodSubtype subtype : enabledSubtypes) { + final Locale locale = SubtypeLocaleUtils.getSubtypeLocale(subtype); + if (newLocaleToSubtypeMap.containsKey(locale)) { + // Multiple subtypes are enabled for one locale. + // TODO: Investigate what we should do for this case. + continue; + } + newLocaleToSubtypeMap.put(locale, subtype); + } + } + if (mLocaleToSubtypeMap.equals(newLocaleToSubtypeMap)) { + // Enabled subtypes have not been changed. + return; + } + synchronized (mLock) { + mLocaleToSubtypeMap.clear(); + mLocaleToSubtypeMap.putAll(newLocaleToSubtypeMap); + mLocaleToKeyboardMap.clear(); + } + } + + private boolean isDistracter( + final SuggestionResults suggestionResults, final String consideredWord) { + int perfectMatchProbability = Dictionary.NOT_A_PROBABILITY; + for (final SuggestedWordInfo suggestedWordInfo : suggestionResults) { + if (suggestedWordInfo.mWord.equals(consideredWord)) { + perfectMatchProbability = mDictionaryFacilitator.getFrequency(consideredWord); + continue; + } + // Exact match can include case errors, accent errors, digraph conversions. + final boolean isExactMatch = suggestedWordInfo.isExactMatch(); + final boolean isExactMatchWithIntentionalOmission = + suggestedWordInfo.isExactMatchWithIntentionalOmission(); + + if (DEBUG) { + final float normalizedScore = BinaryDictionaryUtils.calcNormalizedScore( + consideredWord, suggestedWordInfo.mWord, suggestedWordInfo.mScore); + Log.d(TAG, "consideredWord: " + consideredWord); + Log.d(TAG, "top suggestion: " + suggestedWordInfo.mWord); + Log.d(TAG, "suggestionScore: " + suggestedWordInfo.mScore); + Log.d(TAG, "normalizedScore: " + normalizedScore); + Log.d(TAG, "isExactMatch: " + isExactMatch); + Log.d(TAG, "isExactMatchWithIntentionalOmission: " + + isExactMatchWithIntentionalOmission); + } + if (perfectMatchProbability != Dictionary.NOT_A_PROBABILITY) { + final int topNonPerfectProbability = mDictionaryFacilitator.getFrequency( + suggestedWordInfo.mWord); + if (DEBUG) { + Log.d(TAG, "perfectMatchProbability: " + perfectMatchProbability); + Log.d(TAG, "topNonPerfectProbability: " + topNonPerfectProbability); + } + if (perfectMatchProbability > topNonPerfectProbability) { + return false; + } + } + return isExactMatch || isExactMatchWithIntentionalOmission; + } + return false; + } + + private void loadKeyboardForLocale(final Locale newLocale) { + final Keyboard cachedKeyboard = mLocaleToKeyboardMap.get(newLocale); + if (cachedKeyboard != null) { + mKeyboard = cachedKeyboard; + return; + } + final InputMethodSubtype subtype; + synchronized (mLock) { + subtype = mLocaleToSubtypeMap.get(newLocale); + } + if (subtype == null) { + return; + } + final EditorInfo editorInfo = new EditorInfo(); + editorInfo.inputType = InputType.TYPE_CLASS_TEXT; + final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder( + mContext, editorInfo); + final Resources res = mContext.getResources(); + final int keyboardWidth = ResourceUtils.getDefaultKeyboardWidth(res); + final int keyboardHeight = ResourceUtils.getDefaultKeyboardHeight(res); + builder.setKeyboardGeometry(keyboardWidth, keyboardHeight); + builder.setSubtype(subtype); + builder.setIsSpellChecker(false /* isSpellChecker */); + final KeyboardLayoutSet layoutSet = builder.build(); + mKeyboard = layoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET); + } + + 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) { + if (!mLocaleToSubtypeMap.containsKey(locale)) { + Log.e(TAG, "Locale " + locale + " is not enabled."); + // TODO: Investigate what we should do for disabled locales. + return false; + } + loadKeyboardForLocale(locale); + // Reset dictionaries for the locale. + try { + loadDictionariesForLocale(locale); + } catch (final InterruptedException e) { + Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter", + e); + return false; + } + } + } + if (mKeyboard == null) { + return false; + } + final WordComposer composer = new WordComposer(); + final int[] codePoints = StringUtils.toCodePointArray(testedWord); + final int[] coordinates = mKeyboard.getCoordinates(codePoints); + composer.setComposingWord(codePoints, coordinates, PrevWordsInfo.EMPTY_PREV_WORDS_INFO); + + final int trailingSingleQuotesCount = StringUtils.getTrailingSingleQuotesCount(testedWord); + final String consideredWord = trailingSingleQuotesCount > 0 ? + testedWord.substring(0, testedWord.length() - trailingSingleQuotesCount) : + testedWord; + final AsyncResultHolder<Boolean> holder = new AsyncResultHolder<>(); + ExecutorUtils.getExecutor("check distracters").execute(new Runnable() { + @Override + public void run() { + final SuggestionResults suggestionResults = + mDictionaryFacilitator.getSuggestionResults( + composer, PrevWordsInfo.EMPTY_PREV_WORDS_INFO, + mKeyboard.getProximityInfo(), true /* blockOffensiveWords */, + null /* additionalFeaturesOptions */, 0 /* sessionId */, + null /* rawSuggestions */); + if (suggestionResults.isEmpty()) { + holder.set(false); + return; + } + holder.set(isDistracter(suggestionResults, consideredWord)); + } + }); + // It's OK to block the distracter filtering, but the dictionary lookup should be done + // sequentially using ExecutorUtils. + return holder.get(false /* defaultValue */, Constants.GET_SUGGESTED_WORDS_TIMEOUT); + } +} diff --git a/java/src/com/android/inputmethod/latin/utils/ExecutorUtils.java b/java/src/com/android/inputmethod/latin/utils/ExecutorUtils.java index ed502ed3d..61da1b789 100644 --- a/java/src/com/android/inputmethod/latin/utils/ExecutorUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/ExecutorUtils.java @@ -19,22 +19,42 @@ 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, PrioritizedSerialExecutor> - sExecutorMap = CollectionUtils.newConcurrentHashMap(); + 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 dictionary name. + * Gets the executor for the given id. */ - public static PrioritizedSerialExecutor getExecutor(final String dictName) { - PrioritizedSerialExecutor executor = sExecutorMap.get(dictName); + public static ExecutorService getExecutor(final String id) { + ExecutorService executor = sExecutorMap.get(id); if (executor == null) { synchronized(sExecutorMap) { - executor = new PrioritizedSerialExecutor(); - sExecutorMap.put(dictName, executor); + executor = sExecutorMap.get(id); + if (executor == null) { + executor = Executors.newSingleThreadExecutor(new ThreadFactoryWithId(id)); + sExecutorMap.put(id, executor); + } } } return executor; @@ -46,7 +66,7 @@ public class ExecutorUtils { @UsedForTesting public static void shutdownAllExecutors() { synchronized(sExecutorMap) { - for (final PrioritizedSerialExecutor executor : sExecutorMap.values()) { + for (final ExecutorService executor : sExecutorMap.values()) { executor.execute(new Runnable() { @Override public void run() { 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/JsonUtils.java b/java/src/com/android/inputmethod/latin/utils/JsonUtils.java index 764ef72ce..6dd8d9711 100644 --- a/java/src/com/android/inputmethod/latin/utils/JsonUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/JsonUtils.java @@ -37,7 +37,7 @@ public final class JsonUtils { private static final String EMPTY_STRING = ""; public static List<Object> jsonStrToList(final String s) { - final ArrayList<Object> list = CollectionUtils.newArrayList(); + final ArrayList<Object> list = new ArrayList<>(); final JsonReader reader = new JsonReader(new StringReader(s)); try { reader.beginArray(); diff --git a/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java index aaf4a4064..4248bebf6 100644 --- a/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java +++ b/java/src/com/android/inputmethod/latin/utils/LanguageModelParam.java @@ -19,11 +19,12 @@ package com.android.inputmethod.latin.utils; import android.util.Log; import com.android.inputmethod.latin.Dictionary; -import com.android.inputmethod.latin.DictionaryFacilitatorForSuggest; +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 @@ -79,14 +80,13 @@ public final class LanguageModelParam { // Process a list of words and return a list of {@link LanguageModelParam} objects. public static ArrayList<LanguageModelParam> createLanguageModelParamsFrom( - final ArrayList<String> tokens, final int timestamp, - final DictionaryFacilitatorForSuggest dictionaryFacilitator, + final List<String> tokens, final int timestamp, + final DictionaryFacilitator dictionaryFacilitator, final SpacingAndPunctuations spacingAndPunctuations, final DistracterFilter distracterFilter) { - final ArrayList<LanguageModelParam> languageModelParams = - CollectionUtils.newArrayList(); + final ArrayList<LanguageModelParam> languageModelParams = new ArrayList<>(); final int N = tokens.size(); - PrevWordsInfo prevWordsInfo = new PrevWordsInfo(null); + PrevWordsInfo prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; for (int i = 0; i < N; ++i) { final String tempWord = tokens.get(i); if (StringUtils.isEmptyStringOrWhiteSpaces(tempWord)) { @@ -103,7 +103,7 @@ public final class LanguageModelParam { + tempWord + "\""); } // Sentence terminator found. Split. - prevWordsInfo = new PrevWordsInfo(null); + prevWordsInfo = PrevWordsInfo.EMPTY_PREV_WORDS_INFO; continue; } if (DEBUG_TOKEN) { @@ -124,43 +124,33 @@ public final class LanguageModelParam { private static LanguageModelParam detectWhetherVaildWordOrNotAndGetLanguageModelParam( final PrevWordsInfo prevWordsInfo, final String targetWord, final int timestamp, - final DictionaryFacilitatorForSuggest dictionaryFacilitator, + final DictionaryFacilitator dictionaryFacilitator, final DistracterFilter distracterFilter) { final Locale locale = dictionaryFacilitator.getLocale(); if (locale == null) { return null; } - // TODO: Though targetWord is an IV (in-vocabulary) word, we should still apply - // distracterFilter in the following code. If targetWord is a distracter, - // it should be filtered out. if (dictionaryFacilitator.isValidWord(targetWord, false /* ignoreCase */)) { return createAndGetLanguageModelParamOfWord(prevWordsInfo, targetWord, timestamp, - true /* isValidWord */, locale); + 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); + timestamp, true /* isValidWord */, locale, distracterFilter); } - // Treat the word as an OOV word. The following statement checks whether this OOV - // is a distracter to words in dictionaries. Being a distracter means the OOV word is - // too close to a common word in dictionaries (e.g., the OOV "mot" is very close to "not"). - // Adding such a word to dictonaries would interfere with entering in-dictionary words. For - // example, adding "mot" to dictionaries might interfere with entering "not". - // This kind of OOV should be filtered out. - if (distracterFilter.isDistracterToWordsInDictionaries(prevWordsInfo, targetWord, locale)) { - return null; - } + // Treat the word as an OOV word. return createAndGetLanguageModelParamOfWord(prevWordsInfo, targetWord, timestamp, - false /* isValidWord */, locale); + false /* isValidWord */, locale, distracterFilter); } private static LanguageModelParam createAndGetLanguageModelParamOfWord( final PrevWordsInfo prevWordsInfo, final String targetWord, final int timestamp, - final boolean isValidWord, final Locale locale) { + final boolean isValidWord, final Locale locale, + final DistracterFilter distracterFilter) { final String word; if (StringUtils.getCapitalizationType(targetWord) == StringUtils.CAPITALIZE_FIRST && prevWordsInfo.mPrevWord == null && !isValidWord) { @@ -168,6 +158,13 @@ public final class LanguageModelParam { } 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.mPrevWord == null) { 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 d14ba508b..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(StringUtils.newSingleCodePointString(code), 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/LeakGuardHandlerWrapper.java b/java/src/com/android/inputmethod/latin/utils/LeakGuardHandlerWrapper.java index 8469c87b0..dd6fac671 100644 --- a/java/src/com/android/inputmethod/latin/utils/LeakGuardHandlerWrapper.java +++ b/java/src/com/android/inputmethod/latin/utils/LeakGuardHandlerWrapper.java @@ -33,7 +33,7 @@ public class LeakGuardHandlerWrapper<T> extends Handler { if (ownerInstance == null) { throw new NullPointerException("ownerInstance is null"); } - mOwnerInstanceRef = new WeakReference<T>(ownerInstance); + mOwnerInstanceRef = new WeakReference<>(ownerInstance); } public T getOwnerInstance() { diff --git a/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java b/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java index 0c55484b4..c519a0de6 100644 --- a/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/LocaleUtils.java @@ -159,7 +159,7 @@ 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. 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 bf38abc95..000000000 --- a/java/src/com/android/inputmethod/latin/utils/PrioritizedSerialExecutor.java +++ /dev/null @@ -1,122 +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.annotations.UsedForTesting; - -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)); - } - - /** - * 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 - */ - @UsedForTesting - 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 shutdown() { - synchronized(mLock) { - mIsShutdown = true; - mThreadPoolExecutor.shutdown(); - } - } -} diff --git a/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java b/java/src/com/android/inputmethod/latin/utils/ResourceUtils.java index 49f4929b4..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; diff --git a/java/src/com/android/inputmethod/latin/utils/StringUtils.java b/java/src/com/android/inputmethod/latin/utils/StringUtils.java index 73ac9a573..4ed0f0a94 100644 --- a/java/src/com/android/inputmethod/latin/utils/StringUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/StringUtils.java @@ -28,7 +28,6 @@ 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 @@ -110,7 +109,7 @@ public final class StringUtils { 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); diff --git a/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java b/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java index 938d27122..351d01400 100644 --- a/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/SubtypeLocaleUtils.java @@ -49,17 +49,14 @@ public final class SubtypeLocaleUtils { 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 = @@ -71,7 +68,7 @@ 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. diff --git a/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java b/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java index 42ea3c959..ab2b00e36 100644 --- a/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java +++ b/java/src/com/android/inputmethod/latin/utils/TargetPackageInfoGetterTask.java @@ -27,8 +27,7 @@ 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; diff --git a/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java b/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java index 087a7f255..fafba79c2 100644 --- a/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/TypefaceUtils.java @@ -30,7 +30,7 @@ public final class TypefaceUtils { } // 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(); @@ -50,7 +50,7 @@ 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(); 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/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/FeedbackLog.java b/java/src/com/android/inputmethod/research/FeedbackLog.java deleted file mode 100644 index 5af194c32..000000000 --- a/java/src/com/android/inputmethod/research/FeedbackLog.java +++ /dev/null @@ -1,32 +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 java.io.File; - -public class FeedbackLog extends ResearchLog { - public FeedbackLog(final File outputFile, final Context context) { - super(outputFile, context); - } - - @Override - public boolean isFeedbackLog() { - return true; - } -} 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 6170b4339..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.isPunctuationSuggestions()); - 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 ffdb43c15..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.DictionaryFacilitatorForSuggest; -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; - - private final DictionaryFacilitatorForSuggest mDictionaryFacilitator; - @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 DictionaryFacilitatorForSuggest dictionaryFacilitator) { - super(N_GRAM_SIZE + wordsBetweenSamples); - mNumWordsBetweenNGrams = wordsBetweenSamples; - mNumWordsUntilSafeToSample = DEBUG ? 0 : numInitialWordsToIgnore; - mDictionaryFacilitator = dictionaryFacilitator; - } - - @UsedForTesting - /* package for test */ void setDictionaryForTesting(final Dictionary dictionary) { - mDictionaryForTesting = dictionary; - } - - private boolean isValidDictWord(final String word) { - if (mDictionaryForTesting != null) { - return mDictionaryForTesting.isValidWord(word); - } - if (mDictionaryFacilitator != null) { - return mDictionaryFacilitator.isValidMainDictWord(word); - } - return false; - } - - 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). - if ((mDictionaryFacilitator == null - || !mDictionaryFacilitator.hasInitializedMainDictionary()) - && mDictionaryForTesting == 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; - 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) && !isValidDictWord(word)) { - if (DEBUG) { - Log.d(TAG, "\"" + word + "\" NOT SAFE!: hasLetters: " - + ResearchLogger.hasLetters(word) - + ", isValid: " + isValidDictWord(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 d907dd1b0..000000000 --- a/java/src/com/android/inputmethod/research/ResearchLogger.java +++ /dev/null @@ -1,1885 +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.DictionaryFacilitatorForSuggest; -import com.android.inputmethod.latin.LatinIME; -import com.android.inputmethod.latin.R; -import com.android.inputmethod.latin.RichInputConnection; -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.StringUtils; -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 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 = 6; - // 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 int[] WHITESPACE_SEPARATORS = - StringUtils.toSortedCodePointArray(" \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; - - // used to check whether words are not unique - private DictionaryFacilitatorForSuggest mDictionaryFacilitator; - 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) { - 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, - mDictionaryFacilitator) { - @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 boolean isDictionaryWord = mDictionaryFacilitator != null - && mDictionaryFacilitator.isValidMainDictWord(word); - mStatistics.recordWordEntered( - isDictionaryWord, 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 initDictionary(final DictionaryFacilitatorForSuggest dictionaryFacilitator) { - mDictionaryFacilitator = dictionaryFacilitator; - // MainLogBuffer now has an out-of-date Suggest object. Close down MainLogBuffer and create - // a new one. - if (mMainLogBuffer != null) { - restart(); - } - } - - 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) { - if (mDictionaryFacilitator != null && mDictionaryFacilitator.isValidMainDictWord(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 }); - } - - /** - * 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) { - // 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 (!finishingInput) { - 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, - true /* 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 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, false /* expectingUpdateSelection */, - false /* 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", - "supportsSwitchingToShortcutIme", "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.mSupportsSwitchingToShortcutIme, kid.mHasShortcutKey, - kid.mLanguageSwitchKeyEnabled, kid.isMultiLine(), keyboard.mOccupiedWidth, - keyboard.mOccupiedHeight, keyboard.getSortedKeys()); - } - - /** - * 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(); - } -} |