aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--java/res/values-is/strings.xml464
-rw-r--r--java/res/values-kk/strings.xml250
-rw-r--r--java/res/values-mk/strings.xml464
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java2
-rw-r--r--java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java18
-rw-r--r--java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java1
-rw-r--r--native/jni/Android.mk4
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/pt_common/pt_node_params.h22
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v3/dynamic_patricia_trie_node_reader.h2
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/probability_dict_content.h50
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/single_dict_content.h9
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_buffers.h16
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.cpp4
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_dict_constants.h4
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.cpp95
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_node_reader.h58
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp91
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.h9
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.cpp38
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_reading_utils.h40
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp14
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.h2
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/utils/byte_array_utils.h18
-rw-r--r--tests/src/com/android/inputmethod/latin/Ver4BinaryDictionaryTests.java30
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">"Тіл &amp; енгізу параметрлерінде <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> қолданбасы әлдеқашан Тіл &amp; енгізу параметрлерінде қосылған, сол себепті бұл қадам орындалған.Келесі біреуін қосыңыз!"</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">"Ұялы құрылғыдағы таңдалған тілде қолжетімді сөздік бар.&lt;br/&gt; Теру тәжірибесін арттыру үшін <xliff:g id="LANGUAGE">%1$s</xliff:g> сөздігін &lt;b&gt;жүктеп алуды&lt;/b&gt; ұсынамыз.&lt;br/&gt; &lt;br/&gt; Жүктеп алу 3G арқылы бір немесе екі минут алуы мүмкін. Егер &lt;b&gt;шектеусіз деректер жоспары&lt;/b&gt; болмаса, қосымша төлем алынуы мүмкін.&lt;br/&gt; Егер қай дерек жоспарына ие екеніңізді білмесеңіз, жүктеп алуды автоматты түрде бастау үшін Wi-Fi байланысын табуды ұсынамыз.&lt;br/&gt; &lt;br/&gt; Кеңес: Ұялы құрылғының &lt;b&gt;Параметрлер&lt;/b&gt; мәзіріндегі &lt;b&gt;Тіл &amp; енгізу&lt;/b&gt; параметріне өту арқылы сөздіктерді жүктеп алуға және жоюға болады."</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"));
+ }
}