diff options
208 files changed, 8462 insertions, 3832 deletions
diff --git a/java/AndroidManifest.xml b/java/AndroidManifest.xml index 49855e313..17d11c01d 100644 --- a/java/AndroidManifest.xml +++ b/java/AndroidManifest.xml @@ -44,7 +44,7 @@ </service> <service android:name=".spellcheck.AndroidSpellCheckerService" - android:label="@string/spell_checker_service_name" + android:label="@string/aosp_spell_checker_service_name" android:permission="android.permission.BIND_TEXT_SERVICE"> <intent-filter> <action android:name="android.service.textservice.SpellCheckerService" /> @@ -69,7 +69,7 @@ </intent-filter> </receiver> - <activity android:name="SettingsActivity" android:label="@string/english_ime_settings" + <activity android:name="SettingsActivity" android:label="@string/aosp_android_keyboard_ime_settings" android:uiOptions="splitActionBarWhenNarrow"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -77,7 +77,7 @@ </activity> <activity android:name="com.android.inputmethod.latin.spellcheck.SpellCheckerSettingsActivity" - android:label="@string/android_spell_checker_settings"> + android:label="@string/aosp_android_spell_checker_service_settings"> <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> @@ -95,6 +95,12 @@ </intent-filter> </receiver> + <receiver android:name=".DictionaryPackInstallBroadcastReceiver"> + <intent-filter> + <action android:name="com.android.inputmethod.dictionarypack.UNKNOWN_CLIENT" /> + </intent-filter> + </receiver> + <provider android:name="com.android.inputmethod.dictionarypack.DictionaryProvider" android:grantUriPermissions="true" android:exported="false" diff --git a/java/res/values-af/strings-appname.xml b/java/res/values-af/strings-appname.xml deleted file mode 100644 index d6bb52f52..000000000 --- a/java/res/values-af/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android-sleutelbord"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-speltoetser"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android-sleutelbordinstellings"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Speltoets tans instellings"</string> -</resources> diff --git a/java/res/values-af/strings.xml b/java/res/values-af/strings.xml index 07b4503e6..f5a6245a4 100644 --- a/java/res/values-af/strings.xml +++ b/java/res/values-af/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-sleutelbord (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android-sleutelbord (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android-sleutelbord-instellings (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android-speltoetser (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android-speltoetserinstellings (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropsies"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Navorsing-loglêerbevele"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-speltoetser (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Steminvoer is gedeaktiveer"</string> <string name="configure_input_method" msgid="373356270290742459">"Stel invoermetodes op"</string> <string name="language_selection_title" msgid="1651299598555326750">"Invoertale"</string> + <string name="send_feedback" msgid="1780431884109392046">"Stuur terugvoer"</string> <string name="select_language" msgid="3693815588777926848">"Invoertale"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak weer om te stoor"</string> <string name="has_dictionary" msgid="6071847973466625007">"Woordeboek beskikbaar"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiveer gebruikerterugvoer"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Help hierdie invoermetode-redigeerder te verbeter deur gebruikstatistiek en omvalverslae outomaties na Google te stuur."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Sleutellangdrukvertraging-instellings"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Sleuteldruk se vibrasie-tydsduurinstellings"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Sleuteldruk se klankvolume-instellings"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lees eksterne woordeboeklêer"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Geen woordeboeklêers in die aflaaiselsvouer nie"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Kies \'n woordeboeklêer om te installeer"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Verstek"</string> <string name="language_settings" msgid="1671153053201809031">"Taal en invoer"</string> <string name="select_input_method" msgid="4301602374609275003">"Kies invoermetode"</string> - - <string name="app_name" msgid="1017058186322714405">"Woordeboekverskaffer"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Woordeboekverskaffer"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Woordeboek-diens"</string> - <string name="download_description" msgid="3274861514695032954">"Woordeboek se opdateerinligting"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Addisionele woordeboeke"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Woordeboek beskikbaar"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Instellings vir woordeboeke"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Gebruikerwoordeboeke"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Gebruikerwoordeboek"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Woordeboek beskikbaar"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Laai tans af"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Geïnstalleer"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Geïnstalleer, gedeaktiveer"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Kan nie aan woordeboekdiens koppel nie"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Geen woordeboeke beskikbaar nie"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Herlaai"</string> - <string name="last_update" msgid="3101549719827600346">"Laas opgedateer"</string> - <string name="message_updating" msgid="820186276704134720">"Kontroleer vir opdaterings"</string> - <string name="message_loading" msgid="8611339149825047446">"Laai tans..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Hoofwoordeboek"</string> - <string name="cancel" msgid="5586531736609183304">"Kanselleer"</string> - <string name="install_dict" msgid="5525005524697607865">"Installeer"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Kanselleer aflaaisel"</string> - <string name="disable_dict" msgid="7685810040236497700">"Deaktiveer"</string> - <string name="enable_dict" msgid="3848179784702473680">"Aktiveer"</string> - <string name="delete_dict" msgid="5817159290503843766">"Vee uit"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Die gekose taal op jou mobiele toestel het \'n beskikbare woordeboek.<br/> Ons beveel aan dat die <xliff:g id="LANGUAGE">%1$s</xliff:g>-woordeboek <b>afgelaai</b> word om jou tikervaring \'n beter een te maak.<br/> <br/> Dit kan \'n minuut of twee neem om oor 3G af te laai. Heffings mag geld as jy nie \'n <b>onbeperkte dataplan</b>.<br/> het nie As jy onseker oor jou dataplan is, beveel ons aan dat jy \'n WiFi-verbinding soek om outomaties te begin aflaai.<br/> <br/> Wenk: Jy kan woordeboeke aflaai en verwyder deur te gaan na <b>Taal en invoer</b> in die <b>Instellings</b>-kieslys van jou mobiele toestel."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Laai nou af (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Laai oor Wi-Fi af"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"\'n Woordeboek is vir <xliff:g id="LANGUAGE">%1$s</xliff:g> beskikbaar"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Druk om te hersien en af te laai"</string> + <string name="app_name" msgid="6320102637491234792">"Woordeboekverskaffer"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Woordeboekverskaffer"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Woordeboek-diens"</string> + <string name="download_description" msgid="6014835283119198591">"Woordeboek se opdateerinligting"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Voeg woordeboeke by"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Woordeboek beskikbaar"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Instellings vir woordeboeke"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Gebruikerwoordeboeke"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Gebruikerwoordeboek"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Woordeboek beskikbaar"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Laai tans af"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Geïnstalleer"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Geïnstalleer, gedeaktiveer"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Kan nie aan woordeboekdiens koppel nie"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Geen woordeboeke beskikbaar nie"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Verfris"</string> + <string name="last_update" msgid="730467549913588780">"Laas opgedateer"</string> + <string name="message_updating" msgid="4457761393932375219">"Kontroleer vir opdaterings"</string> + <string name="message_loading" msgid="8689096636874758814">"Laai tans…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Hoofwoordeboek"</string> + <string name="cancel" msgid="6830980399865683324">"Kanselleer"</string> + <string name="install_dict" msgid="180852772562189365">"Installeer"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Kanselleer"</string> + <string name="delete_dict" msgid="756853268088330054">"Vee uit"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Die gekose taal op jou mobiele toestel het \'n beskikbare woordeboek.<br/> Ons beveel aan dat die <xliff:g id="LANGUAGE">%1$s</xliff:g>-woordeboek <b>afgelaai</b> word om jou tikervaring te verbeter.<br/> <br/> Dit kan \'n minuut of twee neem om oor 3G af te laai. Heffings kan dalk geld as jy nie \'n <b>onbeperkte dataplan</b> het nie.<br/> As jy onseker oor jou dataplan is, beveel ons aan dat jy \'n Wi-Fi-verbinding soek om outomaties te begin aflaai.<br/> <br/> Wenk: Jy kan woordeboeke aflaai en verwyder deur te gaan na <b>Taal en invoer</b> in die <b>Instellings</b>-kieslys van jou mobiele toestel."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Laai nou af (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Laai oor Wi-Fi af"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"\'n Woordeboek is vir <xliff:g id="LANGUAGE">%1$s</xliff:g> beskikbaar"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Druk om te hersien en af te laai"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Laai tans af: voorstelle vir <xliff:g id="LANGUAGE">%1$s</xliff:g> sal binnekort gereed wees."</string> </resources> diff --git a/java/res/values-am/strings-appname.xml b/java/res/values-am/strings-appname.xml deleted file mode 100644 index fd93114f3..000000000 --- a/java/res/values-am/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"የAndroid ቁልፍ ሰሌዳ"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android የፊደል አራሚ"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android የቁልፍ ሰሌዳ ቅንብሮች"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"የፊደል አራሚ ቅንብሮች"</string> -</resources> diff --git a/java/res/values-am/strings.xml b/java/res/values-am/strings.xml index 6f740a9b8..23add874b 100644 --- a/java/res/values-am/strings.xml +++ b/java/res/values-am/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"የAndroid ቁልፍ ሰሌዳ (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"የAndroid ቁልፍ ሰሌዳ (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"የAndroid ቁልፍ ሰሌዳ ቅንብሮች (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android ፊደል አራሚ (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"የAndroid ፊደል አራሚ ቅንብሮች (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"ግቤት አማራጮች"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"የጥናት የምዝግብ ማስታወሻ ትዕዛዞች"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android የፊደል ማረሚያ (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"የድምፅ ግቤት ቦዝኗል"</string> <string name="configure_input_method" msgid="373356270290742459">"ግቤት ሜተዶችን አዋቀር"</string> <string name="language_selection_title" msgid="1651299598555326750">"ቋንቋዎች አግቤት"</string> + <string name="send_feedback" msgid="1780431884109392046">"ግብረ-መልስ ላክ"</string> <string name="select_language" msgid="3693815588777926848">"ቋንቋዎች አግቤት"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"ለማስቀመጥ እንደገና ንካ"</string> <string name="has_dictionary" msgid="6071847973466625007">"መዝገበ ቃላት አለ"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"የተጠቃሚ ግብረ ምላሽ አንቃ"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"ወደ Google የተሰናከለ ሪፖርቶች እና አጠቃቀም ስታስቲክስ በራስ ሰር በመላክ ይህን ግቤት ሜተድ አርትኢ እገዛ ያሻሽላል።"</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"የቁልፍ ሰሌዳ ገጽታ"</string> <string name="subtype_en_GB" msgid="88170601942311355">"እንግሊዘኛ (የታላቋ ብሪታንያ)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"እንግሊዘኛ (ዩ.ኤስ)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"የቁልፍ ረጅም ጭነት መዘግየት ቅንብሮች"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"ቁልፍ ተጫን በቅንጅቶች ወቅት ንዝረት"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"ቁልፍ ተጫን የድምጽ መጠን ቅንብሮች"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"ውጫዊ የመዝገበቃላት ፋይል አንብብ"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"በውርዶች አቃፊው ውስጥ ምንም የመዝገበ-ፋይሎች የሉም"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"የሚጭኑት የመዝገበ-ቃላት ፋይል ይምረጡ"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"ነባሪ"</string> <string name="language_settings" msgid="1671153053201809031">"ቋንቋ እና ግቤት"</string> <string name="select_input_method" msgid="4301602374609275003">"የግቤት ስልት ይምረጡ"</string> - - <string name="app_name" msgid="1017058186322714405">"መዝገበ ቃላት አቅራቢ"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"መዝገበ ቃላት አቅራቢ"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"የመዝገበ ቃላት አገልግሎት"</string> - <string name="download_description" msgid="3274861514695032954">"መዝገበ ቃላት ማዘመኛ መረጃ"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"እየታከሉ የሚያድጉ መዝገበ ቃላቶች"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"መዝገበ ቃላት ይገኛል"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"የመዝገበ ቃላት ቅንብሮች"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"የተጠቃሚ መዝገበ ቃላት"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"የተጠቃሚ መዝገበ ቃላት"</string> - <string name="dictionary_available" msgid="3192920608520618083">"መዝገበ ቃላት አለ"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"በአሁን ጊዜ በማውረድ ላይ"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"ተጭኗል"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"ተጭኗል፣ ተሰናክሏል"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"ወደ መዝገበ ቃላት አገልገሎት በማገናኘት ላይ ችግር"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"ምንም መዝገበ ቃላት የሉም"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"አድስ"</string> - <string name="last_update" msgid="3101549719827600346">"ለመጨረሻ ጊዜ የዘመነው"</string> - <string name="message_updating" msgid="820186276704134720">"ዝማኔዎችን በመፈተሽ ላይ"</string> - <string name="message_loading" msgid="8611339149825047446">"በመጫን ላይ…"</string> - <string name="main_dict_description" msgid="1679964306980098570">"ዋና መዝገበ ቃል"</string> - <string name="cancel" msgid="5586531736609183304">"ተወው"</string> - <string name="install_dict" msgid="5525005524697607865">"ጫን"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"ማውረድን ተወው"</string> - <string name="disable_dict" msgid="7685810040236497700">"አሰናክል"</string> - <string name="enable_dict" msgid="3848179784702473680">"አንቃ"</string> - <string name="delete_dict" msgid="5817159290503843766">"ሰርዝ"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"መዝገበ ቃላት ለ<xliff:g id="LANGUAGE">%1$s</xliff:g> ይገኛል"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"ለመገምገምና ለማውረድ ተጫን"</string> + <string name="app_name" msgid="6320102637491234792">"የመዝገበ-ቃላት አቅራቢ"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"የመዝገበ-ቃላት አቅራቢ"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"የመዝገበ-ቃላት አገልግሎት"</string> + <string name="download_description" msgid="6014835283119198591">"መዝገበ-ቃላት ዝማኔ መረጃ"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"ጭማሪ መዝገበ-ቃላት"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"መዝገበ-ቃላት ይገኛል"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"የመዝገበ-ቃላት ቅንብሮች"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"የተጠቃሚ መዝገበ-ቃላት"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"የተጠቃሚ መዝገበ-ቃላት"</string> + <string name="dictionary_available" msgid="4728975345815214218">"መዝገበ-ቃላት ይገኛል"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"በአሁን ጊዜ በመውረድ ላይ"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ተጭኗል"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ተጭኗል፣ ተሰናክሏል"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"ወደ መዝገበ-ቃላት አገልገሎት ማገናኘት ላይ ችግር"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"ምንም መዝገበ-ቃላት የሉም"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"አድስ"</string> + <string name="last_update" msgid="730467549913588780">"ለመጨረሻ ጊዜ የተዘመነው"</string> + <string name="message_updating" msgid="4457761393932375219">"ዝማኔዎችን በመፈለግ ላይ"</string> + <string name="message_loading" msgid="8689096636874758814">"በመጫን ላይ..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"ዋና መዝገበ-ቃላት"</string> + <string name="cancel" msgid="6830980399865683324">"ይቅር"</string> + <string name="install_dict" msgid="180852772562189365">"ጫን"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"ሰርዝ"</string> + <string name="delete_dict" msgid="756853268088330054">"ሰርዝ"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"ተንቀሳቃሽ መሣሪያዎ ላይ ለተመረጠው ቋንቋ የሚሆን መዝገበ-ቃላት ይገኛል።<br/> የትየባ ተሞክሮዎን ለማሻሻል የ<xliff:g id="LANGUAGE">%1$s</xliff:g> መዝገበ-ቃላቱን <b>እንዲያወርዱ</b> እንመክራለን።<br/> <br/> ውርዱ በ3ጂ ላይ አንድ ወይም ሁለት ደቂቃ ሊወስድ ይችላል። <b>ያልተገደበ የውሂብ ዕቅድ</b> ከሌለዎት ክፍያዎች መከፈል ሊኖርባቸው ይችላል።<br/> የትኛው የውሂብ ዕቅድ እንዳለዎት እርግጠኛ ካልሆኑ ውርዱን በራስ-ሰር ለመጀመር የWi-Fi ግንኙነት እንዲፈልጉ እንመክራለን።<br/> <br/> ጠቃሚ ምክር፦ የተንቀሳቃሽ መሣሪያዎ <b>ቅንብሮች</b> ምናሌ ውስጥ ወዳለው <b>ቋንቋ እና ግብዓት</b> በመሄድ መዝገበ-ቃላትን ማውረድና ማስወገድ ይችላሉ።"</string> + <string name="download_over_metered" msgid="1643065851159409546">"አሁን አውርድ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> ሜባ)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"በWi-Fi አውርድ"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"መዝገበ-ቃላት ለ<xliff:g id="LANGUAGE">%1$s</xliff:g> ይገኛል"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"ለመገምገምና ለማውረድ ይጫኑ"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"በማውረድ ላይ፦ የ<xliff:g id="LANGUAGE">%1$s</xliff:g> ጥቆማ አስተያየቶች በቅርቡ ዝግጁ ይሆናሉ።"</string> </resources> diff --git a/java/res/values-ar/strings-appname.xml b/java/res/values-ar/strings-appname.xml deleted file mode 100644 index 3d81e5d4b..000000000 --- a/java/res/values-ar/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"لوحة مفاتيح Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"التدقيق الإملائي في Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"إعدادات لوحة مفاتيح Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"إعدادات التدقيق الإملائي"</string> -</resources> diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index 5668d59ea..f364bcf22 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"لوحة مفاتيح Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"لوحة مفاتيح Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"إعدادات لوحة مفاتيح Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"المدقق الإملائي في Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"إعدادات المدقق الإملائي في Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"خيارات الإرسال"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"أوامر سجلات البحث"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"التدقيق الإملائي في Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"الإدخال الصوتي مُعطل"</string> <string name="configure_input_method" msgid="373356270290742459">"تهيئة طرق الإدخال"</string> <string name="language_selection_title" msgid="1651299598555326750">"لغات الإدخال"</string> + <string name="send_feedback" msgid="1780431884109392046">"إرسال تعليقات"</string> <string name="select_language" msgid="3693815588777926848">"لغات الإدخال"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"المس مرة أخرى للحفظ"</string> <string name="has_dictionary" msgid="6071847973466625007">"القاموس متاح"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"تمكين ملاحظات المستخدم"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"المساعدة في تحسين محرر طريقة الإرسال هذا من خلال إرسال إحصاءات الاستخدام وتقارير الأعطال تلقائيًا إلى Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"مظهر لوحة المفاتيح"</string> <string name="subtype_en_GB" msgid="88170601942311355">"الإنجليزية (المملكة المتحدة)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"الإنجليزية (الولايات المتحدة)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"إعدادات تأخير الضغط الطويل للمفاتيح"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"إعدادات مدة اهتزاز الضغط على المفاتيح"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"إعدادات مستوى صوت الضغط على المفاتيح"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"قراءة ملف قاموس خارجي"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ليست هناك ملفات قواميس في مجلد التنزيلات"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"تحديد ملف قاموس للتثبيت"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"الافتراضية"</string> <string name="language_settings" msgid="1671153053201809031">"اللغة والإدخال"</string> <string name="select_input_method" msgid="4301602374609275003">"اختيار أسلوب الإدخال"</string> - - <string name="app_name" msgid="1017058186322714405">"مقدم القاموس"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"مقدم القاموس"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"خدمة القاموس"</string> - <string name="download_description" msgid="3274861514695032954">"معلومات تحديث القاموس"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"القواميس الإضافية"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"قاموس متوفر"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"إعدادات القواميس"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"قواميس المستخدم"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"قاموس المستخدم"</string> - <string name="dictionary_available" msgid="3192920608520618083">"القاموس متاح"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"يتم حاليًا التنزيل"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"مثبت"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"مثبت، معطل"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"مشكلة في الاتصال بخدمة القاموس"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"لا تتوفر أية قواميس"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"تحديث"</string> - <string name="last_update" msgid="3101549719827600346">"تاريخ آخر تحديث"</string> - <string name="message_updating" msgid="820186276704134720">"جارٍ البحث عن تحديثات"</string> - <string name="message_loading" msgid="8611339149825047446">"تحميل..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"القاموس الرئيسي"</string> - <string name="cancel" msgid="5586531736609183304">"إلغاء"</string> - <string name="install_dict" msgid="5525005524697607865">"تثبيت"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"إلغاء التنزيل"</string> - <string name="disable_dict" msgid="7685810040236497700">"تعطيل"</string> - <string name="enable_dict" msgid="3848179784702473680">"تمكين"</string> - <string name="delete_dict" msgid="5817159290503843766">"حذف"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"هناك قاموس متوفر للغة <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"اضغط للمراجعة والتنزيل"</string> + <string name="app_name" msgid="6320102637491234792">"مقدم القاموس"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"مقدم القاموس"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"خدمة القاموس"</string> + <string name="download_description" msgid="6014835283119198591">"معلومات تحديث القاموس"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"القواميس الإضافية"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"القاموس متاح"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"إعدادات القواميس"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"قواميس المستخدم"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"قاموس المستخدم"</string> + <string name="dictionary_available" msgid="4728975345815214218">"القاموس متاح"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"يتم حاليًا التنزيل"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"تم التثبيت"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"مثبت، معطل"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"مشكلة في الاتصال بخدمة القاموس"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"لا تتوفر أية قواميس"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"تحديث"</string> + <string name="last_update" msgid="730467549913588780">"تاريخ آخر تحديث"</string> + <string name="message_updating" msgid="4457761393932375219">"جارٍ البحث عن تحديثات"</string> + <string name="message_loading" msgid="8689096636874758814">"جارٍ التحميل..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"القاموس الرئيسي"</string> + <string name="cancel" msgid="6830980399865683324">"إلغاء"</string> + <string name="install_dict" msgid="180852772562189365">"تثبيت"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"إلغاء"</string> + <string name="delete_dict" msgid="756853268088330054">"حذف"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"اللغة المحددة على جهازك الجوال تشتمل على قاموس متوفر.<br/> نوصي <b>بتنزيل</b> قاموس <xliff:g id="LANGUAGE">%1$s</xliff:g> لتحسين تجربة الكتابة.<br/> <br/> قد يستغرق التنزيل دقيقة أو دقيقتين أكثر من المدة التي يستغرقها التنزيل عبر شبكة الجيل الثالث. قد تنطبق الرسوم إذا لم تكن مشتركًا في <b>خطة البيانات غير المحدودة</b>.<br/> إذا لم تكن متأكدًا من خطة البيانات المتوفرة لديك، فنحن نوصي بالبحث عن اتصال Wi-Fi لبدء عملية التنزيل تلقائيًا.<br/> <br/> نصيحة: يمكنك تنزيل القواميس وإزالتها عن طريق الانتقال إلى <b>اللغة والإدخال</b> في قائمة <b>إعدادات</b> في جهازك الجوَّال."</string> + <string name="download_over_metered" msgid="1643065851159409546">"التنزيل الآن (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> ميغابايت)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"التنزيل عبر شبكة Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"هناك قاموس متوفر للغة <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"اضغط للمراجعة والتنزيل"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"جارٍ التنزيل: ستتوفر اقتراحات للغة <xliff:g id="LANGUAGE">%1$s</xliff:g> بعد قليل."</string> </resources> diff --git a/java/res/values-be/strings-appname.xml b/java/res/values-be/strings-appname.xml deleted file mode 100644 index e0aadfa3c..000000000 --- a/java/res/values-be/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Клавіятура Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Iнструмент праверкi правапiсу для Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Налады клавіятуры Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Налады праверкі арфаграфіі"</string> -</resources> diff --git a/java/res/values-be/strings.xml b/java/res/values-be/strings.xml index d12e47c46..2d3fcfb00 100644 --- a/java/res/values-be/strings.xml +++ b/java/res/values-be/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавіятура Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Клавіятура Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Налады клавіятуры Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Iнструмент праверкi правапiсу для Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Налады інструмента праверкі правапісу для Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Параметры ўводу"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Каманды гiсторыя даследаванняў"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Iнструмент праверкi правапiсу для Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Галасавы набор адкл."</string> <string name="configure_input_method" msgid="373356270290742459">"Налада метадаў уводу"</string> <string name="language_selection_title" msgid="1651299598555326750">"Мовы ўводу"</string> + <string name="send_feedback" msgid="1780431884109392046">"Адправіць водгук"</string> <string name="select_language" msgid="3693815588777926848">"Мовы ўводу"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Дакраніцеся зноў, каб захаваць"</string> <string name="has_dictionary" msgid="6071847973466625007">"Слоўнік даступны"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Уключыць зваротную сувязь з карыстальнікамі"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Дапамажыце палепшыць гэты рэдактар метаду ўводу, аўтаматычна адпраўляючы статыстыку выкарыстання і справаздачы аб збоях Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Тэма клавіятуры"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Англійская (ЗК)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Англійская (ЗША)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Налады адмены доўгага нацiску клавiшы"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Налады працягласцi вiбрацыi пры нацiску"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Налады гучнасцi пры нацiску"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Чытанне знешняга файла слоўніка"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У папцы загрузак няма файлаў слоўніка"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Вылучыце файл слоўніка для ўсталёўкі"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Па змаўчанні"</string> <string name="language_settings" msgid="1671153053201809031">"Мова і ўвод"</string> <string name="select_input_method" msgid="4301602374609275003">"Выберыце метад уводу"</string> - - <string name="app_name" msgid="1017058186322714405">"Пастаўшчык слоўніка"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Пастаўшчык слоўніка"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Слоўнік"</string> - <string name="download_description" msgid="3274861514695032954">"Інфармацыя абнаўлення слоўніка"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Дадатковыя слоўнікі"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Даступны слоўнік"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Налады для слоўнікаў"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Карыстальніцкія слоўнікі"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Карыстальніцкі слоўнік"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Даступны слоўнік"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Спампоўваецца зараз"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Усталяваны"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Усталявана, адключана"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Праблема падключэння да слоўніка"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Слоўнікаў няма"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Абнавіць"</string> - <string name="last_update" msgid="3101549719827600346">"Апошняе абнаўленне"</string> - <string name="message_updating" msgid="820186276704134720">"Праверка наяўнасці абнаўленняў"</string> - <string name="message_loading" msgid="8611339149825047446">"Загрузка..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Асноўны слоўнік"</string> - <string name="cancel" msgid="5586531736609183304">"Адмена"</string> - <string name="install_dict" msgid="5525005524697607865">"Усталяваць"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Адмяніць спампаванне"</string> - <string name="disable_dict" msgid="7685810040236497700">"Адключыць"</string> - <string name="enable_dict" msgid="3848179784702473680">"Уключыць"</string> - <string name="delete_dict" msgid="5817159290503843766">"Выдаліць"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Слоўнік для мовы \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\""</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Нацiснiце, каб прагледзець i спампаваць"</string> + <string name="app_name" msgid="6320102637491234792">"Пастаўшчык слоўніка"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Пастаўшчык слоўніка"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Слоўнік"</string> + <string name="download_description" msgid="6014835283119198591">"Інфармацыя абнаўлення слоўніка"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Дадатковыя слоўнікі"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Даступны слоўнік"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Налады для слоўнікаў"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Карыстальніцкія слоўнікі"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Карыстацкі слоўнік"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Даступны слоўнік"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Спампоўваецца зараз"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Усталявана"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Усталявана, адключана"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Праблема падключэння да слоўніка"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Слоўнікаў няма"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Абнавіць"</string> + <string name="last_update" msgid="730467549913588780">"Апошняе абнаўленне"</string> + <string name="message_updating" msgid="4457761393932375219">"Праверка наяўнасці абнаўленняў"</string> + <string name="message_loading" msgid="8689096636874758814">"Загрузка..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Асноўны слоўнік"</string> + <string name="cancel" msgid="6830980399865683324">"Адмяніць"</string> + <string name="install_dict" msgid="180852772562189365">"Усталяваць"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Адмена"</string> + <string name="delete_dict" msgid="756853268088330054">"Выдаліць"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Для выбранай мовы на мабільнай прыладзе ёсць слоўнік.<br/> Мы рэкамендуем <b>спампаваць</b> слоўнік для мовы \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\" для паляпшэння зручнасці набору.<br/> <br/> Спампоўка можа заняць хвіліну або дзве ў 3G-сетках. Калі ў вас няма <b>безлімітнага тарыфнага плану перадачы дадзеных</b>, могуць прымяняцца дадатковыя плацяжы<br/>. Калі вы не ведаеце дакладна, які ў вас тарыфны план, мы рэкамендуем знайсці падлучэнне да сеткі Wi-Fi, каб пачаць аўтаматычную спампоўку.<br/> <br/> Парада: можна спампоўваць і выдаляць слоўнікі, перайшоўшы ў раздзел <b>Мова і ўвод</b> у меню <b>Налады</b> вашай мабільнай прылады."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Спампаваць зараз (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>МБ)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Спампаваць праз Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Слоўнік для мовы \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\""</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Нацiснiце, каб прагледзець i спампаваць"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Загрузка: прапановы для мовы \"<xliff:g id="LANGUAGE">%1$s</xliff:g>\" хутка з\'явяцца."</string> </resources> diff --git a/java/res/values-bg/strings-appname.xml b/java/res/values-bg/strings-appname.xml deleted file mode 100644 index 49e301d32..000000000 --- a/java/res/values-bg/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Клавиатура на Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Програма за правописна проверка за Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Настройки на клавиатурата на Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Настройки за проверка на правописа"</string> -</resources> diff --git a/java/res/values-bg/strings.xml b/java/res/values-bg/strings.xml index 37eaa3346..486219846 100644 --- a/java/res/values-bg/strings.xml +++ b/java/res/values-bg/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавиатура на Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Клавиатура на Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Настройки на клавиатурата на Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Програма за правописна проверка за Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Настройки на програмата за правописна проверка за Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Опции за въвеждане"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Команди за рег. файл за проучвания"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Програма за правописна проверка за Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Глас. въвежд. е деакт."</string> <string name="configure_input_method" msgid="373356270290742459">"Конфигуриране на въвеждането"</string> <string name="language_selection_title" msgid="1651299598555326750">"Входни езици"</string> + <string name="send_feedback" msgid="1780431884109392046">"Изпращане на отзиви"</string> <string name="select_language" msgid="3693815588777926848">"Езици за въвеждане"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Докоснете отново, за да запазите"</string> <string name="has_dictionary" msgid="6071847973466625007">"Има достъп до речник"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Активиране на отзивите от потребителите"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Помогнете за подобряването на този редактор за въвеждане чрез автоматично изпращане до Google на статистически данни за употребата и сигнали за сривове."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Тема на клавиатурата"</string> <string name="subtype_en_GB" msgid="88170601942311355">"английски (Великобритания)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"английски (САЩ)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Настройки за забавяне при продължително натискане на клавишите"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Настройки за продължителност на вибрирането при натискане на клавиш"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Настройки за силата на звука при натискане на клавиш"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Четене на файл за външен речник"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"В папката „Изтегляния“ няма файлове за речник"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Изберете файл за речника, който да инсталирате"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Стандартни"</string> <string name="language_settings" msgid="1671153053201809031">"Език и въвеждане"</string> <string name="select_input_method" msgid="4301602374609275003">"Избор на метод на въвеждане"</string> - - <string name="app_name" msgid="1017058186322714405">"Доставчик на речника"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Доставчик на речника"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Услуга за речник"</string> - <string name="download_description" msgid="3274861514695032954">"Информация за актуализацията на речниците"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Добавени речници"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Налице е речник"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Настройки за речници"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Потребителски речници"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Потребителски речник"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Речникът е налице"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Изтеглят се понастоящем"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Инсталирано"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Инсталирано, деактивирано"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Има проблем с връзката"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Няма налични речници"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Опресняване"</string> - <string name="last_update" msgid="3101549719827600346">"Последна актуализация:"</string> - <string name="message_updating" msgid="820186276704134720">"Проверява се за актуализации"</string> - <string name="message_loading" msgid="8611339149825047446">"Зарежда се..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Основен речник"</string> - <string name="cancel" msgid="5586531736609183304">"Отказ"</string> - <string name="install_dict" msgid="5525005524697607865">"Инсталиране"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Анулиране на изтеглянето"</string> - <string name="disable_dict" msgid="7685810040236497700">"Деактивиране"</string> - <string name="enable_dict" msgid="3848179784702473680">"Активиране"</string> - <string name="delete_dict" msgid="5817159290503843766">"Изтриване"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"За <xliff:g id="LANGUAGE">%1$s</xliff:g> е налице речник"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Натиснете, за да прегледате и изтеглите"</string> + <string name="app_name" msgid="6320102637491234792">"Доставчик на речника"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Доставчик на речника"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Услуга за речник"</string> + <string name="download_description" msgid="6014835283119198591">"Информация за актуализацията на речниците"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Добавени речници"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Речникът е налице"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Настройки за речници"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Потребителски речници"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Потребителски речник"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Речникът е налице"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Понастоящем се изтегля"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Инсталиран"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Инсталиран, деактивиран"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Няма връзка с речниците"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Няма налични речници"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Опресняване"</string> + <string name="last_update" msgid="730467549913588780">"Последна актуализация:"</string> + <string name="message_updating" msgid="4457761393932375219">"Проверява се за актуализации"</string> + <string name="message_loading" msgid="8689096636874758814">"Зарежда се..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Основен речник"</string> + <string name="cancel" msgid="6830980399865683324">"Отказ"</string> + <string name="install_dict" msgid="180852772562189365">"Инсталиране"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Отказ"</string> + <string name="delete_dict" msgid="756853268088330054">"Изтриване"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Налице е речник за избрания език на мобилното ви устройство.<br/> Препоръчваме ви <b>dда изтеглите</b> речника за <xliff:g id="LANGUAGE">%1$s</xliff:g>, за да подобрите практическата си работа при писане.<br/> <br/> Изтеглянето през 3G може да отнеме една до две минути. Възможно е да бъдете таксувани, ако нямате <b>неограничен план за данни</b>.<br/> В случай че не сте сигурни какъв е вашият план, ви препоръчваме да намерите Wi-Fi връзка, за да започнете автоматично изтеглянето.<br/> <br/> Съвет: Можете да изтегляте и премахвате речници, като отворите <b>Език и въвеждане</b> в менюто <b>Настройки</b> на мобилното си устройство."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Изтегляне сега (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> МБ)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Изтегляне през Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"За <xliff:g id="LANGUAGE">%1$s</xliff:g> е налице речник"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Натиснете, за да прегледате и изтеглите"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Изтегля се: Предложенията за <xliff:g id="LANGUAGE">%1$s</xliff:g> ще бъдат готови скоро."</string> </resources> diff --git a/java/res/values-ca/strings-appname.xml b/java/res/values-ca/strings-appname.xml deleted file mode 100644 index add5c3f2f..000000000 --- a/java/res/values-ca/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Teclat Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Corrector ortogràfic d\'Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Configuració del teclat d\'Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Configuració de la correcció ortogràfica"</string> -</resources> diff --git a/java/res/values-ca/strings.xml b/java/res/values-ca/strings.xml index c45b07c50..93336c692 100644 --- a/java/res/values-ca/strings.xml +++ b/java/res/values-ca/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclat d\'Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Teclat d\'Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Configuració del teclat d\'Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Corrector ortogràfic d\'Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Configuració del corrector ortogràfic d\'Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcions d\'entrada"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Recerca d\'ordres de reg."</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corrector ortogràfic d\'Android (AOSP)"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Cerca noms de contactes"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"El corrector ortogràfic utilitza entrades de la llista de cont."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibra en prémer tecles"</string> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. veu desactiv."</string> <string name="configure_input_method" msgid="373356270290742459">"Configura mètodes d\'entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomes d\'entrada"</string> + <string name="send_feedback" msgid="1780431884109392046">"Envia comentaris"</string> <string name="select_language" msgid="3693815588777926848">"Idiomes d\'entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Torna a tocar per desar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Diccionari disponible"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Activa els comentaris de l\'usuari"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Ajuda a millorar aquest editor de mètodes d\'entrada enviant automàticament estadístiques d\'ús i informes de bloqueigs a Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Configuració del retard per mantenir premuda una tecla"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Configuració de durada de vibracions en prémer tecles"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Configuració del volum de so en prémer tecles"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lectura d\'un fitxer de diccionari extern"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hi ha cap fitxer de diccionari a la carpeta Baixades"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecció d\'un fitxer de diccionari per instal·lar"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Predeterminat"</string> <string name="language_settings" msgid="1671153053201809031">"Idioma i introducció"</string> <string name="select_input_method" msgid="4301602374609275003">"Selecció de mètodes d\'introducció"</string> - - <string name="app_name" msgid="1017058186322714405">"Proveïdor de diccionaris"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Proveïdor de diccionaris"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Servei de diccionari"</string> - <string name="download_description" msgid="3274861514695032954">"Informació d\'actualització del diccionari"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Diccionaris complementaris"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Diccionari disponible"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Configuració dels diccionaris"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Diccionaris de l\'usuari"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Diccionari de l\'usuari"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Diccionari disponible"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"S\'està baixant"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instal·lat"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instal·lat, desactivat"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"S\'ha produït un problema en connectar al servei de diccionari"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"No hi ha cap diccionari disponible."</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Actualitza"</string> - <string name="last_update" msgid="3101549719827600346">"Última actualització"</string> - <string name="message_updating" msgid="820186276704134720">"S\'està comprovant si hi ha actualitzacions"</string> - <string name="message_loading" msgid="8611339149825047446">"S\'està carregant..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Diccionari principal"</string> - <string name="cancel" msgid="5586531736609183304">"Cancel·la"</string> - <string name="install_dict" msgid="5525005524697607865">"Instal·la"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Cancel·la la baixada"</string> - <string name="disable_dict" msgid="7685810040236497700">"Desactiva"</string> - <string name="enable_dict" msgid="3848179784702473680">"Activa"</string> - <string name="delete_dict" msgid="5817159290503843766">"Suprimeix"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"L\'idioma seleccionat al teu dispositiu mòbil té un diccionari disponible.<br/> Et recomanem que <b>baixis</b> el diccionari de <xliff:g id="LANGUAGE">%1$s</xliff:g> per millorar la teva experiència d\'escriptura.<br/> <br/> La baixada pot trigar un parell de minuts mitjançant 3G. És possible que s\'apliquin càrrecs si no tens un <b>pla de dades il·limitat</b>.<br/> Si no estàs segur de quin pla de dades tens, et recomanem que cerquis una connexió Wi-Fi per començar la baixada automàticament.<br/> <br/> Consell: Pots baixar i eliminar diccionaris si vas a la secció <b>Idioma i entrada</b> del menú <b>Configuració</b> del dispositiu mòbil."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Baixa ara (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Baixa mitjançant Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Hi ha un diccionari disponible per a l\'idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Prem per opinar i per baixar"</string> + <string name="app_name" msgid="6320102637491234792">"Proveïdor de diccionaris"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Proveïdor de diccionaris"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Servei de diccionari"</string> + <string name="download_description" msgid="6014835283119198591">"Informació d\'actualització del diccionari"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Diccionaris complementaris"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Diccionari disponible"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Configuració dels diccionaris"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Diccionaris de l\'usuari"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Diccionari de l\'usuari"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Diccionari disponible"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"S\'està baixant"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instal·lat"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instal·lat, desactivat"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Error en connectar amb el diccionari"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Cap diccion. dispon."</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Actualitza"</string> + <string name="last_update" msgid="730467549913588780">"Última actualització"</string> + <string name="message_updating" msgid="4457761393932375219">"S\'està comprovant si hi ha actualitzacions"</string> + <string name="message_loading" msgid="8689096636874758814">"S\'està carregant..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Diccionari principal"</string> + <string name="cancel" msgid="6830980399865683324">"Cancel·la"</string> + <string name="install_dict" msgid="180852772562189365">"Instal·la"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel·la"</string> + <string name="delete_dict" msgid="756853268088330054">"Suprimeix"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Hi ha un diccionari disponible per a l\'idioma seleccionat al teu dispositiu mòbil.<br/> Et recomanem que <b>baixis</b> el diccionari de <xliff:g id="LANGUAGE">%1$s</xliff:g> per millorar la teva experiència d\'escriptura.<br/> <br/> La baixada pot trigar un parell de minuts en xarxes 3G. Si no tens un <b>pla de dades il·limitat</b>.<br/&gt, és possible que s\'apliquin càrrecs. Si no estàs segur de les característiques del teu pla de dades, et recomanem que cerquis una connexió Wi-Fi per iniciar la baixada automàticament.<br/> <br/> Consell: Pots baixar i suprimir diccionaris a la secció <b>Idioma i entrada de text</b> del menú <b>Configuració</b> del dispositiu mòbil."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Baixa ara (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Baixa mitjançant Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Hi ha un diccionari disponible per a l\'idioma: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Prem per revisar-lo i per baixar-lo"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Baixada: els suggeriments per a <xliff:g id="LANGUAGE">%1$s</xliff:g> estaran disponibles ben aviat."</string> </resources> diff --git a/java/res/values-cs/strings-appname.xml b/java/res/values-cs/strings-appname.xml deleted file mode 100644 index 0eeac88b4..000000000 --- a/java/res/values-cs/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Klávesnice Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Kontrola pravopisu Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Nastavení klávesnice Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Nastavení kontroly pravopisu"</string> -</resources> diff --git a/java/res/values-cs/strings.xml b/java/res/values-cs/strings.xml index 503ce1b54..355d681d3 100644 --- a/java/res/values-cs/strings.xml +++ b/java/res/values-cs/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Klávesnice Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Klávesnice Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Nastavení klávesnice Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Kontrola pravopisu Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Nastavení kontroly pravopisu Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávání textu a dat"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Příkazy vývoj. protokolu"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kontrola pravopisu Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup vypnut"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurace metod zadávání"</string> <string name="language_selection_title" msgid="1651299598555326750">"Vstupní jazyky"</string> + <string name="send_feedback" msgid="1780431884109392046">"Odeslat zpětnou vazbu"</string> <string name="select_language" msgid="3693815588777926848">"Vstupní jazyky"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Opětovným dotykem provedete uložení"</string> <string name="has_dictionary" msgid="6071847973466625007">"Slovník k dispozici"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivovat zasílání statistik užívání a zpráv o selhání"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasíláním statistik o užívání editoru zadávání dat a zpráv o jeho selhání do Googlu můžete přispět k vylepšení tohoto nástroje."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Nastavení prodlevy dlouhého stisknutí kláves"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Délka vibrace při stisku klávesy"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Hlasitost při stisknutí klávesy"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Číst soubor externího slovníku"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Ve složce Stažené nejsou žádné soubory slovníků."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vyberte soubor slovníku k instalaci"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Výchozí"</string> <string name="language_settings" msgid="1671153053201809031">"Jazyk a zadávání"</string> <string name="select_input_method" msgid="4301602374609275003">"Výběr metody zadávání dat"</string> - - <string name="app_name" msgid="1017058186322714405">"Poskytovatel slovníku"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Poskytovatel slovníku"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Služba slovníku"</string> - <string name="download_description" msgid="3274861514695032954">"Informace o aktualizaci slovníku"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Doplňkové slovníky"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Je k dispozici slovník"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Nastavení pro slovníky"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Uživatelské slovníky"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Uživatelský slovník"</string> - <string name="dictionary_available" msgid="3192920608520618083">"K dispozici je slovník"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Aktuální stahování"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Nainstalováno"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Nainstalováno, zakázáno"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Probl. s přip. k sl."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Žádné slovníky"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Aktualizovat"</string> - <string name="last_update" msgid="3101549719827600346">"Poslední aktualizace"</string> - <string name="message_updating" msgid="820186276704134720">"Kontrola aktualizací"</string> - <string name="message_loading" msgid="8611339149825047446">"Načítání..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Hlavní slovník"</string> - <string name="cancel" msgid="5586531736609183304">"Zrušit"</string> - <string name="install_dict" msgid="5525005524697607865">"Nainstalovat"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Zrušit stahování"</string> - <string name="disable_dict" msgid="7685810040236497700">"Zakázat"</string> - <string name="enable_dict" msgid="3848179784702473680">"Povolit"</string> - <string name="delete_dict" msgid="5817159290503843766">"Smazat"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Je k dispozici slovník pro jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Stisknutím zkontrolujete a stáhnete"</string> + <string name="app_name" msgid="6320102637491234792">"Poskytovatel slovníku"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Poskytovatel slovníku"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Služba slovníku"</string> + <string name="download_description" msgid="6014835283119198591">"Informace o aktualizaci slovníku"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Doplňkové slovníky"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Slovník k dispozici"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Nastavení slovníků"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Uživatelské slovníky"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Uživatelský slovník"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Slovník k dispozici"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Aktuální stahování"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Nainstalováno"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Nainstalováno, zakázáno"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Chyba přip. k slovníku"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Žádné slovníky"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Aktualizovat"</string> + <string name="last_update" msgid="730467549913588780">"Poslední aktualizace"</string> + <string name="message_updating" msgid="4457761393932375219">"Kontrola aktualizací"</string> + <string name="message_loading" msgid="8689096636874758814">"Načítání..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Hlavní slovník"</string> + <string name="cancel" msgid="6830980399865683324">"Zrušit"</string> + <string name="install_dict" msgid="180852772562189365">"Instalovat"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Zrušit"</string> + <string name="delete_dict" msgid="756853268088330054">"Smazat"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Pro vybraný jazyk mobilního zařízení je k dispozici slovník.<br/> Doporučujeme slovník pro jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g> <b>stáhnout</b>. Usnadníte si tím zadávání textu.<br/> <br/> V síti 3G bude stahování chvíli trvat. Pokud nemáte <b>neomezený datový tarif</b>, mohou vám být účtovány poplatky.<br/> Jestliže si nejste jisti, jaký datový tarif máte, doporučujeme vám najít připojení Wi-Fi. Stahování se pak zahájí automaticky.<br/> <br/> Tip: Slovníky můžete stahovat a odstraňovat v nabídce mobilního zařízení <b>Jazyk a vstup</b> v <b>Nastavení</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Stáhnout ihned (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Stáhnout pouze přes Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Je k dispozici slovník pro jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Stisknutím zkontrolujete a stáhnete"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Stahování: návrhy pro jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g> budou brzy k dispozici."</string> </resources> diff --git a/java/res/values-da/strings-appname.xml b/java/res/values-da/strings-appname.xml deleted file mode 100644 index faef5824b..000000000 --- a/java/res/values-da/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android-tastatur"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-stavekontrol"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Indstillinger for Android-tastatur"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Indstillinger for stavekontrol"</string> -</resources> diff --git a/java/res/values-da/strings.xml b/java/res/values-da/strings.xml index af472f723..8b4ea0795 100644 --- a/java/res/values-da/strings.xml +++ b/java/res/values-da/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-tastatur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android-tastatur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Indstillinger for Android-tastatur (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android-stavekontrol (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Indstillinger for Android-stavekontrol (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Indstillinger for input"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Forskningslogkommandoer"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-stavekontrol (AOSP)"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Slå kontaktnavne op"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Stavekontrollen bruger poster fra listen over kontaktpersoner"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibration ved tastetryk"</string> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Stemmeinput deaktiveret"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inputmetoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inputsprog"</string> + <string name="send_feedback" msgid="1780431884109392046">"Send feedback"</string> <string name="select_language" msgid="3693815588777926848">"Inputsprog"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tryk igen for at gemme"</string> <string name="has_dictionary" msgid="6071847973466625007">"Ordbog er tilgængelig"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivér brugerfeedback"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Vær med til at forbedre denne inputmetode ved at sende anvendelsesstatistikker og rapporter om nedbrud til Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Forsinkelsesindstillinger for lange tastetryk"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Indstillinger for varighed af vibration ved tastetryk"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Indstillinger for lydstyrke ved tastetryk"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Læs ekstern ordbogsfil"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Der er ingen ordbogsfiler i mappen Downloads"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vælg den ordbog, som du vil installere"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="language_settings" msgid="1671153053201809031">"Sprog og input"</string> <string name="select_input_method" msgid="4301602374609275003">"Vælg inputmetode"</string> - - <string name="app_name" msgid="1017058186322714405">"Dictionary Provider"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Dictionary Provider"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Ordbogstjeneste"</string> - <string name="download_description" msgid="3274861514695032954">"Opdateringsoplysninger for ordbøger"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Tillægsordbøger"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Der er en tilgængelig ordbog"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Indstillinger for ordbøger"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Brugerordbøger"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Brugerordbog"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Ordbog er tilgængelig"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Downloader i øjeblikket"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installeret"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installeret, deaktiveret"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Uden ordbogstjeneste"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Ingen tilg. ordbøger"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Opdater"</string> - <string name="last_update" msgid="3101549719827600346">"Sidst opdateret"</string> - <string name="message_updating" msgid="820186276704134720">"Søger efter opdateringer"</string> - <string name="message_loading" msgid="8611339149825047446">"Indlæser..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Hovedordbog"</string> - <string name="cancel" msgid="5586531736609183304">"Annuller"</string> - <string name="install_dict" msgid="5525005524697607865">"Installer"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Annuller download"</string> - <string name="disable_dict" msgid="7685810040236497700">"Deaktiver"</string> - <string name="enable_dict" msgid="3848179784702473680">"Aktivér"</string> - <string name="delete_dict" msgid="5817159290503843766">"Slet"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Det valgte sprog på din mobilenhed har en tilgængelig ordbog.<br/> Vi anbefaler, at du <b>downloader</b> <xliff:g id="LANGUAGE">%1$s</xliff:g>-ordbogen for at forbedre din skriveoplevelse.<br/> <br/> Downloaden kan tage 1-2 minutter via 3G. Der bliver muligvis opkrævet afgifter, hvis du ikke har et <b>ubegrænset dataabonnement</b>.<br/>. Hvis du ikke er sikker på, hvilket dataabonnemt du har, anbefaler vi, at du finder en Wi-Fi-forbindelse for at starte automatisk download.<br/> <br/>Tip: Du kan downloade og fjerne ordbøger ved at gå til <b>Sprog og input </b> i menuen <b>Indstillinger</b> på din mobilenhed."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Download nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Download via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Der er en tilgængelig ordbog for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Tryk for at gennemgå og downloade"</string> + <string name="app_name" msgid="6320102637491234792">"Dictionary Provider"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Dictionary Provider"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Ordbogstjeneste"</string> + <string name="download_description" msgid="6014835283119198591">"Opdateringsoplysninger for ordbøger"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Tillægsordbøger"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Ordbog er tilgængelig"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Indstillinger for ordbøger"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Brugerordbøger"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Brugerordbog"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Ordbog er tilgængelig"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Downloader i øjeblikket"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installeret"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installeret, deaktiveret"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Ingen ordbogstjeneste"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Ingen tilg. ordbøger"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Opdater"</string> + <string name="last_update" msgid="730467549913588780">"Sidst opdateret"</string> + <string name="message_updating" msgid="4457761393932375219">"Søger efter opdateringer"</string> + <string name="message_loading" msgid="8689096636874758814">"Indlæser..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Hovedordbog"</string> + <string name="cancel" msgid="6830980399865683324">"Annuller"</string> + <string name="install_dict" msgid="180852772562189365">"Installer"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Annuller"</string> + <string name="delete_dict" msgid="756853268088330054">"Slet"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Det valgte sprog på din mobilenhed har en tilgængelig ordbog.<br/> Vi anbefaler, at du <b>downloader</b> <xliff:g id="LANGUAGE">%1$s</xliff:g>-ordbogen for at forbedre din skriveoplevelse.<br/> <br/> Downloaden kan tage 1-2 minutter via 3G. Der bliver muligvis opkrævet et gebyr, hvis du ikke har et <b>ubegrænset dataabonnement</b>.<br/>. Hvis du ikke er sikker på, hvilket dataabonnement du har, anbefaler vi, at du finder en Wi-Fi-forbindelse for at starte automatisk download.<br/> <br/>Tip! Du kan downloade og fjerne ordbøger ved at gå til <b>Sprog og input </b> i menuen <b>Indstillinger</b> på din mobilenhed."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Download nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download via Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Der er en tilgængelig ordbog for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Tryk for at gennemgå og downloade"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Downloader: Der vil snart være forslag klar på <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-de/strings-appname.xml b/java/res/values-de/strings-appname.xml deleted file mode 100644 index fc5fb8902..000000000 --- a/java/res/values-de/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android-Tastatur"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-Rechtschreibprüfung"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android-Tastatureinstellungen"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Einstellungen für Rechtschreibprüfung"</string> -</resources> diff --git a/java/res/values-de/strings.xml b/java/res/values-de/strings.xml index 7ef3d0043..3f1137948 100644 --- a/java/res/values-de/strings.xml +++ b/java/res/values-de/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-Tastatur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android-Tastatur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android-Tastatureinstellungen (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android-Rechtschreibprüfung (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Einstellungen für die Android-Rechtschreibprüfung (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Eingabeoptionen"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Forschungsprotokollbefehle"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-Rechtschreibprüfung (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spracheingabe deaktiviert"</string> <string name="configure_input_method" msgid="373356270290742459">"Eingabemethoden konfigurieren"</string> <string name="language_selection_title" msgid="1651299598555326750">"Eingabesprachen"</string> + <string name="send_feedback" msgid="1780431884109392046">"Feedback geben"</string> <string name="select_language" msgid="3693815588777926848">"Eingabesprachen"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Zum Speichern erneut berühren"</string> <string name="has_dictionary" msgid="6071847973466625007">"Wörterbuch verfügbar"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Nutzer-Feedback aktivieren"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Tragen Sie zur Verbesserung dieses Eingabemethodeneditors bei, indem Sie automatisch Nutzungsstatistiken und Absturzberichte an Google senden."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Verzögerungseinstellungen für langen Tastendruck"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Vibrationsdauer bei Tastendruck"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Tonlautstärke bei Tastendruck"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Externe Wörterbuchdatei lesen"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Keine Wörterbuchdateien im Ordner \"Downloads\""</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wörterbuchdatei zum Installieren auswählen"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="language_settings" msgid="1671153053201809031">"Sprache & Eingabe"</string> <string name="select_input_method" msgid="4301602374609275003">"Eingabemethode wählen"</string> - - <string name="app_name" msgid="1017058186322714405">"Wörterbuchbereitstellung"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Wörterbuchbereitstellung"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Wörterbuch"</string> - <string name="download_description" msgid="3274861514695032954">"Update-Informationen für Wörterbuch"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Erweiterte Wörterbücher"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Wörterbuch verfügbar"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Einstellungen für Wörterbücher"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Meine Wörterbücher"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Mein Wörterbuch"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Wörterbuch verfügbar"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Aktuelle Downloads"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installiert"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installiert, deaktiviert"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Kein Wörterbuchdienst"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Keine Wörterbücher"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Aktualisieren"</string> - <string name="last_update" msgid="3101549719827600346">"Zuletzt aktualisiert"</string> - <string name="message_updating" msgid="820186276704134720">"Suche nach Updates..."</string> - <string name="message_loading" msgid="8611339149825047446">"Wird geladen..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Allgemeines Wörterbuch"</string> - <string name="cancel" msgid="5586531736609183304">"Abbrechen"</string> - <string name="install_dict" msgid="5525005524697607865">"Installieren"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Download abbrechen"</string> - <string name="disable_dict" msgid="7685810040236497700">"Deaktivieren"</string> - <string name="enable_dict" msgid="3848179784702473680">"Aktivieren"</string> - <string name="delete_dict" msgid="5817159290503843766">"Löschen"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Für die auf dem Mobilgerät ausgewählte Sprache ist ein Wörterbuch verfügbar.<br/> <b>Laden Sie das <xliff:g id="LANGUAGE">%1$s</xliff:g>-Wörterbuch herunter</b> und verbessern Sie Ihre Eingabeerfahrung.<br/> <br/>Der Download über 3G kann ein bis zwei Minuten dauern. Falls Sie keine <b>Datenflatrate</b> haben, fallen eventuell Gebühren an.<br/> Sollten Sie sich nicht sicher sein, welchen Datentarif Sie haben, suchen Sie eine WLAN-Verbindung, um den Download automatisch zu starten.<br/> <br/>Tipp: Im Menü <b>Einstellungen</b> Ihres Mobilgeräts können Sie unter <b>Sprache & Eingabe</b> Wörterbücher herunterladen und entfernen."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Jetzt herunterladen (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Über WLAN herunterladen"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Es ist ein Wörterbuch für <xliff:g id="LANGUAGE">%1$s</xliff:g> verfügbar."</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Zum Lesen und Herunterladen drücken"</string> + <string name="app_name" msgid="6320102637491234792">"Wörterbuchbereitstellung"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Wörterbuchbereitstellung"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Wörterbuch"</string> + <string name="download_description" msgid="6014835283119198591">"Update-Informationen für Wörterbuch"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Erweiterte Wörterbücher"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Wörterbuch verfügbar"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Einstellungen für Wörterbücher"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Meine Wörterbücher"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Mein Wörterbuch"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Wörterbuch verfügbar"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Wird heruntergeladen..."</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installiert"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installiert, deaktiviert"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Kein Wörterbuchdienst"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Keine Wörterbücher"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Aktualisieren"</string> + <string name="last_update" msgid="730467549913588780">"Zuletzt aktualisiert"</string> + <string name="message_updating" msgid="4457761393932375219">"Suche nach Updates..."</string> + <string name="message_loading" msgid="8689096636874758814">"Wird geladen..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Allgemeines Wörterbuch"</string> + <string name="cancel" msgid="6830980399865683324">"Abbrechen"</string> + <string name="install_dict" msgid="180852772562189365">"Installieren"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Abbrechen"</string> + <string name="delete_dict" msgid="756853268088330054">"Löschen"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Für die auf dem Mobilgerät ausgewählte Sprache ist ein Wörterbuch verfügbar.<br/> <b>Laden Sie das <xliff:g id="LANGUAGE">%1$s</xliff:g>-Wörterbuch herunter</b> und verbessern Sie Ihre Eingabeerfahrung.<br/> <br/>Der Download über 3G kann ein bis zwei Minuten dauern. Falls Sie keine <b>Datenflatrate</b> haben, fallen eventuell Gebühren an.<br/> Sollten Sie sich nicht sicher sein, welchen Datentarif Sie haben, suchen Sie eine WLAN-Verbindung, um den Download automatisch zu starten.<br/> <br/>Tipp: Im Menü <b>Einstellungen</b> Ihres Mobilgeräts können Sie unter <b>Sprache & Eingabe</b> Wörterbücher herunterladen und entfernen."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Jetzt herunterladen (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Über WLAN herunterladen"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Es ist ein Wörterbuch für <xliff:g id="LANGUAGE">%1$s</xliff:g> verfügbar."</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Zum Lesen und Herunterladen drücken"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Download wurde gestartet: Vorschläge für <xliff:g id="LANGUAGE">%1$s</xliff:g> sind in Kürze bereit."</string> </resources> diff --git a/java/res/values-el/strings-appname.xml b/java/res/values-el/strings-appname.xml deleted file mode 100644 index a199655f2..000000000 --- a/java/res/values-el/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Πληκτρολόγιο Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Ορθογραφικός έλεγχος Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Ρυθμίσεις πληκτρολογίου Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Ρυθμίσεις ορθογραφικού ελέγχου"</string> -</resources> diff --git a/java/res/values-el/strings.xml b/java/res/values-el/strings.xml index 74ffcf97c..41cf09854 100644 --- a/java/res/values-el/strings.xml +++ b/java/res/values-el/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Πληκτρολόγιο Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Πληκτρολόγιο Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Ρυθμίσεις πληκτρολογίου Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Ορθογραφικός έλεγχος Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Ρυθμίσεις ορθογραφικού ελέγχου Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Επιλογές εισόδου"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Έρευνα εντολών καταγραφής"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Ορθογραφικός έλεγχος Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Απεν. φωνητ. είσοδος"</string> <string name="configure_input_method" msgid="373356270290742459">"Διαμόρφωση μεθόδων εισαγωγής"</string> <string name="language_selection_title" msgid="1651299598555326750">"Γλώσσες εισόδου"</string> + <string name="send_feedback" msgid="1780431884109392046">"Αποστολή σχολίων"</string> <string name="select_language" msgid="3693815588777926848">"Γλώσσες εισόδου"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Αγγίξτε ξανά για αποθήκευση"</string> <string name="has_dictionary" msgid="6071847973466625007">"Λεξικό διαθέσιμο"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Ενεργοποίηση σχολίων χρηστών"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Βοηθήστε μας να βελτιώσουμε αυτό το πρόγραμμα επεξεργασίας μεθόδου εισόδου στέλνοντας αυτόματα στατιστικά στοιχεία και αναφορές σφαλμάτων στην Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Θέμα πληκτρολογίου"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Αγγλικά (Η.Β.)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Αγγλικά (Η.Π.Α)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Ρυθμίσεις καθυστέρησης παρατεταμένου πατήματος πλήκτρου"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Ρυθμίσεις διάρκειας δόνησης κατά το πάτημα πλήκτρων"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Ρυθμίσεις έντασης ήχου κατά το πάτημα πλήκτρων"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ανάγνωση εξωτερικού αρχείου λεξικού"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Δεν υπάρχουν αρχεία λεξικού στο φάκελο \"Λήψεις\""</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Επιλογή αρχείου λεξικού για εγκατάσταση"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Προεπιλογή"</string> <string name="language_settings" msgid="1671153053201809031">"Γλώσσα και εισαγωγή"</string> <string name="select_input_method" msgid="4301602374609275003">"Επιλογή μεθόδου εισαγωγής"</string> - - <string name="app_name" msgid="1017058186322714405">"Παροχέας λεξικού"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Παροχέας λεξικού"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Υπηρεσία λεξικού"</string> - <string name="download_description" msgid="3274861514695032954">"Ενημέρωση πληροφοριών λεξικού"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Πρόσθετα λεξικά"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Διαθέσιμο λεξικό"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Ρυθμίσεις για λεξικά"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Λεξικά χρήστη"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Λεξικό χρήστη"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Διαθέσιμο λεξικό"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Λήψη αυτήν τη στιγμή"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Εγκατεστημένο"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Εγκαταστάθηκε, απενεργοποιήθηκε"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Πρόβλ.σύνδ.στο λεξ."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Δεν υπάρχουν διαθέσιμα λεξικά"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Ανανέωση"</string> - <string name="last_update" msgid="3101549719827600346">"Τελευταία ενημέρωση"</string> - <string name="message_updating" msgid="820186276704134720">"Έλεγχος για ενημερώσεις"</string> - <string name="message_loading" msgid="8611339149825047446">"Φόρτωση..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Κύριο λεξικό"</string> - <string name="cancel" msgid="5586531736609183304">"Ακύρωση"</string> - <string name="install_dict" msgid="5525005524697607865">"Εγκατάσταση"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Ακύρωση λήψης"</string> - <string name="disable_dict" msgid="7685810040236497700">"Απενεργοποίηση"</string> - <string name="enable_dict" msgid="3848179784702473680">"Ενεργοποίηση"</string> - <string name="delete_dict" msgid="5817159290503843766">"Διαγραφή"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Υπάρχει διαθέσιμο λεξικό για τα <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Πατήστε για έλεγχο και λήψη"</string> + <string name="app_name" msgid="6320102637491234792">"Παροχέας λεξικού"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Παροχέας λεξικού"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Υπηρεσία λεξικού"</string> + <string name="download_description" msgid="6014835283119198591">"Ενημέρωση πληροφοριών λεξικού"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Πρόσθετα λεξικά"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Διαθέσιμο λεξικό"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Ρυθμίσεις για λεξικά"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Λεξικά χρήστη"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Λεξικό χρήστη"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Διαθέσιμο λεξικό"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Λήψη αυτήν τη στιγμή"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Εγκαταστάθηκε"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Εγκαταστάθηκε, απενεργοποιήθηκε"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Πρόβλ. σύνδ. στο λεξικό."</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Δεν υπάρχουν λεξικά"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Ανανέωση"</string> + <string name="last_update" msgid="730467549913588780">"Τελευταία ενημέρωση"</string> + <string name="message_updating" msgid="4457761393932375219">"Έλεγχος για ενημερώσεις"</string> + <string name="message_loading" msgid="8689096636874758814">"Φόρτωση…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Κύριο λεξικό"</string> + <string name="cancel" msgid="6830980399865683324">"Ακύρωση"</string> + <string name="install_dict" msgid="180852772562189365">"Εγκατάσταση"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Ακύρωση"</string> + <string name="delete_dict" msgid="756853268088330054">"Διαγραφή"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Η επιλ. γλώσσα στην κιν. συσκευή σας διαθέτει λεξικό.<br/> Προτείνουμε να <b>κάνετε λήψη</b> του λεξικού <xliff:g id="LANGUAGE">%1$s</xliff:g> για να βελτ. την πληκτρολόγηση.<br/> <br/> Για τη λήψη μπορεί να χρειαστούν 1 ή 2 λεπτά μέσω 3G. Ίσως ισχύουν χρεώσεις αν δεν έχετε <b>πρόγρ. απερ. δεδομ.</b>.<br/> Αν δεν γνωρίζετε ποιο πρόγ. δεδ. έχετε, προτείνουμε να βρείτε μια σύνδ. Wi-Fi για να ξεκιν. αυτόμ. η λήψη.<br/> <br/> Συμβουλή: Μπορείτε να λάβετε και να καταργ. λεξικά, από την περιοχή <b>Γλώσσα και εισαγωγή</b>, στο μενού <b>Ρυθμίσεις</b> της κιν. συσκ."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Άμεση λήψη (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Λήψη μέσω Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Υπάρχει διαθέσιμο λεξικό για τα <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Πατήστε για έλεγχο και λήψη"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Λήψη: Οι προτάσεις για τα <xliff:g id="LANGUAGE">%1$s</xliff:g> θα είναι έτοιμες σύντομα."</string> </resources> diff --git a/java/res/values-en-rGB/strings-appname.xml b/java/res/values-en-rGB/strings-appname.xml deleted file mode 100644 index ad9e782b0..000000000 --- a/java/res/values-en-rGB/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android keyboard"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android spell checker"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android keyboard settings"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Spell checking settings"</string> -</resources> diff --git a/java/res/values-en-rGB/strings.xml b/java/res/values-en-rGB/strings.xml index 3bb7babc8..3aab69202 100644 --- a/java/res/values-en-rGB/strings.xml +++ b/java/res/values-en-rGB/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android keyboard (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android Keyboard (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android Keyboard Settings (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android Spell Checker (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android Spell Checker Settings (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Input options"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Research Log Commands"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android spell checker (AOSP)"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Look up contact names"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Spell checker uses entries from your contact list"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Vibrate on key-press"</string> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Voice input is disabled"</string> <string name="configure_input_method" msgid="373356270290742459">"Configure input methods"</string> <string name="language_selection_title" msgid="1651299598555326750">"Input languages"</string> + <string name="send_feedback" msgid="1780431884109392046">"Send feedback"</string> <string name="select_language" msgid="3693815588777926848">"Input languages"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Touch again to save"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionary available"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Enable user feedback"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Help improve this input method editor by sending usage statistics and crash reports automatically to Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Key long press delay settings"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Key-press vibration duration settings"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Key-press sound volume settings"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Read external dictionary file"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No dictionary files in the Downloads folder"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Select a dictionary file to install"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Default"</string> <string name="language_settings" msgid="1671153053201809031">"Language & input"</string> <string name="select_input_method" msgid="4301602374609275003">"Choose input method"</string> - - <string name="app_name" msgid="1017058186322714405">"Dictionary Provider"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Dictionary Provider"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Dictionary Service"</string> - <string name="download_description" msgid="3274861514695032954">"Dictionary update information"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Add-on dictionaries"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dictionary available"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Settings for dictionaries"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"User dictionaries"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"User dictionary"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Dictionary available"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Currently downloading"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installed"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installed, disabled"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problem while connecting to dictionary service"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"No dictionaries available"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Refresh"</string> - <string name="last_update" msgid="3101549719827600346">"Last updated"</string> - <string name="message_updating" msgid="820186276704134720">"Checking for updates"</string> - <string name="message_loading" msgid="8611339149825047446">"Loading..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Main dictionary"</string> - <string name="cancel" msgid="5586531736609183304">"Cancel"</string> - <string name="install_dict" msgid="5525005524697607865">"Install"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Cancel download"</string> - <string name="disable_dict" msgid="7685810040236497700">"Disable"</string> - <string name="enable_dict" msgid="3848179784702473680">"Enable"</string> - <string name="delete_dict" msgid="5817159290503843766">"Delete"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"The selected language on your mobile device has an available dictionary.<br/> We recommend <b>downloading</b> the <xliff:g id="LANGUAGE">%1$s</xliff:g> dictionary to improve your typing experience.<br/> <br/> The download could take a minute or two over 3G. Charges may apply if you don\'t have an <b>unlimited data plan</b>.<br/> If you are not sure which data plan you have, we recommend finding a Wifi connection to start the download automatically.<br/> <br/> Tip: You can download and remove dictionaries by going to <b>Language & input</b> in the <b>Settings</b> menu of your mobile device."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Download now (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Download over Wifi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"A dictionary is available for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Press to review and download"</string> + <string name="app_name" msgid="6320102637491234792">"Dictionary Provider"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Dictionary Provider"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Dictionary Service"</string> + <string name="download_description" msgid="6014835283119198591">"Dictionary update information"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Add-on dictionaries"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dictionary available"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Settings for dictionaries"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"User dictionaries"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"User dictionary"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dictionary available"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Currently downloading"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installed"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installed, disabled"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Problem connecting to dictionary service"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"No dictionaries available"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Refresh"</string> + <string name="last_update" msgid="730467549913588780">"Last updated"</string> + <string name="message_updating" msgid="4457761393932375219">"Checking for updates"</string> + <string name="message_loading" msgid="8689096636874758814">"Loading..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Main dictionary"</string> + <string name="cancel" msgid="6830980399865683324">"Cancel"</string> + <string name="install_dict" msgid="180852772562189365">"Install"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancel"</string> + <string name="delete_dict" msgid="756853268088330054">"Delete"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"The selected language on your mobile device has an available dictionary.<br/> We recommend <b>downloading</b> the <xliff:g id="LANGUAGE">%1$s</xliff:g> dictionary to improve your typing experience.<br/> <br/> The download could take a minute or two over 3G. Charges may apply if you don\'t have an <b>unlimited data plan</b>.<br/> If you are not sure which data plan you have, we recommend finding a Wi-Fi connection to start the download automatically.<br/> <br/> Tip: You can download and remove dictionaries by going to <b>Language & input</b> in the <b>Settings</b> menu of your mobile device."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Download now (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Download over Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"A dictionary is available for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Press to review and download"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Downloading: suggestions for <xliff:g id="LANGUAGE">%1$s</xliff:g> will be ready soon."</string> </resources> diff --git a/java/res/values-es-rUS/strings-appname.xml b/java/res/values-es-rUS/strings-appname.xml deleted file mode 100644 index 5f08afba4..000000000 --- a/java/res/values-es-rUS/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Teclado de Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Corrector ortográfico de Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Configuración de teclado de Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Configuración del corrector ortográfico"</string> -</resources> diff --git a/java/res/values-es-rUS/strings.xml b/java/res/values-es-rUS/strings.xml index 0d0aa1430..6fe85f1eb 100644 --- a/java/res/values-es-rUS/strings.xml +++ b/java/res/values-es-rUS/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado de Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Teclado de Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Configuración del teclado de Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Corrector ortográfico de Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Configuración del corrector ortográfico de Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opciones de entrada"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos registro invest."</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corrector ortográfico de Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"La entrada por voz está inhabilitada"</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <string name="send_feedback" msgid="1780431884109392046">"Enviar comentarios"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Vuelve a tocar para guardar."</string> <string name="has_dictionary" msgid="6071847973466625007">"Diccionario disponible"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Activar los comentarios del usuario"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de introducción de texto al enviar las estadísticas de uso y los informes de error a Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Configuración de retraso de presión prolongada"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Duración de vibración al presionar teclas"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Volumen de sonido al presionar teclas"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leer archivo de diccionario externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hay archivos de diccionario en la carpeta de descargas."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleccionar archivo de diccionario para instalar"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Predeterminado"</string> <string name="language_settings" msgid="1671153053201809031">"Teclado e idioma"</string> <string name="select_input_method" msgid="4301602374609275003">"Seleccionar método de entrada"</string> - - <string name="app_name" msgid="1017058186322714405">"Proveedor de diccionarios"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Proveedor de diccionarios"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Servicio de diccionarios"</string> - <string name="download_description" msgid="3274861514695032954">"Información acerca de la actualización del diccionario"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Diccionarios complementarios"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Diccionario disponible"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Configuración de los diccionarios"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Diccionarios del usuario"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Diccionario del usuario"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Diccionario disponible"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Descarga en curso"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instalado"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instalado, inhabilitado"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Err. conex. con dic."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"No hay diccionarios."</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Actualizar"</string> - <string name="last_update" msgid="3101549719827600346">"Última actualización"</string> - <string name="message_updating" msgid="820186276704134720">"Buscando las actualizaciones"</string> - <string name="message_loading" msgid="8611339149825047446">"Cargando…"</string> - <string name="main_dict_description" msgid="1679964306980098570">"Diccionario principal"</string> - <string name="cancel" msgid="5586531736609183304">"Cancelar"</string> - <string name="install_dict" msgid="5525005524697607865">"Instalar"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Cancelar la descarga"</string> - <string name="disable_dict" msgid="7685810040236497700">"Inhabilitar"</string> - <string name="enable_dict" msgid="3848179784702473680">"Activar"</string> - <string name="delete_dict" msgid="5817159290503843766">"Eliminar"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE">%1$s</xliff:g> para mejorar tu experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Si no tienes un <b>plan de datos ilimitado</b>, es posible que se apliquen cargos.<br/> Si no conoces las características de tu plan de datos, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.<br/> <br/> Sugerencia: Puedes descargar y eliminar diccionarios en la sección <b>Idioma e introducción de texto</b> del menú <b>Ajustes</b> del dispositivo móvil."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Descargar ahora ( <xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Descargar mediante Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Hay un diccionario disponible de <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Pulsa para consultar y descargar"</string> + <string name="app_name" msgid="6320102637491234792">"Proveedor de diccionarios"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Proveedor de diccionarios"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Servicio de diccionarios"</string> + <string name="download_description" msgid="6014835283119198591">"Información acerca de la actualización de diccionarios"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Diccionarios complementarios"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Diccionario disponible"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Configuración para diccionarios"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Diccionarios del usuario"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Diccionario del usuario"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Diccionario disponible"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Descargando actualmente"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalado"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalado, inhabilitado"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Err. conex. con dic."</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"No hay diccionarios."</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string> + <string name="last_update" msgid="730467549913588780">"Última actualización"</string> + <string name="message_updating" msgid="4457761393932375219">"Buscando actualizaciones"</string> + <string name="message_loading" msgid="8689096636874758814">"Cargando..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Diccionario principal"</string> + <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="install_dict" msgid="180852772562189365">"Instalar"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> + <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE">%1$s</xliff:g> para mejorar tu experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Si no tienes un <b>plan de datos ilimitado</b>, es posible que se apliquen cargos.<br/> Si no conoces las características de tu plan de datos, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.<br/> <br/> Sugerencia: Puedes descargar y eliminar diccionarios en la sección <b>Teclado e idioma</b> del menú <b>Configuración</b> del dispositivo móvil."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Descargar ahora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar por Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Hay un diccionario disponible de <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Pulsar para opinar y descargar"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Descargando: las sugerencias de <xliff:g id="LANGUAGE">%1$s</xliff:g> estarán disponibles en breve."</string> </resources> diff --git a/java/res/values-es/strings-appname.xml b/java/res/values-es/strings-appname.xml deleted file mode 100644 index cce9a176d..000000000 --- a/java/res/values-es/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Teclado de Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Corrector ortográfico de Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Ajustes del teclado de Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Ajustes del corrector ortográfico"</string> -</resources> diff --git a/java/res/values-es/strings.xml b/java/res/values-es/strings.xml index 95846efa7..f02cb93a1 100644 --- a/java/res/values-es/strings.xml +++ b/java/res/values-es/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Teclado Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Ajustes del teclado de Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Corrector de Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Ajustes del corrector de Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opciones entrada texto"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos registro investigación"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corrector de Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entrada de voz inhabilitada"</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas"</string> + <string name="send_feedback" msgid="1780431884109392046">"Danos tu opinión"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toca otra vez para guardar."</string> <string name="has_dictionary" msgid="6071847973466625007">"Hay un diccionario disponible"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Habilitar comentarios de usuarios"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Ayuda a mejorar este editor de método de entrada de texto enviando estadísticas de uso e informes de error a Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Ajustes de retraso de pulsación prolongada"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Duración de la vibración al pulsar tecla"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Volumen sonido al pulsar tecla"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leer archivo de diccionario externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"No hay archivos de diccionario en la carpeta de descargas."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecciona un archivo de diccionario para instalar"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Predeterminado"</string> <string name="language_settings" msgid="1671153053201809031">"Idioma y entrada de texto"</string> <string name="select_input_method" msgid="4301602374609275003">"Selecciona un método de entrada"</string> - - <string name="app_name" msgid="1017058186322714405">"Proveedor del diccionario"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Proveedor del diccionario"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Servicio de diccionario"</string> - <string name="download_description" msgid="3274861514695032954">"Información de actualización del diccionario"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Diccionarios complementarios"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Diccionario disponible"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Ajustes de diccionarios"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Diccionarios del usuario"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Diccionario del usuario"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Hay un diccionario disponible"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Descargas en curso"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instalado"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instalado (inhabilitado)"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Error al conectar"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"No hay diccionarios"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Actualizar"</string> - <string name="last_update" msgid="3101549719827600346">"Última actualización"</string> - <string name="message_updating" msgid="820186276704134720">"Buscando actualizaciones"</string> - <string name="message_loading" msgid="8611339149825047446">"Cargando..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Diccionario principal"</string> - <string name="cancel" msgid="5586531736609183304">"Cancelar"</string> - <string name="install_dict" msgid="5525005524697607865">"Instalar"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Cancelar descarga"</string> - <string name="disable_dict" msgid="7685810040236497700">"Inhabilitar"</string> - <string name="enable_dict" msgid="3848179784702473680">"Habilitar"</string> - <string name="delete_dict" msgid="5817159290503843766">"Eliminar"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE">%1$s</xliff:g> para mejorar tu experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Si no tienes un <b>plan de datos ilimitado</b>, es posible que se apliquen cargos.<br/> Si no conoces las características de tu plan de datos, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.<br/> <br/> Sugerencia: puedes descargar y eliminar diccionarios en la sección <b>Idioma e introducción de texto</b> del menú <b>Ajustes</b> del dispositivo móvil."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Descargar ahora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Descargar mediante Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Hay un diccionario disponible de <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Pulsa para comprobar y descargar"</string> + <string name="app_name" msgid="6320102637491234792">"Proveedor del diccionario"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Proveedor del diccionario"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Servicio de diccionario"</string> + <string name="download_description" msgid="6014835283119198591">"Información de actualización del diccionario"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Diccionarios complementarios"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Diccionario disponible"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Ajustes de diccionarios"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Diccionarios del usuario"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Diccionario del usuario"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Diccionario disponible"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Descargando..."</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalado"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalado (inhabilitado)"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Error al conectar"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"No hay diccionarios"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizar"</string> + <string name="last_update" msgid="730467549913588780">"Última actualización"</string> + <string name="message_updating" msgid="4457761393932375219">"Buscando actualizaciones"</string> + <string name="message_loading" msgid="8689096636874758814">"Cargando..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Diccionario principal"</string> + <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="install_dict" msgid="180852772562189365">"Instalar"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> + <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Hay un diccionario disponible para el idioma seleccionado en tu dispositivo móvil.<br/> Te recomendamos que <b>descargues</b> el diccionario de <xliff:g id="LANGUAGE">%1$s</xliff:g> para mejorar tu experiencia de escritura.<br/> <br/> La descarga puede tardar unos minutos en redes 3G. Si no tienes un <b>plan de datos ilimitado</b>, se pueden aplicar cargos.<br/> Si no conoces las características de tu plan de datos, te recomendamos que uses una conexión Wi-Fi para iniciar la descarga automáticamente.<br/> <br/> Sugerencia: puedes descargar y eliminar diccionarios en la sección <b>Idioma y entrada de texto</b> del menú <b>Ajustes</b> del dispositivo móvil."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Descargar ahora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descargar mediante Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Hay un diccionario disponible de <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Pulsa para comprobar y descargar"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Descargando: las sugerencias de <xliff:g id="LANGUAGE">%1$s</xliff:g> estarán disponibles en breve."</string> </resources> diff --git a/java/res/values-et/strings-appname.xml b/java/res/values-et/strings-appname.xml deleted file mode 100644 index 181d597f9..000000000 --- a/java/res/values-et/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Androidi klaviatuur"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidi õigekirjakontroll"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Androidi klaviatuuri seaded"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Õigekirjakontrolli seaded"</string> -</resources> diff --git a/java/res/values-et/strings.xml b/java/res/values-et/strings.xml index 0697cab11..9d5db6690 100644 --- a/java/res/values-et/strings.xml +++ b/java/res/values-et/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-klaviatuur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Androidi klaviatuur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Androidi klaviatuuri seaded (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Androidi õigekirjakontroll (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Androidi õigekirjakontrolli seaded (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Sisestusvalikud"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Uuringulogi käsud"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidi õigekirjakontroll (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Kõnesisend on keelatud"</string> <string name="configure_input_method" msgid="373356270290742459">"Sisestusmeetodite seadistamine"</string> <string name="language_selection_title" msgid="1651299598555326750">"Sisestuskeeled"</string> + <string name="send_feedback" msgid="1780431884109392046">"Saatke tagasisidet"</string> <string name="select_language" msgid="3693815588777926848">"Sisestuskeeled"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Salvestamiseks puudutage uuesti"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sõnastik saadaval"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Luba kasutaja tagasiside"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Saatke Google\'ile automaatselt kasutusstatistikat ja krahhiaruandeid ning aidake seda sisestusmeetodi redigeerijat parandada."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Pika klahvivajutuse viivituse seaded"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Klahvivajutuse vibratsiooni kestuse seaded"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Klahvivajutuse helitugevuse seaded"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Välise sõnastikufaili lugemine"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Kaustas Allalaadimised pole ühtegi sõnastikufaili"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Installitava sõnastikufaili valimine"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Vaikeväärtus"</string> <string name="language_settings" msgid="1671153053201809031">"Keeled ja sisestamine"</string> <string name="select_input_method" msgid="4301602374609275003">"Valige sisestusmeetod"</string> - - <string name="app_name" msgid="1017058186322714405">"Sõnastikupakkuja"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Sõnastikupakkuja"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Sõnaraamatuteenus"</string> - <string name="download_description" msgid="3274861514695032954">"Sõnastiku värskendamisteave"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Pistiksõnastikud"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Sõnastik on saadaval"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Sõnastike seaded"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Kasutajasõnastikud"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Kasutajasõnastik"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Sõnastik on saadaval"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Praegu allalaadimisel"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installitud"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installitud, keelatud"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Tõrge sõnast. ühend."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Sõnastikke pole"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Värskenda"</string> - <string name="last_update" msgid="3101549719827600346">"Viimati värskendatud"</string> - <string name="message_updating" msgid="820186276704134720">"Värskenduste otsimine"</string> - <string name="message_loading" msgid="8611339149825047446">"Laadimine ..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Põhisõnastik"</string> - <string name="cancel" msgid="5586531736609183304">"Tühista"</string> - <string name="install_dict" msgid="5525005524697607865">"Installi"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Tühista allalaadimine"</string> - <string name="disable_dict" msgid="7685810040236497700">"Keela"</string> - <string name="enable_dict" msgid="3848179784702473680">"Luba"</string> - <string name="delete_dict" msgid="5817159290503843766">"Kustuta"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Mobiilseadmes valitud keelele on saadaval sõnastik.<br/> Teksti sisestamiseks soovitame <b>alla laadida</b> sõnastiku <xliff:g id="LANGUAGE">%1$s</xliff:g>.<br/> <br/> 3G kaudu allalaadimisele võib kuluda minut või paar. Kehtida võivad tasud, kui te ei kasuta <b>piiramatut andmepaketti</b>.<br/> Kui te ei tea, millist andmepaketti kasutate, soovitame allalaadimise automaatseks käivitamiseks leida WiFi-ühenduse.<br/> <br/> Nõuanne: sõnastikke saate alla laadida ja eemaldada, tehes valiku <b>Keele & sisend</b> mobiilseadme menüüs <b>Seaded</b>."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Laadi kohe alla (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Laadi alla WiFi kaudu"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Sõnastik on <xliff:g id="LANGUAGE">%1$s</xliff:g> keele jaoks saadaval"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Vajutage ülevaatamiseks ja allalaadimiseks"</string> + <string name="app_name" msgid="6320102637491234792">"Sõnastikupakkuja"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Sõnastikupakkuja"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Sõnastikuteenus"</string> + <string name="download_description" msgid="6014835283119198591">"Sõnastiku värskendamisteave"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Pistiksõnastikud"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Sõnastik on saadaval"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Sõnastike seaded"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Kasutaja sõnastikud"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Kasutaja sõnastik"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Sõnastik on saadaval"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Praegu allalaadimisel"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installitud"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installitud, keelatud"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Probleem sõnastikuga ühendumisel"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Sõnastikke pole"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Värskenda"</string> + <string name="last_update" msgid="730467549913588780">"Viimati värskendatud"</string> + <string name="message_updating" msgid="4457761393932375219">"Värskenduste otsimine"</string> + <string name="message_loading" msgid="8689096636874758814">"Laadimine ..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Peamine sõnastik"</string> + <string name="cancel" msgid="6830980399865683324">"Tühista"</string> + <string name="install_dict" msgid="180852772562189365">"Installi"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Tühista"</string> + <string name="delete_dict" msgid="756853268088330054">"Kustuta"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Mobiilseadmes valitud keelele on saadaval sõnastik.<br/> Teksti mugavamaks sisestamiseks soovitame <b>alla laadida</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> keele sõnastiku.<br/> <br/> 3G kaudu allalaadimisele võib kuluda minut või paar. Kehtida võivad tasud, kui te ei kasuta <b>piiramatut andmepaketti</b>.<br/> Kui te ei tea, millist andmepaketti kasutate, soovitame allalaadimise automaatseks käivitamiseks leida WiFi-ühenduse.<br/> <br/> Nõuanne: sõnastikke saate alla laadida ja eemaldada, tehes valiku <b>Keel ja sisestamine</b> mobiilseadme menüüs <b>Seaded</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Laadi kohe alla (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Laadi alla WiFi kaudu"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Sõnastik on <xliff:g id="LANGUAGE">%1$s</xliff:g> keele jaoks saadaval"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Vajutage ülevaatamiseks ja allalaadimiseks"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Allalaadimine: <xliff:g id="LANGUAGE">%1$s</xliff:g> keele soovitused on varsti saadaval."</string> </resources> diff --git a/java/res/values-fa/strings-appname.xml b/java/res/values-fa/strings-appname.xml deleted file mode 100644 index ba2a76ff1..000000000 --- a/java/res/values-fa/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"صفحهکلید Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"غلطگیر املای Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"تنظیمات صفحهکلید Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"تنظیمات غلط گیر املا"</string> -</resources> diff --git a/java/res/values-fa/strings.xml b/java/res/values-fa/strings.xml index ecc7e28f5..3171e17c4 100644 --- a/java/res/values-fa/strings.xml +++ b/java/res/values-fa/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"صفحهکلید (Android (AOSP"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"صفحه کلید Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"تنظیمات صفحه کلید Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"غلطگیر Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"تنظیمات غلطگیر Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"گزینههای ورودی"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"فرمانهای گزارشگیری پژوهش"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"غلطگیر املای Android (AOSP)"</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> @@ -132,11 +134,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ورودی صدا غیرفعال است"</string> <string name="configure_input_method" msgid="373356270290742459">"پیکربندی روشهای ورودی"</string> <string name="language_selection_title" msgid="1651299598555326750">"زبانهای ورودی"</string> + <string name="send_feedback" msgid="1780431884109392046">"ارسال بازخورد"</string> <string name="select_language" msgid="3693815588777926848">"زبانهای ورودی"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"برای ذخیره دوباره لمس کنید"</string> <string name="has_dictionary" msgid="6071847973466625007">"دیکشنری موجود است"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"فعال کردن بازخورد کاربر"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"با ارسال خودکار آمارهای کاربرد و گزارشهای خرابی به Google، به بهبود این ویرایشگر روش ورودی کمک کنید."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"طرح زمینه صفحهکلید"</string> <string name="subtype_en_GB" msgid="88170601942311355">"انگلیسی (بریتانیا)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"انگلیسی (امریکا)"</string> @@ -163,9 +167,12 @@ <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="1881822418815012326">"تنظیمات تأخیر فشار طولانی کلید"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"تنظیمات مدت زمان لرزش فشار کلید"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"تنظیمات میزان صدای فشار کلید"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"خواندن فایل فرهنگ لغت خارجی"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"فایل فرهنگ لغتی در پوشه دانلودها وجود ندارد"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"یک فایل فرهنگ لغت برای نصب انتخاب کنید"</string> @@ -174,39 +181,34 @@ <string name="button_default" msgid="3988017840431881491">"پیشفرض"</string> <string name="language_settings" msgid="1671153053201809031">"زبان و ورودی"</string> <string name="select_input_method" msgid="4301602374609275003">"انتخاب روش ورودی"</string> - - <string name="app_name" msgid="1017058186322714405">"ارائهدهنده فرهنگ لغت"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"ارائه دهنده فرهنگ لغت"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"سرویس فرهنگ لغت"</string> - <string name="download_description" msgid="3274861514695032954">"اطلاعات بهروزرسانی فرهنگ لغت"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"فرهنگهای لغت افزودنی"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"فرهنگ لغت در دسترس"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"تنظیمات برای فرهنگ لغتها"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"فرهنگهای لغت کاربر"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"فرهنگ لغت کاربر"</string> - <string name="dictionary_available" msgid="3192920608520618083">"فرهنگ لغت موجود است"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"موارد در حال دانلود کنونی"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"نصب شد"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"نصب شد، غیرفعال شد"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"مشکل اتصال به سرویس فرهنگ لغت"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"هیچ فرهنگ لغتی موجود نیست"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"بازخوانی"</string> - <string name="last_update" msgid="3101549719827600346">"تاریخ آخرین بهروزرسانی"</string> - <string name="message_updating" msgid="820186276704134720">"درحال بررسی بهروزرسانیها"</string> - <string name="message_loading" msgid="8611339149825047446">"در حال بارگیری..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"فرهنگ لغت اصلی"</string> - <string name="cancel" msgid="5586531736609183304">"لغو"</string> - <string name="install_dict" msgid="5525005524697607865">"نصب"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"لغو دانلود"</string> - <string name="disable_dict" msgid="7685810040236497700">"غیرفعال کردن"</string> - <string name="enable_dict" msgid="3848179784702473680">"فعال کردن"</string> - <string name="delete_dict" msgid="5817159290503843766">"حذف"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"یک فرهنگ لغت برای <xliff:g id="LANGUAGE">%1$s</xliff:g> در دسترس است"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"برای مرور و دانلود فشار دهید"</string> + <string name="app_name" msgid="6320102637491234792">"ارائهدهنده فرهنگ لغت"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"ارائهدهنده فرهنگ لغت"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"سرویس فرهنگ لغت"</string> + <string name="download_description" msgid="6014835283119198591">"اطلاعات بهروزرسانی فرهنگ لغت"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"فرهنگ لغتهای افزودنی"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"فرهنگ لغت موجود است"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"تنظیمات برای فرهنگ لغتها"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"فرهنگهای لغت کاربر"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"فرهنگ لغت کاربر"</string> + <string name="dictionary_available" msgid="4728975345815214218">"فرهنگ لغت موجود است"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"موارد در حال دانلود فعلی"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"نصب شده"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"نصب شد، غیرفعال شد"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"مشکل اتصال به سرویس فرهنگ لغت"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"هیچ فرهنگ لغتی موجود نیست"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"بازخوانی"</string> + <string name="last_update" msgid="730467549913588780">"آخرین بهروزرسانی"</string> + <string name="message_updating" msgid="4457761393932375219">"در حال بررسی بهروزرسانیها"</string> + <string name="message_loading" msgid="8689096636874758814">"در حال بارگیری…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"فرهنگ لغت اصلی"</string> + <string name="cancel" msgid="6830980399865683324">"لغو"</string> + <string name="install_dict" msgid="180852772562189365">"نصب"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"لغو"</string> + <string name="delete_dict" msgid="756853268088330054">"حذف"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"برای زبان انتخاب شده در دستگاه همراه شما فرهنگ لغتی موجود است.<br/> توصیه میکنیم فرهنگ لغت <xliff:g id="LANGUAGE">%1$s</xliff:g> را <b>دانلود کنید</b> تا بهتر تایپ کنید.<br/> <br/> دانلود از طریق 3G ممکن است چند لحظه طول بکشد. اگر <b>طرح داده نامحدود</b> نداشته باشید ممکن است برایتان هزینه داشته باشد.<br/> اگر مطمئن نیستید طرح داده شما چیست٬ توصیه میکنیم یک اتصال Wi-Fi پیدا کنید تا دانلود بطور خودکار شروع شود.<br/> <br/> نکته: میتوانید فرهنگ لغت را با رفتن به منوی <b>زبان و ورودی</b> در <b>تنظیمات</b> در دستگاه همراه خود دانلود و حذف کنید."</string> + <string name="download_over_metered" msgid="1643065851159409546">"هماکنون بارگیری شود (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> مگابایت)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"دانلود ازطریق Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"یک فرهنگ لغت برای <xliff:g id="LANGUAGE">%1$s</xliff:g> موجود است"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"برای مرور و دانلود فشار دهید"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"دانلود لغات پیشنهادی برای <xliff:g id="LANGUAGE">%1$s</xliff:g> به زودی شروع میشود."</string> </resources> diff --git a/java/res/values-fi/strings-appname.xml b/java/res/values-fi/strings-appname.xml deleted file mode 100644 index b2e23d552..000000000 --- a/java/res/values-fi/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android-näppäimistö"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-oikoluku"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android-näppäimistön asetukset"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Oikolukuasetukset"</string> -</resources> diff --git a/java/res/values-fi/strings.xml b/java/res/values-fi/strings.xml index 624e4e6de..c537d32eb 100644 --- a/java/res/values-fi/strings.xml +++ b/java/res/values-fi/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-näppäimistö (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android-näppäimistö (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android-näppäimistön asetukset (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android-oikoluku (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android-oikoluvun asetukset (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Syöttövalinnat"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Tutkimuslokin komennot"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-oikoluku (AOSP)"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Hae kontaktien nimiä"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Oikeinkirjoituksen tarkistus käyttää kontaktiluettelosi tietoja."</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Käytä värinää näppäimiä painettaessa"</string> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Ääniohjaus on pois käytöstä"</string> <string name="configure_input_method" msgid="373356270290742459">"Määritä syöttötavat"</string> <string name="language_selection_title" msgid="1651299598555326750">"Syöttökielet"</string> + <string name="send_feedback" msgid="1780431884109392046">"Lähetä palautetta"</string> <string name="select_language" msgid="3693815588777926848">"Syöttökielet"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tallenna koskettamalla uudelleen"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sanakirja saatavilla"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Ota käyttäjäpalaute käyttöön"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Auta parantamaan tätä syöttötavan muokkausohjelmaa lähettämällä automaattisesti käyttötietoja ja kaatumisraportteja Googlelle."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <string name="not_now" msgid="6172462888202790482">"Ei nyt"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Sama tulotyyli 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="1881822418815012326">"Näppäimen pitkän painalluksen viiveasetukset"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Näppäimenpainalluksen värinän kestoasetukset"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Näppäimenpainalluksen äänenvoimakkuusasetukset"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lue ulkoista sanakirjatiedostoa"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Lataukset-kansiossa ei ole sanakirjatiedostoja"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Valitse asennettava sanakirjatiedosto"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Oletusarvot"</string> <string name="language_settings" msgid="1671153053201809031">"Kieli ja syöttötapa"</string> <string name="select_input_method" msgid="4301602374609275003">"Valitse syöttötapa"</string> - - <string name="app_name" msgid="1017058186322714405">"Sanakirjan tarjoaja"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Sanakirjan tarjoaja"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Sanakirjapalvelu"</string> - <string name="download_description" msgid="3274861514695032954">"Sanakirjan päivitystiedot"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Sanakirjalisäosat"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Sanakirja saatavilla"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Sanakirjojen asetukset"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Käyttäjän sanakirjat"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Käyttäjän sanakirja"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Sanakirja saatavilla"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Ladataan parhaillaan"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Asennettu"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Asennettu, poistettu käytöstä"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Ongelma yhd. sanak.palveluun"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Ei sanakirj. saatav."</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Päivitä"</string> - <string name="last_update" msgid="3101549719827600346">"Viimeksi päivitetty"</string> - <string name="message_updating" msgid="820186276704134720">"Tarkistetaan päivityksiä"</string> - <string name="message_loading" msgid="8611339149825047446">"Ladataan..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Pääsanakirja"</string> - <string name="cancel" msgid="5586531736609183304">"Peruuta"</string> - <string name="install_dict" msgid="5525005524697607865">"Asenna"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Peruuta lataus"</string> - <string name="disable_dict" msgid="7685810040236497700">"Poista käytöstä"</string> - <string name="enable_dict" msgid="3848179784702473680">"Ota käyttöön"</string> - <string name="delete_dict" msgid="5817159290503843766">"Poista"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Kielen <xliff:g id="LANGUAGE">%1$s</xliff:g> sanakirja on saatavilla"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Paina tätä, jos haluat tarkastella kohdetta tai ladata sen"</string> + <string name="app_name" msgid="6320102637491234792">"Sanakirjan tarjoaja"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Sanakirjan tarjoaja"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Sanakirjapalvelu"</string> + <string name="download_description" msgid="6014835283119198591">"Sanakirjan päivitystiedot"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Sanakirjalisäosat"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Sanakirja saatavilla"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Sanakirjojen asetukset"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Käyttäjän sanakirjat"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Käyttäjän sanakirja"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Sanakirja saatavilla"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Ladataan parhaillaan"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Asennettu"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Asennettu, poistettu käytöstä"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Ongelma yhdistettässä sanakirjapalveluun"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Ei sanakirjoja saatavilla"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Päivitä"</string> + <string name="last_update" msgid="730467549913588780">"Päivitetty viimeksi"</string> + <string name="message_updating" msgid="4457761393932375219">"Tarkistetaan päivityksiä"</string> + <string name="message_loading" msgid="8689096636874758814">"Ladataan…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Pääsanakirja"</string> + <string name="cancel" msgid="6830980399865683324">"Peruuta"</string> + <string name="install_dict" msgid="180852772562189365">"Asenna"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Peruuta"</string> + <string name="delete_dict" msgid="756853268088330054">"Poista"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Laitteesi käyttökielelle on saatavilla sanakirja.<br/> Suosittelemme <xliff:g id="LANGUAGE">%1$s</xliff:g>-sanakirjan <b>lataamista</b>, sillä se helpottaa laitteella kirjoittamista.<br/> <br/> Lataus kestää useimmiten muutaman minuutin 3G-yhteydellä. Latauksesta saatetaan periä maksu, ellei käytössäsi ole <b>rajoittamatonta tiedonsiirtopakettia</b>.<br/> Jos et ole varma tiedonsiirtosopimuksesi tyypistä, etsi käyttöösi wifi-yhteys, niin lataus alkaa automaattisesti.<br/> <br/> Vinkki: voit ladata ja poistaa sanakirjoja mobiililaitteesi <b>Asetukset</b>-valikon <b>Kieli ja syöttötapa</b> -osiossa."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Lataa nyt (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mt)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Lataa wifi-yhteydellä"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Kielen <xliff:g id="LANGUAGE">%1$s</xliff:g> sanakirja on saatavilla"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Paina tätä, jos haluat tarkastella kohdetta tai ladata sen"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Ladataan: pian ehdotuksia näytetään kielellä <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-fr/strings-appname.xml b/java/res/values-fr/strings-appname.xml deleted file mode 100644 index 8e2a6e088..000000000 --- a/java/res/values-fr/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Clavier Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Correcteur orthographique Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Paramètres du clavier Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Paramètres du correcteur orthographique"</string> -</resources> diff --git a/java/res/values-fr/strings.xml b/java/res/values-fr/strings.xml index 7788e5cde..c5771a1f2 100644 --- a/java/res/values-fr/strings.xml +++ b/java/res/values-fr/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Clavier Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Clavier Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Paramètres du clavier Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Correcteur orthographique Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Paramètres du correcteur orthographique Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Options de saisie"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Commandes journaux rech."</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Correcteur orthographique Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Saisie vocale désactivée"</string> <string name="configure_input_method" msgid="373356270290742459">"Configurer les modes de saisie"</string> <string name="language_selection_title" msgid="1651299598555326750">"Langues de saisie"</string> + <string name="send_feedback" msgid="1780431884109392046">"Envoyer des commentaires"</string> <string name="select_language" msgid="3693815588777926848">"Langues de saisie"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Appuyer de nouveau pour enregistrer"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dictionnaire disponible"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Autoriser les commentaires des utilisateurs"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Contribuer à l\'amélioration de cet éditeur du mode de saisie grâce à l\'envoi automatique de statistiques d\'utilisation et de rapports d\'incident à Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Paramètres de temporisation lors d\'un appui prolongé sur une touche"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Durée de vibration à chaque pression"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Volume sonore à chaque pression"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Lire un fichier de dictionnaire externe"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Aucun fichier de dictionnaire dans le dossier \"Téléchargements\""</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Sélectionner un fichier de dictionnaire à installer"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Par défaut"</string> <string name="language_settings" msgid="1671153053201809031">"Langue et saisie"</string> <string name="select_input_method" msgid="4301602374609275003">"Sélectionnez le mode de saisie"</string> - - <string name="app_name" msgid="1017058186322714405">"Fournisseur de dictionnaires"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Fournisseur de dictionnaires"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Service de dictionnaires"</string> - <string name="download_description" msgid="3274861514695032954">"Informations relatives à la mise à jour des dictionnaires"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Dictionnaires complémentaires"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dictionnaire disponible"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Paramètres des dictionnaires"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Dictionnaires personnels"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Dictionnaire personnel"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Dictionnaire disponible"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"En cours de téléchargement…"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installé"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installé, désactivé"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Pas de service dictionnaire."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Aucun dictionnaire."</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Actualiser"</string> - <string name="last_update" msgid="3101549719827600346">"Dernière mise à jour"</string> - <string name="message_updating" msgid="820186276704134720">"Recherche de mises à jour en cours…"</string> - <string name="message_loading" msgid="8611339149825047446">"Chargement…"</string> - <string name="main_dict_description" msgid="1679964306980098570">"Dictionnaire principal"</string> - <string name="cancel" msgid="5586531736609183304">"Annuler"</string> - <string name="install_dict" msgid="5525005524697607865">"Installer"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Annuler le téléchargement"</string> - <string name="disable_dict" msgid="7685810040236497700">"Désactiver"</string> - <string name="enable_dict" msgid="3848179784702473680">"Activer"</string> - <string name="delete_dict" msgid="5817159290503843766">"Supprimer"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Un dictionnaire est disponible pour la langue sélectionnée sur votre appareil mobile.<br/> Nous vous invitons à <b>télécharger</b> le dictionnaire <xliff:g id="LANGUAGE">%1$s</xliff:g> pour faciliter votre saisie.<br/> <br/> Le téléchargement peut prendre une à deux minutes via une connexion 3G. Des frais peuvent s\'appliquer si vous ne disposez pas d\'un <b>forfait Internet illimité</b>.<br/> Si vous n\'êtes pas sûr de votre forfait, nous vous conseillons d\'utiliser une connexion Wi-Fi pour lancer automatiquement le téléchargement.<br/> <br/> Astuce : Vous pouvez télécharger et supprimer des dictionnaires dans <b>Langue et saisie</b> du menu <b>Paramètres</b> de votre appareil mobile."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Télécharger maintenant (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mo)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Télécharger via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Un dictionnaire est disponible en <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Appuyez ici pour consulter et télécharger le dictionnaire."</string> + <string name="app_name" msgid="6320102637491234792">"Fournisseur de dictionnaires"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Fournisseur de dictionnaires"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Service de dictionnaires"</string> + <string name="download_description" msgid="6014835283119198591">"Informations relatives à la mise à jour des dictionnaires"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dictionnaires complémentaires"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dictionnaire disponible"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Paramètres des dictionnaires"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Dictionnaires personnels"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dictionnaire personnel"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dictionnaire disponible"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Téléchargement en cours…"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installé"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installé, désactivé"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Pas de service dico."</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Aucun dictionnaire"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Actualiser"</string> + <string name="last_update" msgid="730467549913588780">"Dernière mise à jour"</string> + <string name="message_updating" msgid="4457761393932375219">"Recherche de mises à jour en cours…"</string> + <string name="message_loading" msgid="8689096636874758814">"Chargement en cours..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Dictionnaire principal"</string> + <string name="cancel" msgid="6830980399865683324">"Annuler"</string> + <string name="install_dict" msgid="180852772562189365">"Installer"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Annuler"</string> + <string name="delete_dict" msgid="756853268088330054">"Supprimer"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Un dictionnaire est disponible pour la langue sélectionnée sur votre appareil mobile.<br/> Nous vous invitons à <b>télécharger</b> le dictionnaire <xliff:g id="LANGUAGE">%1$s</xliff:g> pour faciliter votre saisie.<br/> <br/> Le téléchargement peut prendre une à deux minutes via une connexion 3G. Des frais peuvent s\'appliquer si vous ne disposez pas d\'un <b>forfait Internet illimité</b>.<br/> Si vous n\'êtes pas sûr de votre forfait, nous vous conseillons d\'utiliser une connexion Wi-Fi pour lancer automatiquement le téléchargement.<br/> <br/> Astuce : Vous pouvez télécharger et supprimer des dictionnaires dans la section <b>Langue et saisie</b> du menu <b>Paramètres</b> de votre appareil mobile."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Télécharger (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mo)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Télécharger via Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Un dictionnaire est disponible en <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Appuyez ici pour consulter et télécharger le dictionnaire."</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"En cours de téléchargement. Des suggestions pour la langue suivante seront bientôt disponibles : <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-hi/strings-appname.xml b/java/res/values-hi/strings-appname.xml deleted file mode 100644 index 02283af9a..000000000 --- a/java/res/values-hi/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android कीबोर्ड"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android वर्तनी परीक्षक"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android कीबोर्ड सेटिंग"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"वर्तनी जांच सेटिंग"</string> -</resources> diff --git a/java/res/values-hi/strings.xml b/java/res/values-hi/strings.xml index 4676034b0..d7f9dc7ec 100644 --- a/java/res/values-hi/strings.xml +++ b/java/res/values-hi/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android कीबोर्ड (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android कीबोर्ड (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android कीबोर्ड सेटिंग (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android वर्तनी परीक्षक (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android वर्तनी परीक्षक सेटिंग (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"इनपुट विकल्प"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"लॉग आदेशों का शोध करें"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android वर्तनी परीक्षक (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ध्वनि इनपुट अक्षम है"</string> <string name="configure_input_method" msgid="373356270290742459">"इनपुट पद्धति कॉन्फ़िगर करें"</string> <string name="language_selection_title" msgid="1651299598555326750">"इनपुट भाषा"</string> + <string name="send_feedback" msgid="1780431884109392046">"फ़ीडबैक भेजें"</string> <string name="select_language" msgid="3693815588777926848">"इनपुट भाषाएं"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"सहेजने के लिए पुन: स्पर्श करें"</string> <string name="has_dictionary" msgid="6071847973466625007">"शब्दकोश उपलब्ध है"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"उपयोगकर्ता फ़ीडबैक सक्षम करें"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"उपयोग के आंकड़े और क्रैश रिपोर्ट Google को अपने आप भेज कर इस इनपुट पद्धति संपादक को बेहतर बनाने में सहायता करें."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"कीबोर्ड थीम"</string> <string name="subtype_en_GB" msgid="88170601942311355">"अंग्रेज़ी (यूके)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"अंग्रेज़ी (यूएस)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"कुंजी को देर तक दबाने के विलंब की सेटिंग"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"कुंजी-स्पर्श कंपन अवधि सेटिंग"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"कुंजी-स्पर्श ध्वनि वॉल्यूम सेटिंग"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"बाहरी डिक्शनरी फ़ाइल पढ़ें"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"डाउनलोड फ़ोल्डर में कोई शब्दकोश फ़ाइल नहीं है"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"इंस्टॉल करने के लिए कोई शब्दकोश फ़ाइल चुनें"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"डिफ़ॉल्ट"</string> <string name="language_settings" msgid="1671153053201809031">"भाषा और इनपुट"</string> <string name="select_input_method" msgid="4301602374609275003">"इनपुट पद्धति चुनें"</string> - - <string name="app_name" msgid="1017058186322714405">"डिक्शनरी प्रदाता"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"डिक्शनरी प्रदाता"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"डिक्शनरी सेवा"</string> - <string name="download_description" msgid="3274861514695032954">"डिक्शनरी अपडेट जानकारी"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"एड-ऑन डिक्शनरी"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"डिक्शनरी उपलब्ध"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"डिक्शनरी के लिए सेटिंग"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"उपयोगकर्ता डिक्शनरी"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"उपयोगकर्ता डिक्शनरी"</string> - <string name="dictionary_available" msgid="3192920608520618083">"डिक्शनरी उपलब्ध"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"वर्तमान में डाउनलोड हो रहा है"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"इंस्टॉल है"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"इंस्टॉल है, अक्षम है"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"डिक्श. सेवा से कनेक्ट करने में समस्या"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"कोई डिक्शनरी उपलब्ध नहीं"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"रीफ़्रेश करें"</string> - <string name="last_update" msgid="3101549719827600346">"अंतिम अपडेट"</string> - <string name="message_updating" msgid="820186276704134720">"अपडेट देखे जा रहे हैं"</string> - <string name="message_loading" msgid="8611339149825047446">"लोड हो रही है..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"मुख्य डिक्शनरी"</string> - <string name="cancel" msgid="5586531736609183304">"रद्द करें"</string> - <string name="install_dict" msgid="5525005524697607865">"इंस्टॉल करें"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"डाउनलोड रद्द करें"</string> - <string name="disable_dict" msgid="7685810040236497700">"अक्षम करें"</string> - <string name="enable_dict" msgid="3848179784702473680">"सक्षम करें"</string> - <string name="delete_dict" msgid="5817159290503843766">"हटाएं"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"<xliff:g id="LANGUAGE">%1$s</xliff:g> के लिए डिक्शनरी उपलब्ध है"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"समीक्षा और डाउनलोड करने के लिए दबाएं"</string> + <string name="app_name" msgid="6320102637491234792">"डिक्शनरी प्रदाता"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"डिक्शनरी प्रदाता"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"डिक्शनरी सेवा"</string> + <string name="download_description" msgid="6014835283119198591">"डिक्शनरी अपडेट जानकारी"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"एड-ऑन डिक्शनरी"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"डिक्शनरी उपलब्ध"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"डिक्शनरी की सेटिंग"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"उपयोगकर्ता डिक्शनरी"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"उपयोगकर्ता डिक्शनरी"</string> + <string name="dictionary_available" msgid="4728975345815214218">"डिक्शनरी उपलब्ध"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"वर्तमान में डाउनलोड हो रही है"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"इंस्टॉल है"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"इंस्टॉल है, अक्षम है"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"डिक्शनरी सेवा से कनेक्ट करने में समस्या"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"डिक्शनरी अनुपलब्ध"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"रीफ़्रेश करें"</string> + <string name="last_update" msgid="730467549913588780">"अंतिम अपडेट"</string> + <string name="message_updating" msgid="4457761393932375219">"अपडेट देखे जा रहे हैं"</string> + <string name="message_loading" msgid="8689096636874758814">"लोड हो रही है..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"मुख्य डिक्शनरी"</string> + <string name="cancel" msgid="6830980399865683324">"रद्द करें"</string> + <string name="install_dict" msgid="180852772562189365">"इंस्टॉल करें"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"रद्द करें"</string> + <string name="delete_dict" msgid="756853268088330054">"हटाएं"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"आपके मोबाइल उपकरण पर चयनित भाषा में डिक्शनरी उपलब्ध है.<br/> आपके लेखन अनुभव को बेहतर बनाने के लिए हम <xliff:g id="LANGUAGE">%1$s</xliff:g> डिक्शनरी को <b>डाउनलोड करने</b> की अनुशंसा करते हैं.<br/> <br/> 3G पर डाउनलोड होने में एक या दो मिनट लग सकते हैं. यदि आपके पास <b>असीमित डेटा प्लान</b> नहीं है, तो शुल्क लग सकते हैं.<br/> यदि आप अपने डेटा प्लान के बारे में सुनिश्चित नहीं हैं, तो हम अपने आप डाउनलोड प्रारंभ करने के लिए Wi-Fi कनेक्शन ढूंढने की अनुशंसा करते हैं.<br/> <br/> युक्ति: आप अपने मोबाइल उपकरण पर <b>सेटिंग</b> मेनू में <b>भाषा और इनपुट</b> पर जाकर डिक्शनरी डाउनलोड कर सकते हैं और निकाल सकते हैं."</string> + <string name="download_over_metered" msgid="1643065851159409546">"अभी डाउनलोड करें (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi से डाउनलोड करें"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> के लिए डिक्शनरी उपलब्ध है"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"समीक्षा करने और डाउनलोड करने के लिए दबाएं"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"डाउनलोड हो रहा है: <xliff:g id="LANGUAGE">%1$s</xliff:g> के लिए सुझाव जल्दी ही तैयार हो जाएंगे."</string> </resources> diff --git a/java/res/values-hr/strings-appname.xml b/java/res/values-hr/strings-appname.xml deleted file mode 100644 index 69fa2e9a1..000000000 --- a/java/res/values-hr/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Androidova tipkovnica"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidova provjera pravopisa"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Postavke Androidove tipkovnice"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Postavke provjere pravopisa"</string> -</resources> diff --git a/java/res/values-hr/strings.xml b/java/res/values-hr/strings.xml index 184535689..6a7139e40 100644 --- a/java/res/values-hr/strings.xml +++ b/java/res/values-hr/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android tipkovnica (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Androidova tipkovnica (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Postavke Androidove tipkovnice (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Androidova provjera pravopisa (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Postavke Androidove provjere pravopisa (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcije ulaza"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Istraživanje naredbi dnevnika"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidova provjera pravopisa (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. unos onemog."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfiguriraj načine ulaza"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jezici unosa"</string> + <string name="send_feedback" msgid="1780431884109392046">"Slanje povratnih informacija"</string> <string name="select_language" msgid="3693815588777926848">"Jezici unosa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dodirnite ponovo za spremanje"</string> <string name="has_dictionary" msgid="6071847973466625007">"Rječnik je dostupan"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Omogući korisničke povratne informacije"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Pomozite u poboljšanju ovog urednika ulazne metode automatskim slanjem statistike upotrebe i padova Googleu."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Postavke odgode dugog pritiska na tipke"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Postavke trajanja vibracije kod pritiska tipke"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Postavke glasnoće zvuka kod pritiska tipke"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Čitanje datoteke vanjskog rječnika"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"U mapi Preuzimanja nema datoteka rječnika"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Odabir datoteke rječnika za instaliranje"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Zadano"</string> <string name="language_settings" msgid="1671153053201809031">"Jezik i unos"</string> <string name="select_input_method" msgid="4301602374609275003">"Odabir načina unosa"</string> - - <string name="app_name" msgid="1017058186322714405">"Davatelj rječnika"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Davatelj rječnika"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Usluga rječnika"</string> - <string name="download_description" msgid="3274861514695032954">"Ažurirane informacije rječnika"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Rječnici - dodaci"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dostupan je rječnik"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Postavke za rječnike"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Korisnički rječnici"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Korisnički rječnik"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Rječnik je dostupan"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Trenutačno u preuzimanju"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instalirano"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instalirano, onemogućeno"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Nema usluge rječnika"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Rječnici nedostupni"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Osvježi"</string> - <string name="last_update" msgid="3101549719827600346">"Zadnje ažuriranje"</string> - <string name="message_updating" msgid="820186276704134720">"Provjera ažuriranja"</string> - <string name="message_loading" msgid="8611339149825047446">"Učitavanje..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Glavni rječnik"</string> - <string name="cancel" msgid="5586531736609183304">"Odustani"</string> - <string name="install_dict" msgid="5525005524697607865">"Instaliraj"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Otkaži preuzimanje"</string> - <string name="disable_dict" msgid="7685810040236497700">"Onemogući"</string> - <string name="enable_dict" msgid="3848179784702473680">"Omogući"</string> - <string name="delete_dict" msgid="5817159290503843766">"Izbriši"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Dostupan je rječnik za <xliff:g id="LANGUAGE">%1$s</xliff:g> jezik"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Pritisnite za pregled i preuzimanje"</string> + <string name="app_name" msgid="6320102637491234792">"Davatelj rječnika"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Davatelj rječnika"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Usluga rječnika"</string> + <string name="download_description" msgid="6014835283119198591">"Ažurirane informacije rječnika"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Rječnici dodaci"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dostupan je rječnik"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Postavke za rječnike"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Korisnički rječnici"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Korisnički rječnik"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dostupan je rječnik"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Trenutačno se preuzima"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalirano"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalirano, onemogućeno"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Nema usluge rječnika"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Rječnici nedostupni"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Osvježavanje"</string> + <string name="last_update" msgid="730467549913588780">"Zadnje ažuriranje"</string> + <string name="message_updating" msgid="4457761393932375219">"Provjera ažuriranja"</string> + <string name="message_loading" msgid="8689096636874758814">"Učitavanje..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Glavni rječnik"</string> + <string name="cancel" msgid="6830980399865683324">"Odustani"</string> + <string name="install_dict" msgid="180852772562189365">"Instaliraj"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Odustani"</string> + <string name="delete_dict" msgid="756853268088330054">"Izbriši"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Dostupan je rječnik za odabrani jezik na vašem uređaju.<br/> Preporučujemo <b>preuzimanje</b> rječnika za <xliff:g id="LANGUAGE">%1$s</xliff:g> radi boljeg doživljaja unosa teksta.<br/> <br/> Na 3G mreži preuzimanje može potrajati minutu ili dvije. Može podlijegati naplati ako nemate <b>neograničenu podatkovnu tarifu</b>.<br/> Ako niste sigurni koju tarifu imate, preporučujemo da pronađete Wi-Fi mrežu i pokrenete automatsko preuzimanje.<br/> <br/> Savjet: rječnike možete preuzeti i ukloniti u odjeljku <b>Jezik i unos</b> na izborniku <b>Postavke</b> na mobilnom uređaju."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Preuzmi sada (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Preuzmi putem Wi-Fi mreže"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Dostupan je rječnik za <xliff:g id="LANGUAGE">%1$s</xliff:g> jezik"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Pritisnite za pregled i preuzimanje"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Preuzimanje: prijedlozi za <xliff:g id="LANGUAGE">%1$s</xliff:g> bit će spremni uskoro."</string> </resources> diff --git a/java/res/values-hu/strings-appname.xml b/java/res/values-hu/strings-appname.xml deleted file mode 100644 index ad511cfbc..000000000 --- a/java/res/values-hu/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android-billentyűzet"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidos helyesírás-ellenőrző"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android-billentyűzet beállításai"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"A helyesírás-ellenőrzés beállításai"</string> -</resources> diff --git a/java/res/values-hu/strings.xml b/java/res/values-hu/strings.xml index 55cd3c235..1dd9a03d8 100644 --- a/java/res/values-hu/strings.xml +++ b/java/res/values-hu/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-billentyűzet (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android-billentyűzet (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android-billentyűzet beállításai (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Androidos helyesírás-ellenőrző (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Androidos helyesírás-ellenőrző beállításai (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Beviteli beállítások"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Naplózási parancsok"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidos helyesírás-ellenőrző (AOSP)"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Névjegyek keresése"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"A helyesírás-ellenőrző használja a névjegyek bejegyzéseit"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Rezgés billentyű megnyomása esetén"</string> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hangbevivel KI"</string> <string name="configure_input_method" msgid="373356270290742459">"Beviteli módok beállítása"</string> <string name="language_selection_title" msgid="1651299598555326750">"Beviteli nyelvek"</string> + <string name="send_feedback" msgid="1780431884109392046">"Visszajelzés küldése"</string> <string name="select_language" msgid="3693815588777926848">"Beviteli nyelvek"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Érintse meg újból a mentéshez"</string> <string name="has_dictionary" msgid="6071847973466625007">"Van elérhető szótár"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Felhasználói visszajelzés engedélyezése"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Segíthet ennek a beviteli módszernek a javításában, ha engedélyezi a használati statisztikák és a hibajelentések elküldését a Google-nak."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Gomb hosszú megnyomásának késleltetési beállítása"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Gombnyomás rezgési időtartamának beállításai"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Gombnyomás hangerejének beállításai"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Külső szótárfájl olvasása"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nincs szótárfájl a Letöltések mappában."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Válasszon ki egy szótárfájlt a telepítéshez."</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Alapértelmezett"</string> <string name="language_settings" msgid="1671153053201809031">"Nyelv és bevitel"</string> <string name="select_input_method" msgid="4301602374609275003">"Beviteli mód kiválasztása"</string> - - <string name="app_name" msgid="1017058186322714405">"Szótárszolgáltató"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Szótárszolgáltató"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Szótár szolgáltatás"</string> - <string name="download_description" msgid="3274861514695032954">"Szótárfrissítéssel kapcsolatos információk"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Bővítmények: szótárak"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Van rendelkezésre álló szótár"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Szótárak beállításai"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Felhasználói szótárak"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Felhasználói szótár"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Van rendelkezésre álló szótár"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Jelenlegi letöltések"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Telepítve"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Telepítve, kikapcsolva"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Csatlakozási hiba"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Nincs szótár"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Frissítés"</string> - <string name="last_update" msgid="3101549719827600346">"Utoljára frissítve"</string> - <string name="message_updating" msgid="820186276704134720">"Frissítések keresése"</string> - <string name="message_loading" msgid="8611339149825047446">"Betöltés..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Fő szótár"</string> - <string name="cancel" msgid="5586531736609183304">"Mégse"</string> - <string name="install_dict" msgid="5525005524697607865">"Telepítés"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Letöltés megszakítása"</string> - <string name="disable_dict" msgid="7685810040236497700">"Kikapcsolás"</string> - <string name="enable_dict" msgid="3848179784702473680">"Bekapcsolás"</string> - <string name="delete_dict" msgid="5817159290503843766">"Törlés"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"<xliff:g id="LANGUAGE">%1$s</xliff:g> nyelvhez van rendelkezésre álló szótár"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Nyomja meg az áttekintéshez és letöltéshez"</string> + <string name="app_name" msgid="6320102637491234792">"Szótárszolgáltató"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Szótárszolgáltató"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Szótárszolgáltatás"</string> + <string name="download_description" msgid="6014835283119198591">"Szótárfrissítéssel kapcsolatos információk"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Bővítmények: szótárak"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Van rendelkezésre álló szótár"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Szótárak beállításai"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Felhasználói szótárak"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Felhasználói szótár"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Van rendelkezésre álló szótár"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Jelenlegi letöltések"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Telepítve"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Telepítve, kikapcsolva"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Csatlakozási hiba"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Nincs szótár"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Frissítés"</string> + <string name="last_update" msgid="730467549913588780">"Legutóbb frissítve"</string> + <string name="message_updating" msgid="4457761393932375219">"Frissítések keresése"</string> + <string name="message_loading" msgid="8689096636874758814">"Betöltés..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Fő szótár"</string> + <string name="cancel" msgid="6830980399865683324">"Mégse"</string> + <string name="install_dict" msgid="180852772562189365">"Telepítés"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Mégse"</string> + <string name="delete_dict" msgid="756853268088330054">"Törlés"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"A mobileszközön kiválasztott nyelvhez szótár érhető el.<br/> A gépelési élmény javításához javasoljuk a(z) <xliff:g id="LANGUAGE">%1$s</xliff:g> szótár <b>letöltését.<br/> <br/> A letöltés 3G hálózaton keresztül néhány percig tart. Ha <b>előfizetése nem korlátlan</b>, a letöltés költségekkel járhat.<br/> Ha nem biztos abban, hogy milyen adatcsomagot használ, javasoljuk, hogy keressen egy Wi-Fi kapcsolatot a letöltés automatikus elindításához.<br/> <br/> Tipp: a szótárakat a mobileszköz <b>Beállítások</b> menüjében a <b>Nyelv és bevitel</b> részben töltheti le és távolíthatja el."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Töltse le most (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Letöltés Wi-Fivel"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> nyelvhez van rendelkezésre álló szótár"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Nyomja meg az áttekintéshez és letöltéshez"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Letöltés: a(z) <xliff:g id="LANGUAGE">%1$s</xliff:g> nyelvvel kapcsolatos javaslatok hamarosan elérhetők lesznek."</string> </resources> diff --git a/java/res/values-in/strings-appname.xml b/java/res/values-in/strings-appname.xml deleted file mode 100644 index 283d69247..000000000 --- a/java/res/values-in/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Keyboard Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Pemeriksa ejaan Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Setelan keyboard Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Setelan pemeriksa ejaan"</string> -</resources> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index f9b028c05..cd9b817ee 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Keyboard Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Keyboard Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Setelan Keyboard Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Pemeriksa Ejaan Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Setelan Pemeriksa Ejaan Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opsi masukan"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Riset Perintah Log"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Pemeriksa ejaan Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Masukan suara dinonaktifkan"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan metode masukan"</string> <string name="language_selection_title" msgid="1651299598555326750">"Bahasa masukan"</string> + <string name="send_feedback" msgid="1780431884109392046">"Kirim masukan"</string> <string name="select_language" msgid="3693815588777926848">"Bahasa masukan"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamus yang tersedia"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Aktifkan masukan pengguna"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Bantu tingkatkan metode editor masukan dengan mengirim statistik penggunaan dan laporan kerusakan ke Google secara otomatis."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Setelan penundaan tekan lama tombol"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Setelan durasi getaran saat tombol ditekan"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Setelan volume suara saat tombol ditekan"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Membaca file kamus eksternal"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Tidak ada file kamus di folder Unduhan"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pilih file kamus untuk dipasang"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Default"</string> <string name="language_settings" msgid="1671153053201809031">"Bahasa & masukan"</string> <string name="select_input_method" msgid="4301602374609275003">"Pilih metode masukan"</string> - - <string name="app_name" msgid="1017058186322714405">"Penyedia Kamus"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Penyedia Kamus"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Layanan Kamus"</string> - <string name="download_description" msgid="3274861514695032954">"Informasi pembaruan kamus"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Kamus pengaya"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Kamus tersedia"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Setelan untuk kamus"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Kamus pengguna"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Kamus pengguna"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Kamus yang tersedia"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Saat ini sedang mengunduh"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Terpasang"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Terpasang, dinonaktifkan"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Masalah koneksi ke layanan kamus"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Tidak tersedia kamus"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Segarkan"</string> - <string name="last_update" msgid="3101549719827600346">"Terakhir diperbarui"</string> - <string name="message_updating" msgid="820186276704134720">"Memeriksa pembaruan"</string> - <string name="message_loading" msgid="8611339149825047446">"Memuat..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Kamus utama"</string> - <string name="cancel" msgid="5586531736609183304">"Batal"</string> - <string name="install_dict" msgid="5525005524697607865">"Pasang"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Batalkan unduhan"</string> - <string name="disable_dict" msgid="7685810040236497700">"Nonaktifkan"</string> - <string name="enable_dict" msgid="3848179784702473680">"Aktifkan"</string> - <string name="delete_dict" msgid="5817159290503843766">"Hapus"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Kamus tersedia untuk bahasa <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Tekan untuk meninjau dan mengunduh"</string> + <string name="app_name" msgid="6320102637491234792">"Penyedia Kamus"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Penyedia Kamus"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Layanan Kamus"</string> + <string name="download_description" msgid="6014835283119198591">"Informasi pembaruan kamus"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Kamus add-on"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Kamus yang tersedia"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Setelan untuk kamus"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Kamus pengguna"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Kamus pengguna"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Kamus yang tersedia"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Saat ini sedang mengunduh"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Terpasang"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Terpasang, dinonaktifkan"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Problem koneksi kamus"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Tidak tersedia kamus"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Segarkan"</string> + <string name="last_update" msgid="730467549913588780">"Terakhir diperbarui"</string> + <string name="message_updating" msgid="4457761393932375219">"Memeriksa pembaruan"</string> + <string name="message_loading" msgid="8689096636874758814">"Memuat..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Kamus utama"</string> + <string name="cancel" msgid="6830980399865683324">"Batal"</string> + <string name="install_dict" msgid="180852772562189365">"Pasang"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Batal"</string> + <string name="delete_dict" msgid="756853268088330054">"Hapus"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Bahasa pilihan pada perangkat seluler Anda memiliki kamus yang tersedia.<br/> Silakan <b>mengunduh</b> kamus <xliff:g id="LANGUAGE">%1$s</xliff:g> untuk meningkatkan pengalaman pengetikan.<br/> <br/> Unduhan dapat berlangsung selama satu atau dua menit melalui 3G. Mungkin dikenakan tagihan data jika Anda tidak memiliki <b>paket data tak terbatas</b>.<br/> Jika tidak yakin paket data mana yang Anda miliki, sebaiknya Anda mencari sambungan Wi-Fi untuk memulai unduhan secara otomatis.<br/> <br/> Kiat: Anda dapat mengunduh atau menghapus kamus dengan membuka <b>Bahasa & masukan</b> di menu <b>Setelan</b> perangkat seluler Anda."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Unduh sekarang (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Unduh melalui Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Kamus tersedia untuk bahasa <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Tekan untuk meninjau dan mengunduh"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Mengunduh: saran untuk bahasa <xliff:g id="LANGUAGE">%1$s</xliff:g> akan segera tersedia."</string> </resources> diff --git a/java/res/values-it/strings-appname.xml b/java/res/values-it/strings-appname.xml deleted file mode 100644 index b84896b9d..000000000 --- a/java/res/values-it/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Tastiera Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Controllo ortografico Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Impostazioni tastiera Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Impostazioni di controllo ortografico"</string> -</resources> diff --git a/java/res/values-it/strings.xml b/java/res/values-it/strings.xml index 52a99c479..028a7a25f 100644 --- a/java/res/values-it/strings.xml +++ b/java/res/values-it/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Tastiera Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Tastiera Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Impostazioni tastiera Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Controllo ortografico Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Impostazioni controllo ortografico Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opzioni inserimento"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Ricerca comandi di log"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Controllo ortografico Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input vocale disatt."</string> <string name="configure_input_method" msgid="373356270290742459">"Configura metodi di immissione"</string> <string name="language_selection_title" msgid="1651299598555326750">"Lingue comandi"</string> + <string name="send_feedback" msgid="1780431884109392046">"Invia feedback"</string> <string name="select_language" msgid="3693815588777926848">"Lingue comandi"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Tocca di nuovo per salvare"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dizionario disponibile"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Attiva commenti degli utenti"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Aiuta a migliorare l\'editor del metodo di inserimento inviando automaticamente a Google statistiche sull\'utilizzo e segnalazioni sugli arresti anomali."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Impostazioni di ritardo per pressione lunga sui tasti"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Durata vibrazione alla pressione tasto"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Volume audio alla pressione di un tasto"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Leggi file dizionario esterno"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nessun file di dizionario nella cartella Download"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Seleziona un file di dizionario da installare"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Predefinito"</string> <string name="language_settings" msgid="1671153053201809031">"Lingua e input"</string> <string name="select_input_method" msgid="4301602374609275003">"Scegli il metodo di immissione"</string> - - <string name="app_name" msgid="1017058186322714405">"Dictionary Provider"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Dictionary Provider"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Servizio dizionario"</string> - <string name="download_description" msgid="3274861514695032954">"Informazioni aggiornate dizionari"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Dizionari aggiuntivi"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dizionario disponibile"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Impostazioni per dizionari"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Dizionari utente"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Dizionario utente"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Dizionario disponibile"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"In fase di download"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installato"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installato, disabilitato"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problema conness. dizion."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Nessun dizionario"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Aggiorna"</string> - <string name="last_update" msgid="3101549719827600346">"Ultimo aggiornamento"</string> - <string name="message_updating" msgid="820186276704134720">"Verifica disponibilità aggiornamenti"</string> - <string name="message_loading" msgid="8611339149825047446">"Caricamento..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Dizionario principale"</string> - <string name="cancel" msgid="5586531736609183304">"Annulla"</string> - <string name="install_dict" msgid="5525005524697607865">"Installa"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Annulla download"</string> - <string name="disable_dict" msgid="7685810040236497700">"Disattiva"</string> - <string name="enable_dict" msgid="3848179784702473680">"Abilita"</string> - <string name="delete_dict" msgid="5817159290503843766">"Elimina"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"La lingua selezionata sul tuo dispositivo mobile ha un dizionario disponibile.<br/> Ti consigliamo di <b>scaricare</b> il dizionario di <xliff:g id="LANGUAGE">%1$s</xliff:g> per migliorare l\'esperienza di digitazione.<br/> <br/> Il download potrebbe richiedere un paio di minuti su reti 3G. Potrebbero essere applicate delle tariffe se non disponi di un <b>piano dati illimitato</b>.<br/> Se non sai bene quale piano dati è in uso, ti consigliamo di trovare una connessione Wi-Fi per avviare il download automaticamente.<br/> <br/> Suggerimento. Puoi scaricare e rimuovere i dizionari passando a <b>Lingue e immissione</b> nel menu <b>Impostazioni</b> del tuo dispositivo mobile."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Scarica ora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Scarica tramite Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"È disponibile un dizionario per <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Premi per esaminare e scaricare"</string> + <string name="app_name" msgid="6320102637491234792">"Dictionary Provider"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Dictionary Provider"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Servizio dizionario"</string> + <string name="download_description" msgid="6014835283119198591">"Informazioni aggiornamento dizionari"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dizionari aggiuntivi"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dizionario disponibile"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Impostazioni per dizionari"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Dizionari utente"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dizionario utente"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dizionario disponibile"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"In fase di download"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installato"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installato, disabilitato"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Conness. diz. imposs"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Nessun dizionario"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Aggiorna"</string> + <string name="last_update" msgid="730467549913588780">"Ultimo aggiornamento"</string> + <string name="message_updating" msgid="4457761393932375219">"Verifica disponibilità aggiornamenti"</string> + <string name="message_loading" msgid="8689096636874758814">"Caricamento in corso..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Dizionario principale"</string> + <string name="cancel" msgid="6830980399865683324">"Annulla"</string> + <string name="install_dict" msgid="180852772562189365">"Installa"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Annulla"</string> + <string name="delete_dict" msgid="756853268088330054">"Elimina"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Per la lingua selezionata sul dispositivo mobile è disponibile un dizionario.<br/> Ti consigliamo di <b>scaricare</b> il dizionario in <xliff:g id="LANGUAGE">%1$s</xliff:g> per migliorare l\'esperienza di digitazione.<br/> <br/> Il download potrebbe richiedere un paio di minuti su 3G. Potrebbero essere applicati costi se non disponi di un <b>piano dati illimitato</b>.<br/> Se non sei sicuro di quale sia il tuo piano dati, dovresti trovare una connessione Wi-Fi per avviare il download automaticamente.<br/> <br/> Suggerimento. Puoi scaricare e rimuovere dizionari passando a <b>Lingue e immissione</b> nel menu <b>Impostazioni</b> del dispositivo mobile."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Scarica ora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Scarica tramite Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"È disponibile un dizionario per <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Premi per esaminare e scaricare"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Download: i suggerimenti per <xliff:g id="LANGUAGE">%1$s</xliff:g> saranno pronti a breve."</string> </resources> diff --git a/java/res/values-iw/strings-appname.xml b/java/res/values-iw/strings-appname.xml deleted file mode 100644 index f3f4b674c..000000000 --- a/java/res/values-iw/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"מקלדת Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"בודק האיות של Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"הגדרות מקלדת Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"הגדרות בדיקת איות"</string> -</resources> diff --git a/java/res/values-iw/strings.xml b/java/res/values-iw/strings.xml index 9e5411bfb..fa6ccd56a 100644 --- a/java/res/values-iw/strings.xml +++ b/java/res/values-iw/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"מקלדת Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"מקלדת Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"הגדרות מקלדת Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"בודק האיות של Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"הגדרות בודק האיות של Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"אפשרויות קלט"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"פקודות יומן מחקר"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"בודק האיות של Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"הקלט הקולי מושבת"</string> <string name="configure_input_method" msgid="373356270290742459">"הגדרת שיטות קלט"</string> <string name="language_selection_title" msgid="1651299598555326750">"שפות קלט"</string> + <string name="send_feedback" msgid="1780431884109392046">"שלח משוב"</string> <string name="select_language" msgid="3693815588777926848">"שפות קלט"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"גע שוב כדי לשמור"</string> <string name="has_dictionary" msgid="6071847973466625007">"מילון זמין"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"הפוך משוב ממשתמשים לפעיל"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"עזור לשפר את עורך שיטת הקלט על ידי שליחה אוטומטית של סטטיסטיקת שימוש ודוחות קריסת מחשב ל-Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"עיצוב מקלדת"</string> <string name="subtype_en_GB" msgid="88170601942311355">"אנגלית (בריטניה)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"אנגלית (ארה\"ב)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"הגדרות השהייה בעת לחיצה ארוכה על מקש"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"הגדרות משך רטט בלחיצה על מקש"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"הגדרות עוצמת קול בלחיצה על מקש"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"קריאה של קובץ מילון חיצוני"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"אין קובצי מילונים בתיקיית ההורדות"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"בחירת קובץ מילון להתקנה"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"ברירת מחדל"</string> <string name="language_settings" msgid="1671153053201809031">"שפה וקלט"</string> <string name="select_input_method" msgid="4301602374609275003">"בחירת שיטת קלט"</string> - - <string name="app_name" msgid="1017058186322714405">"ספק המילון"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"ספק המילון"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"שירות מילון"</string> - <string name="download_description" msgid="3274861514695032954">"פרטי עדכון מילון"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"הוספת מילונים"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"מילון זמין"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"הגדרות עבור מילונים"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"מילוני משתמש"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"מילון משתמש"</string> - <string name="dictionary_available" msgid="3192920608520618083">"מילון זמין"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"מוריד כעת"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"מותקן"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"מותקן, מושבת"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"בעיה בהתחברות לשירות המילון"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"אין מילונים זמינים"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"רענן"</string> - <string name="last_update" msgid="3101549719827600346">"עודכן לאחרונה"</string> - <string name="message_updating" msgid="820186276704134720">"מחפש עדכונים"</string> - <string name="message_loading" msgid="8611339149825047446">"טוען..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"מילון ראשי"</string> - <string name="cancel" msgid="5586531736609183304">"ביטול"</string> - <string name="install_dict" msgid="5525005524697607865">"התקן"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"בטל הורדה"</string> - <string name="disable_dict" msgid="7685810040236497700">"השבת"</string> - <string name="enable_dict" msgid="3848179784702473680">"הפוך לפעיל"</string> - <string name="delete_dict" msgid="5817159290503843766">"מחק"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"לשפה הנבחרת במכשיר הנייד שלך יש מילון זמין.<br/> אנו ממליצים <b>להוריד</b> את המילון ב<xliff:g id="LANGUAGE">%1$s</xliff:g> כדי לשפר את חוויית ההקלדה.<br/> <br/> ההורדה עשויה לארוך דקה או שתיים ב-3G. ייתכן שתחויב אם אין לך <b>תוכנית נתונים בלתי מוגבלת</b>.<br/> אם אינך בטוח איזו תוכנית נתונים יש לך, אנו ממליצים לחפש חיבור Wi-Fi כדי להתחיל בהורדה באופן אוטומטי.<br/> <br/> טיפ: ניתן להוריד ולהסיר מילונים ב<b>שפה וקלט</b> בתפריט <b>הגדרות</b> של המכשיר הנייד שלך."</string> - <string name="download_over_metered" msgid="4024013764937850061">"הורד עכשיו (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"הורד באמצעות Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"יש מילון זמין עבור <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"לחץ כדי לעיין ולהוריד"</string> + <string name="app_name" msgid="6320102637491234792">"ספק המילון"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"ספק המילון"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"שירות מילון"</string> + <string name="download_description" msgid="6014835283119198591">"פרטי עדכון מילון"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"תוספי מילונים"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"מילון זמין"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"הגדרות עבור מילונים"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"מילוני משתמש"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"מילון משתמש"</string> + <string name="dictionary_available" msgid="4728975345815214218">"מילון זמין"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"מוריד כעת"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"מותקן"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"מותקן, מושבת"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"בעיה בהתחברות לשירות המילון"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"אין מילונים זמינים"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"רענן"</string> + <string name="last_update" msgid="730467549913588780">"עודכן לאחרונה"</string> + <string name="message_updating" msgid="4457761393932375219">"מחפש עדכונים"</string> + <string name="message_loading" msgid="8689096636874758814">"טוען..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"מילון ראשי"</string> + <string name="cancel" msgid="6830980399865683324">"ביטול"</string> + <string name="install_dict" msgid="180852772562189365">"התקן"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"בטל"</string> + <string name="delete_dict" msgid="756853268088330054">"מחק"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"לשפה הנבחרת במכשיר הנייד שלך יש מילון זמין.<br/> אנו ממליצים <b>להוריד</b> את המילון ב<xliff:g id="LANGUAGE">%1$s</xliff:g> כדי לשפר את חוויית ההקלדה.<br/> <br/> ההורדה עשויה לארוך דקה או שתיים ב-3G. ייתכן שתחויב אם אין לך <b>תוכנית נתונים בלתי מוגבלת</b>.<br/> אם אינך בטוח איזו תוכנית נתונים יש לך, אנו ממליצים לחפש חיבור Wi-Fi כדי להתחיל בהורדה באופן אוטומטי.<br/> <br/> טיפ: ניתן להוריד ולהסיר מילונים ב<b>שפה וקלט</b> בתפריט <b>הגדרות</b> של המכשיר הנייד שלך."</string> + <string name="download_over_metered" msgid="1643065851159409546">"הורד עכשיו (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"הורד באמצעות Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"יש מילון זמין עבור <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"לחץ כדי לעיין ולהוריד"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"מוריד: הצעות ב<xliff:g id="LANGUAGE">%1$s</xliff:g> יהיו מוכנות בקרוב."</string> </resources> diff --git a/java/res/values-ja/strings-appname.xml b/java/res/values-ja/strings-appname.xml deleted file mode 100644 index 16c1c05c6..000000000 --- a/java/res/values-ja/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Androidキーボード"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Androidスペルチェッカー"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Androidキーボードの設定"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"スペルチェックの設定"</string> -</resources> diff --git a/java/res/values-ja/strings.xml b/java/res/values-ja/strings.xml index 5464d6058..3c618ba42 100644 --- a/java/res/values-ja/strings.xml +++ b/java/res/values-ja/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Androidキーボード(AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Androidキーボード(AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Androidキーボードの設定(AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Androidスペルチェッカー(AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Androidスペルチェッカーの設定(AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"入力オプション"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"ログコマンドの検索"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Androidスペルチェッカー(AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"音声入力は無効です"</string> <string name="configure_input_method" msgid="373356270290742459">"入力方法を設定"</string> <string name="language_selection_title" msgid="1651299598555326750">"入力言語"</string> + <string name="send_feedback" msgid="1780431884109392046">"フィードバックを送信"</string> <string name="select_language" msgid="3693815588777926848">"入力言語"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"保存するにはもう一度タップ"</string> <string name="has_dictionary" msgid="6071847973466625007">"辞書を利用できます"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"ユーザーフィードバックを有効にする"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"IMEの機能向上のため、使用統計状況やクラッシュレポートをGoogleに自動送信します。"</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"キーボードのテーマ"</string> <string name="subtype_en_GB" msgid="88170601942311355">"英語 (英国)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"英語 (米国)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"キーの長押し時間の設定"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"キー操作バイブの振動時間の設定"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"キー操作音の音量設定"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"外部辞書ファイルの読み取り"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ダウンロードフォルダに辞書ファイルはありません"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"インストールする辞書ファイルの選択"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"デフォルト"</string> <string name="language_settings" msgid="1671153053201809031">"言語と入力"</string> <string name="select_input_method" msgid="4301602374609275003">"入力方法の選択"</string> - - <string name="app_name" msgid="1017058186322714405">"辞書提供元"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"辞書提供元"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"辞書"</string> - <string name="download_description" msgid="3274861514695032954">"辞書のアップデート情報"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"アドオン辞書"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"辞書を利用できます"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"辞書の設定"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"単語リスト"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"単語リスト"</string> - <string name="dictionary_available" msgid="3192920608520618083">"辞書を利用できます"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"ダウンロードしています"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"インストール済み"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"インストール済み、無効"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"辞書に接続できません"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"辞書はありません"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"更新"</string> - <string name="last_update" msgid="3101549719827600346">"最終更新日"</string> - <string name="message_updating" msgid="820186276704134720">"アップデートを確認しています"</string> - <string name="message_loading" msgid="8611339149825047446">"読み込み中..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"メイン辞書"</string> - <string name="cancel" msgid="5586531736609183304">"キャンセル"</string> - <string name="install_dict" msgid="5525005524697607865">"インストール"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"ダウンロードをキャンセル"</string> - <string name="disable_dict" msgid="7685810040236497700">"無効にする"</string> - <string name="enable_dict" msgid="3848179784702473680">"有効にする"</string> - <string name="delete_dict" msgid="5817159290503843766">"削除"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"<xliff:g id="LANGUAGE">%1$s</xliff:g>の辞書を利用できます"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"押すと確認/ダウンロードできます"</string> + <string name="app_name" msgid="6320102637491234792">"辞書提供元"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"辞書提供元"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"辞書"</string> + <string name="download_description" msgid="6014835283119198591">"辞書のアップデート情報"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"アドオン辞書"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"辞書を利用できます"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"辞書の設定"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"単語リスト"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"単語リスト"</string> + <string name="dictionary_available" msgid="4728975345815214218">"辞書を利用できます"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"ダウンロード中"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"インストール済み"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"インストール済み、無効"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"辞書に接続できません"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"辞書はありません"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"更新"</string> + <string name="last_update" msgid="730467549913588780">"最終更新"</string> + <string name="message_updating" msgid="4457761393932375219">"アップデートを確認しています"</string> + <string name="message_loading" msgid="8689096636874758814">"読み込んでいます..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"メイン辞書"</string> + <string name="cancel" msgid="6830980399865683324">"キャンセル"</string> + <string name="install_dict" msgid="180852772562189365">"インストール"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"キャンセル"</string> + <string name="delete_dict" msgid="756853268088330054">"削除"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"お使いの携帯端末で選択した言語に対応する辞書があります。<br/>入力機能をより快適にご利用いただくため、<xliff:g id="LANGUAGE">%1$s</xliff:g>の辞書の<b>ダウンロード</b>をおすすめします。<br/> <br/>3G経由の場合、ダウンロードに要する時間は1~2分です。<b>定額制のデータプラン</b>をご利用でない場合は通信料が発生する可能性があります。<br/>ご利用のデータプランが不明な場合は、自動的にダウンロードが開始されるWi-Fi接続を探すことをおすすめします。<br/> <br/>ヒント: 辞書のダウンロードや削除は、お使いの携帯端末の[<b>設定</b>]メニューの[<b>言語と入力</b>]で行えます。"</string> + <string name="download_over_metered" msgid="1643065851159409546">"今すぐダウンロード(<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi経由でダウンロード"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g>の辞書を利用できます"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"押すと確認/ダウンロードできます"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"ダウンロード中: <xliff:g id="LANGUAGE">%1$s</xliff:g>の入力候補をまもなく利用できます。"</string> </resources> diff --git a/java/res/values-ko/strings-appname.xml b/java/res/values-ko/strings-appname.xml deleted file mode 100644 index 3d7db6136..000000000 --- a/java/res/values-ko/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android 키보드"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android 맞춤법 검사기"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android 키보드 설정"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"맞춤법 검사 설정"</string> -</resources> diff --git a/java/res/values-ko/strings.xml b/java/res/values-ko/strings.xml index ca1c2ea6e..14cb49afb 100644 --- a/java/res/values-ko/strings.xml +++ b/java/res/values-ko/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android 키보드(AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android 키보드(AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android 키보드 설정(AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android 맞춤법 검사기(AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android 맞춤법 검사기 설정(AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"입력 옵션"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"로그 명령 탐색"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android 맞춤법 검사기(AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"음성 입력이 사용 중지됨"</string> <string name="configure_input_method" msgid="373356270290742459">"입력 방법 설정"</string> <string name="language_selection_title" msgid="1651299598555326750">"입력 언어"</string> + <string name="send_feedback" msgid="1780431884109392046">"의견 보내기"</string> <string name="select_language" msgid="3693815588777926848">"입력 언어"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"저장하려면 다시 터치"</string> <string name="has_dictionary" msgid="6071847973466625007">"사전 사용 가능"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"사용자 의견 사용"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"사용 통계 및 충돌 보고서를 Google에 자동으로 전송하여 입력 방법 편집기의 개선에 도움을 줍니다."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"키보드 테마"</string> <string name="subtype_en_GB" msgid="88170601942311355">"영어(영국)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"영어(미국)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"키 길게 누르기 지연 설정"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"키를 누를 때 진동 시간 설정"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"키를 누를 때 효과음 설정"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"외부 사전 파일 읽기"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"다운로드 폴더에 사전 파일이 없음"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"설치할 사전 파일 선택"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"기본값"</string> <string name="language_settings" msgid="1671153053201809031">"언어 및 키보드"</string> <string name="select_input_method" msgid="4301602374609275003">"입력 방법 선택"</string> - - <string name="app_name" msgid="1017058186322714405">"사전 제공업체"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"사전 제공업체"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"사전 서비스"</string> - <string name="download_description" msgid="3274861514695032954">"사전 업데이트 정보"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"사전 추가"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"사전 사용 가능"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"사전 설정"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"사용자 사전"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"사용자 사전"</string> - <string name="dictionary_available" msgid="3192920608520618083">"사전 사용 가능"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"현재 다운로드 중"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"설치됨"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"설치 완료되었으나 사용 중지됨"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"사전 서비스에 연결하는 동안 문제가 발생했습니다."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"사용할 수 있는 사전이 없습니다."</string> - <string name="check_for_updates_now" msgid="642057986127624986">"새로고침"</string> - <string name="last_update" msgid="3101549719827600346">"최근 업데이트"</string> - <string name="message_updating" msgid="820186276704134720">"업데이트를 확인하는 중"</string> - <string name="message_loading" msgid="8611339149825047446">"로드 중..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"기본 사전"</string> - <string name="cancel" msgid="5586531736609183304">"취소"</string> - <string name="install_dict" msgid="5525005524697607865">"설치"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"다운로드 취소"</string> - <string name="disable_dict" msgid="7685810040236497700">"사용 중지"</string> - <string name="enable_dict" msgid="3848179784702473680">"사용"</string> - <string name="delete_dict" msgid="5817159290503843766">"삭제"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"<xliff:g id="LANGUAGE">%1$s</xliff:g> 사전을 사용할 수 있습니다."</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"검토하고 다운로드하려면 누르세요."</string> + <string name="app_name" msgid="6320102637491234792">"사전 제공업체"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"사전 제공업체"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"사전 서비스"</string> + <string name="download_description" msgid="6014835283119198591">"사전 업데이트 정보"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"사전 추가"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"사전 사용 가능"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"사전 설정"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"사용자 사전"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"사용자 사전"</string> + <string name="dictionary_available" msgid="4728975345815214218">"사전 사용 가능"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"현재 다운로드 중"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"설치됨"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"설치 완료되었으나 사용 중지됨"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"사전 서비스에 연결하는 중에 문제가 발생했습니다."</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"사용할 수 있는 사전이 없습니다."</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"새로고침"</string> + <string name="last_update" msgid="730467549913588780">"최종 업데이트"</string> + <string name="message_updating" msgid="4457761393932375219">"업데이트를 확인하는 중"</string> + <string name="message_loading" msgid="8689096636874758814">"로드 중..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"기본 사전"</string> + <string name="cancel" msgid="6830980399865683324">"취소"</string> + <string name="install_dict" msgid="180852772562189365">"설치"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"취소"</string> + <string name="delete_dict" msgid="756853268088330054">"삭제"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"기기에서 선택한 언어로 사용할 수 있는 사전이 있습니다.<br/> <xliff:g id="LANGUAGE">%1$s</xliff:g> 사전을 <b>다운로드</b>하여 입력 환경을 개선해 보세요..<br/> <br/> 3G로 다운로드하는 경우 1-2분 정도 걸립니다. <b>무제한 데이터 요금제</b>가 아닌 경우 요금이 청구됩니다.<br/> 사용 중인 데이터 요금제를 잘 모르는 경우 Wi-Fi에 연결할 수 있는 곳을 찾아 자동 다운로드를 시작하는 것이 좋습니다.<br/> <br/> 도움말: 사전을 다운로드하거나 삭제하려면 <b>언어 및 키보드</b>로 이동하면 되며 이는 휴대기기의 <b>설정</b> 메뉴에 있습니다."</string> + <string name="download_over_metered" msgid="1643065851159409546">"지금 다운로드(<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Wi-Fi를 통해 다운로드"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> 사전을 사용할 수 있습니다."</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"검토하고 다운로드하려면 누르세요."</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"다운로드 중: <xliff:g id="LANGUAGE">%1$s</xliff:g>에 대한 추천항목이 곧 준비됩니다."</string> </resources> diff --git a/java/res/values-lt/strings-appname.xml b/java/res/values-lt/strings-appname.xml deleted file mode 100644 index 668d27531..000000000 --- a/java/res/values-lt/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"„Android“ klaviatūra"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"„Android“ rašybos tikrinimo programa"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"„Android“ klaviatūros nustatymai"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Rašybos tikrinimo nustatymai"</string> -</resources> diff --git a/java/res/values-lt/strings.xml b/java/res/values-lt/strings.xml index 49d9aec2a..7b51b2120 100644 --- a/java/res/values-lt/strings.xml +++ b/java/res/values-lt/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"„Android“ klaviatūra (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"„Android“ klaviatūra (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"„Android“ klaviatūros nustatymai (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"„Android“ rašybos tikrinimo programa (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"„Android“ rašybos tikrinimo programos nustatymai (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Įvesties parinktys"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Tyrinėti žurnalo komandas"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"„Android“ rašybos tikrinimo programa (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balso įv. neleidž."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigūruoti įvesties metodus"</string> <string name="language_selection_title" msgid="1651299598555326750">"Įvesties kalbos"</string> + <string name="send_feedback" msgid="1780431884109392046">"Siųsti atsiliepimą"</string> <string name="select_language" msgid="3693815588777926848">"Įvesties kalbos"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Jei norite išsaugoti, palieskite dar kartą"</string> <string name="has_dictionary" msgid="6071847973466625007">"Žodynas galimas"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Įgalinti naudotojų atsiliepimus"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Padėkite patobulinti šią įvesties metodo redagavimo programą automatiškai „Google“ siųsdami naudojimo statistiką ir strigčių ataskaitas."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Klavišo ilgo paspaudimo delsos nustatymai"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Vibracijos paspaudus mygtuką trukmės nustatymai"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Garso paspaudus mygtuką garsumo nustatymai"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Skaityti išorinį žodyno failą"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Atsisiuntimų aplanke nėra žodyno failų"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pasirinkite diegiamą žodyno failą"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Numatytieji"</string> <string name="language_settings" msgid="1671153053201809031">"Kalba ir įvestis"</string> <string name="select_input_method" msgid="4301602374609275003">"Pasirinkite įvesties metodą"</string> - - <string name="app_name" msgid="1017058186322714405">"Žodyno teikėjas"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Žodyno teikėjas"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Žodyno paslauga"</string> - <string name="download_description" msgid="3274861514695032954">"Žodyno atnaujinimo informacija"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Papildomi žodynai"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Žodynas galimas"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Žodynų nustatymai"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Naudotojo žodynai"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Naudotojo žodynas"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Žodynas galimas"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Šiuo metu atsisiunčiama"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Įdiegta"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Įdiegta, neleidžiama"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Prisijungimo prie žodyno paslaugos problema"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Nėra galimų žodynų"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Atnaujinti"</string> - <string name="last_update" msgid="3101549719827600346">"Paskutinį kartą atnaujinta"</string> - <string name="message_updating" msgid="820186276704134720">"Ieškoma naujinių"</string> - <string name="message_loading" msgid="8611339149825047446">"Įkeliama..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Pagrindinis žodynas"</string> - <string name="cancel" msgid="5586531736609183304">"Atšaukti"</string> - <string name="install_dict" msgid="5525005524697607865">"Įdiegti"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Atšaukti atsisiuntimą"</string> - <string name="disable_dict" msgid="7685810040236497700">"Neleisti"</string> - <string name="enable_dict" msgid="3848179784702473680">"Įgalinti"</string> - <string name="delete_dict" msgid="5817159290503843766">"Ištrinti"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Galimas <xliff:g id="LANGUAGE">%1$s</xliff:g> žodynas"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Paspauskite, kad peržiūrėtumėte ir atsisiųstumėte"</string> + <string name="app_name" msgid="6320102637491234792">"Žodyno teikėjas"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Žodyno teikėjas"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Žodyno paslauga"</string> + <string name="download_description" msgid="6014835283119198591">"Žodyno atnaujinimo informacija"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Papildomi žodynai"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Galimas žodynas"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Žodynų nustatymai"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Naudotojo žodynai"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Naudotojo žodynas"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Galimas žodynas"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Šiuo metu atsisiunčiama"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Įdiegta"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Įdiegta, neleidžiama"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Prisijung. problema"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Nėra galimų žodynų"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Atnaujinti"</string> + <string name="last_update" msgid="730467549913588780">"Paskutinį kartą atnaujinta"</string> + <string name="message_updating" msgid="4457761393932375219">"Ieškoma naujinių"</string> + <string name="message_loading" msgid="8689096636874758814">"Įkeliama..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Pagrindinis žodynas"</string> + <string name="cancel" msgid="6830980399865683324">"Atšaukti"</string> + <string name="install_dict" msgid="180852772562189365">"Įdiegti"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Atšaukti"</string> + <string name="delete_dict" msgid="756853268088330054">"Ištrinti"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Galimas mobiliajame įrenginyje pasirinktos kalbos žodynas.<br/> Rekomenduojame <b>atsisiųsti</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> žodyną, kad būtų patogiau įvesti tekstą.<br/> <br/> Atsisiuntimas per 3G turėtų trukti 1–2 min. Jei neturite <b>neribotų duomenų plano</b>, galite būti apmokestinti.<br/> Jei nežinote, kokį planą turite, rekomenduojame rasti „Wi-Fi“ ryšį, kad atsisiuntimas prasidėtų automatiškai.<br/> <br/> Patarimas: galite atsisiųsti ir pašalinti žodynus mobiliojo įrenginio meniu <b>Nustatymai</b> skiltyje <b>Kalba ir įvestis</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Atsisiųsti dabar (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Atsisiųsti per „Wi-Fi“"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Galimas <xliff:g id="LANGUAGE">%1$s</xliff:g> žodynas"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Paspauskite, kad peržiūrėtumėte ir atsisiųstumėte"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Atsisiunčiama. Netrukus bus galimi <xliff:g id="LANGUAGE">%1$s</xliff:g> pasiūlymai."</string> </resources> diff --git a/java/res/values-lv/strings-appname.xml b/java/res/values-lv/strings-appname.xml deleted file mode 100644 index e5657a237..000000000 --- a/java/res/values-lv/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android tastatūra"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android pareizrakstības pārbaudītājs"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android tastatūras iestatījumi"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Pareizrakstības pārbaudes iestatījumi"</string> -</resources> diff --git a/java/res/values-lv/strings.xml b/java/res/values-lv/strings.xml index 4d6fb3c01..676b7c410 100644 --- a/java/res/values-lv/strings.xml +++ b/java/res/values-lv/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android tastatūra (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android tastatūra (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android tastatūras iestatījumi (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android pareizrakstības pārbaudītājs (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android pareizrakstības pārbaudītāja iestatījumi (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Ievades opcijas"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Izpētes žurnāla komandas"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android pareizrakstības pārbaudītājs (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Balss iev. atspējota"</string> <string name="configure_input_method" msgid="373356270290742459">"Ievades metožu konfigurēšana"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ievades valodas"</string> + <string name="send_feedback" msgid="1780431884109392046">"Sūtīt atsauksmes"</string> <string name="select_language" msgid="3693815588777926848">"Ievades valodas"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Pieskarieties vēlreiz, lai saglabātu."</string> <string name="has_dictionary" msgid="6071847973466625007">"Ir pieejama vārdnīca."</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Iespējot lietotāju atsauksmes"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Palīdziet uzlabot šo ievades metodes redaktoru, automātiski nosūtot lietojuma statistiku un pārskatus par avārijām uzņēmumam Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Taustiņa ilgās nospiešanas noildzes iestatījumi"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Taustiņu nospiešanas vibrācijas ilguma iestatījumi"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Taustiņu nospiešanas skaņas skaļuma iestatījumi"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ārējās vārdnīcas faila nolasīšana"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Mapē Lejupielādes nav neviena vārdnīcas faila."</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Instalējamā vārdnīcas faila atlasīšana"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Noklusējums"</string> <string name="language_settings" msgid="1671153053201809031">"Valoda un ievade"</string> <string name="select_input_method" msgid="4301602374609275003">"Ievades metodes izvēle"</string> - - <string name="app_name" msgid="1017058186322714405">"Vārdnīcas nodrošinātājs"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Vārdnīcas nodrošinātājs"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Vārdnīcas pakalpojums"</string> - <string name="download_description" msgid="3274861514695032954">"Vārdnīcas atjauninājuma informācija"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Pievienojumvārdnīcas"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Vārdnīca ir pieejama"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Vārdnīcu iestatījumi"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Lietotāja vārdnīcas"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Lietotāja vārdnīca"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Vārdnīca ir pieejama."</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Notiek lejupielāde."</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instalēta"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instalēta, atspējota"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problēma, savien. ar vārdn. pak."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Vārdn. nav pieejamas"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Atsvaidzināt"</string> - <string name="last_update" msgid="3101549719827600346">"Pēdējo reizi atjaunināts"</string> - <string name="message_updating" msgid="820186276704134720">"Notiek pārbaude, vai ir pieejami atjauninājumi."</string> - <string name="message_loading" msgid="8611339149825047446">"Notiek ielāde..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Galvenā vārdnīca"</string> - <string name="cancel" msgid="5586531736609183304">"Atcelt"</string> - <string name="install_dict" msgid="5525005524697607865">"Instalēt"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Atcelt lejupielādi"</string> - <string name="disable_dict" msgid="7685810040236497700">"Atspējot"</string> - <string name="enable_dict" msgid="3848179784702473680">"Iespējot"</string> - <string name="delete_dict" msgid="5817159290503843766">"Dzēst"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Mobilajā ierīcē atlasītajai valodai ir pieejama vārdnīca.<br/> Ieteicams <b>lejupielādēt</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> vārdnīcu, lai uzlabotu rakstīšanas iespējas.<br/> <br/> Lejupielāde, izmantojot 3G, aizņems dažas minūtes. Ja nelietojat <b>neierobežotu datu plānu</b>, var tikt piemērota maksa.<br/> Ja nezināt, kādu datu plānu lietojat, atrodiet Wi-Fi savienojumu, lai automātiski sāktu lejupielādi.<br/> <br/> Padoms: vārdnīcas var lejupielādēt un noņemt mobilās ierīces izvēlnes <b>Iestatījumi</b> sadaļā <b>Valodas ievade</b>."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Lejupielādēt tūlīt (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Lejupielādēt, izmantojot Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Ir pieejama vārdnīca šādai valodai: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Nospiediet, lai pārskatītu un lejupielādētu"</string> + <string name="app_name" msgid="6320102637491234792">"Vārdnīcas nodrošinātājs"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Vārdnīcas nodrošinātājs"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Vārdnīcas pakalpojums"</string> + <string name="download_description" msgid="6014835283119198591">"Vārdnīcas atjauninājuma informācija"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Pievienojumvārdnīcas"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Vārdnīca ir pieejama"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Vārdnīcu iestatījumi"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Lietotāja vārdnīcas"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Lietotāja vārdnīca"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Vārdnīca ir pieejama"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Pašreiz tiek lejupielādēta"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalēta"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalēta, atspējota"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Nevar savien. ar vārdnīcas pakalp."</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Vārdn. nav pieejamas"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Atsvaidzināt"</string> + <string name="last_update" msgid="730467549913588780">"Pēdējo reizi atjaunināts"</string> + <string name="message_updating" msgid="4457761393932375219">"Notiek pārbaude, vai ir pieejami atjauninājumi."</string> + <string name="message_loading" msgid="8689096636874758814">"Notiek ielāde..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Galvenā vārdnīca"</string> + <string name="cancel" msgid="6830980399865683324">"Atcelt"</string> + <string name="install_dict" msgid="180852772562189365">"Instalēt"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Atcelt"</string> + <string name="delete_dict" msgid="756853268088330054">"Dzēst"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Mobilajā ierīcē atlasītajai valodai ir pieejama vārdnīca.<br/>Ieteicams <b>lejupielādēt</b> vārdnīcu (<xliff:g id="LANGUAGE">%1$s</xliff:g>), lai uzlabotu rakstīšanas iespējas.<br/><br/>Lejupielāde, izmantojot 3G tīklu, ilgs dažas minūtes. Ja nelietojat <b>neierobežotu datu plānu</b>, var tikt piemērota maksa.<br/>Ja nezināt, kādu datu plānu lietojat, ieteicams atrast Wi-Fi savienojumu, lai automātiski sāktu lejupielādi.<br/><br/>Padoms. Vārdnīcas var lejupielādēt un noņemt mobilās ierīces izvēlnes <b>Iestatījumi</b> sadaļā <b>Valoda un ievade</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Lejupielādēt tūlīt (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Lejupielādēt, izmantojot Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Ir pieejama vārdnīca šādai valodai: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Nospiediet, lai pārskatītu un lejupielādētu"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Notiek lejupielāde. Drīz būs pieejami ieteikumi šādai valodai: <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-ms/strings-appname.xml b/java/res/values-ms/strings-appname.xml deleted file mode 100644 index 73b553751..000000000 --- a/java/res/values-ms/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Papan kekunci Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Penyemak ejaan Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Tetapan papan kekunci Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Tetapan penyemakan ejaan"</string> -</resources> diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml index 7bcc28688..96e2b8c19 100644 --- a/java/res/values-ms/strings.xml +++ b/java/res/values-ms/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Papan kekunci Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Papan kekunci Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Tetapan Papan Kekunci Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Penyemak Ejaan Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Tetapan Penyemak Ejaan Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Pilihan input"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Arahan Log Penyelidikan"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Penyemak ejaan Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Input suara dilmphkn"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurasikan kaedah input"</string> <string name="language_selection_title" msgid="1651299598555326750">"Bahasa input"</string> + <string name="send_feedback" msgid="1780431884109392046">"Hantar maklum balas"</string> <string name="select_language" msgid="3693815588777926848">"Bahasa input"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Sentuh lagi untuk menyimpan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamus tersedia"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Dayakan maklum balas pengguna"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Bantu memperbaik editor input ini dengan menghantar statistik penggunaan dan laporan runtuhan kepada Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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 (AS)"</string> @@ -159,9 +163,12 @@ <string name="not_now" msgid="6172462888202790482">"Bukan sekarang"</string> <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Gaya input yang sama sudah wujud: <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="1881822418815012326">"Tetapan kelengahan tekan lama kekunci"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Tetapan tempoh getaran tekan kekunci"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Tetapan kelantangan bunyi tekanan kekunci"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Baca fail kamus luaran"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Tiada fail kamus dalam folder Muat Turun"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pilih fail kamus untuk dipasang"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Lalai"</string> <string name="language_settings" msgid="1671153053201809031">"Bahasa & input"</string> <string name="select_input_method" msgid="4301602374609275003">"Pilih kaedah input"</string> - - <string name="app_name" msgid="1017058186322714405">"Pembekal Kamus"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Pembekal Kamus"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Perkhidmatan Kamus"</string> - <string name="download_description" msgid="3274861514695032954">"Maklumat kemas kini kamus"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Kamus tambahan"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Kamus tersedia"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Tetapan untuk kamus"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Kamus pengguna"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Kamus pengguna"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Kamus tersedia"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Sedang memuat turun"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Dipasang"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Dipasang, dilumpuhkan"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Masalah menyambung kepada perkhidmatan kamus"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Tiada kamus tersedia"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Muat semula"</string> - <string name="last_update" msgid="3101549719827600346">"Kali terakhir dikemas kini"</string> - <string name="message_updating" msgid="820186276704134720">"Menyemak kemas kini"</string> - <string name="message_loading" msgid="8611339149825047446">"Memuatkan..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Kamus utama"</string> - <string name="cancel" msgid="5586531736609183304">"Batal"</string> - <string name="install_dict" msgid="5525005524697607865">"Pasang"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Batalkan muat turun"</string> - <string name="disable_dict" msgid="7685810040236497700">"Lumpuhkan"</string> - <string name="enable_dict" msgid="3848179784702473680">"Dayakan"</string> - <string name="delete_dict" msgid="5817159290503843766">"Padam"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Kamus tersedia untuk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Tekan untuk mengulas dan memuat turun"</string> + <string name="app_name" msgid="6320102637491234792">"Pembekal Kamus"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Pembekal Kamus"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Perkhidmatan Kamus"</string> + <string name="download_description" msgid="6014835283119198591">"Maklumat kemas kini kamus"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Kamus tambahan"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Kamus tersedia"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Tetapan untuk kamus"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Kamus pengguna"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Kamus pengguna"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Kamus tersedia"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Sedang memuat turun"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Dipasang"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Dipasang, dilumpuhkan"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Masalah menyambung kepada perkhidmatan kamus"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Tiada kamus tersedia"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Muatkan semula"</string> + <string name="last_update" msgid="730467549913588780">"Kali terakhir dikemas kini"</string> + <string name="message_updating" msgid="4457761393932375219">"Menyemak kemas kini"</string> + <string name="message_loading" msgid="8689096636874758814">"Memuatkan..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Kamus utama"</string> + <string name="cancel" msgid="6830980399865683324">"Batal"</string> + <string name="install_dict" msgid="180852772562189365">"Pasang"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Batal"</string> + <string name="delete_dict" msgid="756853268088330054">"Padam"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Bahasa pilihan pada peranti mudah alih anda mempunyai kamus tersedia.<br/> Kami mengesyorkan <b>memuat turun</b> kamus <xliff:g id="LANGUAGE">%1$s</xliff:g> untuk memperbaik pengalaman menaip anda.<br/> <br/> Muat turun boleh mengambil masa seminit atau dua melalui 3G. Caj mungkin dikenakan jika anda tidak mempunyai <b>pelan data tanpa had</b>.<br/> Jika anda tidak pasti jenis pelan data yang anda miliki, kami mengesyorkan agar anda mencari sambungan Wi-Fi untuk mula memuat turun secara automatik.<br/> <br/> Petua: Anda boleh memuat turun dan mengalih keluar kamus dengan pergi ke menu <b>Bahasa & input</b> dalam <b>Tetapan</b> peranti mudah alih anda."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Muat turun sekarang (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Muat turun melalui Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Kamus tersedia untuk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Tekan untuk mengulas dan memuat turun"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Memuat turun: cadangan untuk <xliff:g id="LANGUAGE">%1$s</xliff:g> akan sedia tidak lama lagi."</string> </resources> diff --git a/java/res/values-nb/strings-appname.xml b/java/res/values-nb/strings-appname.xml deleted file mode 100644 index 56c1c3c71..000000000 --- a/java/res/values-nb/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android-tastatur"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android-stavekontroll"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Innstillinger for Android-tastatur"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Innstillinger for stavekontroll"</string> -</resources> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 2e1d44ebd..2cac5ba8e 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-tastatur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android-tastatur (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Instillinger for Android-tastatur (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android-stavekontroll (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Innstillinger for Android-stavekontroll (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Inndataalternativer"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Kommandoer for undersøkelseslogging"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android-stavekontroll (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Taleinndata er deaktiv."</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurer inndatametoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inndataspråk"</string> + <string name="send_feedback" msgid="1780431884109392046">"Send tilbakemelding"</string> <string name="select_language" msgid="3693815588777926848">"Inndataspråk"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Trykk på nytt for å lagre"</string> <string name="has_dictionary" msgid="6071847973466625007">"Ordbok tilgjengelig"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Aktiver brukertilbakemelding"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Ved å sende bruksstatistikk og programstopprapporter til Google automatisk, hjelper du oss med å gjøre redigeringsfunksjonen for denne inndatametoden enda bedre."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Innstillinger for lange tastetrykk"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Innstillinger for vibrasjonsvarighet ved tastetrykk"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Innstillinger for lydstyrke ved tastetrykk"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Bruk en ekstern ordlistefil"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Det ligger ingen ordboksfiler i Nedlastinger-mappen"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Velg ordboksfilen du vil installere"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="language_settings" msgid="1671153053201809031">"Språk og inndata"</string> <string name="select_input_method" msgid="4301602374609275003">"Velg inndatametode"</string> - - <string name="app_name" msgid="1017058186322714405">"Ordlisteleverandør"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Ordlisteleverandør"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Ordboktjeneste"</string> - <string name="download_description" msgid="3274861514695032954">"Oppdateringsinformasjon for ordliste"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Tilleggsordlister"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Ordliste er tilgjengelig"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Innstillinger for ordlister"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Brukerordlister"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Brukerordliste"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Ordliste er tilgjengelig"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Laster ned nå"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installert"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installert, deaktivert"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Kan ikke koble til ordlistetjenesten"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Fant ingen ordliste"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Last inn på nytt"</string> - <string name="last_update" msgid="3101549719827600346">"Sist oppdatert"</string> - <string name="message_updating" msgid="820186276704134720">"Ser etter oppdateringer"</string> - <string name="message_loading" msgid="8611339149825047446">"Laster inn …"</string> - <string name="main_dict_description" msgid="1679964306980098570">"Hovedordliste"</string> - <string name="cancel" msgid="5586531736609183304">"Avbryt"</string> - <string name="install_dict" msgid="5525005524697607865">"Installer"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Avbryt nedlastingen"</string> - <string name="disable_dict" msgid="7685810040236497700">"Deaktiver"</string> - <string name="enable_dict" msgid="3848179784702473680">"Aktiver"</string> - <string name="delete_dict" msgid="5817159290503843766">"Slett"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Det valgte språket på mobileneheten din har en tilgjengelig ordliste.<br/> Vi anbefaler å <b>laste ned</b> ordlisten for <xliff:g id="LANGUAGE">%1$s</xliff:g>. Dette forbedrer skriveopplevelsen din.<br/> <br/> Nedlastingen kan ta fra ett til to minutter via 3G. Belastninger kan påløpe hvis du ikke har et abonnement med <b>ubegrenset databruk</b>.<br/> Hvis du er usikker på hvilken abonnementstype du har, anbefaler vi deg å finne en Wi-Fi-tilkobling for å starte nedlastingen automatisk.<br/> <br/> Tips: Du kan laste ned og fjerne ordlister ved å gå til <b>Språk og inndata</b> i menyen for <b>Innstillinger</b> på mobilenheten din."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Last ned nå (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Last ned via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"En ordliste er tilgjengelig for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Trykk for å se gjennom og laste ned"</string> + <string name="app_name" msgid="6320102637491234792">"Ordlisteleverandør"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Ordlisteleverandør"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Ordlistetjeneste"</string> + <string name="download_description" msgid="6014835283119198591">"Oppdateringsinformasjon for ordliste"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Tilleggsordlister"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Ordliste tilgjengelig"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Innstillinger for ordlister"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Brukerordlister"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Brukerordbok"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Ordliste tilgjengelig"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Laster ned nå"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installert"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installert, deaktivert"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Kan ikke koble til ordlistetjenesten"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Fant ingen ordlister"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Last inn på nytt"</string> + <string name="last_update" msgid="730467549913588780">"Sist oppdatert"</string> + <string name="message_updating" msgid="4457761393932375219">"Ser etter oppdateringer ..."</string> + <string name="message_loading" msgid="8689096636874758814">"Laster inn …"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Hovedordliste"</string> + <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> + <string name="install_dict" msgid="180852772562189365">"Installer"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Avbryt"</string> + <string name="delete_dict" msgid="756853268088330054">"Slett"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Det valgte språket på mobilenheten din har en tilgjengelig ordliste.<br/> Vi anbefaler å <b>laste ned</b> ordlisten for <xliff:g id="LANGUAGE">%1$s</xliff:g>. Dette forbedrer skriveopplevelsen din.<br/> <br/> Nedlastingen kan ta fra ett til to minutter via 3G. Belastninger kan påløpe hvis du ikke har et abonnement med <b>ubegrenset databruk</b>.<br/> Hvis du er usikker på hvilken abonnementstype du har, anbefaler vi deg å finne en Wi-Fi-tilkobling for å starte nedlastingen automatisk.<br/> <br/> Tips: Du kan laste ned og fjerne ordlister ved å gå til <b>Språk og inndata</b> i menyen for <b>Innstillinger</b> på mobilenheten din."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Last ned nå (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Last ned via Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"En ordliste er tilgjengelig for <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Trykk for å se gjennom og laste ned"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Laster ned: forslag blir snart tilgjengelige for <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-nl/strings-appname.xml b/java/res/values-nl/strings-appname.xml deleted file mode 100644 index ee288efbb..000000000 --- a/java/res/values-nl/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android-toetsenbord"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Spellingcontrole van Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Instellingen voor Android-toetsenbord"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Instellingen voor spellingcontrole"</string> -</resources> diff --git a/java/res/values-nl/strings.xml b/java/res/values-nl/strings.xml index 55aee63e9..93be4eae7 100644 --- a/java/res/values-nl/strings.xml +++ b/java/res/values-nl/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android-toetsenbord (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android-toetsenbord (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Instellingen voor het Android-toetsenbord (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Spellingcontrole van Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Instellingen voor spellingcontrole van Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Invoeropties"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Opdrachten in onderzoekslogbestand"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Spellingcontrole van Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Spraakinvoer is uit"</string> <string name="configure_input_method" msgid="373356270290742459">"Invoermethoden configureren"</string> <string name="language_selection_title" msgid="1651299598555326750">"Invoertalen"</string> + <string name="send_feedback" msgid="1780431884109392046">"Feedback verzenden"</string> <string name="select_language" msgid="3693815588777926848">"Invoertalen"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Raak nogmaals aan om op te slaan"</string> <string name="has_dictionary" msgid="6071847973466625007">"Woordenboek beschikbaar"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Gebruikersfeedback inschakelen."</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Help deze invoermethode te verbeteren door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Instellingen voor vertraging bij toets ingedrukt houden"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Instellingen voor trillingsduur bij druk op een toets"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Instellingen voor geluidsvolume bij druk op een toets"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Extern woordenboekbestand lezen"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Geen woordenboekbestanden in de map \'Downloads\'"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecteer een woordenboekbestand om te installeren"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Standaard"</string> <string name="language_settings" msgid="1671153053201809031">"Taal en invoer"</string> <string name="select_input_method" msgid="4301602374609275003">"Invoermethode selecteren"</string> - - <string name="app_name" msgid="1017058186322714405">"Woordenboekleverancier"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Woordenboekleverancier"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Woordenboekservice"</string> - <string name="download_description" msgid="3274861514695032954">"Informatie over woordenboekupdate"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Woordenboeken toevoegen"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Woordenboek beschikbaar"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Instellingen voor woordenboeken"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Gebruikerswoordenboeken"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Gebruikerswoordenboek"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Woordenboek beschikbaar"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Wordt gedownload"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Geïnstalleerd"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Geïnstalleerd, uitgeschakeld"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Verbindingsprobleem woordenboekservice"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Geen woordenboeken"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Vernieuwen"</string> - <string name="last_update" msgid="3101549719827600346">"Laatst bijgewerkt"</string> - <string name="message_updating" msgid="820186276704134720">"Controleren op updates"</string> - <string name="message_loading" msgid="8611339149825047446">"Laden..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Algemeen woordenboek"</string> - <string name="cancel" msgid="5586531736609183304">"Annuleren"</string> - <string name="install_dict" msgid="5525005524697607865">"Installeren"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Download annuleren"</string> - <string name="disable_dict" msgid="7685810040236497700">"Uitschakelen"</string> - <string name="enable_dict" msgid="3848179784702473680">"Inschakelen"</string> - <string name="delete_dict" msgid="5817159290503843766">"Verwijderen"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Er is een woordenboek beschikbaar voor de geselecteerde taal op uw mobiele apparaat.<br/> We raden u aan het woordenboek voor het <xliff:g id="LANGUAGE">%1$s</xliff:g> te <b>downloaden</b> om uw typevaardigheid te verbeteren.<br/> <br/> De download kan een of twee minuten duren via 3G. Er kunnen kosten worden berekend als u geen <b>onbeperkt gegevensabonnement</b> heeft.<br/> Als u niet zeker weet welk gegevensabonnement u heeft, raden we u aan een wifi-verbinding te zoeken om de download automatisch te starten.<br/> <br/> Tip: u kunt woordenboeken downloaden en verwijderen door naar <b>Taal en invoer</b> in het menu <b>Instellingen</b> van uw mobiele apparaat te gaan."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Nu downloaden (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Downloaden via wifi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Er is een woordenboek beschikbaar voor <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Druk om te controleren en te downloaden"</string> + <string name="app_name" msgid="6320102637491234792">"Woordenboekleverancier"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Woordenboekleverancier"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Woordenboekservice"</string> + <string name="download_description" msgid="6014835283119198591">"Informatie over woordenboekupdate"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Woordenboeken toevoegen"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Woordenboek beschikbaar"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Instellingen voor woordenboeken"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Gebruikerswoordenboeken"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Gebruikerswoordenboek"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Woordenboek beschikbaar"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Wordt gedownload"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Geïnstalleerd"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Geïnstalleerd, uitgeschakeld"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Verbindingsprobleem woordenboekservice"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Geen woordenboeken"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Vernieuwen"</string> + <string name="last_update" msgid="730467549913588780">"Laatst bijgewerkt"</string> + <string name="message_updating" msgid="4457761393932375219">"Controleren op updates"</string> + <string name="message_loading" msgid="8689096636874758814">"Wordt geladen…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Algemeen woordenboek"</string> + <string name="cancel" msgid="6830980399865683324">"Annuleren"</string> + <string name="install_dict" msgid="180852772562189365">"Installeren"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Annuleren"</string> + <string name="delete_dict" msgid="756853268088330054">"Verwijderen"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Er is een woordenboek voor de geselecteerde taal beschikbaar op uw mobiele apparaat.<br/> We raden u aan het woordenboek voor het <xliff:g id="LANGUAGE">%1$s</xliff:g> te <b>downloaden</b> om uw typvaardigheid te verbeteren.<br/> <br/> De download kan één of twee minuten duren via 3G. Er kunnen kosten worden berekend als u geen <b>onbeperkt gegevensabonnement</b> heeft.<br/> Als u niet zeker weet welk gegevensabonnement u heeft, raden we u aan een wifi-verbinding te zoeken om de download automatisch te starten.<br/> <br/> Tip: u kunt woordenboeken downloaden en verwijderen via <b>Taal en invoer</b> in het menu <b>Instellingen</b> van uw mobiele apparaat."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Nu downloaden (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Downloaden via wifi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Er is een woordenboek beschikbaar voor het <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Druk om te controleren en te downloaden"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Downloaden: suggesties voor het <xliff:g id="LANGUAGE">%1$s</xliff:g> zijn straks beschikbaar."</string> </resources> diff --git a/java/res/values-pl/strings-appname.xml b/java/res/values-pl/strings-appname.xml deleted file mode 100644 index 4d244d705..000000000 --- a/java/res/values-pl/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Klawiatura Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Sprawdzanie pisowni w Androidzie"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Ustawienia klawiatury Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Ustawienia sprawdzania pisowni"</string> -</resources> diff --git a/java/res/values-pl/strings.xml b/java/res/values-pl/strings.xml index 68fed40ad..c9f98f7f6 100644 --- a/java/res/values-pl/strings.xml +++ b/java/res/values-pl/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Klawiatura Androida (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Klawiatura Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Ustawienia klawiatury Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Sprawdzanie pisowni na Androidzie (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Ustawienia sprawdzania pisowni na Androidzie (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opcje wprowadzania"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Polecenia dziennika badań"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Sprawdzanie pisowni na Androidzie (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Rozpoznawanie mowy jest wyłączone"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfiguruj metody wprowadzania"</string> <string name="language_selection_title" msgid="1651299598555326750">"Języki wprowadzania"</string> + <string name="send_feedback" msgid="1780431884109392046">"Prześlij opinię"</string> <string name="select_language" msgid="3693815588777926848">"Języki wprowadzania"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotknij ponownie, aby zapisać"</string> <string name="has_dictionary" msgid="6071847973466625007">"Słownik dostępny"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Włącz przesyłanie opinii użytkownika"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Pomóż ulepszyć edytor wprowadzania tekstu, automatycznie wysyłając do Google statystyki użycia i raporty o awariach."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Motyw klawiatury"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Angielska (Wielka Brytania)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Angielska (Stany Zjednoczone)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Ustawienia opóźnienia przy przytrzymaniu przycisku"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Czas trwania wibracji przy naciśnięciu"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Głośność dźwięku przy naciśnięciu"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Odczyt zewnętrznego pliku słownika"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Brak plików słownika w folderze Pobrane pliki"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Wybierz plik słownika do zainstalowania"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Domyślne"</string> <string name="language_settings" msgid="1671153053201809031">"Język, klawiatura, głos"</string> <string name="select_input_method" msgid="4301602374609275003">"Wybierz metodę wprowadzania"</string> - - <string name="app_name" msgid="1017058186322714405">"Dostawca słownika"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Dostawca słownika"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Usługa słownika"</string> - <string name="download_description" msgid="3274861514695032954">"Informacje o aktualizacji słownika"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Słowniki dodatkowe"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dostępny słownik"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Ustawienia słowników"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Słowniki użytkownika"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Słownik użytkownika"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Słownik jest dostępny"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Aktualnie pobierany"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Zainstalowany"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Zainstalowany, wyłączony"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problem z połączeniem z usługą słownika"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Brak słowników"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Odśwież"</string> - <string name="last_update" msgid="3101549719827600346">"Ostatnia aktualizacja"</string> - <string name="message_updating" msgid="820186276704134720">"Sprawdzanie dostępności aktualizacji"</string> - <string name="message_loading" msgid="8611339149825047446">"Wczytywanie..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Słownik główny"</string> - <string name="cancel" msgid="5586531736609183304">"Anuluj"</string> - <string name="install_dict" msgid="5525005524697607865">"Zainstaluj"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Anuluj pobieranie"</string> - <string name="disable_dict" msgid="7685810040236497700">"Wyłącz"</string> - <string name="enable_dict" msgid="3848179784702473680">"Włącz"</string> - <string name="delete_dict" msgid="5817159290503843766">"Usuń"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Dla języka: <xliff:g id="LANGUAGE">%1$s</xliff:g> jest dostępny słownik"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Naciśnij, aby sprawdzić i pobrać"</string> + <string name="app_name" msgid="6320102637491234792">"Dostawca słownika"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Dostawca słownika"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Usługa słownika"</string> + <string name="download_description" msgid="6014835283119198591">"Informacje o aktualizacji słownika"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Słowniki dodatkowe"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Słownik dostępny"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Ustawienia słowników"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Słowniki użytkownika"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Słownik użytkownika"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Słownik dostępny"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Aktualnie pobierany"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Zainstalowany"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Zainstalowany, wyłączony"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Problem z połączeniem z usługą słownika"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Brak słowników"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Odśwież"</string> + <string name="last_update" msgid="730467549913588780">"Ostatnia aktualizacja"</string> + <string name="message_updating" msgid="4457761393932375219">"Sprawdzanie dostępności aktualizacji"</string> + <string name="message_loading" msgid="8689096636874758814">"Wczytuję..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Słownik główny"</string> + <string name="cancel" msgid="6830980399865683324">"Anuluj"</string> + <string name="install_dict" msgid="180852772562189365">"Zainstaluj"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Anuluj"</string> + <string name="delete_dict" msgid="756853268088330054">"Usuń"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Dla języka, którego używasz na swoim urządzeniu przenośnym, jest dostępny słownik.<br/> Warto <b>pobrać</b> ten słownik <xliff:g id="LANGUAGE">%1$s</xliff:g>, by ułatwić sobie pisanie.<br/> <br/> Pobieranie trwa do dwóch minut (przez 3G). Jeśli nie masz <b>abonamentu z nieograniczoną transmisją danych</b>, operator może naliczyć opłatę.<br/> Jeśli nie wiesz, jaki masz abonament, połącz się z Wi-Fi, by automatycznie rozpocząć pobieranie.<br/> <br/> Wskazówka: słowniki możesz pobierać i usuwać na urządzeniu w sekcji <b>Język, klawiatura, głos</b> w menu <b>Ustawienia</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Pobierz teraz (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Pobierz przez Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Dostępny jest słownik <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Naciśnij, by sprawdzić i pobrać"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Pobieranie – wkrótce będą dostępne sugestie w tym języku: <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-pt-rPT/strings-appname.xml b/java/res/values-pt-rPT/strings-appname.xml deleted file mode 100644 index 1b88acb69..000000000 --- a/java/res/values-pt-rPT/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Teclado do Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Verificador ortográfico do Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Definições de teclado do Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Definições da verificação ortográfica"</string> -</resources> diff --git a/java/res/values-pt-rPT/strings.xml b/java/res/values-pt-rPT/strings.xml index 15ff65b55..ee4c1cbe9 100644 --- a/java/res/values-pt-rPT/strings.xml +++ b/java/res/values-pt-rPT/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Teclado Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Definições do Teclado Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Verificador Ortográfico Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Definições do Verificador Ortográfico Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opções de introdução"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Comandos de Reg. Invest."</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Verificador ortográfico do Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Entr. voz desact."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de introdução"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <string name="send_feedback" msgid="1780431884109392046">"Enviar comentários"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de introdução"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para guardar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Activar comentários do utilizador"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Envie automaticamente estatísticas de utilização e relatórios de falhas para a Google e ajude-nos a melhorar este editor de método de introdução."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Definições do atraso de pressão longa de tecla"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Definições de duração da vibração ao premir as teclas"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Definições de volume de som ao premir as teclas"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ler ficheiro de dicionário externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Não há ficheiros de dicionário na pasta Transferências"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecione um ficheiro de dicionário para instalar"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Predefinido"</string> <string name="language_settings" msgid="1671153053201809031">"Idioma e entrada de som"</string> <string name="select_input_method" msgid="4301602374609275003">"Escolher o método de entrada"</string> - - <string name="app_name" msgid="1017058186322714405">"Fornecedor de Dicionário"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Fornecedor de Dicionário"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Serviço de Dicionário"</string> - <string name="download_description" msgid="3274861514695032954">"Informações de atualização do dicionário"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Dicionários suplementares"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dicionário disponível"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Definições dos dicionários"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Dicionários do utilizador"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Dicionário do utilizador"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Dicionário disponível"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Transferência em curso"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instalado"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instalado, desativado"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problema ao ligar ao serviço de dicionário"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Sem dicionários disponíveis"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Atualizar"</string> - <string name="last_update" msgid="3101549719827600346">"Última atualização"</string> - <string name="message_updating" msgid="820186276704134720">"A verificar existência de atualizações"</string> - <string name="message_loading" msgid="8611339149825047446">"A carregar..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Dicionário principal"</string> - <string name="cancel" msgid="5586531736609183304">"Cancelar"</string> - <string name="install_dict" msgid="5525005524697607865">"Instalar"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Cancelar transferência"</string> - <string name="disable_dict" msgid="7685810040236497700">"Desativar"</string> - <string name="enable_dict" msgid="3848179784702473680">"Ativar"</string> - <string name="delete_dict" msgid="5817159290503843766">"Eliminar"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"O idioma selecionado no seu dispositivo móvel tem um dicionário disponível.<br/> Recomendamos que <b>transfira</b> o dicionário <xliff:g id="LANGUAGE">%1$s</xliff:g> para melhorar a sua experiência de introdução.<br/> <br/> A transferência pode demorar um ou dois minutos via 3G. Poderão ser aplicadas taxas se não tiver um <b>plano de dados ilimitado</b>.<br/> Se não tiver a certeza do plano de dados que tem, recomendamos que localize uma ligação Wi-Fi para começar a transferência automaticamente.<br/> <br/> Sugestão: pode transferir e remover dicionários acedendo a <b>Idioma e introdução</b> no menu <b>Definições</b> do seu dispositivo móvel."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Transferir agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Transferir via Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Está disponível um dicionário para <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Prima para consultar e transferir"</string> + <string name="app_name" msgid="6320102637491234792">"Fornecedor de Dicionário"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Fornecedor de Dicionário"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Serviço de Dicionário"</string> + <string name="download_description" msgid="6014835283119198591">"Informações de atualização do dicionário"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dicionários suplementares"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dicionário disponível"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Definições dos dicionários"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Dicionários do utilizador"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dicionário do utilizador"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dicionário disponível"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Transferência em curso"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalado"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalado, desativado"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Problema ao ligar ao serviço de dicionário"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Nenhum dicionário"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Atualizar"</string> + <string name="last_update" msgid="730467549913588780">"Última atualização"</string> + <string name="message_updating" msgid="4457761393932375219">"A verificar existência de atualizações"</string> + <string name="message_loading" msgid="8689096636874758814">"A carregar..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Dicionário principal"</string> + <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="install_dict" msgid="180852772562189365">"Instalar"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> + <string name="delete_dict" msgid="756853268088330054">"Eliminar"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"O idioma selecionado no dispositivo móvel tem um dicionário disponível.<br/> Recomendamos que <b>transfira</b> o dicionário de <xliff:g id="LANGUAGE">%1$s</xliff:g> para melhorar a sua experiência de introdução de texto.<br/> <br/> A transferência pode demorar um ou dois minutos acima de 3G. Poderão ser aplicadas taxas se não tiver um <b>plano de dados ilimitado</b>.<br/> Se não tiver a certeza do plano de dados que tem, recomendamos que localize uma ligação Wi-Fi para começar a transferência automaticamente.<br/> <br/> Sugestão: pode transferir e remover dicionários acedendo a <b>Idioma e introdução</b> no menu <b>Definições</b> do disp. móvel."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Transferir agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Transferir via Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Está disponível um dicionário para <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Prima para consultar e transferir"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"A transferir: as sugestões para <xliff:g id="LANGUAGE">%1$s</xliff:g> estarão prontas em breve."</string> </resources> diff --git a/java/res/values-pt/strings-appname.xml b/java/res/values-pt/strings-appname.xml deleted file mode 100644 index d78786d63..000000000 --- a/java/res/values-pt/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Teclado do Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Corretor ortográfico do Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Configurações de teclado do Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Configurações de verificação ortográfica"</string> -</resources> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 313411565..1abedd6c5 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Teclado Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Teclado Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Configurações de teclado Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Corretor ortográfico do Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Configurações de corretor ortográfico do Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opções de entrada"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Pesq. comandos de reg."</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Corretor ortográfico do Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Texto por voz desat."</string> <string name="configure_input_method" msgid="373356270290742459">"Configurar métodos de entrada"</string> <string name="language_selection_title" msgid="1651299598555326750">"Idiomas de entrada"</string> + <string name="send_feedback" msgid="1780431884109392046">"Enviar comentários"</string> <string name="select_language" msgid="3693815588777926848">"Idiomas de entrada"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Toque novamente para salvar"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicionário disponível"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Ativar comentário do usuário"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Ajude a melhorar este editor de método de entrada enviando automaticamente ao Google estatísticas de uso e relatórios de falhas."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Configurações de atraso ao pressionar teclas"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Configurações de duração da vibração ao tocar a tecla"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Config. volume ao tocar a tecla"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Ler arquivo de dicionário externo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nenhum arquivo de dicionário na pasta Downloads"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selecione um arquivo de dicionário para instalar"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Padrão"</string> <string name="language_settings" msgid="1671153053201809031">"Idioma e entrada"</string> <string name="select_input_method" msgid="4301602374609275003">"Selecione o método de entrada"</string> - - <string name="app_name" msgid="1017058186322714405">"Provedor de dicionário"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Provedor de dicionário"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Serviço de dicionário"</string> - <string name="download_description" msgid="3274861514695032954">"Informações de atualização do dicionário"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Dicionários complementares"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dicionário disponível"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Configurações dos dicionários"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Dicionário do usuário"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Dicionário do usuário"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Dicionário disponível"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Download em andamento"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instalado"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instalado, desativado"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Prob. de conexão c/ dic. de serv."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Nenhum dicionário disponível"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Atualizar"</string> - <string name="last_update" msgid="3101549719827600346">"Última atualização"</string> - <string name="message_updating" msgid="820186276704134720">"Verificando atualizações"</string> - <string name="message_loading" msgid="8611339149825047446">"Carregando..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Dicionário principal"</string> - <string name="cancel" msgid="5586531736609183304">"Cancelar"</string> - <string name="install_dict" msgid="5525005524697607865">"Instalar"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Cancelar download"</string> - <string name="disable_dict" msgid="7685810040236497700">"Desativar"</string> - <string name="enable_dict" msgid="3848179784702473680">"Permitir"</string> - <string name="delete_dict" msgid="5817159290503843766">"Excluir"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Há um dicionário disponível para <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Pressione para consultar e fazer o download"</string> + <string name="app_name" msgid="6320102637491234792">"Provedor de dicionário"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Provedor de dicionário"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Serviço de dicionário"</string> + <string name="download_description" msgid="6014835283119198591">"Informações de atualização do dicionário"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dicionários complementares"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dicionário disponível"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Configurações dos dicionários"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Dicionários do usuário"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dicionário do usuário"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dicionário disponível"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Download em andamento"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalado"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalado, desativado"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Prob. conexão dic."</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Nenhum dicionário disponível"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Atualizar"</string> + <string name="last_update" msgid="730467549913588780">"Última atualização"</string> + <string name="message_updating" msgid="4457761393932375219">"Verificando atualizações"</string> + <string name="message_loading" msgid="8689096636874758814">"Carregando..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Dicionário principal"</string> + <string name="cancel" msgid="6830980399865683324">"Cancelar"</string> + <string name="install_dict" msgid="180852772562189365">"Instalar"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Cancelar"</string> + <string name="delete_dict" msgid="756853268088330054">"Excluir"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"O idioma selecionado em seu dispositivo móvel tem um dicionário disponível.<br/> Recomendamos <b>fazer o download</b> do dicionário de <xliff:g id="LANGUAGE">%1$s</xliff:g> para melhorar sua experiência de digitação.<br/> O download pode levar um ou dois minutos por conexão 3G. Tarifas podem ser aplicáveis caso você não tenha um <b>plano de dados ilimitado</b>.<br/> Se você não tem certeza quanto a seu plano de dados, recomendamos encontrar uma conexão Wi-Fi para iniciar o download automaticamente.<br/> Dica: você pode fazer o download de dicionários e removê-los acessando <b>Idioma e entrada</b> no menu <b>Configurações</b> de seu dispositivo móvel."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Fazer o download agora (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Fazer o download por Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Há um dicionário disponível para <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Pressione para consultar e fazer o download"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Download em andamento: as sugestões para <xliff:g id="LANGUAGE">%1$s</xliff:g> estarão prontas em breve."</string> </resources> diff --git a/java/res/values-rm/strings.xml b/java/res/values-rm/strings.xml index 5dad59fc2..15cd3274a 100644 --- a/java/res/values-rm/strings.xml +++ b/java/res/values-rm/strings.xml @@ -20,14 +20,18 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for aosp_android_keyboard_ime_name (7877134937939182296) --> + <!-- no translation found for aosp_android_keyboard_ime_name (8250992613616792321) --> + <skip /> + <!-- no translation found for aosp_android_keyboard_ime_settings (423615877174850267) --> + <skip /> + <!-- no translation found for aosp_spell_checker_service_name (511950477199948048) --> + <skip /> + <!-- no translation found for aosp_android_spell_checker_service_settings (2970535894327288421) --> <skip /> <!-- no translation found for english_ime_input_options (3909945612939668554) --> <skip /> <!-- no translation found for english_ime_research_log (8492602295696577851) --> <skip /> - <!-- no translation found for aosp_spell_checker_service_name (6985142605330377819) --> - <skip /> <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> <skip /> <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> @@ -226,13 +230,16 @@ <!-- no translation found for configure_input_method (373356270290742459) --> <skip /> <string name="language_selection_title" msgid="1651299598555326750">"Linguas da cumonds vocals"</string> + <!-- no translation found for send_feedback (1780431884109392046) --> + <skip /> <!-- no translation found for select_language (3693815588777926848) --> <skip /> <!-- 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> - <string name="prefs_description_log" msgid="5827825607258246003">"Gidai a meglierar quest editur da la metoda d\'endataziun cun trametter automaticamain datas statisticas davart l\'utilisaziun e rapports da collaps a Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <!-- no translation found for keyboard_layout (8451164783510487501) --> <skip /> <!-- no translation found for subtype_en_GB (88170601942311355) --> @@ -285,11 +292,11 @@ <skip /> <!-- no translation found for prefs_usability_study_mode (1261130555134595254) --> <skip /> - <!-- no translation found for prefs_key_longpress_timeout_settings (1881822418815012326) --> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> <skip /> - <!-- no translation found for prefs_keypress_vibration_duration_settings (1829950405285211668) --> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> <skip /> - <!-- no translation found for prefs_keypress_sound_volume_settings (5875933757082305040) --> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> <skip /> <!-- no translation found for prefs_read_external_dictionary (2588931418575013067) --> <skip /> @@ -307,4 +314,63 @@ <skip /> <!-- no translation found for select_input_method (4301602374609275003) --> <skip /> + <!-- no translation found for app_name (6320102637491234792) --> + <skip /> + <!-- no translation found for dictionary_provider_name (3027315045397363079) --> + <skip /> + <!-- no translation found for dictionary_service_name (6237472350693511448) --> + <skip /> + <!-- no translation found for download_description (6014835283119198591) --> + <skip /> + <!-- no translation found for dictionary_settings_title (8091417676045693313) --> + <skip /> + <!-- no translation found for dictionary_install_over_metered_network_prompt (3587517870006332980) --> + <skip /> + <!-- no translation found for dictionary_settings_summary (5305694987799824349) --> + <skip /> + <!-- no translation found for user_dictionaries (3582332055892252845) --> + <skip /> + <!-- no translation found for default_user_dict_pref_name (1625055720489280530) --> + <skip /> + <!-- no translation found for dictionary_available (4728975345815214218) --> + <skip /> + <!-- no translation found for dictionary_downloading (2982650524622620983) --> + <skip /> + <!-- no translation found for dictionary_installed (8081558343559342962) --> + <skip /> + <!-- no translation found for dictionary_disabled (8950383219564621762) --> + <skip /> + <!-- no translation found for cannot_connect_to_dict_service (9216933695765732398) --> + <skip /> + <!-- no translation found for no_dictionaries_available (8039920716566132611) --> + <skip /> + <!-- no translation found for check_for_updates_now (8087688440916388581) --> + <skip /> + <!-- no translation found for last_update (730467549913588780) --> + <skip /> + <!-- no translation found for message_updating (4457761393932375219) --> + <skip /> + <!-- no translation found for message_loading (8689096636874758814) --> + <skip /> + <!-- no translation found for main_dict_description (3072821352793492143) --> + <skip /> + <string name="cancel" msgid="6830980399865683324">"Interrumper"</string> + <!-- no translation found for install_dict (180852772562189365) --> + <skip /> + <!-- no translation found for cancel_download_dict (7843340278507019303) --> + <skip /> + <!-- no translation found for delete_dict (756853268088330054) --> + <skip /> + <!-- no translation found for should_download_over_metered_prompt (2878629598667658845) --> + <skip /> + <!-- no translation found for download_over_metered (1643065851159409546) --> + <skip /> + <!-- no translation found for do_not_download_over_metered (2176209579313941583) --> + <skip /> + <!-- no translation found for dict_available_notification_title (6514288591959117288) --> + <skip /> + <!-- no translation found for dict_available_notification_description (1075194169443163487) --> + <skip /> + <!-- no translation found for toast_downloading_suggestions (1313027353588566660) --> + <skip /> </resources> diff --git a/java/res/values-ro/strings-appname.xml b/java/res/values-ro/strings-appname.xml deleted file mode 100644 index dfa642204..000000000 --- a/java/res/values-ro/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Tastatură Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Verificator ortografic Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Setările tastaturii Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Setările de verificare ortografică"</string> -</resources> diff --git a/java/res/values-ro/strings.xml b/java/res/values-ro/strings.xml index d4c39af5f..1e052a119 100644 --- a/java/res/values-ro/strings.xml +++ b/java/res/values-ro/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Tastatură Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Tastatură Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Setări tastatură Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Verificator ortografic Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Setări verificator ortografic Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Opţiuni de introducere text"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Comenzi jurnal cercetare"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Verificator ortografic Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Intr. vocală dezact."</string> <string name="configure_input_method" msgid="373356270290742459">"Configuraţi metodele de intrare"</string> <string name="language_selection_title" msgid="1651299598555326750">"Selectaţi limba"</string> + <string name="send_feedback" msgid="1780431884109392046">"Trimiteți feedback"</string> <string name="select_language" msgid="3693815588777926848">"Limbi de intrare"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Atingeţi din nou pentru a salva"</string> <string name="has_dictionary" msgid="6071847973466625007">"Dicţionar disponibil"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Activaţi feedback de la utilizatori"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Ajutaţi la îmbunătăţirea acestui instrument de editare a metodelor de introducere a textului trimiţând în mod automat la Google statistici de utilizare şi rapoarte de blocare."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Temă pentru tastatură"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Engleză (Marea Britanie)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Engleză (S.U.A.)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Setări pentru întârzierea la apăsarea lungă a tastei"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Setări pentru durata vibrării la apăsarea tastei"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Setări pentru volumul sunetului la apăsarea tastei"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Citiți fișierul de dicționar extern"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Nu există fișiere dicționar în dosarul Descărcări"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Selectați un fișier dicționar de instalat"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Prestabilit"</string> <string name="language_settings" msgid="1671153053201809031">"Limbă și introducere de text"</string> <string name="select_input_method" msgid="4301602374609275003">"Alegeți metoda de introducere de text"</string> - - <string name="app_name" msgid="1017058186322714405">"Furnizorul dicţionarului"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Furnizorul dicţionarului"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Serviciul Dicţionar"</string> - <string name="download_description" msgid="3274861514695032954">"Informaţii privind actualizarea dicţionarului"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Dicţionare suplimentare"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Dicţionar disponibil"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Setări pentru dicţionare"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Dicţionarele utilizatorului"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Dicţionarul utilizatorului"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Dicţionar disponibil"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Se descarcă acum"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Instalat"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Instalat, dezactivat"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Nu se conect. dicţ."</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Niciun dicţionar"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Actualizaţi"</string> - <string name="last_update" msgid="3101549719827600346">"Data ultimei modificări"</string> - <string name="message_updating" msgid="820186276704134720">"Se verifică existenţa actualizărilor"</string> - <string name="message_loading" msgid="8611339149825047446">"Se încarcă..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Dicţionar principal"</string> - <string name="cancel" msgid="5586531736609183304">"Anulaţi"</string> - <string name="install_dict" msgid="5525005524697607865">"Instalaţi"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Anulaţi descărcarea"</string> - <string name="disable_dict" msgid="7685810040236497700">"Dezactivaţi"</string> - <string name="enable_dict" msgid="3848179784702473680">"Activaţi"</string> - <string name="delete_dict" msgid="5817159290503843766">"Ştergeţi"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Este disponibil un dicţionar pentru <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Apăsaţi pentru a examina şi pentru a descărca"</string> + <string name="app_name" msgid="6320102637491234792">"Furnizor dicționar"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Furnizor dicționar"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Serviciu dicționar"</string> + <string name="download_description" msgid="6014835283119198591">"Informații privind actualizarea dicționarului"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dicționare suplimentare"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Dicționar disponibil"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Setări pentru dicționare"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Dicționarele utilizatorului"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Dicționarul utilizatorului"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Dicționar disponibil"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Se descarcă acum"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Instalat"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Instalat, dezactivat"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Eroare conectare la serviciu dicționar"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Niciun dicționar"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Actualizați"</string> + <string name="last_update" msgid="730467549913588780">"Data ultimei modificări"</string> + <string name="message_updating" msgid="4457761393932375219">"Se verifică existența actualizărilor"</string> + <string name="message_loading" msgid="8689096636874758814">"Se încarcă..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Dicționar principal"</string> + <string name="cancel" msgid="6830980399865683324">"Anulaţi"</string> + <string name="install_dict" msgid="180852772562189365">"Instalați"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Anulați"</string> + <string name="delete_dict" msgid="756853268088330054">"Ștergeți"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Limba selectată pe dispozitivul mobil are un dicționar disponibil.<br/> Vă recomandăm să <b>descărcați</b> dicționarul de <xliff:g id="LANGUAGE">%1$s</xliff:g> pentru a vă îmbunătăți experiența la introducerea textului.<br/> <br/> Descărcarea prin 3G poate dura un minut sau două. Se pot aplica taxe dacă nu aveți un <b>plan de date nelimitat</b>.<br/> Dacă nu știți sigur ce plan de date aveți, găsiți o conexiune Wi-Fi și descărcați automat.<br/> <br/> Sfat: puteți să descărcați și să eliminați dicționare accesând <b>Limbă și introducere de text</b> din meniul <b>Setări</b>, pe dispozitivul mobil."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Descărcați acum (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Descărcați prin Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Este disponibil un dicționar pentru <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Apăsați pentru examinare și descărcare"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Se descarcă: sugestiile pentru <xliff:g id="LANGUAGE">%1$s</xliff:g> vor fi gata în curând."</string> </resources> diff --git a/java/res/values-ru/strings-appname.xml b/java/res/values-ru/strings-appname.xml deleted file mode 100644 index 5db1d0bc9..000000000 --- a/java/res/values-ru/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Клавиатура Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Проверка правописания Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Настройки клавиатуры Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Настройки проверки правописания"</string> -</resources> diff --git a/java/res/values-ru/strings.xml b/java/res/values-ru/strings.xml index 681c76dc3..88209b013 100644 --- a/java/res/values-ru/strings.xml +++ b/java/res/values-ru/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавиатура Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Клавиатура Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Настройки клавиатуры Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Проверка правописания Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Настройки проверки правописания Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Настройки"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Все команды"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Проверка правописания Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голосовой ввод откл."</string> <string name="configure_input_method" msgid="373356270290742459">"Настройка способов ввода"</string> <string name="language_selection_title" msgid="1651299598555326750">"Языки ввода"</string> + <string name="send_feedback" msgid="1780431884109392046">"Отправить отзыв"</string> <string name="select_language" msgid="3693815588777926848">"Языки ввода"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Нажмите, чтобы сохранить"</string> <string name="has_dictionary" msgid="6071847973466625007">"Доступен словарь"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Включить отправку сведений"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Помогите усовершенствовать редактор способа ввода, разрешив отправку статистики и отчетов о сбоях в Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Тема клавиатуры"</string> <string name="subtype_en_GB" msgid="88170601942311355">"английский (Великобритания)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"английский (США)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Долгое нажатие"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Настройки вибросигнала при нажатии клавиш"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Настройки громкости звука при нажатии клавиш"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Считывать данные из внешнего словаря"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"В папке \"Загрузки\" нет словарей"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Выберите файл словаря"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"По умолчанию"</string> <string name="language_settings" msgid="1671153053201809031">"Язык и ввод"</string> <string name="select_input_method" msgid="4301602374609275003">"Выберите способ ввода"</string> - - <string name="app_name" msgid="1017058186322714405">"Поставщик словарей"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Поставщик словарей"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Служба словарей"</string> - <string name="download_description" msgid="3274861514695032954">"Обновления словаря"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Дополнительные словари"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Словарь доступен"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Настройки словарей"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Пользовательские словари"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Пользовательский словарь"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Словарь доступен"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Загрузка..."</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Установлен"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Установлен, отключен"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Ошибка подключения"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Словари недоступны"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Обновить"</string> - <string name="last_update" msgid="3101549719827600346">"Последнее обновление"</string> - <string name="message_updating" msgid="820186276704134720">"Проверка обновлений..."</string> - <string name="message_loading" msgid="8611339149825047446">"Загрузка..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Основной словарь"</string> - <string name="cancel" msgid="5586531736609183304">"Отмена"</string> - <string name="install_dict" msgid="5525005524697607865">"Установить"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Отменить загрузку"</string> - <string name="disable_dict" msgid="7685810040236497700">"Отключить"</string> - <string name="enable_dict" msgid="3848179784702473680">"Включить"</string> - <string name="delete_dict" msgid="5817159290503843766">"Удалить"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Доступен словарь: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Нажмите, чтобы просмотреть и загрузить"</string> + <string name="app_name" msgid="6320102637491234792">"Поставщик словарей"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Поставщик словарей"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Служба словарей"</string> + <string name="download_description" msgid="6014835283119198591">"Обновления словаря"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Дополнительные словари"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Словарь доступен"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Настройки словарей"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Пользовательские словари"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Пользовательский словарь"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Доступен словарь"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Загрузка…"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Установлен"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Установлен, отключен"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Сбой подключения"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Словарей нет"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Обновить"</string> + <string name="last_update" msgid="730467549913588780">"Последнее обновление"</string> + <string name="message_updating" msgid="4457761393932375219">"Проверка обновлений…"</string> + <string name="message_loading" msgid="8689096636874758814">"Загрузка..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Основной словарь"</string> + <string name="cancel" msgid="6830980399865683324">"Отмена"</string> + <string name="install_dict" msgid="180852772562189365">"Установить"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Отмена"</string> + <string name="delete_dict" msgid="756853268088330054">"Удалить"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Доступен <xliff:g id="LANGUAGE">%1$s</xliff:g> словарь для проверки правописания.<br/>Рекомендуем <b>установить</b> его, чтобы быстрее вводить текст.<br/><br/>Если вашим тарифом предусмотрена <b>безлимитная передача данных</b>, словарь можно загрузить через сеть 3G (это займет всего пару минут).<br/>Если вы не помните подробностей своего тарифного плана, лучше подключитесь к сети Wi-Fi (загрузка начнется автоматически).<br/><br/>Совет. Чтобы добавить, удалить или настроить словарь, откройте раздел <b>Язык и ввод</b> в настройках своего устройства."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Загрузить (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> МБ)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Загрузить через Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Доступен словарь: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Нажмите, чтобы просмотреть и загрузить"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Загрузка словаря: <xliff:g id="LANGUAGE">%1$s</xliff:g>…"</string> </resources> diff --git a/java/res/values-sk/strings-appname.xml b/java/res/values-sk/strings-appname.xml deleted file mode 100644 index 5b5590000..000000000 --- a/java/res/values-sk/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Klávesnica Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Kontrola pravopisu Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Nastavenia klávesnice Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Nastavenia kontroly pravopisu"</string> -</resources> diff --git a/java/res/values-sk/strings.xml b/java/res/values-sk/strings.xml index 5d0820868..7fbc1e586 100644 --- a/java/res/values-sk/strings.xml +++ b/java/res/values-sk/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Klávesnica Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Klávesnica Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Nastavenia klávesnice Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Kontrola pravopisu (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Nastavenia kontroly pravopisu Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti zadávania textu a údajov"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Príkazy denníka výskumu"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kontrola pravopisu Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hlasový vstup je zakázaný"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurovať metódy vstupu"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jazyky vstupu"</string> + <string name="send_feedback" msgid="1780431884109392046">"Odoslať spätnú väzbu"</string> <string name="select_language" msgid="3693815588777926848">"Jazyky vstupu"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Opätovným dotykom uložíte"</string> <string name="has_dictionary" msgid="6071847973466625007">"K dispozícii je slovník"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Povoliť spätnú väzbu od používateľov"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Automatickým zasielaním štatistík o využívaní editora metódy vstupu a správ o jeho zlyhaní do služby Google môžete prispieť k vylepšeniu tohto nástroja."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Nastavenia oneskorenia pre stlačenie a podržanie klávesu"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Nastavenia trvania vibrovania pri stlačení klávesu"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Nastavenia hlasitosti zvuku pri stlačení klávesu"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Čítať súbor externého slovníka"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"V priečinku Preberanie nie sú žiadne súbory slovníka"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Vyberte súbor slovníka, ktorý chcete nainštalovať"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Predvolené"</string> <string name="language_settings" msgid="1671153053201809031">"Jazyk & vstup"</string> <string name="select_input_method" msgid="4301602374609275003">"Zvoliť metódu vstupu"</string> - - <string name="app_name" msgid="1017058186322714405">"Poskytovateľ slovníka"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Poskytovateľ slovníka"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Služba slovníka"</string> - <string name="download_description" msgid="3274861514695032954">"Informácie aktualizácie slovníka"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Doplnkové slovníky"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"K dispozícii je slovník"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Nastavenia pre slovníky"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Používateľské slovníky"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Používateľský slovník"</string> - <string name="dictionary_available" msgid="3192920608520618083">"K dispozícii je slovník"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Aktuálne preberanie"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Nainštalovaný"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Nainštalovaný, zakázaný"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problém s pripojením k službe slovníka"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Slovníky nedostupné"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Obnoviť"</string> - <string name="last_update" msgid="3101549719827600346">"Posledná aktualizácia"</string> - <string name="message_updating" msgid="820186276704134720">"Prebieha kontrola aktualizácií"</string> - <string name="message_loading" msgid="8611339149825047446">"Prebieha načítavanie..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Hlavný slovník"</string> - <string name="cancel" msgid="5586531736609183304">"Zrušiť"</string> - <string name="install_dict" msgid="5525005524697607865">"Inštalovať"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Zrušiť preberanie"</string> - <string name="disable_dict" msgid="7685810040236497700">"Zakázať"</string> - <string name="enable_dict" msgid="3848179784702473680">"Povoliť"</string> - <string name="delete_dict" msgid="5817159290503843766">"Odstrániť"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"K dispozícii je slovník pre jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Stlačením skontrolujete a prevezmete"</string> + <string name="app_name" msgid="6320102637491234792">"Poskytovateľ slovníka"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Poskytovateľ slovníka"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Služba slovníka"</string> + <string name="download_description" msgid="6014835283119198591">"Informácie aktualizácie slovníka"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Doplnkové slovníky"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"K dispozícii je slovník"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Nastavenia pre slovníky"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Používateľské slovníky"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Používateľský slovník"</string> + <string name="dictionary_available" msgid="4728975345815214218">"K dispozícii je slovník"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Aktuálne sa preberá"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Nainštalované"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Nainštalovaný, zakázaný"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Probl. s prip. k sl."</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Slovníky sú nedostupné"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Obnoviť"</string> + <string name="last_update" msgid="730467549913588780">"Posledná aktualizácia"</string> + <string name="message_updating" msgid="4457761393932375219">"Prebieha kontrola aktualizácií"</string> + <string name="message_loading" msgid="8689096636874758814">"Načítava sa..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Hlavný slovník"</string> + <string name="cancel" msgid="6830980399865683324">"Zrušiť"</string> + <string name="install_dict" msgid="180852772562189365">"Inštalovať"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Zrušiť"</string> + <string name="delete_dict" msgid="756853268088330054">"Odstrániť"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Pre vybratý jazyk mobilného zariadenia je k dispozícii slovník.<br/> Slovník jazyka <xliff:g id="LANGUAGE">%1$s</xliff:g> vám odporúčame <b>prevziať</b>. Pomôže vám pri zadávaní textu.<br/> <br/> V sieti 3G môže preberanie chvíľu trvať. Ak nemáte <b>neobmedzený dátový program</b>, môžu sa účtovať poplatky.<br/> Ak s určitosťou neviete aký dátový program používate, vyhľadajte pripojenie k sieti Wi-Fi a preberanie sa spustí automaticky.<br/> <br/> Tip: Slovníky môžete v mobilnom zariadení preberať a odstraňovať v časti <b>Jazyk a vstup</b> ponuky <b>Nastavenia</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Prevziať (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Prevziať cez sieť Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"K dispozícii je slovník pre jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Stlačením skontrolujete a prevezmete"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Preberanie: návrhy pre jazyk <xliff:g id="LANGUAGE">%1$s</xliff:g> budú čoskoro k dispozícii."</string> </resources> diff --git a/java/res/values-sl/strings-appname.xml b/java/res/values-sl/strings-appname.xml deleted file mode 100644 index fd303d8dd..000000000 --- a/java/res/values-sl/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Tipkovnica Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Črkovalnik za Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Nastavitve tipkovnice Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Nastavitve preverjanja črkovanja"</string> -</resources> diff --git a/java/res/values-sl/strings.xml b/java/res/values-sl/strings.xml index 97e55186b..09b0dd574 100644 --- a/java/res/values-sl/strings.xml +++ b/java/res/values-sl/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Tipkovnica Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Tipkovnica za Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Nastavitve tipkovnice za Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Črkovalnik za Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Nastavitve črkovalnika za Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Možnosti vnosa"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Ukazi za dnevnik raziskav"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Črkovalnik za Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Glas. vnos je onem."</string> <string name="configure_input_method" msgid="373356270290742459">"Nastavitev načinov vnosa"</string> <string name="language_selection_title" msgid="1651299598555326750">"Jeziki vnosa"</string> + <string name="send_feedback" msgid="1780431884109392046">"Pošljite povratne informacije"</string> <string name="select_language" msgid="3693815588777926848">"Jeziki vnosa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Dotaknite se še enkrat, da shranite"</string> <string name="has_dictionary" msgid="6071847973466625007">"Slovar je na voljo"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Omogoči povratne informacije uporabnikov"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"S samodejnim pošiljanjem statističnih podatkov o uporabi in poročil o zrušitvah Googlu nam lahko pomagate izboljšati urejevalnik načina vnosa."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Nastavitve zakasnitve za dolg pritisk tipke"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Nastavitve za trajanje vibriranja ob pritisku tipke"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Nastavitve za glasnost zvoka ob pritisku tipke"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Branje zunanje datoteke slovarja"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"V mapi »Prenosi« ni nobene datoteke slovarja"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Izberite datoteko slovarja, ki jo želite namestiti"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Privzeto"</string> <string name="language_settings" msgid="1671153053201809031">"Jezik in vnos"</string> <string name="select_input_method" msgid="4301602374609275003">"Izbira načina vnosa"</string> - - <string name="app_name" msgid="1017058186322714405">"Slovar"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Storitev slovarja"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Slovar"</string> - <string name="download_description" msgid="3274861514695032954">"Podatki o posodobitvi slovarja"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Dodatni slovarji"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Slovar je na voljo"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Nastavitve za slovarje"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Uporabniški slovar"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Uporabniški slovar"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Slovar je na voljo"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Trenutno se prenaša"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Nameščeno"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Nameščen, onemogočen"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Težava s povezavo"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Ni slovarjev"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Osveži"</string> - <string name="last_update" msgid="3101549719827600346">"Nazadnje posodobljeno"</string> - <string name="message_updating" msgid="820186276704134720">"Preverjanje, ali so na voljo posodobitve"</string> - <string name="message_loading" msgid="8611339149825047446">"Nalaganje ..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Glavni slovar"</string> - <string name="cancel" msgid="5586531736609183304">"Prekliči"</string> - <string name="install_dict" msgid="5525005524697607865">"Namesti"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Prekliči prenos"</string> - <string name="disable_dict" msgid="7685810040236497700">"Onemogoči"</string> - <string name="enable_dict" msgid="3848179784702473680">"Omogoči"</string> - <string name="delete_dict" msgid="5817159290503843766">"Izbriši"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Za izbran jezik v mob. napravi je na voljo slovar.<br/> Za izboljšano izkušnjo tipkanja priporočamo, da <b>prenesete</b> slovar za ta jezik: <xliff:g id="LANGUAGE">%1$s</xliff:g>.<br/> <br/> Prenos prek povezave UMTS lahko traja minuto ali dve. Če nimate <b>neomejen. prenosa podatkov</b>.<br/>, ga boste morda morali plačati. Če ne veste, kateri pod. paket imate, poiščite omrežje Wi-Fi, da prenos začnete samodejno.<br/> <br/> Nasvet: Slovarje lahko prenesete in odstranite tako, da v meniju <b>Nastavitve</b> v napravi odprete <b>Jezik in vnos</b>."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Prenesi zdaj (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Prenos prek povezave Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Slovar je na voljo za jezik <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Pritisnite za pregled in prenos"</string> + <string name="app_name" msgid="6320102637491234792">"Ponudnik slovarja"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Ponudnik slovarja"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Storitev slovarja"</string> + <string name="download_description" msgid="6014835283119198591">"Podatki o posodobitvi slovarja"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Dodatni slovarji"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Slovar je na voljo"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Nastavitve za slovarje"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Uporabniški slovarji"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Uporabniški slovar"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Slovar je na voljo"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Trenutno se prenaša"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Nameščen"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Nameščen, onemogočen"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Težava s povezavo"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Ni slovarjev"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Osveži"</string> + <string name="last_update" msgid="730467549913588780">"Nazadnje posodobljeno"</string> + <string name="message_updating" msgid="4457761393932375219">"Iskanje posodobitev"</string> + <string name="message_loading" msgid="8689096636874758814">"Nalaganje ..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Glavni slovar"</string> + <string name="cancel" msgid="6830980399865683324">"Prekliči"</string> + <string name="install_dict" msgid="180852772562189365">"Namesti"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Prekliči"</string> + <string name="delete_dict" msgid="756853268088330054">"Izbriši"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Za izbrani jezik v mobilni napravi je na voljo slovar.<br/> Za izboljšano izkušnjo tipkanja priporočamo, da <b>prenesete</b> slovar za ta jezik: <xliff:g id="LANGUAGE">%1$s</xliff:g>.<br/> <br/> Prenos prek povezave 3G lahko traja minuto ali dve. Če nimate <b>neomejenega podatkovnega paketa</b>.<br/>, boste morda morali plačati prenos podatkov. Če ne veste, kateri podatkovni paket imate, priporočamo, da poiščete omrežje Wi-Fi in prenos začnete samodejno.<br/> <br/> Nasvet: Slovarje lahko prenesete in odstranite tako, da v meniju <b>Nastavitve</b> v mobilni napravi odprete <b>Jezik in vnos</b>."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Prenesi zdaj (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Prenos prek povezave Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Slovar je na voljo za jezik <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Pritisnite za pregled in prenos"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Predlogi za prenos za jezik <xliff:g id="LANGUAGE">%1$s</xliff:g> bodo kmalu pripravljeni."</string> </resources> diff --git a/java/res/values-sr/strings-appname.xml b/java/res/values-sr/strings-appname.xml deleted file mode 100644 index 449fe551a..000000000 --- a/java/res/values-sr/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android тастатура"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android провера правописа"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Подешавања Android тастатуре"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Подешавања провере правописа"</string> -</resources> diff --git a/java/res/values-sr/strings.xml b/java/res/values-sr/strings.xml index 9b3022342..91c934679 100644 --- a/java/res/values-sr/strings.xml +++ b/java/res/values-sr/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android тастатура (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android тастатура (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Подешавања Android тастатуре (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android провера правописа (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Подешавања Android провере правописа (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Опције уноса"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Команде евиденције истраживања"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android провера правописа (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Гласовни унос је онемогућен"</string> <string name="configure_input_method" msgid="373356270290742459">"Конфигурисање метода уноса"</string> <string name="language_selection_title" msgid="1651299598555326750">"Језици за унос"</string> + <string name="send_feedback" msgid="1780431884109392046">"Пошаљи повратне информације"</string> <string name="select_language" msgid="3693815588777926848">"Језици уноса"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Поново додирните да бисте сачували"</string> <string name="has_dictionary" msgid="6071847973466625007">"Речник је доступан"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Омогући повратну информацију корисника"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Помозите да се побољша овај уређивач режима уноса тако што ће се аутоматски послати статистика о коришћењу и извештаји о грешкама компанији Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Тема тастатуре"</string> <string name="subtype_en_GB" msgid="88170601942311355">"енглески (УК)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"енглески (САД)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Подешавања одлагања при дугом притиску на тастер"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Подешавања трајања вибрације при притиску на тастере"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Подешавања јачине звука при притиску на тастере"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Читање датотеке спољног речника"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У директоријуму Преузимања нема датотека речника"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Избор датотеке речника за инсталирање"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Подразумевано"</string> <string name="language_settings" msgid="1671153053201809031">"Језик и унос"</string> <string name="select_input_method" msgid="4301602374609275003">"Избор метода уноса"</string> - - <string name="app_name" msgid="1017058186322714405">"Добављач речника"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Добављач речника"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Услуга речника"</string> - <string name="download_description" msgid="3274861514695032954">"Информације о ажурирању речника"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Помоћни речници"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Речник је доступан"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Подешавања за речнике"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Кориснички речници"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Кориснички речник"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Речник је доступан"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Тренутно се преузима"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Инсталирано"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Инсталиран, онемогућен"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Нема услуге речника"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Нема доступних речника"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Освежи"</string> - <string name="last_update" msgid="3101549719827600346">"Последње ажурирање"</string> - <string name="message_updating" msgid="820186276704134720">"Тражење ажурирања"</string> - <string name="message_loading" msgid="8611339149825047446">"Учитавање..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Главни речник"</string> - <string name="cancel" msgid="5586531736609183304">"Откажи"</string> - <string name="install_dict" msgid="5525005524697607865">"Инсталирај"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Откажи преузимање"</string> - <string name="disable_dict" msgid="7685810040236497700">"Онемогући"</string> - <string name="enable_dict" msgid="3848179784702473680">"Омогући"</string> - <string name="delete_dict" msgid="5817159290503843766">"Избриши"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Речник је доступан за <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Притисните за преглед и преузимање"</string> + <string name="app_name" msgid="6320102637491234792">"Добављач речника"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Добављач речника"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Услуга речника"</string> + <string name="download_description" msgid="6014835283119198591">"Информације о ажурирању речника"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Помоћни речници"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Речник је доступан"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Подешавања за речнике"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Кориснички речници"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Кориснички речник"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Речник је доступан"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Тренутно се преузима"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Инсталиран је"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Инсталиран је и онемогућен"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Проблем при повезивању с услугом речника"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Нема доступних речника"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Освежи"</string> + <string name="last_update" msgid="730467549913588780">"Последње ажурирање"</string> + <string name="message_updating" msgid="4457761393932375219">"Тражење ажурирања"</string> + <string name="message_loading" msgid="8689096636874758814">"Учитавање..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Главни речник"</string> + <string name="cancel" msgid="6830980399865683324">"Откажи"</string> + <string name="install_dict" msgid="180852772562189365">"Инсталирај"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Откажи"</string> + <string name="delete_dict" msgid="756853268088330054">"Избриши"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Доступан је речник за изабрани језик на мобилном уређају.<br/> Препоручујемо да <b>преузмете </b> речник за <xliff:g id="LANGUAGE">%1$s</xliff:g> да бисте побољшали доживљај куцања.<br/> <br/> Преузимање може да траје минут или два преко 3G мреже. Трошкови ће можда бити наплаћени ако немате <b>претплатнички пакет без ограничења</b>.<br/> Ако нисте сигурни који претплатнички пакет имате, препоручујемо да пронађете Wi-Fi везу да бисте аутоматски започели преузимање.<br/> <br/> Савет: Речнике можете да преузимате и уклањате тако што ћете посетити <b>Језик и унос</b> у менију <b>Подешавања</b> мобилног уређаја."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Преузми одмах (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Преузми преко Wi-Fi-ја"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Речник је доступан за <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Притисните за преглед и преузимање"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Преузимање: Предлози за <xliff:g id="LANGUAGE">%1$s</xliff:g> ће ускоро бити спремни."</string> </resources> diff --git a/java/res/values-sv/strings-appname.xml b/java/res/values-sv/strings-appname.xml deleted file mode 100644 index 9b4a7dbd1..000000000 --- a/java/res/values-sv/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Androids tangentbord"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Stavningskontroll i Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Inställningar för Androids tangentbord"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Inställningar för stavningskontroll"</string> -</resources> diff --git a/java/res/values-sv/strings.xml b/java/res/values-sv/strings.xml index 24ea428a6..643302aef 100644 --- a/java/res/values-sv/strings.xml +++ b/java/res/values-sv/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Androids tangentbord (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Androids tangentbord (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Inställningar för Androids tangentbord (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Stavningskontroll i Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Inställningar för Androids stavningskontroll (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Inmatningsalternativ"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Loggkommandon"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Stavningskontroll i Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Röstinmatning inaktiv"</string> <string name="configure_input_method" msgid="373356270290742459">"Konfigurera inmatningsmetoder"</string> <string name="language_selection_title" msgid="1651299598555326750">"Inmatningsspråk"</string> + <string name="send_feedback" msgid="1780431884109392046">"Skicka feedback"</string> <string name="select_language" msgid="3693815588777926848">"Inmatningsspråk"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Spara genom att trycka igen"</string> <string name="has_dictionary" msgid="6071847973466625007">"En ordlista är tillgänglig"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Aktivera synpunkter från användare"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Du kan hjälpa till att förbättra inmatningsmetoden genom att automatiskt skicka användningsstatistik och felrapporter till Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Inställningar för fördröjning vid långt tryck"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Inställningar för vibrationslängd vid knapptryck"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Volyminställningar för knappljud"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Läs extern ordboksfil"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Inga ordboksfiler i mappen Hämtningar"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Välj en ordboksfil att installera"</string> @@ -170,36 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Standard"</string> <string name="language_settings" msgid="1671153053201809031">"Språk & inmatning"</string> <string name="select_input_method" msgid="4301602374609275003">"Välj inmatningsmetod"</string> - - <string name="app_name" msgid="1017058186322714405">"Dictionary Provider"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Dictionary Provider"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Ordbokstjänst"</string> - <string name="download_description" msgid="3274861514695032954">"Uppdateringsinformation för ordlista"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Tilläggsordlistor"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"En ordlista är tillgänglig"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Inställningar för ordlistor"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Egna ordlistor"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Egen ordlista"</string> - <string name="dictionary_available" msgid="3192920608520618083">"En ordlista är tillgänglig"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Hämtas för närvarande"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Installerad"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Installerad, inaktiverad"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problem med att ansluta till ordlistetjänsten"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Det finns inga ordböcker"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Uppdatera"</string> - <string name="last_update" msgid="3101549719827600346">"Senast uppdaterad"</string> - <string name="message_updating" msgid="820186276704134720">"Söker efter uppdateringar"</string> - <string name="message_loading" msgid="8611339149825047446">"Läser in ..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Huvudordlistan"</string> - <string name="cancel" msgid="5586531736609183304">"Avbryt"</string> - <string name="install_dict" msgid="5525005524697607865">"Installera"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Avbryt hämtning"</string> - <string name="disable_dict" msgid="7685810040236497700">"Inaktivera"</string> - <string name="enable_dict" msgid="3848179784702473680">"Aktivera"</string> - <string name="delete_dict" msgid="5817159290503843766">"Ta bort"</string> - <string name="should_download_over_metered_prompt" msgid="4965264849057656521">"Det finns en ordlista för språket du har valt i enheten.<br/> Vi rekommenderar att du <b>hämtar</b> den <xliff:g id="LANGUAGE">%1$s</xliff:g> ordlistan.<br/> <br/> Det kan ta någon minut att hämta den över 3G. Avgifter kan tillkomma om du inte har ett abonnemang med <b>obegränsad datatrafik</b>.<br/> Om du är osäker på ditt abonnemang rekommenderar vi att du ansluter till ett Wi-Fi-nätverk och hämtar ordlistan automatiskt.<br/> <br/> Tips! Du kan hämta och ta bort ordlistor under <b>Språk och inmatning</b> i menyn <b>Inställningar</b> på enheten."</string> - <string name="download_over_metered" msgid="4024013764937850061">"Hämta nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> - <string name="do_not_download_over_metered" msgid="6963770885033765378">"Hämta över Wi-Fi"</string> - <string name="dict_available_notification_title" msgid="4560576379680660047">"En ordlista är tillgänglig för <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Tryck om du vill granska och hämta"</string> + <string name="app_name" msgid="6320102637491234792">"Dictionary Provider"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Dictionary Provider"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Ordlistetjänst"</string> + <string name="download_description" msgid="6014835283119198591">"Uppdateringsinformation för ordlista"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Tilläggsordlistor"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"En ordlista är tillgänglig"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Inställningar för ordlistor"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Egna ordlistor"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Egen ordlista"</string> + <string name="dictionary_available" msgid="4728975345815214218">"En ordlista är tillgänglig"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Hämtar för närvarande"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Installerad"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Installerad, inaktiverad"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Problem med att ansluta till ordlistetjänsten"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Inga ordlistor finns"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Uppdatera"</string> + <string name="last_update" msgid="730467549913588780">"Informationen uppdaterades senast"</string> + <string name="message_updating" msgid="4457761393932375219">"Söker efter uppdateringar"</string> + <string name="message_loading" msgid="8689096636874758814">"Läser in ..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Huvudordlista"</string> + <string name="cancel" msgid="6830980399865683324">"Avbryt"</string> + <string name="install_dict" msgid="180852772562189365">"Installera"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Avbryt"</string> + <string name="delete_dict" msgid="756853268088330054">"Ta bort"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Det finns en ordlista för språket du har valt i din mobila enhet.<br/> Vi rekommenderar att du <b>hämtar</b> ordlistan för <xliff:g id="LANGUAGE">%1$s</xliff:g> så att det blir enklare att skriva.<br/> <br/> Det kan ta någon minut att hämta den via 3G. Avgifter kan tillkomma om du inte har ett abonnemang med <b>obegränsad datatrafik</b>.<br/> Om du är osäker på vilket abonnemang du har rekommenderar vi att du ansluter till ett Wi-Fi-nätverk och hämtar ordlistan automatiskt.<br/> <br/> Tips! Du kan hämta och ta bort ordlistor under <b>Språk och inmatning</b> i menyn <b>Inställningar</b> på den mobila enheten."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Hämta nu (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Hämta via Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"En ordlista är tillgänglig för <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Tryck om du vill granska och hämta"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Hämtar: förslag för <xliff:g id="LANGUAGE">%1$s</xliff:g> är snart klara."</string> </resources> diff --git a/java/res/values-sw/strings-appname.xml b/java/res/values-sw/strings-appname.xml deleted file mode 100644 index 51de0a6b8..000000000 --- a/java/res/values-sw/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Kibodi ya Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Kikagua tahajia cha Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Mipangilio ya kibodi ya Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Mipangilio ya kukagua tahajia"</string> -</resources> diff --git a/java/res/values-sw/strings.xml b/java/res/values-sw/strings.xml index a9747531f..a4617958c 100644 --- a/java/res/values-sw/strings.xml +++ b/java/res/values-sw/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Kicharazio cha Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Kibodi ya Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Mipangilio ya Kibodi ya Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Kikagua-tahajia cha Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Mipangilio ya Kikagua-tahajia cha Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Chaguo za uingizaji"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Amri za Kumbukumbu za Utafiti"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Kikagua tahajia cha Android (AOSP)"</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 ingizo kutoka kwa orodha yako ya anwani"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Tetema unabofya kitufe"</string> @@ -89,7 +91,7 @@ <string name="spoken_description_delete" msgid="8740376944276199801">"Futa"</string> <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Alama"</string> <string name="spoken_description_to_alpha" msgid="23129338819771807">"Herufi"</string> - <string name="spoken_description_to_numeric" msgid="591752092685161732">"Namba"</string> + <string name="spoken_description_to_numeric" msgid="591752092685161732">"Nambari"</string> <string name="spoken_description_settings" msgid="4627462689603838099">"Mipangilio"</string> <string name="spoken_description_tab" msgid="2667716002663482248">"Kichupo"</string> <string name="spoken_description_space" msgid="2582521050049860859">"Nafasi"</string> @@ -113,7 +115,7 @@ <string name="keyboard_mode_date" msgid="3137520166817128102">"tarehe"</string> <string name="keyboard_mode_date_time" msgid="339593358488851072">"tarehe na wakati"</string> <string name="keyboard_mode_email" msgid="6216248078128294262">"barua pepe"</string> - <string name="keyboard_mode_im" msgid="1137405089766557048">"inatuma ujumbe"</string> + <string name="keyboard_mode_im" msgid="1137405089766557048">"Utumaji ujumbe"</string> <string name="keyboard_mode_number" msgid="7991623440699957069">"nambari"</string> <string name="keyboard_mode_phone" msgid="6851627527401433229">"simu"</string> <string name="keyboard_mode_text" msgid="6479436687899701619">"maandishi"</string> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Uingizaji sauti umelemazwa"</string> <string name="configure_input_method" msgid="373356270290742459">"Sanidi mbinu za uingizaji"</string> <string name="language_selection_title" msgid="1651299598555326750">"Lugha za uingizaji"</string> + <string name="send_feedback" msgid="1780431884109392046">"Tuma maoni"</string> <string name="select_language" msgid="3693815588777926848">"Lugha zinazoruhusiwa"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Gusa tena ili kuhifadhi"</string> <string name="has_dictionary" msgid="6071847973466625007">"Kamusi inapatikana"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Wezesha maoni ya watumiaji"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Saidia kuimarisha mbinu ya uingizaji wa kihariri, kwa kutuma takwimu za matumizi na ripoti za kuvurugika kwa Google kiotomatiki."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"mipangilio ya kuchelewesha kwa kubonyeza kitufe kwa muda mrefu"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Bonyeza mipangilio ya kipindi cha mtetemo"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Bonyeza mipangilio ya nguvu za sauti"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Soma faili ya kamusi ya nje"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Hakuna faili za kamusi katika folda ya Vilivyopakuliwa"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Chagua faili ya kamusi ya kusakinisha"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Chaguo-msingi"</string> <string name="language_settings" msgid="1671153053201809031">"Lugha na uingizaji"</string> <string name="select_input_method" msgid="4301602374609275003">"Chagua mbinu ya kuingiza data"</string> - - <string name="app_name" msgid="1017058186322714405">"Mtoaji Kamusi"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Mtoaji Kamusi"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Huduma ya Kamusi"</string> - <string name="download_description" msgid="3274861514695032954">"Maelezo ya kusasisha kamusi"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Nyongeza za kamusi"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Kamusi inapatikana"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Mipangilio ya kamusi"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Kamusi ya mtumiaji"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Kamusi ya mtumiaji"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Kamusi inapatikana"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Inapakua sasa"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Imesakinishwa"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"kusakinisha, imelemazwa"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Tatizo kuunganisha kwa huduma ya kamusi"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Hakuna kamusi inapatikana"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Zimua"</string> - <string name="last_update" msgid="3101549719827600346">"Mara ya mwisho kusasishwa"</string> - <string name="message_updating" msgid="820186276704134720">"Inatafuta visasishi..."</string> - <string name="message_loading" msgid="8611339149825047446">"Inapakia..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Kamusi kuu"</string> - <string name="cancel" msgid="5586531736609183304">"Katisha"</string> - <string name="install_dict" msgid="5525005524697607865">"Sakinisha"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Ghairi kupakua"</string> - <string name="disable_dict" msgid="7685810040236497700">"Lemaza"</string> - <string name="enable_dict" msgid="3848179784702473680">"Wezesha"</string> - <string name="delete_dict" msgid="5817159290503843766">"Futa"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Kamusi inapatikana ya <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Bonyeza ili kukagua na kupakua"</string> + <string name="app_name" msgid="6320102637491234792">"Mtoaji Kamusi"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Mtoaji Kamusi"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Huduma ya Kamusi"</string> + <string name="download_description" msgid="6014835283119198591">"Maelezo ya kusasisha kamusi"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Kamusi za nyongeza"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Kamusi inapatikana"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Mipangilio ya kamusi"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Kamusi ya mtumiaji"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Kamusi ya mtumiaji"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Kamusi inapatikana"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Inapakua sasa"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Imesakinishwa"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Imesakinishwa, haitumiki"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Tatizo wakati wa kuunganisha kwenye huduma ya kamusi"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Hakuna kamusi inayopatikana"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Onyesha upya"</string> + <string name="last_update" msgid="730467549913588780">"Ilibadilishwa mwisho"</string> + <string name="message_updating" msgid="4457761393932375219">"Inatafuta sasisho..."</string> + <string name="message_loading" msgid="8689096636874758814">"Inapakia..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Kamusi kuu"</string> + <string name="cancel" msgid="6830980399865683324">"Ghairi"</string> + <string name="install_dict" msgid="180852772562189365">"Sakinisha"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Ghairi"</string> + <string name="delete_dict" msgid="756853268088330054">"Futa"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Lugha iliyochaguliwa kwenye kifaa chako cha mkononi ina kamusi inayopatikana.<br/> Tunapendekeza<b>upakuaji wa kamusi</b> <xliff:g id="LANGUAGE">%1$s</xliff:g> ili kuboresha hali yako ya kucharaza.<br/> <br/> Upakuaji unaweza kuchukua dakika moja au mbili kukamilika kwenye 3G. Unaweza kutozwa pesa ikiwa huna mpango wa data <b>usio na kipimo </b>.<br/>Ikiwa huna uhakika una mpango gani wa data, tunapendekeza utafute muunganisho wa Wi-Fi ili uanze upakuaji moja kwa moja.<br/> <br/> Kidokezo: Unaweza kupakua na kuondoa kamusi kwa kuenda kwenye<b>Ingizo la & Lugha</b> katika <b>menyu ya Mipangilio</b> ya kifaa chako cha mkononi."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Pakua sasa (MB<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Pakua kwenye Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Kamusi ya <xliff:g id="LANGUAGE">%1$s</xliff:g> inapatikana"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Bonyeza ili kukagua na kupakua"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Inapakua: mapendekezo ya <xliff:g id="LANGUAGE">%1$s</xliff:g> yatakuwa tayari hivi karibuni."</string> </resources> diff --git a/java/res/values-th/strings-appname.xml b/java/res/values-th/strings-appname.xml deleted file mode 100644 index 7fc7e3e43..000000000 --- a/java/res/values-th/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"แป้นพิมพ์แอนดรอยด์"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"การตรวจสอบการสะกดของแอนดรอยด์"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"การตั้งค่าแป้นพิมพ์แอนดรอยด์"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"การตั้งค่าการตรวจสอบการสะกด"</string> -</resources> diff --git a/java/res/values-th/strings.xml b/java/res/values-th/strings.xml index 2cf91305d..5279e3057 100644 --- a/java/res/values-th/strings.xml +++ b/java/res/values-th/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android keyboard (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"แป้นพิมพ์แอนดรอยด์ (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"การตั้งค่าแป้นพิมพ์แอนดรอยด์ (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"เครื่องตรวจตัวสะกดแอนดรอยด์ (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"การตั้งค่าเครื่องตรวจตัวสะกดแอนดรอยด์ (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"ตัวเลือกการป้อนข้อมูล"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"คำสั่งบันทึกการวิจัย"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"แอนดรอยด์ตรวจสอบการสะกด (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"ปิดใช้งานป้อนข้อมูลด้วยเสียง"</string> <string name="configure_input_method" msgid="373356270290742459">"กำหนดค่าวิธีการป้อนข้อมูล"</string> <string name="language_selection_title" msgid="1651299598555326750">"ภาษาในการป้อนข้อมูล"</string> + <string name="send_feedback" msgid="1780431884109392046">"ส่งข้อเสนอแนะ"</string> <string name="select_language" msgid="3693815588777926848">"ภาษาสำหรับการป้อนข้อมูล"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"แตะอีกครั้งเพื่อบันทึก"</string> <string name="has_dictionary" msgid="6071847973466625007">"มีพจนานุกรมให้ใช้งาน"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"เปิดใช้งานการแสดงความคิดเห็นจากผู้ใช้"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"ช่วยปรับปรุงตัวแก้ไขวิธีการป้อนข้อมูลนี้โดยการส่งสถิติการใช้งานและรายงานการขัดข้องถึง Google โดยอัตโนมัติ"</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"ชุดรูปแบบแป้นพิมพ์"</string> <string name="subtype_en_GB" msgid="88170601942311355">"อังกฤษ (สหราชอาณาจักร)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"อังกฤษ (อเมริกัน)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"การตั้งค่าความหน่วงของการกดแป้นค้าง"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"การตั้งค่าระยะเวลาการสั่นเมื่อกดแป้นพิมพ์"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"การตั้งค่าระดับเสียงเมื่อกดแป้นพิมพ์"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"อ่านไฟล์พจนานุกรมภายนอก"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"ไม่มีไฟล์พจนานุกรมในโฟลเดอร์ดาวน์โหลด"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"เลือกไฟล์พจนานุกรมที่จะติดตั้ง"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"ค่าเริ่มต้น"</string> <string name="language_settings" msgid="1671153053201809031">"ภาษาและการป้อนข้อมูล"</string> <string name="select_input_method" msgid="4301602374609275003">"เลือกวิธีการป้อนข้อมูล"</string> - - <string name="app_name" msgid="1017058186322714405">"ผู้ให้บริการพจนานุกรม"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"ผู้ให้บริการพจนานุกรม"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"บริการพจนานุกรม"</string> - <string name="download_description" msgid="3274861514695032954">"ข้อมูลอัปเดตสำหรับพจนานุกรม"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"พจนานุกรม Add-On"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"มีพจนานุกรมให้ใช้งาน"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"การตั้งค่าสำหรับพจนานุกรม"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"พจนานุกรมผู้ใช้"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"พจนานุกรมผู้ใช้"</string> - <string name="dictionary_available" msgid="3192920608520618083">"มีพจนานุกรมให้ใช้งาน"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"กำลังดาวน์โหลดอยู่"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"ติดตั้งแล้ว"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"ติดตั้งแล้วแต่ปิดใช้งาน"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"พบปัญหาขณะเชื่อมต่อ"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"ไม่มีพจนานุกรม"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"รีเฟรช"</string> - <string name="last_update" msgid="3101549719827600346">"ปรับปรุงล่าสุดเมื่อ"</string> - <string name="message_updating" msgid="820186276704134720">"กำลังตรวจสอบการอัปเดต..."</string> - <string name="message_loading" msgid="8611339149825047446">"กำลังโหลด..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"พจนานุกรมหลัก"</string> - <string name="cancel" msgid="5586531736609183304">"ยกเลิก"</string> - <string name="install_dict" msgid="5525005524697607865">"ติดตั้ง"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"ยกเลิกการดาวน์โหลด"</string> - <string name="disable_dict" msgid="7685810040236497700">"ปิดใช้งาน"</string> - <string name="enable_dict" msgid="3848179784702473680">"เปิดใช้งาน"</string> - <string name="delete_dict" msgid="5817159290503843766">"ลบ"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"มีพจนานุกรมให้ใช้งานในภาษา <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"กดเพื่อตรวจสอบและดาวน์โหลด"</string> + <string name="app_name" msgid="6320102637491234792">"ผู้ให้บริการพจนานุกรม"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"ผู้ให้บริการพจนานุกรม"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"บริการพจนานุกรม"</string> + <string name="download_description" msgid="6014835283119198591">"ข้อมูลอัปเดตสำหรับพจนานุกรม"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"พจนานุกรมส่วนเสริม"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"มีพจนานุกรมให้ใช้งาน"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"การตั้งค่าสำหรับพจนานุกรม"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"พจนานุกรมผู้ใช้"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"พจนานุกรมผู้ใช้"</string> + <string name="dictionary_available" msgid="4728975345815214218">"มีพจนานุกรมให้ใช้งาน"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"กำลังดาวน์โหลดอยู่"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"ติดตั้งแล้ว"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"ติดตั้งแล้วแต่ปิดใช้งาน"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"พบปัญหาขณะเชื่อมต่อ"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"ไม่มีพจนานุกรม"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"รีเฟรช"</string> + <string name="last_update" msgid="730467549913588780">"ปรับปรุงแก้ไขครั้งล่าสุด"</string> + <string name="message_updating" msgid="4457761393932375219">"กำลังตรวจสอบการอัปเดต"</string> + <string name="message_loading" msgid="8689096636874758814">"กำลังโหลด..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"พจนานุกรมหลัก"</string> + <string name="cancel" msgid="6830980399865683324">"ยกเลิก"</string> + <string name="install_dict" msgid="180852772562189365">"ติดตั้ง"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"ยกเลิก"</string> + <string name="delete_dict" msgid="756853268088330054">"ลบ"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"ภาษาที่คุณเลือกใช้ในอุปกรณ์เคลื่อนที่มีพจนานุกรมที่สามารถใช้ได้<br/> เราขอแนะนำให้คุณ <b>ดาวน์โหลด</b> พจนานุกรม <xliff:g id="LANGUAGE">%1$s</xliff:g> เพื่อรับประสบการณ์การพิมพ์ที่ดียิ่งขึ้น<br/> <br/>การดาวน์โหลดจะใช้เวลาหนึ่งถึงสองนาทีผ่านทาง 3G ซึ่งอาจมีการเรียกเก็บเงินหากคุณไม่ได้ใช้ <b>แผนบริการข้อมูลแบบไม่จำกัดปริมาณ</b> <br/>หากคุณไม่แน่ใจว่าคุณใช้แผนบริการข้อมูลแบบใด เราขอแนะนำให้คุณเชื่อมต่อ WiFi เพื่อเริ่มการดาวน์โหลดอัตโนมัติ<br/> <br/>เคล็ดลับ: คุณสามารถดาวน์โหลดและนำพจนานุกรมออกได้โดยไปที่ <b>ภาษาและการป้อนข้อมูล</b> ในเมนู <b>การตั้งค่า</b> ในอุปกรณ์เคลื่อนที่ของคุณ"</string> + <string name="download_over_metered" msgid="1643065851159409546">"ดาวน์โหลดเลย (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"ดาวน์โหลดผ่าน WiFi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"มีพจนานุกรมให้ใช้งานในภาษา <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"กดเพื่อตรวจสอบและดาวน์โหลด"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"กำลังดาวน์โหลด: คำแนะนำสำหรับ <xliff:g id="LANGUAGE">%1$s</xliff:g> จะพร้อมใช้งานเร็วๆ นี้"</string> </resources> diff --git a/java/res/values-tl/strings-appname.xml b/java/res/values-tl/strings-appname.xml deleted file mode 100644 index fd2b3f55b..000000000 --- a/java/res/values-tl/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Keyboard ng Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Spell checker ng Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Mga setting ng keyboard ng Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Mga setting ng pag-spell check"</string> -</resources> diff --git a/java/res/values-tl/strings.xml b/java/res/values-tl/strings.xml index ad5714dff..11918d32d 100644 --- a/java/res/values-tl/strings.xml +++ b/java/res/values-tl/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android keyboard (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android Keyboard (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Mga Setting ng Android Keyboard (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Spell Checker ng Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Mga Setting ng Spell Checker ng Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Mga pagpipilian sa input"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Cmmnd sa Log ng Pnnliksik"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Pang-check ng pagbabaybay ng Android (AOSP)"</string> <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Maghanap pangalan contact"</string> <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Gumagamit pang-check pagbabaybay entry sa iyong listahan contact"</string> <string name="vibrate_on_keypress" msgid="5258079494276955460">"Mag-vibrate sa keypress"</string> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Hindi pinagana ang voice input"</string> <string name="configure_input_method" msgid="373356270290742459">"I-configure ang mga pamamaraan ng pag-input"</string> <string name="language_selection_title" msgid="1651299598555326750">"Mag-input ng mga wika"</string> + <string name="send_feedback" msgid="1780431884109392046">"Magpadala ng feedback"</string> <string name="select_language" msgid="3693815588777926848">"Mga wika ng input"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Pinduting muli upang i-save"</string> <string name="has_dictionary" msgid="6071847973466625007">"Available ang diksyunaryo"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Paganahin ang feedback ng user"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Tumulong na pahusayin ang editor ng paraan ng pag-input na ito sa pamamagitan ng awtomatikong pagpapadala ng mga istatistika ng paggamit at mga ulat ng crash sa Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Mga setting ng pagkaantala ng matagal na pagpindot sa key"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Mga setting ng tagal ng vibration ng keypress"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Mga setting ng volume ng tunog ng keypress"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Magbasa ng panlabas na file ng diksyunaryo"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Walang mga file ng diksyunaryo sa folder na Mga Download"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Pumili ng file ng diksyunaryo na ii-install"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Default"</string> <string name="language_settings" msgid="1671153053201809031">"Wika at input"</string> <string name="select_input_method" msgid="4301602374609275003">"Pumili ng pamamaraan ng pag-input"</string> - - <string name="app_name" msgid="1017058186322714405">"Provider ng Diksyunaryo"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Provider ng Diksyunaryo"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Serbisyo ng Diksyunaryo"</string> - <string name="download_description" msgid="3274861514695032954">"Impormasyon ng pag-update sa diksyunaryo"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Mga diksyunaryo na add-on"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Available ang diksyunaryo"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Mga setting para sa mga diksyunaryo"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Mga diksyunaryo ng user"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Diksyunaryo ng user"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Available ang diksyunaryo"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Kasalukuyang nagda-download"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Naka-install"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Naka-install, hindi pinagana"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Problema sa pagkonekta sa serbisyo ng diksyunaryo"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Walang available na mga diksyunaryo"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"I-refresh"</string> - <string name="last_update" msgid="3101549719827600346">"Huling na-update"</string> - <string name="message_updating" msgid="820186276704134720">"Tumitingin ng mga update"</string> - <string name="message_loading" msgid="8611339149825047446">"Naglo-load..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Pangunahing diksyunaryo"</string> - <string name="cancel" msgid="5586531736609183304">"Kanselahin"</string> - <string name="install_dict" msgid="5525005524697607865">"I-install"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Kanselahin ang pag-download"</string> - <string name="disable_dict" msgid="7685810040236497700">"Huwag paganahin"</string> - <string name="enable_dict" msgid="3848179784702473680">"Paganahin"</string> - <string name="delete_dict" msgid="5817159290503843766">"Tanggalin"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Available ang isang diksyunaryo para sa <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Pindutin upang suriin at i-download"</string> + <string name="app_name" msgid="6320102637491234792">"Provider ng Diksyunaryo"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Provider ng Diksyunaryo"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Serbisyo ng Diksyunaryo"</string> + <string name="download_description" msgid="6014835283119198591">"Impormasyon ng update sa diksyunaryo"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Mga add-on na diksyunaryo"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Available ang diksyunaryo"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Mga setting para sa mga diksyunaryo"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Mga diksyunaryo ng user"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Diksyunaryo ng user"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Available ang diksyunaryo"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Kasalukuyang dina-download"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Na-install na"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Naka-install, hindi pinagana"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Di makakonekta sa serbisyong diksyunaryo"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Walang mga diksyunaryo"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"I-refresh"</string> + <string name="last_update" msgid="730467549913588780">"Huling na-update"</string> + <string name="message_updating" msgid="4457761393932375219">"Tumitingin ng mga update"</string> + <string name="message_loading" msgid="8689096636874758814">"Naglo-load..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Pangunahing diksyunaryo"</string> + <string name="cancel" msgid="6830980399865683324">"Kanselahin"</string> + <string name="install_dict" msgid="180852772562189365">"I-install"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Kanselahin"</string> + <string name="delete_dict" msgid="756853268088330054">"Tanggalin"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"May available na diksyunaryo ang piniling wika sa iyong mobile device.<br/> Inirerekomenda namin ang <b>pag-download</b> sa diksyunaryong <xliff:g id="LANGUAGE">%1$s</xliff:g> upang mapabuti ang iyong karanasan sa pag-type.<br/> <br/> Maaaring umabot ng isa hanggang dalawang minuto ang pag-download gamit ang 3G. Maaaring may malapat na mga pagsingil kung wala kang <b>data plan na walang limitasyon</b>.<br/> Kung hindi ka sigurado kung aling data plan ang mayroon ka, inirerekomenda naming maghanap ng koneksyon sa Wi-Fi upang awtomatikong simulan ang pag-download.<br/> <br/> Tip: Maaari kang mag-download at mag-alis ng mga diksyunaryo sa pamamagitan ng pagpunta sa <b>Wika at input</b> sa menu na <b>Mga Setting</b> ng iyong mobile device."</string> + <string name="download_over_metered" msgid="1643065851159409546">"I-download ngayon (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"I-download gamit ang Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"May available na diksyunaryo para sa <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Pindutin upang suriin at i-download"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Dina-download: malapit nang maging handa ang mga suhestiyon para sa <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-tr/strings-appname.xml b/java/res/values-tr/strings-appname.xml deleted file mode 100644 index f5e36d2e8..000000000 --- a/java/res/values-tr/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android klavyesi"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android yazım denetleyici"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android klavye ayarları"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Yazım denetimi ayarları"</string> -</resources> diff --git a/java/res/values-tr/strings.xml b/java/res/values-tr/strings.xml index 7e122ad7a..38185bbed 100644 --- a/java/res/values-tr/strings.xml +++ b/java/res/values-tr/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android klavye (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android klavye (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android Klavye Ayarları (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android Yazım Denetleyici (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android Yazım Denetleyici Ayarları (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Giriş seçenekleri"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Araştırma Günlüğü Komutları"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android yazım denetleyici (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Sesle grş devre dışı"</string> <string name="configure_input_method" msgid="373356270290742459">"Giriş yöntemlerini yapılandır"</string> <string name="language_selection_title" msgid="1651299598555326750">"Giriş dilleri"</string> + <string name="send_feedback" msgid="1780431884109392046">"Geri bildirim gönder"</string> <string name="select_language" msgid="3693815588777926848">"Giriş dilleri"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Kaydetmek için tekrar dokunun"</string> <string name="has_dictionary" msgid="6071847973466625007">"Sözlük kullanılabilir"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Kullanıcı geri bildirimini etkinleştir"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Kullanım istatistiklerini ve kilitlenme raporlarını Google\'a otomatik olarak göndererek bu giriş yöntemi düzenleyicisinin iyileştirilmesine yardımcı olun."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Tuşa uzun basma için gecikme ayarları"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Tuşa basma titreşim süresi ayarları"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Tuşa basma ses düzeyi ayarları"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Harici sözlük dosyasını oku"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"İndirilenler klasöründe sözlük dosyası yok"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Yüklemek için bir sözlük dosyası seçin"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Varsayılan"</string> <string name="language_settings" msgid="1671153053201809031">"Dil ve giriş"</string> <string name="select_input_method" msgid="4301602374609275003">"Giriş yöntemini seçin"</string> - - <string name="app_name" msgid="1017058186322714405">"Sözlük Sağlayıcı"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Sözlük Sağlayıcı"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Sözlük Hizmeti"</string> - <string name="download_description" msgid="3274861514695032954">"Sözlük güncelleme bilgileri"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Ekli sözlükler"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Kullanılabilecek sözlük var"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Sözlükler için ayarlar"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Kullanıcı sözlükleri"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Kullanıcı sözlüğü"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Sözlük kullanılabilir"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Şu anda indiriliyor"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Yüklendi"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Yüklendi, devre dışı"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Sözlük hizmetine bağlantı yok"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Kullanılabilir sözlük yok"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Yenile"</string> - <string name="last_update" msgid="3101549719827600346">"Son güncelleme tarihi"</string> - <string name="message_updating" msgid="820186276704134720">"Güncellemeler denetleniyor..."</string> - <string name="message_loading" msgid="8611339149825047446">"Yükleniyor..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Ana sözlük"</string> - <string name="cancel" msgid="5586531736609183304">"İptal"</string> - <string name="install_dict" msgid="5525005524697607865">"Yükle"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"İndirmeyi iptal et"</string> - <string name="disable_dict" msgid="7685810040236497700">"Devre dışı bırak"</string> - <string name="enable_dict" msgid="3848179784702473680">"Etkinleştir"</string> - <string name="delete_dict" msgid="5817159290503843766">"Sil"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"<xliff:g id="LANGUAGE">%1$s</xliff:g> için kullanılabilecek bir sözlük var"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"İncelemek ve indirmek için tıklayın"</string> + <string name="app_name" msgid="6320102637491234792">"Sözlük Sağlayıcı"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Sözlük Sağlayıcı"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Sözlük Hizmeti"</string> + <string name="download_description" msgid="6014835283119198591">"Sözlük güncelleme bilgileri"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Ek sözlükler"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Sözlük mevcut"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Sözlükler için ayarlar"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Kullanıcı sözlükleri"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Kullanıcı sözlüğü"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Sözlük mevcut"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Şu anda indiriliyor"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Yüklendi"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Yüklendi, devre dışı bırakıldı"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Sözlük hizmetine bağlantı sorunu"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Kullanılabilir sözlük yok"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Yenile"</string> + <string name="last_update" msgid="730467549913588780">"Son güncelleme tarihi"</string> + <string name="message_updating" msgid="4457761393932375219">"Güncellemeler denetleniyor"</string> + <string name="message_loading" msgid="8689096636874758814">"Yükleniyor..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Ana sözlük"</string> + <string name="cancel" msgid="6830980399865683324">"İptal"</string> + <string name="install_dict" msgid="180852772562189365">"Yükle"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"İptal"</string> + <string name="delete_dict" msgid="756853268088330054">"Sil"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Mobil cihazınızda seçili dile ait kullanılabilir bir sözlük mevcut.<br/> Daha iyi yazabilmek için bu <xliff:g id="LANGUAGE">%1$s</xliff:g> sözlüğü <b>indirmenizi</b> öneririz.<br/> <br/> İndirme işlemi 3G üzerinden bir veya iki dakika sürebilir. <b>Sınırsız veri planınız</b> yoksa ücret alınabilir.<br/> Ne tür bir veri planına sahip olduğunuzdan emin değilseniz, otomatik olarak indirmeye başlamak için bir Kablosuz bağlantı bulmanızı öneririz.<br/> <br/> İpucu: Sözlükleri, mobil cihazınızın <b>Ayarlar</b> menüsünde <b>Dil ve giriş</b> seçeneğine giderek indirebilir ve silebilirsiniz."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Hemen indir (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Kablosuz üzerinden indir"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g> için kullanılabilecek bir sözlük mevcut"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"İncelemek ve indirmek için basın"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"<xliff:g id="LANGUAGE">%1$s</xliff:g> için önerilerin indirilmesine kısa süre içinde başlanacak."</string> </resources> diff --git a/java/res/values-uk/strings-appname.xml b/java/res/values-uk/strings-appname.xml deleted file mode 100644 index fdbb89fd9..000000000 --- a/java/res/values-uk/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Клавіатура Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Засіб перевірки орфографії Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Налаштування клавіатури Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Налаштування перевірки орфографії"</string> -</resources> diff --git a/java/res/values-uk/strings.xml b/java/res/values-uk/strings.xml index 609c80b60..30a37c2a9 100644 --- a/java/res/values-uk/strings.xml +++ b/java/res/values-uk/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Клавіатура Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Клавіатура Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Налаштування клавіатури Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Перевірка орфографії Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Налаштування перевірки орфографії Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Парам. введення"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Команди журналу дослідж."</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Засіб перевірки орфографії Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Голос. ввід вимкнено"</string> <string name="configure_input_method" msgid="373356270290742459">"Налаштування методів введення"</string> <string name="language_selection_title" msgid="1651299598555326750">"Мови вводу"</string> + <string name="send_feedback" msgid="1780431884109392046">"Надіслати відгук"</string> <string name="select_language" msgid="3693815588777926848">"Мови введення"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Торкніться знову, щоб зберегти"</string> <string name="has_dictionary" msgid="6071847973466625007">"Словник доступний"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Увімк. відгуки корист."</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Допоможіть покращ. редактор методу введ., автомат. надсилаючи в Google статистику використ. та звіти про збої."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"Тема клавіатури"</string> <string name="subtype_en_GB" msgid="88170601942311355">"Англійська (Великобританія)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"Англійська (США)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Налаштування довгого натискання"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Налаштування тривалості вібрації під час натискання клавіші"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Налаштування гучності звуку під час натискання клавіші"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Читати файл зовнішнього словника"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"У папці \"Завантаження\" немає файлів словника"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Вибрати файл словника, який потрібно встановити"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"За умовчанням"</string> <string name="language_settings" msgid="1671153053201809031">"Мова та введення"</string> <string name="select_input_method" msgid="4301602374609275003">"Вибрати метод введення"</string> - - <string name="app_name" msgid="1017058186322714405">"Постачальник словника"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Постачальник словника"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Послуга словника"</string> - <string name="download_description" msgid="3274861514695032954">"Інформація про оновлення словника"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Додаткові словники"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Словник доступний"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Налаштування для словників"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Словники користувача"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Словник користувача"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Словник доступний"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Зараз завантажується"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Установлено"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Установлено, вимкнено"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Нема з’єднання зі словником"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Словники недоступні"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Оновити"</string> - <string name="last_update" msgid="3101549719827600346">"Останнє оновлення"</string> - <string name="message_updating" msgid="820186276704134720">"Перевірка наявності оновлень"</string> - <string name="message_loading" msgid="8611339149825047446">"Завантаження..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Основний словник"</string> - <string name="cancel" msgid="5586531736609183304">"Скасувати"</string> - <string name="install_dict" msgid="5525005524697607865">"Установити"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Скасувати завантаження"</string> - <string name="disable_dict" msgid="7685810040236497700">"Вимкнути"</string> - <string name="enable_dict" msgid="3848179784702473680">"Увімкнути"</string> - <string name="delete_dict" msgid="5817159290503843766">"Видалити"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Доступний словник для такої мови: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Натисніть, щоб переглянути та завантажити"</string> + <string name="app_name" msgid="6320102637491234792">"Постачальник словника"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Постачальник словника"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Служба словника"</string> + <string name="download_description" msgid="6014835283119198591">"Інформація про оновлення словника"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Додаткові словники"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Словник доступний"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Налаштування для словників"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Словники користувача"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Словник користувача"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Словник доступний"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Зараз завантажується"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Установлено"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Установлено, вимкнено"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Нема з’єднання зі службою словника"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Словники недоступні"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Оновити"</string> + <string name="last_update" msgid="730467549913588780">"Останнє оновлення"</string> + <string name="message_updating" msgid="4457761393932375219">"Перевірка наявності оновлень"</string> + <string name="message_loading" msgid="8689096636874758814">"Завантаження…"</string> + <string name="main_dict_description" msgid="3072821352793492143">"Основний словник"</string> + <string name="cancel" msgid="6830980399865683324">"Скасувати"</string> + <string name="install_dict" msgid="180852772562189365">"Установити"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Скасувати"</string> + <string name="delete_dict" msgid="756853268088330054">"Видалити"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Для вибраної на вашому мобільному пристрої мови доступний словник.<br/> Радимо <b>завантажити</b> словник для цієї мови (<xliff:g id="LANGUAGE">%1$s</xliff:g>), щоб покращити введення тексту.<br/> <br/> У мережі 3G завантаження триває 1–2 хвилини. Якщо у вас не <b>безлімітний тарифний план Інтернету</b>, може стягуватися плата.<br/> Якщо ви не впевнені щодо тарифного плану, радимо скористатися з’єднанням Wi-Fi, щоб автоматично почати завантаження.<br/> <br/> Порада: завантажувати та вилучати словники можна в меню <b>Налаштування</b> в розділі <b>Мова та введення</b> вашого мобільного пристрою."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Завантажити зараз (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g> Mб)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Завантажити через Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Доступний словник для такої мови: <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Натисніть, щоб переглянути та завантажити"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Скоро почнеться завантаження пропозицій для такої мови: <xliff:g id="LANGUAGE">%1$s</xliff:g>."</string> </resources> diff --git a/java/res/values-vi/strings-appname.xml b/java/res/values-vi/strings-appname.xml deleted file mode 100644 index 6e32d0370..000000000 --- a/java/res/values-vi/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Bàn phím Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Trình kiểm tra chính tả Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Cài đặt bàn phím Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Cài đặt kiểm tra chính tả"</string> -</resources> diff --git a/java/res/values-vi/strings.xml b/java/res/values-vi/strings.xml index 12d05bbde..56701060d 100644 --- a/java/res/values-vi/strings.xml +++ b/java/res/values-vi/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Bàn phím Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Bàn phím Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Cài đặt bàn phím Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Trình kiểm tra chính tả Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Cài đặt trình kiểm tra chính tả Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Tùy chọn nhập"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Lệnh ghi nhật ký cho nghiên cứu"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Trình kiểm tra chính tả Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Nhập liệu bằng giọng nói đã bị tắt"</string> <string name="configure_input_method" msgid="373356270290742459">"Định cấu hình phương thức nhập"</string> <string name="language_selection_title" msgid="1651299598555326750">"Ngôn ngữ nhập"</string> + <string name="send_feedback" msgid="1780431884109392046">"Gửi phản hồi"</string> <string name="select_language" msgid="3693815588777926848">"Ngôn ngữ nhập"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Chạm lại để lưu"</string> <string name="has_dictionary" msgid="6071847973466625007">"Có sẵn từ điển"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Bật phản hồi của người dùng"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Giúp nâng cao trình chỉnh sửa phương thức nhập này bằng cách tự động gửi thống kê sử dụng và báo cáo sự cố cho Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Cài đặt thời gian chờ cho nhấn và giữ phím"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Cài đặt thời gian rung khi nhấn phím"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Cài đặt âm lượng khi nhấn phím"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Đọc tệp từ điển bên ngoài"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Không có tệp từ điển nào trong thư mục Nội dung tải xuống"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Chọn tệp từ điển để cài đặt"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Mặc định"</string> <string name="language_settings" msgid="1671153053201809031">"Ngôn ngữ và phương thức nhập"</string> <string name="select_input_method" msgid="4301602374609275003">"Chọn phương thức nhập"</string> - - <string name="app_name" msgid="1017058186322714405">"Nhà cung cấp từ điển"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Nhà cung cấp từ điển"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Dịch vụ từ điển"</string> - <string name="download_description" msgid="3274861514695032954">"Thông tin cập nhật từ điển"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Từ điển phụ trợ"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Có sẵn từ điển"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Cài đặt dành cho từ điển"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Từ điển người dùng"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Từ điển người dùng"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Có sẵn từ điển"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Hiện đang tải xuống"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Đã cài đặt"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Đã cài đặt, bị tắt"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Lỗi knối d.vụ t.điển"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Không có từ điển nào"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Làm mới"</string> - <string name="last_update" msgid="3101549719827600346">"Cập nhật lần cuối"</string> - <string name="message_updating" msgid="820186276704134720">"Đang kiểm tra cập nhật"</string> - <string name="message_loading" msgid="8611339149825047446">"Đang tải..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Từ điển chính"</string> - <string name="cancel" msgid="5586531736609183304">"Hủy"</string> - <string name="install_dict" msgid="5525005524697607865">"Cài đặt"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Hủy tải xuống"</string> - <string name="disable_dict" msgid="7685810040236497700">"Tắt"</string> - <string name="enable_dict" msgid="3848179784702473680">"Bật"</string> - <string name="delete_dict" msgid="5817159290503843766">"Xóa"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Có sẵn từ điển cho <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Nhấn để xem lại và tải xuống"</string> + <string name="app_name" msgid="6320102637491234792">"Nhà cung cấp từ điển"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Nhà cung cấp từ điển"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Dịch vụ từ điển"</string> + <string name="download_description" msgid="6014835283119198591">"Thông tin cập nhật từ điển"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Từ điển bổ sung"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Từ điển có sẵn"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Cài đặt cho từ điển"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Từ điển người dùng"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Từ điển người dùng"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Từ điển có sẵn"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Hiện đang tải xuống"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Đã cài đặt"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Đã cài đặt, bị tắt"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Lỗi kết nối DV từ điển"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Không có từ điển nào"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Làm mới"</string> + <string name="last_update" msgid="730467549913588780">"Cập nhật lần cuối"</string> + <string name="message_updating" msgid="4457761393932375219">"Đang kiểm tra cập nhật"</string> + <string name="message_loading" msgid="8689096636874758814">"Đang tải..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Từ điển chính"</string> + <string name="cancel" msgid="6830980399865683324">"Hủy"</string> + <string name="install_dict" msgid="180852772562189365">"Cài đặt"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Hủy"</string> + <string name="delete_dict" msgid="756853268088330054">"Xóa"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Ngôn ngữ đã chọn trên thiết bị di động của bạn hiện có từ điển.<br/> Bạn nên <b>tải xuống</b> từ điển <xliff:g id="LANGUAGE">%1$s</xliff:g> để cải thiện trải nghiệm nhập của mình.<br/> <br/> Quá trình tải xuống có thể mất vài phút qua 3G. Có thể mất phí nếu bạn không có <b>gói dữ liệu không giới hạn</b>.<br/> Nếu bạn không chắc mình có gói dữ liệu nào, bạn nên tìm kết nối Wi-Fi để bắt đầu tải xuống tự động.<br/> <br/> Mẹo: Bạn có thể tải xuống và xóa từ điển bằng cách đi tới <b>Ngôn ngữ và nhập</b> trong trình đơn <b>Cài đặt</b> trên thiết bị di động của mình."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Tải xuống bây giờ (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Tải xuống qua Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Có sẵn từ điển cho <xliff:g id="LANGUAGE">%1$s</xliff:g>"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Nhấn để xem lại và tải xuống"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Tải xuống: đề xuất đối với <xliff:g id="LANGUAGE">%1$s</xliff:g> sẽ sớm sẵn sàng."</string> </resources> diff --git a/java/res/values-zh-rCN/strings-appname.xml b/java/res/values-zh-rCN/strings-appname.xml deleted file mode 100644 index f5e12fd5e..000000000 --- a/java/res/values-zh-rCN/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android 键盘"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android 拼写检查工具"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android 键盘设置"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"拼写检查设置"</string> -</resources> diff --git a/java/res/values-zh-rCN/strings.xml b/java/res/values-zh-rCN/strings.xml index 0e2fd7c8e..3054d13e4 100644 --- a/java/res/values-zh-rCN/strings.xml +++ b/java/res/values-zh-rCN/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android 键盘 (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android 键盘 (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android 键盘设置 (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android 拼写检查工具 (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android 拼写检查工具设置 (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"输入选项"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"研究记录命令"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android 拼写检查工具 (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"语音输入功能已停用"</string> <string name="configure_input_method" msgid="373356270290742459">"配置输入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"输入语言"</string> + <string name="send_feedback" msgid="1780431884109392046">"发送反馈"</string> <string name="select_language" msgid="3693815588777926848">"输入语言"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"再次触摸即可保存"</string> <string name="has_dictionary" msgid="6071847973466625007">"有可用词典"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"启用用户反馈"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"自动向 Google 发送使用情况统计信息和崩溃报告,帮助改进该输入法编辑器。"</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"键盘主题"</string> <string name="subtype_en_GB" msgid="88170601942311355">"英语(英国)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"英语(美国)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"按键长按延迟设置"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"按键振动持续时间设置"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"按键音量设置"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"读取外部词典文件"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"“下载内容”文件夹中没有词典文件"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"选择要安装的词典文件"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"默认"</string> <string name="language_settings" msgid="1671153053201809031">"语言和输入法"</string> <string name="select_input_method" msgid="4301602374609275003">"选择输入法"</string> - - <string name="app_name" msgid="1017058186322714405">"词典大全"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"词典大全"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"字典服务"</string> - <string name="download_description" msgid="3274861514695032954">"词典更新信息"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"附加词典"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"词典可供下载"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"词典设置"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"用户词典"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"用户词典"</string> - <string name="dictionary_available" msgid="3192920608520618083">"词典可供下载"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"目前正在下载"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"已安装"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"已安装,已停用"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"连接到词典服务时发生问题"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"没有可用的词典"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"刷新"</string> - <string name="last_update" msgid="3101549719827600346">"最后更新时间"</string> - <string name="message_updating" msgid="820186276704134720">"正在检查更新"</string> - <string name="message_loading" msgid="8611339149825047446">"正在加载..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"主词典"</string> - <string name="cancel" msgid="5586531736609183304">"取消"</string> - <string name="install_dict" msgid="5525005524697607865">"安装"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"取消下载"</string> - <string name="disable_dict" msgid="7685810040236497700">"停用"</string> - <string name="enable_dict" msgid="3848179784702473680">"启用"</string> - <string name="delete_dict" msgid="5817159290503843766">"删除"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"<xliff:g id="LANGUAGE">%1$s</xliff:g>词典可供下载"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"按此通知即可查看和下载"</string> + <string name="app_name" msgid="6320102637491234792">"词典提供程序"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"词典提供程序"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"词典服务"</string> + <string name="download_description" msgid="6014835283119198591">"词典更新信息"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"附加词典"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"词典现已可下载"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"词典设置"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"用户词典"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"用户词典"</string> + <string name="dictionary_available" msgid="4728975345815214218">"词典现已可下载"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"目前正在下载"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"已安装"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"已安装,但目前已停用"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"连接到词典服务时发生问题"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"没有可供下载的词典"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"刷新"</string> + <string name="last_update" msgid="730467549913588780">"上次更新时间"</string> + <string name="message_updating" msgid="4457761393932375219">"正在检查更新"</string> + <string name="message_loading" msgid="8689096636874758814">"正在加载..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"主词典"</string> + <string name="cancel" msgid="6830980399865683324">"取消"</string> + <string name="install_dict" msgid="180852772562189365">"安装"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"取消"</string> + <string name="delete_dict" msgid="756853268088330054">"删除"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"支持您移动设备上所选语言的词典现已可供下载啦!<br/>建议您<b>下载</b>这部<xliff:g id="LANGUAGE">%1$s</xliff:g>词典,以享受更好的输入体验。<br/><br/>通过 3G 进行下载可能需要 1 到 2 分钟的时间。如果您使用的不是<b>无流量限制的套餐</b>,则可能需要支付一定的费用。<br/>如果您不确定自己使用的是哪种流量套餐,建议您使用 Wi-Fi 连接自动开始下载。<br/><br/>提示:您可以访问移动设备的<b>设置</b>菜单中的<b>语言和输入法</b>,来下载和删除词典。"</string> + <string name="download_over_metered" msgid="1643065851159409546">"立即下载 (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"通过 Wi-Fi 下载"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"<xliff:g id="LANGUAGE">%1$s</xliff:g>词典现已可下载"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"按此通知即可查看和下载"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"下载中:很快就能启用<xliff:g id="LANGUAGE">%1$s</xliff:g>的词典建议服务了!"</string> </resources> diff --git a/java/res/values-zh-rTW/strings-appname.xml b/java/res/values-zh-rTW/strings-appname.xml deleted file mode 100644 index 8cc663826..000000000 --- a/java/res/values-zh-rTW/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Android 鍵盤"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Android 拼字檢查"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Android 鍵盤設定"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"拼字檢查設定"</string> -</resources> diff --git a/java/res/values-zh-rTW/strings.xml b/java/res/values-zh-rTW/strings.xml index ae4a48f81..d9d4751b1 100644 --- a/java/res/values-zh-rTW/strings.xml +++ b/java/res/values-zh-rTW/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Android 鍵盤 (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Android 鍵盤 (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Android 鍵盤設定 (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Android 拼字檢查 (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Android 拼字檢查設定 (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"輸入選項"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"研究紀錄指令"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Android 拼字檢查 (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"語音輸入已停用"</string> <string name="configure_input_method" msgid="373356270290742459">"設定輸入法"</string> <string name="language_selection_title" msgid="1651299598555326750">"輸入語言"</string> + <string name="send_feedback" msgid="1780431884109392046">"提供意見"</string> <string name="select_language" msgid="3693815588777926848">"輸入語言"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"再次輕觸即可儲存"</string> <string name="has_dictionary" msgid="6071847973466625007">"可使用字典"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"啟用使用者意見回饋"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"自動將使用統計資料和當機報告傳送給 Google,協助改善這個輸入法編輯器。"</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <string name="keyboard_layout" msgid="8451164783510487501">"鍵盤主題"</string> <string name="subtype_en_GB" msgid="88170601942311355">"英文 (英式)"</string> <string name="subtype_en_US" msgid="6160452336634534239">"英文 (美式)"</string> @@ -159,9 +163,12 @@ <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="1881822418815012326">"按鍵長按延遲設定"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"按鍵震動持續時間設定"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"按鍵音量設定"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"讀取外部字典檔案"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"「下載」資料夾中沒有任何字典檔案"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"選取要安裝的字典檔案"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"預設"</string> <string name="language_settings" msgid="1671153053201809031">"語言與輸入設定"</string> <string name="select_input_method" msgid="4301602374609275003">"選擇輸入法"</string> - - <string name="app_name" msgid="1017058186322714405">"字典提供者"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"字典提供者"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"字典服務"</string> - <string name="download_description" msgid="3274861514695032954">"字典更新資訊"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"外掛字典"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"字典可供下載"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"字典設定"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"使用者字典"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"使用者字典"</string> - <string name="dictionary_available" msgid="3192920608520618083">"可用的字典"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"目前正在下載"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"已安裝"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"已安裝但目前停用"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"連線至字典服務時發生問題"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"沒有可用的字典"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"重新整理"</string> - <string name="last_update" msgid="3101549719827600346">"上次更新時間"</string> - <string name="message_updating" msgid="820186276704134720">"正在檢查更新"</string> - <string name="message_loading" msgid="8611339149825047446">"載入中..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"主要字典"</string> - <string name="cancel" msgid="5586531736609183304">"取消"</string> - <string name="install_dict" msgid="5525005524697607865">"安裝"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"取消下載"</string> - <string name="disable_dict" msgid="7685810040236497700">"停用"</string> - <string name="enable_dict" msgid="3848179784702473680">"啟用"</string> - <string name="delete_dict" msgid="5817159290503843766">"刪除"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"支援「<xliff:g id="LANGUAGE">%1$s</xliff:g>」字典"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"按下即可查看並下載"</string> + <string name="app_name" msgid="6320102637491234792">"字典提供者"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"字典提供者"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"字典服務"</string> + <string name="download_description" msgid="6014835283119198591">"字典更新資訊"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"外掛字典"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"可用的字典"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"字典設定"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"使用者字典"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"使用者字典"</string> + <string name="dictionary_available" msgid="4728975345815214218">"可用的字典"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"正在下載"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"已安裝"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"已安裝但目前停用"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"連線至字典服務時發生問題"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"沒有可用的字典"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"重新整理"</string> + <string name="last_update" msgid="730467549913588780">"上次更新時間:"</string> + <string name="message_updating" msgid="4457761393932375219">"正在檢查更新"</string> + <string name="message_loading" msgid="8689096636874758814">"載入中..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"主要字典"</string> + <string name="cancel" msgid="6830980399865683324">"取消"</string> + <string name="install_dict" msgid="180852772562189365">"安裝"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"取消"</string> + <string name="delete_dict" msgid="756853268088330054">"刪除"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"您的行動裝置設定的語言,現有字典可供使用。<br/> 建議您<b>下載</b><xliff:g id="LANGUAGE">%1$s</xliff:g>字典,加強輸入功能。<br/> <br/> 透過 3G 網路下載約需一兩分鐘。若無<b>無限行動上網資費方案</b>,可能必須另外付費。<br/>若不確定行動上網資費方案為何,可以等連上 Wi-Fi 網路後再自動下載。<br/> <br/>提示:進入行動裝置的 [設定] 選單,選擇 [語言和輸入] 即可下載及移除字典。<b></b><b></b>"</string> + <string name="download_over_metered" msgid="1643065851159409546">"立即下載 (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"透過 Wi-Fi 下載"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"支援<xliff:g id="LANGUAGE">%1$s</xliff:g>字典"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"按下即可查看並下載"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"下載中:即將啟用<xliff:g id="LANGUAGE">%1$s</xliff:g>字詞建議服務。"</string> </resources> diff --git a/java/res/values-zu/strings-appname.xml b/java/res/values-zu/strings-appname.xml deleted file mode 100644 index a0fb51716..000000000 --- a/java/res/values-zu/strings-appname.xml +++ /dev/null @@ -1,27 +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:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="english_ime_name" msgid="178705338187710493">"Ikhibhodi ye-Android"</string> - <string name="spell_checker_service_name" msgid="6268342166872202903">"Isihloli sokupela se-Android"</string> - <string name="english_ime_settings" msgid="7470027018752707691">"Izilungiselelo zekhibhodi ye-Android"</string> - <string name="android_spell_checker_settings" msgid="8397842018475560441">"Izilungiselelo zokuhlola ukupela"</string> -</resources> diff --git a/java/res/values-zu/strings.xml b/java/res/values-zu/strings.xml index 9e11821a6..93c8d92a7 100644 --- a/java/res/values-zu/strings.xml +++ b/java/res/values-zu/strings.xml @@ -20,10 +20,12 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="aosp_android_keyboard_ime_name" msgid="7877134937939182296">"Ikhibhodi ye-Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_name" msgid="8250992613616792321">"Ikhibhodi ye-Android (AOSP)"</string> + <string name="aosp_android_keyboard_ime_settings" msgid="423615877174850267">"Izilungiselelo zekhibhodi ye-Android (AOSP)"</string> + <string name="aosp_spell_checker_service_name" msgid="511950477199948048">"Isihloli sokupela se-Android (AOSP)"</string> + <string name="aosp_android_spell_checker_service_settings" msgid="2970535894327288421">"Izilungiselelo zesihloli sokupela se-Android (AOSP)"</string> <string name="english_ime_input_options" msgid="3909945612939668554">"Okukhethwa kukho kokungenayo"</string> <string name="english_ime_research_log" msgid="8492602295696577851">"Imiyalo yefayela lokungena lokucwaninga"</string> - <string name="aosp_spell_checker_service_name" msgid="6985142605330377819">"Isihloli sokupela se-Android (AOSP)"</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> @@ -128,11 +130,13 @@ <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Okufakwayo ngezwi kuvinjelwe"</string> <string name="configure_input_method" msgid="373356270290742459">"Misa izindlela zokufakwayo"</string> <string name="language_selection_title" msgid="1651299598555326750">"Izilimi zokufakwayo"</string> + <string name="send_feedback" msgid="1780431884109392046">"Thumela impendulo"</string> <string name="select_language" msgid="3693815588777926848">"Izilimi zokufakwayo"</string> <string name="hint_add_to_dictionary" msgid="573678656946085380">"Thinta futhi ukuze ulondoloze"</string> <string name="has_dictionary" msgid="6071847973466625007">"Isichazamazwi siyatholakala"</string> <string name="prefs_enable_log" msgid="6620424505072963557">"Vumela impendulo yomsebenzisi"</string> - <string name="prefs_description_log" msgid="5827825607258246003">"Siza ukuthuthukisa lo mhleli wendlela yokufakwa ngokusithumela ngokuzenzakalela izibalo zokusetshenziswa nokukhubeka ku-Google."</string> + <!-- no translation found for prefs_description_log (7525225584555429211) --> + <skip /> <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> @@ -159,9 +163,12 @@ <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="1881822418815012326">"Izilungiselelo zokulibazisa ukucindezelwa ukhiye isikhathi eside"</string> - <string name="prefs_keypress_vibration_duration_settings" msgid="1829950405285211668">"Izilungiselelo ze-keypress vibration duraton"</string> - <string name="prefs_keypress_sound_volume_settings" msgid="5875933757082305040">"Izilungiselelo zevolumu yomsindo wekeypress"</string> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Funda ifayela elangaphandle lesichazamazwi"</string> <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Awekho amafayela wesichazamazwi kufolda yokulandiwe"</string> <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Khetha ifayela lesichazamazwi ukuze ulifake"</string> @@ -170,39 +177,34 @@ <string name="button_default" msgid="3988017840431881491">"Okuzenzakalelayo"</string> <string name="language_settings" msgid="1671153053201809031">"Ulimi nokokufakwayo"</string> <string name="select_input_method" msgid="4301602374609275003">"Khetha indlela yokufaka"</string> - - <string name="app_name" msgid="1017058186322714405">"Umhlinzeki Wesichazamazwi"</string> - <string name="dictionary_provider_name" msgid="7710415599371161092">"Umhlinzeki Wesichazamazwi"</string> - <string name="dictionary_service_name" msgid="551650697348202056">"Insiza yesichazamazwi"</string> - <string name="download_description" msgid="3274861514695032954">"Ulwazi lokubuyekeza isichazamazwi"</string> - <string name="dictionary_settings_title" msgid="7243930967845020407">"Faka izichazamazwi"</string> - <string name="dictionary_install_over_metered_network_prompt" msgid="3642634623465349716">"Isichazamazwi siyatholakala"</string> - <string name="dictionary_settings_summary" msgid="8599679434799749053">"Izilungiselelo zezichazamazwi"</string> - <string name="user_dictionaries" msgid="7519736232423929124">"Sebenzisa isichazamazwi"</string> - <string name="default_user_dict_pref_name" msgid="522125152757607790">"Isichazamazwi Somsebenzisi"</string> - <string name="dictionary_available" msgid="3192920608520618083">"Isichazamazwi siyatholakala"</string> - <string name="dictionary_downloading" msgid="859497476266309596">"Okwamanje iyalayisha"</string> - <string name="dictionary_installed" msgid="6425586899671378160">"Kufakiwe"</string> - <string name="dictionary_disabled" msgid="3448571280490746032">"Kufakiwe, kumisiwe"</string> - <string name="cannot_connect_to_dict_service" msgid="6875665494726300427">"Inkinga yokuxhumaniseka esevisini yesichazamazwi"</string> - <string name="no_dictionaries_available" msgid="5206225077945637810">"Azikho izachazimazwi ezikhona"</string> - <string name="check_for_updates_now" msgid="642057986127624986">"Vuselela"</string> - <string name="last_update" msgid="3101549719827600346">"Igcine ukulungiswa:"</string> - <string name="message_updating" msgid="820186276704134720">"Ihlola izibuyekezo..."</string> - <string name="message_loading" msgid="8611339149825047446">"Kuyalayisha..."</string> - <string name="main_dict_description" msgid="1679964306980098570">"Isichazimazwi sakho ngqangi"</string> - <string name="cancel" msgid="5586531736609183304">"Khansela"</string> - <string name="install_dict" msgid="5525005524697607865">"Faka"</string> - <string name="cancel_download_dict" msgid="7163173650298838367">"Khansela ukulayisha"</string> - <string name="disable_dict" msgid="7685810040236497700">"Yenza kungasebenzi"</string> - <string name="enable_dict" msgid="3848179784702473680">"Vumela"</string> - <string name="delete_dict" msgid="5817159290503843766">"Susa"</string> - <!-- no translation found for should_download_over_metered_prompt (4965264849057656521) --> - <skip /> - <!-- no translation found for download_over_metered (4024013764937850061) --> - <skip /> - <!-- no translation found for do_not_download_over_metered (6963770885033765378) --> - <skip /> - <string name="dict_available_notification_title" msgid="4560576379680660047">"Isichazamazwi se-<xliff:g id="LANGUAGE">%1$s</xliff:g> siyatholakala"</string> - <string name="dict_available_notification_description" msgid="355515381285317832">"Cindezela ukuze ubuyekeze bese ulanda"</string> + <string name="app_name" msgid="6320102637491234792">"Umhlinzeki wesichazamazwi"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Umhlinzeki wesichazamazwi"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Isevisi yesichazamazwi"</string> + <string name="download_description" msgid="6014835283119198591">"Ulwazi lokubuyekeza isichazamazwi"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Izichazamazwi ezingezwayo"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Isichazamazwi siyatholakala"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Izilungiselelo zezichazamazwi"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Izichazamazwi zomsebenzisi"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Isichazamazwi somsebenzisi"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Isichazamazwi siyatholakala"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Okwamanje iyalanda"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Kufakiwe"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Kufakiwe, kukhutshaziwe"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Inkinga yokuxhumanisa kusevisi yesichazamazwi"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Azikho izachazimazwi ezitholakalayo"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Qala kabusha"</string> + <string name="last_update" msgid="730467549913588780">"Igcine ukulungiswa"</string> + <string name="message_updating" msgid="4457761393932375219">"Ihlola izibuyekezo"</string> + <string name="message_loading" msgid="8689096636874758814">"Iyalayisha..."</string> + <string name="main_dict_description" msgid="3072821352793492143">"Isichazamazwi sakho esisemqoka"</string> + <string name="cancel" msgid="6830980399865683324">"Khansela"</string> + <string name="install_dict" msgid="180852772562189365">"Faka"</string> + <string name="cancel_download_dict" msgid="7843340278507019303">"Khansela"</string> + <string name="delete_dict" msgid="756853268088330054">"Susa"</string> + <string name="should_download_over_metered_prompt" msgid="2878629598667658845">"Ulimi olukhethiwe kudivayisi yakho yeselula linesichazamazwi esitholakalayo.<br/> Sincoma <b>ukulanda</b> isichazamazwi sesi-<xliff:g id="LANGUAGE">%1$s</xliff:g> ukwenza kangcono isipiliyoni sakho sokuthayipha.<br/> <br/> Ukulanda ukungathatha iminithi noma amaminithi amabili nge-3G. Amashaja angasebenza uma ungenalo <b>icebo ledatha elinganqunyelwe</b>.<br/> Uma ungenasiqinisekiso sokuthi iliphi icebo ledatha onalo, sincoma ukuthola uxhumo lwe-Wi-Fi ukuze uqale ukulanda ngokuzenzakalelayo.<br/> <br/> Ithiphu: Ungalanda futhi ususe izichazamazwi ngokuya ku-<b>Ulimi nokungenayo</b> kumenyu ye-<b>Izilungiselelo</b> yedivayisi yakho yeselula."</string> + <string name="download_over_metered" msgid="1643065851159409546">"Landa manje (<xliff:g id="SIZE_IN_MEGABYTES">%1$.1f</xliff:g>MB)"</string> + <string name="do_not_download_over_metered" msgid="2176209579313941583">"Landa nge-Wi-Fi"</string> + <string name="dict_available_notification_title" msgid="6514288591959117288">"Isichazamazwi se-<xliff:g id="LANGUAGE">%1$s</xliff:g> siyatholakala"</string> + <string name="dict_available_notification_description" msgid="1075194169443163487">"Cindezela ukuze ubuyekeze uphinde ulande"</string> + <string name="toast_downloading_suggestions" msgid="1313027353588566660">"Ukulanda: iziphakamiso ze-<xliff:g id="LANGUAGE">%1$s</xliff:g> zizolunga maduze."</string> </resources> diff --git a/java/res/values/strings-appname.xml b/java/res/values/strings-appname.xml deleted file mode 100644 index 19aaa2513..000000000 --- a/java/res/values/strings-appname.xml +++ /dev/null @@ -1,33 +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> - <!-- Title for Latin Keyboard --> - <string name="english_ime_name">Android keyboard</string> - - <!-- Name of Android spell checker service --> - <string name="spell_checker_service_name">Android spell checker</string> - - <!-- Title for Latin keyboard settings activity / dialog --> - <string name="english_ime_settings">Android keyboard settings</string> - - <!-- Title for the spell checking service settings screen --> - <string name="android_spell_checker_settings">Spell checking settings</string> -</resources> diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index 273525100..201fc7030 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -19,15 +19,23 @@ --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- Application name for opensource Android keyboard. AOSP(Android Open Source Project) should not be translated. --> - <string name="aosp_android_keyboard_ime_name">Android keyboard (AOSP)</string> + <string name="aosp_android_keyboard_ime_name">Android Keyboard (AOSP)</string> + + <!-- Title for Android Keyboard settings screen. AOSP(Android Open Source Project) should not be translated. --> + <string name="aosp_android_keyboard_ime_settings">Android Keyboard Settings (AOSP)</string> + + <!-- Name of Android spell checker service. AOSP(Android Open Source Project) should not be translated. --> + <string name="aosp_spell_checker_service_name">Android Spell Checker (AOSP)</string> + + <!-- Title for the spell checking service settings screen. AOSP(Android Open Source Project) should not be translated. --> + <string name="aosp_android_spell_checker_service_settings">Android Spell Checker Settings (AOSP)</string> + <!-- Title for Latin keyboard input options dialog [CHAR LIMIT=25] --> <string name="english_ime_input_options">Input options</string> + <!-- Title for Latin keyboard research log dialog, which contains special commands for users that contribute data for research. [CHAR LIMIT=33] --> <string name="english_ime_research_log">Research Log Commands</string> - <!-- Name of Android spell checker service. AOSP(Android Open Source Project) should not be translated. --> - <string name="aosp_spell_checker_service_name">Android spell checker (AOSP)</string> - <!-- Title for the spell 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> @@ -342,10 +350,10 @@ <!-- 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 to Google --> + <!-- 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 to Google --> - <string name="prefs_description_log">Help improve this input method editor by automatically sending usage statistics and crash reports to Google.</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> @@ -414,12 +422,12 @@ <!-- 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 --> - <string name="prefs_key_longpress_timeout_settings">Key long press delay settings</string> - <!-- Title of the settings for keypress vibration duration --> - <string name="prefs_keypress_vibration_duration_settings">Keypress vibration duration settings</string> - <!-- Title of the settings for keypress sound volume --> - <string name="prefs_keypress_sound_volume_settings">Keypress sound volume settings</string> + <!-- Title of the settings for key long press delay [CHAR LIMIT=30] --> + <string name="prefs_key_longpress_timeout_settings">Key long press delay</string> + <!-- Title of the settings for keypress vibration duration [CHAR LIMIT=30] --> + <string name="prefs_keypress_vibration_duration_settings">Keypress vibration duration</string> + <!-- Title of the settings for keypress sound volume [CHAR LIMIT=30] --> + <string name="prefs_keypress_sound_volume_settings">Keypress sound volume</string> <!-- Title of the settings for reading an external dictionary file --> <string name="prefs_read_external_dictionary">Read external dictionary file</string> <!-- Message to show when there are no files to install as an external dictionary [CHAR LIMIT=100] --> diff --git a/java/res/xml/prefs.xml b/java/res/xml/prefs.xml index e299ce4f8..783946252 100644 --- a/java/res/xml/prefs.xml +++ b/java/res/xml/prefs.xml @@ -17,7 +17,6 @@ <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:latin="http://schemas.android.com/apk/res/com.android.inputmethod.latin" - android:title="@string/english_ime_settings" android:key="english_ime_settings"> <PreferenceCategory android:title="@string/general_category" diff --git a/java/res/xml/spell_checker_settings.xml b/java/res/xml/spell_checker_settings.xml index 222b98b6b..de67e7f81 100644 --- a/java/res/xml/spell_checker_settings.xml +++ b/java/res/xml/spell_checker_settings.xml @@ -15,8 +15,7 @@ --> <PreferenceScreen - xmlns:android="http://schemas.android.com/apk/res/android" - android:title="@string/android_spell_checker_settings"> + xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="pref_spellcheck_use_contacts" android:title="@string/use_contacts_for_spellchecking_option_title" diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java index c0028e4cf..73896dfd3 100644 --- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java +++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java @@ -64,6 +64,9 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp */ private int mEdgeSlop; + /** The most recently set keyboard mode. */ + private int mLastKeyboardMode; + public static void init(final InputMethodService inputMethod) { sInstance.initInternal(inputMethod); } @@ -113,16 +116,19 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp if (mView == null) { return; } - if (mAccessibilityNodeProvider != null) { mAccessibilityNodeProvider.setKeyboard(); } + final int keyboardMode = mView.getKeyboard().mId.mMode; // Since this method is called even when accessibility is off, make sure - // to check the state before announcing anything. - if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) { - announceKeyboardMode(); + // to check the state before announcing anything. Also, don't announce + // changes within the same mode. + if (AccessibilityUtils.getInstance().isAccessibilityEnabled() + && (mLastKeyboardMode != keyboardMode)) { + announceKeyboardMode(keyboardMode); } + mLastKeyboardMode = keyboardMode; } /** @@ -132,25 +138,24 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp if (mView == null) { return; } - announceKeyboardHidden(); + mLastKeyboardMode = -1; } /** * Announces which type of keyboard is being displayed. If the keyboard type * is unknown, no announcement is made. + * + * @param mode The new keyboard mode. */ - private void announceKeyboardMode() { - final Keyboard keyboard = mView.getKeyboard(); - final int resId = KEYBOARD_MODE_RES_IDS.get(keyboard.mId.mMode); + private void announceKeyboardMode(int mode) { + final int resId = KEYBOARD_MODE_RES_IDS.get(mode); if (resId == 0) { return; } - final Context context = mView.getContext(); final String keyboardMode = context.getString(resId); final String text = context.getString(R.string.announce_keyboard_mode, keyboardMode); - sendWindowStateChanged(text); } @@ -167,7 +172,7 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp /** * Sends a window state change event with the specified text. * - * @param text + * @param text The text to send with the event. */ private void sendWindowStateChanged(final String text) { final AccessibilityEvent stateChange = AccessibilityEvent.obtain( @@ -195,7 +200,6 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp if (mView == null) { return null; } - return getAccessibilityNodeProvider(); } @@ -248,11 +252,9 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp case MotionEvent.ACTION_HOVER_MOVE: if (key != previousKey) { return onTransitionKey(key, previousKey, event); - } else { - return onHoverKey(key, event); } + return onHoverKey(key, event); } - return false; } @@ -294,18 +296,13 @@ public final class AccessibleKeyboardViewProxy extends AccessibilityDelegateComp private boolean onTransitionKey(final Key currentKey, final Key previousKey, final MotionEvent event) { final int savedAction = event.getAction(); - event.setAction(MotionEvent.ACTION_HOVER_EXIT); onHoverKey(previousKey, event); - event.setAction(MotionEvent.ACTION_HOVER_ENTER); onHoverKey(currentKey, event); - event.setAction(MotionEvent.ACTION_HOVER_MOVE); final boolean handled = onHoverKey(currentKey, event); - event.setAction(savedAction); - return handled; } diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java index 0c8b466a4..69615887f 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java @@ -25,16 +25,34 @@ package com.android.inputmethod.dictionarypack; */ public class DictionaryPackConstants { /** + * The root domain for the dictionary pack, upon which authorities and actions will append + * their own distinctive strings. + */ + private static final String DICTIONARY_DOMAIN = "com.android.inputmethod.dictionarypack"; + + /** * Authority for the ContentProvider protocol. */ // TODO: find some way to factorize this string with the one in the resources - public static final String AUTHORITY = "com.android.inputmethod.dictionarypack.aosp"; + public static final String AUTHORITY = DICTIONARY_DOMAIN + ".aosp"; /** * The action of the intent for publishing that new dictionary data is available. */ // TODO: make this different across different packages. A suggested course of action is // to use the package name inside this string. - public static final String NEW_DICTIONARY_INTENT_ACTION = - "com.android.inputmethod.dictionarypack.newdict"; + // NOTE: The appended string should be uppercase like all other actions, but it's not for + // historical reasons. + public static final String NEW_DICTIONARY_INTENT_ACTION = DICTIONARY_DOMAIN + ".newdict"; + + /** + * The action of the intent sent by the dictionary pack to ask for a client to make + * itself known. This is used when the settings activity is brought up for a client the + * dictionary pack does not know about. + */ + public static final String UNKNOWN_DICTIONARY_PROVIDER_CLIENT = DICTIONARY_DOMAIN + + ".UNKNOWN_CLIENT"; + // In the above intents, the name of the string extra that contains the name of the client + // we want information about. + public static final String DICTIONARY_PROVIDER_CLIENT_EXTRA = "client"; } diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java index 77b3b8e2e..f8d1c4fc9 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java @@ -509,6 +509,11 @@ public final class DictionaryProvider extends ContentProvider { } catch (final BadFormatException e) { Log.w(TAG, "Not enough information to insert this dictionary " + values, e); } + // We just received new information about the list of dictionary for this client. + // For all intents and purposes, this is new metadata, so we should publish it + // so that any listeners (like the Settings interface for example) can update + // themselves. + UpdateHandler.publishUpdateMetadataCompleted(getContext(), true); break; case DICTIONARY_V1_WHOLE_LIST: case DICTIONARY_V1_DICT_INFO: diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java index 7e2a6bb1e..9e27c1f3f 100644 --- a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java +++ b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java @@ -110,6 +110,15 @@ public final class DictionarySettingsFragment extends PreferenceFragment super.onResume(); mChangedSettings = false; UpdateHandler.registerUpdateEventListener(this); + final Activity activity = getActivity(); + if (!MetadataDbHelper.isClientKnown(activity, mClientId)) { + Log.i(TAG, "Unknown dictionary pack client: " + mClientId + ". Requesting info."); + final Intent unknownClientBroadcast = + new Intent(DictionaryPackConstants.UNKNOWN_DICTIONARY_PROVIDER_CLIENT); + unknownClientBroadcast.putExtra( + DictionaryPackConstants.DICTIONARY_PROVIDER_CLIENT_EXTRA, mClientId); + activity.sendBroadcast(unknownClientBroadcast); + } final IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); getActivity().registerReceiver(mConnectivityChangedReceiver, filter); @@ -130,6 +139,7 @@ public final class DictionarySettingsFragment extends PreferenceFragment } } + @Override public void downloadedMetadata(final boolean succeeded) { stopLoadingAnimation(); if (!succeeded) return; // If the download failed nothing changed, so no need to refresh @@ -141,6 +151,7 @@ public final class DictionarySettingsFragment extends PreferenceFragment }.start(); } + @Override public void wordListDownloadFinished(final String wordListId, final boolean succeeded) { final WordListPreference pref = findWordListPreference(wordListId); if (null == pref) return; @@ -177,6 +188,7 @@ public final class DictionarySettingsFragment extends PreferenceFragment return null; } + @Override public void updateCycleCompleted() {} private void refreshNetworkState() { @@ -260,6 +272,7 @@ public final class DictionarySettingsFragment extends PreferenceFragment } else if (!cursor.moveToFirst()) { final ArrayList<Preference> result = new ArrayList<Preference>(); result.add(createErrorMessage(activity, R.string.no_dictionaries_available)); + cursor.close(); return result; } else { final String systemLocaleString = Locale.getDefault().toString(); @@ -289,6 +302,7 @@ public final class DictionarySettingsFragment extends PreferenceFragment prefList.put(key, pref); } } while (cursor.moveToNext()); + cursor.close(); return prefList.values(); } } @@ -335,8 +349,7 @@ public final class DictionarySettingsFragment extends PreferenceFragment private void cancelRefresh() { UpdateHandler.unregisterUpdateEventListener(this); final Context context = getActivity(); - UpdateHandler.cancelUpdate(context, - MetadataDbHelper.getMetadataUriAsString(context, mClientId)); + UpdateHandler.cancelUpdate(context, mClientId); stopLoadingAnimation(); } @@ -359,7 +372,12 @@ public final class DictionarySettingsFragment extends PreferenceFragment getActivity(), android.R.anim.fade_out)); preferenceView.startAnimation(AnimationUtils.loadAnimation( getActivity(), android.R.anim.fade_in)); - mUpdateNowMenu.setTitle(R.string.check_for_updates_now); + // The menu is created by the framework asynchronously after the activity, + // which means it's possible to have the activity running but the menu not + // created yet - hence the necessity for a null check here. + if (null != mUpdateNowMenu) { + mUpdateNowMenu.setTitle(R.string.check_for_updates_now); + } } }); } diff --git a/java/src/com/android/inputmethod/dictionarypack/EventHandler.java b/java/src/com/android/inputmethod/dictionarypack/EventHandler.java index 96c4a8305..d8aa33bb8 100644 --- a/java/src/com/android/inputmethod/dictionarypack/EventHandler.java +++ b/java/src/com/android/inputmethod/dictionarypack/EventHandler.java @@ -16,13 +16,9 @@ package com.android.inputmethod.dictionarypack; -import com.android.inputmethod.latin.LatinIME; -import com.android.inputmethod.latin.R; - import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.util.Log; public final class EventHandler extends BroadcastReceiver { private static final String TAG = EventHandler.class.getName(); diff --git a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java index b4727509c..e05a79b7b 100644 --- a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java +++ b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java @@ -444,7 +444,19 @@ public final class UpdateHandler { manager.remove(fileId); } - private static void publishUpdateMetadataCompleted(final Context context, + /** + * Sends a broadcast informing listeners that the dictionaries were updated. + * + * This will call all local listeners through the UpdateEventListener#downloadedMetadata + * callback (for example, the dictionary provider interface uses this to stop the Loading + * animation) and send a broadcast about the metadata having been updated. For a client of + * the dictionary pack like Latin IME, this means it should re-query the dictionary pack + * for any relevant new data. + * + * @param context the context, to send the broadcast. + * @param downloadSuccessful whether the download of the metadata was successful or not. + */ + public static void publishUpdateMetadataCompleted(final Context context, final boolean downloadSuccessful) { // We need to warn all listeners of what happened. But some listeners may want to // remove themselves or re-register something in response. Hence we should take a diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java index fd9edec70..5e68c7067 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java @@ -301,8 +301,10 @@ public final class KeyboardLayoutSet { final int xmlId = mResources.getIdentifier(keyboardLayoutSetName, "xml", packageName); try { parseKeyboardLayoutSet(mResources, xmlId); - } catch (Exception e) { - throw new RuntimeException(e.getMessage() + " in " + keyboardLayoutSetName); + } catch (final IOException e) { + throw new RuntimeException(e.getMessage() + " in " + keyboardLayoutSetName, e); + } catch (final XmlPullParserException e) { + throw new RuntimeException(e.getMessage() + " in " + keyboardLayoutSetName, e); } return new KeyboardLayoutSet(mContext, mParams); } @@ -311,14 +313,14 @@ public final class KeyboardLayoutSet { throws XmlPullParserException, IOException { final XmlResourceParser parser = res.getXml(resId); try { - int event; - while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + final int event = parser.next(); if (event == XmlPullParser.START_TAG) { final String tag = parser.getName(); if (TAG_KEYBOARD_SET.equals(tag)) { parseKeyboardLayoutSetContent(parser); } else { - throw new XmlParseUtils.IllegalStartTag(parser, TAG_KEYBOARD_SET); + throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_KEYBOARD_SET); } } } @@ -329,21 +331,21 @@ public final class KeyboardLayoutSet { private void parseKeyboardLayoutSetContent(final XmlPullParser parser) throws XmlPullParserException, IOException { - int event; - while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + final int event = parser.next(); if (event == XmlPullParser.START_TAG) { final String tag = parser.getName(); if (TAG_ELEMENT.equals(tag)) { parseKeyboardLayoutSetElement(parser); } else { - throw new XmlParseUtils.IllegalStartTag(parser, TAG_KEYBOARD_SET); + throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_KEYBOARD_SET); } } else if (event == XmlPullParser.END_TAG) { final String tag = parser.getName(); if (TAG_KEYBOARD_SET.equals(tag)) { break; } else { - throw new XmlParseUtils.IllegalEndTag(parser, TAG_KEYBOARD_SET); + throw new XmlParseUtils.IllegalEndTag(parser, tag, TAG_KEYBOARD_SET); } } } diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index f0ca9c1ec..745e7dfed 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -229,6 +229,9 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack @Override public void handleMessage(final Message msg) { final MainKeyboardView keyboardView = getOuterInstance(); + if (keyboardView == null) { + return; + } final PointerTracker tracker = (PointerTracker) msg.obj; switch (msg.what) { case MSG_TYPING_STATE_EXPIRED: diff --git a/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java b/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java index b047fe038..e3e6d39e4 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java @@ -44,6 +44,7 @@ final class GesturePreviewTrail { // The wall time of the zero value in {@link #mEventTimes} private long mCurrentTimeBase; private int mTrailStartIndex; + private int mLastInterpolatedDrawIndex; static final class Params { public final int mTrailColor; @@ -96,6 +97,17 @@ final class GesturePreviewTrail { } final int[] eventTimes = mEventTimes.getPrimitiveArray(); final int strokeId = stroke.getGestureStrokeId(); + // Because interpolation algorithm in {@link GestureStrokeWithPreviewPoints} can't determine + // the interpolated points in the last segment of gesture stroke, it may need recalculation + // of interpolation when new segments are added to the stroke. + // {@link #mLastInterpolatedDrawIndex} holds the start index of the last segment. It may + // be updated by the interpolation + // {@link GestureStrokeWithPreviewPoints#interpolatePreviewStroke} + // or by animation {@link #drawGestureTrail(Canvas,Paint,Rect,Params)} below. + final int lastInterpolatedIndex = (strokeId == mCurrentStrokeId) + ? mLastInterpolatedDrawIndex : trailSize; + mLastInterpolatedDrawIndex = stroke.interpolateStrokeAndReturnStartIndexOfLastSegment( + lastInterpolatedIndex, mEventTimes, mXCoordinates, mYCoordinates); if (strokeId != mCurrentStrokeId) { final int elapsedTime = (int)(downTime - mCurrentTimeBase); for (int i = mTrailStartIndex; i < trailSize; i++) { @@ -216,6 +228,10 @@ final class GesturePreviewTrail { System.arraycopy(eventTimes, startIndex, eventTimes, 0, newSize); System.arraycopy(xCoords, startIndex, xCoords, 0, newSize); System.arraycopy(yCoords, startIndex, yCoords, 0, newSize); + // The start index of the last segment of the stroke + // {@link mLastInterpolatedDrawIndex} should also be updated because all array + // elements have just been shifted for compaction. + mLastInterpolatedDrawIndex = Math.max(mLastInterpolatedDrawIndex - startIndex, 0); } mEventTimes.setLength(newSize); mXCoordinates.setLength(newSize); diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java index fc81410ff..3315954c1 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStrokeWithPreviewPoints.java @@ -21,19 +21,32 @@ import com.android.inputmethod.latin.ResizableIntArray; public final class GestureStrokeWithPreviewPoints extends GestureStroke { public static final int PREVIEW_CAPACITY = 256; + private static final boolean ENABLE_INTERPOLATION = true; + private final ResizableIntArray mPreviewEventTimes = new ResizableIntArray(PREVIEW_CAPACITY); private final ResizableIntArray mPreviewXCoordinates = new ResizableIntArray(PREVIEW_CAPACITY); private final ResizableIntArray mPreviewYCoordinates = new ResizableIntArray(PREVIEW_CAPACITY); private int mStrokeId; private int mLastPreviewSize; + private final HermiteInterpolator mInterpolator = new HermiteInterpolator(); + private int mLastInterpolatedPreviewIndex; - private int mMinPreviewSampleLengthSquare; + private int mMinPreviewSamplingDistanceSquared; private int mLastX; private int mLastY; + private double mMinPreviewSamplingDistance; + private double mDistanceFromLastSample; - // TODO: Move this to resource. - private static final float MIN_PREVIEW_SAMPLE_LENGTH_RATIO_TO_KEY_WIDTH = 0.1f; + // TODO: Move these constants to resource. + // The minimum linear distance between sample points for preview in keyWidth unit. + private static final float MIN_PREVIEW_SAMPLING_RATIO_TO_KEY_WIDTH = 0.1f; + // The minimum trail distance between sample points for preview in keyWidth unit when using + // interpolation. + private static final float MIN_PREVIEW_SAMPLING_RATIO_TO_KEY_WIDTH_WITH_INTERPOLATION = 0.2f; + // The angular threshold to use interpolation in radian. PI/12 is 15 degree. + private static final double INTERPOLATION_ANGULAR_THRESHOLD = Math.PI / 12.0d; + private static final int MAX_INTERPOLATION_PARTITION = 4; public GestureStrokeWithPreviewPoints(final int pointerId, final GestureStrokeParams params) { super(pointerId, params); @@ -44,6 +57,7 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { super.reset(); mStrokeId++; mLastPreviewSize = 0; + mLastInterpolatedPreviewIndex = 0; mPreviewEventTimes.setLength(0); mPreviewXCoordinates.setLength(0); mPreviewYCoordinates.setLength(0); @@ -53,35 +67,49 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { return mStrokeId; } - public int getGestureStrokePreviewSize() { - return mPreviewEventTimes.getLength(); - } - @Override public void setKeyboardGeometry(final int keyWidth, final int keyboardHeight) { super.setKeyboardGeometry(keyWidth, keyboardHeight); - final float sampleLength = keyWidth * MIN_PREVIEW_SAMPLE_LENGTH_RATIO_TO_KEY_WIDTH; - mMinPreviewSampleLengthSquare = (int)(sampleLength * sampleLength); + final float samplingRatioToKeyWidth = ENABLE_INTERPOLATION + ? MIN_PREVIEW_SAMPLING_RATIO_TO_KEY_WIDTH_WITH_INTERPOLATION + : MIN_PREVIEW_SAMPLING_RATIO_TO_KEY_WIDTH; + mMinPreviewSamplingDistance = keyWidth * samplingRatioToKeyWidth; + mMinPreviewSamplingDistanceSquared = (int)( + mMinPreviewSamplingDistance * mMinPreviewSamplingDistance); } - private boolean needsSampling(final int x, final int y) { + private boolean needsSampling(final int x, final int y, final boolean isMajorEvent) { + if (ENABLE_INTERPOLATION) { + mDistanceFromLastSample += Math.hypot(x - mLastX, y - mLastY); + mLastX = x; + mLastY = y; + if (mDistanceFromLastSample >= mMinPreviewSamplingDistance) { + mDistanceFromLastSample = 0.0d; + return true; + } + return false; + } + final int dx = x - mLastX; final int dy = y - mLastY; - return dx * dx + dy * dy >= mMinPreviewSampleLengthSquare; + if (isMajorEvent || dx * dx + dy * dy >= mMinPreviewSamplingDistanceSquared) { + mLastX = x; + mLastY = y; + return true; + } + return false; } @Override public boolean addPointOnKeyboard(final int x, final int y, final int time, final boolean isMajorEvent) { - final boolean onValidArea = super.addPointOnKeyboard(x, y, time, isMajorEvent); - if (isMajorEvent || needsSampling(x, y)) { + if (needsSampling(x, y, isMajorEvent)) { mPreviewEventTimes.add(time); mPreviewXCoordinates.add(x); mPreviewYCoordinates.add(y); - mLastX = x; - mLastY = y; } - return onValidArea; + return super.addPointOnKeyboard(x, y, time, isMajorEvent); + } public void appendPreviewStroke(final ResizableIntArray eventTimes, @@ -95,4 +123,82 @@ public final class GestureStrokeWithPreviewPoints extends GestureStroke { yCoords.append(mPreviewYCoordinates, mLastPreviewSize, length); mLastPreviewSize = mPreviewEventTimes.getLength(); } + + /** + * Calculate interpolated points between the last interpolated point and the end of the trail. + * And return the start index of the last interpolated segment of input arrays because it + * may need to recalculate the interpolated points in the segment if further segments are + * added to this stroke. + * + * @param lastInterpolatedIndex the start index of the last interpolated segment of + * <code>eventTimes</code>, <code>xCoords</code>, and <code>yCoords</code>. + * @param eventTimes the event time array of gesture preview trail to be drawn. + * @param xCoords the x-coordinates array of gesture preview trail to be drawn. + * @param yCoords the y-coordinates array of gesture preview trail to be drawn. + * @return the start index of the last interpolated segment of input arrays. + */ + public int interpolateStrokeAndReturnStartIndexOfLastSegment(final int lastInterpolatedIndex, + final ResizableIntArray eventTimes, final ResizableIntArray xCoords, + final ResizableIntArray yCoords) { + if (!ENABLE_INTERPOLATION) { + return lastInterpolatedIndex; + } + final int size = mPreviewEventTimes.getLength(); + final int[] pt = mPreviewEventTimes.getPrimitiveArray(); + final int[] px = mPreviewXCoordinates.getPrimitiveArray(); + final int[] py = mPreviewYCoordinates.getPrimitiveArray(); + mInterpolator.reset(px, py, 0, size); + // The last segment of gesture stroke needs to be interpolated again because the slope of + // the tangent at the last point isn't determined. + int lastInterpolatedDrawIndex = lastInterpolatedIndex; + int d1 = lastInterpolatedIndex; + for (int p2 = mLastInterpolatedPreviewIndex + 1; p2 < size; p2++) { + final int p1 = p2 - 1; + final int p0 = p1 - 1; + final int p3 = p2 + 1; + mLastInterpolatedPreviewIndex = p1; + lastInterpolatedDrawIndex = d1; + mInterpolator.setInterval(p0, p1, p2, p3); + final double m1 = Math.atan2(mInterpolator.mSlope1Y, mInterpolator.mSlope1X); + final double m2 = Math.atan2(mInterpolator.mSlope2Y, mInterpolator.mSlope2X); + final double dm = Math.abs(angularDiff(m2, m1)); + final int partition = Math.min((int)Math.ceil(dm / INTERPOLATION_ANGULAR_THRESHOLD), + MAX_INTERPOLATION_PARTITION); + final int t1 = eventTimes.get(d1); + final int dt = pt[p2] - pt[p1]; + d1++; + for (int i = 1; i < partition; i++) { + final float t = i / (float)partition; + mInterpolator.interpolate(t); + eventTimes.add(d1, (int)(dt * t) + t1); + xCoords.add(d1, (int)mInterpolator.mInterpolatedX); + yCoords.add(d1, (int)mInterpolator.mInterpolatedY); + d1++; + } + eventTimes.add(d1, pt[p2]); + xCoords.add(d1, px[p2]); + yCoords.add(d1, py[p2]); + } + return lastInterpolatedDrawIndex; + } + + private static final double TWO_PI = Math.PI * 2.0d; + + /** + * Calculate the angular of rotation from <code>a0</code> to <code>a1</code>. + * + * @param a1 the angular to which the rotation ends. + * @param a0 the angular from which the rotation starts. + * @return the angular rotation value from a0 to a1, normalized to [-PI, +PI]. + */ + private static double angularDiff(final double a1, final double a0) { + double deltaAngle = a1 - a0; + while (deltaAngle > Math.PI) { + deltaAngle -= TWO_PI; + } + while (deltaAngle < -Math.PI) { + deltaAngle += TWO_PI; + } + return deltaAngle; + } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/HermiteInterpolator.java b/java/src/com/android/inputmethod/keyboard/internal/HermiteInterpolator.java new file mode 100644 index 000000000..0ec8153f5 --- /dev/null +++ b/java/src/com/android/inputmethod/keyboard/internal/HermiteInterpolator.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import com.android.inputmethod.annotations.UsedForTesting; + +/** + * Interpolates XY-coordinates using Cubic Hermite Curve. + */ +public final class HermiteInterpolator { + private int[] mXCoords; + private int[] mYCoords; + private int mMinPos; + private int mMaxPos; + + // Working variable to calculate interpolated value. + /** The coordinates of the start point of the interval. */ + public int mP1X, mP1Y; + /** The coordinates of the end point of the interval. */ + public int mP2X, mP2Y; + /** The slope of the tangent at the start point. */ + public float mSlope1X, mSlope1Y; + /** The slope of the tangent at the end point. */ + public float mSlope2X, mSlope2Y; + /** The interpolated coordinates. + * The return variables of {@link #interpolate(float)} to avoid instantiations. + */ + public float mInterpolatedX, mInterpolatedY; + + public HermiteInterpolator() { + // Nothing to do with here. + } + + /** + * Reset this interpolator to point XY-coordinates data. + * @param xCoords the array of x-coordinates. Valid data are in left-open interval + * <code>[minPos, maxPos)</code>. + * @param yCoords the array of y-coordinates. Valid data are in left-open interval + * <code>[minPos, maxPos)</code>. + * @param minPos the minimum index of left-open interval of valid data. + * @param maxPos the maximum index of left-open interval of valid data. + */ + @UsedForTesting + public void reset(final int[] xCoords, final int[] yCoords, final int minPos, + final int maxPos) { + mXCoords = xCoords; + mYCoords = yCoords; + mMinPos = minPos; + mMaxPos = maxPos; + } + + /** + * Set interpolation interval. + * <p> + * The start and end coordinates of the interval will be set in {@link #mP1X}, {@link #mP1Y}, + * {@link #mP2X}, and {@link #mP2Y}. The slope of the tangents at start and end points will be + * set in {@link #mSlope1X}, {@link #mSlope1Y}, {@link #mSlope2X}, and {@link #mSlope2Y}. + * + * @param p0 the index just before interpolation interval. If <code>p1</code> points the start + * of valid points, <code>p0</code> must be less than <code>minPos</code> of + * {@link #reset(int[],int[],int,int)}. + * @param p1 the start index of interpolation interval. + * @param p2 the end index of interpolation interval. + * @param p3 the index just after interpolation interval. If <code>p2</code> points the end of + * valid points, <code>p3</code> must be equal or greater than <code>maxPos</code> of + * {@link #reset(int[],int[],int,int)}. + */ + @UsedForTesting + public void setInterval(final int p0, final int p1, final int p2, final int p3) { + mP1X = mXCoords[p1]; + mP1Y = mYCoords[p1]; + mP2X = mXCoords[p2]; + mP2Y = mYCoords[p2]; + // A(ax,ay) is the vector p1->p2. + final int ax = mP2X - mP1X; + final int ay = mP2Y - mP1Y; + + // Calculate the slope of the tangent at p1. + if (p0 >= mMinPos) { + // p1 has previous valid point p0. + // The slope of the tangent is half of the vector p0->p2. + mSlope1X = (mP2X - mXCoords[p0]) / 2.0f; + mSlope1Y = (mP2Y - mYCoords[p0]) / 2.0f; + } else if (p3 < mMaxPos) { + // p1 has no previous valid point, but p2 has next valid point p3. + // B(bx,by) is the slope vector of the tangent at p2. + final float bx = (mXCoords[p3] - mP1X) / 2.0f; + final float by = (mYCoords[p3] - mP1Y) / 2.0f; + final float crossProdAB = ax * by - ay * bx; + final float dotProdAB = ax * bx + ay * by; + final float normASquare = ax * ax + ay * ay; + final float invHalfNormASquare = 1.0f / normASquare / 2.0f; + // The slope of the tangent is the mirror image of vector B to vector A. + mSlope1X = invHalfNormASquare * (dotProdAB * ax + crossProdAB * ay); + mSlope1Y = invHalfNormASquare * (dotProdAB * ay - crossProdAB * ax); + } else { + // p1 and p2 have no previous valid point. (Interval has only point p1 and p2) + mSlope1X = ax; + mSlope1Y = ay; + } + + // Calculate the slope of the tangent at p2. + if (p3 < mMaxPos) { + // p2 has next valid point p3. + // The slope of the tangent is half of the vector p1->p3. + mSlope2X = (mXCoords[p3] - mP1X) / 2.0f; + mSlope2Y = (mYCoords[p3] - mP1Y) / 2.0f; + } else if (p0 >= mMinPos) { + // p2 has no next valid point, but p1 has previous valid point p0. + // B(bx,by) is the slope vector of the tangent at p1. + final float bx = (mP2X - mXCoords[p0]) / 2.0f; + final float by = (mP2Y - mYCoords[p0]) / 2.0f; + final float crossProdAB = ax * by - ay * bx; + final float dotProdAB = ax * bx + ay * by; + final float normASquare = ax * ax + ay * ay; + final float invHalfNormASquare = 1.0f / normASquare / 2.0f; + // The slope of the tangent is the mirror image of vector B to vector A. + mSlope2X = invHalfNormASquare * (dotProdAB * ax + crossProdAB * ay); + mSlope2Y = invHalfNormASquare * (dotProdAB * ay - crossProdAB * ax); + } else { + // p1 and p2 has no previous valid point. (Interval has only point p1 and p2) + mSlope2X = ax; + mSlope2Y = ay; + } + } + + /** + * Calculate interpolation value at <code>t</code> in unit interval <code>[0,1]</code>. + * <p> + * On the unit interval [0,1], given a starting point p1 at t=0 and an ending point p2 at t=1 + * with the slope of the tangent m1 at p1 and m2 at p2, the polynomial of cubic Hermite curve + * can be defined by + * p(t) = (1+2t)(1-t)(1-t)*p1 + t(1-t)(1-t)*m1 + (3-2t)t^2*p2 + (t-1)t^2*m2 + * where t is an element of [0,1]. + * <p> + * The interpolated XY-coordinates will be set in {@link #mInterpolatedX} and + * {@link #mInterpolatedY}. + * + * @param t the interpolation parameter. The value must be in close interval <code>[0,1]</code>. + */ + @UsedForTesting + public void interpolate(final float t) { + final float omt = 1.0f - t; + final float tm2 = 2.0f * t; + final float k1 = 1.0f + tm2; + final float k2 = 3.0f - tm2; + final float omt2 = omt * omt; + final float t2 = t * t; + mInterpolatedX = (k1 * mP1X + t * mSlope1X) * omt2 + (k2 * mP2X - omt * mSlope2X) * t2; + mInterpolatedY = (k1 * mP1Y + t * mSlope1Y) * omt2 + (k2 * mP2Y - omt * mSlope2Y) * t2; + } +} diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index 8ae1b8881..be178f516 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -164,10 +164,10 @@ public class KeyboardBuilder<KP extends KeyboardParams> { parseKeyboard(parser); } catch (XmlPullParserException e) { Log.w(BUILDER_TAG, "keyboard XML parse error", e); - throw new IllegalArgumentException(e); + throw new IllegalArgumentException(e.getMessage(), e); } catch (IOException e) { Log.w(BUILDER_TAG, "keyboard XML parse error", e); - throw new RuntimeException(e); + throw new RuntimeException(e.getMessage(), e); } finally { parser.close(); } @@ -210,8 +210,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> { private void parseKeyboard(final XmlPullParser parser) throws XmlPullParserException, IOException { if (DEBUG) startTag("<%s> %s", TAG_KEYBOARD, mParams.mId); - int event; - while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + final int event = parser.next(); if (event == XmlPullParser.START_TAG) { final String tag = parser.getName(); if (TAG_KEYBOARD.equals(tag)) { @@ -220,7 +220,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { parseKeyboardContent(parser, false); break; } else { - throw new XmlParseUtils.IllegalStartTag(parser, TAG_KEYBOARD); + throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_KEYBOARD); } } } @@ -303,8 +303,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> { private void parseKeyboardContent(final XmlPullParser parser, final boolean skip) throws XmlPullParserException, IOException { - int event; - while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + final int event = parser.next(); if (event == XmlPullParser.START_TAG) { final String tag = parser.getName(); if (TAG_ROW.equals(tag)) { @@ -321,7 +321,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { } else if (TAG_KEY_STYLE.equals(tag)) { parseKeyStyle(parser, skip); } else { - throw new XmlParseUtils.IllegalStartTag(parser, TAG_ROW); + throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_ROW); } } else if (event == XmlPullParser.END_TAG) { final String tag = parser.getName(); @@ -333,7 +333,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { || TAG_MERGE.equals(tag)) { break; } else { - throw new XmlParseUtils.IllegalEndTag(parser, TAG_ROW); + throw new XmlParseUtils.IllegalEndTag(parser, tag, TAG_ROW); } } } @@ -345,10 +345,10 @@ public class KeyboardBuilder<KP extends KeyboardParams> { R.styleable.Keyboard); try { if (a.hasValue(R.styleable.Keyboard_horizontalGap)) { - throw new XmlParseUtils.IllegalAttribute(parser, "horizontalGap"); + throw new XmlParseUtils.IllegalAttribute(parser, TAG_ROW, "horizontalGap"); } if (a.hasValue(R.styleable.Keyboard_verticalGap)) { - throw new XmlParseUtils.IllegalAttribute(parser, "verticalGap"); + throw new XmlParseUtils.IllegalAttribute(parser, TAG_ROW, "verticalGap"); } return new KeyboardRow(mResources, mParams, parser, mCurrentY); } finally { @@ -358,8 +358,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> { private void parseRowContent(final XmlPullParser parser, final KeyboardRow row, final boolean skip) throws XmlPullParserException, IOException { - int event; - while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + final int event = parser.next(); if (event == XmlPullParser.START_TAG) { final String tag = parser.getName(); if (TAG_KEY.equals(tag)) { @@ -373,7 +373,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { } else if (TAG_KEY_STYLE.equals(tag)) { parseKeyStyle(parser, skip); } else { - throw new XmlParseUtils.IllegalStartTag(parser, TAG_KEY); + throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_ROW); } } else if (event == XmlPullParser.END_TAG) { final String tag = parser.getName(); @@ -387,7 +387,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { || TAG_MERGE.equals(tag)) { break; } else { - throw new XmlParseUtils.IllegalEndTag(parser, TAG_KEY); + throw new XmlParseUtils.IllegalEndTag(parser, tag, TAG_ROW); } } } @@ -506,8 +506,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> { private void parseMerge(final XmlPullParser parser, final KeyboardRow row, final boolean skip) throws XmlPullParserException, IOException { if (DEBUG) startTag("<%s>", TAG_MERGE); - int event; - while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + final int event = parser.next(); if (event == XmlPullParser.START_TAG) { final String tag = parser.getName(); if (TAG_MERGE.equals(tag)) { @@ -539,8 +539,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> { final boolean skip) throws XmlPullParserException, IOException { if (DEBUG) startTag("<%s> %s", TAG_SWITCH, mParams.mId); boolean selected = false; - int event; - while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) { + while (parser.getEventType() != XmlPullParser.END_DOCUMENT) { + final int event = parser.next(); if (event == XmlPullParser.START_TAG) { final String tag = parser.getName(); if (TAG_CASE.equals(tag)) { @@ -548,7 +548,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { } else if (TAG_DEFAULT.equals(tag)) { selected |= parseDefault(parser, row, selected ? true : skip); } else { - throw new XmlParseUtils.IllegalStartTag(parser, TAG_KEY); + throw new XmlParseUtils.IllegalStartTag(parser, tag, TAG_SWITCH); } } else if (event == XmlPullParser.END_TAG) { final String tag = parser.getName(); @@ -556,7 +556,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { if (DEBUG) endTag("</%s>", TAG_SWITCH); break; } else { - throw new XmlParseUtils.IllegalEndTag(parser, TAG_KEY); + throw new XmlParseUtils.IllegalEndTag(parser, tag, TAG_SWITCH); } } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java index d0b382e35..7ec1c9406 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java @@ -21,7 +21,6 @@ import android.content.res.Resources; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.CollectionUtils; -import com.android.inputmethod.latin.R; import java.util.HashMap; @@ -61,13 +60,14 @@ public final class KeyboardTextsSet { } } - public void loadStringResources(Context context) { - loadStringResourcesInternal(context, RESOURCE_NAMES, R.string.english_ime_name); + public void loadStringResources(final Context context) { + final int referenceId = context.getApplicationInfo().labelRes; + loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId); } @UsedForTesting - void loadStringResourcesInternal(Context context, final String[] resourceNames, - int referenceId) { + void loadStringResourcesInternal(final Context context, final String[] resourceNames, + final int referenceId) { final Resources res = context.getResources(); final String packageName = res.getResourcePackageName(referenceId); for (final String resName : resourceNames) { diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java index 4bec99c04..562e1d0b7 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java @@ -450,4 +450,25 @@ public final class BinaryDictionaryFileDumper { info.toContentValues()); } } + + /** + * Initialize a client record with the dictionary content provider. + * + * This merely acquires the content provider and calls + * #reinitializeClientRecordInDictionaryContentProvider. + * + * @param context the context for resources and providers. + * @param clientId the client ID to use. + */ + public static void initializeClientRecordHelper(final Context context, + final String clientId) { + try { + final ContentProviderClient client = context.getContentResolver(). + acquireContentProviderClient(getProviderUriBuilder("").build()); + if (null == client) return; + reinitializeClientRecordInDictionaryContentProvider(context, client, clientId); + } catch (RemoteException e) { + Log.e(TAG, "Cannot contact the dictionary content provider", e); + } + } } diff --git a/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java index 35f3119ea..41fcb83e6 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java +++ b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java @@ -25,14 +25,35 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.net.Uri; +import android.util.Log; /** - * Takes action to reload the necessary data when a dictionary pack was added/removed. + * Receives broadcasts pertaining to dictionary management and takes the appropriate action. + * + * This object receives three types of broadcasts. + * - Package installed/added. When a dictionary provider application is added or removed, we + * need to query the dictionaries. + * - New dictionary broadcast. The dictionary provider broadcasts new dictionary availability. When + * this happens, we need to re-query the dictionaries. + * - Unknown client. If the dictionary provider is in urgent need of data about some client that + * it does not know, it sends this broadcast. When we receive this, we need to tell the dictionary + * provider about ourselves. This happens when the settings for the dictionary pack are accessed, + * but Latin IME never got a chance to register itself. */ public final class DictionaryPackInstallBroadcastReceiver extends BroadcastReceiver { + private static final String TAG = DictionaryPackInstallBroadcastReceiver.class.getSimpleName(); final LatinIME mService; + public DictionaryPackInstallBroadcastReceiver() { + // This empty constructor is necessary for the system to instantiate this receiver. + // This happens when the dictionary pack says it can't find a record for our client, + // which happens when the dictionary pack settings are called before the keyboard + // was ever started once. + Log.i(TAG, "Latin IME dictionary broadcast receiver instantiated from the framework."); + mService = null; + } + public DictionaryPackInstallBroadcastReceiver(final LatinIME service) { mService = service; } @@ -44,6 +65,11 @@ public final class DictionaryPackInstallBroadcastReceiver extends BroadcastRecei // We need to reread the dictionary if a new dictionary package is installed. if (action.equals(Intent.ACTION_PACKAGE_ADDED)) { + if (null == mService) { + Log.e(TAG, "Called with intent " + action + " but we don't know the service: this " + + "should never happen"); + return; + } final Uri packageUri = intent.getData(); if (null == packageUri) return; // No package name : we can't do anything final String packageName = packageUri.getSchemeSpecificPart(); @@ -71,6 +97,11 @@ public final class DictionaryPackInstallBroadcastReceiver extends BroadcastRecei return; } else if (action.equals(Intent.ACTION_PACKAGE_REMOVED) && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { + if (null == mService) { + Log.e(TAG, "Called with intent " + action + " but we don't know the service: this " + + "should never happen"); + return; + } // When the dictionary package is removed, we need to reread dictionary (to use the // next-priority one, or stop using a dictionary at all if this was the only one, // since this is the user request). @@ -82,7 +113,28 @@ public final class DictionaryPackInstallBroadcastReceiver extends BroadcastRecei // read dictionary from? mService.resetSuggestMainDict(); } else if (action.equals(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION)) { + if (null == mService) { + Log.e(TAG, "Called with intent " + action + " but we don't know the service: this " + + "should never happen"); + return; + } mService.resetSuggestMainDict(); + } else if (action.equals(DictionaryPackConstants.UNKNOWN_DICTIONARY_PROVIDER_CLIENT)) { + if (null != mService) { + // Careful! This is returning if the service is NOT null. This is because we + // should come here instantiated by the framework in reaction to a broadcast of + // the above action, so we should gave gone through the no-args constructor. + Log.e(TAG, "Called with intent " + action + " but we have a reference to the " + + "service: this should never happen"); + return; + } + // The dictionary provider does not know about some client. We check that it's really + // us that it needs to know about, and if it's the case, we register with the provider. + final String wantedClientId = + intent.getStringExtra(DictionaryPackConstants.DICTIONARY_PROVIDER_CLIENT_EXTRA); + final String myClientId = context.getString(R.string.dictionary_pack_client_id); + if (!wantedClientId.equals(myClientId)) return; // Not for us + BinaryDictionaryFileDumper.initializeClientRecordHelper(context, myClientId); } } } diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java index ae2ee577f..fd81d13ca 100644 --- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java +++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java @@ -18,6 +18,7 @@ package com.android.inputmethod.latin; import android.content.Context; import android.text.TextUtils; +import android.util.Log; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; @@ -31,6 +32,7 @@ import java.util.LinkedList; * be searched for suggestions and valid words. */ public class ExpandableDictionary extends Dictionary { + private static final String TAG = ExpandableDictionary.class.getSimpleName(); /** * The weight to give to a word if it's length is the same as the number of typed characters. */ @@ -551,8 +553,13 @@ public class ExpandableDictionary extends Dictionary { // word. We do want however to return the correct case for the right hand side. // So we want to squash the case of the left hand side, and preserve that of the right // hand side word. - Node firstWord = searchWord(mRoots, word1.toLowerCase(), 0, null); - Node secondWord = searchWord(mRoots, word2, 0, null); + final String word1Lower = word1.toLowerCase(); + if (TextUtils.isEmpty(word1Lower) || TextUtils.isEmpty(word2)) { + Log.e(TAG, "Invalid bigram pair: " + word1 + ", " + word1Lower + ", " + word2); + return frequency; + } + final Node firstWord = searchWord(mRoots, word1Lower, 0, null); + final Node secondWord = searchWord(mRoots, word2, 0, null); LinkedList<NextWord> bigrams = firstWord.mNGrams; if (bigrams == null || bigrams.size() == 0) { firstWord.mNGrams = CollectionUtils.newLinkedList(); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index e3650d9cc..56b1c786e 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -72,6 +72,7 @@ import com.android.inputmethod.keyboard.KeyboardActionListener; import com.android.inputmethod.keyboard.KeyboardId; import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.keyboard.MainKeyboardView; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.Utils.Stats; import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.latin.suggestions.SuggestionStripView; @@ -156,7 +157,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction private PositionalInfoForUserDictPendingAddition mPositionalInfoForUserDictPendingAddition = null; private final WordComposer mWordComposer = new WordComposer(); - private RichInputConnection mConnection = new RichInputConnection(this); + private final RichInputConnection mConnection = new RichInputConnection(this); // Keep track of the last selection range to decide if we need to show word alternatives private static final int NOT_A_CURSOR_POSITION = -1; @@ -803,10 +804,6 @@ public final class LatinIME extends InputMethodService implements KeyboardAction @Override public void onWindowHidden() { - if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.latinIME_onWindowHidden(mLastSelectionStart, mLastSelectionEnd, - getCurrentInputConnection()); - } super.onWindowHidden(); final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); if (mainKeyboardView != null) { @@ -834,8 +831,10 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // Remove pending messages related to update suggestions mHandler.cancelUpdateSuggestionStrip(); resetComposingState(true /* alsoResetLastComposedWord */); + // Notify ResearchLogger if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.getInstance().latinIME_onFinishInputViewInternal(); + ResearchLogger.latinIME_onFinishInputViewInternal(finishingInput, mLastSelectionStart, + mLastSelectionEnd, getCurrentInputConnection()); } } @@ -1145,11 +1144,11 @@ public final class LatinIME extends InputMethodService implements KeyboardAction if (!mWordComposer.isComposingWord()) return; final String typedWord = mWordComposer.getTypedWord(); if (typedWord.length() > 0) { - commitChosenWord(typedWord, LastComposedWord.COMMIT_TYPE_USER_TYPED_WORD, - separatorString); if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { ResearchLogger.getInstance().onWordFinished(typedWord, mWordComposer.isBatchMode()); } + commitChosenWord(typedWord, LastComposedWord.COMMIT_TYPE_USER_TYPED_WORD, + separatorString); } } @@ -1907,7 +1906,6 @@ public final class LatinIME extends InputMethodService implements KeyboardAction private boolean handleSeparator(final int primaryCode, final int x, final int y, final int spaceState) { if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - ResearchLogger.recordTimeForLogUnitSplit(); ResearchLogger.latinIME_handleSeparator(primaryCode, mWordComposer.isComposingWord()); } boolean didAutoCorrect = false; @@ -2176,8 +2174,9 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener} // interface @Override - public void pickSuggestionManually(final int index, final String suggestion) { + public void pickSuggestionManually(final int index, final SuggestedWordInfo suggestionInfo) { final SuggestedWords suggestedWords = mSuggestedWords; + final String suggestion = suggestionInfo.mWord; // If this is a punctuation picked from the suggestion strip, pass it to onCodeInput if (suggestion.length() == 1 && isShowingPunctuationList()) { // Word separators are suggested before the user inputs something. @@ -2243,7 +2242,8 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // AND it's in none of our current dictionaries (main, user or otherwise). // Please note that if mSuggest is null, it means that everything is off: suggestion // and correction, so we shouldn't try to show the hint - final boolean showingAddToDictionaryHint = index == 0 && mSuggest != null + final boolean showingAddToDictionaryHint = + SuggestedWordInfo.KIND_TYPED == suggestionInfo.mKind && mSuggest != null // If the suggestion is not in the dictionary, the hint should be shown. && !AutoCorrection.isValidWord(mSuggest.getUnigramDictionaries(), suggestion, true); @@ -2297,25 +2297,27 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // expect to receive non-words. if (!mSettings.getCurrent().mCorrectionEnabled) return null; + final Suggest suggest = mSuggest; final UserHistoryDictionary userHistoryDictionary = mUserHistoryDictionary; - if (userHistoryDictionary != null) { - final String prevWord - = mConnection.getNthPreviousWord(mSettings.getCurrent().mWordSeparators, 2); - final String secondWord; - if (mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps()) { - secondWord = suggestion.toLowerCase(mSubtypeSwitcher.getCurrentSubtypeLocale()); - } else { - secondWord = suggestion; - } - // We demote unrecognized words (frequency < 0, below) by specifying them as "invalid". - // We don't add words with 0-frequency (assuming they would be profanity etc.). - final int maxFreq = AutoCorrection.getMaxFrequency( - mSuggest.getUnigramDictionaries(), suggestion); - if (maxFreq == 0) return null; - userHistoryDictionary.addToUserHistory(prevWord, secondWord, maxFreq > 0); - return prevWord; + if (suggest == null || userHistoryDictionary == null) { + // Avoid concurrent issue + return null; + } + final String prevWord + = mConnection.getNthPreviousWord(mSettings.getCurrent().mWordSeparators, 2); + final String secondWord; + if (mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps()) { + secondWord = suggestion.toLowerCase(mSubtypeSwitcher.getCurrentSubtypeLocale()); + } else { + secondWord = suggestion; } - return null; + // We demote unrecognized words (frequency < 0, below) by specifying them as "invalid". + // We don't add words with 0-frequency (assuming they would be profanity etc.). + final int maxFreq = AutoCorrection.getMaxFrequency( + suggest.getUnigramDictionaries(), suggestion); + if (maxFreq == 0) return null; + userHistoryDictionary.addToUserHistory(prevWord, secondWord, maxFreq > 0); + return prevWord; } /** @@ -2526,7 +2528,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction final CharSequence[] items = new CharSequence[] { // TODO: Should use new string "Select active input modes". getString(R.string.language_selection_title), - getString(R.string.english_ime_settings), + getString(Utils.getAcitivityTitleResId(this, SettingsActivity.class)), }; final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { @Override diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java index 8a7ade49e..16744d1f0 100644 --- a/java/src/com/android/inputmethod/latin/RichInputConnection.java +++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java @@ -60,11 +60,11 @@ public final class RichInputConnection { * This contains the committed text immediately preceding the cursor and the composing * text if any. It is refreshed when the cursor moves by calling upon the TextView. */ - private StringBuilder mCommittedTextBeforeComposingText = new StringBuilder(); + private final StringBuilder mCommittedTextBeforeComposingText = new StringBuilder(); /** * This contains the currently composing text, as LatinIME thinks the TextView is seeing it. */ - private StringBuilder mComposingText = new StringBuilder(); + private final StringBuilder mComposingText = new StringBuilder(); // 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. private static final int DEFAULT_TEXT_CACHE_SIZE = 100; @@ -334,13 +334,15 @@ public final class RichInputConnection { mCurrentCursorPosition = end; final CharSequence textBeforeCursor = getTextBeforeCursor(DEFAULT_TEXT_CACHE_SIZE + (end - start), 0); - final int indexOfStartOfComposingText = - Math.max(textBeforeCursor.length() - (end - start), 0); - mComposingText.append(textBeforeCursor.subSequence(indexOfStartOfComposingText, - textBeforeCursor.length())); mCommittedTextBeforeComposingText.setLength(0); - mCommittedTextBeforeComposingText.append( - textBeforeCursor.subSequence(0, indexOfStartOfComposingText)); + if (!TextUtils.isEmpty(textBeforeCursor)) { + final int indexOfStartOfComposingText = + Math.max(textBeforeCursor.length() - (end - start), 0); + mComposingText.append(textBeforeCursor.subSequence(indexOfStartOfComposingText, + textBeforeCursor.length())); + mCommittedTextBeforeComposingText.append( + textBeforeCursor.subSequence(0, indexOfStartOfComposingText)); + } if (null != mIC) { mIC.setComposingRegion(start, end); } @@ -502,16 +504,6 @@ public final class RichInputConnection { return (r == null) ? null : r.mWord; } - private int getCursorPosition() { - mIC = mParent.getCurrentInputConnection(); - if (null == mIC) return INVALID_CURSOR_POSITION; - final ExtractedText extracted = mIC.getExtractedText(new ExtractedTextRequest(), 0); - if (extracted == null) { - return INVALID_CURSOR_POSITION; - } - return extracted.startOffset + extracted.selectionStart; - } - /** * Returns the text surrounding the cursor. * diff --git a/java/src/com/android/inputmethod/latin/SettingsFragment.java b/java/src/com/android/inputmethod/latin/SettingsFragment.java index 4fdd83911..928141c32 100644 --- a/java/src/com/android/inputmethod/latin/SettingsFragment.java +++ b/java/src/com/android/inputmethod/latin/SettingsFragment.java @@ -69,6 +69,11 @@ public final class SettingsFragment extends InputMethodSettingsFragment setInputMethodSettingsCategoryTitle(R.string.language_selection_title); setSubtypeEnablerTitle(R.string.select_language); addPreferencesFromResource(R.xml.prefs); + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + if (preferenceScreen != null) { + preferenceScreen.setTitle( + Utils.getAcitivityTitleResId(getActivity(), SettingsActivity.class)); + } final Resources res = getResources(); final Context context = getActivity(); diff --git a/java/src/com/android/inputmethod/latin/StringUtils.java b/java/src/com/android/inputmethod/latin/StringUtils.java index 90c3fcdd2..59ad28fc9 100644 --- a/java/src/com/android/inputmethod/latin/StringUtils.java +++ b/java/src/com/android/inputmethod/latin/StringUtils.java @@ -22,6 +22,10 @@ import java.util.ArrayList; import java.util.Locale; public final class StringUtils { + public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case + public static final int CAPITALIZE_FIRST = 1; // First only + public static final int CAPITALIZE_ALL = 2; // All caps + private StringUtils() { // This utility class is not publicly instantiable. } @@ -111,11 +115,12 @@ public final class StringUtils { // - This does not work for Greek, because it returns upper case instead of title case. // - It does not work for Serbian, because it fails to account for the "lj" character, // which should be "Lj" in title case and "LJ" in upper case. - // - It does not work for Dutch, because it fails to account for the "ij" digraph, which - // are two different characters but both should be capitalized as "IJ" as if they were - // a single letter. - // - It also does not work with unicode surrogate code points. - return s.toUpperCase(locale).charAt(0) + s.substring(1); + // - It does not work for Dutch, because it fails to account for the "ij" digraph when it's + // written as two separate code points. They are two different characters but both should + // be capitalized as "IJ" as if they were a single letter in most words (not all). If the + // unicode char for the ligature is used however, it works. + final int cutoff = s.offsetByCodePoints(0, 1); + return s.substring(0, cutoff).toUpperCase(locale) + s.substring(cutoff).toLowerCase(locale); } private static final int[] EMPTY_CODEPOINTS = {}; @@ -171,4 +176,41 @@ public final class StringUtils { } return list.toArray(new String[list.size()]); } + + // This method assumes the text is not null. For the empty string, it returns CAPITALIZE_NONE. + public static int getCapitalizationType(final String text) { + // If the first char is not uppercase, then the word is either all lower case or + // camel case, and in either case we return CAPITALIZE_NONE. + final int len = text.length(); + int index = 0; + for (; index < len; index = text.offsetByCodePoints(index, 1)) { + if (Character.isLetter(text.codePointAt(index))) { + break; + } + } + if (index == len) return CAPITALIZE_NONE; + if (!Character.isUpperCase(text.codePointAt(index))) { + return CAPITALIZE_NONE; + } + int capsCount = 1; + int letterCount = 1; + for (index = text.offsetByCodePoints(index, 1); index < len; + index = text.offsetByCodePoints(index, 1)) { + if (1 != capsCount && letterCount != capsCount) break; + final int codePoint = text.codePointAt(index); + if (Character.isUpperCase(codePoint)) { + ++capsCount; + ++letterCount; + } else if (Character.isLetter(codePoint)) { + // We need to discount non-letters since they may not be upper-case, but may + // still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME") + ++letterCount; + } + } + // We know the first char is upper case. So we want to test if either every letter other + // than the first is lower case, or if they are all upper case. If the string is exactly + // one char long, then we will arrive here with letterCount 1, and this is correct, too. + if (1 == capsCount) return CAPITALIZE_FIRST; + return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE); + } } diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java index 9cbfe6698..5e28cc2d0 100644 --- a/java/src/com/android/inputmethod/latin/SubtypeLocale.java +++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java @@ -114,7 +114,7 @@ public final class SubtypeLocale { final String[] keyboardLayoutSetMap = res.getStringArray( R.array.locale_and_extra_value_to_keyboard_layout_set_map); - for (int i = 0; i < keyboardLayoutSetMap.length; i += 2) { + for (int i = 0; i + 1 < keyboardLayoutSetMap.length; i += 2) { final String key = keyboardLayoutSetMap[i]; final String keyboardLayoutSet = keyboardLayoutSetMap[i + 1]; sLocaleAndExtraValueToKeyboardLayoutSetMap.put(key, keyboardLayoutSet); diff --git a/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java b/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java index 62f2a9750..10931555e 100644 --- a/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java +++ b/java/src/com/android/inputmethod/latin/UserHistoryDictIOUtils.java @@ -207,7 +207,12 @@ public final class UserHistoryDictIOUtils { final ArrayList<PendingAttribute> attrList = bigrams.get(entry.getKey()); if (attrList != null) { for (final PendingAttribute attr : attrList) { - to.setBigram(word1, unigrams.get(attr.mAddress), + final String word2 = unigrams.get(attr.mAddress); + if (word1 == null || word2 == null) { + Log.e(TAG, "Invalid bigram pair detected: " + word1 + ", " + word2); + continue; + } + to.setBigram(word1, word2, BinaryDictInputOutput.reconstructBigramFrequency(unigramFrequency, attr.mFrequency)); } diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java index 7a604dc6a..aff5d17d7 100644 --- a/java/src/com/android/inputmethod/latin/Utils.java +++ b/java/src/com/android/inputmethod/latin/Utils.java @@ -16,8 +16,13 @@ package com.android.inputmethod.latin; +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.inputmethodservice.InputMethodService; import android.net.Uri; import android.os.AsyncTask; @@ -45,6 +50,8 @@ import java.util.Date; import java.util.Locale; public final class Utils { + private static final String TAG = Utils.class.getSimpleName(); + private Utils() { // This utility class is not publicly instantiable. } @@ -453,4 +460,17 @@ public final class Utils { if (TextUtils.isEmpty(info)) return null; return info; } + + public static int getAcitivityTitleResId(Context context, Class<? extends Activity> cls) { + final ComponentName cn = new ComponentName(context, cls); + try { + final ActivityInfo ai = context.getPackageManager().getActivityInfo(cn, 0); + if (ai != null) { + return ai.labelRes; + } + } catch (NameNotFoundException e) { + Log.e(TAG, "Failed to get settings activity title res id.", e); + } + return 0; + } } diff --git a/java/src/com/android/inputmethod/latin/XmlParseUtils.java b/java/src/com/android/inputmethod/latin/XmlParseUtils.java index f01d4c5e6..48e5ed30a 100644 --- a/java/src/com/android/inputmethod/latin/XmlParseUtils.java +++ b/java/src/com/android/inputmethod/latin/XmlParseUtils.java @@ -30,50 +30,53 @@ public final class XmlParseUtils { @SuppressWarnings("serial") public static class ParseException extends XmlPullParserException { - public ParseException(String msg, XmlPullParser parser) { + public ParseException(final String msg, final XmlPullParser parser) { super(msg + " at " + parser.getPositionDescription()); } } @SuppressWarnings("serial") public static final class IllegalStartTag extends ParseException { - public IllegalStartTag(XmlPullParser parser, String parent) { - super("Illegal start tag " + parser.getName() + " in " + parent, parser); + public IllegalStartTag(final XmlPullParser parser, final String tag, final String parent) { + super("Illegal start tag " + tag + " in " + parent, parser); } } @SuppressWarnings("serial") public static final class IllegalEndTag extends ParseException { - public IllegalEndTag(XmlPullParser parser, String parent) { - super("Illegal end tag " + parser.getName() + " in " + parent, parser); + public IllegalEndTag(final XmlPullParser parser, final String tag, final String parent) { + super("Illegal end tag " + tag + " in " + parent, parser); } } @SuppressWarnings("serial") public static final class IllegalAttribute extends ParseException { - public IllegalAttribute(XmlPullParser parser, String attribute) { - super("Tag " + parser.getName() + " has illegal attribute " + attribute, parser); + public IllegalAttribute(final XmlPullParser parser, final String tag, + final String attribute) { + super("Tag " + tag + " has illegal attribute " + attribute, parser); } } @SuppressWarnings("serial") public static final class NonEmptyTag extends ParseException{ - public NonEmptyTag(String tag, XmlPullParser parser) { + public NonEmptyTag(final XmlPullParser parser, final String tag) { super(tag + " must be empty tag", parser); } } - public static void checkEndTag(String tag, XmlPullParser parser) + public static void checkEndTag(final String tag, final XmlPullParser parser) throws XmlPullParserException, IOException { if (parser.next() == XmlPullParser.END_TAG && tag.equals(parser.getName())) return; - throw new NonEmptyTag(tag, parser); + throw new NonEmptyTag(parser, tag); } - public static void checkAttributeExists(TypedArray attr, int attrId, String attrName, - String tag, XmlPullParser parser) throws XmlPullParserException { - if (attr.hasValue(attrId)) + public static void checkAttributeExists(final TypedArray attr, final int attrId, + final String attrName, final String tag, final XmlPullParser parser) + throws XmlPullParserException { + if (attr.hasValue(attrId)) { return; + } throw new ParseException( "No " + attrName + " attribute found in <" + tag + "/>", parser); } diff --git a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java index 699e47b6a..dc937fb25 100644 --- a/java/src/com/android/inputmethod/latin/define/ProductionFlag.java +++ b/java/src/com/android/inputmethod/latin/define/ProductionFlag.java @@ -28,5 +28,5 @@ public final class ProductionFlag { // 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 = true; + public static final boolean IS_HARDWARE_KEYBOARD_SUPPORTED = false; } diff --git a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java index 5c805598a..e7c7e2b8a 100644 --- a/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java +++ b/java/src/com/android/inputmethod/latin/makedict/FusionDictionary.java @@ -620,34 +620,34 @@ public final class FusionDictionary implements Iterable<Word> { * Helper method to find a word in a given branch. */ @SuppressWarnings("unused") - public static CharGroup findWordInTree(Node node, final String s) { + public static CharGroup findWordInTree(Node node, final String string) { int index = 0; final StringBuilder checker = DBG ? new StringBuilder() : null; + final int[] codePoints = getCodePoints(string); CharGroup currentGroup; - final int codePointCountInS = s.codePointCount(0, s.length()); do { - int indexOfGroup = findIndexOfChar(node, s.codePointAt(index)); + int indexOfGroup = findIndexOfChar(node, codePoints[index]); if (CHARACTER_NOT_FOUND == indexOfGroup) return null; currentGroup = node.mData.get(indexOfGroup); - if (s.length() - index < currentGroup.mChars.length) return null; + if (codePoints.length - index < currentGroup.mChars.length) return null; int newIndex = index; - while (newIndex < s.length() && newIndex - index < currentGroup.mChars.length) { - if (currentGroup.mChars[newIndex - index] != s.codePointAt(newIndex)) return null; + while (newIndex < codePoints.length && newIndex - index < currentGroup.mChars.length) { + if (currentGroup.mChars[newIndex - index] != codePoints[newIndex]) return null; newIndex++; } index = newIndex; if (DBG) checker.append(new String(currentGroup.mChars, 0, currentGroup.mChars.length)); - if (index < codePointCountInS) { + if (index < codePoints.length) { node = currentGroup.mChildren; } - } while (null != node && index < codePointCountInS); + } while (null != node && index < codePoints.length); - if (index < codePointCountInS) return null; + if (index < codePoints.length) return null; if (!currentGroup.isTerminal()) return null; - if (DBG && !s.equals(checker.toString())) return null; + if (DBG && !codePoints.equals(checker.toString())) return null; return currentGroup; } @@ -847,12 +847,12 @@ public final class FusionDictionary implements Iterable<Word> { @Override public Word next() { Position currentPos = mPositions.getLast(); - mCurrentString.setLength(mCurrentString.length() - currentPos.length); + mCurrentString.setLength(currentPos.length); do { if (currentPos.pos.hasNext()) { final CharGroup currentGroup = currentPos.pos.next(); - currentPos.length = currentGroup.mChars.length; + currentPos.length = mCurrentString.length(); for (int i : currentGroup.mChars) mCurrentString.append(Character.toChars(i)); if (null != currentGroup.mChildren) { @@ -866,7 +866,7 @@ public final class FusionDictionary implements Iterable<Word> { } else { mPositions.removeLast(); currentPos = mPositions.getLast(); - mCurrentString.setLength(mCurrentString.length() - mPositions.getLast().length); + mCurrentString.setLength(mPositions.getLast().length); } } while (true); } diff --git a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java index 7f66c6d3e..15d0bac37 100644 --- a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java +++ b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java @@ -112,12 +112,13 @@ public final class SetupActivity extends Activity { // TODO: Use sans-serif-thin font family depending on the system locale white list and // the SDK version. final TextView titleView = (TextView)findViewById(R.id.setup_title); - titleView.setText(getString(R.string.setup_title, getString(R.string.english_ime_name))); + final int appName = getApplicationInfo().labelRes; + titleView.setText(getString(R.string.setup_title, getString(appName))); mStepIndicatorView = (SetupStepIndicatorView)findViewById(R.id.setup_step_indicator); final SetupStep step1 = new SetupStep(findViewById(R.id.setup_step1), - R.string.setup_step1_title, R.string.setup_step1_instruction, + appName, R.string.setup_step1_title, R.string.setup_step1_instruction, R.drawable.ic_settings_language, R.string.language_settings); step1.setAction(new Runnable() { @Override @@ -129,7 +130,7 @@ public final class SetupActivity extends Activity { mSetupSteps.addStep(STEP_1, step1); final SetupStep step2 = new SetupStep(findViewById(R.id.setup_step2), - R.string.setup_step2_title, R.string.setup_step2_instruction, + appName, R.string.setup_step2_title, R.string.setup_step2_instruction, 0 /* actionIcon */, R.string.select_input_method); step2.setAction(new Runnable() { @Override @@ -142,7 +143,7 @@ public final class SetupActivity extends Activity { mSetupSteps.addStep(STEP_2, step2); final SetupStep step3 = new SetupStep(findViewById(R.id.setup_step3), - R.string.setup_step3_title, 0 /* instruction */, + appName, R.string.setup_step3_title, 0 /* instruction */, R.drawable.sym_keyboard_language_switch, R.string.setup_step3_instruction); step3.setAction(new Runnable() { @Override @@ -290,11 +291,11 @@ public final class SetupActivity extends Activity { private final TextView mActionLabel; private Runnable mAction; - public SetupStep(final View rootView, final int title, final int instruction, - final int actionIcon, final int actionLabel) { + public SetupStep(final View rootView, final int appName, final int title, + final int instruction, final int actionIcon, final int actionLabel) { mRootView = rootView; final Resources res = rootView.getResources(); - final String applicationName = res.getString(R.string.english_ime_name); + final String applicationName = res.getString(appName); final TextView titleView = (TextView)rootView.findViewById(R.id.setup_step_title); titleView.setText(res.getString(title, applicationName)); diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index 97e280d79..fbed139f3 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -58,10 +58,6 @@ public final class AndroidSpellCheckerService extends SpellCheckerService public static final String PREF_USE_CONTACTS_KEY = "pref_spellcheck_use_contacts"; - public static final int CAPITALIZE_NONE = 0; // No caps, or mixed case - public static final int CAPITALIZE_FIRST = 1; // First only - public static final int CAPITALIZE_ALL = 2; // All caps - private final static String[] EMPTY_STRING_ARRAY = new String[0]; private Map<String, DictionaryPool> mDictionaryPools = CollectionUtils.newSynchronizedTreeMap(); private Map<String, UserBinaryDictionary> mUserDictionaries = @@ -325,13 +321,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } Collections.reverse(mSuggestions); StringUtils.removeDupes(mSuggestions); - if (CAPITALIZE_ALL == capitalizeType) { + if (StringUtils.CAPITALIZE_ALL == capitalizeType) { for (int i = 0; i < mSuggestions.size(); ++i) { // get(i) returns a CharSequence which is actually a String so .toString() // should return the same object. mSuggestions.set(i, mSuggestions.get(i).toString().toUpperCase(locale)); } - } else if (CAPITALIZE_FIRST == capitalizeType) { + } else if (StringUtils.CAPITALIZE_FIRST == capitalizeType) { for (int i = 0; i < mSuggestions.size(); ++i) { // Likewise mSuggestions.set(i, StringUtils.toTitleCase( @@ -434,31 +430,4 @@ public final class AndroidSpellCheckerService extends SpellCheckerService } return new DictAndProximity(dictionaryCollection, proximityInfo); } - - // This method assumes the text is not empty or null. - public static int getCapitalizationType(String text) { - // If the first char is not uppercase, then the word is either all lower case, - // and in either case we return CAPITALIZE_NONE. - if (!Character.isUpperCase(text.codePointAt(0))) return CAPITALIZE_NONE; - final int len = text.length(); - int capsCount = 1; - int letterCount = 1; - for (int i = 1; i < len; i = text.offsetByCodePoints(i, 1)) { - if (1 != capsCount && letterCount != capsCount) break; - final int codePoint = text.codePointAt(i); - if (Character.isUpperCase(codePoint)) { - ++capsCount; - ++letterCount; - } else if (Character.isLetter(codePoint)) { - // We need to discount non-letters since they may not be upper-case, but may - // still be part of a word (e.g. single quote or dash, as in "IT'S" or "FULL-TIME") - ++letterCount; - } - } - // We know the first char is upper case. So we want to test if either every letter other - // than the first is lower case, or if they are all upper case. If the string is exactly - // one char long, then we will arrive here with letterCount 1, and this is correct, too. - if (1 == capsCount) return CAPITALIZE_FIRST; - return (letterCount == capsCount ? CAPITALIZE_ALL : CAPITALIZE_NONE); - } } diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java index 4f86a3175..b15063235 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java @@ -150,7 +150,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { // Greek letters are either in the 370~3FF range (Greek & Coptic), or in the // 1F00~1FFF range (Greek extended). Our dictionary contains both sort of characters. // Our dictionary also contains a few words with 0xF2; it would be best to check - // if that's correct, but a Google search does return results for these words so + // if that's correct, but a web search does return results for these words so // they are probably okay. return (codePoint >= 0x370 && codePoint <= 0x3FF) || (codePoint >= 0x1F00 && codePoint <= 0x1FFF) @@ -214,14 +214,14 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { // If the word is in there as is, then it's in the dictionary. If not, we'll test lower // case versions, but only if the word is not already all-lower case or mixed case. if (dict.isValidWord(text)) return true; - if (AndroidSpellCheckerService.CAPITALIZE_NONE == capitalizeType) return false; + if (StringUtils.CAPITALIZE_NONE == capitalizeType) return false; // If we come here, we have a capitalized word (either First- or All-). // Downcase the word and look it up again. If the word is only capitalized, we // tested all possibilities, so if it's still negative we can return false. final String lowerCaseText = text.toLowerCase(mLocale); if (dict.isValidWord(lowerCaseText)) return true; - if (AndroidSpellCheckerService.CAPITALIZE_FIRST == capitalizeType) return false; + if (StringUtils.CAPITALIZE_FIRST == capitalizeType) return false; // If the lower case version is not in the dictionary, it's still possible // that we have an all-caps version of a word that needs to be capitalized @@ -296,7 +296,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { } } - final int capitalizeType = AndroidSpellCheckerService.getCapitalizationType(text); + final int capitalizeType = StringUtils.getCapitalizationType(text); boolean isInDict = true; DictAndProximity dictInfo = null; try { diff --git a/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java index 9606b0352..5ce9d8e47 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/SpellCheckerSettingsFragment.java @@ -18,8 +18,10 @@ package com.android.inputmethod.latin.spellcheck; import android.os.Bundle; import android.preference.PreferenceFragment; +import android.preference.PreferenceScreen; import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.Utils; /** * Preference screen. @@ -35,5 +37,10 @@ public final class SpellCheckerSettingsFragment extends PreferenceFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); addPreferencesFromResource(R.xml.spell_checker_settings); + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + if (preferenceScreen != null) { + preferenceScreen.setTitle(Utils.getAcitivityTitleResId( + getActivity(), SpellCheckerSettingsActivity.class)); + } } } diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java index 8c3d3b08c..eeaf828a7 100644 --- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java +++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java @@ -62,6 +62,7 @@ import com.android.inputmethod.latin.LatinImeLogger; import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.ResourceUtils; import com.android.inputmethod.latin.SuggestedWords; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import com.android.inputmethod.latin.Utils; import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.research.ResearchLogger; @@ -72,7 +73,7 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick OnLongClickListener { public interface Listener { public void addWordToUserDictionary(String word); - public void pickSuggestionManually(int index, String word); + public void pickSuggestionManually(int index, SuggestedWordInfo word); } // The maximum number of suggestions available. See {@link Suggest#mPrefMaxSuggestions}. @@ -656,8 +657,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick @Override public boolean onCustomRequest(final int requestCode) { final int index = requestCode; - final String word = mSuggestedWords.getWord(index); - mListener.pickSuggestionManually(index, word); + final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index); + mListener.pickSuggestionManually(index, wordInfo); dismissMoreSuggestions(); return true; } @@ -807,8 +808,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick if (index >= mSuggestedWords.size()) return; - final String word = mSuggestedWords.getWord(index); - mListener.pickSuggestionManually(index, word); + final SuggestedWordInfo wordInfo = mSuggestedWords.getInfo(index); + mListener.pickSuggestionManually(index, wordInfo); } @Override diff --git a/java/src/com/android/inputmethod/research/BootBroadcastReceiver.java b/java/src/com/android/inputmethod/research/BootBroadcastReceiver.java index c5f095919..4f86526a7 100644 --- a/java/src/com/android/inputmethod/research/BootBroadcastReceiver.java +++ b/java/src/com/android/inputmethod/research/BootBroadcastReceiver.java @@ -25,9 +25,10 @@ import android.content.Intent; */ public final class BootBroadcastReceiver extends BroadcastReceiver { @Override - public void onReceive(Context context, Intent intent) { + public void onReceive(final Context context, final Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { - ResearchLogger.scheduleUploadingService(context); + UploaderService.cancelAndRescheduleUploadingService(context, + true /* needsRescheduling */); } } } diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java index a38a226f0..e0bd37c1e 100644 --- a/java/src/com/android/inputmethod/research/ResearchLogger.java +++ b/java/src/com/android/inputmethod/research/ResearchLogger.java @@ -20,16 +20,13 @@ import static com.android.inputmethod.latin.Constants.Subtype.ExtraValue.KEYBOAR import android.accounts.Account; import android.accounts.AccountManager; -import android.app.AlarmManager; import android.app.AlertDialog; import android.app.Dialog; -import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; @@ -74,22 +71,16 @@ import com.android.inputmethod.latin.SuggestedWords; import com.android.inputmethod.latin.define.ProductionFlag; import com.android.inputmethod.research.MotionEventReader.ReplayData; -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.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; -import java.util.Locale; import java.util.Random; -import java.util.UUID; /** * Logs the use of the LatinIME keyboard. @@ -254,7 +245,8 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang mUploadNowIntent = new Intent(mLatinIME, UploaderService.class); mUploadNowIntent.putExtra(UploaderService.EXTRA_UPLOAD_UNCONDITIONALLY, true); if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { - scheduleUploadingService(mLatinIME); + UploaderService.cancelAndRescheduleUploadingService(mLatinIME, + true /* needsRescheduling */); } mReplayer.setKeyboardSwitcher(keyboardSwitcher); } @@ -268,25 +260,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang ResearchSettings.writeResearchLastDirCleanupTime(mPrefs, now); } - /** - * Arrange for the UploaderService to be run on a regular basis. - * - * Any existing scheduled invocation of UploaderService is removed and rescheduled. This may - * cause problems if this method is called often and frequent updates are required, but since - * the user will likely be sleeping at some point, if the interval is less that the expected - * sleep duration and this method is not called during that time, the service should be invoked - * at some point. - */ - public static void scheduleUploadingService(Context context) { - final Intent intent = new Intent(context, UploaderService.class); - final PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0); - final AlarmManager manager = - (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - manager.cancel(pendingIntent); - manager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, - UploaderService.RUN_INTERVAL, UploaderService.RUN_INTERVAL, pendingIntent); - } - public void mainKeyboardView_onAttachedToWindow(final MainKeyboardView mainKeyboardView) { mMainKeyboardView = mainKeyboardView; maybeShowSplashScreen(); @@ -790,8 +763,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } private boolean isAllowedToLog() { - return !mIsPasswordView && !mIsLoggingSuspended && sIsLogging && !mInFeedbackDialog - && !isReplaying(); + return !mIsPasswordView && !mIsLoggingSuspended && sIsLogging && !mInFeedbackDialog; } public void requestIndicatorRedraw() { @@ -1122,10 +1094,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } } - public void latinIME_onFinishInputViewInternal() { - stop(); - } - /** * Log a change in preferences. * @@ -1208,16 +1176,22 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } /** - * Log a call to LatinIME.onWindowHidden(). + * 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_ONWINDOWHIDDEN = - new LogStatement("LatinIMEOnWindowHidden", false, false, "isTextTruncated", "text"); - public static void latinIME_onWindowHidden(final int savedSelectionStart, - final int savedSelectionEnd, final InputConnection ic) { - if (ic != null) { + private static final LogStatement LOGSTATEMENT_LATINIME_ONFINISHINPUTVIEWINTERNAL = + new LogStatement("LatinIMEOnFinishInputViewInternal", false, false, "isTextTruncated", + "text"); + public static void latinIME_onFinishInputViewInternal(final boolean finishingInput, + final int savedSelectionStart, final int savedSelectionEnd, final InputConnection ic) { + // The finishingInput flag is set in InputMethodService. It is true if called from + // doFinishInput(), which can be called as part of doStartInput(). This can happen at times + // when the IME is not closing, such as when powering up. The finishinInput flag is false + // if called from finishViews(), which is called from hideWindow() and onDestroy(). These + // are the situations in which we want to finish up the researchLog. + if (ic != null && !finishingInput) { final boolean isTextTruncated; final String text; if (LOG_FULL_TEXTVIEW_CONTENTS) { @@ -1261,8 +1235,8 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang // 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_ONWINDOWHIDDEN, isTextTruncated, - text); + researchLogger.enqueueEvent(LOGSTATEMENT_LATINIME_ONFINISHINPUTVIEWINTERNAL, + isTextTruncated, text); researchLogger.commitCurrentLogUnit(); getInstance().stop(); } @@ -1634,8 +1608,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang final String scrubbedAutoCorrection = scrubDigitsFromString(autoCorrection); final ResearchLogger researchLogger = getInstance(); researchLogger.mCurrentLogUnit.initializeSuggestions(suggestedWords); - researchLogger.commitCurrentLogUnitAsWord(scrubbedAutoCorrection, Long.MAX_VALUE, - isBatchMode); + 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 diff --git a/java/src/com/android/inputmethod/research/UploaderService.java b/java/src/com/android/inputmethod/research/UploaderService.java index 6a9f5c1f4..6a9717b7c 100644 --- a/java/src/com/android/inputmethod/research/UploaderService.java +++ b/java/src/com/android/inputmethod/research/UploaderService.java @@ -18,6 +18,8 @@ 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; @@ -43,11 +45,17 @@ public final class UploaderService extends IntentService { @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) { @@ -57,4 +65,42 @@ public final class UploaderService extends IntentService { } 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 PendingIntent pendingIntent = getPendingIntentForService(context); + final AlarmManager alarmManager = (AlarmManager) context.getSystemService( + Context.ALARM_SERVICE); + cancelAnyScheduledServiceAlarm(alarmManager, pendingIntent); + if (needsRescheduling) { + scheduleServiceAlarm(alarmManager, pendingIntent); + } + } + + private static PendingIntent getPendingIntentForService(final Context context) { + final Intent intent = new Intent(context, UploaderService.class); + return PendingIntent.getService(context, 0, intent, 0); + } + + private static void cancelAnyScheduledServiceAlarm(final AlarmManager alarmManager, + final PendingIntent pendingIntent) { + alarmManager.cancel(pendingIntent); + } + + private static void scheduleServiceAlarm(final AlarmManager alarmManager, + final PendingIntent pendingIntent) { + alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, UploaderService.RUN_INTERVAL, + pendingIntent); + } } diff --git a/native/jni/Android.mk b/native/jni/Android.mk index 3735ec07b..cbe9515fe 100644 --- a/native/jni/Android.mk +++ b/native/jni/Android.mk @@ -24,15 +24,14 @@ FLAG_DO_PROFILE ?= false include $(CLEAR_VARS) LATIN_IME_SRC_DIR := src -LATIN_IME_SRC_FULLPATH_DIR := $(LOCAL_PATH)/$(LATIN_IME_SRC_DIR) -LOCAL_C_INCLUDES += $(LATIN_IME_SRC_FULLPATH_DIR) $(LATIN_IME_SRC_FULLPATH_DIR)/suggest +LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(LATIN_IME_SRC_DIR) LOCAL_CFLAGS += -Werror -Wall -Wextra -Weffc++ -Wformat=2 -Wcast-qual -Wcast-align \ -Wwrite-strings -Wfloat-equal -Wpointer-arith -Winit-self -Wredundant-decls -Wno-system-headers ifeq ($(TARGET_ARCH), arm) -ifneq ($(TARGET_GCC_VERSION), 4.7) +ifeq ($(TARGET_GCC_VERSION), 4.6) LOCAL_CFLAGS += -Winline endif # TARGET_GCC_VERSION endif # TARGET_ARCH @@ -53,14 +52,27 @@ LATIN_IME_CORE_SRC_FILES := \ correction.cpp \ dictionary.cpp \ dic_traverse_wrapper.cpp \ + digraph_utils.cpp \ proximity_info.cpp \ proximity_info_params.cpp \ proximity_info_state.cpp \ proximity_info_state_utils.cpp \ unigram_dictionary.cpp \ words_priority_queue.cpp \ - suggest/gesture_suggest.cpp \ - suggest/typing_suggest.cpp + suggest/core/suggest.cpp \ + $(addprefix suggest/core/dicnode/, \ + dic_node.cpp \ + dic_node_utils.cpp \ + dic_nodes_cache.cpp) \ + suggest/core/policy/weighting.cpp \ + suggest/core/session/dic_traverse_session.cpp \ + suggest/policyimpl/gesture/gesture_suggest_policy_factory.cpp \ + $(addprefix suggest/policyimpl/typing/, \ + scoring_params.cpp \ + typing_scoring.cpp \ + typing_suggest_policy.cpp \ + typing_traversal.cpp \ + typing_weighting.cpp) LOCAL_SRC_FILES := \ $(LATIN_IME_JNI_SRC_FILES) \ @@ -115,6 +127,4 @@ include $(BUILD_SHARED_LIBRARY) #################### Clean up the tmp vars LATIN_IME_CORE_SRC_FILES := LATIN_IME_JNI_SRC_FILES := -LATIN_IME_GESTURE_IMPL_SRC_FILES := LATIN_IME_SRC_DIR := -LATIN_IME_SRC_FULLPATH_DIR := diff --git a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp index 30ca3f1b8..3c482ca58 100644 --- a/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp +++ b/native/jni/com_android_inputmethod_keyboard_ProximityInfo.cpp @@ -43,9 +43,12 @@ static void latinime_Keyboard_release(JNIEnv *env, jclass clazz, jlong proximity } static JNINativeMethod sMethods[] = { - {"setProximityInfoNative", "(Ljava/lang/String;IIIII[II[I[I[I[I[I[F[F[F)J", - reinterpret_cast<void *>(latinime_Keyboard_setProximityInfo)}, - {"releaseProximityInfoNative", "(J)V", reinterpret_cast<void *>(latinime_Keyboard_release)} + {const_cast<char *>("setProximityInfoNative"), + const_cast<char *>("(Ljava/lang/String;IIIII[II[I[I[I[I[I[F[F[F)J"), + reinterpret_cast<void *>(latinime_Keyboard_setProximityInfo)}, + {const_cast<char *>("releaseProximityInfoNative"), + const_cast<char *>("(J)V"), + reinterpret_cast<void *>(latinime_Keyboard_release)} }; int register_ProximityInfo(JNIEnv *env) { diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index 9321c4b8c..11fa3da3a 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -280,19 +280,27 @@ static void releaseDictBuf(const void *dictBuf, const size_t length, const int f } static JNINativeMethod sMethods[] = { - {"openNative", "(Ljava/lang/String;JJ)J", - reinterpret_cast<void *>(latinime_BinaryDictionary_open)}, - {"closeNative", "(J)V", reinterpret_cast<void *>(latinime_BinaryDictionary_close)}, - {"getSuggestionsNative", "(JJJ[I[I[I[I[IIIZ[IZ[I[I[I[I)I", - reinterpret_cast<void *>(latinime_BinaryDictionary_getSuggestions)}, - {"getProbabilityNative", "(J[I)I", - reinterpret_cast<void *>(latinime_BinaryDictionary_getProbability)}, - {"isValidBigramNative", "(J[I[I)Z", - reinterpret_cast<void *>(latinime_BinaryDictionary_isValidBigram)}, - {"calcNormalizedScoreNative", "([I[II)F", - reinterpret_cast<void *>(latinime_BinaryDictionary_calcNormalizedScore)}, - {"editDistanceNative", "([I[I)I", - reinterpret_cast<void *>(latinime_BinaryDictionary_editDistance)} + {const_cast<char *>("openNative"), + const_cast<char *>("(Ljava/lang/String;JJ)J"), + reinterpret_cast<void *>(latinime_BinaryDictionary_open)}, + {const_cast<char *>("closeNative"), + const_cast<char *>("(J)V"), + reinterpret_cast<void *>(latinime_BinaryDictionary_close)}, + {const_cast<char *>("getSuggestionsNative"), + const_cast<char *>("(JJJ[I[I[I[I[IIIZ[IZ[I[I[I[I)I"), + reinterpret_cast<void *>(latinime_BinaryDictionary_getSuggestions)}, + {const_cast<char *>("getProbabilityNative"), + const_cast<char *>("(J[I)I"), + reinterpret_cast<void *>(latinime_BinaryDictionary_getProbability)}, + {const_cast<char *>("isValidBigramNative"), + const_cast<char *>("(J[I[I)Z"), + reinterpret_cast<void *>(latinime_BinaryDictionary_isValidBigram)}, + {const_cast<char *>("calcNormalizedScoreNative"), + const_cast<char *>("([I[II)F"), + reinterpret_cast<void *>(latinime_BinaryDictionary_calcNormalizedScore)}, + {const_cast<char *>("editDistanceNative"), + const_cast<char *>("([I[I)I"), + reinterpret_cast<void *>(latinime_BinaryDictionary_editDistance)} }; int register_BinaryDictionary(JNIEnv *env) { diff --git a/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp b/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp index 9b39245b9..dfe3b09d8 100644 --- a/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp +++ b/native/jni/com_android_inputmethod_latin_DicTraverseSession.cpp @@ -48,12 +48,15 @@ static void latinime_releaseDicTraverseSession(JNIEnv *env, jclass clazz, jlong } static JNINativeMethod sMethods[] = { - {"setDicTraverseSessionNative", "(Ljava/lang/String;)J", - reinterpret_cast<void *>(latinime_setDicTraverseSession)}, - {"initDicTraverseSessionNative", "(JJ[II)V", - reinterpret_cast<void *>(latinime_initDicTraverseSession)}, - {"releaseDicTraverseSessionNative", "(J)V", - reinterpret_cast<void *>(latinime_releaseDicTraverseSession)} + {const_cast<char *>("setDicTraverseSessionNative"), + const_cast<char *>("(Ljava/lang/String;)J"), + reinterpret_cast<void *>(latinime_setDicTraverseSession)}, + {const_cast<char *>("initDicTraverseSessionNative"), + const_cast<char *>("(JJ[II)V"), + reinterpret_cast<void *>(latinime_initDicTraverseSession)}, + {const_cast<char *>("releaseDicTraverseSessionNative"), + const_cast<char *>("(J)V"), + reinterpret_cast<void *>(latinime_releaseDicTraverseSession)} }; int register_DicTraverseSession(JNIEnv *env) { diff --git a/native/jni/jni_common.cpp b/native/jni/jni_common.cpp index 1ea204102..8e5c50880 100644 --- a/native/jni/jni_common.cpp +++ b/native/jni/jni_common.cpp @@ -16,12 +16,12 @@ #define LOG_TAG "LatinIME: jni" +#include "jni_common.h" + #include "com_android_inputmethod_keyboard_ProximityInfo.h" #include "com_android_inputmethod_latin_BinaryDictionary.h" #include "com_android_inputmethod_latin_DicTraverseSession.h" #include "defines.h" -#include "jni.h" -#include "jni_common.h" /* * Returns the JNI version on success, -1 on failure. diff --git a/native/jni/src/bigram_dictionary.cpp b/native/jni/src/bigram_dictionary.cpp index 43e59a262..92890383a 100644 --- a/native/jni/src/bigram_dictionary.cpp +++ b/native/jni/src/bigram_dictionary.cpp @@ -39,7 +39,7 @@ BigramDictionary::~BigramDictionary() { void BigramDictionary::addWordBigram(int *word, int length, int probability, int *bigramProbability, int *bigramCodePoints, int *outputTypes) const { word[length] = 0; - if (DEBUG_DICT) { + if (DEBUG_DICT_FULL) { #ifdef FLAG_DBG char s[length + 1]; for (int i = 0; i <= length; i++) s[i] = static_cast<char>(word[i]); @@ -57,7 +57,7 @@ void BigramDictionary::addWordBigram(int *word, int length, int probability, int } insertAt++; } - if (DEBUG_DICT) { + if (DEBUG_DICT_FULL) { AKLOGI("Bigram: InsertAt -> %d MAX_RESULTS: %d", insertAt, MAX_RESULTS); } if (insertAt >= MAX_RESULTS) { @@ -76,7 +76,7 @@ void BigramDictionary::addWordBigram(int *word, int length, int probability, int *dest++ = *word++; } *dest = 0; // NULL terminate - if (DEBUG_DICT) { + if (DEBUG_DICT_FULL) { AKLOGI("Bigram: Added word at %d", insertAt); } } diff --git a/native/jni/src/correction.cpp b/native/jni/src/correction.cpp index 671507ee0..76234f840 100644 --- a/native/jni/src/correction.cpp +++ b/native/jni/src/correction.cpp @@ -954,7 +954,13 @@ inline static int editDistanceInternal(int *editDistanceTable, const int *before // In dictionary.cpp, getSuggestion() method, -// suggestion scores are computed using the below formula. +// When USE_SUGGEST_INTERFACE_FOR_TYPING is true: +// SUGGEST_INTERFACE_OUTPUT_SCALE was multiplied to the original suggestion scores to convert +// them to integers. +// score = (int)((original score) * SUGGEST_INTERFACE_OUTPUT_SCALE) +// Undo the scaling here to recover the original score. +// normalizedScore = ((float)score) / SUGGEST_INTERFACE_OUTPUT_SCALE +// Otherwise: suggestion scores are computed using the below formula. // original score // := powf(mTypedLetterMultiplier (this is defined 2), // (the number of matched characters between typed word and suggested word)) @@ -991,16 +997,20 @@ inline static int editDistanceInternal(int *editDistanceTable, const int *before return 0.0f; } + // add a weight based on edit distance. + // distance <= max(afterLength, beforeLength) == afterLength, + // so, 0 <= distance / afterLength <= 1 + const float weight = 1.0f - static_cast<float>(distance) / static_cast<float>(afterLength); + + if (USE_SUGGEST_INTERFACE_FOR_TYPING) { + return (static_cast<float>(score) / SUGGEST_INTERFACE_OUTPUT_SCALE) * weight; + } const float maxScore = score >= S_INT_MAX ? static_cast<float>(S_INT_MAX) : static_cast<float>(MAX_INITIAL_SCORE) * powf(static_cast<float>(TYPED_LETTER_MULTIPLIER), static_cast<float>(min(beforeLength, afterLength - spaceCount))) * static_cast<float>(FULL_WORD_MULTIPLIER); - // add a weight based on edit distance. - // distance <= max(afterLength, beforeLength) == afterLength, - // so, 0 <= distance / afterLength <= 1 - const float weight = 1.0f - static_cast<float>(distance) / static_cast<float>(afterLength); return (static_cast<float>(score) / maxScore) * weight; } } // namespace latinime diff --git a/native/jni/src/correction.h b/native/jni/src/correction.h index f0d62102f..a9e9b48a6 100644 --- a/native/jni/src/correction.h +++ b/native/jni/src/correction.h @@ -307,7 +307,7 @@ inline void Correction::startToTraverseAllNodes() { mNeedsToTraverseAllNodes = true; } -inline bool Correction::isSingleQuote(const int c) { +AK_FORCE_INLINE bool Correction::isSingleQuote(const int c) { const int userTypedChar = mProximityInfoState.getPrimaryCodePointAt(mInputIndex); return (c == KEYCODE_SINGLE_QUOTE && userTypedChar != KEYCODE_SINGLE_QUOTE); } diff --git a/native/jni/src/defines.h b/native/jni/src/defines.h index 6e098157d..a45691261 100644 --- a/native/jni/src/defines.h +++ b/native/jni/src/defines.h @@ -287,6 +287,7 @@ static inline void prof_out(void) { #define CALIBRATE_SCORE_BY_TOUCH_COORDINATES true #define SUGGEST_MULTIPLE_WORDS true +#define USE_SUGGEST_INTERFACE_FOR_TYPING true #define SUGGEST_INTERFACE_OUTPUT_SCALE 1000000.0f // The following "rate"s are used as a multiplier before dividing by 100, so they are in percent. diff --git a/native/jni/src/dictionary.cpp b/native/jni/src/dictionary.cpp index 6deab36b6..c998c0676 100644 --- a/native/jni/src/dictionary.cpp +++ b/native/jni/src/dictionary.cpp @@ -16,14 +16,18 @@ #define LOG_TAG "LatinIME: dictionary.cpp" +#include "dictionary.h" + +#include <map> // TODO: remove #include <stdint.h> #include "bigram_dictionary.h" #include "binary_format.h" #include "defines.h" -#include "dictionary.h" #include "dic_traverse_wrapper.h" -#include "gesture_suggest.h" +#include "suggest/core/suggest.h" +#include "suggest/policyimpl/gesture/gesture_suggest_policy_factory.h" +#include "suggest/policyimpl/typing/typing_suggest_policy_factory.h" #include "unigram_dictionary.h" namespace latinime { @@ -34,13 +38,15 @@ Dictionary::Dictionary(void *dict, int dictSize, int mmapFd, int dictBufAdjust) mDictSize(dictSize), mMmapFd(mmapFd), mDictBufAdjust(dictBufAdjust), mUnigramDictionary(new UnigramDictionary(mOffsetDict, BinaryFormat::getFlags(mDict))), mBigramDictionary(new BigramDictionary(mOffsetDict)), - mGestureSuggest(new GestureSuggest()) { + mGestureSuggest(new Suggest(GestureSuggestPolicyFactory::getGestureSuggestPolicy())), + mTypingSuggest(new Suggest(TypingSuggestPolicyFactory::getTypingSuggestPolicy())) { } Dictionary::~Dictionary() { delete mUnigramDictionary; delete mBigramDictionary; delete mGestureSuggest; + delete mTypingSuggest; } int Dictionary::getSuggestions(ProximityInfo *proximityInfo, void *traverseSession, @@ -60,14 +66,26 @@ int Dictionary::getSuggestions(ProximityInfo *proximityInfo, void *traverseSessi } return result; } else { - std::map<int, int> bigramMap; - uint8_t bigramFilter[BIGRAM_FILTER_BYTE_SIZE]; - mBigramDictionary->fillBigramAddressToProbabilityMapAndFilter(prevWordCodePoints, - prevWordLength, &bigramMap, bigramFilter); - result = mUnigramDictionary->getSuggestions(proximityInfo, xcoordinates, ycoordinates, - inputCodePoints, inputSize, &bigramMap, bigramFilter, useFullEditDistance, outWords, - frequencies, outputTypes); - return result; + if (USE_SUGGEST_INTERFACE_FOR_TYPING) { + DicTraverseWrapper::initDicTraverseSession( + traverseSession, this, prevWordCodePoints, prevWordLength); + result = mTypingSuggest->getSuggestions(proximityInfo, traverseSession, xcoordinates, + ycoordinates, times, pointerIds, inputCodePoints, inputSize, commitPoint, + outWords, frequencies, spaceIndices, outputTypes); + if (DEBUG_DICT) { + DUMP_RESULT(outWords, frequencies); + } + return result; + } else { + std::map<int, int> bigramMap; + uint8_t bigramFilter[BIGRAM_FILTER_BYTE_SIZE]; + mBigramDictionary->fillBigramAddressToProbabilityMapAndFilter(prevWordCodePoints, + prevWordLength, &bigramMap, bigramFilter); + result = mUnigramDictionary->getSuggestions(proximityInfo, xcoordinates, ycoordinates, + inputCodePoints, inputSize, &bigramMap, bigramFilter, useFullEditDistance, + outWords, frequencies, outputTypes); + return result; + } } } @@ -85,4 +103,9 @@ int Dictionary::getProbability(const int *word, int length) const { bool Dictionary::isValidBigram(const int *word1, int length1, const int *word2, int length2) const { return mBigramDictionary->isValidBigram(word1, length1, word2, length2); } + +int Dictionary::getDictFlags() const { + return mUnigramDictionary->getDictFlags(); +} + } // namespace latinime diff --git a/native/jni/src/dictionary.h b/native/jni/src/dictionary.h index 449b95ab6..0653d3ca9 100644 --- a/native/jni/src/dictionary.h +++ b/native/jni/src/dictionary.h @@ -63,6 +63,7 @@ class Dictionary { int getDictSize() const { return mDictSize; } int getMmapFd() const { return mMmapFd; } int getDictBufAdjust() const { return mDictBufAdjust; } + int getDictFlags() const; virtual ~Dictionary(); private: @@ -79,6 +80,7 @@ class Dictionary { const UnigramDictionary *mUnigramDictionary; const BigramDictionary *mBigramDictionary; SuggestInterface *mGestureSuggest; + SuggestInterface *mTypingSuggest; }; } // namespace latinime #endif // LATINIME_DICTIONARY_H diff --git a/native/jni/src/digraph_utils.cpp b/native/jni/src/digraph_utils.cpp new file mode 100644 index 000000000..8781c5077 --- /dev/null +++ b/native/jni/src/digraph_utils.cpp @@ -0,0 +1,93 @@ +/* + * 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. + */ + +#include "binary_format.h" +#include "defines.h" +#include "digraph_utils.h" + +namespace latinime { + +const DigraphUtils::digraph_t DigraphUtils::GERMAN_UMLAUT_DIGRAPHS[] = + { { 'a', 'e', 0x00E4 }, // U+00E4 : LATIN SMALL LETTER A WITH DIAERESIS + { 'o', 'e', 0x00F6 }, // U+00F6 : LATIN SMALL LETTER O WITH DIAERESIS + { 'u', 'e', 0x00FC } }; // U+00FC : LATIN SMALL LETTER U WITH DIAERESIS +const DigraphUtils::digraph_t DigraphUtils::FRENCH_LIGATURES_DIGRAPHS[] = + { { 'a', 'e', 0x00E6 }, // U+00E6 : LATIN SMALL LETTER AE + { 'o', 'e', 0x0153 } }; // U+0153 : LATIN SMALL LIGATURE OE + +/* static */ bool DigraphUtils::hasDigraphForCodePoint( + const int dictFlags, const int compositeGlyphCodePoint) { + if (DigraphUtils::getDigraphForCodePoint(dictFlags, compositeGlyphCodePoint)) { + return true; + } + return false; +} + +// Retrieves the set of all digraphs associated with the given dictionary. +// Returns the size of the digraph array, or 0 if none exist. +/* static */ int DigraphUtils::getAllDigraphsForDictionaryAndReturnSize( + const int dictFlags, const DigraphUtils::digraph_t **digraphs) { + if (BinaryFormat::REQUIRES_GERMAN_UMLAUT_PROCESSING & dictFlags) { + *digraphs = DigraphUtils::GERMAN_UMLAUT_DIGRAPHS; + return NELEMS(DigraphUtils::GERMAN_UMLAUT_DIGRAPHS); + } + if (BinaryFormat::REQUIRES_FRENCH_LIGATURES_PROCESSING & dictFlags) { + *digraphs = DigraphUtils::FRENCH_LIGATURES_DIGRAPHS; + return NELEMS(DigraphUtils::FRENCH_LIGATURES_DIGRAPHS); + } + return 0; +} + +// Returns the digraph codepoint for the given composite glyph codepoint and digraph codepoint index +// (which specifies the first or second codepoint in the digraph). +/* static */ int DigraphUtils::getDigraphCodePointForIndex(const int dictFlags, + const int compositeGlyphCodePoint, const DigraphCodePointIndex digraphCodePointIndex) { + if (digraphCodePointIndex == NOT_A_DIGRAPH_INDEX) { + return NOT_A_CODE_POINT; + } + const DigraphUtils::digraph_t *digraph = + DigraphUtils::getDigraphForCodePoint(dictFlags, compositeGlyphCodePoint); + if (!digraph) { + return NOT_A_CODE_POINT; + } + if (digraphCodePointIndex == FIRST_DIGRAPH_CODEPOINT) { + return digraph->first; + } else if (digraphCodePointIndex == SECOND_DIGRAPH_CODEPOINT) { + return digraph->second; + } + ASSERT(false); + return NOT_A_CODE_POINT; +} + +/** + * Returns the digraph for the input composite glyph codepoint, or 0 if none exists. + * dictFlags: the dictionary flags needed to determine which digraphs are supported. + * compositeGlyphCodePoint: the method returns the digraph corresponding to this codepoint. + */ +/* static */ const DigraphUtils::digraph_t *DigraphUtils::getDigraphForCodePoint( + const int dictFlags, const int compositeGlyphCodePoint) { + const DigraphUtils::digraph_t *digraphs = 0; + const int digraphsSize = + DigraphUtils::getAllDigraphsForDictionaryAndReturnSize(dictFlags, &digraphs); + for (int i = 0; i < digraphsSize; i++) { + if (digraphs[i].compositeGlyph == compositeGlyphCodePoint) { + return &digraphs[i]; + } + } + return 0; +} + +} // namespace latinime diff --git a/native/jni/src/digraph_utils.h b/native/jni/src/digraph_utils.h new file mode 100644 index 000000000..6e364b67a --- /dev/null +++ b/native/jni/src/digraph_utils.h @@ -0,0 +1,47 @@ +/* + * 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. + */ + +#ifndef DIGRAPH_UTILS_H +#define DIGRAPH_UTILS_H + +namespace latinime { + +class DigraphUtils { + public: + typedef enum { + NOT_A_DIGRAPH_INDEX, + FIRST_DIGRAPH_CODEPOINT, + SECOND_DIGRAPH_CODEPOINT + } DigraphCodePointIndex; + + typedef struct { int first; int second; int compositeGlyph; } digraph_t; + + static bool hasDigraphForCodePoint(const int dictFlags, const int compositeGlyphCodePoint); + static int getAllDigraphsForDictionaryAndReturnSize( + const int dictFlags, const digraph_t **digraphs); + static int getDigraphCodePointForIndex(const int dictFlags, const int compositeGlyphCodePoint, + const DigraphCodePointIndex digraphCodePointIndex); + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(DigraphUtils); + static const digraph_t *getDigraphForCodePoint( + const int dictFlags, const int compositeGlyphCodePoint); + + static const digraph_t GERMAN_UMLAUT_DIGRAPHS[]; + static const digraph_t FRENCH_LIGATURES_DIGRAPHS[]; +}; +} // namespace latinime +#endif // DIGRAPH_UTILS_H diff --git a/native/jni/src/proximity_info.cpp b/native/jni/src/proximity_info.cpp index 74b5e0131..50f38e82e 100644 --- a/native/jni/src/proximity_info.cpp +++ b/native/jni/src/proximity_info.cpp @@ -129,7 +129,7 @@ bool ProximityInfo::hasSpaceProximity(const int x, const int y) const { } float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloatG( - const int keyId, const int x, const int y) const { + const int keyId, const int x, const int y, const float verticalScale) const { const bool correctTouchPosition = hasTouchPositionCorrectionData(); const float centerX = static_cast<float>(correctTouchPosition ? getSweetSpotCenterXAt(keyId) : getKeyCenterXOfKeyIdG(keyId)); @@ -138,7 +138,7 @@ float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloatG( if (correctTouchPosition) { const float sweetSpotCenterY = static_cast<float>(getSweetSpotCenterYAt(keyId)); const float gapY = sweetSpotCenterY - visualKeyCenterY; - centerY = visualKeyCenterY + gapY * ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G; + centerY = visualKeyCenterY + gapY * verticalScale; } else { centerY = visualKeyCenterY; } diff --git a/native/jni/src/proximity_info.h b/native/jni/src/proximity_info.h index 57a175d2c..e21262fdb 100644 --- a/native/jni/src/proximity_info.h +++ b/native/jni/src/proximity_info.h @@ -39,7 +39,8 @@ class ProximityInfo { bool hasSpaceProximity(const int x, const int y) const; int getNormalizedSquaredDistance(const int inputIndex, const int proximityIndex) const; float getNormalizedSquaredDistanceFromCenterFloatG( - const int keyId, const int x, const int y) const; + const int keyId, const int x, const int y, + const float verticalScale) const; bool sameAsTyped(const unsigned short *word, int length) const; int getCodePointOf(const int keyIndex) const; bool hasSweetSpotData(const int keyIndex) const { diff --git a/native/jni/src/proximity_info_params.cpp b/native/jni/src/proximity_info_params.cpp index f9a4352ee..2675d9e70 100644 --- a/native/jni/src/proximity_info_params.cpp +++ b/native/jni/src/proximity_info_params.cpp @@ -20,7 +20,8 @@ namespace latinime { const float ProximityInfoParams::NOT_A_DISTANCE_FLOAT = -1.0f; const int ProximityInfoParams::MIN_DOUBLE_LETTER_BEELINE_SPEED_PERCENTILE = 5; -const float ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G = 1.1f; +const float ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE = 1.0f; +const float ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G = 0.5f; /* Per method constants */ // Used by ProximityInfoStateUtils::initGeometricDistanceInfos() diff --git a/native/jni/src/proximity_info_params.h b/native/jni/src/proximity_info_params.h index e7aec0976..4e47f7308 100644 --- a/native/jni/src/proximity_info_params.h +++ b/native/jni/src/proximity_info_params.h @@ -25,6 +25,7 @@ class ProximityInfoParams { public: static const float NOT_A_DISTANCE_FLOAT; static const int MIN_DOUBLE_LETTER_BEELINE_SPEED_PERCENTILE; + static const float VERTICAL_SWEET_SPOT_SCALE; static const float VERTICAL_SWEET_SPOT_SCALE_G; // Used by ProximityInfoStateUtils::initGeometricDistanceInfos() diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp index 7fcfd5dc8..a10b260e1 100644 --- a/native/jni/src/proximity_info_state.cpp +++ b/native/jni/src/proximity_info_state.cpp @@ -28,16 +28,19 @@ namespace latinime { +// TODO: Remove the dependency of "isGeometric" void ProximityInfoState::initInputParams(const int pointerId, const float maxPointToKeyLength, const ProximityInfo *proximityInfo, const int *const inputCodes, const int inputSize, const int *const xCoordinates, const int *const yCoordinates, const int *const times, const int *const pointerIds, const bool isGeometric) { ASSERT(isGeometric || (inputSize < MAX_WORD_LENGTH)); - mIsContinuationPossible = ProximityInfoStateUtils::checkAndReturnIsContinuationPossible( - inputSize, xCoordinates, yCoordinates, times, mSampledInputSize, &mSampledInputXs, - &mSampledInputYs, &mSampledTimes, &mSampledInputIndice); + mIsContinuousSuggestionPossible = + ProximityInfoStateUtils::checkAndReturnIsContinuousSuggestionPossible( + inputSize, xCoordinates, yCoordinates, times, mSampledInputSize, + &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledInputIndice); if (DEBUG_DICT) { - AKLOGI("isContinuationPossible = %s", (mIsContinuationPossible ? "true" : "false")); + AKLOGI("isContinuousSuggestionPossible = %s", + (mIsContinuousSuggestionPossible ? "true" : "false")); } mProximityInfo = proximityInfo; @@ -64,7 +67,7 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi mSampledInputSize = 0; mMostProbableStringProbability = 0.0f; - if (mIsContinuationPossible && mSampledInputIndice.size() > 1) { + if (mIsContinuousSuggestionPossible && mSampledInputIndice.size() > 1) { // Just update difference. // Previous two points are never skipped. Thus, we pop 2 input point data here. pushTouchPointStartIndex = ProximityInfoStateUtils::trimLastTwoTouchPoints( @@ -92,12 +95,17 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi pushTouchPointStartIndex, lastSavedInputSize); } + // TODO: Remove the dependency of "isGeometric" + const float verticalSweetSpotScale = isGeometric + ? ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE_G + : ProximityInfoParams::VERTICAL_SWEET_SPOT_SCALE; + if (xCoordinates && yCoordinates) { mSampledInputSize = ProximityInfoStateUtils::updateTouchPoints(mProximityInfo, mMaxPointToKeyLength, mInputProximities, xCoordinates, yCoordinates, times, - pointerIds, inputSize, isGeometric, pointerId, pushTouchPointStartIndex, - &mSampledInputXs, &mSampledInputYs, &mSampledTimes, &mSampledLengthCache, - &mSampledInputIndice); + pointerIds, verticalSweetSpotScale, inputSize, isGeometric, pointerId, + pushTouchPointStartIndex, &mSampledInputXs, &mSampledInputYs, &mSampledTimes, + &mSampledLengthCache, &mSampledInputIndice); } if (mSampledInputSize > 0 && isGeometric) { @@ -113,8 +121,8 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi if (mSampledInputSize > 0) { ProximityInfoStateUtils::initGeometricDistanceInfos(mProximityInfo, mSampledInputSize, - lastSavedInputSize, &mSampledInputXs, &mSampledInputYs, &mSampledNearKeySets, - &mSampledDistanceCache_G); + lastSavedInputSize, verticalSweetSpotScale, &mSampledInputXs, &mSampledInputYs, + &mSampledNearKeySets, &mSampledDistanceCache_G); if (isGeometric) { // updates probabilities of skipping or mapping each key for all points. ProximityInfoStateUtils::updateAlignPointProbabilities( diff --git a/native/jni/src/proximity_info_state.h b/native/jni/src/proximity_info_state.h index 224240b00..9bba751d0 100644 --- a/native/jni/src/proximity_info_state.h +++ b/native/jni/src/proximity_info_state.h @@ -47,12 +47,12 @@ class ProximityInfoState { : mProximityInfo(0), mMaxPointToKeyLength(0.0f), mAverageSpeed(0.0f), mHasTouchPositionCorrectionData(false), mMostCommonKeyWidthSquare(0), mKeyCount(0), mCellHeight(0), mCellWidth(0), mGridHeight(0), mGridWidth(0), - mIsContinuationPossible(false), mSampledInputXs(), mSampledInputYs(), mSampledTimes(), - mSampledInputIndice(), mSampledLengthCache(), mBeelineSpeedPercentiles(), - mSampledDistanceCache_G(), mSpeedRates(), mDirections(), mCharProbabilities(), - mSampledNearKeySets(), mSampledSearchKeySets(), mSampledSearchKeyVectors(), - mTouchPositionCorrectionEnabled(false), mSampledInputSize(0), - mMostProbableStringProbability(0.0f) { + mIsContinuousSuggestionPossible(false), mSampledInputXs(), mSampledInputYs(), + mSampledTimes(), mSampledInputIndice(), mSampledLengthCache(), + mBeelineSpeedPercentiles(), mSampledDistanceCache_G(), mSpeedRates(), mDirections(), + mCharProbabilities(), mSampledNearKeySets(), mSampledSearchKeySets(), + mSampledSearchKeyVectors(), mTouchPositionCorrectionEnabled(false), + mSampledInputSize(0), mMostProbableStringProbability(0.0f) { memset(mInputProximities, 0, sizeof(mInputProximities)); memset(mNormalizedSquaredDistances, 0, sizeof(mNormalizedSquaredDistances)); memset(mPrimaryInputWord, 0, sizeof(mPrimaryInputWord)); @@ -143,8 +143,8 @@ class ProximityInfoState { return mSampledLengthCache[index]; } - bool isContinuationPossible() const { - return mIsContinuationPossible; + bool isContinuousSuggestionPossible() const { + return mIsContinuousSuggestionPossible; } float getPointToKeyByIdLength(const int inputIndex, const int keyId) const; @@ -223,7 +223,7 @@ class ProximityInfoState { int mCellWidth; int mGridHeight; int mGridWidth; - bool mIsContinuationPossible; + bool mIsContinuousSuggestionPossible; std::vector<int> mSampledInputXs; std::vector<int> mSampledInputYs; diff --git a/native/jni/src/proximity_info_state_utils.cpp b/native/jni/src/proximity_info_state_utils.cpp index ccb28bc8c..df70cffdf 100644 --- a/native/jni/src/proximity_info_state_utils.cpp +++ b/native/jni/src/proximity_info_state_utils.cpp @@ -42,8 +42,8 @@ namespace latinime { const ProximityInfo *const proximityInfo, const int maxPointToKeyLength, const int *const inputProximities, const int *const inputXCoordinates, const int *const inputYCoordinates, const int *const times, const int *const pointerIds, - const int inputSize, const bool isGeometric, const int pointerId, - const int pushTouchPointStartIndex, std::vector<int> *sampledInputXs, + const float verticalSweetSpotScale, const int inputSize, const bool isGeometric, + const int pointerId, const int pushTouchPointStartIndex, std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs, std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache, std::vector<int> *sampledInputIndice) { if (DEBUG_SAMPLING_POINTS) { @@ -112,10 +112,10 @@ namespace latinime { } if (pushTouchPoint(proximityInfo, maxPointToKeyLength, i, c, x, y, time, - isGeometric /* doSampling */, i == lastInputIndex, sumAngle, - currentNearKeysDistances, prevNearKeysDistances, prevPrevNearKeysDistances, - sampledInputXs, sampledInputYs, sampledInputTimes, sampledLengthCache, - sampledInputIndice)) { + verticalSweetSpotScale, isGeometric /* doSampling */, i == lastInputIndex, + sumAngle, currentNearKeysDistances, prevNearKeysDistances, + prevPrevNearKeysDistances, sampledInputXs, sampledInputYs, sampledInputTimes, + sampledLengthCache, sampledInputIndice)) { // Previous point information was popped. NearKeysDistanceMap *tmp = prevNearKeysDistances; prevNearKeysDistances = currentNearKeysDistances; @@ -222,7 +222,8 @@ namespace latinime { /* static */ void ProximityInfoStateUtils::initGeometricDistanceInfos( const ProximityInfo *const proximityInfo, const int sampledInputSize, - const int lastSavedInputSize, const std::vector<int> *const sampledInputXs, + const int lastSavedInputSize, const float verticalSweetSpotScale, + const std::vector<int> *const sampledInputXs, const std::vector<int> *const sampledInputYs, std::vector<NearKeycodesSet> *SampledNearKeySets, std::vector<float> *SampledDistanceCache_G) { @@ -236,7 +237,8 @@ namespace latinime { const int x = (*sampledInputXs)[i]; const int y = (*sampledInputYs)[i]; const float normalizedSquaredDistance = - proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y); + proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG( + k, x, y, verticalSweetSpotScale); (*SampledDistanceCache_G)[index] = normalizedSquaredDistance; if (normalizedSquaredDistance < ProximityInfoParams::NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD) { @@ -354,12 +356,14 @@ namespace latinime { // the given point and the nearest key position. /* static */ float ProximityInfoStateUtils::updateNearKeysDistances( const ProximityInfo *const proximityInfo, const float maxPointToKeyLength, const int x, - const int y, NearKeysDistanceMap *const currentNearKeysDistances) { + const int y, const float verticalSweetspotScale, + NearKeysDistanceMap *const currentNearKeysDistances) { currentNearKeysDistances->clear(); const int keyCount = proximityInfo->getKeyCount(); float nearestKeyDistance = maxPointToKeyLength; for (int k = 0; k < keyCount; ++k) { - const float dist = proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y); + const float dist = proximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y, + verticalSweetspotScale); if (dist < ProximityInfoParams::NEAR_KEY_THRESHOLD_FOR_DISTANCE) { currentNearKeysDistances->insert(std::pair<int, float>(k, dist)); } @@ -439,7 +443,8 @@ namespace latinime { // Returning if previous point is popped or not. /* static */ bool ProximityInfoStateUtils::pushTouchPoint(const ProximityInfo *const proximityInfo, const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x, int y, - const int time, const bool doSampling, const bool isLastPoint, const float sumAngle, + const int time, const float verticalSweetSpotScale, const bool doSampling, + const bool isLastPoint, const float sumAngle, NearKeysDistanceMap *const currentNearKeysDistances, const NearKeysDistanceMap *const prevNearKeysDistances, const NearKeysDistanceMap *const prevPrevNearKeysDistances, @@ -451,8 +456,8 @@ namespace latinime { size_t size = sampledInputXs->size(); bool popped = false; if (nodeCodePoint < 0 && doSampling) { - const float nearest = updateNearKeysDistances( - proximityInfo, maxPointToKeyLength, x, y, currentNearKeysDistances); + const float nearest = updateNearKeysDistances(proximityInfo, maxPointToKeyLength, x, y, + verticalSweetSpotScale, currentNearKeysDistances); const float score = getPointScore(mostCommonKeyWidth, x, y, time, isLastPoint, nearest, sumAngle, currentNearKeysDistances, prevNearKeysDistances, prevPrevNearKeysDistances, sampledInputXs, sampledInputYs); @@ -968,10 +973,10 @@ namespace latinime { return true; } -/* static */ bool ProximityInfoStateUtils::checkAndReturnIsContinuationPossible(const int inputSize, - const int *const xCoordinates, const int *const yCoordinates, const int *const times, - const int sampledInputSize, const std::vector<int> *const sampledInputXs, - const std::vector<int> *const sampledInputYs, +/* static */ bool ProximityInfoStateUtils::checkAndReturnIsContinuousSuggestionPossible( + const int inputSize, const int *const xCoordinates, const int *const yCoordinates, + const int *const times, const int sampledInputSize, + const std::vector<int> *const sampledInputXs, const std::vector<int> *const sampledInputYs, const std::vector<int> *const sampledTimes, const std::vector<int> *const sampledInputIndices) { if (inputSize < sampledInputSize) { diff --git a/native/jni/src/proximity_info_state_utils.h b/native/jni/src/proximity_info_state_utils.h index a7f4a3425..c9feb59a3 100644 --- a/native/jni/src/proximity_info_state_utils.h +++ b/native/jni/src/proximity_info_state_utils.h @@ -38,7 +38,8 @@ class ProximityInfoStateUtils { static int updateTouchPoints(const ProximityInfo *const proximityInfo, const int maxPointToKeyLength, const int *const inputProximities, const int *const inputXCoordinates, const int *const inputYCoordinates, - const int *const times, const int *const pointerIds, const int inputSize, + const int *const times, const int *const pointerIds, + const float verticalSweetSpotScale, const int inputSize, const bool isGeometric, const int pointerId, const int pushTouchPointStartIndex, std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs, std::vector<int> *sampledInputTimes, std::vector<int> *sampledLengthCache, @@ -84,6 +85,7 @@ class ProximityInfoStateUtils { const int inputIndex, const int keyId); static void initGeometricDistanceInfos(const ProximityInfo *const proximityInfo, const int sampledInputSize, const int lastSavedInputSize, + const float verticalSweetSpotScale, const std::vector<int> *const sampledInputXs, const std::vector<int> *const sampledInputYs, std::vector<NearKeycodesSet> *SampledNearKeySets, @@ -101,7 +103,7 @@ class ProximityInfoStateUtils { const std::vector<int> *const sampledTimes, const std::vector<float> *const sampledSpeedRates, const std::vector<int> *const sampledBeelineSpeedPercentiles); - static bool checkAndReturnIsContinuationPossible(const int inputSize, + static bool checkAndReturnIsContinuousSuggestionPossible(const int inputSize, const int *const xCoordinates, const int *const yCoordinates, const int *const times, const int sampledInputSize, const std::vector<int> *const sampledInputXs, const std::vector<int> *const sampledInputYs, @@ -118,6 +120,7 @@ class ProximityInfoStateUtils { static float updateNearKeysDistances(const ProximityInfo *const proximityInfo, const float maxPointToKeyLength, const int x, const int y, + const float verticalSweetSpotScale, NearKeysDistanceMap *const currentNearKeysDistances); static bool isPrevLocalMin(const NearKeysDistanceMap *const currentNearKeysDistances, const NearKeysDistanceMap *const prevNearKeysDistances, @@ -130,7 +133,8 @@ class ProximityInfoStateUtils { std::vector<int> *sampledInputXs, std::vector<int> *sampledInputYs); static bool pushTouchPoint(const ProximityInfo *const proximityInfo, const int maxPointToKeyLength, const int inputIndex, const int nodeCodePoint, int x, - int y, const int time, const bool doSampling, const bool isLastPoint, + int y, const int time, const float verticalSweetSpotScale, + const bool doSampling, const bool isLastPoint, const float sumAngle, NearKeysDistanceMap *const currentNearKeysDistances, const NearKeysDistanceMap *const prevNearKeysDistances, const NearKeysDistanceMap *const prevPrevNearKeysDistances, diff --git a/native/jni/src/suggest/core/dicnode/dic_node.cpp b/native/jni/src/suggest/core/dicnode/dic_node.cpp new file mode 100644 index 000000000..8c48c587b --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node.cpp @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#include "dic_node.h" + +namespace latinime { + +DicNode::DicNode(const DicNode &dicNode) + : +#if DEBUG_DICT + mProfiler(dicNode.mProfiler), +#endif + mDicNodeProperties(dicNode.mDicNodeProperties), mDicNodeState(dicNode.mDicNodeState), + mIsCachedForNextSuggestion(dicNode.mIsCachedForNextSuggestion), mIsUsed(dicNode.mIsUsed), + mReleaseListener(0) { + /* empty */ +} + +DicNode &DicNode::operator=(const DicNode &dicNode) { +#if DEBUG_DICT + mProfiler = dicNode.mProfiler; +#endif + mDicNodeProperties = dicNode.mDicNodeProperties; + mDicNodeState = dicNode.mDicNodeState; + mIsCachedForNextSuggestion = dicNode.mIsCachedForNextSuggestion; + mIsUsed = dicNode.mIsUsed; + mReleaseListener = dicNode.mReleaseListener; + return *this; +} + +} // namespace latinime diff --git a/native/jni/src/suggest/core/dicnode/dic_node.h b/native/jni/src/suggest/core/dicnode/dic_node.h new file mode 100644 index 000000000..cde7b99a7 --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node.h @@ -0,0 +1,565 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_H +#define LATINIME_DIC_NODE_H + +#include "char_utils.h" +#include "defines.h" +#include "dic_node_state.h" +#include "dic_node_profiler.h" +#include "dic_node_properties.h" +#include "dic_node_release_listener.h" + +#if DEBUG_DICT +#define LOGI_SHOW_ADD_COST_PROP \ + do { char charBuf[50]; \ + INTS_TO_CHARS(getOutputWordBuf(), getDepth(), charBuf); \ + AKLOGI("%20s, \"%c\", size = %03d, total = %03d, index(0) = %02d, dist = %.4f, %s,,", \ + __FUNCTION__, getNodeCodePoint(), inputSize, getTotalInputIndex(), \ + getInputIndex(0), getNormalizedCompoundDistance(), charBuf); } while (0) +#define DUMP_WORD_AND_SCORE(header) \ + do { char charBuf[50]; char prevWordCharBuf[50]; \ + INTS_TO_CHARS(getOutputWordBuf(), getDepth(), charBuf); \ + INTS_TO_CHARS(mDicNodeState.mDicNodeStatePrevWord.mPrevWord, \ + mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength(), prevWordCharBuf); \ + AKLOGI("#%8s, %5f, %5f, %5f, %5f, %s, %s, %d,,", header, \ + getSpatialDistanceForScoring(), getLanguageDistanceForScoring(), \ + getNormalizedCompoundDistance(), getRawLength(), prevWordCharBuf, charBuf, \ + getInputIndex(0)); \ + } while (0) +#else +#define LOGI_SHOW_ADD_COST_PROP +#define DUMP_WORD_AND_SCORE(header) +#endif + +namespace latinime { + +// This struct is purely a bucket to return values. No instances of this struct should be kept. +struct DicNode_InputStateG { + bool mNeedsToUpdateInputStateG; + int mPointerId; + int16_t mInputIndex; + int mPrevCodePoint; + float mTerminalDiffCost; + float mRawLength; + DoubleLetterLevel mDoubleLetterLevel; +}; + +class DicNode { + // Caveat: We define Weighting as a friend class of DicNode to let Weighting change + // the distance of DicNode. + // Caution!!! In general, we avoid using the "friend" access modifier. + // This is an exception to explicitly hide DicNode::addCost() from all classes but Weighting. + friend class Weighting; + + public: +#if DEBUG_DICT + DicNodeProfiler mProfiler; +#endif + ////////////////// + // Memory utils // + ////////////////// + AK_FORCE_INLINE static void managedDelete(DicNode *node) { + node->remove(); + } + // end + ///////////////// + + AK_FORCE_INLINE DicNode() + : +#if DEBUG_DICT + mProfiler(), +#endif + mDicNodeProperties(), mDicNodeState(), mIsCachedForNextSuggestion(false), + mIsUsed(false), mReleaseListener(0) {} + + DicNode(const DicNode &dicNode); + DicNode &operator=(const DicNode &dicNode); + virtual ~DicNode() {} + + // TODO: minimize arguments by looking binary_format + // Init for copy + void initByCopy(const DicNode *dicNode) { + mIsUsed = true; + mIsCachedForNextSuggestion = dicNode->mIsCachedForNextSuggestion; + mDicNodeProperties.init(&dicNode->mDicNodeProperties); + mDicNodeState.init(&dicNode->mDicNodeState); + PROF_NODE_COPY(&dicNode->mProfiler, mProfiler); + } + + // TODO: minimize arguments by looking binary_format + // Init for root with prevWordNodePos which is used for bigram + void initAsRoot(const int pos, const int childrenPos, const int childrenCount, + const int prevWordNodePos) { + mIsUsed = true; + mIsCachedForNextSuggestion = false; + mDicNodeProperties.init( + pos, 0, childrenPos, 0, 0, 0, childrenCount, 0, 0, false, false, true, 0, 0); + mDicNodeState.init(prevWordNodePos); + PROF_NODE_RESET(mProfiler); + } + + void initAsPassingChild(DicNode *parentNode) { + mIsUsed = true; + mIsCachedForNextSuggestion = parentNode->mIsCachedForNextSuggestion; + const int c = parentNode->getNodeTypedCodePoint(); + mDicNodeProperties.init(&parentNode->mDicNodeProperties, c); + mDicNodeState.init(&parentNode->mDicNodeState); + PROF_NODE_COPY(&parentNode->mProfiler, mProfiler); + } + + // TODO: minimize arguments by looking binary_format + // Init for root with previous word + void initAsRootWithPreviousWord(DicNode *dicNode, const int pos, const int childrenPos, + const int childrenCount) { + mIsUsed = true; + mIsCachedForNextSuggestion = false; + mDicNodeProperties.init( + pos, 0, childrenPos, 0, 0, 0, childrenCount, 0, 0, false, false, true, 0, 0); + // TODO: Move to dicNodeState? + mDicNodeState.mDicNodeStateOutput.init(); // reset for next word + mDicNodeState.mDicNodeStateInput.init( + &dicNode->mDicNodeState.mDicNodeStateInput, true /* resetTerminalDiffCost */); + mDicNodeState.mDicNodeStateScoring.init( + &dicNode->mDicNodeState.mDicNodeStateScoring); + mDicNodeState.mDicNodeStatePrevWord.init( + dicNode->mDicNodeState.mDicNodeStatePrevWord.getPrevWordCount() + 1, + dicNode->mDicNodeProperties.getProbability(), + dicNode->mDicNodeProperties.getPos(), + dicNode->mDicNodeState.mDicNodeStatePrevWord.mPrevWord, + dicNode->mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength(), + dicNode->getOutputWordBuf(), + dicNode->mDicNodeProperties.getDepth(), + dicNode->mDicNodeState.mDicNodeStatePrevWord.mPrevSpacePositions, + mDicNodeState.mDicNodeStateInput.getInputIndex(0) /* lastInputIndex */); + PROF_NODE_COPY(&dicNode->mProfiler, mProfiler); + } + + // TODO: minimize arguments by looking binary_format + void initAsChild(DicNode *dicNode, const int pos, const uint8_t flags, const int childrenPos, + const int attributesPos, const int siblingPos, const int nodeCodePoint, + const int childrenCount, const int probability, const int bigramProbability, + const bool isTerminal, const bool hasMultipleChars, const bool hasChildren, + const uint16_t additionalSubwordLength, const int *additionalSubword) { + mIsUsed = true; + uint16_t newDepth = static_cast<uint16_t>(dicNode->getDepth() + 1); + mIsCachedForNextSuggestion = dicNode->mIsCachedForNextSuggestion; + const uint16_t newLeavingDepth = static_cast<uint16_t>( + dicNode->mDicNodeProperties.getLeavingDepth() + additionalSubwordLength); + mDicNodeProperties.init(pos, flags, childrenPos, attributesPos, siblingPos, nodeCodePoint, + childrenCount, probability, bigramProbability, isTerminal, hasMultipleChars, + hasChildren, newDepth, newLeavingDepth); + mDicNodeState.init(&dicNode->mDicNodeState, additionalSubwordLength, additionalSubword); + PROF_NODE_COPY(&dicNode->mProfiler, mProfiler); + } + + AK_FORCE_INLINE void remove() { + mIsUsed = false; + if (mReleaseListener) { + mReleaseListener->onReleased(this); + } + } + + bool isUsed() const { + return mIsUsed; + } + + bool isRoot() const { + return getDepth() == 0; + } + + bool hasChildren() const { + return mDicNodeProperties.hasChildren(); + } + + bool isLeavingNode() const { + ASSERT(getDepth() <= getLeavingDepth()); + return getDepth() == getLeavingDepth(); + } + + AK_FORCE_INLINE bool isFirstLetter() const { + return getDepth() == 1; + } + + bool isCached() const { + return mIsCachedForNextSuggestion; + } + + void setCached() { + mIsCachedForNextSuggestion = true; + } + + // Used to expand the node in DicNodeUtils + int getNodeTypedCodePoint() const { + return mDicNodeState.mDicNodeStateOutput.getCodePointAt(getDepth()); + } + + bool isImpossibleBigramWord() const { + const int probability = mDicNodeProperties.getProbability(); + if (probability == 0) { + return true; + } + const int prevWordLen = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength() + - mDicNodeState.mDicNodeStatePrevWord.getPrevWordStart() - 1; + const int currentWordLen = getDepth(); + return (prevWordLen == 1 && currentWordLen == 1); + } + + bool isCapitalized() const { + const int c = getOutputWordBuf()[0]; + return isAsciiUpper(c); + } + + bool isFirstWord() const { + return mDicNodeState.mDicNodeStatePrevWord.getPrevWordNodePos() == NOT_VALID_WORD; + } + + bool isCompletion(const int inputSize) const { + return mDicNodeState.mDicNodeStateInput.getInputIndex(0) >= inputSize; + } + + bool canDoLookAheadCorrection(const int inputSize) const { + return mDicNodeState.mDicNodeStateInput.getInputIndex(0) < inputSize - 1; + } + + // Used to get bigram probability in DicNodeUtils + int getPos() const { + return mDicNodeProperties.getPos(); + } + + // Used to get bigram probability in DicNodeUtils + int getPrevWordPos() const { + return mDicNodeState.mDicNodeStatePrevWord.getPrevWordNodePos(); + } + + // Used in DicNodeUtils + int getChildrenPos() const { + return mDicNodeProperties.getChildrenPos(); + } + + // Used in DicNodeUtils + int getChildrenCount() const { + return mDicNodeProperties.getChildrenCount(); + } + + // Used in DicNodeUtils + int getProbability() const { + return mDicNodeProperties.getProbability(); + } + + AK_FORCE_INLINE bool isTerminalWordNode() const { + const bool isTerminalNodes = mDicNodeProperties.isTerminal(); + const int currentNodeDepth = getDepth(); + const int terminalNodeDepth = mDicNodeProperties.getLeavingDepth(); + return isTerminalNodes && currentNodeDepth > 0 && currentNodeDepth == terminalNodeDepth; + } + + bool shouldBeFilterdBySafetyNetForBigram() const { + const uint16_t currentDepth = getDepth(); + const int prevWordLen = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength() + - mDicNodeState.mDicNodeStatePrevWord.getPrevWordStart() - 1; + return !(currentDepth > 0 && (currentDepth != 1 || prevWordLen != 1)); + } + + uint16_t getLeavingDepth() const { + return mDicNodeProperties.getLeavingDepth(); + } + + bool isTotalInputSizeExceedingLimit() const { + const int prevWordsLen = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength(); + const int currentWordDepth = getDepth(); + // TODO: 3 can be 2? Needs to be investigated. + // TODO: Have a const variable for 3 (or 2) + return prevWordsLen + currentWordDepth > MAX_WORD_LENGTH - 3; + } + + // TODO: This may be defective. Needs to be revised. + bool truncateNode(const DicNode *const topNode, const int inputCommitPoint) { + const int prevWordLenOfTop = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength(); + int newPrevWordStartIndex = inputCommitPoint; + int charCount = 0; + // Find new word start index + for (int i = 0; i < prevWordLenOfTop; ++i) { + const int c = mDicNodeState.mDicNodeStatePrevWord.getPrevWordCodePointAt(i); + // TODO: Check other separators. + if (c != KEYCODE_SPACE && c != KEYCODE_SINGLE_QUOTE) { + if (charCount == inputCommitPoint) { + newPrevWordStartIndex = i; + break; + } + ++charCount; + } + } + if (!mDicNodeState.mDicNodeStatePrevWord.startsWith( + &topNode->mDicNodeState.mDicNodeStatePrevWord, newPrevWordStartIndex - 1)) { + // Node mismatch. + return false; + } + mDicNodeState.mDicNodeStateInput.truncate(inputCommitPoint); + mDicNodeState.mDicNodeStatePrevWord.truncate(newPrevWordStartIndex); + return true; + } + + void outputResult(int *dest) const { + const uint16_t prevWordLength = mDicNodeState.mDicNodeStatePrevWord.getPrevWordLength(); + const uint16_t currentDepth = getDepth(); + DicNodeUtils::appendTwoWords(mDicNodeState.mDicNodeStatePrevWord.mPrevWord, + prevWordLength, getOutputWordBuf(), currentDepth, dest); + DUMP_WORD_AND_SCORE("OUTPUT"); + } + + void outputSpacePositionsResult(int *spaceIndices) const { + mDicNodeState.mDicNodeStatePrevWord.outputSpacePositions(spaceIndices); + } + + bool hasMultipleWords() const { + return mDicNodeState.mDicNodeStatePrevWord.getPrevWordCount() > 0; + } + + float getProximityCorrectionCount() const { + return static_cast<float>(mDicNodeState.mDicNodeStateScoring.getProximityCorrectionCount()); + } + + float getEditCorrectionCount() const { + return static_cast<float>(mDicNodeState.mDicNodeStateScoring.getEditCorrectionCount()); + } + + // Used to prune nodes + float getNormalizedCompoundDistance() const { + return mDicNodeState.mDicNodeStateScoring.getNormalizedCompoundDistance(); + } + + // Used to prune nodes + float getNormalizedSpatialDistance() const { + return mDicNodeState.mDicNodeStateScoring.getSpatialDistance() + / static_cast<float>(getInputIndex(0) + 1); + } + + // Used to prune nodes + float getCompoundDistance() const { + return mDicNodeState.mDicNodeStateScoring.getCompoundDistance(); + } + + // Used to prune nodes + float getCompoundDistance(const float languageWeight) const { + return mDicNodeState.mDicNodeStateScoring.getCompoundDistance(languageWeight); + } + + // Note that "cost" means delta for "distance" that is weighted. + float getTotalPrevWordsLanguageCost() const { + return mDicNodeState.mDicNodeStateScoring.getTotalPrevWordsLanguageCost(); + } + + // Used to commit input partially + int getPrevWordNodePos() const { + return mDicNodeState.mDicNodeStatePrevWord.getPrevWordNodePos(); + } + + AK_FORCE_INLINE const int *getOutputWordBuf() const { + return mDicNodeState.mDicNodeStateOutput.mWordBuf; + } + + int getPrevCodePointG(int pointerId) const { + return mDicNodeState.mDicNodeStateInput.getPrevCodePoint(pointerId); + } + + // Whether the current codepoint can be an intentional omission, in which case the traversal + // algorithm will always check for a possible omission here. + bool canBeIntentionalOmission() const { + return isIntentionalOmissionCodePoint(getNodeCodePoint()); + } + + // Whether the omission is so frequent that it should incur zero cost. + bool isZeroCostOmission() const { + // TODO: do not hardcode and read from header + return (getNodeCodePoint() == KEYCODE_SINGLE_QUOTE); + } + + // TODO: remove + float getTerminalDiffCostG(int path) const { + return mDicNodeState.mDicNodeStateInput.getTerminalDiffCost(path); + } + + ////////////////////// + // Temporary getter // + // TODO: Remove // + ////////////////////// + // TODO: Remove once touch path is merged into ProximityInfoState + int getNodeCodePoint() const { + return mDicNodeProperties.getNodeCodePoint(); + } + + //////////////////////////////// + // Utils for cost calculation // + //////////////////////////////// + AK_FORCE_INLINE bool isSameNodeCodePoint(const DicNode *const dicNode) const { + return mDicNodeProperties.getNodeCodePoint() + == dicNode->mDicNodeProperties.getNodeCodePoint(); + } + + // TODO: remove + // TODO: rename getNextInputIndex + int16_t getInputIndex(int pointerId) const { + return mDicNodeState.mDicNodeStateInput.getInputIndex(pointerId); + } + + //////////////////////////////////// + // Getter of features for scoring // + //////////////////////////////////// + float getSpatialDistanceForScoring() const { + return mDicNodeState.mDicNodeStateScoring.getSpatialDistance(); + } + + float getLanguageDistanceForScoring() const { + return mDicNodeState.mDicNodeStateScoring.getLanguageDistance(); + } + + float getLanguageDistanceRatePerWordForScoring() const { + const float langDist = getLanguageDistanceForScoring(); + const float totalWordCount = + static_cast<float>(mDicNodeState.mDicNodeStatePrevWord.getPrevWordCount() + 1); + return langDist / totalWordCount; + } + + float getRawLength() const { + return mDicNodeState.mDicNodeStateScoring.getRawLength(); + } + + bool isLessThanOneErrorForScoring() const { + return mDicNodeState.mDicNodeStateScoring.getEditCorrectionCount() + + mDicNodeState.mDicNodeStateScoring.getProximityCorrectionCount() <= 1; + } + + DoubleLetterLevel getDoubleLetterLevel() const { + return mDicNodeState.mDicNodeStateScoring.getDoubleLetterLevel(); + } + + void setDoubleLetterLevel(DoubleLetterLevel doubleLetterLevel) { + mDicNodeState.mDicNodeStateScoring.setDoubleLetterLevel(doubleLetterLevel); + } + + uint8_t getFlags() const { + return mDicNodeProperties.getFlags(); + } + + int getAttributesPos() const { + return mDicNodeProperties.getAttributesPos(); + } + + inline uint16_t getDepth() const { + return mDicNodeProperties.getDepth(); + } + + AK_FORCE_INLINE void dump(const char *tag) const { +#if DEBUG_DICT + DUMP_WORD_AND_SCORE(tag); +#if DEBUG_DUMP_ERROR + mProfiler.dump(); +#endif +#endif + } + + void setReleaseListener(DicNodeReleaseListener *releaseListener) { + mReleaseListener = releaseListener; + } + + AK_FORCE_INLINE bool compare(const DicNode *right) { + if (!isUsed() && !right->isUsed()) { + // Compare pointer values here for stable comparison + return this > right; + } + if (!isUsed()) { + return true; + } + if (!right->isUsed()) { + return false; + } + const float diff = + right->getNormalizedCompoundDistance() - getNormalizedCompoundDistance(); + static const float MIN_DIFF = 0.000001f; + if (diff > MIN_DIFF) { + return true; + } else if (diff < -MIN_DIFF) { + return false; + } + const int depth = getDepth(); + const int depthDiff = right->getDepth() - depth; + if (depthDiff != 0) { + return depthDiff > 0; + } + for (int i = 0; i < depth; ++i) { + const int codePoint = mDicNodeState.mDicNodeStateOutput.getCodePointAt(i); + const int rightCodePoint = right->mDicNodeState.mDicNodeStateOutput.getCodePointAt(i); + if (codePoint != rightCodePoint) { + return rightCodePoint > codePoint; + } + } + // Compare pointer values here for stable comparison + return this > right; + } + + private: + DicNodeProperties mDicNodeProperties; + DicNodeState mDicNodeState; + // TODO: Remove + bool mIsCachedForNextSuggestion; + bool mIsUsed; + DicNodeReleaseListener *mReleaseListener; + + AK_FORCE_INLINE int getTotalInputIndex() const { + int index = 0; + for (int i = 0; i < MAX_POINTER_COUNT_G; i++) { + index += mDicNodeState.mDicNodeStateInput.getInputIndex(i); + } + return index; + } + + // Caveat: Must not be called outside Weighting + // This restriction is guaranteed by "friend" + AK_FORCE_INLINE void addCost(const float spatialCost, const float languageCost, + const bool doNormalization, const int inputSize, const bool isEditCorrection, + const bool isProximityCorrection) { + if (DEBUG_GEO_FULL) { + LOGI_SHOW_ADD_COST_PROP; + } + mDicNodeState.mDicNodeStateScoring.addCost(spatialCost, languageCost, doNormalization, + inputSize, getTotalInputIndex(), isEditCorrection, isProximityCorrection); + } + + // Caveat: Must not be called outside Weighting + // This restriction is guaranteed by "friend" + AK_FORCE_INLINE void forwardInputIndex(const int pointerId, const int count, + const bool overwritesPrevCodePointByNodeCodePoint) { + if (count == 0) { + return; + } + mDicNodeState.mDicNodeStateInput.forwardInputIndex(pointerId, count); + if (overwritesPrevCodePointByNodeCodePoint) { + mDicNodeState.mDicNodeStateInput.setPrevCodePoint(0, getNodeCodePoint()); + } + } + + AK_FORCE_INLINE void updateInputIndexG(DicNode_InputStateG *inputStateG) { + mDicNodeState.mDicNodeStateInput.updateInputIndexG(inputStateG->mPointerId, + inputStateG->mInputIndex, inputStateG->mPrevCodePoint, + inputStateG->mTerminalDiffCost, inputStateG->mRawLength); + mDicNodeState.mDicNodeStateScoring.addRawLength(inputStateG->mRawLength); + mDicNodeState.mDicNodeStateScoring.setDoubleLetterLevel(inputStateG->mDoubleLetterLevel); + } +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_priority_queue.h b/native/jni/src/suggest/core/dicnode/dic_node_priority_queue.h new file mode 100644 index 000000000..d3f28a8bd --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_priority_queue.h @@ -0,0 +1,213 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_PRIORITY_QUEUE_H +#define LATINIME_DIC_NODE_PRIORITY_QUEUE_H + +#include <queue> +#include <vector> + +#include "defines.h" +#include "dic_node.h" +#include "dic_node_release_listener.h" + +#define MAX_DIC_NODE_PRIORITY_QUEUE_CAPACITY 200 + +namespace latinime { + +class DicNodePriorityQueue : public DicNodeReleaseListener { + public: + AK_FORCE_INLINE DicNodePriorityQueue() + : MAX_CAPACITY(MAX_DIC_NODE_PRIORITY_QUEUE_CAPACITY), + mMaxSize(MAX_DIC_NODE_PRIORITY_QUEUE_CAPACITY), mDicNodesBuf(), mUnusedNodeIndices(), + mNextUnusedNodeId(0), mDicNodesQueue() { + mDicNodesBuf.resize(MAX_CAPACITY + 1); + mUnusedNodeIndices.resize(MAX_CAPACITY + 1); + reset(); + } + + // Non virtual inline destructor -- never inherit this class + AK_FORCE_INLINE ~DicNodePriorityQueue() {} + + int getSize() const { + return static_cast<int>(mDicNodesQueue.size()); + } + + int getMaxSize() const { + return mMaxSize; + } + + AK_FORCE_INLINE void setMaxSize(const int maxSize) { + mMaxSize = min(maxSize, MAX_CAPACITY); + } + + AK_FORCE_INLINE void reset() { + clearAndResize(MAX_CAPACITY); + } + + AK_FORCE_INLINE void clear() { + clearAndResize(mMaxSize); + } + + AK_FORCE_INLINE void clearAndResize(const int maxSize) { + while (!mDicNodesQueue.empty()) { + mDicNodesQueue.pop(); + } + setMaxSize(maxSize); + for (int i = 0; i < MAX_CAPACITY + 1; ++i) { + mDicNodesBuf[i].remove(); + mDicNodesBuf[i].setReleaseListener(this); + mUnusedNodeIndices[i] = i == MAX_CAPACITY ? NOT_A_NODE_ID : static_cast<int>(i) + 1; + } + mNextUnusedNodeId = 0; + } + + AK_FORCE_INLINE DicNode *newDicNode(DicNode *dicNode) { + DicNode *newNode = searchEmptyDicNode(); + if (newNode) { + DicNodeUtils::initByCopy(dicNode, newNode); + return newNode; + } + return 0; + } + + // Copy + AK_FORCE_INLINE DicNode *copyPush(DicNode *dicNode) { + return copyPush(dicNode, mMaxSize); + } + + AK_FORCE_INLINE void copyPop(DicNode *dest) { + if (mDicNodesQueue.empty()) { + ASSERT(false); + return; + } + DicNode *node = mDicNodesQueue.top(); + if (dest) { + DicNodeUtils::initByCopy(node, dest); + } + node->remove(); + mDicNodesQueue.pop(); + } + + void onReleased(DicNode *dicNode) { + const int index = static_cast<int>(dicNode - &mDicNodesBuf[0]); + if (mUnusedNodeIndices[index] != NOT_A_NODE_ID) { + // it's already released + return; + } + mUnusedNodeIndices[index] = mNextUnusedNodeId; + mNextUnusedNodeId = index; + ASSERT(index >= 0 && index < (MAX_CAPACITY + 1)); + } + + AK_FORCE_INLINE void dump() const { + AKLOGI("\n\n\n\n\n==========================="); + for (int i = 0; i < MAX_CAPACITY + 1; ++i) { + if (mDicNodesBuf[i].isUsed()) { + mDicNodesBuf[i].dump("QUEUE: "); + } + } + AKLOGI("===========================\n\n\n\n\n"); + } + + private: + DISALLOW_COPY_AND_ASSIGN(DicNodePriorityQueue); + static const int NOT_A_NODE_ID = -1; + + AK_FORCE_INLINE static bool compareDicNode(DicNode *left, DicNode *right) { + return left->compare(right); + } + + struct DicNodeComparator { + bool operator ()(DicNode *left, DicNode *right) { + return compareDicNode(left, right); + } + }; + + typedef std::priority_queue<DicNode *, std::vector<DicNode *>, DicNodeComparator> DicNodesQueue; + const int MAX_CAPACITY; + int mMaxSize; + std::vector<DicNode> mDicNodesBuf; // of each element of mDicNodesBuf respectively + std::vector<int> mUnusedNodeIndices; + int mNextUnusedNodeId; + DicNodesQueue mDicNodesQueue; + + inline bool isFull(const int maxSize) const { + return getSize() >= maxSize; + } + + AK_FORCE_INLINE void pop() { + copyPop(0); + } + + AK_FORCE_INLINE bool betterThanWorstDicNode(DicNode *dicNode) const { + DicNode *worstNode = mDicNodesQueue.top(); + if (!worstNode) { + return true; + } + return compareDicNode(dicNode, worstNode); + } + + AK_FORCE_INLINE DicNode *searchEmptyDicNode() { + // TODO: Currently O(n) but should be improved to O(1) + if (MAX_CAPACITY == 0) { + return 0; + } + if (mNextUnusedNodeId == NOT_A_NODE_ID) { + AKLOGI("No unused node found."); + for (int i = 0; i < MAX_CAPACITY + 1; ++i) { + AKLOGI("Dump node availability, %d, %d, %d", + i, mDicNodesBuf[i].isUsed(), mUnusedNodeIndices[i]); + } + ASSERT(false); + return 0; + } + DicNode *dicNode = &mDicNodesBuf[mNextUnusedNodeId]; + markNodeAsUsed(dicNode); + return dicNode; + } + + AK_FORCE_INLINE void markNodeAsUsed(DicNode *dicNode) { + const int index = static_cast<int>(dicNode - &mDicNodesBuf[0]); + mNextUnusedNodeId = mUnusedNodeIndices[index]; + mUnusedNodeIndices[index] = NOT_A_NODE_ID; + ASSERT(index >= 0 && index < (MAX_CAPACITY + 1)); + } + + AK_FORCE_INLINE DicNode *pushPoolNodeWithMaxSize(DicNode *dicNode, const int maxSize) { + if (!dicNode) { + return 0; + } + if (!isFull(maxSize)) { + mDicNodesQueue.push(dicNode); + return dicNode; + } + if (betterThanWorstDicNode(dicNode)) { + pop(); + mDicNodesQueue.push(dicNode); + return dicNode; + } + dicNode->remove(); + return 0; + } + + // Copy + AK_FORCE_INLINE DicNode *copyPush(DicNode *dicNode, const int maxSize) { + return pushPoolNodeWithMaxSize(newDicNode(dicNode), maxSize); + } +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_PRIORITY_QUEUE_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_profiler.h b/native/jni/src/suggest/core/dicnode/dic_node_profiler.h new file mode 100644 index 000000000..90f75d0c6 --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_profiler.h @@ -0,0 +1,181 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_PROFILER_H +#define LATINIME_DIC_NODE_PROFILER_H + +#include "defines.h" + +#if DEBUG_DICT +#define PROF_SPACE_SUBSTITUTION(profiler) profiler.profSpaceSubstitution() +#define PROF_SPACE_OMISSION(profiler) profiler.profSpaceOmission() +#define PROF_ADDITIONAL_PROXIMITY(profiler) profiler.profAdditionalProximity() +#define PROF_SUBSTITUTION(profiler) profiler.profSubstitution() +#define PROF_OMISSION(profiler) profiler.profOmission() +#define PROF_INSERTION(profiler) profiler.profInsertion() +#define PROF_MATCH(profiler) profiler.profMatch() +#define PROF_COMPLETION(profiler) profiler.profCompletion() +#define PROF_TRANSPOSITION(profiler) profiler.profTransposition() +#define PROF_NEARESTKEY(profiler) profiler.profNearestKey() +#define PROF_TERMINAL(profiler) profiler.profTerminal() +#define PROF_NEW_WORD(profiler) profiler.profNewWord() +#define PROF_NEW_WORD_BIGRAM(profiler) profiler.profNewWordBigram() +#define PROF_NODE_RESET(profiler) profiler.reset() +#define PROF_NODE_COPY(src, dest) dest.copy(src) +#else +#define PROF_SPACE_SUBSTITUTION(profiler) +#define PROF_SPACE_OMISSION(profiler) +#define PROF_ADDITONAL_PROXIMITY(profiler) +#define PROF_SUBSTITUTION(profiler) +#define PROF_OMISSION(profiler) +#define PROF_INSERTION(profiler) +#define PROF_MATCH(profiler) +#define PROF_COMPLETION(profiler) +#define PROF_TRANSPOSITION(profiler) +#define PROF_NEARESTKEY(profiler) +#define PROF_TERMINAL(profiler) +#define PROF_NEW_WORD(profiler) +#define PROF_NEW_WORD_BIGRAM(profiler) +#define PROF_NODE_RESET(profiler) +#define PROF_NODE_COPY(src, dest) +#endif + +namespace latinime { + +class DicNodeProfiler { + public: +#if DEBUG_DICT + AK_FORCE_INLINE DicNodeProfiler() + : mProfOmission(0), mProfInsertion(0), mProfTransposition(0), + mProfAdditionalProximity(0), mProfSubstitution(0), + mProfSpaceSubstitution(0), mProfSpaceOmission(0), + mProfMatch(0), mProfCompletion(0), mProfTerminal(0), + mProfNearestKey(0), mProfNewWord(0), mProfNewWordBigram(0) {} + + int mProfOmission; + int mProfInsertion; + int mProfTransposition; + int mProfAdditionalProximity; + int mProfSubstitution; + int mProfSpaceSubstitution; + int mProfSpaceOmission; + int mProfMatch; + int mProfCompletion; + int mProfTerminal; + int mProfNearestKey; + int mProfNewWord; + int mProfNewWordBigram; + + void profSpaceSubstitution() { + ++mProfSpaceSubstitution; + } + + void profSpaceOmission() { + ++mProfSpaceOmission; + } + + void profAdditionalProximity() { + ++mProfAdditionalProximity; + } + + void profSubstitution() { + ++mProfSubstitution; + } + + void profOmission() { + ++mProfOmission; + } + + void profInsertion() { + ++mProfInsertion; + } + + void profMatch() { + ++mProfMatch; + } + + void profCompletion() { + ++mProfCompletion; + } + + void profTransposition() { + ++mProfTransposition; + } + + void profNearestKey() { + ++mProfNearestKey; + } + + void profTerminal() { + ++mProfTerminal; + } + + void profNewWord() { + ++mProfNewWord; + } + + void profNewWordBigram() { + ++mProfNewWordBigram; + } + + void reset() { + mProfSpaceSubstitution = 0; + mProfSpaceOmission = 0; + mProfAdditionalProximity = 0; + mProfSubstitution = 0; + mProfOmission = 0; + mProfInsertion = 0; + mProfMatch = 0; + mProfCompletion = 0; + mProfTransposition = 0; + mProfNearestKey = 0; + mProfTerminal = 0; + mProfNewWord = 0; + mProfNewWordBigram = 0; + } + + void copy(const DicNodeProfiler *const profiler) { + mProfSpaceSubstitution = profiler->mProfSpaceSubstitution; + mProfSpaceOmission = profiler->mProfSpaceOmission; + mProfAdditionalProximity = profiler->mProfAdditionalProximity; + mProfSubstitution = profiler->mProfSubstitution; + mProfOmission = profiler->mProfOmission; + mProfInsertion = profiler->mProfInsertion; + mProfMatch = profiler->mProfMatch; + mProfCompletion = profiler->mProfCompletion; + mProfTransposition = profiler->mProfTransposition; + mProfNearestKey = profiler->mProfNearestKey; + mProfTerminal = profiler->mProfTerminal; + mProfNewWord = profiler->mProfNewWord; + mProfNewWordBigram = profiler->mProfNewWordBigram; + } + + void dump() const { + AKLOGI("O %d, I %d, T %d, AP %d, S %d, SS %d, SO %d, M %d, C %d, TE %d, NW = %d, NWB = %d", + mProfOmission, mProfInsertion, mProfTransposition, mProfAdditionalProximity, + mProfSubstitution, mProfSpaceSubstitution, mProfSpaceOmission, mProfMatch, + mProfCompletion, mProfTerminal, mProfNewWord, mProfNewWordBigram); + } +#else + DicNodeProfiler() {} +#endif + private: + // Caution!!! + // Use a default copy constructor and an assign operator because shallow copies are ok + // for this class +}; +} +#endif // LATINIME_DIC_NODE_PROFILER_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_properties.h b/native/jni/src/suggest/core/dicnode/dic_node_properties.h new file mode 100644 index 000000000..173ef35d0 --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_properties.h @@ -0,0 +1,173 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_PROPERTIES_H +#define LATINIME_DIC_NODE_PROPERTIES_H + +#include <stdint.h> + +#include "defines.h" + +namespace latinime { + +/** + * Node for traversing the lexicon trie. + */ +class DicNodeProperties { + public: + AK_FORCE_INLINE DicNodeProperties() + : mPos(0), mFlags(0), mChildrenPos(0), mAttributesPos(0), mSiblingPos(0), + mChildrenCount(0), mProbability(0), mBigramProbability(0), mNodeCodePoint(0), + mDepth(0), mLeavingDepth(0), mIsTerminal(false), mHasMultipleChars(false), + mHasChildren(false) { + } + + virtual ~DicNodeProperties() {} + + // Should be called only once per DicNode is initialized. + void init(const int pos, const uint8_t flags, const int childrenPos, const int attributesPos, + const int siblingPos, const int nodeCodePoint, const int childrenCount, + const int probability, const int bigramProbability, const bool isTerminal, + const bool hasMultipleChars, const bool hasChildren, const uint16_t depth, + const uint16_t terminalDepth) { + mPos = pos; + mFlags = flags; + mChildrenPos = childrenPos; + mAttributesPos = attributesPos; + mSiblingPos = siblingPos; + mNodeCodePoint = nodeCodePoint; + mChildrenCount = childrenCount; + mProbability = probability; + mBigramProbability = bigramProbability; + mIsTerminal = isTerminal; + mHasMultipleChars = hasMultipleChars; + mHasChildren = hasChildren; + mDepth = depth; + mLeavingDepth = terminalDepth; + } + + // Init for copy + void init(const DicNodeProperties *const nodeProp) { + mPos = nodeProp->mPos; + mFlags = nodeProp->mFlags; + mChildrenPos = nodeProp->mChildrenPos; + mAttributesPos = nodeProp->mAttributesPos; + mSiblingPos = nodeProp->mSiblingPos; + mNodeCodePoint = nodeProp->mNodeCodePoint; + mChildrenCount = nodeProp->mChildrenCount; + mProbability = nodeProp->mProbability; + mBigramProbability = nodeProp->mBigramProbability; + mIsTerminal = nodeProp->mIsTerminal; + mHasMultipleChars = nodeProp->mHasMultipleChars; + mHasChildren = nodeProp->mHasChildren; + mDepth = nodeProp->mDepth; + mLeavingDepth = nodeProp->mLeavingDepth; + } + + // Init as passing child + void init(const DicNodeProperties *const nodeProp, const int codePoint) { + mPos = nodeProp->mPos; + mFlags = nodeProp->mFlags; + mChildrenPos = nodeProp->mChildrenPos; + mAttributesPos = nodeProp->mAttributesPos; + mSiblingPos = nodeProp->mSiblingPos; + mNodeCodePoint = codePoint; // Overwrite the node char of a passing child + mChildrenCount = nodeProp->mChildrenCount; + mProbability = nodeProp->mProbability; + mBigramProbability = nodeProp->mBigramProbability; + mIsTerminal = nodeProp->mIsTerminal; + mHasMultipleChars = nodeProp->mHasMultipleChars; + mHasChildren = nodeProp->mHasChildren; + mDepth = nodeProp->mDepth + 1; // Increment the depth of a passing child + mLeavingDepth = nodeProp->mLeavingDepth; + } + + int getPos() const { + return mPos; + } + + uint8_t getFlags() const { + return mFlags; + } + + int getChildrenPos() const { + return mChildrenPos; + } + + int getAttributesPos() const { + return mAttributesPos; + } + + int getChildrenCount() const { + return mChildrenCount; + } + + int getProbability() const { + return mProbability; + } + + int getNodeCodePoint() const { + return mNodeCodePoint; + } + + uint16_t getDepth() const { + return mDepth; + } + + // TODO: Move to output? + uint16_t getLeavingDepth() const { + return mLeavingDepth; + } + + bool isTerminal() const { + return mIsTerminal; + } + + bool hasMultipleChars() const { + return mHasMultipleChars; + } + + bool hasChildren() const { + return mChildrenCount > 0 || mDepth != mLeavingDepth; + } + + private: + // Caution!!! + // Use a default copy constructor and an assign operator because shallow copies are ok + // for this class + + // Not used + int getSiblingPos() const { + return mSiblingPos; + } + + int mPos; + uint8_t mFlags; + int mChildrenPos; + int mAttributesPos; + int mSiblingPos; + int mChildrenCount; + int mProbability; + int mBigramProbability; // not used for now + int mNodeCodePoint; + uint16_t mDepth; + uint16_t mLeavingDepth; + bool mIsTerminal; + bool mHasMultipleChars; + bool mHasChildren; +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_PROPERTIES_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_release_listener.h b/native/jni/src/suggest/core/dicnode/dic_node_release_listener.h new file mode 100644 index 000000000..2a81c3cae --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_release_listener.h @@ -0,0 +1,33 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_RELEASE_LISTENER_H +#define LATINIME_DIC_NODE_RELEASE_LISTENER_H + +#include "defines.h" + +namespace latinime { + +class DicNodeReleaseListener { + public: + DicNodeReleaseListener() {} + virtual ~DicNodeReleaseListener() {} + virtual void onReleased(DicNode *dicNode) = 0; + private: + DISALLOW_COPY_AND_ASSIGN(DicNodeReleaseListener); +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_RELEASE_LISTENER_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state.h b/native/jni/src/suggest/core/dicnode/dic_node_state.h new file mode 100644 index 000000000..239b63c32 --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_state.h @@ -0,0 +1,71 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_STATE_H +#define LATINIME_DIC_NODE_STATE_H + +#include "defines.h" +#include "dic_node_state_input.h" +#include "dic_node_state_output.h" +#include "dic_node_state_prevword.h" +#include "dic_node_state_scoring.h" + +namespace latinime { + +class DicNodeState { + public: + DicNodeStateInput mDicNodeStateInput; + DicNodeStateOutput mDicNodeStateOutput; + DicNodeStatePrevWord mDicNodeStatePrevWord; + DicNodeStateScoring mDicNodeStateScoring; + + AK_FORCE_INLINE DicNodeState() + : mDicNodeStateInput(), mDicNodeStateOutput(), mDicNodeStatePrevWord(), + mDicNodeStateScoring() { + } + + virtual ~DicNodeState() {} + + // Init with prevWordPos + void init(const int prevWordPos) { + mDicNodeStateInput.init(); + mDicNodeStateOutput.init(); + mDicNodeStatePrevWord.init(prevWordPos); + mDicNodeStateScoring.init(); + } + + // Init by copy + AK_FORCE_INLINE void init(const DicNodeState *const src) { + mDicNodeStateInput.init(&src->mDicNodeStateInput); + mDicNodeStateOutput.init(&src->mDicNodeStateOutput); + mDicNodeStatePrevWord.init(&src->mDicNodeStatePrevWord); + mDicNodeStateScoring.init(&src->mDicNodeStateScoring); + } + + // Init by copy and adding subword + void init(const DicNodeState *const src, const uint16_t additionalSubwordLength, + const int *const additionalSubword) { + init(src); + mDicNodeStateOutput.addSubword(additionalSubwordLength, additionalSubword); + } + + private: + // Caution!!! + // Use a default copy constructor and an assign operator because shallow copies are ok + // for this class +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_STATE_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state_input.h b/native/jni/src/suggest/core/dicnode/dic_node_state_input.h new file mode 100644 index 000000000..7ad3e3e5f --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_state_input.h @@ -0,0 +1,100 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_STATE_INPUT_H +#define LATINIME_DIC_NODE_STATE_INPUT_H + +#include "defines.h" + +namespace latinime { + +// TODO: Have a .cpp for this class +class DicNodeStateInput { + public: + DicNodeStateInput() {} + virtual ~DicNodeStateInput() {} + + // TODO: Merge into DicNodeStatePrevWord::truncate + void truncate(const int commitPoint) { + mInputIndex[0] -= commitPoint; + } + + void init() { + for (int i = 0; i < MAX_POINTER_COUNT_G; i++) { + // TODO: The initial value for mInputIndex should be -1? + //mInputIndex[i] = i == 0 ? 0 : -1; + mInputIndex[i] = 0; + mPrevCodePoint[i] = NOT_A_CODE_POINT; + mTerminalDiffCost[i] = static_cast<float>(MAX_VALUE_FOR_WEIGHTING); + } + } + + void init(const DicNodeStateInput *const src, const bool resetTerminalDiffCost) { + for (int i = 0; i < MAX_POINTER_COUNT_G; i++) { + mInputIndex[i] = src->mInputIndex[i]; + mPrevCodePoint[i] = src->mPrevCodePoint[i]; + mTerminalDiffCost[i] = resetTerminalDiffCost ? + static_cast<float>(MAX_VALUE_FOR_WEIGHTING) : src->mTerminalDiffCost[i]; + } + } + + void updateInputIndexG(const int pointerId, const int inputIndex, + const int prevCodePoint, const float terminalDiffCost, const float rawLength) { + mInputIndex[pointerId] = inputIndex; + mPrevCodePoint[pointerId] = prevCodePoint; + mTerminalDiffCost[pointerId] = terminalDiffCost; + } + + void init(const DicNodeStateInput *const src) { + init(src, false); + } + + // For transposition + void setPrevCodePoint(const int pointerId, const int c) { + mPrevCodePoint[pointerId] = c; + } + + void forwardInputIndex(const int pointerId, const int val) { + if (mInputIndex[pointerId] < 0) { + mInputIndex[pointerId] = val; + } else { + mInputIndex[pointerId] = mInputIndex[pointerId] + val; + } + } + + int getInputIndex(const int pointerId) const { + // when "inputIndex" exceeds "inputSize", auto-completion needs to be done + return mInputIndex[pointerId]; + } + + int getPrevCodePoint(const int pointerId) const { + return mPrevCodePoint[pointerId]; + } + + float getTerminalDiffCost(const int pointerId) const { + return mTerminalDiffCost[pointerId]; + } + + private: + // Caution!!! + // Use a default copy constructor and an assign operator because shallow copies are ok + // for this class + int mInputIndex[MAX_POINTER_COUNT_G]; + int mPrevCodePoint[MAX_POINTER_COUNT_G]; + float mTerminalDiffCost[MAX_POINTER_COUNT_G]; +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_STATE_INPUT_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state_output.h b/native/jni/src/suggest/core/dicnode/dic_node_state_output.h new file mode 100644 index 000000000..1d4f50a06 --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_state_output.h @@ -0,0 +1,75 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_STATE_OUTPUT_H +#define LATINIME_DIC_NODE_STATE_OUTPUT_H + +#include <cstring> // for memcpy() +#include <stdint.h> + +#include "defines.h" + +namespace latinime { + +class DicNodeStateOutput { + public: + DicNodeStateOutput() : mOutputtedLength(0) { + init(); + } + + virtual ~DicNodeStateOutput() {} + + void init() { + mOutputtedLength = 0; + mWordBuf[0] = 0; + } + + void init(const DicNodeStateOutput *const stateOutput) { + memcpy(mWordBuf, stateOutput->mWordBuf, + stateOutput->mOutputtedLength * sizeof(mWordBuf[0])); + mOutputtedLength = stateOutput->mOutputtedLength; + if (mOutputtedLength < MAX_WORD_LENGTH) { + mWordBuf[mOutputtedLength] = 0; + } + } + + void addSubword(const uint16_t additionalSubwordLength, const int *const additionalSubword) { + if (additionalSubword) { + memcpy(&mWordBuf[mOutputtedLength], additionalSubword, + additionalSubwordLength * sizeof(mWordBuf[0])); + mOutputtedLength = static_cast<uint16_t>(mOutputtedLength + additionalSubwordLength); + if (mOutputtedLength < MAX_WORD_LENGTH) { + mWordBuf[mOutputtedLength] = 0; + } + } + } + + // TODO: Remove + int getCodePointAt(const int id) const { + return mWordBuf[id]; + } + + // TODO: Move to private + int mWordBuf[MAX_WORD_LENGTH]; + + private: + // Caution!!! + // Use a default copy constructor and an assign operator because shallow copies are ok + // for this class + uint16_t mOutputtedLength; +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_STATE_OUTPUT_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state_prevword.h b/native/jni/src/suggest/core/dicnode/dic_node_state_prevword.h new file mode 100644 index 000000000..e3b892bda --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_state_prevword.h @@ -0,0 +1,156 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_STATE_PREVWORD_H +#define LATINIME_DIC_NODE_STATE_PREVWORD_H + +#include <cstring> // for memset() +#include <stdint.h> + +#include "defines.h" +#include "dic_node_utils.h" + +namespace latinime { + +class DicNodeStatePrevWord { + public: + AK_FORCE_INLINE DicNodeStatePrevWord() + : mPrevWordCount(0), mPrevWordLength(0), mPrevWordStart(0), mPrevWordProbability(0), + mPrevWordNodePos(0) { + memset(mPrevWord, 0, sizeof(mPrevWord)); + memset(mPrevSpacePositions, 0, sizeof(mPrevSpacePositions)); + } + + virtual ~DicNodeStatePrevWord() {} + + void init() { + mPrevWordLength = 0; + mPrevWordCount = 0; + mPrevWordStart = 0; + mPrevWordProbability = -1; + mPrevWordNodePos = NOT_VALID_WORD; + memset(mPrevSpacePositions, 0, sizeof(mPrevSpacePositions)); + } + + void init(const int prevWordNodePos) { + mPrevWordLength = 0; + mPrevWordCount = 0; + mPrevWordStart = 0; + mPrevWordProbability = -1; + mPrevWordNodePos = prevWordNodePos; + memset(mPrevSpacePositions, 0, sizeof(mPrevSpacePositions)); + } + + // Init by copy + AK_FORCE_INLINE void init(const DicNodeStatePrevWord *const prevWord) { + mPrevWordLength = prevWord->mPrevWordLength; + mPrevWordCount = prevWord->mPrevWordCount; + mPrevWordStart = prevWord->mPrevWordStart; + mPrevWordProbability = prevWord->mPrevWordProbability; + mPrevWordNodePos = prevWord->mPrevWordNodePos; + memcpy(mPrevWord, prevWord->mPrevWord, prevWord->mPrevWordLength * sizeof(mPrevWord[0])); + memcpy(mPrevSpacePositions, prevWord->mPrevSpacePositions, sizeof(mPrevSpacePositions)); + } + + void init(const int16_t prevWordCount, const int16_t prevWordProbability, + const int prevWordNodePos, const int *const src0, const int16_t length0, + const int *const src1, const int16_t length1, const int *const prevSpacePositions, + const int lastInputIndex) { + mPrevWordCount = prevWordCount; + mPrevWordProbability = prevWordProbability; + mPrevWordNodePos = prevWordNodePos; + const int twoWordsLen = + DicNodeUtils::appendTwoWords(src0, length0, src1, length1, mPrevWord); + mPrevWord[twoWordsLen] = KEYCODE_SPACE; + mPrevWordStart = length0; + mPrevWordLength = static_cast<int16_t>(twoWordsLen + 1); + memcpy(mPrevSpacePositions, prevSpacePositions, sizeof(mPrevSpacePositions)); + mPrevSpacePositions[mPrevWordCount - 1] = lastInputIndex; + } + + void truncate(const int offset) { + // TODO: memmove + if (mPrevWordLength < offset) { + memset(mPrevWord, 0, sizeof(mPrevWord)); + mPrevWordLength = 0; + return; + } + const int newPrevWordLength = mPrevWordLength - offset; + memmove(mPrevWord, &mPrevWord[offset], newPrevWordLength * sizeof(mPrevWord[0])); + mPrevWordLength = newPrevWordLength; + } + + void outputSpacePositions(int *spaceIndices) const { + // Convert uint16_t to int + for (int i = 0; i < MAX_RESULTS; i++) { + spaceIndices[i] = mPrevSpacePositions[i]; + } + } + + // TODO: remove + int16_t getPrevWordLength() const { + return mPrevWordLength; + } + + int16_t getPrevWordCount() const { + return mPrevWordCount; + } + + int16_t getPrevWordStart() const { + return mPrevWordStart; + } + + int16_t getPrevWordProbability() const { + return mPrevWordProbability; + } + + int getPrevWordNodePos() const { + return mPrevWordNodePos; + } + + int getPrevWordCodePointAt(const int id) const { + return mPrevWord[id]; + } + + bool startsWith(const DicNodeStatePrevWord *const prefix, const int prefixLen) const { + if (prefixLen > mPrevWordLength) { + return false; + } + for (int i = 0; i < prefixLen; ++i) { + if (mPrevWord[i] != prefix->mPrevWord[i]) { + return false; + } + } + return true; + } + + // TODO: Move to private + int mPrevWord[MAX_WORD_LENGTH]; + // TODO: Move to private + int mPrevSpacePositions[MAX_RESULTS]; + + private: + // Caution!!! + // Use a default copy constructor and an assign operator because shallow copies are ok + // for this class + int16_t mPrevWordCount; + int16_t mPrevWordLength; + int16_t mPrevWordStart; + int16_t mPrevWordProbability; + int mPrevWordNodePos; +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_STATE_PREVWORD_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_state_scoring.h b/native/jni/src/suggest/core/dicnode/dic_node_state_scoring.h new file mode 100644 index 000000000..8e816329f --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_state_scoring.h @@ -0,0 +1,166 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_STATE_SCORING_H +#define LATINIME_DIC_NODE_STATE_SCORING_H + +#include <stdint.h> + +#include "defines.h" + +namespace latinime { + +class DicNodeStateScoring { + public: + AK_FORCE_INLINE DicNodeStateScoring() + : mDoubleLetterLevel(NOT_A_DOUBLE_LETTER), + mEditCorrectionCount(0), mProximityCorrectionCount(0), + mNormalizedCompoundDistance(0.0f), mSpatialDistance(0.0f), mLanguageDistance(0.0f), + mTotalPrevWordsLanguageCost(0.0f), mRawLength(0.0f) { + } + + virtual ~DicNodeStateScoring() {} + + void init() { + mEditCorrectionCount = 0; + mProximityCorrectionCount = 0; + mNormalizedCompoundDistance = 0.0f; + mSpatialDistance = 0.0f; + mLanguageDistance = 0.0f; + mTotalPrevWordsLanguageCost = 0.0f; + mRawLength = 0.0f; + mDoubleLetterLevel = NOT_A_DOUBLE_LETTER; + } + + AK_FORCE_INLINE void init(const DicNodeStateScoring *const scoring) { + mEditCorrectionCount = scoring->mEditCorrectionCount; + mProximityCorrectionCount = scoring->mProximityCorrectionCount; + mNormalizedCompoundDistance = scoring->mNormalizedCompoundDistance; + mSpatialDistance = scoring->mSpatialDistance; + mLanguageDistance = scoring->mLanguageDistance; + mTotalPrevWordsLanguageCost = scoring->mTotalPrevWordsLanguageCost; + mRawLength = scoring->mRawLength; + mDoubleLetterLevel = scoring->mDoubleLetterLevel; + } + + void addCost(const float spatialCost, const float languageCost, const bool doNormalization, + const int inputSize, const int totalInputIndex, const bool isEditCorrection, + const bool isProximityCorrection) { + addDistance(spatialCost, languageCost, doNormalization, inputSize, totalInputIndex); + if (isEditCorrection) { + ++mEditCorrectionCount; + } + if (isProximityCorrection) { + ++mProximityCorrectionCount; + } + if (languageCost > 0.0f) { + setTotalPrevWordsLanguageCost(mTotalPrevWordsLanguageCost + languageCost); + } + } + + void addRawLength(const float rawLength) { + mRawLength += rawLength; + } + + float getCompoundDistance() const { + return getCompoundDistance(1.0f); + } + + float getCompoundDistance(const float languageWeight) const { + return mSpatialDistance + mLanguageDistance * languageWeight; + } + + float getNormalizedCompoundDistance() const { + return mNormalizedCompoundDistance; + } + + float getSpatialDistance() const { + return mSpatialDistance; + } + + float getLanguageDistance() const { + return mLanguageDistance; + } + + int16_t getEditCorrectionCount() const { + return mEditCorrectionCount; + } + + int16_t getProximityCorrectionCount() const { + return mProximityCorrectionCount; + } + + float getRawLength() const { + return mRawLength; + } + + DoubleLetterLevel getDoubleLetterLevel() const { + return mDoubleLetterLevel; + } + + void setDoubleLetterLevel(DoubleLetterLevel doubleLetterLevel) { + switch(doubleLetterLevel) { + case NOT_A_DOUBLE_LETTER: + break; + case A_DOUBLE_LETTER: + if (mDoubleLetterLevel != A_STRONG_DOUBLE_LETTER) { + mDoubleLetterLevel = doubleLetterLevel; + } + break; + case A_STRONG_DOUBLE_LETTER: + mDoubleLetterLevel = doubleLetterLevel; + break; + } + } + + float getTotalPrevWordsLanguageCost() const { + return mTotalPrevWordsLanguageCost; + } + + private: + // Caution!!! + // Use a default copy constructor and an assign operator because shallow copies are ok + // for this class + DoubleLetterLevel mDoubleLetterLevel; + + int16_t mEditCorrectionCount; + int16_t mProximityCorrectionCount; + + float mNormalizedCompoundDistance; + float mSpatialDistance; + float mLanguageDistance; + float mTotalPrevWordsLanguageCost; + float mRawLength; + + AK_FORCE_INLINE void addDistance(float spatialDistance, float languageDistance, + bool doNormalization, int inputSize, int totalInputIndex) { + mSpatialDistance += spatialDistance; + mLanguageDistance += languageDistance; + if (!doNormalization) { + mNormalizedCompoundDistance = mSpatialDistance + mLanguageDistance; + } else { + mNormalizedCompoundDistance = (mSpatialDistance + mLanguageDistance) + / static_cast<float>(max(1, totalInputIndex)); + } + } + + //TODO: remove + AK_FORCE_INLINE void setTotalPrevWordsLanguageCost(float totalPrevWordsLanguageCost) { + mTotalPrevWordsLanguageCost = totalPrevWordsLanguageCost; + } +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_STATE_SCORING_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp new file mode 100644 index 000000000..031e706ae --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp @@ -0,0 +1,335 @@ +/* + * 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. + */ + +#include <cstring> +#include <vector> + +#include "binary_format.h" +#include "dic_node.h" +#include "dic_node_utils.h" +#include "dic_node_vector.h" +#include "proximity_info.h" +#include "proximity_info_state.h" + +namespace latinime { + +/////////////////////////////// +// Node initialization utils // +/////////////////////////////// + +/* static */ void DicNodeUtils::initAsRoot(const int rootPos, const uint8_t *const dicRoot, + const int prevWordNodePos, DicNode *newRootNode) { + int curPos = rootPos; + const int pos = curPos; + const int childrenCount = BinaryFormat::getGroupCountAndForwardPointer(dicRoot, &curPos); + const int childrenPos = curPos; + newRootNode->initAsRoot(pos, childrenPos, childrenCount, prevWordNodePos); +} + +/*static */ void DicNodeUtils::initAsRootWithPreviousWord(const int rootPos, + const uint8_t *const dicRoot, DicNode *prevWordLastNode, DicNode *newRootNode) { + int curPos = rootPos; + const int pos = curPos; + const int childrenCount = BinaryFormat::getGroupCountAndForwardPointer(dicRoot, &curPos); + const int childrenPos = curPos; + newRootNode->initAsRootWithPreviousWord(prevWordLastNode, pos, childrenPos, childrenCount); +} + +/* static */ void DicNodeUtils::initByCopy(DicNode *srcNode, DicNode *destNode) { + destNode->initByCopy(srcNode); +} + +/////////////////////////////////// +// Traverse node expansion utils // +/////////////////////////////////// + +/* static */ void DicNodeUtils::createAndGetPassingChildNode(DicNode *dicNode, + const ProximityInfoState *pInfoState, const int pointIndex, const bool exactOnly, + DicNodeVector *childDicNodes) { + // Passing multiple chars node. No need to traverse child + const int codePoint = dicNode->getNodeTypedCodePoint(); + const int baseLowerCaseCodePoint = toBaseLowerCase(codePoint); + const bool isMatch = isMatchedNodeCodePoint(pInfoState, pointIndex, exactOnly, codePoint); + if (isMatch || isIntentionalOmissionCodePoint(baseLowerCaseCodePoint)) { + childDicNodes->pushPassingChild(dicNode); + } +} + +/* static */ int DicNodeUtils::createAndGetLeavingChildNode(DicNode *dicNode, int pos, + const uint8_t *const dicRoot, const int terminalDepth, const ProximityInfoState *pInfoState, + const int pointIndex, const bool exactOnly, const std::vector<int> *const codePointsFilter, + const ProximityInfo *const pInfo, DicNodeVector *childDicNodes) { + int nextPos = pos; + const uint8_t flags = BinaryFormat::getFlagsAndForwardPointer(dicRoot, &pos); + const bool hasMultipleChars = (0 != (BinaryFormat::FLAG_HAS_MULTIPLE_CHARS & flags)); + const bool isTerminal = (0 != (BinaryFormat::FLAG_IS_TERMINAL & flags)); + const bool hasChildren = BinaryFormat::hasChildrenInFlags(flags); + + int codePoint = BinaryFormat::getCodePointAndForwardPointer(dicRoot, &pos); + ASSERT(NOT_A_CODE_POINT != codePoint); + const int nodeCodePoint = codePoint; + // TODO: optimize this + int additionalWordBuf[MAX_WORD_LENGTH]; + uint16_t additionalSubwordLength = 0; + additionalWordBuf[additionalSubwordLength++] = codePoint; + + do { + const int nextCodePoint = hasMultipleChars + ? BinaryFormat::getCodePointAndForwardPointer(dicRoot, &pos) : NOT_A_CODE_POINT; + const bool isLastChar = (NOT_A_CODE_POINT == nextCodePoint); + if (!isLastChar) { + additionalWordBuf[additionalSubwordLength++] = nextCodePoint; + } + codePoint = nextCodePoint; + } while (NOT_A_CODE_POINT != codePoint); + + const int probability = + isTerminal ? BinaryFormat::readProbabilityWithoutMovingPointer(dicRoot, pos) : -1; + pos = BinaryFormat::skipProbability(flags, pos); + int childrenPos = hasChildren ? BinaryFormat::readChildrenPosition(dicRoot, flags, pos) : 0; + const int attributesPos = BinaryFormat::skipChildrenPosition(flags, pos); + const int siblingPos = BinaryFormat::skipChildrenPosAndAttributes(dicRoot, flags, pos); + + if (isDicNodeFilteredOut(nodeCodePoint, pInfo, codePointsFilter)) { + return siblingPos; + } + if (!isMatchedNodeCodePoint(pInfoState, pointIndex, exactOnly, nodeCodePoint)) { + return siblingPos; + } + const int childrenCount = hasChildren + ? BinaryFormat::getGroupCountAndForwardPointer(dicRoot, &childrenPos) : 0; + childDicNodes->pushLeavingChild(dicNode, nextPos, flags, childrenPos, attributesPos, siblingPos, + nodeCodePoint, childrenCount, probability, -1 /* bigramProbability */, isTerminal, + hasMultipleChars, hasChildren, additionalSubwordLength, additionalWordBuf); + return siblingPos; +} + +/* static */ bool DicNodeUtils::isDicNodeFilteredOut(const int nodeCodePoint, + const ProximityInfo *const pInfo, const std::vector<int> *const codePointsFilter) { + const int filterSize = codePointsFilter ? codePointsFilter->size() : 0; + if (filterSize <= 0) { + return false; + } + if (pInfo && (pInfo->getKeyIndexOf(nodeCodePoint) == NOT_AN_INDEX + || isIntentionalOmissionCodePoint(nodeCodePoint))) { + // If normalized nodeCodePoint is not on the keyboard or skippable, this child is never + // filtered. + return false; + } + const int lowerCodePoint = toLowerCase(nodeCodePoint); + const int baseLowerCodePoint = toBaseCodePoint(lowerCodePoint); + // TODO: Avoid linear search + for (int i = 0; i < filterSize; ++i) { + // Checking if a normalized code point is in filter characters when pInfo is not + // null. When pInfo is null, nodeCodePoint is used to check filtering without + // normalizing. + if ((pInfo && ((*codePointsFilter)[i] == lowerCodePoint + || (*codePointsFilter)[i] == baseLowerCodePoint)) + || (!pInfo && (*codePointsFilter)[i] == nodeCodePoint)) { + return false; + } + } + return true; +} + +/* static */ void DicNodeUtils::createAndGetAllLeavingChildNodes(DicNode *dicNode, + const uint8_t *const dicRoot, const ProximityInfoState *pInfoState, const int pointIndex, + const bool exactOnly, const std::vector<int> *const codePointsFilter, + const ProximityInfo *const pInfo, DicNodeVector *childDicNodes) { + const int terminalDepth = dicNode->getLeavingDepth(); + const int childCount = dicNode->getChildrenCount(); + int nextPos = dicNode->getChildrenPos(); + for (int i = 0; i < childCount; i++) { + const int filterSize = codePointsFilter ? codePointsFilter->size() : 0; + nextPos = createAndGetLeavingChildNode(dicNode, nextPos, dicRoot, terminalDepth, pInfoState, + pointIndex, exactOnly, codePointsFilter, pInfo, childDicNodes); + if (!pInfo && filterSize > 0 && childDicNodes->exceeds(filterSize)) { + // All code points have been found. + break; + } + } +} + +/* static */ void DicNodeUtils::getAllChildDicNodes(DicNode *dicNode, const uint8_t *const dicRoot, + DicNodeVector *childDicNodes) { + getProximityChildDicNodes(dicNode, dicRoot, 0, 0, false, childDicNodes); +} + +/* static */ void DicNodeUtils::getProximityChildDicNodes(DicNode *dicNode, + const uint8_t *const dicRoot, const ProximityInfoState *pInfoState, const int pointIndex, + bool exactOnly, DicNodeVector *childDicNodes) { + if (dicNode->isTotalInputSizeExceedingLimit()) { + return; + } + if (!dicNode->isLeavingNode()) { + DicNodeUtils::createAndGetPassingChildNode(dicNode, pInfoState, pointIndex, exactOnly, + childDicNodes); + } else { + DicNodeUtils::createAndGetAllLeavingChildNodes(dicNode, dicRoot, pInfoState, pointIndex, + exactOnly, 0 /* codePointsFilter */, 0 /* pInfo */, + childDicNodes); + } +} + +/////////////////// +// Scoring utils // +/////////////////// +/** + * Computes the combined bigram / unigram cost for the given dicNode. + */ +/* static */ float DicNodeUtils::getBigramNodeImprobability(const uint8_t *const dicRoot, + const DicNode *const node, hash_map_compat<int, int16_t> *bigramCacheMap) { + if (node->isImpossibleBigramWord()) { + return static_cast<float>(MAX_VALUE_FOR_WEIGHTING); + } + const int probability = getBigramNodeProbability(dicRoot, node, bigramCacheMap); + // TODO: This equation to calculate the improbability looks unreasonable. Investigate this. + const float cost = static_cast<float>(MAX_PROBABILITY - probability) + / static_cast<float>(MAX_PROBABILITY); + return cost; +} + +/* static */ int DicNodeUtils::getBigramNodeProbability(const uint8_t *const dicRoot, + const DicNode *const node, hash_map_compat<int, int16_t> *bigramCacheMap) { + const int unigramProbability = node->getProbability(); + const int encodedDiffOfBigramProbability = + getBigramNodeEncodedDiffProbability(dicRoot, node, bigramCacheMap); + if (NOT_A_PROBABILITY == encodedDiffOfBigramProbability) { + return backoff(unigramProbability); + } + return BinaryFormat::computeProbabilityForBigram( + unigramProbability, encodedDiffOfBigramProbability); +} + +/////////////////////////////////////// +// Bigram / Unigram dictionary utils // +/////////////////////////////////////// + +/* static */ int16_t DicNodeUtils::getBigramNodeEncodedDiffProbability(const uint8_t *const dicRoot, + const DicNode *const node, hash_map_compat<int, int16_t> *bigramCacheMap) { + const int wordPos = node->getPos(); + const int prevWordPos = node->getPrevWordPos(); + return getBigramProbability(dicRoot, prevWordPos, wordPos, bigramCacheMap); +} + +// TODO: Move this to BigramDictionary +/* static */ int16_t DicNodeUtils::getBigramProbability(const uint8_t *const dicRoot, int pos, + const int nextPos, hash_map_compat<int, int16_t> *bigramCacheMap) { + // TODO: this is painfully slow compared to the method used in the previous version of the + // algorithm. Switch to that method. + if (NOT_VALID_WORD == pos) return NOT_A_PROBABILITY; + if (NOT_VALID_WORD == nextPos) return NOT_A_PROBABILITY; + + // Create a hash code for the given node pair (based on Josh Bloch's effective Java). + // TODO: Use a real hash map data structure that deals with collisions. + int hash = 17; + hash = hash * 31 + pos; + hash = hash * 31 + nextPos; + + hash_map_compat<int, int16_t>::const_iterator mapPos = bigramCacheMap->find(hash); + if (mapPos != bigramCacheMap->end()) { + return mapPos->second; + } + if (NOT_VALID_WORD == pos) { + return NOT_A_PROBABILITY; + } + const uint8_t flags = BinaryFormat::getFlagsAndForwardPointer(dicRoot, &pos); + if (0 == (flags & BinaryFormat::FLAG_HAS_BIGRAMS)) { + return NOT_A_PROBABILITY; + } + if (0 == (flags & BinaryFormat::FLAG_HAS_MULTIPLE_CHARS)) { + BinaryFormat::getCodePointAndForwardPointer(dicRoot, &pos); + } else { + pos = BinaryFormat::skipOtherCharacters(dicRoot, pos); + } + pos = BinaryFormat::skipChildrenPosition(flags, pos); + pos = BinaryFormat::skipProbability(flags, pos); + uint8_t bigramFlags; + int count = 0; + do { + bigramFlags = BinaryFormat::getFlagsAndForwardPointer(dicRoot, &pos); + const int bigramPos = BinaryFormat::getAttributeAddressAndForwardPointer(dicRoot, + bigramFlags, &pos); + if (bigramPos == nextPos) { + const int16_t probability = BinaryFormat::MASK_ATTRIBUTE_PROBABILITY & bigramFlags; + if (static_cast<int>(bigramCacheMap->size()) < MAX_BIGRAM_MAP_SIZE) { + (*bigramCacheMap)[hash] = probability; + } + return probability; + } + count++; + } while ((0 != (BinaryFormat::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags)) + && count < MAX_BIGRAMS_CONSIDERED_PER_CONTEXT); + if (static_cast<int>(bigramCacheMap->size()) < MAX_BIGRAM_MAP_SIZE) { + // TODO: does this -1 mean NOT_VALID_WORD? + (*bigramCacheMap)[hash] = -1; + } + return NOT_A_PROBABILITY; +} + +/* static */ int DicNodeUtils::getWordPos(const uint8_t *const dicRoot, const int *word, + const int wordLength) { + if (!word) { + return NOT_VALID_WORD; + } + return BinaryFormat::getTerminalPosition( + dicRoot, word, wordLength, false /* forceLowerCaseSearch */); +} + +/* static */ bool DicNodeUtils::isMatchedNodeCodePoint(const ProximityInfoState *pInfoState, + const int pointIndex, const bool exactOnly, const int nodeCodePoint) { + if (!pInfoState) { + return true; + } + if (exactOnly) { + return pInfoState->getPrimaryCodePointAt(pointIndex) == nodeCodePoint; + } + const ProximityType matchedId = pInfoState->getProximityType(pointIndex, nodeCodePoint, + true /* checkProximityChars */); + return isProximityChar(matchedId); +} + +//////////////// +// Char utils // +//////////////// + +// TODO: Move to char_utils? +/* static */ int DicNodeUtils::appendTwoWords(const int *const src0, const int16_t length0, + const int *const src1, const int16_t length1, int *dest) { + int actualLength0 = 0; + for (int i = 0; i < length0; ++i) { + if (src0[i] == 0) { + break; + } + actualLength0 = i + 1; + } + actualLength0 = min(actualLength0, MAX_WORD_LENGTH); + memcpy(dest, src0, actualLength0 * sizeof(dest[0])); + if (!src1 || length1 == 0) { + return actualLength0; + } + int actualLength1 = 0; + for (int i = 0; i < length1; ++i) { + if (src1[i] == 0) { + break; + } + actualLength1 = i + 1; + } + actualLength1 = min(actualLength1, MAX_WORD_LENGTH - actualLength0 - 1); + memcpy(&dest[actualLength0], src1, actualLength1 * sizeof(dest[0])); + return actualLength0 + actualLength1; +} +} // namespace latinime diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.h b/native/jni/src/suggest/core/dicnode/dic_node_utils.h new file mode 100644 index 000000000..15f9730de --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.h @@ -0,0 +1,88 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_UTILS_H +#define LATINIME_DIC_NODE_UTILS_H + +#include <stdint.h> +#include <vector> + +#include "defines.h" +#include "hash_map_compat.h" + +namespace latinime { + +class DicNode; +class DicNodeVector; +class ProximityInfo; +class ProximityInfoState; + +class DicNodeUtils { + public: + static int appendTwoWords(const int *src0, const int16_t length0, const int *src1, + const int16_t length1, int *dest); + static void initAsRoot(const int rootPos, const uint8_t *const dicRoot, + const int prevWordNodePos, DicNode *newRootNode); + static void initAsRootWithPreviousWord(const int rootPos, const uint8_t *const dicRoot, + DicNode *prevWordLastNode, DicNode *newRootNode); + static void initByCopy(DicNode *srcNode, DicNode *destNode); + static void getAllChildDicNodes(DicNode *dicNode, const uint8_t *const dicRoot, + DicNodeVector *childDicNodes); + static int getWordPos(const uint8_t *const dicRoot, const int *word, const int prevWordLength); + static float getBigramNodeImprobability(const uint8_t *const dicRoot, + const DicNode *const node, hash_map_compat<int, int16_t> *const bigramCacheMap); + static bool isDicNodeFilteredOut(const int nodeCodePoint, const ProximityInfo *const pInfo, + const std::vector<int> *const codePointsFilter); + // TODO: Move to private + static void getProximityChildDicNodes(DicNode *dicNode, const uint8_t *const dicRoot, + const ProximityInfoState *pInfoState, const int pointIndex, bool exactOnly, + DicNodeVector *childDicNodes); + + // TODO: Move to proximity info + static bool isProximityChar(ProximityType type) { + return type == MATCH_CHAR || type == PROXIMITY_CHAR || type == ADDITIONAL_PROXIMITY_CHAR; + } + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(DicNodeUtils); + // Max cache size for the space omission error correction bigram lookup + static const int MAX_BIGRAM_MAP_SIZE = 20000; + // Max number of bigrams to look up + static const int MAX_BIGRAMS_CONSIDERED_PER_CONTEXT = 500; + + static int getBigramNodeProbability(const uint8_t *const dicRoot, const DicNode *const node, + hash_map_compat<int, int16_t> *bigramCacheMap); + static int16_t getBigramNodeEncodedDiffProbability(const uint8_t *const dicRoot, + const DicNode *const node, hash_map_compat<int, int16_t> *bigramCacheMap); + static void createAndGetPassingChildNode(DicNode *dicNode, const ProximityInfoState *pInfoState, + const int pointIndex, const bool exactOnly, DicNodeVector *childDicNodes); + static void createAndGetAllLeavingChildNodes(DicNode *dicNode, const uint8_t *const dicRoot, + const ProximityInfoState *pInfoState, const int pointIndex, const bool exactOnly, + const std::vector<int> *const codePointsFilter, + const ProximityInfo *const pInfo, DicNodeVector *childDicNodes); + static int createAndGetLeavingChildNode(DicNode *dicNode, int pos, const uint8_t *const dicRoot, + const int terminalDepth, const ProximityInfoState *pInfoState, const int pointIndex, + const bool exactOnly, const std::vector<int> *const codePointsFilter, + const ProximityInfo *const pInfo, DicNodeVector *childDicNodes); + static int16_t getBigramProbability(const uint8_t *const dicRoot, int pos, const int nextPos, + hash_map_compat<int, int16_t> *bigramCacheMap); + + // TODO: Move to proximity info + static bool isMatchedNodeCodePoint(const ProximityInfoState *pInfoState, const int pointIndex, + const bool exactOnly, const int nodeCodePoint); +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_UTILS_H diff --git a/native/jni/src/suggest/core/dicnode/dic_node_vector.h b/native/jni/src/suggest/core/dicnode/dic_node_vector.h new file mode 100644 index 000000000..ca07edaee --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_node_vector.h @@ -0,0 +1,95 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODE_VECTOR_H +#define LATINIME_DIC_NODE_VECTOR_H + +#include <vector> + +#include "defines.h" +#include "dic_node.h" + +namespace latinime { + +class DicNodeVector { + public: +#ifdef FLAG_DBG + // 0 will introduce resizing the vector. + static const int DEFAULT_NODES_SIZE_FOR_OPTIMIZATION = 0; +#else + static const int DEFAULT_NODES_SIZE_FOR_OPTIMIZATION = 60; +#endif + AK_FORCE_INLINE DicNodeVector() : mDicNodes(0), mLock(false), mEmptyNode() {} + + // Specify the capacity of the vector + AK_FORCE_INLINE DicNodeVector(const int size) : mDicNodes(0), mLock(false), mEmptyNode() { + mDicNodes.reserve(size); + } + + // Non virtual inline destructor -- never inherit this class + AK_FORCE_INLINE ~DicNodeVector() {} + + AK_FORCE_INLINE void clear() { + mDicNodes.clear(); + mLock = false; + } + + int getSizeAndLock() { + mLock = true; + return static_cast<int>(mDicNodes.size()); + } + + bool exceeds(const size_t limit) const { + return mDicNodes.size() >= limit; + } + + void pushPassingChild(DicNode *dicNode) { + ASSERT(!mLock); + mDicNodes.push_back(mEmptyNode); + mDicNodes.back().initAsPassingChild(dicNode); + } + + void pushLeavingChild(DicNode *dicNode, const int pos, const uint8_t flags, + const int childrenPos, const int attributesPos, const int siblingPos, + const int nodeCodePoint, const int childrenCount, const int probability, + const int bigramProbability, const bool isTerminal, const bool hasMultipleChars, + const bool hasChildren, const uint16_t additionalSubwordLength, + const int *additionalSubword) { + ASSERT(!mLock); + mDicNodes.push_back(mEmptyNode); + mDicNodes.back().initAsChild(dicNode, pos, flags, childrenPos, attributesPos, siblingPos, + nodeCodePoint, childrenCount, probability, -1 /* bigramProbability */, isTerminal, + hasMultipleChars, hasChildren, additionalSubwordLength, additionalSubword); + } + + DicNode *operator[](const int id) { + ASSERT(id < static_cast<int>(mDicNodes.size())); + return &mDicNodes[id]; + } + + DicNode *front() { + ASSERT(1 <= static_cast<int>(mDicNodes.size())); + return &mDicNodes[0]; + } + + private: + DISALLOW_COPY_AND_ASSIGN(DicNodeVector); + std::vector<DicNode> mDicNodes; + bool mLock; + DicNode mEmptyNode; +}; +} // namespace latinime +#endif // LATINIME_DIC_NODE_VECTOR_H diff --git a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp new file mode 100644 index 000000000..b9a60780b --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.cpp @@ -0,0 +1,59 @@ +/* + * 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. + */ + +#include <list> + +#include "defines.h" +#include "dic_node_priority_queue.h" +#include "dic_node_utils.h" +#include "dic_nodes_cache.h" + +namespace latinime { + +/** + * Truncates all of the dicNodes so that they start at the given commit point. + * Only called for multi-word typing input. + */ +DicNode *DicNodesCache::setCommitPoint(int commitPoint) { + std::list<DicNode> dicNodesList; + while (mCachedDicNodesForContinuousSuggestion->getSize() > 0) { + DicNode dicNode; + mCachedDicNodesForContinuousSuggestion->copyPop(&dicNode); + dicNodesList.push_front(dicNode); + } + + // Get the starting words of the top scoring dicNode (last dicNode popped from priority queue) + // up to the commit point. These words have already been committed to the text view. + DicNode *topDicNode = &dicNodesList.front(); + DicNode topDicNodeCopy; + DicNodeUtils::initByCopy(topDicNode, &topDicNodeCopy); + + // Keep only those dicNodes that match the same starting words. + std::list<DicNode>::iterator iter; + for (iter = dicNodesList.begin(); iter != dicNodesList.end(); iter++) { + DicNode *dicNode = &*iter; + if (dicNode->truncateNode(&topDicNodeCopy, commitPoint)) { + mCachedDicNodesForContinuousSuggestion->copyPush(dicNode); + } else { + // Top dicNode should be reprocessed. + ASSERT(dicNode != topDicNode); + DicNode::managedDelete(dicNode); + } + } + mInputIndex -= commitPoint; + return topDicNode; +} +} // namespace latinime diff --git a/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h new file mode 100644 index 000000000..a62aa422a --- /dev/null +++ b/native/jni/src/suggest/core/dicnode/dic_nodes_cache.h @@ -0,0 +1,185 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_NODES_CACHE_H +#define LATINIME_DIC_NODES_CACHE_H + +#include <stdint.h> + +#include "defines.h" +#include "dic_node_priority_queue.h" + +#define INITIAL_QUEUE_ID_ACTIVE 0 +#define INITIAL_QUEUE_ID_NEXT_ACTIVE 1 +#define INITIAL_QUEUE_ID_TERMINAL 2 +#define INITIAL_QUEUE_ID_CACHE_FOR_CONTINUOUS_SUGGESTION 3 +#define PRIORITY_QUEUES_SIZE 4 + +namespace latinime { + +class DicNode; + +/** + * Class for controlling dicNode search priority queue and lexicon trie traversal. + */ +class DicNodesCache { + public: + AK_FORCE_INLINE DicNodesCache() + : mActiveDicNodes(&mDicNodePriorityQueues[INITIAL_QUEUE_ID_ACTIVE]), + mNextActiveDicNodes(&mDicNodePriorityQueues[INITIAL_QUEUE_ID_NEXT_ACTIVE]), + mTerminalDicNodes(&mDicNodePriorityQueues[INITIAL_QUEUE_ID_TERMINAL]), + mCachedDicNodesForContinuousSuggestion( + &mDicNodePriorityQueues[INITIAL_QUEUE_ID_CACHE_FOR_CONTINUOUS_SUGGESTION]), + mInputIndex(0), mLastCachedInputIndex(0) { + } + + AK_FORCE_INLINE virtual ~DicNodesCache() {} + + AK_FORCE_INLINE void reset(const int nextActiveSize, const int terminalSize) { + mInputIndex = 0; + mLastCachedInputIndex = 0; + mActiveDicNodes->reset(); + mNextActiveDicNodes->clearAndResize(nextActiveSize); + mTerminalDicNodes->clearAndResize(terminalSize); + mCachedDicNodesForContinuousSuggestion->reset(); + } + + AK_FORCE_INLINE void continueSearch() { + resetTemporaryCaches(); + restoreActiveDicNodesFromCache(); + } + + AK_FORCE_INLINE void advanceActiveDicNodes() { + if (DEBUG_DICT) { + AKLOGI("Advance active %d nodes.", mNextActiveDicNodes->getSize()); + } + if (DEBUG_DICT_FULL) { + mNextActiveDicNodes->dump(); + } + mNextActiveDicNodes = + moveNodesAndReturnReusableEmptyQueue(mNextActiveDicNodes, &mActiveDicNodes); + } + + DicNode *setCommitPoint(int commitPoint); + + int activeSize() const { return mActiveDicNodes->getSize(); } + int terminalSize() const { return mTerminalDicNodes->getSize(); } + bool isLookAheadCorrectionInputIndex(const int inputIndex) const { + return inputIndex == mInputIndex - 1; + } + void advanceInputIndex(const int inputSize) { + if (mInputIndex < inputSize) { + mInputIndex++; + } + } + + AK_FORCE_INLINE void copyPushTerminal(DicNode *dicNode) { + mTerminalDicNodes->copyPush(dicNode); + } + + AK_FORCE_INLINE void copyPushActive(DicNode *dicNode) { + mActiveDicNodes->copyPush(dicNode); + } + + AK_FORCE_INLINE bool copyPushContinue(DicNode *dicNode) { + return mCachedDicNodesForContinuousSuggestion->copyPush(dicNode); + } + + AK_FORCE_INLINE void copyPushNextActive(DicNode *dicNode) { + DicNode *pushedDicNode = mNextActiveDicNodes->copyPush(dicNode); + if (!pushedDicNode) { + if (dicNode->isCached()) { + dicNode->remove(); + } + // We simply drop any dic node that was not cached, ignoring the slim chance + // that one of its children represents what the user really wanted. + } + } + + void popTerminal(DicNode *dest) { + mTerminalDicNodes->copyPop(dest); + } + + void popActive(DicNode *dest) { + mActiveDicNodes->copyPop(dest); + } + + bool hasCachedDicNodesForContinuousSuggestion() const { + return mCachedDicNodesForContinuousSuggestion + && mCachedDicNodesForContinuousSuggestion->getSize() > 0; + } + + AK_FORCE_INLINE bool isCacheBorderForTyping(const int inputSize) const { + // TODO: Move this variable to header + static const int CACHE_BACK_LENGTH = 3; + const int cacheInputIndex = inputSize - CACHE_BACK_LENGTH; + const bool shouldCache = (cacheInputIndex == mInputIndex) + && (cacheInputIndex != mLastCachedInputIndex); + return shouldCache; + } + + AK_FORCE_INLINE void updateLastCachedInputIndex() { + mLastCachedInputIndex = mInputIndex; + } + + private: + DISALLOW_COPY_AND_ASSIGN(DicNodesCache); + + AK_FORCE_INLINE void restoreActiveDicNodesFromCache() { + if (DEBUG_DICT) { + AKLOGI("Restore %d nodes. inputIndex = %d.", + mCachedDicNodesForContinuousSuggestion->getSize(), mLastCachedInputIndex); + } + if (DEBUG_DICT_FULL || DEBUG_CACHE) { + mCachedDicNodesForContinuousSuggestion->dump(); + } + mInputIndex = mLastCachedInputIndex; + mCachedDicNodesForContinuousSuggestion = + moveNodesAndReturnReusableEmptyQueue( + mCachedDicNodesForContinuousSuggestion, &mActiveDicNodes); + } + + AK_FORCE_INLINE static DicNodePriorityQueue *moveNodesAndReturnReusableEmptyQueue( + DicNodePriorityQueue *src, DicNodePriorityQueue **dest) { + const int srcMaxSize = src->getMaxSize(); + const int destMaxSize = (*dest)->getMaxSize(); + DicNodePriorityQueue *tmp = *dest; + *dest = src; + (*dest)->setMaxSize(destMaxSize); + tmp->clearAndResize(srcMaxSize); + return tmp; + } + + AK_FORCE_INLINE void resetTemporaryCaches() { + mActiveDicNodes->clear(); + mNextActiveDicNodes->clear(); + mTerminalDicNodes->clear(); + } + + DicNodePriorityQueue mDicNodePriorityQueues[PRIORITY_QUEUES_SIZE]; + // Active dicNodes currently being expanded. + DicNodePriorityQueue *mActiveDicNodes; + // Next dicNodes to be expanded. + DicNodePriorityQueue *mNextActiveDicNodes; + // Current top terminal dicNodes. + DicNodePriorityQueue *mTerminalDicNodes; + // Cached dicNodes used for continuous suggestion. + DicNodePriorityQueue *mCachedDicNodesForContinuousSuggestion; + int mInputIndex; + int mLastCachedInputIndex; +}; +} // namespace latinime +#endif // LATINIME_DIC_NODES_CACHE_H diff --git a/native/jni/src/suggest/core/dictionary/shortcut_utils.h b/native/jni/src/suggest/core/dictionary/shortcut_utils.h new file mode 100644 index 000000000..c411408ec --- /dev/null +++ b/native/jni/src/suggest/core/dictionary/shortcut_utils.h @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#ifndef LATINIME_SHORTCUT_UTILS +#define LATINIME_SHORTCUT_UTILS + +#include "defines.h" +#include "suggest/core/dicnode/dic_node_utils.h" +#include "terminal_attributes.h" + +namespace latinime { + +class ShortcutUtils { + public: + static int outputShortcuts(const TerminalAttributes *const terminalAttributes, + int outputWordIndex, const int finalScore, int *const outputCodePoints, + int *const frequencies, int *const outputTypes, const bool sameAsTyped) { + TerminalAttributes::ShortcutIterator iterator = terminalAttributes->getShortcutIterator(); + while (iterator.hasNextShortcutTarget() && outputWordIndex < MAX_RESULTS) { + int shortcutTarget[MAX_WORD_LENGTH]; + int shortcutProbability; + const int shortcutTargetStringLength = iterator.getNextShortcutTarget( + MAX_WORD_LENGTH, shortcutTarget, &shortcutProbability); + int shortcutScore; + int kind; + if (shortcutProbability == BinaryFormat::WHITELIST_SHORTCUT_PROBABILITY + && sameAsTyped) { + shortcutScore = S_INT_MAX; + kind = Dictionary::KIND_WHITELIST; + } else { + // shortcut entry's score == its base entry's score - 1 + shortcutScore = finalScore; + // Protection against int underflow + shortcutScore = max(S_INT_MIN + 1, shortcutScore) - 1; + kind = Dictionary::KIND_CORRECTION; + } + outputTypes[outputWordIndex] = kind; + frequencies[outputWordIndex] = shortcutScore; + frequencies[outputWordIndex] = max(S_INT_MIN + 1, shortcutScore) - 1; + const int startIndex2 = outputWordIndex * MAX_WORD_LENGTH; + DicNodeUtils::appendTwoWords(0, 0, shortcutTarget, shortcutTargetStringLength, + &outputCodePoints[startIndex2]); + ++outputWordIndex; + } + return outputWordIndex; + } + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(ShortcutUtils); +}; +} // namespace latinime +#endif // LATINIME_SHORTCUT_UTILS diff --git a/native/jni/src/suggest/core/policy/scoring.h b/native/jni/src/suggest/core/policy/scoring.h new file mode 100644 index 000000000..b8c10e25a --- /dev/null +++ b/native/jni/src/suggest/core/policy/scoring.h @@ -0,0 +1,57 @@ +/* + * 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. + */ + +#ifndef LATINIME_SCORING_H +#define LATINIME_SCORING_H + +#include "defines.h" + +namespace latinime { + +class DicNode; +class DicTraverseSession; + +// This class basically tweaks suggestions and distances apart from CompoundDistance +class Scoring { + public: + virtual int calculateFinalScore(const float compoundDistance, const int inputSize, + const bool forceCommit) const = 0; + virtual bool getMostProbableString( + const DicTraverseSession *const traverseSession, const int terminalSize, + const float languageWeight, int *const outputCodePoints, int *const type, + int *const freq) const = 0; + virtual void safetyNetForMostProbableString(const int terminalSize, + const int maxScore, int *const outputCodePoints, int *const frequencies) const = 0; + // TODO: Make more generic + virtual void searchWordWithDoubleLetter(DicNode *terminals, + const int terminalSize, int *doubleLetterTerminalIndex, + DoubleLetterLevel *doubleLetterLevel) const = 0; + virtual float getAdjustedLanguageWeight(DicTraverseSession *const traverseSession, + DicNode *const terminals, const int size) const = 0; + virtual float getDoubleLetterDemotionDistanceCost(const int terminalIndex, + const int doubleLetterTerminalIndex, + const DoubleLetterLevel doubleLetterLevel) const = 0; + virtual bool doesAutoCorrectValidWord() const = 0; + + protected: + Scoring() {} + virtual ~Scoring() {} + + private: + DISALLOW_COPY_AND_ASSIGN(Scoring); +}; +} // namespace latinime +#endif // LATINIME_SCORING_H diff --git a/native/jni/src/suggest/core/policy/suggest_policy.h b/native/jni/src/suggest/core/policy/suggest_policy.h new file mode 100644 index 000000000..885e214f7 --- /dev/null +++ b/native/jni/src/suggest/core/policy/suggest_policy.h @@ -0,0 +1,39 @@ +/* + * 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. + */ + +#ifndef LATINIME_SUGGEST_POLICY_H +#define LATINIME_SUGGEST_POLICY_H + +#include "defines.h" + +namespace latinime { +class Traversal; +class Scoring; +class Weighting; + +class SuggestPolicy { + public: + SuggestPolicy() {} + virtual ~SuggestPolicy() {} + virtual const Traversal *getTraversal() const = 0; + virtual const Scoring *getScoring() const = 0; + virtual const Weighting *getWeighting() const = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(SuggestPolicy); +}; +} // namespace latinime +#endif // LATINIME_SUGGEST_POLICY_H diff --git a/native/jni/src/suggest/core/policy/traversal.h b/native/jni/src/suggest/core/policy/traversal.h new file mode 100644 index 000000000..02c358aec --- /dev/null +++ b/native/jni/src/suggest/core/policy/traversal.h @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#ifndef LATINIME_TRAVERSAL_H +#define LATINIME_TRAVERSAL_H + +#include "defines.h" + +namespace latinime { + +class DicTraverseSession; + +class Traversal { + public: + virtual int getMaxPointerCount() const = 0; + virtual bool allowsErrorCorrections(const DicNode *const dicNode) const = 0; + virtual bool isOmission(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode, const DicNode *const childDicNode) const = 0; + virtual bool isSpaceSubstitutionTerminal(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + virtual bool isSpaceOmissionTerminal(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + virtual bool shouldDepthLevelCache(const DicTraverseSession *const traverseSession) const = 0; + virtual bool shouldNodeLevelCache(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + virtual bool canDoLookAheadCorrection(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + virtual ProximityType getProximityType( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode, + const DicNode *const childDicNode) const = 0; + virtual bool sameAsTyped(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + virtual bool needsToTraverseAllUserInput() const = 0; + virtual float getMaxSpatialDistance() const = 0; + virtual bool allowPartialCommit() const = 0; + virtual int getDefaultExpandDicNodeSize() const = 0; + virtual int getMaxCacheSize() const = 0; + virtual bool isPossibleOmissionChildNode( + const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode, + const DicNode *const dicNode) const = 0; + virtual bool isGoodToTraverseNextWord(const DicNode *const dicNode) const = 0; + + protected: + Traversal() {} + virtual ~Traversal() {} + + private: + DISALLOW_COPY_AND_ASSIGN(Traversal); +}; +} // namespace latinime +#endif // LATINIME_TRAVERSAL_H diff --git a/native/jni/src/suggest/core/policy/weighting.cpp b/native/jni/src/suggest/core/policy/weighting.cpp new file mode 100644 index 000000000..e62b70423 --- /dev/null +++ b/native/jni/src/suggest/core/policy/weighting.cpp @@ -0,0 +1,245 @@ +/* + * 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. + */ + +#include "suggest/core/policy/weighting.h" + +#include "char_utils.h" +#include "defines.h" +#include "hash_map_compat.h" +#include "suggest/core/dicnode/dic_node.h" +#include "suggest/core/dicnode/dic_node_profiler.h" +#include "suggest/core/dicnode/dic_node_utils.h" +#include "suggest/core/session/dic_traverse_session.h" + +namespace latinime { + +static inline void profile(const CorrectionType correctionType, DicNode *const node) { +#if DEBUG_DICT + switch (correctionType) { + case CT_OMISSION: + PROF_OMISSION(node->mProfiler); + return; + case CT_ADDITIONAL_PROXIMITY: + PROF_ADDITIONAL_PROXIMITY(node->mProfiler); + return; + case CT_SUBSTITUTION: + PROF_SUBSTITUTION(node->mProfiler); + return; + case CT_NEW_WORD: + PROF_NEW_WORD(node->mProfiler); + return; + case CT_MATCH: + PROF_MATCH(node->mProfiler); + return; + case CT_COMPLETION: + PROF_COMPLETION(node->mProfiler); + return; + case CT_TERMINAL: + PROF_TERMINAL(node->mProfiler); + return; + case CT_SPACE_SUBSTITUTION: + PROF_SPACE_SUBSTITUTION(node->mProfiler); + return; + case CT_INSERTION: + PROF_INSERTION(node->mProfiler); + return; + case CT_TRANSPOSITION: + PROF_TRANSPOSITION(node->mProfiler); + return; + default: + // do nothing + return; + } +#else + // do nothing +#endif +} + +/* static */ void Weighting::addCostAndForwardInputIndex(const Weighting *const weighting, + const CorrectionType correctionType, + const DicTraverseSession *const traverseSession, + const DicNode *const parentDicNode, DicNode *const dicNode, + hash_map_compat<int, int16_t> *const bigramCacheMap) { + const int inputSize = traverseSession->getInputSize(); + DicNode_InputStateG inputStateG; + inputStateG.mNeedsToUpdateInputStateG = false; // Don't use input info by default + const float spatialCost = Weighting::getSpatialCost(weighting, correctionType, + traverseSession, parentDicNode, dicNode, &inputStateG); + const float languageCost = Weighting::getLanguageCost(weighting, correctionType, + traverseSession, parentDicNode, dicNode, bigramCacheMap); + const bool edit = Weighting::isEditCorrection(correctionType); + const bool proximity = Weighting::isProximityCorrection(weighting, correctionType, + traverseSession, dicNode); + profile(correctionType, dicNode); + if (inputStateG.mNeedsToUpdateInputStateG) { + dicNode->updateInputIndexG(&inputStateG); + } else { + dicNode->forwardInputIndex(0, getForwardInputCount(correctionType), + (correctionType == CT_TRANSPOSITION)); + } + dicNode->addCost(spatialCost, languageCost, weighting->needsToNormalizeCompoundDistance(), + inputSize, edit, proximity); +} + +/* static */ float Weighting::getSpatialCost(const Weighting *const weighting, + const CorrectionType correctionType, + const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode, + const DicNode *const dicNode, DicNode_InputStateG *const inputStateG) { + switch(correctionType) { + case CT_OMISSION: + return weighting->getOmissionCost(parentDicNode, dicNode); + case CT_ADDITIONAL_PROXIMITY: + // only used for typing + return weighting->getAdditionalProximityCost(); + case CT_SUBSTITUTION: + // only used for typing + return weighting->getSubstitutionCost(); + case CT_NEW_WORD: + return weighting->getNewWordCost(dicNode); + case CT_MATCH: + return weighting->getMatchedCost(traverseSession, dicNode, inputStateG); + case CT_COMPLETION: + return weighting->getCompletionCost(traverseSession, dicNode); + case CT_TERMINAL: + return weighting->getTerminalSpatialCost(traverseSession, dicNode); + case CT_SPACE_SUBSTITUTION: + return weighting->getSpaceSubstitutionCost(); + case CT_INSERTION: + return weighting->getInsertionCost(traverseSession, parentDicNode, dicNode); + case CT_TRANSPOSITION: + return weighting->getTranspositionCost(traverseSession, parentDicNode, dicNode); + default: + return 0.0f; + } +} + +/* static */ float Weighting::getLanguageCost(const Weighting *const weighting, + const CorrectionType correctionType, const DicTraverseSession *const traverseSession, + const DicNode *const parentDicNode, const DicNode *const dicNode, + hash_map_compat<int, int16_t> *const bigramCacheMap) { + switch(correctionType) { + case CT_OMISSION: + return 0.0f; + case CT_SUBSTITUTION: + return 0.0f; + case CT_NEW_WORD: + return weighting->getNewWordBigramCost(traverseSession, parentDicNode, bigramCacheMap); + case CT_MATCH: + return 0.0f; + case CT_COMPLETION: + return 0.0f; + case CT_TERMINAL: { + const float languageImprobability = + DicNodeUtils::getBigramNodeImprobability( + traverseSession->getOffsetDict(), dicNode, bigramCacheMap); + return weighting->getTerminalLanguageCost(traverseSession, dicNode, languageImprobability); + } + case CT_SPACE_SUBSTITUTION: + return 0.0f; + case CT_INSERTION: + return 0.0f; + case CT_TRANSPOSITION: + return 0.0f; + default: + return 0.0f; + } +} + +/* static */ bool Weighting::isEditCorrection(const CorrectionType correctionType) { + switch(correctionType) { + case CT_OMISSION: + return true; + case CT_ADDITIONAL_PROXIMITY: + // Should return true? + return false; + case CT_SUBSTITUTION: + // Should return true? + return false; + case CT_NEW_WORD: + return false; + case CT_MATCH: + return false; + case CT_COMPLETION: + return false; + case CT_TERMINAL: + return false; + case CT_SPACE_SUBSTITUTION: + return false; + case CT_INSERTION: + return true; + case CT_TRANSPOSITION: + return true; + default: + return false; + } +} + +/* static */ bool Weighting::isProximityCorrection(const Weighting *const weighting, + const CorrectionType correctionType, + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) { + switch(correctionType) { + case CT_OMISSION: + return false; + case CT_ADDITIONAL_PROXIMITY: + return false; + case CT_SUBSTITUTION: + return false; + case CT_NEW_WORD: + return false; + case CT_MATCH: + return weighting->isProximityDicNode(traverseSession, dicNode); + case CT_COMPLETION: + return false; + case CT_TERMINAL: + return false; + case CT_SPACE_SUBSTITUTION: + return false; + case CT_INSERTION: + return false; + case CT_TRANSPOSITION: + return false; + default: + return false; + } +} + +/* static */ int Weighting::getForwardInputCount(const CorrectionType correctionType) { + switch(correctionType) { + case CT_OMISSION: + return 0; + case CT_ADDITIONAL_PROXIMITY: + return 0; + case CT_SUBSTITUTION: + return 0; + case CT_NEW_WORD: + return 0; + case CT_MATCH: + return 1; + case CT_COMPLETION: + return 0; + case CT_TERMINAL: + return 0; + case CT_SPACE_SUBSTITUTION: + return 1; + case CT_INSERTION: + return 2; + case CT_TRANSPOSITION: + return 2; + default: + return 0; + } +} +} // namespace latinime diff --git a/native/jni/src/suggest/core/policy/weighting.h b/native/jni/src/suggest/core/policy/weighting.h new file mode 100644 index 000000000..b92dbe278 --- /dev/null +++ b/native/jni/src/suggest/core/policy/weighting.h @@ -0,0 +1,105 @@ +/* + * 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. + */ + +#ifndef LATINIME_WEIGHTING_H +#define LATINIME_WEIGHTING_H + +#include "defines.h" +#include "hash_map_compat.h" + +namespace latinime { + +class DicNode; +class DicTraverseSession; +struct DicNode_InputStateG; + +class Weighting { + public: + static void addCostAndForwardInputIndex(const Weighting *const weighting, + const CorrectionType correctionType, + const DicTraverseSession *const traverseSession, + const DicNode *const parentDicNode, DicNode *const dicNode, + hash_map_compat<int, int16_t> *const bigramCacheMap); + + protected: + virtual float getTerminalSpatialCost(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + + virtual float getOmissionCost( + const DicNode *const parentDicNode, const DicNode *const dicNode) const = 0; + + virtual float getMatchedCost( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode, + DicNode_InputStateG *inputStateG) const = 0; + + virtual bool isProximityDicNode(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + + virtual float getTranspositionCost( + const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode, + const DicNode *const dicNode) const = 0; + + virtual float getInsertionCost( + const DicTraverseSession *const traverseSession, + const DicNode *const parentDicNode, const DicNode *const dicNode) const = 0; + + virtual float getNewWordCost(const DicNode *const dicNode) const = 0; + + virtual float getNewWordBigramCost( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode, + hash_map_compat<int, int16_t> *const bigramCacheMap) const = 0; + + virtual float getCompletionCost( + const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const = 0; + + virtual float getTerminalLanguageCost( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode, + float dicNodeLanguageImprobability) const = 0; + + virtual bool needsToNormalizeCompoundDistance() const = 0; + + virtual float getAdditionalProximityCost() const = 0; + + virtual float getSubstitutionCost() const = 0; + + virtual float getSpaceSubstitutionCost() const = 0; + + Weighting() {} + virtual ~Weighting() {} + + private: + DISALLOW_COPY_AND_ASSIGN(Weighting); + + static float getSpatialCost(const Weighting *const weighting, + const CorrectionType correctionType, const DicTraverseSession *const traverseSession, + const DicNode *const parentDicNode, const DicNode *const dicNode, + DicNode_InputStateG *const inputStateG); + static float getLanguageCost(const Weighting *const weighting, + const CorrectionType correctionType, const DicTraverseSession *const traverseSession, + const DicNode *const parentDicNode, const DicNode *const dicNode, + hash_map_compat<int, int16_t> *const bigramCacheMap); + // TODO: Move to TypingWeighting and GestureWeighting? + static bool isEditCorrection(const CorrectionType correctionType); + // TODO: Move to TypingWeighting and GestureWeighting? + static bool isProximityCorrection(const Weighting *const weighting, + const CorrectionType correctionType, const DicTraverseSession *const traverseSession, + const DicNode *const dicNode); + // TODO: Move to TypingWeighting and GestureWeighting? + static int getForwardInputCount(const CorrectionType correctionType); +}; +} // namespace latinime +#endif // LATINIME_WEIGHTING_H diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.cpp b/native/jni/src/suggest/core/session/dic_traverse_session.cpp new file mode 100644 index 000000000..5b783a2ba --- /dev/null +++ b/native/jni/src/suggest/core/session/dic_traverse_session.cpp @@ -0,0 +1,111 @@ +/* + * 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. + */ + +#include "suggest/core/session/dic_traverse_session.h" + +#include "defines.h" +#include "dictionary.h" +#include "dic_traverse_wrapper.h" +#include "jni.h" +#include "suggest/core/dicnode/dic_node_utils.h" + +namespace latinime { + +const int DicTraverseSession::CACHE_START_INPUT_LENGTH_THRESHOLD = 20; + +// A factory method for DicTraverseSession +static void *getSessionInstance(JNIEnv *env, jstring localeStr) { + return new DicTraverseSession(env, localeStr); +} + +// TODO: Pass "DicTraverseSession *traverseSession" when the source code structure settles down. +static void initSessionInstance(void *traverseSession, const Dictionary *const dictionary, + const int *prevWord, const int prevWordLength) { + if (traverseSession) { + DicTraverseSession *tSession = static_cast<DicTraverseSession *>(traverseSession); + tSession->init(dictionary, prevWord, prevWordLength); + } +} + +// TODO: Pass "DicTraverseSession *traverseSession" when the source code structure settles down. +static void releaseSessionInstance(void *traverseSession) { + delete static_cast<DicTraverseSession *>(traverseSession); +} + +// An ad-hoc internal class to register the factory method defined above +class TraverseSessionFactoryRegisterer { + public: + TraverseSessionFactoryRegisterer() { + DicTraverseWrapper::setTraverseSessionFactoryMethod(getSessionInstance); + DicTraverseWrapper::setTraverseSessionInitMethod(initSessionInstance); + DicTraverseWrapper::setTraverseSessionReleaseMethod(releaseSessionInstance); + } + private: + DISALLOW_COPY_AND_ASSIGN(TraverseSessionFactoryRegisterer); +}; + +// To invoke the TraverseSessionFactoryRegisterer constructor in the global constructor. +static TraverseSessionFactoryRegisterer traverseSessionFactoryRegisterer; + +void DicTraverseSession::init(const Dictionary *const dictionary, const int *prevWord, + int prevWordLength) { + mDictionary = dictionary; + if (!prevWord) { + mPrevWordPos = NOT_VALID_WORD; + return; + } + mPrevWordPos = DicNodeUtils::getWordPos(dictionary->getOffsetDict(), prevWord, prevWordLength); +} + +void DicTraverseSession::setupForGetSuggestions(const ProximityInfo *pInfo, + const int *inputCodePoints, const int inputSize, const int *const inputXs, + const int *const inputYs, const int *const times, const int *const pointerIds, + const float maxSpatialDistance, const int maxPointerCount) { + mProximityInfo = pInfo; + mMaxPointerCount = maxPointerCount; + initializeProximityInfoStates(inputCodePoints, inputXs, inputYs, times, pointerIds, inputSize, + maxSpatialDistance, maxPointerCount); +} + +const uint8_t *DicTraverseSession::getOffsetDict() const { + return mDictionary->getOffsetDict(); +} + +int DicTraverseSession::getDictFlags() const { + return mDictionary->getDictFlags(); +} + +void DicTraverseSession::resetCache(const int nextActiveCacheSize, const int maxWords) { + mDicNodesCache.reset(nextActiveCacheSize, maxWords); + mBigramCacheMap.clear(); + mPartiallyCommited = false; +} + +void DicTraverseSession::initializeProximityInfoStates(const int *const inputCodePoints, + const int *const inputXs, const int *const inputYs, const int *const times, + const int *const pointerIds, const int inputSize, const float maxSpatialDistance, + const int maxPointerCount) { + ASSERT(1 <= maxPointerCount && maxPointerCount <= MAX_POINTER_COUNT_G); + mInputSize = 0; + for (int i = 0; i < maxPointerCount; ++i) { + mProximityInfoStates[i].initInputParams(i, maxSpatialDistance, getProximityInfo(), + inputCodePoints, inputSize, inputXs, inputYs, times, pointerIds, + maxPointerCount == MAX_POINTER_COUNT_G + /* TODO: this is a hack. fix proximity info state */); + mInputSize += mProximityInfoStates[i].size(); + } +} +} // namespace latinime diff --git a/native/jni/src/suggest/core/session/dic_traverse_session.h b/native/jni/src/suggest/core/session/dic_traverse_session.h new file mode 100644 index 000000000..525d198cd --- /dev/null +++ b/native/jni/src/suggest/core/session/dic_traverse_session.h @@ -0,0 +1,171 @@ +/* + * 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. + */ + +#ifndef LATINIME_DIC_TRAVERSE_SESSION_H +#define LATINIME_DIC_TRAVERSE_SESSION_H + +#include <stdint.h> +#include <vector> + +#include "defines.h" +#include "hash_map_compat.h" +#include "jni.h" +#include "proximity_info_state.h" +#include "suggest/core/dicnode/dic_nodes_cache.h" + +namespace latinime { + +class Dictionary; +class ProximityInfo; + +class DicTraverseSession { + public: + AK_FORCE_INLINE DicTraverseSession(JNIEnv *env, jstring localeStr) + : mPrevWordPos(NOT_VALID_WORD), mProximityInfo(0), + mDictionary(0), mDicNodesCache(), mBigramCacheMap(), + mInputSize(0), mPartiallyCommited(false), mMaxPointerCount(1) { + // NOTE: mProximityInfoStates is an array of instances. + // No need to initialize it explicitly here. + } + + // Non virtual inline destructor -- never inherit this class + AK_FORCE_INLINE ~DicTraverseSession() {} + + void init(const Dictionary *dictionary, const int *prevWord, int prevWordLength); + // TODO: Remove and merge into init + void setupForGetSuggestions(const ProximityInfo *pInfo, const int *inputCodePoints, + const int inputSize, const int *const inputXs, const int *const inputYs, + const int *const times, const int *const pointerIds, const float maxSpatialDistance, + const int maxPointerCount); + void resetCache(const int nextActiveCacheSize, const int maxWords); + + const uint8_t *getOffsetDict() const; + int getDictFlags() const; + + //-------------------- + // getters and setters + //-------------------- + const ProximityInfo *getProximityInfo() const { return mProximityInfo; } + int getPrevWordPos() const { return mPrevWordPos; } + // TODO: REMOVE + void setPrevWordPos(int pos) { mPrevWordPos = pos; } + // TODO: Use proper parameter when changed + int getDicRootPos() const { return 0; } + DicNodesCache *getDicTraverseCache() { return &mDicNodesCache; } + hash_map_compat<int, int16_t> *getBigramCacheMap() { return &mBigramCacheMap; } + const ProximityInfoState *getProximityInfoState(int id) const { + return &mProximityInfoStates[id]; + } + int getInputSize() const { return mInputSize; } + void setPartiallyCommited() { mPartiallyCommited = true; } + bool isPartiallyCommited() const { return mPartiallyCommited; } + + bool isOnlyOnePointerUsed(int *pointerId) const { + // Not in the dictionary word + int usedPointerCount = 0; + int usedPointerId = 0; + for (int i = 0; i < mMaxPointerCount; ++i) { + if (mProximityInfoStates[i].isUsed()) { + ++usedPointerCount; + usedPointerId = i; + } + } + if (usedPointerCount != 1) { + return false; + } + *pointerId = usedPointerId; + return true; + } + + void getSearchKeys(const DicNode *node, std::vector<int> *const outputSearchKeyVector) const { + for (int i = 0; i < MAX_POINTER_COUNT_G; ++i) { + if (!mProximityInfoStates[i].isUsed()) { + continue; + } + const int pointerId = node->getInputIndex(i); + const std::vector<int> *const searchKeyVector = + mProximityInfoStates[i].getSearchKeyVector(pointerId); + outputSearchKeyVector->insert(outputSearchKeyVector->end(), searchKeyVector->begin(), + searchKeyVector->end()); + } + } + + ProximityType getProximityTypeG(const DicNode *const node, const int childCodePoint) const { + ProximityType proximityType = UNRELATED_CHAR; + for (int i = 0; i < MAX_POINTER_COUNT_G; ++i) { + if (!mProximityInfoStates[i].isUsed()) { + continue; + } + const int pointerId = node->getInputIndex(i); + proximityType = mProximityInfoStates[i].getProximityTypeG(pointerId, childCodePoint); + ASSERT(proximityType == UNRELATED_CHAR || proximityType == MATCH_CHAR); + // TODO: Make this more generic + // Currently we assume there are only two types here -- UNRELATED_CHAR + // and MATCH_CHAR + if (proximityType != UNRELATED_CHAR) { + return proximityType; + } + } + return proximityType; + } + + AK_FORCE_INLINE bool isCacheBorderForTyping(const int inputSize) const { + return mDicNodesCache.isCacheBorderForTyping(inputSize); + } + + /** + * Returns whether or not it is possible to continue suggestion from the previous search. + */ + // TODO: Remove. No need to check once the session is fully implemented. + bool isContinuousSuggestionPossible() const { + if (!mDicNodesCache.hasCachedDicNodesForContinuousSuggestion()) { + return false; + } + ASSERT(mMaxPointerCount < MAX_POINTER_COUNT_G); + for (int i = 0; i < mMaxPointerCount; ++i) { + const ProximityInfoState *const pInfoState = getProximityInfoState(i); + // If a proximity info state is not continuous suggestion possible, + // do not continue searching. + if (pInfoState->isUsed() && !pInfoState->isContinuousSuggestionPossible()) { + return false; + } + } + return true; + } + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(DicTraverseSession); + // threshold to start caching + static const int CACHE_START_INPUT_LENGTH_THRESHOLD; + void initializeProximityInfoStates(const int *const inputCodePoints, const int *const inputXs, + const int *const inputYs, const int *const times, const int *const pointerIds, + const int inputSize, const float maxSpatialDistance, const int maxPointerCount); + + int mPrevWordPos; + const ProximityInfo *mProximityInfo; + const Dictionary *mDictionary; + + DicNodesCache mDicNodesCache; + // Temporary cache for bigram frequencies + hash_map_compat<int, int16_t> mBigramCacheMap; + ProximityInfoState mProximityInfoStates[MAX_POINTER_COUNT_G]; + + int mInputSize; + bool mPartiallyCommited; + int mMaxPointerCount; +}; +} // namespace latinime +#endif // LATINIME_DIC_TRAVERSE_SESSION_H diff --git a/native/jni/src/suggest/core/suggest.cpp b/native/jni/src/suggest/core/suggest.cpp new file mode 100644 index 000000000..764c37240 --- /dev/null +++ b/native/jni/src/suggest/core/suggest.cpp @@ -0,0 +1,519 @@ +/* + * 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. + */ + +#include "suggest/core/suggest.h" + +#include "char_utils.h" +#include "dictionary.h" +#include "proximity_info.h" +#include "suggest/core/dicnode/dic_node.h" +#include "suggest/core/dicnode/dic_node_priority_queue.h" +#include "suggest/core/dicnode/dic_node_vector.h" +#include "suggest/core/dictionary/shortcut_utils.h" +#include "suggest/core/policy/scoring.h" +#include "suggest/core/policy/traversal.h" +#include "suggest/core/policy/weighting.h" +#include "suggest/core/session/dic_traverse_session.h" +#include "terminal_attributes.h" + +namespace latinime { + +// Initialization of class constants. +const int Suggest::LOOKAHEAD_DIC_NODES_CACHE_SIZE = 25; +const int Suggest::MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT = 16; +const int Suggest::MIN_CONTINUOUS_SUGGESTION_INPUT_SIZE = 2; +const float Suggest::AUTOCORRECT_CLASSIFICATION_THRESHOLD = 0.33f; +const float Suggest::AUTOCORRECT_LANGUAGE_FEATURE_THRESHOLD = 0.6f; + +const bool Suggest::CORRECT_SPACE_OMISSION = true; +const bool Suggest::CORRECT_TRANSPOSITION = true; +const bool Suggest::CORRECT_INSERTION = true; +const bool Suggest::CORRECT_OMISSION_G = true; + +/** + * Returns a set of suggestions for the given input touch points. The commitPoint argument indicates + * whether to prematurely commit the suggested words up to the given point for sentence-level + * suggestion. + * + * Note: Currently does not support concurrent calls across threads. Continuous suggestion is + * automatically activated for sequential calls that share the same starting input. + * TODO: Stop detecting continuous suggestion. Start using traverseSession instead. + */ +int Suggest::getSuggestions(ProximityInfo *pInfo, void *traverseSession, + int *inputXs, int *inputYs, int *times, int *pointerIds, int *inputCodePoints, + int inputSize, int commitPoint, int *outWords, int *frequencies, int *outputIndices, + int *outputTypes) const { + PROF_OPEN; + PROF_START(0); + const float maxSpatialDistance = TRAVERSAL->getMaxSpatialDistance(); + DicTraverseSession *tSession = static_cast<DicTraverseSession *>(traverseSession); + tSession->setupForGetSuggestions(pInfo, inputCodePoints, inputSize, inputXs, inputYs, times, + pointerIds, maxSpatialDistance, TRAVERSAL->getMaxPointerCount()); + // TODO: Add the way to evaluate cache + + initializeSearch(tSession, commitPoint); + PROF_END(0); + PROF_START(1); + + // keep expanding search dicNodes until all have terminated. + while (tSession->getDicTraverseCache()->activeSize() > 0) { + expandCurrentDicNodes(tSession); + tSession->getDicTraverseCache()->advanceActiveDicNodes(); + tSession->getDicTraverseCache()->advanceInputIndex(inputSize); + } + PROF_END(1); + PROF_START(2); + const int size = outputSuggestions(tSession, frequencies, outWords, outputIndices, outputTypes); + PROF_END(2); + PROF_CLOSE; + return size; +} + +/** + * Initializes the search at the root of the lexicon trie. Note that when possible the search will + * continue suggestion from where it left off during the last call. + */ +void Suggest::initializeSearch(DicTraverseSession *traverseSession, int commitPoint) const { + if (!traverseSession->getProximityInfoState(0)->isUsed()) { + return; + } + if (TRAVERSAL->allowPartialCommit()) { + commitPoint = 0; + } + + if (traverseSession->getInputSize() > MIN_CONTINUOUS_SUGGESTION_INPUT_SIZE + && traverseSession->isContinuousSuggestionPossible()) { + if (commitPoint == 0) { + // Continue suggestion + traverseSession->getDicTraverseCache()->continueSearch(); + } else { + // Continue suggestion after partial commit. + DicNode *topDicNode = + traverseSession->getDicTraverseCache()->setCommitPoint(commitPoint); + traverseSession->setPrevWordPos(topDicNode->getPrevWordNodePos()); + traverseSession->getDicTraverseCache()->continueSearch(); + traverseSession->setPartiallyCommited(); + } + } else { + // Restart recognition at the root. + traverseSession->resetCache(TRAVERSAL->getMaxCacheSize(), MAX_RESULTS); + // Create a new dic node here + DicNode rootNode; + DicNodeUtils::initAsRoot(traverseSession->getDicRootPos(), + traverseSession->getOffsetDict(), traverseSession->getPrevWordPos(), &rootNode); + traverseSession->getDicTraverseCache()->copyPushActive(&rootNode); + } +} + +/** + * Outputs the final list of suggestions (i.e., terminal nodes). + */ +int Suggest::outputSuggestions(DicTraverseSession *traverseSession, int *frequencies, + int *outputCodePoints, int *spaceIndices, int *outputTypes) const { + const int terminalSize = min(MAX_RESULTS, + static_cast<int>(traverseSession->getDicTraverseCache()->terminalSize())); + DicNode terminals[MAX_RESULTS]; // Avoiding non-POD variable length array + + for (int index = terminalSize - 1; index >= 0; --index) { + traverseSession->getDicTraverseCache()->popTerminal(&terminals[index]); + } + + const float languageWeight = SCORING->getAdjustedLanguageWeight( + traverseSession, terminals, terminalSize); + + int outputWordIndex = 0; + // Insert most probable word at index == 0 as long as there is one terminal at least + const bool hasMostProbableString = + SCORING->getMostProbableString(traverseSession, terminalSize, languageWeight, + &outputCodePoints[0], &outputTypes[0], &frequencies[0]); + if (hasMostProbableString) { + ++outputWordIndex; + } + + // Initial value of the loop index for terminal nodes (words) + int doubleLetterTerminalIndex = -1; + DoubleLetterLevel doubleLetterLevel = NOT_A_DOUBLE_LETTER; + SCORING->searchWordWithDoubleLetter(terminals, terminalSize, + &doubleLetterTerminalIndex, &doubleLetterLevel); + + int maxScore = S_INT_MIN; + // Output suggestion results here + for (int terminalIndex = 0; terminalIndex < terminalSize && outputWordIndex < MAX_RESULTS; + ++terminalIndex) { + DicNode *terminalDicNode = &terminals[terminalIndex]; + if (DEBUG_GEO_FULL) { + terminalDicNode->dump("OUT:"); + } + const float doubleLetterCost = SCORING->getDoubleLetterDemotionDistanceCost( + terminalIndex, doubleLetterTerminalIndex, doubleLetterLevel); + const float compoundDistance = terminalDicNode->getCompoundDistance(languageWeight) + + doubleLetterCost; + const TerminalAttributes terminalAttributes(traverseSession->getOffsetDict(), + terminalDicNode->getFlags(), terminalDicNode->getAttributesPos()); + const int originalTerminalProbability = terminalDicNode->getProbability(); + + // Do not suggest words with a 0 probability, or entries that are blacklisted or do not + // represent a word. However, we should still submit their shortcuts if any. + const bool isValidWord = + originalTerminalProbability > 0 && !terminalAttributes.isBlacklistedOrNotAWord(); + // Increase output score of top typing suggestion to ensure autocorrection. + // TODO: Better integration with java side autocorrection logic. + // Force autocorrection for obvious long multi-word suggestions. + const bool isForceCommitMultiWords = TRAVERSAL->allowPartialCommit() + && (traverseSession->isPartiallyCommited() + || (traverseSession->getInputSize() >= MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT + && terminalDicNode->hasMultipleWords())); + + const int finalScore = SCORING->calculateFinalScore( + compoundDistance, traverseSession->getInputSize(), + isForceCommitMultiWords || (isValidWord && SCORING->doesAutoCorrectValidWord())); + + maxScore = max(maxScore, finalScore); + + if (TRAVERSAL->allowPartialCommit()) { + // Index for top typing suggestion should be 0. + if (isValidWord && outputWordIndex == 0) { + terminalDicNode->outputSpacePositionsResult(spaceIndices); + } + } + + // Do not suggest words with a 0 probability, or entries that are blacklisted or do not + // represent a word. However, we should still submit their shortcuts if any. + if (isValidWord) { + outputTypes[outputWordIndex] = Dictionary::KIND_CORRECTION; + frequencies[outputWordIndex] = finalScore; + // Populate the outputChars array with the suggested word. + const int startIndex = outputWordIndex * MAX_WORD_LENGTH; + terminalDicNode->outputResult(&outputCodePoints[startIndex]); + ++outputWordIndex; + } + + const bool sameAsTyped = TRAVERSAL->sameAsTyped(traverseSession, terminalDicNode); + outputWordIndex = ShortcutUtils::outputShortcuts(&terminalAttributes, outputWordIndex, + finalScore, outputCodePoints, frequencies, outputTypes, sameAsTyped); + DicNode::managedDelete(terminalDicNode); + } + + if (hasMostProbableString) { + SCORING->safetyNetForMostProbableString(terminalSize, maxScore, + &outputCodePoints[0], &frequencies[0]); + } + return outputWordIndex; +} + +/** + * Expands the dicNodes in the current search priority queue by advancing to the possible child + * nodes based on the next touch point(s) (or no touch points for lookahead) + */ +void Suggest::expandCurrentDicNodes(DicTraverseSession *traverseSession) const { + const int inputSize = traverseSession->getInputSize(); + DicNodeVector childDicNodes(TRAVERSAL->getDefaultExpandDicNodeSize()); + DicNode omissionDicNode; + + // TODO: Find more efficient caching + const bool shouldDepthLevelCache = TRAVERSAL->shouldDepthLevelCache(traverseSession); + if (shouldDepthLevelCache) { + traverseSession->getDicTraverseCache()->updateLastCachedInputIndex(); + } + if (DEBUG_CACHE) { + AKLOGI("expandCurrentDicNodes depth level cache = %d, inputSize = %d", + shouldDepthLevelCache, inputSize); + } + while (traverseSession->getDicTraverseCache()->activeSize() > 0) { + DicNode dicNode; + traverseSession->getDicTraverseCache()->popActive(&dicNode); + if (dicNode.isTotalInputSizeExceedingLimit()) { + return; + } + childDicNodes.clear(); + const int point0Index = dicNode.getInputIndex(0); + const bool canDoLookAheadCorrection = + TRAVERSAL->canDoLookAheadCorrection(traverseSession, &dicNode); + const bool isLookAheadCorrection = canDoLookAheadCorrection + && traverseSession->getDicTraverseCache()-> + isLookAheadCorrectionInputIndex(static_cast<int>(point0Index)); + const bool isCompletion = dicNode.isCompletion(inputSize); + + const bool shouldNodeLevelCache = + TRAVERSAL->shouldNodeLevelCache(traverseSession, &dicNode); + if (shouldDepthLevelCache || shouldNodeLevelCache) { + if (DEBUG_CACHE) { + dicNode.dump("PUSH_CACHE"); + } + traverseSession->getDicTraverseCache()->copyPushContinue(&dicNode); + dicNode.setCached(); + } + + if (isLookAheadCorrection) { + // The algorithm maintains a small set of "deferred" nodes that have not consumed the + // latest touch point yet. These are needed to apply look-ahead correction operations + // that require special handling of the latest touch point. For example, with insertions + // (e.g., "thiis" -> "this") the latest touch point should not be consumed at all. + if (CORRECT_TRANSPOSITION) { + processDicNodeAsTransposition(traverseSession, &dicNode); + } + if (CORRECT_INSERTION) { + processDicNodeAsInsertion(traverseSession, &dicNode); + } + } else { // !isLookAheadCorrection + // Only consider typing error corrections if the normalized compound distance is + // below a spatial distance threshold. + // NOTE: the threshold may need to be updated if scoring model changes. + // TODO: Remove. Do not prune node here. + const bool allowsErrorCorrections = TRAVERSAL->allowsErrorCorrections(&dicNode); + // Process for handling space substitution (e.g., hevis => he is) + if (allowsErrorCorrections + && TRAVERSAL->isSpaceSubstitutionTerminal(traverseSession, &dicNode)) { + createNextWordDicNode(traverseSession, &dicNode, true /* spaceSubstitution */); + } + + DicNodeUtils::getAllChildDicNodes( + &dicNode, traverseSession->getOffsetDict(), &childDicNodes); + + const int childDicNodesSize = childDicNodes.getSizeAndLock(); + for (int i = 0; i < childDicNodesSize; ++i) { + DicNode *const childDicNode = childDicNodes[i]; + if (isCompletion) { + // Handle forward lookahead when the lexicon letter exceeds the input size. + processDicNodeAsMatch(traverseSession, childDicNode); + continue; + } + if (allowsErrorCorrections + && TRAVERSAL->isOmission(traverseSession, &dicNode, childDicNode)) { + // TODO: (Gesture) Change weight between omission and substitution errors + // TODO: (Gesture) Terminal node should not be handled as omission + omissionDicNode.initByCopy(childDicNode); + processDicNodeAsOmission(traverseSession, &omissionDicNode); + } + const ProximityType proximityType = TRAVERSAL->getProximityType( + traverseSession, &dicNode, childDicNode); + switch (proximityType) { + // TODO: Consider the difference of proximityType here + case MATCH_CHAR: + case PROXIMITY_CHAR: + processDicNodeAsMatch(traverseSession, childDicNode); + break; + case ADDITIONAL_PROXIMITY_CHAR: + if (allowsErrorCorrections) { + processDicNodeAsAdditionalProximityChar(traverseSession, &dicNode, + childDicNode); + } + break; + case SUBSTITUTION_CHAR: + if (allowsErrorCorrections) { + processDicNodeAsSubstitution(traverseSession, &dicNode, childDicNode); + } + break; + case UNRELATED_CHAR: + // Just drop this node and do nothing. + break; + default: + // Just drop this node and do nothing. + break; + } + } + + // Push the node for look-ahead correction + if (allowsErrorCorrections && canDoLookAheadCorrection) { + traverseSession->getDicTraverseCache()->copyPushNextActive(&dicNode); + } + } + } +} + +void Suggest::processTerminalDicNode( + DicTraverseSession *traverseSession, DicNode *dicNode) const { + if (dicNode->getCompoundDistance() >= static_cast<float>(MAX_VALUE_FOR_WEIGHTING)) { + return; + } + if (!dicNode->isTerminalWordNode()) { + return; + } + if (TRAVERSAL->needsToTraverseAllUserInput() + && dicNode->getInputIndex(0) < traverseSession->getInputSize()) { + return; + } + + if (dicNode->shouldBeFilterdBySafetyNetForBigram()) { + return; + } + // Create a non-cached node here. + DicNode terminalDicNode; + DicNodeUtils::initByCopy(dicNode, &terminalDicNode); + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_TERMINAL, traverseSession, 0, + &terminalDicNode, traverseSession->getBigramCacheMap()); + traverseSession->getDicTraverseCache()->copyPushTerminal(&terminalDicNode); +} + +/** + * Adds the expanded dicNode to the next search priority queue. Also creates an additional next word + * (by the space omission error correction) search path if input dicNode is on a terminal node. + */ +void Suggest::processExpandedDicNode( + DicTraverseSession *traverseSession, DicNode *dicNode) const { + processTerminalDicNode(traverseSession, dicNode); + if (dicNode->getCompoundDistance() < static_cast<float>(MAX_VALUE_FOR_WEIGHTING)) { + if (TRAVERSAL->isSpaceOmissionTerminal(traverseSession, dicNode)) { + createNextWordDicNode(traverseSession, dicNode, false /* spaceSubstitution */); + } + const int allowsLookAhead = !(dicNode->hasMultipleWords() + && dicNode->isCompletion(traverseSession->getInputSize())); + if (dicNode->hasChildren() && allowsLookAhead) { + traverseSession->getDicTraverseCache()->copyPushNextActive(dicNode); + } + } + DicNode::managedDelete(dicNode); +} + +void Suggest::processDicNodeAsMatch(DicTraverseSession *traverseSession, + DicNode *childDicNode) const { + weightChildNode(traverseSession, childDicNode); + processExpandedDicNode(traverseSession, childDicNode); +} + +void Suggest::processDicNodeAsAdditionalProximityChar(DicTraverseSession *traverseSession, + DicNode *dicNode, DicNode *childDicNode) const { + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_ADDITIONAL_PROXIMITY, + traverseSession, dicNode, childDicNode, 0 /* bigramCacheMap */); + weightChildNode(traverseSession, childDicNode); + processExpandedDicNode(traverseSession, childDicNode); +} + +void Suggest::processDicNodeAsSubstitution(DicTraverseSession *traverseSession, + DicNode *dicNode, DicNode *childDicNode) const { + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_SUBSTITUTION, traverseSession, + dicNode, childDicNode, 0 /* bigramCacheMap */); + weightChildNode(traverseSession, childDicNode); + processExpandedDicNode(traverseSession, childDicNode); +} + +/** + * Handle the dicNode as an omission error (e.g., ths => this). Skip the current letter and consider + * matches for all possible next letters. Note that just skipping the current letter without any + * other conditions tends to flood the search dic nodes cache with omission nodes. Instead, check + * the possible *next* letters after the omission to better limit search to plausible omissions. + * Note that apostrophes are handled as omissions. + */ +void Suggest::processDicNodeAsOmission( + DicTraverseSession *traverseSession, DicNode *dicNode) const { + // If the omission is surely intentional that it should incur zero cost. + const bool isZeroCostOmission = dicNode->isZeroCostOmission(); + DicNodeVector childDicNodes; + + DicNodeUtils::getAllChildDicNodes(dicNode, traverseSession->getOffsetDict(), &childDicNodes); + + const int size = childDicNodes.getSizeAndLock(); + for (int i = 0; i < size; i++) { + DicNode *const childDicNode = childDicNodes[i]; + if (!isZeroCostOmission) { + // Treat this word as omission + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_OMISSION, traverseSession, + dicNode, childDicNode, 0 /* bigramCacheMap */); + } + weightChildNode(traverseSession, childDicNode); + + if (!TRAVERSAL->isPossibleOmissionChildNode(traverseSession, dicNode, childDicNode)) { + continue; + } + processExpandedDicNode(traverseSession, childDicNode); + } +} + +/** + * Handle the dicNode as an insertion error (e.g., thiis => this). Skip the current touch point and + * consider matches for the next touch point. + */ +void Suggest::processDicNodeAsInsertion(DicTraverseSession *traverseSession, + DicNode *dicNode) const { + const int16_t pointIndex = dicNode->getInputIndex(0); + DicNodeVector childDicNodes; + DicNodeUtils::getProximityChildDicNodes(dicNode, traverseSession->getOffsetDict(), + traverseSession->getProximityInfoState(0), pointIndex + 1, true, &childDicNodes); + const int size = childDicNodes.getSizeAndLock(); + for (int i = 0; i < size; i++) { + DicNode *const childDicNode = childDicNodes[i]; + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_INSERTION, traverseSession, + dicNode, childDicNode, 0 /* bigramCacheMap */); + processExpandedDicNode(traverseSession, childDicNode); + } +} + +/** + * Handle the dicNode as a transposition error (e.g., thsi => this). Swap the next two touch points. + */ +void Suggest::processDicNodeAsTransposition(DicTraverseSession *traverseSession, + DicNode *dicNode) const { + const int16_t pointIndex = dicNode->getInputIndex(0); + DicNodeVector childDicNodes1; + DicNodeUtils::getProximityChildDicNodes(dicNode, traverseSession->getOffsetDict(), + traverseSession->getProximityInfoState(0), pointIndex + 1, false, &childDicNodes1); + const int childSize1 = childDicNodes1.getSizeAndLock(); + for (int i = 0; i < childSize1; i++) { + if (childDicNodes1[i]->hasChildren()) { + DicNodeVector childDicNodes2; + DicNodeUtils::getProximityChildDicNodes( + childDicNodes1[i], traverseSession->getOffsetDict(), + traverseSession->getProximityInfoState(0), pointIndex, false, &childDicNodes2); + const int childSize2 = childDicNodes2.getSizeAndLock(); + for (int j = 0; j < childSize2; j++) { + DicNode *const childDicNode2 = childDicNodes2[j]; + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_TRANSPOSITION, + traverseSession, childDicNodes1[i], childDicNode2, 0 /* bigramCacheMap */); + processExpandedDicNode(traverseSession, childDicNode2); + } + } + DicNode::managedDelete(childDicNodes1[i]); + } +} + +/** + * Weight child node by aligning it to the key + */ +void Suggest::weightChildNode(DicTraverseSession *traverseSession, DicNode *dicNode) const { + const int inputSize = traverseSession->getInputSize(); + if (dicNode->isCompletion(inputSize)) { + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_COMPLETION, traverseSession, + 0 /* parentDicNode */, dicNode, 0 /* bigramCacheMap */); + } else { // completion + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_MATCH, traverseSession, + 0 /* parentDicNode */, dicNode, 0 /* bigramCacheMap */); + } +} + +/** + * Creates a new dicNode that represents a space insertion at the end of the input dicNode. Also + * incorporates the unigram / bigram score for the ending word into the new dicNode. + */ +void Suggest::createNextWordDicNode(DicTraverseSession *traverseSession, DicNode *dicNode, + const bool spaceSubstitution) const { + if (!TRAVERSAL->isGoodToTraverseNextWord(dicNode)) { + return; + } + + // Create a non-cached node here. + DicNode newDicNode; + DicNodeUtils::initAsRootWithPreviousWord(traverseSession->getDicRootPos(), + traverseSession->getOffsetDict(), dicNode, &newDicNode); + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_NEW_WORD, traverseSession, dicNode, + &newDicNode, traverseSession->getBigramCacheMap()); + if (spaceSubstitution) { + // Merge this with CT_NEW_WORD + Weighting::addCostAndForwardInputIndex(WEIGHTING, CT_SPACE_SUBSTITUTION, + traverseSession, 0, &newDicNode, 0 /* bigramCacheMap */); + } + traverseSession->getDicTraverseCache()->copyPushNextActive(&newDicNode); +} +} // namespace latinime diff --git a/native/jni/src/suggest/core/suggest.h b/native/jni/src/suggest/core/suggest.h new file mode 100644 index 000000000..6c09b9467 --- /dev/null +++ b/native/jni/src/suggest/core/suggest.h @@ -0,0 +1,104 @@ +/* + * 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. + */ + +#ifndef LATINIME_SUGGEST_IMPL_H +#define LATINIME_SUGGEST_IMPL_H + +#include "defines.h" +#include "suggest/core/suggest_interface.h" +#include "suggest/core/policy/suggest_policy.h" + +namespace latinime { + +// Naming convention +// - Distance: "Weighted" edit distance -- used both for spatial and language. +// - Compound Distance: Spatial Distance + Language Distance -- used for pruning and scoring +// - Cost: delta/diff for Distance -- used both for spatial and language +// - Length: "Non-weighted" -- used only for spatial +// - Probability: "Non-weighted" -- used only for language +// - Score: Final calibrated score based on the compound distance, which is sent to java as the +// priority of a suggested word + +class DicNode; +class DicTraverseSession; +class ProximityInfo; +class Scoring; +class Traversal; +class Weighting; + +class Suggest : public SuggestInterface { + public: + AK_FORCE_INLINE Suggest(const SuggestPolicy *const suggestPolicy) + : TRAVERSAL(suggestPolicy->getTraversal()), + SCORING(suggestPolicy->getScoring()), WEIGHTING(suggestPolicy->getWeighting()) {} + AK_FORCE_INLINE virtual ~Suggest() {} + int getSuggestions(ProximityInfo *pInfo, void *traverseSession, int *inputXs, int *inputYs, + int *times, int *pointerIds, int *inputCodePoints, int inputSize, int commitPoint, + int *outWords, int *frequencies, int *outputIndices, int *outputTypes) const; + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(Suggest); + void createNextWordDicNode(DicTraverseSession *traverseSession, DicNode *dicNode, + const bool spaceSubstitution) const; + int outputSuggestions(DicTraverseSession *traverseSession, int *frequencies, + int *outputCodePoints, int *outputIndices, int *outputTypes) const; + void initializeSearch(DicTraverseSession *traverseSession, int commitPoint) const; + void expandCurrentDicNodes(DicTraverseSession *traverseSession) const; + void processTerminalDicNode(DicTraverseSession *traverseSession, DicNode *dicNode) const; + void processExpandedDicNode(DicTraverseSession *traverseSession, DicNode *dicNode) const; + void weightChildNode(DicTraverseSession *traverseSession, DicNode *dicNode) const; + float getAutocorrectScore(DicTraverseSession *traverseSession, DicNode *dicNode) const; + void generateFeatures( + DicTraverseSession *traverseSession, DicNode *dicNode, float *features) const; + void processDicNodeAsOmission(DicTraverseSession *traverseSession, DicNode *dicNode) const; + void processDicNodeAsTransposition(DicTraverseSession *traverseSession, + DicNode *dicNode) const; + void processDicNodeAsInsertion(DicTraverseSession *traverseSession, DicNode *dicNode) const; + void processDicNodeAsAdditionalProximityChar(DicTraverseSession *traverseSession, + DicNode *dicNode, DicNode *childDicNode) const; + void processDicNodeAsSubstitution(DicTraverseSession *traverseSession, DicNode *dicNode, + DicNode *childDicNode) const; + void processDicNodeAsMatch(DicTraverseSession *traverseSession, + DicNode *childDicNode) const; + + // Dic nodes cache size for lookahead (autocompletion) + static const int LOOKAHEAD_DIC_NODES_CACHE_SIZE; + // Max characters to lookahead + static const int MAX_LOOKAHEAD; + // Inputs longer than this will autocorrect if the suggestion is multi-word + static const int MIN_LEN_FOR_MULTI_WORD_AUTOCORRECT; + static const int MIN_CONTINUOUS_SUGGESTION_INPUT_SIZE; + // Base value for converting costs into scores (low so will not autocorrect without classifier) + static const float BASE_OUTPUT_SCORE; + + // Threshold for autocorrection classifier + static const float AUTOCORRECT_CLASSIFICATION_THRESHOLD; + // Threshold for computing the language model feature for autocorrect classification + static const float AUTOCORRECT_LANGUAGE_FEATURE_THRESHOLD; + + // Typing error correction settings + static const bool CORRECT_SPACE_OMISSION; + static const bool CORRECT_TRANSPOSITION; + static const bool CORRECT_INSERTION; + + const Traversal *const TRAVERSAL; + const Scoring *const SCORING; + const Weighting *const WEIGHTING; + + static const bool CORRECT_OMISSION_G; +}; +} // namespace latinime +#endif // LATINIME_SUGGEST_IMPL_H diff --git a/native/jni/src/suggest/suggest_interface.h b/native/jni/src/suggest/core/suggest_interface.h index 0bb85d7e5..0bb85d7e5 100644 --- a/native/jni/src/suggest/suggest_interface.h +++ b/native/jni/src/suggest/core/suggest_interface.h diff --git a/native/jni/src/suggest/gesture_suggest.h b/native/jni/src/suggest/gesture_suggest.h deleted file mode 100644 index 82c3a69ad..000000000 --- a/native/jni/src/suggest/gesture_suggest.h +++ /dev/null @@ -1,61 +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. - */ - -#ifndef LATINIME_GESTURE_SUGGEST_H -#define LATINIME_GESTURE_SUGGEST_H - -#include "defines.h" -#include "suggest_interface.h" - -namespace latinime { - -class ProximityInfo; - -class GestureSuggest : public SuggestInterface { - public: - GestureSuggest() : mSuggestInterface(getGestureSuggestInstance()) {} - - virtual ~GestureSuggest(); - - int getSuggestions(ProximityInfo *pInfo, void *traverseSession, int *inputXs, int *inputYs, - int *times, int *pointerIds, int *inputCodePoints, int inputSize, int commitPoint, - int *outWords, int *frequencies, int *outputIndices, int *outputTypes) const { - if (!mSuggestInterface) { - return 0; - } - return mSuggestInterface->getSuggestions(pInfo, traverseSession, inputXs, inputYs, times, - pointerIds, inputCodePoints, inputSize, commitPoint, outWords, frequencies, - outputIndices, outputTypes); - } - - static void setGestureSuggestFactoryMethod(SuggestInterface *(*factoryMethod)()) { - sGestureSuggestFactoryMethod = factoryMethod; - } - - private: - DISALLOW_COPY_AND_ASSIGN(GestureSuggest); - static SuggestInterface *getGestureSuggestInstance() { - if (!sGestureSuggestFactoryMethod) { - return 0; - } - return sGestureSuggestFactoryMethod(); - } - - static SuggestInterface *(*sGestureSuggestFactoryMethod)(); - SuggestInterface *mSuggestInterface; -}; -} // namespace latinime -#endif // LATINIME_GESTURE_SUGGEST_H diff --git a/native/jni/src/suggest/typing_suggest.cpp b/native/jni/src/suggest/policyimpl/gesture/gesture_suggest_policy_factory.cpp index 56bd5b69a..6d3173937 100644 --- a/native/jni/src/suggest/typing_suggest.cpp +++ b/native/jni/src/suggest/policyimpl/gesture/gesture_suggest_policy_factory.cpp @@ -14,12 +14,8 @@ * limitations under the License. */ -#include "typing_suggest.h" +#include "gesture_suggest_policy_factory.h" namespace latinime { - SuggestInterface *(*TypingSuggest::sTypingSuggestFactoryMethod)() = 0; - - TypingSuggest::~TypingSuggest() { - delete mSuggestInterface; - } + const SuggestPolicy *(*GestureSuggestPolicyFactory::sGestureSuggestFactoryMethod)() = 0; } // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/gesture/gesture_suggest_policy_factory.h b/native/jni/src/suggest/policyimpl/gesture/gesture_suggest_policy_factory.h new file mode 100644 index 000000000..509b01fc0 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/gesture/gesture_suggest_policy_factory.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef LATINIME_GESTURE_SUGGEST_POLICY_FACTORY_H +#define LATINIME_GESTURE_SUGGEST_POLICY_FACTORY_H + +#include "defines.h" + +namespace latinime { + +class SuggestPolicy; + +class GestureSuggestPolicyFactory { + public: + static void setGestureSuggestPolicyFactoryMethod(const SuggestPolicy *(*factoryMethod)()) { + sGestureSuggestFactoryMethod = factoryMethod; + } + + static const SuggestPolicy *getGestureSuggestPolicy() { + if (!sGestureSuggestFactoryMethod) { + return 0; + } + return sGestureSuggestFactoryMethod(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(GestureSuggestPolicyFactory); + static const SuggestPolicy *(*sGestureSuggestFactoryMethod)(); +}; +} // namespace latinime +#endif // LATINIME_GESTURE_SUGGEST_POLICY_FACTORY_H diff --git a/native/jni/src/suggest/policyimpl/typing/scoring_params.cpp b/native/jni/src/suggest/policyimpl/typing/scoring_params.cpp new file mode 100644 index 000000000..0fa684f01 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/scoring_params.cpp @@ -0,0 +1,52 @@ +/* + * 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. + */ + +#include "suggest/policyimpl/typing/scoring_params.h" + +namespace latinime { +// TODO: RENAME all +const float ScoringParams::MAX_SPATIAL_DISTANCE = 1.0f; +const int ScoringParams::THRESHOLD_NEXT_WORD_PROBABILITY = 40; +const int ScoringParams::THRESHOLD_NEXT_WORD_PROBABILITY_FOR_CAPPED = 120; +const float ScoringParams::AUTOCORRECT_OUTPUT_THRESHOLD = 1.0f; +const int ScoringParams::MAX_CACHE_DIC_NODE_SIZE = 125; +const int ScoringParams::THRESHOLD_SHORT_WORD_LENGTH = 4; + +const float ScoringParams::DISTANCE_WEIGHT_LENGTH = 0.132f; +const float ScoringParams::PROXIMITY_COST = 0.086f; +const float ScoringParams::FIRST_PROXIMITY_COST = 0.104f; +const float ScoringParams::OMISSION_COST = 0.388f; +const float ScoringParams::OMISSION_COST_SAME_CHAR = 0.431f; +const float ScoringParams::OMISSION_COST_FIRST_CHAR = 0.532f; +const float ScoringParams::INSERTION_COST = 0.670f; +const float ScoringParams::INSERTION_COST_SAME_CHAR = 0.526f; +const float ScoringParams::INSERTION_COST_FIRST_CHAR = 0.563f; +const float ScoringParams::TRANSPOSITION_COST = 0.494f; +const float ScoringParams::SPACE_SUBSTITUTION_COST = 0.239f; +const float ScoringParams::ADDITIONAL_PROXIMITY_COST = 0.380f; +const float ScoringParams::SUBSTITUTION_COST = 0.363f; +const float ScoringParams::COST_NEW_WORD = 0.054f; +const float ScoringParams::COST_NEW_WORD_CAPITALIZED = 0.174f; +const float ScoringParams::DISTANCE_WEIGHT_LANGUAGE = 1.123f; +const float ScoringParams::COST_FIRST_LOOKAHEAD = 0.462f; +const float ScoringParams::COST_LOOKAHEAD = 0.092f; +const float ScoringParams::HAS_PROXIMITY_TERMINAL_COST = 0.126f; +const float ScoringParams::HAS_EDIT_CORRECTION_TERMINAL_COST = 0.056f; +const float ScoringParams::HAS_MULTI_WORD_TERMINAL_COST = 0.136f; +const float ScoringParams::TYPING_BASE_OUTPUT_SCORE = 1.0f; +const float ScoringParams::TYPING_MAX_OUTPUT_SCORE_PER_INPUT = 0.1f; +const float ScoringParams::MAX_NORM_DISTANCE_FOR_EDIT = 0.1f; +} // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/typing/scoring_params.h b/native/jni/src/suggest/policyimpl/typing/scoring_params.h new file mode 100644 index 000000000..8f104b362 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/scoring_params.h @@ -0,0 +1,66 @@ +/* + * 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. + */ + +#ifndef LATINIME_SCORING_PARAMS_H +#define LATINIME_SCORING_PARAMS_H + +#include "defines.h" + +namespace latinime { + +class ScoringParams { + public: + // Fixed model parameters + static const float MAX_SPATIAL_DISTANCE; + static const int THRESHOLD_NEXT_WORD_PROBABILITY; + static const int THRESHOLD_NEXT_WORD_PROBABILITY_FOR_CAPPED; + static const float AUTOCORRECT_OUTPUT_THRESHOLD; + static const int MAX_CACHE_DIC_NODE_SIZE; + static const int THRESHOLD_SHORT_WORD_LENGTH; + + // Numerically optimized parameters (currently for tap typing only). + // TODO: add ability to modify these constants programmatically. + // TODO: explore optimization of gesture parameters. + static const float DISTANCE_WEIGHT_LENGTH; + static const float PROXIMITY_COST; + static const float FIRST_PROXIMITY_COST; + static const float OMISSION_COST; + static const float OMISSION_COST_SAME_CHAR; + static const float OMISSION_COST_FIRST_CHAR; + static const float INSERTION_COST; + static const float INSERTION_COST_SAME_CHAR; + static const float INSERTION_COST_FIRST_CHAR; + static const float TRANSPOSITION_COST; + static const float SPACE_SUBSTITUTION_COST; + static const float ADDITIONAL_PROXIMITY_COST; + static const float SUBSTITUTION_COST; + static const float COST_NEW_WORD; + static const float COST_NEW_WORD_CAPITALIZED; + static const float DISTANCE_WEIGHT_LANGUAGE; + static const float COST_FIRST_LOOKAHEAD; + static const float COST_LOOKAHEAD; + static const float HAS_PROXIMITY_TERMINAL_COST; + static const float HAS_EDIT_CORRECTION_TERMINAL_COST; + static const float HAS_MULTI_WORD_TERMINAL_COST; + static const float TYPING_BASE_OUTPUT_SCORE; + static const float TYPING_MAX_OUTPUT_SCORE_PER_INPUT; + static const float MAX_NORM_DISTANCE_FOR_EDIT; + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(ScoringParams); +}; +} // namespace latinime +#endif // LATINIME_SCORING_PARAMS_H diff --git a/native/jni/src/suggest/policyimpl/typing/typing_scoring.cpp b/native/jni/src/suggest/policyimpl/typing/typing_scoring.cpp new file mode 100644 index 000000000..d8c6175e2 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_scoring.cpp @@ -0,0 +1,21 @@ +/* + * 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. + */ + +#include "suggest/policyimpl/typing/typing_scoring.h" + +namespace latinime { +const TypingScoring TypingScoring::sInstance; +} // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/typing/typing_scoring.h b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h new file mode 100644 index 000000000..90e2133e7 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_scoring.h @@ -0,0 +1,82 @@ +/* + * 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. + */ + +#ifndef LATINIME_TYPING_SCORING_H +#define LATINIME_TYPING_SCORING_H + +#include "defines.h" +#include "suggest/core/policy/scoring.h" +#include "suggest/policyimpl/typing/scoring_params.h" + +namespace latinime { + +class DicNode; +class DicTraverseSession; + +class TypingScoring : public Scoring { + public: + static const TypingScoring *getInstance() { return &sInstance; } + + AK_FORCE_INLINE bool getMostProbableString( + const DicTraverseSession *const traverseSession, const int terminalSize, + const float languageWeight, int *const outputCodePoints, int *const type, + int *const freq) const { + return false; + } + + AK_FORCE_INLINE void safetyNetForMostProbableString(const int terminalSize, + const int maxScore, int *const outputCodePoints, int *const frequencies) const { + } + + AK_FORCE_INLINE void searchWordWithDoubleLetter(DicNode *terminals, + const int terminalSize, int *doubleLetterTerminalIndex, + DoubleLetterLevel *doubleLetterLevel) const { + } + + AK_FORCE_INLINE float getAdjustedLanguageWeight(DicTraverseSession *const traverseSession, + DicNode *const terminals, const int size) const { + return 1.0f; + } + + AK_FORCE_INLINE int calculateFinalScore(const float compoundDistance, + const int inputSize, const bool forceCommit) const { + const float maxDistance = ScoringParams::DISTANCE_WEIGHT_LANGUAGE + + static_cast<float>(inputSize) * ScoringParams::TYPING_MAX_OUTPUT_SCORE_PER_INPUT; + return static_cast<int>((ScoringParams::TYPING_BASE_OUTPUT_SCORE + - (compoundDistance / maxDistance) + + (forceCommit ? ScoringParams::AUTOCORRECT_OUTPUT_THRESHOLD : 0.0f)) + * SUGGEST_INTERFACE_OUTPUT_SCALE); + } + + AK_FORCE_INLINE float getDoubleLetterDemotionDistanceCost(const int terminalIndex, + const int doubleLetterTerminalIndex, + const DoubleLetterLevel doubleLetterLevel) const { + return 0.0f; + } + + AK_FORCE_INLINE bool doesAutoCorrectValidWord() const { + return false; + } + + private: + DISALLOW_COPY_AND_ASSIGN(TypingScoring); + static const TypingScoring sInstance; + + TypingScoring() {} + ~TypingScoring() {} +}; +} // namespace latinime +#endif // LATINIME_TYPING_SCORING_H diff --git a/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy.cpp b/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy.cpp new file mode 100644 index 000000000..0c2763967 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy.cpp @@ -0,0 +1,21 @@ +/* + * 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. + */ + +#include "suggest/policyimpl/typing/typing_suggest_policy.h" + +namespace latinime { +const TypingSuggestPolicy TypingSuggestPolicy::sInstance; +} // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy.h b/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy.h new file mode 100644 index 000000000..35f48097c --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy.h @@ -0,0 +1,55 @@ +/* + * 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. + */ + +#ifndef LATINIME_TYPING_SUGGEST_POLICY_H +#define LATINIME_TYPING_SUGGEST_POLICY_H + +#include "defines.h" +#include "suggest/core/policy/suggest_policy.h" +#include "suggest/policyimpl/typing/typing_scoring.h" +#include "suggest/policyimpl/typing/typing_traversal.h" +#include "suggest/policyimpl/typing/typing_weighting.h" + +namespace latinime { + +class Scoring; +class Traversal; +class Weighting; + +class TypingSuggestPolicy : public SuggestPolicy { + public: + static const TypingSuggestPolicy *getInstance() { return &sInstance; } + + TypingSuggestPolicy() {} + virtual ~TypingSuggestPolicy() {} + AK_FORCE_INLINE const Traversal *getTraversal() const { + return TypingTraversal::getInstance(); + } + + AK_FORCE_INLINE const Scoring *getScoring() const { + return TypingScoring::getInstance(); + } + + AK_FORCE_INLINE const Weighting *getWeighting() const { + return TypingWeighting::getInstance(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(TypingSuggestPolicy); + static const TypingSuggestPolicy sInstance; +}; +} // namespace latinime +#endif // LATINIME_TYPING_SUGGEST_POLICY_H diff --git a/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy_factory.h b/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy_factory.h new file mode 100644 index 000000000..a67b45b1b --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_suggest_policy_factory.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#ifndef LATINIME_TYPING_SUGGEST_POLICY_FACTORY_H +#define LATINIME_TYPING_SUGGEST_POLICY_FACTORY_H + +#include "defines.h" +#include "typing_suggest_policy.h" + +namespace latinime { + +class SuggestPolicy; + +class TypingSuggestPolicyFactory { + public: + static const SuggestPolicy *getTypingSuggestPolicy() { + return TypingSuggestPolicy::getInstance(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(TypingSuggestPolicyFactory); +}; +} // namespace latinime +#endif // LATINIME_TYPING_SUGGEST_POLICY_FACTORY_H diff --git a/native/jni/src/suggest/policyimpl/typing/typing_traversal.cpp b/native/jni/src/suggest/policyimpl/typing/typing_traversal.cpp new file mode 100644 index 000000000..66f8ba9fa --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_traversal.cpp @@ -0,0 +1,24 @@ +/* + * 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. + */ + +#include "suggest/policyimpl/typing/typing_traversal.h" + +namespace latinime { +const bool TypingTraversal::CORRECT_OMISSION = true; +const bool TypingTraversal::CORRECT_SPACE_SUBSTITUTION = true; +const bool TypingTraversal::CORRECT_SPACE_OMISSION = true; +const TypingTraversal TypingTraversal::sInstance; +} // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/typing/typing_traversal.h b/native/jni/src/suggest/policyimpl/typing/typing_traversal.h new file mode 100644 index 000000000..f22029a2c --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_traversal.h @@ -0,0 +1,184 @@ +/* + * 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. + */ + +#ifndef LATINIME_TYPING_TRAVERSAL_H +#define LATINIME_TYPING_TRAVERSAL_H + +#include <stdint.h> + +#include "char_utils.h" +#include "defines.h" +#include "proximity_info_state.h" +#include "suggest/core/dicnode/dic_node.h" +#include "suggest/core/dicnode/dic_node_vector.h" +#include "suggest/core/policy/traversal.h" +#include "suggest/core/session/dic_traverse_session.h" +#include "suggest/policyimpl/typing/scoring_params.h" + +namespace latinime { +class TypingTraversal : public Traversal { + public: + static const TypingTraversal *getInstance() { return &sInstance; } + + AK_FORCE_INLINE int getMaxPointerCount() const { + return MAX_POINTER_COUNT; + } + + AK_FORCE_INLINE bool allowsErrorCorrections(const DicNode *const dicNode) const { + return dicNode->getNormalizedSpatialDistance() + < ScoringParams::MAX_NORM_DISTANCE_FOR_EDIT; + } + + AK_FORCE_INLINE bool isOmission(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode, const DicNode *const childDicNode) const { + if (!CORRECT_OMISSION) { + return false; + } + const int inputSize = traverseSession->getInputSize(); + // TODO: Don't refer to isCompletion? + if (dicNode->isCompletion(inputSize)) { + return false; + } + if (dicNode->canBeIntentionalOmission()) { + return true; + } + const int point0Index = dicNode->getInputIndex(0); + const int currentBaseLowerCodePoint = + toBaseLowerCase(childDicNode->getNodeCodePoint()); + const int typedBaseLowerCodePoint = + toBaseLowerCase(traverseSession->getProximityInfoState(0) + ->getPrimaryCodePointAt(point0Index)); + return (currentBaseLowerCodePoint != typedBaseLowerCodePoint); + } + + AK_FORCE_INLINE bool isSpaceSubstitutionTerminal( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const { + if (!CORRECT_SPACE_SUBSTITUTION) { + return false; + } + if (!canDoLookAheadCorrection(traverseSession, dicNode)) { + return false; + } + const int point0Index = dicNode->getInputIndex(0); + return dicNode->isTerminalWordNode() + && traverseSession->getProximityInfoState(0)-> + hasSpaceProximity(point0Index); + } + + AK_FORCE_INLINE bool isSpaceOmissionTerminal( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const { + if (!CORRECT_SPACE_OMISSION) { + return false; + } + const int inputSize = traverseSession->getInputSize(); + // TODO: Don't refer to isCompletion? + if (dicNode->isCompletion(inputSize)) { + return false; + } + if (!dicNode->isTerminalWordNode()) { + return false; + } + const int16_t pointIndex = dicNode->getInputIndex(0); + return pointIndex <= inputSize && !dicNode->isTotalInputSizeExceedingLimit() + && !dicNode->shouldBeFilterdBySafetyNetForBigram(); + } + + AK_FORCE_INLINE bool shouldDepthLevelCache( + const DicTraverseSession *const traverseSession) const { + const int inputSize = traverseSession->getInputSize(); + return traverseSession->isCacheBorderForTyping(inputSize); + } + + AK_FORCE_INLINE bool shouldNodeLevelCache( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const { + return false; + } + + AK_FORCE_INLINE bool canDoLookAheadCorrection( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const { + const int inputSize = traverseSession->getInputSize(); + return dicNode->canDoLookAheadCorrection(inputSize); + } + + AK_FORCE_INLINE ProximityType getProximityType( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode, + const DicNode *const childDicNode) const { + return traverseSession->getProximityInfoState(0)->getProximityType( + dicNode->getInputIndex(0), childDicNode->getNodeCodePoint(), + true /* checkProximityChars */); + } + + AK_FORCE_INLINE bool needsToTraverseAllUserInput() const { + return true; + } + + AK_FORCE_INLINE float getMaxSpatialDistance() const { + return ScoringParams::MAX_SPATIAL_DISTANCE; + } + + AK_FORCE_INLINE bool allowPartialCommit() const { + return true; + } + + AK_FORCE_INLINE int getDefaultExpandDicNodeSize() const { + return DicNodeVector::DEFAULT_NODES_SIZE_FOR_OPTIMIZATION; + } + + AK_FORCE_INLINE bool sameAsTyped( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const { + return traverseSession->getProximityInfoState(0)->sameAsTyped( + dicNode->getOutputWordBuf(), dicNode->getDepth()); + } + + AK_FORCE_INLINE int getMaxCacheSize() const { + return ScoringParams::MAX_CACHE_DIC_NODE_SIZE; + } + + AK_FORCE_INLINE bool isPossibleOmissionChildNode( + const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode, + const DicNode *const dicNode) const { + const ProximityType proximityType = + getProximityType(traverseSession, parentDicNode, dicNode); + if (!DicNodeUtils::isProximityChar(proximityType)) { + return false; + } + return true; + } + + AK_FORCE_INLINE bool isGoodToTraverseNextWord(const DicNode *const dicNode) const { + const int probability = dicNode->getProbability(); + if (probability < ScoringParams::THRESHOLD_NEXT_WORD_PROBABILITY) { + return false; + } + const int c = dicNode->getOutputWordBuf()[0]; + const bool shortCappedWord = dicNode->getDepth() + < ScoringParams::THRESHOLD_SHORT_WORD_LENGTH && isAsciiUpper(c); + return !shortCappedWord + || probability >= ScoringParams::THRESHOLD_NEXT_WORD_PROBABILITY_FOR_CAPPED; + } + + private: + DISALLOW_COPY_AND_ASSIGN(TypingTraversal); + static const bool CORRECT_OMISSION; + static const bool CORRECT_SPACE_SUBSTITUTION; + static const bool CORRECT_SPACE_OMISSION; + static const TypingTraversal sInstance; + + TypingTraversal() {} + ~TypingTraversal() {} +}; +} // namespace latinime +#endif // LATINIME_TYPING_TRAVERSAL_H diff --git a/native/jni/src/suggest/gesture_suggest.cpp b/native/jni/src/suggest/policyimpl/typing/typing_weighting.cpp index fce5621d5..1500341bd 100644 --- a/native/jni/src/suggest/gesture_suggest.cpp +++ b/native/jni/src/suggest/policyimpl/typing/typing_weighting.cpp @@ -14,12 +14,11 @@ * limitations under the License. */ -#include "gesture_suggest.h" +#include "suggest/policyimpl/typing/typing_weighting.h" -namespace latinime { - SuggestInterface *(*GestureSuggest::sGestureSuggestFactoryMethod)() = 0; +#include "suggest/core/dicnode/dic_node.h" +#include "suggest/policyimpl/typing/scoring_params.h" - GestureSuggest::~GestureSuggest() { - delete mSuggestInterface; - } -} // namespace latinime +namespace latinime { +const TypingWeighting TypingWeighting::sInstance; +} // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/typing/typing_weighting.h b/native/jni/src/suggest/policyimpl/typing/typing_weighting.h new file mode 100644 index 000000000..52d54eb0f --- /dev/null +++ b/native/jni/src/suggest/policyimpl/typing/typing_weighting.h @@ -0,0 +1,195 @@ +/* + * 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. + */ + +#ifndef LATINIME_TYPING_WEIGHTING_H +#define LATINIME_TYPING_WEIGHTING_H + +#include "defines.h" +#include "suggest/core/dicnode/dic_node_utils.h" +#include "suggest/core/policy/weighting.h" +#include "suggest/core/session/dic_traverse_session.h" +#include "suggest/policyimpl/typing/scoring_params.h" + +namespace latinime { + +class DicNode; +struct DicNode_InputStateG; + +class TypingWeighting : public Weighting { + public: + static const TypingWeighting *getInstance() { return &sInstance; } + + protected: + float getTerminalSpatialCost( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const { + float cost = 0.0f; + if (dicNode->hasMultipleWords()) { + cost += ScoringParams::HAS_MULTI_WORD_TERMINAL_COST; + } + if (dicNode->getProximityCorrectionCount() > 0) { + cost += ScoringParams::HAS_PROXIMITY_TERMINAL_COST; + } + if (dicNode->getEditCorrectionCount() > 0) { + cost += ScoringParams::HAS_EDIT_CORRECTION_TERMINAL_COST; + } + return cost; + } + + float getOmissionCost(const DicNode *const parentDicNode, const DicNode *const dicNode) const { + bool sameCodePoint = false; + bool isFirstLetterOmission = false; + float cost = 0.0f; + sameCodePoint = dicNode->isSameNodeCodePoint(parentDicNode); + // If the traversal omitted the first letter then the dicNode should now be on the second. + isFirstLetterOmission = dicNode->getDepth() == 2; + if (isFirstLetterOmission) { + cost = ScoringParams::OMISSION_COST_FIRST_CHAR; + } else { + cost = sameCodePoint ? ScoringParams::OMISSION_COST_SAME_CHAR + : ScoringParams::OMISSION_COST; + } + return cost; + } + + float getMatchedCost( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode, + DicNode_InputStateG *inputStateG) const { + const int pointIndex = dicNode->getInputIndex(0); + // Note: min() required since length can be MAX_POINT_TO_KEY_LENGTH for characters not on + // the keyboard (like accented letters) + const float length = min(ScoringParams::MAX_SPATIAL_DISTANCE, + traverseSession->getProximityInfoState(0)->getPointToKeyLength( + pointIndex, dicNode->getNodeCodePoint())); + const float weightedDistance = length * ScoringParams::DISTANCE_WEIGHT_LENGTH; + const bool isFirstChar = pointIndex == 0; + const bool isProximity = isProximityDicNode(traverseSession, dicNode); + const float cost = isProximity ? (isFirstChar ? ScoringParams::FIRST_PROXIMITY_COST + : ScoringParams::PROXIMITY_COST) : 0.0f; + return weightedDistance + cost; + } + + bool isProximityDicNode( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const { + const int pointIndex = dicNode->getInputIndex(0); + const int primaryCodePoint = toBaseLowerCase( + traverseSession->getProximityInfoState(0)->getPrimaryCodePointAt(pointIndex)); + const int dicNodeChar = toBaseLowerCase(dicNode->getNodeCodePoint()); + return primaryCodePoint != dicNodeChar; + } + + float getTranspositionCost( + const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode, + const DicNode *const dicNode) const { + const int16_t parentPointIndex = parentDicNode->getInputIndex(0); + const int prevCodePoint = parentDicNode->getNodeCodePoint(); + const float distance1 = traverseSession->getProximityInfoState(0)->getPointToKeyLength( + parentPointIndex + 1, prevCodePoint); + const int codePoint = dicNode->getNodeCodePoint(); + const float distance2 = traverseSession->getProximityInfoState(0)->getPointToKeyLength( + parentPointIndex, codePoint); + const float distance = distance1 + distance2; + const float weightedLengthDistance = + distance * ScoringParams::DISTANCE_WEIGHT_LENGTH; + return ScoringParams::TRANSPOSITION_COST + weightedLengthDistance; + } + + float getInsertionCost( + const DicTraverseSession *const traverseSession, + const DicNode *const parentDicNode, const DicNode *const dicNode) const { + const int16_t parentPointIndex = parentDicNode->getInputIndex(0); + const int prevCodePoint = + traverseSession->getProximityInfoState(0)->getPrimaryCodePointAt(parentPointIndex); + + const int currentCodePoint = dicNode->getNodeCodePoint(); + const bool sameCodePoint = prevCodePoint == currentCodePoint; + const float dist = traverseSession->getProximityInfoState(0)->getPointToKeyLength( + parentPointIndex + 1, currentCodePoint); + const float weightedDistance = dist * ScoringParams::DISTANCE_WEIGHT_LENGTH; + const bool singleChar = dicNode->getDepth() == 1; + const float cost = (singleChar ? ScoringParams::INSERTION_COST_FIRST_CHAR : 0.0f) + + (sameCodePoint ? ScoringParams::INSERTION_COST_SAME_CHAR + : ScoringParams::INSERTION_COST); + return cost + weightedDistance; + } + + float getNewWordCost(const DicNode *const dicNode) const { + const bool isCapitalized = dicNode->isCapitalized(); + return isCapitalized ? + ScoringParams::COST_NEW_WORD_CAPITALIZED : ScoringParams::COST_NEW_WORD; + } + + float getNewWordBigramCost( + const DicTraverseSession *const traverseSession, const DicNode *const dicNode, + hash_map_compat<int, int16_t> *const bigramCacheMap) const { + return DicNodeUtils::getBigramNodeImprobability(traverseSession->getOffsetDict(), + dicNode, bigramCacheMap); + } + + float getCompletionCost(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode) const { + // The auto completion starts when the input index is same as the input size + const bool firstCompletion = dicNode->getInputIndex(0) + == traverseSession->getInputSize(); + // TODO: Change the cost for the first completion for the gesture? + const float cost = firstCompletion ? ScoringParams::COST_FIRST_LOOKAHEAD + : ScoringParams::COST_LOOKAHEAD; + return cost; + } + + float getTerminalLanguageCost(const DicTraverseSession *const traverseSession, + const DicNode *const dicNode, const float dicNodeLanguageImprobability) const { + const bool hasEditCount = dicNode->getEditCorrectionCount() > 0; + const bool isSameLength = dicNode->getDepth() == traverseSession->getInputSize(); + const bool hasMultipleWords = dicNode->hasMultipleWords(); + const bool hasProximityErrors = dicNode->getProximityCorrectionCount() > 0; + // Gesture input is always assumed to have proximity errors + // because the input word shouldn't be treated as perfect + const bool isExactMatch = !hasEditCount && !hasMultipleWords + && !hasProximityErrors && isSameLength; + + const float totalPrevWordsLanguageCost = dicNode->getTotalPrevWordsLanguageCost(); + const float languageImprobability = isExactMatch ? 0.0f : dicNodeLanguageImprobability; + const float languageWeight = ScoringParams::DISTANCE_WEIGHT_LANGUAGE; + // TODO: Caveat: The following equation should be: + // totalPrevWordsLanguageCost + (languageImprobability * languageWeight); + return (totalPrevWordsLanguageCost + languageImprobability) * languageWeight; + } + + AK_FORCE_INLINE bool needsToNormalizeCompoundDistance() const { + return false; + } + + AK_FORCE_INLINE float getAdditionalProximityCost() const { + return ScoringParams::ADDITIONAL_PROXIMITY_COST; + } + + AK_FORCE_INLINE float getSubstitutionCost() const { + return ScoringParams::SUBSTITUTION_COST; + } + + AK_FORCE_INLINE float getSpaceSubstitutionCost() const { + return ScoringParams::SPACE_SUBSTITUTION_COST; + } + + private: + DISALLOW_COPY_AND_ASSIGN(TypingWeighting); + static const TypingWeighting sInstance; + + TypingWeighting() {} + ~TypingWeighting() {} +}; +} // namespace latinime +#endif // LATINIME_TYPING_WEIGHTING_H diff --git a/native/jni/src/suggest/typing_suggest.h b/native/jni/src/suggest/typing_suggest.h deleted file mode 100644 index 678037aa2..000000000 --- a/native/jni/src/suggest/typing_suggest.h +++ /dev/null @@ -1,61 +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. - */ - -#ifndef LATINIME_TYPING_SUGGEST_H -#define LATINIME_TYPING_SUGGEST_H - -#include "defines.h" -#include "suggest_interface.h" - -namespace latinime { - -class ProximityInfo; - -class TypingSuggest : public SuggestInterface { - public: - TypingSuggest() : mSuggestInterface(getTypingSuggestInstance()) {} - - virtual ~TypingSuggest(); - - int getSuggestions(ProximityInfo *pInfo, void *traverseSession, int *inputXs, int *inputYs, - int *times, int *pointerIds, int *inputCodePoints, int inputSize, int commitPoint, - int *outWords, int *frequencies, int *outputIndices, int *outputTypes) const { - if (!mSuggestInterface) { - return 0; - } - return mSuggestInterface->getSuggestions(pInfo, traverseSession, inputXs, inputYs, times, - pointerIds, inputCodePoints, inputSize, commitPoint, outWords, frequencies, - outputIndices, outputTypes); - } - - static void setTypingSuggestFactoryMethod(SuggestInterface *(*factoryMethod)()) { - sTypingSuggestFactoryMethod = factoryMethod; - } - - private: - DISALLOW_COPY_AND_ASSIGN(TypingSuggest); - static SuggestInterface *getTypingSuggestInstance() { - if (!sTypingSuggestFactoryMethod) { - return 0; - } - return sTypingSuggestFactoryMethod(); - } - - static SuggestInterface *(*sTypingSuggestFactoryMethod)(); - SuggestInterface *mSuggestInterface; -}; -} // namespace latinime -#endif // LATINIME_TYPING_SUGGEST_H diff --git a/native/jni/src/unigram_dictionary.cpp b/native/jni/src/unigram_dictionary.cpp index 80ba412a3..a672294b5 100644 --- a/native/jni/src/unigram_dictionary.cpp +++ b/native/jni/src/unigram_dictionary.cpp @@ -22,6 +22,7 @@ #include "char_utils.h" #include "defines.h" #include "dictionary.h" +#include "digraph_utils.h" #include "proximity_info.h" #include "terminal_attributes.h" #include "unigram_dictionary.h" @@ -30,19 +31,10 @@ namespace latinime { -const UnigramDictionary::digraph_t UnigramDictionary::GERMAN_UMLAUT_DIGRAPHS[] = - { { 'a', 'e', 0x00E4 }, // U+00E4 : LATIN SMALL LETTER A WITH DIAERESIS - { 'o', 'e', 0x00F6 }, // U+00F6 : LATIN SMALL LETTER O WITH DIAERESIS - { 'u', 'e', 0x00FC } }; // U+00FC : LATIN SMALL LETTER U WITH DIAERESIS - -const UnigramDictionary::digraph_t UnigramDictionary::FRENCH_LIGATURES_DIGRAPHS[] = - { { 'a', 'e', 0x00E6 }, // U+00E6 : LATIN SMALL LETTER AE - { 'o', 'e', 0x0153 } }; // U+0153 : LATIN SMALL LIGATURE OE - // TODO: check the header -UnigramDictionary::UnigramDictionary(const uint8_t *const streamStart, const unsigned int flags) +UnigramDictionary::UnigramDictionary(const uint8_t *const streamStart, const unsigned int dictFlags) : DICT_ROOT(streamStart), ROOT_POS(0), - MAX_DIGRAPH_SEARCH_DEPTH(DEFAULT_MAX_DIGRAPH_SEARCH_DEPTH), FLAGS(flags) { + MAX_DIGRAPH_SEARCH_DEPTH(DEFAULT_MAX_DIGRAPH_SEARCH_DEPTH), DICT_FLAGS(dictFlags) { if (DEBUG_DICT) { AKLOGI("UnigramDictionary - constructor"); } @@ -58,7 +50,7 @@ static void addWord(int *word, int length, int probability, WordsPriorityQueue * // Return the replacement code point for a digraph, or 0 if none. int UnigramDictionary::getDigraphReplacement(const int *codes, const int i, const int inputSize, - const digraph_t *const digraphs, const unsigned int digraphsSize) const { + const DigraphUtils::digraph_t *const digraphs, const unsigned int digraphsSize) const { // There can't be a digraph if we don't have at least 2 characters to examine if (i + 2 > inputSize) return false; @@ -74,7 +66,7 @@ int UnigramDictionary::getDigraphReplacement(const int *codes, const int i, cons // It's an interesting digraph if the second char matches too. if (digraphs[lastDigraphIndex].second == codes[i + 1]) { - return digraphs[lastDigraphIndex].replacement; + return digraphs[lastDigraphIndex].compositeGlyph; } else { return 0; } @@ -93,7 +85,7 @@ void UnigramDictionary::getWordWithDigraphSuggestionsRec(ProximityInfo *proximit const bool useFullEditDistance, const int *codesSrc, const int codesRemain, const int currentDepth, int *codesDest, Correction *correction, WordsPriorityQueuePool *queuePool, - const digraph_t *const digraphs, const unsigned int digraphsSize) const { + const DigraphUtils::digraph_t *const digraphs, const unsigned int digraphsSize) const { ASSERT(sizeof(codesDest[0]) == sizeof(codesSrc[0])); ASSERT(sizeof(xCoordinatesBuffer[0]) == sizeof(xcoordinates[0])); ASSERT(sizeof(yCoordinatesBuffer[0]) == sizeof(ycoordinates[0])); @@ -169,7 +161,10 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, const int *x queuePool.clearAll(); Correction masterCorrection; masterCorrection.resetCorrection(); - if (BinaryFormat::REQUIRES_GERMAN_UMLAUT_PROCESSING & FLAGS) + const DigraphUtils::digraph_t *digraphs = 0; + const int digraphsSize = + DigraphUtils::getAllDigraphsForDictionaryAndReturnSize(DICT_FLAGS, &digraphs); + if (digraphsSize > 0) { // Incrementally tune the word and try all possibilities int codesBuffer[sizeof(*inputCodePoints) * inputSize]; int xCoordinatesBuffer[inputSize]; @@ -177,15 +172,7 @@ int UnigramDictionary::getSuggestions(ProximityInfo *proximityInfo, const int *x getWordWithDigraphSuggestionsRec(proximityInfo, xcoordinates, ycoordinates, codesBuffer, xCoordinatesBuffer, yCoordinatesBuffer, inputSize, bigramMap, bigramFilter, useFullEditDistance, inputCodePoints, inputSize, 0, codesBuffer, &masterCorrection, - &queuePool, GERMAN_UMLAUT_DIGRAPHS, NELEMS(GERMAN_UMLAUT_DIGRAPHS)); - } else if (BinaryFormat::REQUIRES_FRENCH_LIGATURES_PROCESSING & FLAGS) { - int codesBuffer[sizeof(*inputCodePoints) * inputSize]; - int xCoordinatesBuffer[inputSize]; - int yCoordinatesBuffer[inputSize]; - getWordWithDigraphSuggestionsRec(proximityInfo, xcoordinates, ycoordinates, codesBuffer, - xCoordinatesBuffer, yCoordinatesBuffer, inputSize, bigramMap, bigramFilter, - useFullEditDistance, inputCodePoints, inputSize, 0, codesBuffer, &masterCorrection, - &queuePool, FRENCH_LIGATURES_DIGRAPHS, NELEMS(FRENCH_LIGATURES_DIGRAPHS)); + &queuePool, digraphs, digraphsSize); } else { // Normal processing getWordSuggestions(proximityInfo, xcoordinates, ycoordinates, inputCodePoints, inputSize, bigramMap, bigramFilter, useFullEditDistance, &masterCorrection, &queuePool); diff --git a/native/jni/src/unigram_dictionary.h b/native/jni/src/unigram_dictionary.h index c1955e8bb..a64a539bd 100644 --- a/native/jni/src/unigram_dictionary.h +++ b/native/jni/src/unigram_dictionary.h @@ -20,6 +20,7 @@ #include <map> #include <stdint.h> #include "defines.h" +#include "digraph_utils.h" namespace latinime { @@ -29,8 +30,6 @@ class TerminalAttributes; class WordsPriorityQueuePool; class UnigramDictionary { - typedef struct { int first; int second; int replacement; } digraph_t; - public: // Error tolerances static const int DEFAULT_MAX_ERRORS = 2; @@ -39,7 +38,7 @@ class UnigramDictionary { static const int FLAG_MULTIPLE_SUGGEST_ABORT = 0; static const int FLAG_MULTIPLE_SUGGEST_SKIP = 1; static const int FLAG_MULTIPLE_SUGGEST_CONTINUE = 2; - UnigramDictionary(const uint8_t *const streamStart, const unsigned int flags); + UnigramDictionary(const uint8_t *const streamStart, const unsigned int dictFlags); int getProbability(const int *const inWord, const int length) const; int getBigramPosition(int pos, int *word, int offset, int length) const; int getSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates, @@ -47,6 +46,7 @@ class UnigramDictionary { const std::map<int, int> *bigramMap, const uint8_t *bigramFilter, const bool useFullEditDistance, int *outWords, int *frequencies, int *outputTypes) const; + int getDictFlags() const { return DICT_FLAGS; } virtual ~UnigramDictionary(); private: @@ -57,13 +57,13 @@ class UnigramDictionary { const bool useFullEditDistance, Correction *correction, WordsPriorityQueuePool *queuePool) const; int getDigraphReplacement(const int *codes, const int i, const int inputSize, - const digraph_t *const digraphs, const unsigned int digraphsSize) const; + const DigraphUtils::digraph_t *const digraphs, const unsigned int digraphsSize) const; void getWordWithDigraphSuggestionsRec(ProximityInfo *proximityInfo, const int *xcoordinates, const int *ycoordinates, const int *codesBuffer, int *xCoordinatesBuffer, int *yCoordinatesBuffer, const int codesBufferSize, const std::map<int, int> *bigramMap, const uint8_t *bigramFilter, const bool useFullEditDistance, const int *codesSrc, const int codesRemain, const int currentDepth, int *codesDest, Correction *correction, - WordsPriorityQueuePool *queuePool, const digraph_t *const digraphs, + WordsPriorityQueuePool *queuePool, const DigraphUtils::digraph_t *const digraphs, const unsigned int digraphsSize) const; void initSuggestions(ProximityInfo *proximityInfo, const int *xcoordinates, const int *ycoordinates, const int *codes, const int inputSize, @@ -110,10 +110,7 @@ class UnigramDictionary { const uint8_t *const DICT_ROOT; const int ROOT_POS; const int MAX_DIGRAPH_SEARCH_DEPTH; - const int FLAGS; - - static const digraph_t GERMAN_UMLAUT_DIGRAPHS[]; - static const digraph_t FRENCH_LIGATURES_DIGRAPHS[]; + const int DICT_FLAGS; }; } // namespace latinime #endif // LATINIME_UNIGRAM_DICTIONARY_H diff --git a/tests/src/com/android/inputmethod/keyboard/internal/HermiteInterpolatorTests.java b/tests/src/com/android/inputmethod/keyboard/internal/HermiteInterpolatorTests.java new file mode 100644 index 000000000..3ff5aa485 --- /dev/null +++ b/tests/src/com/android/inputmethod/keyboard/internal/HermiteInterpolatorTests.java @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +@SmallTest +public class HermiteInterpolatorTests extends AndroidTestCase { + private final HermiteInterpolator mInterpolator = new HermiteInterpolator(); + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + private static final float EPSLION = 0.0000005f; + + private static void assertFloatEquals(final String message, float expected, float actual) { + if (Math.abs(expected - actual) >= EPSLION) { + fail(String.format("%s expected:<%s> but was:<%s>", message, expected, actual)); + } + } + + // t=0 p0=(0,1) + // t=1 p1=(1,0) + // t=2 p2=(3,2) + // t=3 p3=(2,3) + // y + // | + // 3 + o p3 + // | + // 2 + o p2 + // | + // 1 o p0 + // | p1 + // 0 +---o---+---+-- x + // 0 1 2 3 + private final int[] mXCoords = { 0, 1, 3, 2 }; + private final int[] mYCoords = { 1, 0, 2, 3 }; + private static final int p0 = 0; + private static final int p1 = 1; + private static final int p2 = 2; + private static final int p3 = 3; + + public void testP0P1() { + // [(p0 p1) p2 p3] + mInterpolator.reset(mXCoords, mYCoords, p0, p3 + 1); + mInterpolator.setInterval(p0 - 1, p0, p1, p1 + 1); + assertEquals("p0x", mXCoords[p0], mInterpolator.mP1X); + assertEquals("p0y", mYCoords[p0], mInterpolator.mP1Y); + assertEquals("p1x", mXCoords[p1], mInterpolator.mP2X); + assertEquals("p1y", mYCoords[p1], mInterpolator.mP2Y); + // XY-slope at p0=3.0 (-0.75/-0.25) + assertFloatEquals("slope x p0", -0.25f, mInterpolator.mSlope1X); + assertFloatEquals("slope y p0", -0.75f, mInterpolator.mSlope1Y); + // XY-slope at p1=1/3.0 (0.50/1.50) + assertFloatEquals("slope x p1", 1.50f, mInterpolator.mSlope2X); + assertFloatEquals("slope y p1", 0.50f, mInterpolator.mSlope2Y); + // t=0.0 (p0) + mInterpolator.interpolate(0.0f); + assertFloatEquals("t=0.0 x", 0.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.0 y", 1.0f, mInterpolator.mInterpolatedY); + // t=0.2 + mInterpolator.interpolate(0.2f); + assertFloatEquals("t=0.2 x", 0.02400f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.2 y", 0.78400f, mInterpolator.mInterpolatedY); + // t=0.5 + mInterpolator.interpolate(0.5f); + assertFloatEquals("t=0.5 x", 0.28125f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.5 y", 0.34375f, mInterpolator.mInterpolatedY); + // t=0.8 + mInterpolator.interpolate(0.8f); + assertFloatEquals("t=0.8 x", 0.69600f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.8 y", 0.01600f, mInterpolator.mInterpolatedY); + // t=1.0 (p1) + mInterpolator.interpolate(1.0f); + assertFloatEquals("t=1.0 x", 1.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=1.0 y", 0.0f, mInterpolator.mInterpolatedY); + } + + public void testP1P2() { + // [p0 (p1 p2) p3] + mInterpolator.reset(mXCoords, mYCoords, p0, p3 + 1); + mInterpolator.setInterval(p1 - 1, p1, p2, p2 + 1); + assertEquals("p1x", mXCoords[p1], mInterpolator.mP1X); + assertEquals("p1y", mYCoords[p1], mInterpolator.mP1Y); + assertEquals("p2x", mXCoords[p2], mInterpolator.mP2X); + assertEquals("p2y", mYCoords[p2], mInterpolator.mP2Y); + // XY-slope at p1=1/3.0 (0.50/1.50) + assertFloatEquals("slope x p1", 1.50f, mInterpolator.mSlope1X); + assertFloatEquals("slope y p1", 0.50f, mInterpolator.mSlope1Y); + // XY-slope at p2=3.0 (1.50/0.50) + assertFloatEquals("slope x p2", 0.50f, mInterpolator.mSlope2X); + assertFloatEquals("slope y p2", 1.50f, mInterpolator.mSlope2Y); + // t=0.0 (p1) + mInterpolator.interpolate(0.0f); + assertFloatEquals("t=0.0 x", 1.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.0 y", 0.0f, mInterpolator.mInterpolatedY); + // t=0.2 + mInterpolator.interpolate(0.2f); + assertFloatEquals("t=0.2 x", 1.384f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.2 y", 0.224f, mInterpolator.mInterpolatedY); + // t=0.5 + mInterpolator.interpolate(0.5f); + assertFloatEquals("t=0.5 x", 2.125f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.5 y", 0.875f, mInterpolator.mInterpolatedY); + // t=0.8 + mInterpolator.interpolate(0.8f); + assertFloatEquals("t=0.8 x", 2.776f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.8 y", 1.616f, mInterpolator.mInterpolatedY); + // t=1.0 (p2) + mInterpolator.interpolate(1.0f); + assertFloatEquals("t=1.0 x", 3.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=1.0 y", 2.0f, mInterpolator.mInterpolatedY); + } + + public void testP2P3() { + // [p0 p1 (p2 p3)] + mInterpolator.reset(mXCoords, mYCoords, p0, p3 + 1); + mInterpolator.setInterval(p2 - 1, p2, p3, p3 + 1); + assertEquals("p2x", mXCoords[p2], mInterpolator.mP1X); + assertEquals("p2y", mYCoords[p2], mInterpolator.mP1Y); + assertEquals("p3x", mXCoords[p3], mInterpolator.mP2X); + assertEquals("p3y", mYCoords[p3], mInterpolator.mP2Y); + // XY-slope at p2=3.0 (1.50/0.50) + assertFloatEquals("slope x p2", 0.50f, mInterpolator.mSlope1X); + assertFloatEquals("slope y p2", 1.50f, mInterpolator.mSlope1Y); + // XY-slope at p3=1/3.0 (-0.25/-0.75) + assertFloatEquals("slope x p3", -0.75f, mInterpolator.mSlope2X); + assertFloatEquals("slope y p3", -0.25f, mInterpolator.mSlope2Y); + // t=0.0 (p2) + mInterpolator.interpolate(0.0f); + assertFloatEquals("t=0.0 x", 3.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.0 y", 2.0f, mInterpolator.mInterpolatedY); + // t=0.2 + mInterpolator.interpolate(0.2f); + assertFloatEquals("t=0.2 x", 2.98400f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.2 y", 2.30400f, mInterpolator.mInterpolatedY); + // t=0.5 + mInterpolator.interpolate(0.5f); + assertFloatEquals("t=0.5 x", 2.65625f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.5 y", 2.71875f, mInterpolator.mInterpolatedY); + // t=0.8 + mInterpolator.interpolate(0.8f); + assertFloatEquals("t=0.8 x", 2.21600f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.8 y", 2.97600f, mInterpolator.mInterpolatedY); + // t=1.0 (p3) + mInterpolator.interpolate(1.0f); + assertFloatEquals("t=1.0 x", 2.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=1.0 y", 3.0f, mInterpolator.mInterpolatedY); + } + + public void testJustP1P2() { + // [(p1 p2)] + mInterpolator.reset(mXCoords, mYCoords, p1, p2 + 1); + mInterpolator.setInterval(p1 - 1, p1, p2, p2 + 1); + assertEquals("p1x", mXCoords[p1], mInterpolator.mP1X); + assertEquals("p1y", mYCoords[p1], mInterpolator.mP1Y); + assertEquals("p2x", mXCoords[p2], mInterpolator.mP2X); + assertEquals("p2y", mYCoords[p2], mInterpolator.mP2Y); + // XY-slope at p1=1.0 (2.0/2.0) + assertFloatEquals("slope x p1", 2.00f, mInterpolator.mSlope1X); + assertFloatEquals("slope y p1", 2.00f, mInterpolator.mSlope1Y); + // XY-slope at p2=1.0 (2.0/2.0) + assertFloatEquals("slope x p2", 2.00f, mInterpolator.mSlope2X); + assertFloatEquals("slope y p2", 2.00f, mInterpolator.mSlope2Y); + // t=0.0 (p1) + mInterpolator.interpolate(0.0f); + assertFloatEquals("t=0.0 x", 1.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.0 y", 0.0f, mInterpolator.mInterpolatedY); + // t=0.2 + mInterpolator.interpolate(0.2f); + assertFloatEquals("t=0.2 x", 1.4f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.2 y", 0.4f, mInterpolator.mInterpolatedY); + // t=0.5 + mInterpolator.interpolate(0.5f); + assertFloatEquals("t=0.5 x", 2.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.5 y", 1.0f, mInterpolator.mInterpolatedY); + // t=0.8 + mInterpolator.interpolate(0.8f); + assertFloatEquals("t=0.8 x", 2.6f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=0.8 y", 1.6f, mInterpolator.mInterpolatedY); + // t=1.0 (p2) + mInterpolator.interpolate(1.0f); + assertFloatEquals("t=1.0 x", 3.0f, mInterpolator.mInterpolatedX); + assertFloatEquals("t=1.0 y", 2.0f, mInterpolator.mInterpolatedY); + } +} diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java index 05f39551b..d05aabf51 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserCsvTests.java @@ -56,7 +56,8 @@ public class KeySpecParserCsvTests extends InstrumentationTestCase { return names.toArray(new String[names.size()]); } - private static void assertArrayEquals(String message, Object[] expected, Object[] actual) { + private static void assertArrayEquals(final String message, final Object[] expected, + final Object[] actual) { if (expected == actual) { return; } @@ -74,14 +75,15 @@ public class KeySpecParserCsvTests extends InstrumentationTestCase { } } - private void assertTextArray(String message, String value, String ... expectedArray) { + private void assertTextArray(final String message, final String value, + final String ... expectedArray) { final String resolvedActual = KeySpecParser.resolveTextReference(value, mTextsSet); final String[] actual = StringUtils.parseCsvString(resolvedActual); final String[] expected = (expectedArray.length == 0) ? null : expectedArray; assertArrayEquals(message, expected, actual); } - private void assertError(String message, String value, String ... expected) { + private void assertError(final String message, final String value, final String ... expected) { try { assertTextArray(message, value, expected); fail(message); diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java index 4ccbf4857..4583eab2f 100644 --- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java +++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java @@ -36,6 +36,7 @@ import android.widget.TextView; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; +import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import java.util.Locale; @@ -130,7 +131,9 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> { protected void setUp() throws Exception { super.setUp(); mTextView = new MyTextView(getContext()); - mTextView.setInputType(InputType.TYPE_CLASS_TEXT); + final int inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT + | InputType.TYPE_TEXT_FLAG_MULTI_LINE; + mTextView.setInputType(inputType); mTextView.setEnabled(true); setupService(); mLatinIME = getService(); @@ -138,9 +141,7 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> { mLatinIME.onCreate(); setDebugMode(previousDebugSetting); final EditorInfo ei = new EditorInfo(); - ei.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT; final InputConnection ic = mTextView.onCreateInputConnection(ei); - ei.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT; final LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final ViewGroup vg = new FrameLayout(getContext()); @@ -181,17 +182,21 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> { // a message that calls it instead of calling it directly. Looper.loop(); - // Once #quit() has been called, the message queue has an "mQuiting" field that prevents - // any subsequent post in this queue. However the queue itself is still fully functional! - // If we have a way of resetting "queue.mQuiting" then we can continue using it as normal, - // coming back to this method to run the messages. + // Once #quit() has been called, the looper is not functional any more (it used to be, + // but now it SIGSEGV's if it's used again). + // It won't accept creating a new looper for this thread and switching to it... + // ...unless we can trick it into throwing out the old looper and believing it hasn't + // been initialized before. MessageQueue queue = Looper.myQueue(); try { - // However there is no way of doing it externally, and mQuiting is private. + // However there is no way of doing it externally, and the static ThreadLocal + // field into which it's stored is private. // So... get out the big guns. - java.lang.reflect.Field f = MessageQueue.class.getDeclaredField("mQuiting"); - f.setAccessible(true); // What do you mean "private"? - f.setBoolean(queue, false); + java.lang.reflect.Field f = Looper.class.getDeclaredField("sThreadLocal"); + f.setAccessible(true); // private lolwut + final ThreadLocal<Looper> a = (ThreadLocal<Looper>) f.get(looper); + a.set(null); + looper.prepare(); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { @@ -251,7 +256,8 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> { } protected void pickSuggestionManually(final int index, final String suggestion) { - mLatinIME.pickSuggestionManually(index, suggestion); + mLatinIME.pickSuggestionManually(index, new SuggestedWordInfo(suggestion, 1, + SuggestedWordInfo.KIND_CORRECTION, "main")); } // Helper to avoid writing the try{}catch block each time diff --git a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java index 923ab2ecc..966919ed3 100644 --- a/tests/src/com/android/inputmethod/latin/StringUtilsTests.java +++ b/tests/src/com/android/inputmethod/latin/StringUtilsTests.java @@ -19,6 +19,8 @@ package com.android.inputmethod.latin; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; +import java.util.Locale; + @SmallTest public class StringUtilsTests extends AndroidTestCase { public void testContainsInArray() { @@ -90,4 +92,48 @@ public class StringUtilsTests extends AndroidTestCase { assertEquals("in 5 elements at position 2,4", "key1,key3,key5", StringUtils.removeFromCsvIfExists("key", "key1,key,key3,key,key5")); } + + public void testToTitleCase() { + assertEquals("SSaa", + StringUtils.toTitleCase("ßaa", Locale.GERMAN)); + assertEquals("Aßa", + StringUtils.toTitleCase("aßa", Locale.GERMAN)); + assertEquals("Iab", + StringUtils.toTitleCase("iab", Locale.ENGLISH)); + assertEquals("Camelcase", + StringUtils.toTitleCase("cAmElCaSe", Locale.ENGLISH)); + assertEquals("İab", + StringUtils.toTitleCase("iab", new Locale("tr"))); + assertEquals("Aib", + StringUtils.toTitleCase("AİB", new Locale("tr"))); + // For one character, toTitleCase returns the string as is. Not sure what the motivation + // is, but that's how it works now. + assertEquals("a", + StringUtils.toTitleCase("a", Locale.ENGLISH)); + assertEquals("A", + StringUtils.toTitleCase("A", Locale.ENGLISH)); + } + + public void testGetCapitalizationType() { + assertEquals(StringUtils.CAPITALIZE_NONE, + StringUtils.getCapitalizationType("capitalize")); + assertEquals(StringUtils.CAPITALIZE_NONE, + StringUtils.getCapitalizationType("cApITalize")); + assertEquals(StringUtils.CAPITALIZE_NONE, + StringUtils.getCapitalizationType("capitalizE")); + assertEquals(StringUtils.CAPITALIZE_NONE, + StringUtils.getCapitalizationType("__c a piu$@tali56ze")); + assertEquals(StringUtils.CAPITALIZE_FIRST, + StringUtils.getCapitalizationType("A__c a piu$@tali56ze")); + assertEquals(StringUtils.CAPITALIZE_FIRST, + StringUtils.getCapitalizationType("Capitalize")); + assertEquals(StringUtils.CAPITALIZE_FIRST, + StringUtils.getCapitalizationType(" Capitalize")); + assertEquals(StringUtils.CAPITALIZE_ALL, + StringUtils.getCapitalizationType("CAPITALIZE")); + assertEquals(StringUtils.CAPITALIZE_ALL, + StringUtils.getCapitalizationType(" PI26LIE")); + assertEquals(StringUtils.CAPITALIZE_NONE, + StringUtils.getCapitalizationType("")); + } } diff --git a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java index ade010981..bd8729203 100644 --- a/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java +++ b/tests/src/com/android/inputmethod/latin/makedict/BinaryDictIOTests.java @@ -72,15 +72,12 @@ public class BinaryDictIOTests extends AndroidTestCase { private static final FormatSpec.FormatOptions VERSION3_WITH_DYNAMIC_UPDATE = new FormatSpec.FormatOptions(3, true /* supportsDynamicUpdate */); - private static final String[] CHARACTERS = { - "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", - "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" - }; - public BinaryDictIOTests() { super(); - final Random random = new Random(123456); + final long time = System.currentTimeMillis(); + Log.e(TAG, "Testing dictionary: seed is " + time); + final Random random = new Random(time); sWords.clear(); generateWords(MAX_UNIGRAMS, random); @@ -132,13 +129,16 @@ public class BinaryDictIOTests extends AndroidTestCase { /** * Generates a random word. */ - private String generateWord(final int value) { - final int lengthOfChars = CHARACTERS.length; + private String generateWord(final Random random) { StringBuilder builder = new StringBuilder("a"); - long lvalue = Math.abs((long)value); - while (lvalue > 0) { - builder.append(CHARACTERS[(int)(lvalue % lengthOfChars)]); - lvalue /= lengthOfChars; + int count = random.nextInt() % 30; // Arbitrarily 30 chars max + while (count > 0) { + final long r = Math.abs(random.nextInt()); + if (r < 0) continue; + // Don't insert 0~20, but insert any other code point. + // Code points are in the range 0~0x10FFFF. + builder.appendCodePoint((int)(20 + r % (0x10FFFF - 20))); + --count; } return builder.toString(); } @@ -146,7 +146,7 @@ public class BinaryDictIOTests extends AndroidTestCase { private void generateWords(final int number, final Random random) { final Set<String> wordSet = CollectionUtils.newHashSet(); while (wordSet.size() < number) { - wordSet.add(generateWord(random.nextInt())); + wordSet.add(generateWord(random)); } sWords.addAll(wordSet); } @@ -555,7 +555,7 @@ public class BinaryDictIOTests extends AndroidTestCase { // Test a word that isn't contained within the dictionary. final Random random = new Random((int)System.currentTimeMillis()); for (int i = 0; i < 1000; ++i) { - final String word = generateWord(random.nextInt()); + final String word = generateWord(random); if (sWords.indexOf(word) != -1) continue; runGetTerminalPosition(buffer, word, i, false); } diff --git a/tools/dicttool/tests/com/android/inputmethod/latin/makedict/FusionDictionaryTest.java b/tools/dicttool/tests/com/android/inputmethod/latin/makedict/FusionDictionaryTest.java new file mode 100644 index 000000000..fe3781d80 --- /dev/null +++ b/tools/dicttool/tests/com/android/inputmethod/latin/makedict/FusionDictionaryTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.inputmethod.latin.makedict; + +import com.android.inputmethod.latin.makedict.FusionDictionary; +import com.android.inputmethod.latin.makedict.FusionDictionary.CharGroup; +import com.android.inputmethod.latin.makedict.FusionDictionary.DictionaryOptions; +import com.android.inputmethod.latin.makedict.FusionDictionary.Node; +import com.android.inputmethod.latin.makedict.Word; + +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Random; + +/** + * Unit tests for BinaryDictInputOutput. + */ +public class FusionDictionaryTest extends TestCase { + private static final ArrayList<String> sWords = new ArrayList<String>(); + private static final int MAX_UNIGRAMS = 1000; + + private void prepare(final long seed) { + System.out.println("Seed is " + seed); + final Random random = new Random(seed); + sWords.clear(); + generateWords(MAX_UNIGRAMS, random); + } + + /** + * Generates a random word. + */ + private String generateWord(final Random random) { + StringBuilder builder = new StringBuilder("a"); + int count = random.nextInt() % 30; + while (count > 0) { + final long r = Math.abs(random.nextInt()); + if (r < 0) continue; + // Don't insert 0~20, but insert any other code point. + // Code points are in the range 0~0x10FFFF. + if (builder.length() < 7) + builder.appendCodePoint((int)(20 +r % (0x10FFFF - 20))); + --count; + } + if (builder.length() == 1) return generateWord(random); + return builder.toString(); + } + + private void generateWords(final int number, final Random random) { + while (sWords.size() < number) { + sWords.add(generateWord(random)); + } + } + + private void checkDictionary(final FusionDictionary dict, final ArrayList<String> words, + int limit) { + assertNotNull(dict); + for (final String word : words) { + if (--limit < 0) return; + final CharGroup cg = FusionDictionary.findWordInTree(dict.mRoot, word); + if (null == cg) { + System.out.println("word " + dumpWord(word)); + dumpDict(dict); + } + assertNotNull(cg); + } + } + + private String dumpWord(final String word) { + final StringBuilder sb = new StringBuilder(""); + for (int i = 0; i < word.length(); i = word.offsetByCodePoints(i, 1)) { + sb.append(word.codePointAt(i)); + sb.append(" "); + } + return sb.toString(); + } + + private void dumpDict(final FusionDictionary dict) { + for (Word w : dict) { + System.out.println("Word " + dumpWord(w.mWord)); + } + } + + // Test the flattened array contains the expected number of nodes, and + // that it does not contain any duplicates. + public void testFusion() { + final FusionDictionary dict = new FusionDictionary(new Node(), + new DictionaryOptions(new HashMap<String, String>(), + false /* germanUmlautProcessing */, false /* frenchLigatureProcessing */)); + final long time = System.currentTimeMillis(); + prepare(time); + for (int i = 0; i < sWords.size(); ++i) { + System.out.println("Adding in pos " + i + " : " + dumpWord(sWords.get(i))); + dict.add(sWords.get(i), 180, null, false); + dumpDict(dict); + checkDictionary(dict, sWords, i); + } + } +} diff --git a/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl b/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl index 2409bfcc6..2fc97b5c6 100644 --- a/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl +++ b/tools/maketext/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl @@ -21,7 +21,6 @@ import android.content.res.Resources; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.latin.CollectionUtils; -import com.android.inputmethod.latin.R; import java.util.HashMap; @@ -61,13 +60,14 @@ public final class KeyboardTextsSet { } } - public void loadStringResources(Context context) { - loadStringResourcesInternal(context, RESOURCE_NAMES, R.string.english_ime_name); + public void loadStringResources(final Context context) { + final int referenceId = context.getApplicationInfo().labelRes; + loadStringResourcesInternal(context, RESOURCE_NAMES, referenceId); } @UsedForTesting - void loadStringResourcesInternal(Context context, final String[] resourceNames, - int referenceId) { + void loadStringResourcesInternal(final Context context, final String[] resourceNames, + final int referenceId) { final Resources res = context.getResources(); final String packageName = res.getResourcePackageName(referenceId); for (final String resName : resourceNames) { |