diff options
24 files changed, 1681 insertions, 24 deletions
diff --git a/java/res/values-is/strings.xml b/java/res/values-is/strings.xml new file mode 100644 index 000000000..5cc643db6 --- /dev/null +++ b/java/res/values-is/strings.xml @@ -0,0 +1,464 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2008, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_input_options (3909945612939668554) --> + <skip /> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> + <skip /> + <!-- no translation found for vibrate_on_keypress (5258079494276955460) --> + <skip /> + <!-- no translation found for sound_on_keypress (6093592297198243644) --> + <skip /> + <!-- no translation found for popup_on_keypress (123894815723512944) --> + <skip /> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- no translation found for correction_category (2236750915056607613) --> + <skip /> + <!-- no translation found for gesture_typing_category (497263612130532630) --> + <skip /> + <!-- no translation found for misc_category (6894192814868233453) --> + <skip /> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (4487980456152830271) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) --> + <skip /> + <!-- no translation found for show_language_switch_key (5915478828318774384) --> + <skip /> + <!-- no translation found for show_language_switch_key_summary (7343403647474265713) --> + <skip /> + <!-- no translation found for sliding_key_input_preview (6604262359510068370) --> + <skip /> + <!-- no translation found for sliding_key_input_preview_summary (6340524345729093886) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for abbreviation_unit_milliseconds (8700286094028323363) --> + <skip /> + <!-- no translation found for settings_system_default (6268225104743331821) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <!-- no translation found for use_double_space_period (8781529969425082860) --> + <skip /> + <!-- no translation found for use_double_space_period_summary (6532892187247952799) --> + <skip /> + <!-- no translation found for auto_cap (1719746674854628252) --> + <skip /> + <!-- no translation found for auto_cap_summary (7934452761022946874) --> + <skip /> + <!-- no translation found for edit_personal_dictionary (3996910038952940420) --> + <skip /> + <!-- no translation found for configure_dictionaries_title (4238652338556902049) --> + <skip /> + <!-- no translation found for main_dictionary (4798763781818361168) --> + <skip /> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3859783767435239118) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_title (5078480071057408934) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_summary (2371835479734991364) --> + <skip /> + <!-- no translation found for auto_correction (7630720885194996950) --> + <skip /> + <!-- no translation found for auto_correction_summary (5625751551134658006) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> + <!-- no translation found for bigram_prediction (1084449187723948550) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (3896362682751109677) --> + <skip /> + <!-- no translation found for gesture_input (826951152254563827) --> + <skip /> + <!-- no translation found for gesture_input_summary (9180350639305731231) --> + <skip /> + <!-- no translation found for gesture_preview_trail (3802333369335722221) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text (4443240334739381053) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> + <skip /> + <!-- no translation found for added_word (8993883354622484372) --> + <skip /> + <string name="label_go_key" msgid="1635148082137219148">"Áfram"</string> + <string name="label_next_key" msgid="362972844525672568">"Næsta"</string> + <string name="label_previous_key" msgid="1211868118071386787">"Fyrra"</string> + <string name="label_done_key" msgid="2441578748772529288">"Lokið"</string> + <string name="label_send_key" msgid="2815056534433717444">"Senda"</string> + <!-- no translation found for label_pause_key (181098308428035340) --> + <skip /> + <!-- no translation found for label_wait_key (6402152600878093134) --> + <skip /> + <!-- no translation found for spoken_use_headphones (896961781287283493) --> + <skip /> + <!-- no translation found for spoken_current_text_is (2485723011272583845) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8005997889020109763) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> + <skip /> + <!-- no translation found for spoken_description_unknown (3197434010402179157) --> + <skip /> + <!-- no translation found for spoken_description_shift (244197883292549308) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> + <skip /> + <!-- no translation found for spoken_description_delete (8740376944276199801) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> + <skip /> + <!-- no translation found for spoken_description_settings (4627462689603838099) --> + <skip /> + <!-- no translation found for spoken_description_tab (2667716002663482248) --> + <skip /> + <!-- no translation found for spoken_description_space (2582521050049860859) --> + <skip /> + <!-- no translation found for spoken_description_mic (615536748882611950) --> + <skip /> + <!-- no translation found for spoken_description_smiley (2256309826200113918) --> + <skip /> + <!-- no translation found for spoken_description_return (8178083177238315647) --> + <skip /> + <!-- no translation found for spoken_description_search (1247236163755920808) --> + <skip /> + <!-- no translation found for spoken_description_dot (40711082435231673) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> + <skip /> + <!-- no translation found for spoken_description_action_next (8636078276664150324) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (800872415009336208) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> + <skip /> + <!-- no translation found for keyboard_mode_date (3137520166817128102) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> + <skip /> + <!-- no translation found for keyboard_mode_email (6216248078128294262) --> + <skip /> + <!-- no translation found for keyboard_mode_im (1137405089766557048) --> + <skip /> + <!-- no translation found for keyboard_mode_number (7991623440699957069) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> + <skip /> + <!-- no translation found for keyboard_mode_text (6479436687899701619) --> + <skip /> + <!-- no translation found for keyboard_mode_time (4381856885582143277) --> + <skip /> + <!-- no translation found for keyboard_mode_url (1519819835514911218) --> + <skip /> + <!-- no translation found for voice_input (3583258583521397548) --> + <skip /> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> + <!-- no translation found for configure_input_method (373356270290742459) --> + <skip /> + <!-- no translation found for language_selection_title (1651299598555326750) --> + <skip /> + <!-- no translation found for send_feedback (1780431884109392046) --> + <skip /> + <!-- no translation found for select_language (3693815588777926848) --> + <skip /> + <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> + <skip /> + <!-- no translation found for has_dictionary (6071847973466625007) --> + <skip /> + <!-- no translation found for prefs_enable_log (6620424505072963557) --> + <skip /> + <!-- 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) --> + <skip /> + <!-- no translation found for subtype_en_US (6160452336634534239) --> + <skip /> + <!-- no translation found for subtype_es_US (5583145191430180200) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_GB (2179097748724725906) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_US (1362581347576714579) --> + <skip /> + <!-- no translation found for subtype_with_layout_es_US (6261791057007890189) --> + <skip /> + <!-- no translation found for subtype_nepali_traditional (9032247506728040447) --> + <skip /> + <!-- no translation found for subtype_no_language (7137390094240139495) --> + <skip /> + <!-- no translation found for subtype_no_language_qwerty (244337630616742604) --> + <skip /> + <!-- no translation found for subtype_no_language_qwertz (443066912507547976) --> + <skip /> + <!-- no translation found for subtype_no_language_azerty (8144348527575640087) --> + <skip /> + <!-- no translation found for subtype_no_language_dvorak (1564494667584718094) --> + <skip /> + <!-- no translation found for subtype_no_language_colemak (5837418400010302623) --> + <skip /> + <!-- no translation found for subtype_no_language_pcqwerty (5354918232046200018) --> + <skip /> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <!-- no translation found for custom_input_styles_title (8429952441821251512) --> + <skip /> + <!-- no translation found for add_style (6163126614514489951) --> + <skip /> + <!-- no translation found for add (8299699805688017798) --> + <skip /> + <!-- no translation found for remove (4486081658752944606) --> + <skip /> + <!-- no translation found for save (7646738597196767214) --> + <skip /> + <!-- no translation found for subtype_locale (8576443440738143764) --> + <skip /> + <!-- no translation found for keyboard_layout_set (4309233698194565609) --> + <skip /> + <!-- no translation found for custom_input_style_note_message (8826731320846363423) --> + <skip /> + <!-- no translation found for enable (5031294444630523247) --> + <skip /> + <!-- no translation found for not_now (6172462888202790482) --> + <skip /> + <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (1261130555134595254) --> + <skip /> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> + <!-- no translation found for prefs_read_external_dictionary (2588931418575013067) --> + <skip /> + <!-- no translation found for read_external_dictionary_no_files_message (4947420942224623792) --> + <skip /> + <!-- no translation found for read_external_dictionary_multiple_files_title (7637749044265808628) --> + <skip /> + <!-- no translation found for read_external_dictionary_confirm_install_message (6898610163768980870) --> + <skip /> + <!-- no translation found for error (8940763624668513648) --> + <skip /> + <!-- no translation found for button_default (3988017840431881491) --> + <skip /> + <!-- no translation found for setup_welcome_title (6112821709832031715) --> + <skip /> + <!-- no translation found for setup_welcome_additional_description (8150252008545768953) --> + <skip /> + <!-- no translation found for setup_start_action (8936036460897347708) --> + <skip /> + <!-- no translation found for setup_next_action (371821437915144603) --> + <skip /> + <!-- no translation found for setup_steps_title (6400373034871816182) --> + <skip /> + <!-- no translation found for setup_step1_title (3147967630253462315) --> + <skip /> + <!-- no translation found for setup_step1_instruction (2578631936624637241) --> + <skip /> + <!-- no translation found for setup_step1_finished_instruction (10761482004957994) --> + <skip /> + <!-- no translation found for setup_step1_action (4366513534999901728) --> + <skip /> + <!-- no translation found for setup_step2_title (6860725447906690594) --> + <skip /> + <!-- no translation found for setup_step2_instruction (9141481964870023336) --> + <skip /> + <!-- no translation found for setup_step2_action (1660330307159824337) --> + <skip /> + <!-- no translation found for setup_step3_title (3154757183631490281) --> + <skip /> + <!-- no translation found for setup_step3_instruction (8025981829605426000) --> + <skip /> + <!-- no translation found for setup_step3_action (600879797256942259) --> + <skip /> + <!-- no translation found for setup_finish_action (276559243409465389) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon (5008028590593710830) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon_summary (4119998322536880213) --> + <skip /> + <!-- no translation found for app_name (6320102637491234792) --> + <skip /> + <!-- no translation found for dictionary_provider_name (3027315045397363079) --> + <skip /> + <!-- no translation found for dictionary_service_name (6237472350693511448) --> + <skip /> + <!-- no translation found for download_description (6014835283119198591) --> + <skip /> + <!-- no translation found for dictionary_settings_title (8091417676045693313) --> + <skip /> + <!-- no translation found for dictionary_install_over_metered_network_prompt (3587517870006332980) --> + <skip /> + <!-- no translation found for dictionary_settings_summary (5305694987799824349) --> + <skip /> + <!-- no translation found for user_dictionaries (3582332055892252845) --> + <skip /> + <!-- no translation found for default_user_dict_pref_name (1625055720489280530) --> + <skip /> + <!-- no translation found for dictionary_available (4728975345815214218) --> + <skip /> + <!-- no translation found for dictionary_downloading (2982650524622620983) --> + <skip /> + <!-- no translation found for dictionary_installed (8081558343559342962) --> + <skip /> + <!-- no translation found for dictionary_disabled (8950383219564621762) --> + <skip /> + <!-- no translation found for cannot_connect_to_dict_service (9216933695765732398) --> + <skip /> + <!-- no translation found for no_dictionaries_available (8039920716566132611) --> + <skip /> + <!-- no translation found for check_for_updates_now (8087688440916388581) --> + <skip /> + <!-- no translation found for last_update (730467549913588780) --> + <skip /> + <!-- no translation found for message_updating (4457761393932375219) --> + <skip /> + <!-- no translation found for message_loading (8689096636874758814) --> + <skip /> + <!-- no translation found for main_dict_description (3072821352793492143) --> + <skip /> + <!-- no translation found for cancel (6830980399865683324) --> + <skip /> + <!-- no translation found for install_dict (180852772562189365) --> + <skip /> + <!-- no translation found for cancel_download_dict (7843340278507019303) --> + <skip /> + <!-- no translation found for delete_dict (756853268088330054) --> + <skip /> + <!-- no translation found for should_download_over_metered_prompt (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 /> + <!-- no translation found for version_text (2715354215568469385) --> + <skip /> + <!-- no translation found for user_dict_settings_add_menu_title (1254195365689387076) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_title (4096700390211748168) --> + <skip /> + <!-- no translation found for user_dict_settings_add_screen_title (5818914331629278758) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_more_options (5671682004887093112) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_less_options (2716586567241724126) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_confirm (4703129507388332950) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_option_name (6665558053408962865) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_option_name (3094731590655523777) --> + <skip /> + <!-- no translation found for user_dict_settings_add_locale_option_name (4738643440987277705) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_hint (4902434148985906707) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_hint (2265453012555060178) --> + <skip /> + <!-- no translation found for user_dict_settings_edit_dialog_title (3765774633869590352) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_edit_title (6812255903472456302) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_delete_title (8142932447689461181) --> + <skip /> + <!-- no translation found for user_dict_settings_empty_text (558499587532668203) --> + <skip /> + <!-- no translation found for user_dict_settings_all_languages (8276126583216298886) --> + <skip /> + <!-- no translation found for user_dict_settings_more_languages (7131268499685180461) --> + <skip /> + <!-- no translation found for user_dict_settings_delete (110413335187193859) --> + <skip /> + <!-- no translation found for user_dict_fast_scroll_alphabet (5431919401558285473) --> + <skip /> +</resources> diff --git a/java/res/values-kk/strings.xml b/java/res/values-kk/strings.xml new file mode 100644 index 000000000..4c78be579 --- /dev/null +++ b/java/res/values-kk/strings.xml @@ -0,0 +1,250 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2008, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="english_ime_input_options" msgid="3909945612939668554">"Енгізу опциялары"</string> + <string name="english_ime_research_log" msgid="8492602295696577851">"Журнал пәрмендерін зерттеу"</string> + <string name="use_contacts_for_spellchecking_option_title" msgid="5374120998125353898">"Контакт аттарын іздеу"</string> + <string name="use_contacts_for_spellchecking_option_summary" msgid="8754413382543307713">"Емлені тексеру құралы контактілер тізімінің жазбаларын пайдаланады"</string> + <string name="vibrate_on_keypress" msgid="5258079494276955460">"Пернені басқан кездегі діріл"</string> + <string name="sound_on_keypress" msgid="6093592297198243644">"Пернені басу кезіндегі дыбыс"</string> + <string name="popup_on_keypress" msgid="123894815723512944">"Пернені басқан кездегі ашылмалы мәзір"</string> + <string name="general_category" msgid="1859088467017573195">"Жалпы"</string> + <string name="correction_category" msgid="2236750915056607613">"Мәтін түзетпесі"</string> + <string name="gesture_typing_category" msgid="497263612130532630">"Қимылмен теру"</string> + <string name="misc_category" msgid="6894192814868233453">"Басқа опциялар"</string> + <string name="advanced_settings" msgid="362895144495591463">"Қосымша параметрлер"</string> + <string name="advanced_settings_summary" msgid="4487980456152830271">"Сарапшылар опциялары"</string> + <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"Басқа енгізу әдістеріне ауыстырыңыз"</string> + <string name="include_other_imes_in_language_switch_list_summary" msgid="840637129103317635">"Тілді ауыстыру пернесі басқа енгізу әдістерін де қамтиды"</string> + <string name="show_language_switch_key" msgid="5915478828318774384">"Тілді ауыстыру пернесі"</string> + <string name="show_language_switch_key_summary" msgid="7343403647474265713">"Бірнеше енгізу тілдері қосылған кезде көрсету"</string> + <string name="sliding_key_input_preview" msgid="6604262359510068370">"Жылжыту индикаторын көрсету"</string> + <string name="sliding_key_input_preview_summary" msgid="6340524345729093886">"Shift немесе Таңба пернелерінен жылжыту кезіндегі көрнекі сөзкөмекті көрсету"</string> + <string name="key_preview_popup_dismiss_delay" msgid="6213164897443068248">"Перненің ашылмалы мәзірі кідірісті жояды"</string> + <string name="key_preview_popup_dismiss_no_delay" msgid="2096123151571458064">"Кідіріс жоқ"</string> + <string name="key_preview_popup_dismiss_default_delay" msgid="2166964333903906734">"Әдепкі"</string> + <string name="abbreviation_unit_milliseconds" msgid="8700286094028323363">"<xliff:g id="MILLISECONDS">%s</xliff:g>мс"</string> + <string name="settings_system_default" msgid="6268225104743331821">"Жүйе әдепкісі"</string> + <string name="use_contacts_dict" msgid="4435317977804180815">"Контакт аттарын ұсыну"</string> + <string name="use_contacts_dict_summary" msgid="6599983334507879959">"Ұсыныстар мен түзетулер үшін контакт аттарын пайдалану"</string> + <string name="use_double_space_period" msgid="8781529969425082860">"Қос бос орын кезеңі"</string> + <string name="use_double_space_period_summary" msgid="6532892187247952799">"Бос орынға екі рет түрту бос орыннан кейінгі кезеңді енгізеді"</string> + <string name="auto_cap" msgid="1719746674854628252">"Авто бас әріптерге түрлендіру"</string> + <string name="auto_cap_summary" msgid="7934452761022946874">"Әрбір сөйлемнің бірінші әріпін бас әріпке түрлендіру"</string> + <string name="edit_personal_dictionary" msgid="3996910038952940420">"Жеке сөздік"</string> + <string name="configure_dictionaries_title" msgid="4238652338556902049">"Қосымша сөздіктер"</string> + <string name="main_dictionary" msgid="4798763781818361168">"Негізгі сөздік"</string> + <string name="prefs_show_suggestions" msgid="8026799663445531637">"Түзету ұсыныстарын көрсету"</string> + <string name="prefs_show_suggestions_summary" msgid="1583132279498502825">"Теру кезінде ұсынылған сөздерді көрсету"</string> + <string name="prefs_suggestion_visibility_show_name" msgid="3219916594067551303">"Үнемі көрсету"</string> + <string name="prefs_suggestion_visibility_show_only_portrait_name" msgid="3859783767435239118">"Портрет режимінде көрсету"</string> + <string name="prefs_suggestion_visibility_hide_name" msgid="6309143926422234673">"Үнемі жасыру"</string> + <string name="prefs_block_potentially_offensive_title" msgid="5078480071057408934">"Қорлаушы сөздерді құлыптамау"</string> + <string name="prefs_block_potentially_offensive_summary" msgid="2371835479734991364">"Қорлаушы сөздерді ұсынбау"</string> + <string name="auto_correction" msgid="7630720885194996950">"Авто түзету"</string> + <string name="auto_correction_summary" msgid="5625751551134658006">"Бос орын және тыныс белгі автоматты түрде қателерді түзетеді"</string> + <string name="auto_correction_threshold_mode_off" msgid="8470882665417944026">"Өшірулі"</string> + <string name="auto_correction_threshold_mode_modest" msgid="8788366690620799097">"Баяу"</string> + <string name="auto_correction_threshold_mode_aggressive" msgid="7319007299148899623">"Белсенді"</string> + <string name="auto_correction_threshold_mode_very_aggressive" msgid="1853309024129480416">"Өте белсенді"</string> + <string name="bigram_prediction" msgid="1084449187723948550">"Келесі сөз ұсыныстары"</string> + <string name="bigram_prediction_summary" msgid="3896362682751109677">"Ұсыныстар жасауда бастапқы сөзді пайдалану"</string> + <string name="gesture_input" msgid="826951152254563827">"Қимылмен теруді қосу"</string> + <string name="gesture_input_summary" msgid="9180350639305731231">"Әріптерді жанап өту арқылы сөзді енгізу"</string> + <string name="gesture_preview_trail" msgid="3802333369335722221">"Қимыл қадамын көрсету"</string> + <string name="gesture_floating_preview_text" msgid="4443240334739381053">"Динамикалық қалқымалы қарап шығу"</string> + <string name="gesture_floating_preview_text_summary" msgid="4472696213996203533">"Қимылдау кезінде ұсынылған сөзді көру"</string> + <string name="added_word" msgid="8993883354622484372">"<xliff:g id="WORD">%s</xliff:g> : Сақталды"</string> + <string name="label_go_key" msgid="1635148082137219148">"Өту"</string> + <string name="label_next_key" msgid="362972844525672568">"Келесі"</string> + <string name="label_previous_key" msgid="1211868118071386787">"Алдағы"</string> + <string name="label_done_key" msgid="2441578748772529288">"Дайын"</string> + <string name="label_send_key" msgid="2815056534433717444">"Жіберу"</string> + <string name="label_pause_key" msgid="181098308428035340">"Тоқтата тұру"</string> + <string name="label_wait_key" msgid="6402152600878093134">"Күту"</string> + <string name="spoken_use_headphones" msgid="896961781287283493">"Дауыспен айтылатын құпия сөз кілттерін есту үшін құлақаспап қосыңыз."</string> + <string name="spoken_current_text_is" msgid="2485723011272583845">"Ағымдағы мәтін - %s"</string> + <string name="spoken_no_text_entered" msgid="7479685225597344496">"Мәтін енгізілмеген"</string> + <!-- no translation found for spoken_auto_correct (8005997889020109763) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> + <skip /> + <string name="spoken_description_unknown" msgid="3197434010402179157">"Перне коды %d"</string> + <string name="spoken_description_shift" msgid="244197883292549308">"Shift"</string> + <string name="spoken_description_shift_shifted" msgid="1681877323344195035">"Shift қосулы (өшіру үшін түрту)"</string> + <string name="spoken_description_caps_lock" msgid="3276478269526304432">"Caps lock қосулы (өшіру үшін түрту)"</string> + <string name="spoken_description_delete" msgid="8740376944276199801">"Жою"</string> + <string name="spoken_description_to_symbol" msgid="5486340107500448969">"Таңбалар"</string> + <string name="spoken_description_to_alpha" msgid="23129338819771807">"Әріптер"</string> + <string name="spoken_description_to_numeric" msgid="591752092685161732">"Сандар"</string> + <string name="spoken_description_settings" msgid="4627462689603838099">"Баптаулар"</string> + <string name="spoken_description_tab" msgid="2667716002663482248">"Tab"</string> + <string name="spoken_description_space" msgid="2582521050049860859">"Бос орын"</string> + <string name="spoken_description_mic" msgid="615536748882611950">"Дауыстық енгізу"</string> + <string name="spoken_description_smiley" msgid="2256309826200113918">"Жымиған жүз"</string> + <string name="spoken_description_return" msgid="8178083177238315647">"Қалпына келтіру"</string> + <string name="spoken_description_search" msgid="1247236163755920808">"Іздеу"</string> + <string name="spoken_description_dot" msgid="40711082435231673">"Нүкте"</string> + <string name="spoken_description_language_switch" msgid="5507091328222331316">"Тілді ауыстыру"</string> + <string name="spoken_description_action_next" msgid="8636078276664150324">"Келесі"</string> + <string name="spoken_description_action_previous" msgid="800872415009336208">"Алдағы"</string> + <string name="spoken_description_shiftmode_on" msgid="5700440798609574589">"Shift қосылған"</string> + <string name="spoken_description_shiftmode_locked" msgid="593175803181701830">"Caps lock қосылған"</string> + <string name="spoken_description_shiftmode_off" msgid="657219998449174808">"Shift өшірілген"</string> + <string name="spoken_description_mode_symbol" msgid="7183343879909747642">"Таңбалар режимі"</string> + <string name="spoken_description_mode_alpha" msgid="3528307674390156956">"Әріптер режимі"</string> + <string name="spoken_description_mode_phone" msgid="6520207943132026264">"Телефон режимі"</string> + <string name="spoken_description_mode_phone_shift" msgid="5499629753962641227">"Телефон таңбалары режимі"</string> + <string name="announce_keyboard_hidden" msgid="8718927835531429807">"Пернетақта жасырылған"</string> + <string name="announce_keyboard_mode" msgid="4729081055438508321">"Көрсетілетін <xliff:g id="MODE">%s</xliff:g> пернетақтасы"</string> + <string name="keyboard_mode_date" msgid="3137520166817128102">"күн"</string> + <string name="keyboard_mode_date_time" msgid="339593358488851072">"күн мен уақыт"</string> + <string name="keyboard_mode_email" msgid="6216248078128294262">"электрондық пошта"</string> + <string name="keyboard_mode_im" msgid="1137405089766557048">"хабар алмасу"</string> + <string name="keyboard_mode_number" msgid="7991623440699957069">"нөмір"</string> + <string name="keyboard_mode_phone" msgid="6851627527401433229">"телефон"</string> + <string name="keyboard_mode_text" msgid="6479436687899701619">"мәтін"</string> + <string name="keyboard_mode_time" msgid="4381856885582143277">"уақыт"</string> + <string name="keyboard_mode_url" msgid="1519819835514911218">"URL"</string> + <string name="voice_input" msgid="3583258583521397548">"Дауыстық енгізу пернесі"</string> + <string name="voice_input_modes_main_keyboard" msgid="3360660341121083174">"Негізгі пернетақтада"</string> + <string name="voice_input_modes_symbols_keyboard" msgid="7203213240786084067">"Таңбалар пернетақтасында"</string> + <string name="voice_input_modes_off" msgid="3745699748218082014">"Өшірулі"</string> + <string name="voice_input_modes_summary_main_keyboard" msgid="6586544292900314339">"Негізгі пернетақтадағы Mic"</string> + <string name="voice_input_modes_summary_symbols_keyboard" msgid="5233725927281932391">"Таңбалар пернетақтасындағы Mic"</string> + <string name="voice_input_modes_summary_off" msgid="63875609591897607">"Дауыстық енгізу өшірілген"</string> + <string name="configure_input_method" msgid="373356270290742459">"Енгізу әдістерін теңшеу"</string> + <string name="language_selection_title" msgid="1651299598555326750">"Енгізу тілдері"</string> + <string name="send_feedback" msgid="1780431884109392046">"Кері байланыс жіберу"</string> + <string name="select_language" msgid="3693815588777926848">"Енгізу тілдері"</string> + <string name="hint_add_to_dictionary" msgid="573678656946085380">"Сақтау үшін қайта түртіңіз"</string> + <string name="has_dictionary" msgid="6071847973466625007">"Сөздік қолжетімді"</string> + <string name="prefs_enable_log" msgid="6620424505072963557">"Пайдаланушының кері байланысын қосу"</string> + <string name="prefs_description_log" msgid="7525225584555429211">"Қолданыс статистикасын және бұзылыс есептерін автоматты түрде жіберу арқылы осы енгізу әдісінің редакторын арттыруға көмектесу"</string> + <string name="keyboard_layout" msgid="8451164783510487501">"Пернетақта тақырыбы"</string> + <string name="subtype_en_GB" msgid="88170601942311355">"ағылшын (ҰБ)"</string> + <string name="subtype_en_US" msgid="6160452336634534239">"ағылшын (АҚШ)"</string> + <string name="subtype_es_US" msgid="5583145191430180200">"Испан (АҚШ)"</string> + <string name="subtype_with_layout_en_GB" msgid="2179097748724725906">"ағылшын (ҰБ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_en_US" msgid="1362581347576714579">"ағылшын (АҚШ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> + <string name="subtype_with_layout_es_US" msgid="6261791057007890189">"Испан (АҚШ) (<xliff:g id="LAYOUT">%s</xliff:g>)"</string> + <!-- no translation found for subtype_nepali_traditional (9032247506728040447) --> + <skip /> + <string name="subtype_no_language" msgid="7137390094240139495">"Тіл жоқ (әліпби)"</string> + <string name="subtype_no_language_qwerty" msgid="244337630616742604">"Әліпби (QWERTY)"</string> + <string name="subtype_no_language_qwertz" msgid="443066912507547976">"Әліпби (QWERTZ)"</string> + <string name="subtype_no_language_azerty" msgid="8144348527575640087">"Әліпби (AZERTY)"</string> + <string name="subtype_no_language_dvorak" msgid="1564494667584718094">"Әліпби (Dvorak)"</string> + <string name="subtype_no_language_colemak" msgid="5837418400010302623">"Әліпби (Colemak)"</string> + <string name="subtype_no_language_pcqwerty" msgid="5354918232046200018">"Әліпби (ДК)"</string> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <string name="custom_input_styles_title" msgid="8429952441821251512">"Реттелетін енгізу стильдері"</string> + <string name="add_style" msgid="6163126614514489951">"Стиль қосу"</string> + <string name="add" msgid="8299699805688017798">"Қосу"</string> + <string name="remove" msgid="4486081658752944606">"Аластау"</string> + <string name="save" msgid="7646738597196767214">"Сақтау"</string> + <string name="subtype_locale" msgid="8576443440738143764">"Тіл"</string> + <string name="keyboard_layout_set" msgid="4309233698194565609">"Пішім"</string> + <string name="custom_input_style_note_message" msgid="8826731320846363423">"Реттелетін енгізу стилі пайдалануды бастамас бұрын қосылуы қажет. Оны қазір қосу қажет пе?"</string> + <string name="enable" msgid="5031294444630523247">"Қосу"</string> + <string name="not_now" msgid="6172462888202790482">"Қазір емес"</string> + <string name="custom_input_style_already_exists" msgid="8008728952215449707">"Бірдей енгізу стилі бұрыннан бар: <xliff:g id="INPUT_STYLE_NAME">%s</xliff:g>"</string> + <string name="prefs_usability_study_mode" msgid="1261130555134595254">"Қолайлылықты зерттеу режимі"</string> + <string name="prefs_key_longpress_timeout_settings" msgid="6102240298932897873">"Пернені ұзақ басу кідірісі"</string> + <string name="prefs_keypress_vibration_duration_settings" msgid="7918341459947439226">"Пернені басқан кездегі діріл ұзақтығы"</string> + <string name="prefs_keypress_sound_volume_settings" msgid="6027007337036891623">"Пернені басқан кездегі дыбыс деңгейі"</string> + <string name="prefs_read_external_dictionary" msgid="2588931418575013067">"Сыртқы сөздік файлын оқу"</string> + <string name="read_external_dictionary_no_files_message" msgid="4947420942224623792">"Жүктеп алулар қалтасында сөздік файлдары жоқ"</string> + <string name="read_external_dictionary_multiple_files_title" msgid="7637749044265808628">"Орнату үшін сөздік файлын таңдау"</string> + <string name="read_external_dictionary_confirm_install_message" msgid="6898610163768980870">"<xliff:g id="LOCALE_NAME">%s</xliff:g> үшін осы файлды орнату қажет пе?"</string> + <string name="error" msgid="8940763624668513648">"Қате болды"</string> + <string name="button_default" msgid="3988017840431881491">"Әдепкі"</string> + <string name="setup_welcome_title" msgid="6112821709832031715">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасына қош келдіңіз"</string> + <string name="setup_welcome_additional_description" msgid="8150252008545768953">"Қимылмен теру арқылы"</string> + <string name="setup_start_action" msgid="8936036460897347708">"Іске қосылды"</string> + <string name="setup_next_action" msgid="371821437915144603">"Келесі қадам"</string> + <string name="setup_steps_title" msgid="6400373034871816182">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> орнату"</string> + <string name="setup_step1_title" msgid="3147967630253462315">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қосу"</string> + <string name="setup_step1_instruction" msgid="2578631936624637241">"Тіл & енгізу параметрлерінде <xliff:g id="APPLICATION_NAME">%s</xliff:g> тексеріңіз. Бұл оған құрылғыңызды басқаруға рұқсат береді."</string> + <string name="setup_step1_finished_instruction" msgid="10761482004957994">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасы әлдеқашан Тіл & енгізу параметрлерінде қосылған, сол себепті бұл қадам орындалған.Келесі біреуін қосыңыз!"</string> + <string name="setup_step1_action" msgid="4366513534999901728">"Параметрлер ішінде қосу"</string> + <string name="setup_step2_title" msgid="6860725447906690594">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасына ауыстыру"</string> + <string name="setup_step2_instruction" msgid="9141481964870023336">"Одан кейін \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\" қолданбасын белсенді мәтінді енгізу әдісі ретінде таңдаңыз."</string> + <string name="setup_step2_action" msgid="1660330307159824337">"Енгізу әдістерін ауыстыру"</string> + <string name="setup_step3_title" msgid="3154757183631490281">"Құттықтаймыз, барлығы дайын!"</string> + <string name="setup_step3_instruction" msgid="8025981829605426000">"Қазір барлық таңдаулы қолданбаларда <xliff:g id="APPLICATION_NAME">%s</xliff:g> арқылы теруге болады."</string> + <string name="setup_step3_action" msgid="600879797256942259">"Қосымша тілдерді теңшеу"</string> + <string name="setup_finish_action" msgid="276559243409465389">"Аяқталған"</string> + <string name="show_setup_wizard_icon" msgid="5008028590593710830">"Қолданба белгішесін көрсету"</string> + <string name="show_setup_wizard_icon_summary" msgid="4119998322536880213">"Іске қосу құралындағы қолданба белгішесін көрсету"</string> + <string name="app_name" msgid="6320102637491234792">"Сөздік провайдері"</string> + <string name="dictionary_provider_name" msgid="3027315045397363079">"Сөздік провайдері"</string> + <string name="dictionary_service_name" msgid="6237472350693511448">"Сөздік қызметі"</string> + <string name="download_description" msgid="6014835283119198591">"Сөздікті жаңарту ақпараты"</string> + <string name="dictionary_settings_title" msgid="8091417676045693313">"Қосымша сөздіктер"</string> + <string name="dictionary_install_over_metered_network_prompt" msgid="3587517870006332980">"Сөздік қолжетімді"</string> + <string name="dictionary_settings_summary" msgid="5305694987799824349">"Сөздіктер параметрлері"</string> + <string name="user_dictionaries" msgid="3582332055892252845">"Пайдаланушы сөздіктері"</string> + <string name="default_user_dict_pref_name" msgid="1625055720489280530">"Пайдаланушы сөздігі"</string> + <string name="dictionary_available" msgid="4728975345815214218">"Сөздік қолжетімді"</string> + <string name="dictionary_downloading" msgid="2982650524622620983">"Ағымда жүктеп алынуда"</string> + <string name="dictionary_installed" msgid="8081558343559342962">"Орнатылған"</string> + <string name="dictionary_disabled" msgid="8950383219564621762">"Орнатылған, өшірілген"</string> + <string name="cannot_connect_to_dict_service" msgid="9216933695765732398">"Сөздік қызметіне қосылу мәселесі"</string> + <string name="no_dictionaries_available" msgid="8039920716566132611">"Сөздіктер қолжетімсіз"</string> + <string name="check_for_updates_now" msgid="8087688440916388581">"Жаңарту"</string> + <string name="last_update" msgid="730467549913588780">"Соңғы жаңартылған"</string> + <string name="message_updating" msgid="4457761393932375219">"Жаңартуларды тексеру"</string> + <string name="message_loading" msgid="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> + <string name="version_text" msgid="2715354215568469385">"<xliff:g id="VERSION_NUMBER">%1$s</xliff:g> нұсқасы"</string> + <string name="user_dict_settings_add_menu_title" msgid="1254195365689387076">"Қосу"</string> + <string name="user_dict_settings_add_dialog_title" msgid="4096700390211748168">"Сөздікке қосу"</string> + <string name="user_dict_settings_add_screen_title" msgid="5818914331629278758">"Фраза"</string> + <string name="user_dict_settings_add_dialog_more_options" msgid="5671682004887093112">"Басқа талғаулар"</string> + <string name="user_dict_settings_add_dialog_less_options" msgid="2716586567241724126">"Аз опциялар"</string> + <string name="user_dict_settings_add_dialog_confirm" msgid="4703129507388332950">"Жарайды"</string> + <string name="user_dict_settings_add_word_option_name" msgid="6665558053408962865">"Сөз:"</string> + <string name="user_dict_settings_add_shortcut_option_name" msgid="3094731590655523777">"Пернелер тіркесімі:"</string> + <string name="user_dict_settings_add_locale_option_name" msgid="4738643440987277705">"Тіл:"</string> + <string name="user_dict_settings_add_word_hint" msgid="4902434148985906707">"Сөзді теру"</string> + <string name="user_dict_settings_add_shortcut_hint" msgid="2265453012555060178">"Қосымша пернелер тіркесімі"</string> + <string name="user_dict_settings_edit_dialog_title" msgid="3765774633869590352">"Сөзді өңдеу"</string> + <string name="user_dict_settings_context_menu_edit_title" msgid="6812255903472456302">"Өңдеу"</string> + <string name="user_dict_settings_context_menu_delete_title" msgid="8142932447689461181">"Жою"</string> + <string name="user_dict_settings_empty_text" msgid="558499587532668203">"Пайдаланушы сөздігінде сөздер жоқ. Қосу (+) түймесін басу арқылы сөзді қосыңыз."</string> + <string name="user_dict_settings_all_languages" msgid="8276126583216298886">"Барлық тілдер үшін"</string> + <string name="user_dict_settings_more_languages" msgid="7131268499685180461">"Қосымша тілдер…"</string> + <string name="user_dict_settings_delete" msgid="110413335187193859">"Жою"</string> + <string name="user_dict_fast_scroll_alphabet" msgid="5431919401558285473">" АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ"</string> +</resources> diff --git a/java/res/values-mk/strings.xml b/java/res/values-mk/strings.xml new file mode 100644 index 000000000..6ee84fad1 --- /dev/null +++ b/java/res/values-mk/strings.xml @@ -0,0 +1,464 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2008, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for english_ime_input_options (3909945612939668554) --> + <skip /> + <!-- no translation found for english_ime_research_log (8492602295696577851) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_title (5374120998125353898) --> + <skip /> + <!-- no translation found for use_contacts_for_spellchecking_option_summary (8754413382543307713) --> + <skip /> + <!-- no translation found for vibrate_on_keypress (5258079494276955460) --> + <skip /> + <!-- no translation found for sound_on_keypress (6093592297198243644) --> + <skip /> + <!-- no translation found for popup_on_keypress (123894815723512944) --> + <skip /> + <!-- no translation found for general_category (1859088467017573195) --> + <skip /> + <!-- no translation found for correction_category (2236750915056607613) --> + <skip /> + <!-- no translation found for gesture_typing_category (497263612130532630) --> + <skip /> + <!-- no translation found for misc_category (6894192814868233453) --> + <skip /> + <!-- no translation found for advanced_settings (362895144495591463) --> + <skip /> + <!-- no translation found for advanced_settings_summary (4487980456152830271) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list (4533689960308565519) --> + <skip /> + <!-- no translation found for include_other_imes_in_language_switch_list_summary (840637129103317635) --> + <skip /> + <!-- no translation found for show_language_switch_key (5915478828318774384) --> + <skip /> + <!-- no translation found for show_language_switch_key_summary (7343403647474265713) --> + <skip /> + <!-- no translation found for sliding_key_input_preview (6604262359510068370) --> + <skip /> + <!-- no translation found for sliding_key_input_preview_summary (6340524345729093886) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_delay (6213164897443068248) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_no_delay (2096123151571458064) --> + <skip /> + <!-- no translation found for key_preview_popup_dismiss_default_delay (2166964333903906734) --> + <skip /> + <!-- no translation found for abbreviation_unit_milliseconds (8700286094028323363) --> + <skip /> + <!-- no translation found for settings_system_default (6268225104743331821) --> + <skip /> + <!-- no translation found for use_contacts_dict (4435317977804180815) --> + <skip /> + <!-- no translation found for use_contacts_dict_summary (6599983334507879959) --> + <skip /> + <!-- no translation found for use_double_space_period (8781529969425082860) --> + <skip /> + <!-- no translation found for use_double_space_period_summary (6532892187247952799) --> + <skip /> + <!-- no translation found for auto_cap (1719746674854628252) --> + <skip /> + <!-- no translation found for auto_cap_summary (7934452761022946874) --> + <skip /> + <!-- no translation found for edit_personal_dictionary (3996910038952940420) --> + <skip /> + <!-- no translation found for configure_dictionaries_title (4238652338556902049) --> + <skip /> + <!-- no translation found for main_dictionary (4798763781818361168) --> + <skip /> + <!-- no translation found for prefs_show_suggestions (8026799663445531637) --> + <skip /> + <!-- no translation found for prefs_show_suggestions_summary (1583132279498502825) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_name (3219916594067551303) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_show_only_portrait_name (3859783767435239118) --> + <skip /> + <!-- no translation found for prefs_suggestion_visibility_hide_name (6309143926422234673) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_title (5078480071057408934) --> + <skip /> + <!-- no translation found for prefs_block_potentially_offensive_summary (2371835479734991364) --> + <skip /> + <!-- no translation found for auto_correction (7630720885194996950) --> + <skip /> + <!-- no translation found for auto_correction_summary (5625751551134658006) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_off (8470882665417944026) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_modest (8788366690620799097) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_aggressive (7319007299148899623) --> + <skip /> + <!-- no translation found for auto_correction_threshold_mode_very_aggressive (1853309024129480416) --> + <skip /> + <!-- no translation found for bigram_prediction (1084449187723948550) --> + <skip /> + <!-- no translation found for bigram_prediction_summary (3896362682751109677) --> + <skip /> + <!-- no translation found for gesture_input (826951152254563827) --> + <skip /> + <!-- no translation found for gesture_input_summary (9180350639305731231) --> + <skip /> + <!-- no translation found for gesture_preview_trail (3802333369335722221) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text (4443240334739381053) --> + <skip /> + <!-- no translation found for gesture_floating_preview_text_summary (4472696213996203533) --> + <skip /> + <!-- no translation found for added_word (8993883354622484372) --> + <skip /> + <string name="label_go_key" msgid="1635148082137219148">"Оди"</string> + <string name="label_next_key" msgid="362972844525672568">"Следно"</string> + <string name="label_previous_key" msgid="1211868118071386787">"Претходно"</string> + <string name="label_done_key" msgid="2441578748772529288">"Готово"</string> + <string name="label_send_key" msgid="2815056534433717444">"Испрати"</string> + <!-- no translation found for label_pause_key (181098308428035340) --> + <skip /> + <!-- no translation found for label_wait_key (6402152600878093134) --> + <skip /> + <!-- no translation found for spoken_use_headphones (896961781287283493) --> + <skip /> + <!-- no translation found for spoken_current_text_is (2485723011272583845) --> + <skip /> + <!-- no translation found for spoken_no_text_entered (7479685225597344496) --> + <skip /> + <!-- no translation found for spoken_auto_correct (8005997889020109763) --> + <skip /> + <!-- no translation found for spoken_auto_correct_obscured (6276420476908833791) --> + <skip /> + <!-- no translation found for spoken_description_unknown (3197434010402179157) --> + <skip /> + <!-- no translation found for spoken_description_shift (244197883292549308) --> + <skip /> + <!-- no translation found for spoken_description_shift_shifted (1681877323344195035) --> + <skip /> + <!-- no translation found for spoken_description_caps_lock (3276478269526304432) --> + <skip /> + <!-- no translation found for spoken_description_delete (8740376944276199801) --> + <skip /> + <!-- no translation found for spoken_description_to_symbol (5486340107500448969) --> + <skip /> + <!-- no translation found for spoken_description_to_alpha (23129338819771807) --> + <skip /> + <!-- no translation found for spoken_description_to_numeric (591752092685161732) --> + <skip /> + <!-- no translation found for spoken_description_settings (4627462689603838099) --> + <skip /> + <!-- no translation found for spoken_description_tab (2667716002663482248) --> + <skip /> + <!-- no translation found for spoken_description_space (2582521050049860859) --> + <skip /> + <!-- no translation found for spoken_description_mic (615536748882611950) --> + <skip /> + <!-- no translation found for spoken_description_smiley (2256309826200113918) --> + <skip /> + <!-- no translation found for spoken_description_return (8178083177238315647) --> + <skip /> + <!-- no translation found for spoken_description_search (1247236163755920808) --> + <skip /> + <!-- no translation found for spoken_description_dot (40711082435231673) --> + <skip /> + <!-- no translation found for spoken_description_language_switch (5507091328222331316) --> + <skip /> + <!-- no translation found for spoken_description_action_next (8636078276664150324) --> + <skip /> + <!-- no translation found for spoken_description_action_previous (800872415009336208) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_on (5700440798609574589) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_locked (593175803181701830) --> + <skip /> + <!-- no translation found for spoken_description_shiftmode_off (657219998449174808) --> + <skip /> + <!-- no translation found for spoken_description_mode_symbol (7183343879909747642) --> + <skip /> + <!-- no translation found for spoken_description_mode_alpha (3528307674390156956) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone (6520207943132026264) --> + <skip /> + <!-- no translation found for spoken_description_mode_phone_shift (5499629753962641227) --> + <skip /> + <!-- no translation found for announce_keyboard_hidden (8718927835531429807) --> + <skip /> + <!-- no translation found for announce_keyboard_mode (4729081055438508321) --> + <skip /> + <!-- no translation found for keyboard_mode_date (3137520166817128102) --> + <skip /> + <!-- no translation found for keyboard_mode_date_time (339593358488851072) --> + <skip /> + <!-- no translation found for keyboard_mode_email (6216248078128294262) --> + <skip /> + <!-- no translation found for keyboard_mode_im (1137405089766557048) --> + <skip /> + <!-- no translation found for keyboard_mode_number (7991623440699957069) --> + <skip /> + <!-- no translation found for keyboard_mode_phone (6851627527401433229) --> + <skip /> + <!-- no translation found for keyboard_mode_text (6479436687899701619) --> + <skip /> + <!-- no translation found for keyboard_mode_time (4381856885582143277) --> + <skip /> + <!-- no translation found for keyboard_mode_url (1519819835514911218) --> + <skip /> + <!-- no translation found for voice_input (3583258583521397548) --> + <skip /> + <!-- no translation found for voice_input_modes_main_keyboard (3360660341121083174) --> + <skip /> + <!-- no translation found for voice_input_modes_symbols_keyboard (7203213240786084067) --> + <skip /> + <!-- no translation found for voice_input_modes_off (3745699748218082014) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_main_keyboard (6586544292900314339) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_symbols_keyboard (5233725927281932391) --> + <skip /> + <!-- no translation found for voice_input_modes_summary_off (63875609591897607) --> + <skip /> + <!-- no translation found for configure_input_method (373356270290742459) --> + <skip /> + <!-- no translation found for language_selection_title (1651299598555326750) --> + <skip /> + <!-- no translation found for send_feedback (1780431884109392046) --> + <skip /> + <!-- no translation found for select_language (3693815588777926848) --> + <skip /> + <!-- no translation found for hint_add_to_dictionary (573678656946085380) --> + <skip /> + <!-- no translation found for has_dictionary (6071847973466625007) --> + <skip /> + <!-- no translation found for prefs_enable_log (6620424505072963557) --> + <skip /> + <!-- 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) --> + <skip /> + <!-- no translation found for subtype_en_US (6160452336634534239) --> + <skip /> + <!-- no translation found for subtype_es_US (5583145191430180200) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_GB (2179097748724725906) --> + <skip /> + <!-- no translation found for subtype_with_layout_en_US (1362581347576714579) --> + <skip /> + <!-- no translation found for subtype_with_layout_es_US (6261791057007890189) --> + <skip /> + <!-- no translation found for subtype_nepali_traditional (9032247506728040447) --> + <skip /> + <!-- no translation found for subtype_no_language (7137390094240139495) --> + <skip /> + <!-- no translation found for subtype_no_language_qwerty (244337630616742604) --> + <skip /> + <!-- no translation found for subtype_no_language_qwertz (443066912507547976) --> + <skip /> + <!-- no translation found for subtype_no_language_azerty (8144348527575640087) --> + <skip /> + <!-- no translation found for subtype_no_language_dvorak (1564494667584718094) --> + <skip /> + <!-- no translation found for subtype_no_language_colemak (5837418400010302623) --> + <skip /> + <!-- no translation found for subtype_no_language_pcqwerty (5354918232046200018) --> + <skip /> + <!-- no translation found for subtype_emoji (7483586578074549196) --> + <skip /> + <!-- no translation found for custom_input_styles_title (8429952441821251512) --> + <skip /> + <!-- no translation found for add_style (6163126614514489951) --> + <skip /> + <!-- no translation found for add (8299699805688017798) --> + <skip /> + <!-- no translation found for remove (4486081658752944606) --> + <skip /> + <!-- no translation found for save (7646738597196767214) --> + <skip /> + <!-- no translation found for subtype_locale (8576443440738143764) --> + <skip /> + <!-- no translation found for keyboard_layout_set (4309233698194565609) --> + <skip /> + <!-- no translation found for custom_input_style_note_message (8826731320846363423) --> + <skip /> + <!-- no translation found for enable (5031294444630523247) --> + <skip /> + <!-- no translation found for not_now (6172462888202790482) --> + <skip /> + <!-- no translation found for custom_input_style_already_exists (8008728952215449707) --> + <skip /> + <!-- no translation found for prefs_usability_study_mode (1261130555134595254) --> + <skip /> + <!-- no translation found for prefs_key_longpress_timeout_settings (6102240298932897873) --> + <skip /> + <!-- no translation found for prefs_keypress_vibration_duration_settings (7918341459947439226) --> + <skip /> + <!-- no translation found for prefs_keypress_sound_volume_settings (6027007337036891623) --> + <skip /> + <!-- no translation found for prefs_read_external_dictionary (2588931418575013067) --> + <skip /> + <!-- no translation found for read_external_dictionary_no_files_message (4947420942224623792) --> + <skip /> + <!-- no translation found for read_external_dictionary_multiple_files_title (7637749044265808628) --> + <skip /> + <!-- no translation found for read_external_dictionary_confirm_install_message (6898610163768980870) --> + <skip /> + <!-- no translation found for error (8940763624668513648) --> + <skip /> + <!-- no translation found for button_default (3988017840431881491) --> + <skip /> + <!-- no translation found for setup_welcome_title (6112821709832031715) --> + <skip /> + <!-- no translation found for setup_welcome_additional_description (8150252008545768953) --> + <skip /> + <!-- no translation found for setup_start_action (8936036460897347708) --> + <skip /> + <!-- no translation found for setup_next_action (371821437915144603) --> + <skip /> + <!-- no translation found for setup_steps_title (6400373034871816182) --> + <skip /> + <!-- no translation found for setup_step1_title (3147967630253462315) --> + <skip /> + <!-- no translation found for setup_step1_instruction (2578631936624637241) --> + <skip /> + <!-- no translation found for setup_step1_finished_instruction (10761482004957994) --> + <skip /> + <!-- no translation found for setup_step1_action (4366513534999901728) --> + <skip /> + <!-- no translation found for setup_step2_title (6860725447906690594) --> + <skip /> + <!-- no translation found for setup_step2_instruction (9141481964870023336) --> + <skip /> + <!-- no translation found for setup_step2_action (1660330307159824337) --> + <skip /> + <!-- no translation found for setup_step3_title (3154757183631490281) --> + <skip /> + <!-- no translation found for setup_step3_instruction (8025981829605426000) --> + <skip /> + <!-- no translation found for setup_step3_action (600879797256942259) --> + <skip /> + <!-- no translation found for setup_finish_action (276559243409465389) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon (5008028590593710830) --> + <skip /> + <!-- no translation found for show_setup_wizard_icon_summary (4119998322536880213) --> + <skip /> + <!-- no translation found for app_name (6320102637491234792) --> + <skip /> + <!-- no translation found for dictionary_provider_name (3027315045397363079) --> + <skip /> + <!-- no translation found for dictionary_service_name (6237472350693511448) --> + <skip /> + <!-- no translation found for download_description (6014835283119198591) --> + <skip /> + <!-- no translation found for dictionary_settings_title (8091417676045693313) --> + <skip /> + <!-- no translation found for dictionary_install_over_metered_network_prompt (3587517870006332980) --> + <skip /> + <!-- no translation found for dictionary_settings_summary (5305694987799824349) --> + <skip /> + <!-- no translation found for user_dictionaries (3582332055892252845) --> + <skip /> + <!-- no translation found for default_user_dict_pref_name (1625055720489280530) --> + <skip /> + <!-- no translation found for dictionary_available (4728975345815214218) --> + <skip /> + <!-- no translation found for dictionary_downloading (2982650524622620983) --> + <skip /> + <!-- no translation found for dictionary_installed (8081558343559342962) --> + <skip /> + <!-- no translation found for dictionary_disabled (8950383219564621762) --> + <skip /> + <!-- no translation found for cannot_connect_to_dict_service (9216933695765732398) --> + <skip /> + <!-- no translation found for no_dictionaries_available (8039920716566132611) --> + <skip /> + <!-- no translation found for check_for_updates_now (8087688440916388581) --> + <skip /> + <!-- no translation found for last_update (730467549913588780) --> + <skip /> + <!-- no translation found for message_updating (4457761393932375219) --> + <skip /> + <!-- no translation found for message_loading (8689096636874758814) --> + <skip /> + <!-- no translation found for main_dict_description (3072821352793492143) --> + <skip /> + <!-- no translation found for cancel (6830980399865683324) --> + <skip /> + <!-- no translation found for install_dict (180852772562189365) --> + <skip /> + <!-- no translation found for cancel_download_dict (7843340278507019303) --> + <skip /> + <!-- no translation found for delete_dict (756853268088330054) --> + <skip /> + <!-- no translation found for should_download_over_metered_prompt (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 /> + <!-- no translation found for version_text (2715354215568469385) --> + <skip /> + <!-- no translation found for user_dict_settings_add_menu_title (1254195365689387076) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_title (4096700390211748168) --> + <skip /> + <!-- no translation found for user_dict_settings_add_screen_title (5818914331629278758) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_more_options (5671682004887093112) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_less_options (2716586567241724126) --> + <skip /> + <!-- no translation found for user_dict_settings_add_dialog_confirm (4703129507388332950) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_option_name (6665558053408962865) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_option_name (3094731590655523777) --> + <skip /> + <!-- no translation found for user_dict_settings_add_locale_option_name (4738643440987277705) --> + <skip /> + <!-- no translation found for user_dict_settings_add_word_hint (4902434148985906707) --> + <skip /> + <!-- no translation found for user_dict_settings_add_shortcut_hint (2265453012555060178) --> + <skip /> + <!-- no translation found for user_dict_settings_edit_dialog_title (3765774633869590352) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_edit_title (6812255903472456302) --> + <skip /> + <!-- no translation found for user_dict_settings_context_menu_delete_title (8142932447689461181) --> + <skip /> + <!-- no translation found for user_dict_settings_empty_text (558499587532668203) --> + <skip /> + <!-- no translation found for user_dict_settings_all_languages (8276126583216298886) --> + <skip /> + <!-- no translation found for user_dict_settings_more_languages (7131268499685180461) --> + <skip /> + <!-- no translation found for user_dict_settings_delete (110413335187193859) --> + <skip /> + <!-- no translation found for user_dict_fast_scroll_alphabet (5431919401558285473) --> + <skip /> +</resources> diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 2e22af9f9..9936b3ea4 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -3276,6 +3276,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final Printer p = new PrintWriterPrinter(fout); p.println("LatinIME state :"); + p.println(" VersionCode = " + ApplicationUtils.getVersionCode(this)); + p.println(" VersionName = " + ApplicationUtils.getVersionName(this)); final Keyboard keyboard = mKeyboardSwitcher.getKeyboard(); final int keyboardMode = keyboard != null ? keyboard.mId.mMode : -1; p.println(" Keyboard mode = " + keyboardMode); diff --git a/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java b/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java index 08a2a8c5a..e521ec807 100644 --- a/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java @@ -62,4 +62,22 @@ public final class ApplicationUtils { } return ""; } + + /** + * A utility method to get the application's PackageInfo.versionCode + * @return the application's PackageInfo.versionCode + */ + public static int getVersionCode(final Context context) { + try { + if (context == null) { + return 0; + } + final String packageName = context.getPackageName(); + final PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0); + return info.versionCode; + } catch (final NameNotFoundException e) { + Log.e(TAG, "Could not find version info.", e); + } + return 0; + } } diff --git a/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java b/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java index 635afe7cc..7b81e8be1 100644 --- a/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java +++ b/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java @@ -70,6 +70,7 @@ public final class UserHistoryDictIOUtils { /** * Writes dictionary to file. */ + @UsedForTesting public static void writeDictionary(final DictEncoder dictEncoder, final BigramDictionaryInterface dict, final UserHistoryDictionaryBigramList bigrams, final FormatOptions formatOptions) { diff --git a/native/jni/Android.mk b/native/jni/Android.mk index 55a5c06d7..d73862eb6 100644 --- a/native/jni/Android.mk +++ b/native/jni/Android.mk @@ -87,7 +87,9 @@ LATIN_IME_CORE_SRC_FILES := \ dynamic_patricia_trie_writing_utils.cpp) \ $(addprefix suggest/policyimpl/dictionary/structure/v4/, \ ver4_dict_constants.cpp \ - ver4_patricia_trie_policy.cpp) \ + ver4_patricia_trie_node_reader.cpp \ + ver4_patricia_trie_policy.cpp \ + ver4_patricia_trie_reading_utils.cpp ) \ $(addprefix suggest/policyimpl/dictionary/utils/, \ buffer_with_extendable_buffer.cpp \ byte_array_utils.cpp \ diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h index 7bdd829cd..edc7b954c 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h @@ -32,7 +32,7 @@ class PtNodeParams { // Invalid PtNode. PtNodeParams() : mHeadPos(NOT_A_DICT_POS), mFlags(0), mParentPos(NOT_A_DICT_POS), mCodePointCount(0), mCodePoints(), mTerminalIdFieldPos(NOT_A_DICT_POS), - mTerminalId(Ver4DictConstants::NOT_A_TERMINAL), mProbabilityFieldPos(NOT_A_DICT_POS), + mTerminalId(Ver4DictConstants::NOT_A_TERMINAL_ID), mProbabilityFieldPos(NOT_A_DICT_POS), mProbability(NOT_A_PROBABILITY), mChildrenPosFieldPos(NOT_A_DICT_POS), mChildrenPos(NOT_A_DICT_POS), mBigramLinkedNodePos(NOT_A_DICT_POS), mShortcutPos(NOT_A_DICT_POS), mBigramPos(NOT_A_DICT_POS), @@ -53,6 +53,7 @@ class PtNodeParams { memcpy(mCodePoints, ptNodeParams.getCodePoints(), sizeof(int) * mCodePointCount); } + // PtNode without terminal id. PtNodeParams(const int headPos, const PatriciaTrieReadingUtils::NodeFlags flags, const int parentPos, const int codePointCount, const int *const codePoints, const int probabilityFieldPos, const int probability, const int childrenPosFieldPos, @@ -60,7 +61,8 @@ class PtNodeParams { const int bigramPos, const int siblingPos) : mHeadPos(headPos), mFlags(flags), mParentPos(parentPos), mCodePointCount(codePointCount), mCodePoints(), - mTerminalIdFieldPos(NOT_A_DICT_POS), mTerminalId(Ver4DictConstants::NOT_A_TERMINAL), + mTerminalIdFieldPos(NOT_A_DICT_POS), + mTerminalId(Ver4DictConstants::NOT_A_TERMINAL_ID), mProbabilityFieldPos(probabilityFieldPos), mProbability(probability), mChildrenPosFieldPos(childrenPosFieldPos), mChildrenPos(childrenPos), mBigramLinkedNodePos(bigramLinkedNodePos), mShortcutPos(shortcutPos), @@ -68,6 +70,22 @@ class PtNodeParams { memcpy(mCodePoints, codePoints, sizeof(int) * mCodePointCount); } + // PtNode with a terminal id. + PtNodeParams(const int headPos, const PatriciaTrieReadingUtils::NodeFlags flags, + const int parentPos, const int codePointCount, const int *const codePoints, + const int terminalIdFieldPos, const int terminalId, const int probability, + const int childrenPosFieldPos, const int childrenPos, const int bigramLinkedNodePos, + const int siblingPos) + : mHeadPos(headPos), mFlags(flags), mParentPos(parentPos), + mCodePointCount(codePointCount), mCodePoints(), + mTerminalIdFieldPos(terminalIdFieldPos), mTerminalId(terminalId), + mProbabilityFieldPos(NOT_A_DICT_POS), mProbability(probability), + mChildrenPosFieldPos(childrenPosFieldPos), mChildrenPos(childrenPos), + mBigramLinkedNodePos(bigramLinkedNodePos), mShortcutPos(terminalId), + mBigramPos(terminalId), mSiblingPos(siblingPos) { + memcpy(mCodePoints, codePoints, sizeof(int) * mCodePointCount); + } + AK_FORCE_INLINE bool isValid() const { return mCodePointCount > 0; } diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_reader.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_reader.h index b5abffeda..ef0067b48 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_reader.h +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_reader.h @@ -55,7 +55,7 @@ class DynamicPatriciaTrieNodeReader : public PtNodeReader { const DictionaryBigramsStructurePolicy *const mBigramsPolicy; const DictionaryShortcutsStructurePolicy *const mShortcutsPolicy; - const PtNodeParams fetchPtNodeInfoFromBufferAndProcessMovedPtNode(const int ptNodePos, + const PtNodeParams fetchPtNodeInfoFromBufferAndProcessMovedPtNode(const int ptNodePos, const int siblingNodePos, const int bigramLinkedNodePos) const; }; } // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.h new file mode 100644 index 000000000..daaf08f61 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.h @@ -0,0 +1,50 @@ +/* + * 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_PROBABILITY_DICT_CONTENT_H +#define LATINIME_PROBABILITY_DICT_CONTENT_H + +#include "defines.h" +#include "suggest/policyimpl/dictionary/structure/v4/content/single_dict_content.h" +#include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h" +#include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.h" +#include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" + +namespace latinime { + +class ProbabilityDictContent : public SingleDictContent { + public: + ProbabilityDictContent(const char *const dictDirPath, const bool isUpdatable) + : SingleDictContent(dictDirPath, Ver4DictConstants::FREQ_FILE_EXTENSION, + isUpdatable) {} + + int getProbability(const int terminalId) const { + if (terminalId < 0 || terminalId >= getSize()) { + return NOT_A_PROBABILITY; + } + return Ver4PatriciaTrieReadingUtils::getProbability(getBuffer(), terminalId); + } + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(ProbabilityDictContent); + + int getSize() const { + return getBuffer()->getTailPosition() / (Ver4DictConstants::PROBABILITY_SIZE + + Ver4DictConstants::FLAGS_IN_PROBABILITY_FILE_SIZE); + } +}; +} // namespace latinime +#endif /* LATINIME_PROBABILITY_DICT_CONTENT_H */ diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/single_dict_content.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/single_dict_content.h index e415881a9..4cb96da6a 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/single_dict_content.h +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/single_dict_content.h @@ -39,6 +39,15 @@ class SingleDictContent : public DictContent { return mMmappedBuffer.get() != 0; } + protected: + BufferWithExtendableBuffer *getWritableBuffer() { + return &mExpandableContentBuffer; + } + + const BufferWithExtendableBuffer *getBuffer() const { + return &mExpandableContentBuffer; + } + private: DISALLOW_IMPLICIT_CONSTRUCTORS(SingleDictContent); diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h index 1164c408a..333a7c209 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h @@ -18,6 +18,7 @@ #define LATINIME_VER4_DICT_BUFFER_H #include "defines.h" +#include "suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.h" #include "suggest/policyimpl/dictionary/structure/v4/content/single_dict_content.h" #include "suggest/policyimpl/dictionary/structure/v4/content/sparse_table_dict_content.h" #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h" @@ -42,10 +43,18 @@ class Ver4DictBuffers { && mShortcutDictContent.isValid(); } - AK_FORCE_INLINE const uint8_t *getRawDictBuffer() const { + AK_FORCE_INLINE uint8_t *getRawDictBuffer() const { return mDictBuffer.get()->getBuffer(); } + AK_FORCE_INLINE int getRawDictBufferSize() const { + return mDictBuffer.get()->getBufferSize(); + } + + AK_FORCE_INLINE const ProbabilityDictContent *getProbabilityDictContent() const { + return &mProbabilityDictContent; + } + private: DISALLOW_IMPLICIT_CONSTRUCTORS(Ver4DictBuffers); @@ -54,8 +63,7 @@ class Ver4DictBuffers { : mDictBuffer(dictBuffer), mTerminalAddressTable(dictDirPath, Ver4DictConstants::TERMINAL_ADDRESS_TABLE_FILE_EXTENSION, isUpdatable), - mProbabilityDictContent(dictDirPath, Ver4DictConstants::FREQ_FILE_EXTENSION, - isUpdatable), + mProbabilityDictContent(dictDirPath, isUpdatable), mBigramDictContent(dictDirPath, Ver4DictConstants::BIGRAM_LOOKUP_TABLE_FILE_EXTENSION, Ver4DictConstants::BIGRAM_CONTENT_TABLE_FILE_EXTENSION, @@ -67,7 +75,7 @@ class Ver4DictBuffers { const MmappedBuffer::MmappedBufferPtr mDictBuffer; SingleDictContent mTerminalAddressTable; - SingleDictContent mProbabilityDictContent; + ProbabilityDictContent mProbabilityDictContent; SparseTableDictContent mBigramDictContent; SparseTableDictContent mShortcutDictContent; }; diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.cpp index 0bfd07b04..3e21399fd 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.cpp +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.cpp @@ -30,6 +30,8 @@ const char *const Ver4DictConstants::SHORTCUT_LOOKUP_TABLE_FILE_EXTENSION = ".sh const char *const Ver4DictConstants::SHORTCUT_CONTENT_TABLE_FILE_EXTENSION = ".shortcut_index_shortcut"; -const int Ver4DictConstants::NOT_A_TERMINAL = -1; +const int Ver4DictConstants::NOT_A_TERMINAL_ID = -1; +const int Ver4DictConstants::PROBABILITY_SIZE = 1; +const int Ver4DictConstants::FLAGS_IN_PROBABILITY_FILE_SIZE = 1; } // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h index 6498ce428..47a6990f8 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h @@ -34,7 +34,9 @@ class Ver4DictConstants { static const char *const SHORTCUT_LOOKUP_TABLE_FILE_EXTENSION; static const char *const SHORTCUT_CONTENT_TABLE_FILE_EXTENSION; - static const int NOT_A_TERMINAL; + static const int NOT_A_TERMINAL_ID; + static const int PROBABILITY_SIZE; + static const int FLAGS_IN_PROBABILITY_FILE_SIZE; private: DISALLOW_IMPLICIT_CONSTRUCTORS(Ver4DictConstants); diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp new file mode 100644 index 000000000..b18bdc943 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp @@ -0,0 +1,95 @@ +/* + * 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/dictionary/structure/v4/ver4_patricia_trie_node_reader.h" + +#include "suggest/policyimpl/dictionary/structure/v2/patricia_trie_reading_utils.h" +#include "suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_reading_utils.h" +#include "suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.h" +#include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" + +namespace latinime { + +const PtNodeParams Ver4PatriciaTrieNodeReader::fetchPtNodeInfoFromBufferAndProcessMovedPtNode( + const int ptNodePos, const int siblingNodePos, const int bigramLinkedNodePos) const { + if (ptNodePos < 0 || ptNodePos >= mBuffer->getTailPosition()) { + // Reading invalid position because of bug or broken dictionary. + AKLOGE("Fetching PtNode info from invalid dictionary position: %d, dictionary size: %d", + ptNodePos, mBuffer->getTailPosition()); + ASSERT(false); + return PtNodeParams(); + } + const bool usesAdditionalBuffer = mBuffer->isInAdditionalBuffer(ptNodePos); + const uint8_t *const dictBuf = mBuffer->getBuffer(usesAdditionalBuffer); + int pos = ptNodePos; + const int headPos = ptNodePos; + if (usesAdditionalBuffer) { + pos -= mBuffer->getOriginalBufferSize(); + } + const PatriciaTrieReadingUtils::NodeFlags flags = + PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictBuf, &pos); + const int parentPosOffset = + DynamicPatriciaTrieReadingUtils::getParentPtNodePosOffsetAndAdvancePosition( + dictBuf, &pos); + const int parentPos = + DynamicPatriciaTrieReadingUtils::getParentPtNodePos(parentPosOffset, headPos); + int codePoints[MAX_WORD_LENGTH]; + const int codePonitCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition( + dictBuf, flags, MAX_WORD_LENGTH, codePoints, &pos); + int terminalIdFieldPos = NOT_A_DICT_POS; + int terminalId = Ver4DictConstants::NOT_A_TERMINAL_ID; + int probability = NOT_A_PROBABILITY; + if (PatriciaTrieReadingUtils::isTerminal(flags)) { + terminalIdFieldPos = pos; + if (usesAdditionalBuffer) { + terminalIdFieldPos += mBuffer->getOriginalBufferSize(); + } + terminalId = Ver4PatriciaTrieReadingUtils::getTerminalIdAndAdvancePosition(dictBuf, &pos); + probability = mProbabilityDictContent->getProbability(terminalId); + } + int childrenPosFieldPos = pos; + if (usesAdditionalBuffer) { + childrenPosFieldPos += mBuffer->getOriginalBufferSize(); + } + int childrenPos = DynamicPatriciaTrieReadingUtils::readChildrenPositionAndAdvancePosition( + dictBuf, &pos); + if (usesAdditionalBuffer && childrenPos != NOT_A_DICT_POS) { + childrenPos += mBuffer->getOriginalBufferSize(); + } + int newBigramLinkedNodePos = bigramLinkedNodePos; + if (siblingNodePos == NOT_A_DICT_POS) { + if (DynamicPatriciaTrieReadingUtils::isMoved(flags)) { + newBigramLinkedNodePos = childrenPos; + } + } + if (usesAdditionalBuffer) { + pos += mBuffer->getOriginalBufferSize(); + } + // Sibling position is the tail position of original PtNode. + int newSiblingNodePos = (siblingNodePos == NOT_A_DICT_POS) ? pos : siblingNodePos; + // Read destination node if the read node is a moved node. + if (DynamicPatriciaTrieReadingUtils::isMoved(flags)) { + // The destination position is stored at the same place as the parent position. + return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(parentPos, newSiblingNodePos, + newBigramLinkedNodePos); + } else { + return PtNodeParams(headPos, flags, parentPos, codePonitCount, codePoints, + terminalIdFieldPos, terminalId, probability, childrenPosFieldPos, childrenPos, + newBigramLinkedNodePos, newSiblingNodePos); + } +} + +} diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h new file mode 100644 index 000000000..bdae0de7e --- /dev/null +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LATINIME_VER4_PATRICIA_TRIE_NODE_READER_H +#define LATINIME_VER4_PATRICIA_TRIE_NODE_READER_H + +#include <stdint.h> + +#include "defines.h" +#include "suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h" +#include "suggest/policyimpl/dictionary/structure/pt_common/pt_node_reader.h" + +namespace latinime { + +class BufferWithExtendableBuffer; +class ProbabilityDictContent; + +/* + * This class is used for helping to read nodes of ver4 patricia trie. This class handles moved + * node and reads node attributes including probability form probabilityBuffer. + */ +class Ver4PatriciaTrieNodeReader : public PtNodeReader { + public: + Ver4PatriciaTrieNodeReader(const BufferWithExtendableBuffer *const buffer, + const ProbabilityDictContent *const probabilityDictContent) + : mBuffer(buffer), mProbabilityDictContent(probabilityDictContent) {} + + ~Ver4PatriciaTrieNodeReader() {} + + virtual const PtNodeParams fetchNodeInfoInBufferFromPtNodePos(const int ptNodePos) const { + return fetchPtNodeInfoFromBufferAndProcessMovedPtNode(ptNodePos, + NOT_A_DICT_POS /* siblingNodePos */, NOT_A_DICT_POS /* bigramLinkedNodePos */); + } + + private: + DISALLOW_COPY_AND_ASSIGN(Ver4PatriciaTrieNodeReader); + + const BufferWithExtendableBuffer *const mBuffer; + const ProbabilityDictContent *const mProbabilityDictContent; + + const PtNodeParams fetchPtNodeInfoFromBufferAndProcessMovedPtNode(const int ptNodePos, + const int siblingNodePos, const int bigramLinkedNodePos) const; +}; +} // namespace latinime +#endif /* LATINIME_VER4_PATRICIA_TRIE_NODE_READER_H */ diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp index b9ee4891c..33f738413 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp @@ -16,45 +16,110 @@ #include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h" +#include "suggest/core/dicnode/dic_node.h" +#include "suggest/core/dicnode/dic_node_vector.h" +#include "suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_reading_helper.h" +#include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h" +#include "suggest/policyimpl/dictionary/utils/forgetting_curve_utils.h" +#include "suggest/policyimpl/dictionary/utils/probability_utils.h" + namespace latinime { void Ver4PatriciaTriePolicy::createAndGetAllChildDicNodes(const DicNode *const dicNode, DicNodeVector *const childDicNodes) const { - // TODO: Implement. + if (!dicNode->hasChildren()) { + return; + } + DynamicPatriciaTrieReadingHelper readingHelper(&mDictBuffer, &mNodeReader); + readingHelper.initWithPtNodeArrayPos(dicNode->getChildrenPtNodeArrayPos()); + while (!readingHelper.isEnd()) { + const PtNodeParams ptNodeParams = readingHelper.getPtNodeParams(); + if (!ptNodeParams.isValid()) { + break; + } + bool isTerminal = ptNodeParams.isTerminal() && !ptNodeParams.isDeleted(); + if (isTerminal && mHeaderPolicy.isDecayingDict()) { + // A DecayingDict may have a terminal PtNode that has a terminal DicNode whose + // probability is NOT_A_PROBABILITY. In such case, we don't want to treat it as a + // valid terminal DicNode. + isTerminal = getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY) + != NOT_A_PROBABILITY; + } + childDicNodes->pushLeavingChild(dicNode, ptNodeParams.getHeadPos(), + ptNodeParams.getChildrenPos(), ptNodeParams.getProbability(), isTerminal, + ptNodeParams.hasChildren(), + ptNodeParams.isBlacklisted() + || ptNodeParams.isNotAWord() /* isBlacklistedOrNotAWord */, + ptNodeParams.getCodePointCount(), ptNodeParams.getCodePoints()); + readingHelper.readNextSiblingNode(ptNodeParams); + } } int Ver4PatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCount( const int ptNodePos, const int maxCodePointCount, int *const outCodePoints, int *const outUnigramProbability) const { - // TODO: Implement. - return 0; + DynamicPatriciaTrieReadingHelper readingHelper(&mDictBuffer, &mNodeReader); + readingHelper.initWithPtNodePos(ptNodePos); + return readingHelper.getCodePointsAndProbabilityAndReturnCodePointCount( + maxCodePointCount, outCodePoints, outUnigramProbability); } int Ver4PatriciaTriePolicy::getTerminalPtNodePositionOfWord(const int *const inWord, const int length, const bool forceLowerCaseSearch) const { - // TODO: Implement. - return NOT_A_DICT_POS; + DynamicPatriciaTrieReadingHelper readingHelper(&mDictBuffer, &mNodeReader); + readingHelper.initWithPtNodeArrayPos(getRootPosition()); + return readingHelper.getTerminalPtNodePositionOfWord(inWord, length, forceLowerCaseSearch); } int Ver4PatriciaTriePolicy::getProbability(const int unigramProbability, const int bigramProbability) const { - // TODO: Implement. - return NOT_A_PROBABILITY; + if (mHeaderPolicy.isDecayingDict()) { + // Both probabilities are encoded. Decode them and get probability. + return ForgettingCurveUtils::getProbability(unigramProbability, bigramProbability); + } else { + if (unigramProbability == NOT_A_PROBABILITY) { + return NOT_A_PROBABILITY; + } else if (bigramProbability == NOT_A_PROBABILITY) { + return ProbabilityUtils::backoff(unigramProbability); + } else { + // bigramProbability is a bigram probability delta. + return ProbabilityUtils::computeProbabilityForBigram(unigramProbability, + bigramProbability); + } + } } int Ver4PatriciaTriePolicy::getUnigramProbabilityOfPtNode(const int ptNodePos) const { - // TODO: Implement. - return NOT_A_PROBABILITY; + if (ptNodePos == NOT_A_DICT_POS) { + return NOT_A_PROBABILITY; + } + const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); + if (ptNodeParams.isDeleted() || ptNodeParams.isBlacklisted() || ptNodeParams.isNotAWord()) { + return NOT_A_PROBABILITY; + } + return getProbability(ptNodeParams.getProbability(), NOT_A_PROBABILITY); } int Ver4PatriciaTriePolicy::getShortcutPositionOfPtNode(const int ptNodePos) const { - // TODO: Implement. - return NOT_A_DICT_POS; + if (ptNodePos == NOT_A_DICT_POS) { + return NOT_A_DICT_POS; + } + const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); + if (ptNodeParams.isDeleted()) { + return NOT_A_DICT_POS; + } + return ptNodeParams.getTerminalId(); } int Ver4PatriciaTriePolicy::getBigramsPositionOfPtNode(const int ptNodePos) const { - // TODO: Implement. - return NOT_A_DICT_POS; + if (ptNodePos == NOT_A_DICT_POS) { + return NOT_A_DICT_POS; + } + const PtNodeParams ptNodeParams(mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos)); + if (ptNodeParams.isDeleted()) { + return NOT_A_DICT_POS; + } + return ptNodeParams.getTerminalId(); } bool Ver4PatriciaTriePolicy::addUnigramWord(const int *const word, const int length, diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h index f7bfb3b0d..2f577f741 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h @@ -21,6 +21,7 @@ #include "suggest/core/policy/dictionary_structure_with_buffer_policy.h" #include "suggest/policyimpl/dictionary/header/header_policy.h" #include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h" +#include "suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h" #include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" namespace latinime { @@ -33,7 +34,11 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy { public: Ver4PatriciaTriePolicy(const Ver4DictBuffers::Ver4DictBuffersPtr &buffers) : mBuffers(buffers), - mHeaderPolicy(mBuffers.get()->getRawDictBuffer(), FormatUtils::VERSION_4) {}; + mHeaderPolicy(mBuffers.get()->getRawDictBuffer(), FormatUtils::VERSION_4), + mDictBuffer(mBuffers.get()->getRawDictBuffer() + mHeaderPolicy.getSize(), + mBuffers.get()->getRawDictBufferSize() - mHeaderPolicy.getSize(), + BufferWithExtendableBuffer::DEFAULT_MAX_ADDITIONAL_BUFFER_SIZE), + mNodeReader(&mDictBuffer, mBuffers.get()->getProbabilityDictContent()) {}; AK_FORCE_INLINE int getRootPosition() const { return 0; @@ -91,6 +96,8 @@ class Ver4PatriciaTriePolicy : public DictionaryStructureWithBufferPolicy { const Ver4DictBuffers::Ver4DictBuffersPtr mBuffers; const HeaderPolicy mHeaderPolicy; + BufferWithExtendableBuffer mDictBuffer; + Ver4PatriciaTrieNodeReader mNodeReader; }; } // namespace latinime #endif // LATINIME_VER4_PATRICIA_TRIE_POLICY_H diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.cpp new file mode 100644 index 000000000..fd8a3ba55 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.cpp @@ -0,0 +1,38 @@ +/* + * 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/dictionary/structure/v4/ver4_patricia_trie_reading_utils.h" + +#include "suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h" +#include "suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h" +#include "suggest/policyimpl/dictionary/utils/byte_array_utils.h" + +namespace latinime { + +/* static */ int Ver4PatriciaTrieReadingUtils::getTerminalIdAndAdvancePosition( + const uint8_t *const buffer, int *pos) { + return ByteArrayUtils::readUint32AndAdvancePosition(buffer, pos); +} + +/* static */ int Ver4PatriciaTrieReadingUtils::getProbability( + const BufferWithExtendableBuffer *const probabilityBuffer, const int terminalId) { + int pos = terminalId * (Ver4DictConstants::FLAGS_IN_PROBABILITY_FILE_SIZE + + Ver4DictConstants::PROBABILITY_SIZE) + + Ver4DictConstants::FLAGS_IN_PROBABILITY_FILE_SIZE; + return probabilityBuffer->readUintAndAdvancePosition(Ver4DictConstants::PROBABILITY_SIZE, &pos); +} + +} // namespace latinime diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.h b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.h new file mode 100644 index 000000000..19e6dd331 --- /dev/null +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.h @@ -0,0 +1,40 @@ +/* + * 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_VER4_PATRICIA_TRIE_READING_UTILS_H +#define LATINIME_VER4_PATRICIA_TRIE_READING_UTILS_H + +#include <stdint.h> + +#include "defines.h" + +namespace latinime { + +class BufferWithExtendableBuffer; + +class Ver4PatriciaTrieReadingUtils { + public: + static int getTerminalIdAndAdvancePosition(const uint8_t *const buffer, + int *const pos); + + static int getProbability(const BufferWithExtendableBuffer *const probabilityBuffer, + const int terminalId); + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(Ver4PatriciaTrieReadingUtils); +}; +} // namespace latinime +#endif /* LATINIME_VER4_PATRICIA_TRIE_READING_UTILS_H */ diff --git a/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp b/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp index 5032131ab..e028de526 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp +++ b/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp @@ -23,6 +23,20 @@ const int BufferWithExtendableBuffer::NEAR_BUFFER_LIMIT_THRESHOLD_PERCENTILE = 9 // TODO: Needs to allocate larger memory corresponding to the current vector size. const size_t BufferWithExtendableBuffer::EXTEND_ADDITIONAL_BUFFER_SIZE_STEP = 128 * 1024; +uint32_t BufferWithExtendableBuffer::readUintAndAdvancePosition(const int size, + int *const pos) const { + const bool readingPosIsInAdditionalBuffer = isInAdditionalBuffer(*pos); + if (readingPosIsInAdditionalBuffer) { + *pos -= mOriginalBufferSize; + } + const int value = ByteArrayUtils::readUintAndAdvancePosition( + getBuffer(readingPosIsInAdditionalBuffer), size, pos); + if (readingPosIsInAdditionalBuffer) { + *pos += mOriginalBufferSize; + } + return value; +} + bool BufferWithExtendableBuffer::writeUintAndAdvancePosition(const uint32_t data, const int size, int *const pos) { if (!(size >= 1 && size <= 4)) { diff --git a/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h b/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h index 1e27a1bec..2d89f71b1 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h +++ b/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h @@ -71,6 +71,8 @@ class BufferWithExtendableBuffer { } } + uint32_t readUintAndAdvancePosition(const int size, int *const pos) const; + AK_FORCE_INLINE int getOriginalBufferSize() const { return mOriginalBufferSize; } diff --git a/native/jni/src/suggest/policyimpl/dictionary/utils/byte_array_utils.h b/native/jni/src/suggest/policyimpl/dictionary/utils/byte_array_utils.h index 0c1576818..1ca01b868 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/utils/byte_array_utils.h +++ b/native/jni/src/suggest/policyimpl/dictionary/utils/byte_array_utils.h @@ -114,6 +114,24 @@ class ByteArrayUtils { return buffer[(*pos)++]; } + static AK_FORCE_INLINE int readUintAndAdvancePosition(const uint8_t *const buffer, + const int size, int *const pos) { + // size must be in 1 to 4. + ASSERT(size >= 1 && size <= 4); + switch (size) { + case 1: + return ByteArrayUtils::readUint8AndAdvancePosition(buffer, pos); + case 2: + return ByteArrayUtils::readUint16AndAdvancePosition(buffer, pos); + case 3: + return ByteArrayUtils::readUint24AndAdvancePosition(buffer, pos); + case 4: + return ByteArrayUtils::readUint32AndAdvancePosition(buffer, pos); + default: + return 0; + } + } + /** * Code Point Reading * diff --git a/tests/src/com/android/inputmethod/latin/Ver4BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/Ver4BinaryDictionaryTests.java index 25fb1c2a8..f48a4296a 100644 --- a/tests/src/com/android/inputmethod/latin/Ver4BinaryDictionaryTests.java +++ b/tests/src/com/android/inputmethod/latin/Ver4BinaryDictionaryTests.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Locale; +// TODO: Add a test to evaluate the speed of operations of Ver4 dictionary. @LargeTest public class Ver4BinaryDictionaryTests extends AndroidTestCase { private static final String TAG = Ver4BinaryDictionaryTests.class.getSimpleName(); @@ -90,4 +91,33 @@ public class Ver4BinaryDictionaryTests extends AndroidTestCase { Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */); assertTrue(binaryDictionary.isValidDictionary()); } + + // TODO: Add large tests. + public void testReadProbability() { + final String dictVersion = Long.toString(System.currentTimeMillis()); + final FusionDictionary dict = new FusionDictionary(new PtNodeArray(), + getDictionaryOptions(TEST_LOCALE, dictVersion)); + + final int frequency = 100; + dict.add("a", frequency, null, false /* isNotAWord */); + dict.add("aaa", frequency, null, false /* isNotAWord */); + dict.add("ab", frequency, null, false /* isNotAWord */); + + DictEncoder encoder = new Ver4DictEncoder(getContext().getCacheDir()); + try { + encoder.writeDictionary(dict, FORMAT_OPTIONS); + } catch (IOException e) { + Log.e(TAG, "IOException while writing dictionary", e); + } catch (UnsupportedFormatException e) { + Log.e(TAG, "Unsupported format", e); + } + File trieFile = getTrieFile(TEST_LOCALE, dictVersion); + BinaryDictionary binaryDictionary = new BinaryDictionary(trieFile.getAbsolutePath(), + 0 /* offset */, trieFile.length(), true /* useFullEditDistance */, + Locale.getDefault(), TEST_LOCALE, true /* isUpdatable */); + assertTrue(binaryDictionary.isValidDictionary()); + assertEquals(frequency, binaryDictionary.getFrequency("a")); + assertEquals(frequency, binaryDictionary.getFrequency("aaa")); + assertEquals(frequency, binaryDictionary.getFrequency("ab")); + } } |