From c9f81cbd4a9dbf6aae33d9ef91e44c28a2a4fee7 Mon Sep 17 00:00:00 2001 From: Ilia Date: Wed, 14 Jun 2023 12:44:21 +0400 Subject: [PATCH] About page fixed (#3) * Canon CR3 support Small UI fixes * About page fixed --- app/build.gradle | 7 +- app/src/proprietary/AndroidManifest.xml | 2 +- build.gradle | 8 + commons/.gitignore | 1 + commons/build.gradle | 53 + commons/proguard-rules.pro | 26 + commons/src/main/AndroidManifest.xml | 60 + .../commons/activities/AboutActivity.kt | 431 +++ .../commons/activities/BaseSimpleActivity.kt | 1180 +++++++ .../commons/activities/BaseSplashActivity.kt | 59 + .../activities/ContributorsActivity.kt | 119 + .../activities/CustomizationActivity.kt | 664 ++++ .../commons/activities/FAQActivity.kt | 66 + .../commons/activities/LicenseActivity.kt | 94 + .../ManageBlockedNumbersActivity.kt | 269 ++ .../adapters/FilepickerFavoritesAdapter.kt | 61 + .../adapters/FilepickerItemsAdapter.kt | 152 + .../adapters/ManageBlockedNumbersAdapter.kt | 142 + .../commons/adapters/MyArrayAdapter.kt | 23 + .../commons/adapters/MyRecyclerViewAdapter.kt | 348 ++ .../adapters/MyRecyclerViewListAdapter.kt | 367 ++ .../commons/adapters/PasswordTypesAdapter.kt | 57 + .../commons/adapters/RenameAdapter.kt | 42 + .../commons/adapters/SimpleListItemAdapter.kt | 64 + .../commons/asynctasks/CopyMoveTask.kt | 363 ++ .../commons/databases/ContactsDatabase.kt | 90 + .../commons/dialogs/AddBlockedNumberDialog.kt | 44 + .../commons/dialogs/AppSideloadedDialog.kt | 47 + .../dialogs/BottomSheetChooserDialog.kt | 54 + .../commons/dialogs/CallConfirmationDialog.kt | 32 + .../dialogs/ChangeDateTimeFormatDialog.kt | 73 + .../commons/dialogs/ColorPickerDialog.kt | 253 ++ .../dialogs/ConfirmationAdvancedDialog.kt | 48 + .../commons/dialogs/ConfirmationDialog.kt | 48 + .../commons/dialogs/CreateNewFolderDialog.kt | 84 + .../dialogs/CustomIntervalPickerDialog.kt | 81 + .../commons/dialogs/DonateDialog.kt | 28 + .../dialogs/ExportBlockedNumbersDialog.kt | 68 + .../commons/dialogs/ExportSettingsDialog.kt | 71 + .../commons/dialogs/FeatureLockedDialog.kt | 40 + .../commons/dialogs/FileConflictDialog.kt | 66 + .../commons/dialogs/FilePickerDialog.kt | 356 ++ .../dialogs/FolderLockingNoticeDialog.kt | 28 + .../commons/dialogs/LineColorPickerDialog.kt | 147 + .../commons/dialogs/NewAppDialog.kt | 30 + .../commons/dialogs/NewAppsIconsDialog.kt | 40 + .../dialogs/PermissionRequiredDialog.kt | 27 + .../commons/dialogs/PropertiesDialog.kt | 373 ++ .../commons/dialogs/PurchaseThankYouDialog.kt | 30 + .../commons/dialogs/RadioGroupDialog.kt | 73 + .../commons/dialogs/RateStarsDialog.kt | 46 + .../commons/dialogs/RateUsDialog.kt | 24 + .../commons/dialogs/RenameDialog.kt | 76 + .../commons/dialogs/RenameItemDialog.kt | 88 + .../commons/dialogs/RenameItemsDialog.kt | 95 + .../commons/dialogs/SecurityDialog.kt | 118 + .../commons/dialogs/SelectAlarmSoundDialog.kt | 166 + .../commons/dialogs/StoragePickerDialog.kt | 146 + .../commons/dialogs/UpgradeToProDialog.kt | 39 + .../commons/dialogs/WhatsNewDialog.kt | 35 + .../commons/dialogs/WritePermissionDialog.kt | 81 + .../commons/extensions/Activity-sdk30.kt | 77 + .../commons/extensions/Activity-themes.kt | 410 +++ .../commons/extensions/Activity.kt | 1739 +++++++++ .../commons/extensions/AlertDialog.kt | 20 + .../commons/extensions/Any.kt | 8 + .../commons/extensions/App.kt | 13 + .../commons/extensions/ArrayList.kt | 8 + .../commons/extensions/Bitmap.kt | 15 + .../commons/extensions/BufferedWriter.kt | 8 + .../commons/extensions/Context-contacts.kt | 323 ++ .../extensions/Context-storage-sdk30.kt | 256 ++ .../commons/extensions/Context-storage.kt | 993 ++++++ .../commons/extensions/Context-styling.kt | 179 + .../commons/extensions/Context.kt | 1090 ++++++ .../commons/extensions/Cursor.kt | 17 + .../commons/extensions/DocumentFile.kt | 52 + .../commons/extensions/Drawable.kt | 28 + .../commons/extensions/EditText.kt | 44 + .../commons/extensions/Editable.kt | 13 + .../commons/extensions/ExifInterface.kt | 148 + .../commons/extensions/File.kt | 156 + .../commons/extensions/FileDirItem.kt | 8 + .../commons/extensions/ImageView.kt | 30 + .../commons/extensions/InputStream.kt | 21 + .../commons/extensions/Int.kt | 195 ++ .../commons/extensions/List.kt | 23 + .../commons/extensions/Long.kt | 24 + .../commons/extensions/Point.kt | 11 + .../commons/extensions/RemoteViews.kt | 27 + .../commons/extensions/Resources.kt | 40 + .../commons/extensions/SeekBar.kt | 13 + .../commons/extensions/String.kt | 930 +++++ .../commons/extensions/TabLayout.kt | 20 + .../commons/extensions/TextView.kt | 36 + .../commons/extensions/View.kt | 51 + .../commons/extensions/ViewPager.kt | 14 + .../BaseBottomSheetDialogFragment.kt | 50 + .../commons/helpers/AlphanumericComparator.kt | 75 + .../commons/helpers/BaseConfig.kt | 544 +++ .../commons/helpers/BlockedNumbersExporter.kt | 33 + .../commons/helpers/BlockedNumbersImporter.kt | 37 + .../commons/helpers/Constants.kt | 629 ++++ .../commons/helpers/ContactsHelper.kt | 1558 ++++++++ .../commons/helpers/Converters.kt | 76 + .../helpers/ExternalStorageProviderHack.kt | 115 + .../commons/helpers/Inlines.kt | 5 + .../commons/helpers/LocalContactsHelper.kt | 172 + .../helpers/MyContactsContentProvider.kt | 133 + .../commons/helpers/MyContentProvider.kt | 31 + .../commons/helpers/MyContextWrapper.kt | 51 + .../commons/helpers/SimpleContactsHelper.kt | 399 +++ .../commons/helpers/VcfExporter.kt | 203 ++ .../commons/interfaces/ContactsDao.kt | 37 + .../commons/interfaces/CopyMoveListener.kt | 7 + .../commons/interfaces/GroupsDao.kt | 19 + .../commons/interfaces/HashListener.kt | 5 + .../commons/interfaces/ItemMoveCallback.kt | 42 + .../interfaces/ItemTouchHelperContract.kt | 11 + .../interfaces/LineColorPickerListener.kt | 5 + .../interfaces/MyActionModeCallback.kt | 7 + .../interfaces/RecyclerScrollCallback.kt | 5 + .../interfaces/RefreshRecyclerViewListener.kt | 5 + .../commons/interfaces/RenameTab.kt | 9 + .../commons/interfaces/SecurityTab.kt | 16 + .../interfaces/StartReorderDragListener.kt | 7 + .../commons/models/AlarmSound.kt | 3 + .../commons/models/Android30RenameFormat.kt | 7 + .../commons/models/BlockedNumber.kt | 3 + .../commons/models/FAQItem.kt | 9 + .../commons/models/FileDirItem.kt | 158 + .../commons/models/LanguageContributor.kt | 3 + .../commons/models/License.kt | 3 + .../commons/models/MyTheme.kt | 3 + .../commons/models/PhoneNumber.kt | 4 + .../commons/models/RadioItem.kt | 3 + .../commons/models/RecyclerViewPayloads.kt | 3 + .../commons/models/Release.kt | 3 + .../commons/models/SharedTheme.kt | 5 + .../commons/models/SimpleContact.kt | 98 + .../commons/models/SimpleListItem.kt | 18 + .../commons/models/contacts/Address.kt | 3 + .../commons/models/contacts/Contact.kt | 247 ++ .../commons/models/contacts/ContactSource.kt | 13 + .../commons/models/contacts/Email.kt | 3 + .../commons/models/contacts/Event.kt | 3 + .../commons/models/contacts/Group.kt | 22 + .../commons/models/contacts/IM.kt | 3 + .../commons/models/contacts/LocalContact.kt | 36 + .../commons/models/contacts/Organization.kt | 7 + .../models/contacts/PhoneNumberConverter.kt | 4 + .../commons/models/contacts/SocialAction.kt | 3 + .../commons/overloads/String.kt | 9 + .../commons/receivers/SharedThemeReceiver.kt | 54 + .../commons/views/BiometricIdTab.kt | 47 + .../commons/views/Breadcrumbs.kt | 268 ++ .../commons/views/ColorPickerSquare.kt | 33 + .../commons/views/FingerprintTab.kt | 84 + .../commons/views/LineColorPicker.kt | 107 + .../commons/views/MyAppCompatCheckbox.kt | 27 + .../commons/views/MyAppCompatSpinner.kt | 48 + .../commons/views/MyAutoCompleteTextView.kt | 24 + .../commons/views/MyButton.kt | 17 + .../commons/views/MyCompatRadioButton.kt | 27 + .../commons/views/MyDialogViewPager.kt | 44 + .../commons/views/MyEditText.kt | 25 + .../commons/views/MyFloatingActionButton.kt | 21 + .../commons/views/MyGridLayoutManager.kt | 17 + .../commons/views/MyLinearLayoutManager.kt | 17 + .../commons/views/MyRecyclerView.kt | 333 ++ .../commons/views/MyScrollView.kt | 37 + .../commons/views/MySearchMenu.kt | 111 + .../commons/views/MySeekBar.kt | 19 + .../commons/views/MySquareImageView.kt | 20 + .../commons/views/MyTextInputLayout.kt | 52 + .../commons/views/MyTextView.kt | 18 + .../commons/views/MyViewPager.kt | 29 + .../commons/views/PatternTab.kt | 94 + .../simplemobiletools/commons/views/PinTab.kt | 112 + .../commons/views/RenamePatternTab.kt | 240 ++ .../commons/views/RenameSimpleTab.kt | 194 + .../BottomActionMenuCallback.kt | 7 + .../bottomactionmenu/BottomActionMenuItem.kt | 13 + .../BottomActionMenuItemPopup.kt | 277 ++ .../BottomActionMenuParser.kt | 85 + .../bottomactionmenu/BottomActionMenuPopup.kt | 103 + .../bottomactionmenu/BottomActionMenuView.kt | 209 ++ .../res/anim/item_animation_fall_down.xml | 24 + .../src/main/res/anim/layout_animation.xml | 5 + .../src/main/res/anim/pulsing_animation.xml | 13 + .../main/res/anim/shake_pulse_animation.xml | 24 + commons/src/main/res/anim/slide_down.xml | 9 + .../res/drawable-hdpi/img_write_storage.webp | Bin 0 -> 10228 bytes .../img_write_storage_create_doc_sdk_30.webp | Bin 0 -> 2174 bytes .../drawable-hdpi/img_write_storage_otg.webp | Bin 0 -> 17438 bytes .../drawable-hdpi/img_write_storage_sd.webp | Bin 0 -> 13580 bytes .../img_write_storage_sdk_30.webp | Bin 0 -> 5032 bytes .../drawable-nodpi/img_color_picker_hue.png | Bin 0 -> 455 bytes .../res/drawable-xhdpi/img_write_storage.webp | Bin 0 -> 15200 bytes .../img_write_storage_create_doc_sdk_30.webp | Bin 0 -> 3414 bytes .../drawable-xhdpi/img_write_storage_otg.webp | Bin 0 -> 25726 bytes .../drawable-xhdpi/img_write_storage_sd.webp | Bin 0 -> 20680 bytes .../img_write_storage_sdk_30.webp | Bin 0 -> 7780 bytes .../drawable-xxhdpi/img_write_storage.webp | Bin 0 -> 19694 bytes .../img_write_storage_create_doc_sdk_30.webp | Bin 0 -> 4760 bytes .../img_write_storage_otg.webp | Bin 0 -> 32892 bytes .../drawable-xxhdpi/img_write_storage_sd.webp | Bin 0 -> 26880 bytes .../img_write_storage_sdk_30.webp | Bin 0 -> 10708 bytes .../drawable-xxxhdpi/img_write_storage.webp | Bin 0 -> 25238 bytes .../img_write_storage_create_doc_sdk_30.webp | Bin 0 -> 8422 bytes .../img_write_storage_otg.webp | Bin 0 -> 42512 bytes .../img_write_storage_sd.webp | Bin 0 -> 36694 bytes .../img_write_storage_sdk_30.webp | Bin 0 -> 15278 bytes .../res/drawable/actionmenu_background.xml | 9 + .../res/drawable/black_dialog_background.xml | 12 + .../src/main/res/drawable/bottom_sheet_bg.xml | 8 + .../res/drawable/bottom_sheet_bg_black.xml | 16 + .../main/res/drawable/button_background.9.png | Bin 0 -> 233 bytes .../drawable/button_background_rounded.xml | 14 + .../res/drawable/button_background_stroke.xml | 17 + .../main/res/drawable/circle_background.xml | 4 + .../main/res/drawable/color_picker_circle.xml | 13 + commons/src/main/res/drawable/dialog_bg.xml | 4 + .../res/drawable/dialog_you_background.xml | 9 + commons/src/main/res/drawable/divider.xml | 5 + .../main/res/drawable/gradient_background.xml | 4 + .../drawable/gradient_background_flipped.xml | 4 + .../res/drawable/ic_add_person_vector.xml | 3 + .../res/drawable/ic_arrow_left_vector.xml | 3 + .../res/drawable/ic_arrow_right_vector.xml | 3 + .../main/res/drawable/ic_article_vector.xml | 3 + .../res/drawable/ic_attach_file_vector.xml | 3 + .../src/main/res/drawable/ic_bell_vector.xml | 3 + .../src/main/res/drawable/ic_block_vector.xml | 3 + .../main/res/drawable/ic_business_vector.xml | 3 + .../main/res/drawable/ic_camera_vector.xml | 4 + .../res/drawable/ic_change_view_vector.xml | 3 + .../res/drawable/ic_check_circle_vector.xml | 3 + .../src/main/res/drawable/ic_check_vector.xml | 3 + .../res/drawable/ic_chevron_left_vector.xml | 3 + .../ic_chevron_right_unpadded_vector.xml | 3 + .../res/drawable/ic_chevron_right_vector.xml | 3 + .../src/main/res/drawable/ic_clear_vector.xml | 3 + .../res/drawable/ic_clock_filled_vector.xml | 3 + .../src/main/res/drawable/ic_clock_vector.xml | 3 + .../src/main/res/drawable/ic_code_vector.xml | 3 + .../res/drawable/ic_column_count_vector.xml | 3 + .../src/main/res/drawable/ic_copy_vector.xml | 3 + .../src/main/res/drawable/ic_cross_vector.xml | 3 + .../main/res/drawable/ic_delete_vector.xml | 3 + .../main/res/drawable/ic_dialpad_vector.xml | 3 + .../main/res/drawable/ic_dollar_vector.xml | 3 + .../res/drawable/ic_drag_handle_vector.xml | 3 + .../src/main/res/drawable/ic_edit_vector.xml | 3 + .../src/main/res/drawable/ic_face_vector.xml | 3 + .../main/res/drawable/ic_facebook_vector.xml | 4 + commons/src/main/res/drawable/ic_file_aep.xml | 7 + commons/src/main/res/drawable/ic_file_ai.xml | 7 + commons/src/main/res/drawable/ic_file_avi.xml | 8 + commons/src/main/res/drawable/ic_file_css.xml | 7 + commons/src/main/res/drawable/ic_file_csv.xml | 7 + commons/src/main/res/drawable/ic_file_dbf.xml | 7 + commons/src/main/res/drawable/ic_file_doc.xml | 7 + commons/src/main/res/drawable/ic_file_dwg.xml | 9 + commons/src/main/res/drawable/ic_file_exe.xml | 7 + commons/src/main/res/drawable/ic_file_fla.xml | 9 + commons/src/main/res/drawable/ic_file_flv.xml | 7 + .../src/main/res/drawable/ic_file_generic.xml | 6 + .../src/main/res/drawable/ic_file_html.xml | 7 + commons/src/main/res/drawable/ic_file_ics.xml | 7 + .../src/main/res/drawable/ic_file_indd.xml | 7 + commons/src/main/res/drawable/ic_file_iso.xml | 9 + commons/src/main/res/drawable/ic_file_jpg.xml | 8 + commons/src/main/res/drawable/ic_file_js.xml | 7 + .../src/main/res/drawable/ic_file_json.xml | 7 + commons/src/main/res/drawable/ic_file_m4a.xml | 7 + commons/src/main/res/drawable/ic_file_mp3.xml | 7 + commons/src/main/res/drawable/ic_file_mp4.xml | 8 + commons/src/main/res/drawable/ic_file_ogg.xml | 7 + commons/src/main/res/drawable/ic_file_pdf.xml | 7 + .../src/main/res/drawable/ic_file_plproj.xml | 8 + commons/src/main/res/drawable/ic_file_png.xml | 8 + commons/src/main/res/drawable/ic_file_ppt.xml | 9 + .../src/main/res/drawable/ic_file_prproj.xml | 8 + commons/src/main/res/drawable/ic_file_psd.xml | 7 + commons/src/main/res/drawable/ic_file_rtf.xml | 7 + .../src/main/res/drawable/ic_file_sesx.xml | 7 + commons/src/main/res/drawable/ic_file_sql.xml | 7 + commons/src/main/res/drawable/ic_file_svg.xml | 7 + commons/src/main/res/drawable/ic_file_txt.xml | 7 + commons/src/main/res/drawable/ic_file_vcf.xml | 7 + commons/src/main/res/drawable/ic_file_wav.xml | 7 + commons/src/main/res/drawable/ic_file_wmv.xml | 8 + commons/src/main/res/drawable/ic_file_xls.xml | 7 + commons/src/main/res/drawable/ic_file_xml.xml | 9 + commons/src/main/res/drawable/ic_file_zip.xml | 8 + .../main/res/drawable/ic_filter_vector.xml | 3 + .../res/drawable/ic_fingerprint_vector.xml | 3 + .../res/drawable/ic_flag_arabic_vector.xml | 9 + .../drawable/ic_flag_azerbaijani_vector.xml | 10 + .../res/drawable/ic_flag_basque_vector.xml | 8 + .../res/drawable/ic_flag_bengali_vector.xml | 7 + .../res/drawable/ic_flag_catalan_vector.xml | 10 + .../drawable/ic_flag_chinese_cn_vector.xml | 7 + .../drawable/ic_flag_chinese_hk_vector.xml | 7 + .../drawable/ic_flag_chinese_tw_vector.xml | 10 + .../res/drawable/ic_flag_croatian_vector.xml | 12 + .../res/drawable/ic_flag_czech_vector.xml | 8 + .../res/drawable/ic_flag_danish_vector.xml | 7 + .../res/drawable/ic_flag_dutch_vector.xml | 8 + .../res/drawable/ic_flag_finnish_vector.xml | 7 + .../res/drawable/ic_flag_french_vector.xml | 8 + .../res/drawable/ic_flag_galician_vector.xml | 9 + .../res/drawable/ic_flag_german_vector.xml | 8 + .../res/drawable/ic_flag_greek_vector.xml | 7 + .../res/drawable/ic_flag_hebrew_vector.xml | 7 + .../res/drawable/ic_flag_hindi_vector.xml | 11 + .../res/drawable/ic_flag_hungarian_vector.xml | 8 + .../drawable/ic_flag_indonesian_vector.xml | 7 + .../res/drawable/ic_flag_italian_vector.xml | 8 + .../res/drawable/ic_flag_japanese_vector.xml | 7 + .../res/drawable/ic_flag_korean_vector.xml | 9 + .../drawable/ic_flag_lithuanian_vector.xml | 8 + .../res/drawable/ic_flag_nepali_vector.xml | 9 + .../res/drawable/ic_flag_norwegian_vector.xml | 8 + .../res/drawable/ic_flag_persian_vector.xml | 8 + .../res/drawable/ic_flag_polish_vector.xml | 7 + .../drawable/ic_flag_portuguese_vector.xml | 10 + .../res/drawable/ic_flag_romanian_vector.xml | 8 + .../res/drawable/ic_flag_russian_vector.xml | 8 + .../res/drawable/ic_flag_slovak_vector.xml | 12 + .../res/drawable/ic_flag_slovenian_vector.xml | 10 + .../res/drawable/ic_flag_spanish_vector.xml | 23 + .../res/drawable/ic_flag_swedish_vector.xml | 7 + .../res/drawable/ic_flag_tamil_vector.xml | 7 + .../res/drawable/ic_flag_turkish_vector.xml | 8 + .../res/drawable/ic_flag_ukrainian_vector.xml | 7 + .../res/drawable/ic_flag_welsh_vector.xml | 8 + .../res/drawable/ic_folder_open_vector.xml | 3 + .../res/drawable/ic_folder_outline_vector.xml | 3 + .../main/res/drawable/ic_folder_vector.xml | 3 + .../main/res/drawable/ic_github_vector.xml | 3 + .../res/drawable/ic_google_play_vector.xml | 3 + .../main/res/drawable/ic_group_circle_bg.xml | 14 + .../src/main/res/drawable/ic_heart_vector.xml | 3 + .../src/main/res/drawable/ic_hide_vector.xml | 3 + .../src/main/res/drawable/ic_info_vector.xml | 3 + .../src/main/res/drawable/ic_label_vector.xml | 3 + .../src/main/res/drawable/ic_link_vector.xml | 3 + .../src/main/res/drawable/ic_lock_vector.xml | 3 + .../src/main/res/drawable/ic_mail_vector.xml | 3 + .../res/drawable/ic_microphone_vector.xml | 3 + .../res/drawable/ic_minus_circle_vector.xml | 4 + .../src/main/res/drawable/ic_minus_vector.xml | 3 + .../res/drawable/ic_move_to_bottom_vector.xml | 3 + .../res/drawable/ic_move_to_top_vector.xml | 3 + .../src/main/res/drawable/ic_move_vector.xml | 3 + .../res/drawable/ic_next_outline_vector.xml | 4 + .../src/main/res/drawable/ic_next_vector.xml | 3 + .../drawable/ic_orientation_auto_vector.xml | 3 + .../ic_orientation_landscape_vector.xml | 3 + .../ic_orientation_portrait_vector.xml | 3 + .../res/drawable/ic_pause_crossed_vector.xml | 4 + .../res/drawable/ic_pause_outline_vector.xml | 4 + .../src/main/res/drawable/ic_pause_vector.xml | 3 + .../res/drawable/ic_people_outline_vector.xml | 3 + .../main/res/drawable/ic_people_vector.xml | 3 + .../res/drawable/ic_person_outline_vector.xml | 3 + .../main/res/drawable/ic_person_vector.xml | 3 + .../main/res/drawable/ic_phone_one_vector.xml | 3 + .../main/res/drawable/ic_phone_two_vector.xml | 3 + .../src/main/res/drawable/ic_phone_vector.xml | 3 + .../res/drawable/ic_pin_filled_vector.xml | 3 + .../src/main/res/drawable/ic_pin_vector.xml | 3 + .../src/main/res/drawable/ic_place_vector.xml | 3 + .../res/drawable/ic_play_outline_vector.xml | 4 + .../src/main/res/drawable/ic_play_vector.xml | 3 + .../src/main/res/drawable/ic_plus_vector.xml | 3 + .../res/drawable/ic_prev_outline_vector.xml | 4 + .../main/res/drawable/ic_previous_vector.xml | 3 + .../src/main/res/drawable/ic_print_vector.xml | 3 + .../res/drawable/ic_question_mark_vector.xml | 3 + .../main/res/drawable/ic_reddit_vector.xml | 4 + .../src/main/res/drawable/ic_redo_vector.xml | 3 + .../main/res/drawable/ic_rename_vector.xml | 4 + .../src/main/res/drawable/ic_reset_vector.xml | 3 + .../src/main/res/drawable/ic_save_vector.xml | 3 + .../main/res/drawable/ic_sd_card_vector.xml | 3 + .../main/res/drawable/ic_search_vector.xml | 3 + .../res/drawable/ic_select_all_vector.xml | 3 + .../src/main/res/drawable/ic_send_vector.xml | 3 + .../main/res/drawable/ic_set_as_vector.xml | 3 + .../res/drawable/ic_settings_cog_vector.xml | 3 + .../src/main/res/drawable/ic_share_vector.xml | 3 + .../src/main/res/drawable/ic_sim_vector.xml | 3 + .../res/drawable/ic_simple_phone_vector.xml | 4 + .../src/main/res/drawable/ic_sms_vector.xml | 3 + .../main/res/drawable/ic_snooze_vector.xml | 3 + .../src/main/res/drawable/ic_sort_vector.xml | 3 + .../res/drawable/ic_star_outline_vector.xml | 3 + .../src/main/res/drawable/ic_star_vector.xml | 3 + .../src/main/res/drawable/ic_stop_vector.xml | 3 + .../main/res/drawable/ic_telegram_vector.xml | 4 + .../res/drawable/ic_three_dots_vector.xml | 3 + .../src/main/res/drawable/ic_undo_vector.xml | 3 + .../main/res/drawable/ic_unhide_vector.xml | 3 + .../src/main/res/drawable/ic_usb_vector.xml | 3 + .../main/res/drawable/ic_vibrate_vector.xml | 3 + .../ic_view_contact_details_vector.xml | 3 + .../src/main/res/drawable/pill_background.xml | 14 + .../main/res/drawable/popup_menu_bg_you.xml | 9 + .../main/res/drawable/ripple_all_corners.xml | 9 + .../main/res/drawable/ripple_background.xml | 8 + .../res/drawable/ripple_bottom_corners.xml | 9 + .../main/res/drawable/ripple_top_corners.xml | 9 + .../res/drawable/search_menu_background.xml | 9 + .../res/drawable/section_holder_stroke.xml | 9 + commons/src/main/res/drawable/selector.xml | 15 + .../src/main/res/drawable/shortcut_plus.xml | 9 + .../res/drawable/top_popup_menu_bg_dark.xml | 9 + .../res/drawable/top_popup_menu_bg_light.xml | 9 + .../main/res/drawable/transparent_button.xml | 4 + .../drawable/transparent_button_pressed.xml | 4 + .../widget_config_seekbar_background.xml | 9 + .../res/drawable/widget_round_background.xml | 5 + .../src/main/res/layout/actionbar_title.xml | 10 + .../src/main/res/layout/activity_about.xml | 98 + .../main/res/layout/activity_contributors.xml | 125 + .../res/layout/activity_customization.xml | 221 ++ commons/src/main/res/layout/activity_faq.xml | 34 + .../src/main/res/layout/activity_license.xml | 34 + .../activity_manage_blocked_numbers.xml | 95 + .../main/res/layout/bottom_tablayout_item.xml | 31 + .../res/layout/dialog_add_blocked_number.xml | 28 + .../main/res/layout/dialog_bottom_sheet.xml | 37 + .../res/layout/dialog_call_confirmation.xml | 17 + .../layout/dialog_change_date_time_format.xml | 107 + .../main/res/layout/dialog_color_picker.xml | 163 + .../res/layout/dialog_create_new_folder.xml | 42 + .../layout/dialog_custom_interval_picker.xml | 74 + commons/src/main/res/layout/dialog_donate.xml | 31 + .../layout/dialog_export_blocked_numbers.xml | 50 + .../res/layout/dialog_export_settings.xml | 48 + .../main/res/layout/dialog_feature_locked.xml | 31 + .../main/res/layout/dialog_file_conflict.xml | 76 + .../src/main/res/layout/dialog_filepicker.xml | 121 + .../res/layout/dialog_line_color_picker.xml | 40 + .../src/main/res/layout/dialog_message.xml | 18 + .../main/res/layout/dialog_new_apps_icons.xml | 50 + .../src/main/res/layout/dialog_properties.xml | 15 + .../res/layout/dialog_purchase_thank_you.xml | 13 + .../main/res/layout/dialog_radio_group.xml | 16 + .../src/main/res/layout/dialog_rate_stars.xml | 69 + commons/src/main/res/layout/dialog_rename.xml | 38 + .../main/res/layout/dialog_rename_item.xml | 42 + .../main/res/layout/dialog_rename_items.xml | 51 + .../layout/dialog_rename_items_pattern.xml | 36 + .../src/main/res/layout/dialog_security.xml | 38 + .../res/layout/dialog_select_alarm_sound.xml | 48 + .../src/main/res/layout/dialog_textview.xml | 11 + commons/src/main/res/layout/dialog_title.xml | 11 + .../main/res/layout/dialog_upgrade_to_pro.xml | 13 + .../src/main/res/layout/dialog_whats_new.xml | 38 + .../res/layout/dialog_write_permission.xml | 35 + .../layout/dialog_write_permission_otg.xml | 22 + commons/src/main/res/layout/divider.xml | 5 + .../src/main/res/layout/empty_image_view.xml | 9 + .../main/res/layout/filepicker_favorite.xml | 13 + commons/src/main/res/layout/item_about.xml | 36 + .../src/main/res/layout/item_action_mode.xml | 13 + .../res/layout/item_action_mode_popup.xml | 15 + .../src/main/res/layout/item_breadcrumb.xml | 10 + .../main/res/layout/item_breadcrumb_first.xml | 17 + .../res/layout/item_contact_with_number.xml | 68 + .../layout/item_contact_without_number.xml | 54 + commons/src/main/res/layout/item_faq.xml | 32 + .../main/res/layout/item_filepicker_list.xml | 51 + .../res/layout/item_language_contributor.xml | 44 + commons/src/main/res/layout/item_license.xml | 32 + .../res/layout/item_manage_blocked_number.xml | 38 + commons/src/main/res/layout/item_property.xml | 28 + .../res/layout/item_select_alarm_sound.xml | 8 + .../src/main/res/layout/item_simple_list.xml | 47 + commons/src/main/res/layout/menu_search.xml | 53 + commons/src/main/res/layout/radio_button.xml | 5 + commons/src/main/res/layout/search_bar.xml | 64 + .../src/main/res/layout/tab_biometric_id.xml | 19 + .../src/main/res/layout/tab_fingerprint.xml | 46 + commons/src/main/res/layout/tab_pattern.xml | 22 + commons/src/main/res/layout/tab_pin.xml | 164 + .../main/res/layout/tab_rename_pattern.xml | 38 + .../src/main/res/layout/tab_rename_simple.xml | 51 + .../src/main/res/menu/cab_blocked_numbers.xml | 14 + commons/src/main/res/menu/cab_delete_only.xml | 9 + commons/src/main/res/menu/cab_remove_only.xml | 9 + .../main/res/menu/menu_add_blocked_number.xml | 18 + .../src/main/res/menu/menu_customization.xml | 9 + .../main/res/mipmap-hdpi/ic_app_launcher.png | Bin 0 -> 4115 bytes .../main/res/mipmap-hdpi/ic_calculator.png | Bin 0 -> 2327 bytes .../src/main/res/mipmap-hdpi/ic_calendar.png | Bin 0 -> 3287 bytes .../src/main/res/mipmap-hdpi/ic_camera.png | Bin 0 -> 3932 bytes commons/src/main/res/mipmap-hdpi/ic_clock.png | Bin 0 -> 3864 bytes .../src/main/res/mipmap-hdpi/ic_contacts.png | Bin 0 -> 2612 bytes .../src/main/res/mipmap-hdpi/ic_dialer.png | Bin 0 -> 2930 bytes commons/src/main/res/mipmap-hdpi/ic_draw.png | Bin 0 -> 3724 bytes .../main/res/mipmap-hdpi/ic_file_manager.png | Bin 0 -> 2421 bytes .../main/res/mipmap-hdpi/ic_flashlight.png | Bin 0 -> 3006 bytes .../src/main/res/mipmap-hdpi/ic_gallery.png | Bin 0 -> 2566 bytes .../src/main/res/mipmap-hdpi/ic_keyboard.png | Bin 0 -> 2690 bytes .../main/res/mipmap-hdpi/ic_music_player.png | Bin 0 -> 3665 bytes commons/src/main/res/mipmap-hdpi/ic_notes.png | Bin 0 -> 2402 bytes .../res/mipmap-hdpi/ic_simple_launcher.png | Bin 0 -> 2647 bytes .../main/res/mipmap-hdpi/ic_sms_messenger.png | Bin 0 -> 2384 bytes .../src/main/res/mipmap-hdpi/ic_thank_you.png | Bin 0 -> 2916 bytes .../res/mipmap-hdpi/ic_voice_recorder.png | Bin 0 -> 3438 bytes .../main/res/mipmap-xhdpi/ic_app_launcher.png | Bin 0 -> 5309 bytes .../main/res/mipmap-xhdpi/ic_calculator.png | Bin 0 -> 2821 bytes .../src/main/res/mipmap-xhdpi/ic_calendar.png | Bin 0 -> 4115 bytes .../src/main/res/mipmap-xhdpi/ic_camera.png | Bin 0 -> 5011 bytes .../src/main/res/mipmap-xhdpi/ic_clock.png | Bin 0 -> 4808 bytes .../src/main/res/mipmap-xhdpi/ic_contacts.png | Bin 0 -> 3217 bytes .../src/main/res/mipmap-xhdpi/ic_dialer.png | Bin 0 -> 3690 bytes commons/src/main/res/mipmap-xhdpi/ic_draw.png | Bin 0 -> 4783 bytes .../main/res/mipmap-xhdpi/ic_file_manager.png | Bin 0 -> 2968 bytes .../main/res/mipmap-xhdpi/ic_flashlight.png | Bin 0 -> 3858 bytes .../src/main/res/mipmap-xhdpi/ic_gallery.png | Bin 0 -> 3211 bytes .../src/main/res/mipmap-xhdpi/ic_keyboard.png | Bin 0 -> 2880 bytes .../main/res/mipmap-xhdpi/ic_music_player.png | Bin 0 -> 4708 bytes .../src/main/res/mipmap-xhdpi/ic_notes.png | Bin 0 -> 2959 bytes .../res/mipmap-xhdpi/ic_simple_launcher.png | Bin 0 -> 3407 bytes .../res/mipmap-xhdpi/ic_sms_messenger.png | Bin 0 -> 2967 bytes .../main/res/mipmap-xhdpi/ic_thank_you.png | Bin 0 -> 3590 bytes .../res/mipmap-xhdpi/ic_voice_recorder.png | Bin 0 -> 4463 bytes .../res/mipmap-xxhdpi/ic_app_launcher.png | Bin 0 -> 10527 bytes .../main/res/mipmap-xxhdpi/ic_calculator.png | Bin 0 -> 5843 bytes .../main/res/mipmap-xxhdpi/ic_calendar.png | Bin 0 -> 7659 bytes .../src/main/res/mipmap-xxhdpi/ic_camera.png | Bin 0 -> 9929 bytes .../src/main/res/mipmap-xxhdpi/ic_clock.png | Bin 0 -> 9345 bytes .../main/res/mipmap-xxhdpi/ic_contacts.png | Bin 0 -> 6363 bytes .../src/main/res/mipmap-xxhdpi/ic_dialer.png | Bin 0 -> 6849 bytes .../src/main/res/mipmap-xxhdpi/ic_draw.png | Bin 0 -> 9824 bytes .../res/mipmap-xxhdpi/ic_file_manager.png | Bin 0 -> 5836 bytes .../main/res/mipmap-xxhdpi/ic_flashlight.png | Bin 0 -> 7534 bytes .../src/main/res/mipmap-xxhdpi/ic_gallery.png | Bin 0 -> 6496 bytes .../main/res/mipmap-xxhdpi/ic_keyboard.png | Bin 0 -> 5517 bytes .../res/mipmap-xxhdpi/ic_music_player.png | Bin 0 -> 9249 bytes .../src/main/res/mipmap-xxhdpi/ic_notes.png | Bin 0 -> 5659 bytes .../res/mipmap-xxhdpi/ic_simple_launcher.png | Bin 0 -> 6710 bytes .../res/mipmap-xxhdpi/ic_sms_messenger.png | Bin 0 -> 5500 bytes .../main/res/mipmap-xxhdpi/ic_thank_you.png | Bin 0 -> 7223 bytes .../res/mipmap-xxhdpi/ic_voice_recorder.png | Bin 0 -> 8505 bytes .../res/mipmap-xxxhdpi/ic_app_launcher.png | Bin 0 -> 13088 bytes .../main/res/mipmap-xxxhdpi/ic_calculator.png | Bin 0 -> 7031 bytes .../main/res/mipmap-xxxhdpi/ic_calendar.png | Bin 0 -> 10440 bytes .../src/main/res/mipmap-xxxhdpi/ic_camera.png | Bin 0 -> 13090 bytes .../src/main/res/mipmap-xxxhdpi/ic_clock.png | Bin 0 -> 10712 bytes .../main/res/mipmap-xxxhdpi/ic_contacts.png | Bin 0 -> 8667 bytes .../src/main/res/mipmap-xxxhdpi/ic_dialer.png | Bin 0 -> 7231 bytes .../src/main/res/mipmap-xxxhdpi/ic_draw.png | Bin 0 -> 11746 bytes .../res/mipmap-xxxhdpi/ic_file_manager.png | Bin 0 -> 6666 bytes .../main/res/mipmap-xxxhdpi/ic_flashlight.png | Bin 0 -> 10228 bytes .../main/res/mipmap-xxxhdpi/ic_gallery.png | Bin 0 -> 8751 bytes .../main/res/mipmap-xxxhdpi/ic_keyboard.png | Bin 0 -> 5602 bytes .../res/mipmap-xxxhdpi/ic_music_player.png | Bin 0 -> 12138 bytes .../src/main/res/mipmap-xxxhdpi/ic_notes.png | Bin 0 -> 6402 bytes .../res/mipmap-xxxhdpi/ic_simple_launcher.png | Bin 0 -> 7396 bytes .../res/mipmap-xxxhdpi/ic_sms_messenger.png | Bin 0 -> 8614 bytes .../main/res/mipmap-xxxhdpi/ic_thank_you.png | Bin 0 -> 8254 bytes .../res/mipmap-xxxhdpi/ic_voice_recorder.png | Bin 0 -> 9561 bytes commons/src/main/res/values-ar/strings.xml | 1267 +++++++ commons/src/main/res/values-az/strings.xml | 1157 ++++++ commons/src/main/res/values-be/strings.xml | 1167 ++++++ commons/src/main/res/values-bg/strings.xml | 1093 ++++++ commons/src/main/res/values-bn/strings.xml | 1156 ++++++ commons/src/main/res/values-br/strings.xml | 1156 ++++++ commons/src/main/res/values-ca/strings.xml | 1112 ++++++ commons/src/main/res/values-cs/strings.xml | 1161 ++++++ commons/src/main/res/values-cy/strings.xml | 1235 +++++++ commons/src/main/res/values-da/strings.xml | 1092 ++++++ commons/src/main/res/values-de/strings.xml | 1120 ++++++ commons/src/main/res/values-el/strings.xml | 1093 ++++++ commons/src/main/res/values-eo/strings.xml | 1092 ++++++ commons/src/main/res/values-es/strings.xml | 1178 +++++++ commons/src/main/res/values-et/strings.xml | 1094 ++++++ commons/src/main/res/values-eu/strings.xml | 1093 ++++++ commons/src/main/res/values-fa/strings.xml | 1156 ++++++ commons/src/main/res/values-fi/strings.xml | 1118 ++++++ commons/src/main/res/values-fr/strings.xml | 1165 ++++++ commons/src/main/res/values-gl/strings.xml | 1102 ++++++ .../src/main/res/values-hi-rIN/strings.xml | 1092 ++++++ commons/src/main/res/values-hr/strings.xml | 1162 ++++++ commons/src/main/res/values-hu/strings.xml | 1098 ++++++ commons/src/main/res/values-in/strings.xml | 1073 ++++++ commons/src/main/res/values-it/strings.xml | 1167 ++++++ commons/src/main/res/values-iw/strings.xml | 1092 ++++++ commons/src/main/res/values-ja/strings.xml | 1067 ++++++ .../src/main/res/values-ko-rKR/strings.xml | 1058 ++++++ commons/src/main/res/values-lt/strings.xml | 1100 ++++++ commons/src/main/res/values-ml/strings.xml | 1092 ++++++ .../src/main/res/values-nb-rNO/strings.xml | 1093 ++++++ .../src/main/res/values-night-v31/colors.xml | 12 + commons/src/main/res/values-nl/strings.xml | 1100 ++++++ .../src/main/res/values-pa-rPK/strings.xml | 1060 ++++++ commons/src/main/res/values-pa/strings.xml | 1155 ++++++ commons/src/main/res/values-pl/strings.xml | 1193 +++++++ .../src/main/res/values-pt-rBR/strings.xml | 1130 ++++++ commons/src/main/res/values-pt/strings.xml | 1121 ++++++ commons/src/main/res/values-ro/strings.xml | 1120 ++++++ commons/src/main/res/values-ru/strings.xml | 1173 +++++++ commons/src/main/res/values-sk/strings.xml | 1192 +++++++ commons/src/main/res/values-sl/strings.xml | 1201 +++++++ commons/src/main/res/values-sr/strings.xml | 1126 ++++++ commons/src/main/res/values-sv/strings.xml | 1118 ++++++ .../src/main/res/values-sw600dp/dimens.xml | 11 + commons/src/main/res/values-ta/strings.xml | 1092 ++++++ commons/src/main/res/values-th/strings.xml | 1157 ++++++ commons/src/main/res/values-tr/strings.xml | 1132 ++++++ commons/src/main/res/values-uk/strings.xml | 1193 +++++++ commons/src/main/res/values-v31/colors.xml | 12 + commons/src/main/res/values-vi/strings.xml | 1092 ++++++ .../src/main/res/values-zh-rCN/strings.xml | 1082 ++++++ .../src/main/res/values-zh-rHK/strings.xml | 1035 ++++++ .../src/main/res/values-zh-rTW/strings.xml | 1059 ++++++ commons/src/main/res/values/arrays.xml | 274 ++ commons/src/main/res/values/attrs.xml | 10 + commons/src/main/res/values/bools.xml | 8 + commons/src/main/res/values/colors.xml | 446 +++ commons/src/main/res/values/dimens.xml | 63 + .../src/main/res/values/donottranslate.xml | 213 ++ commons/src/main/res/values/ids.xml | 8 + commons/src/main/res/values/integers.xml | 6 + commons/src/main/res/values/strings.xml | 1158 ++++++ commons/src/main/res/values/styles.xml | 3120 +++++++++++++++++ commons/src/main/res/xml/locale_config.xml | 55 + graphics/app_icon.png | Bin 6149 -> 167892 bytes settings.gradle | 2 + 636 files changed, 89869 insertions(+), 4 deletions(-) create mode 100644 commons/.gitignore create mode 100644 commons/build.gradle create mode 100644 commons/proguard-rules.pro create mode 100644 commons/src/main/AndroidManifest.xml create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSimpleActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSplashActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/CustomizationActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/FAQActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/LicenseActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/activities/ManageBlockedNumbersActivity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerFavoritesAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerItemsAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/ManageBlockedNumbersAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyArrayAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewListAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/PasswordTypesAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/RenameAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/adapters/SimpleListItemAdapter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/asynctasks/CopyMoveTask.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/databases/ContactsDatabase.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AddBlockedNumberDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AppSideloadedDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/BottomSheetChooserDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CallConfirmationDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ChangeDateTimeFormatDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ColorPickerDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationAdvancedDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CreateNewFolderDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CustomIntervalPickerDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/DonateDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportBlockedNumbersDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportSettingsDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FeatureLockedDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FileConflictDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FilePickerDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FolderLockingNoticeDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/LineColorPickerDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppsIconsDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PermissionRequiredDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PropertiesDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PurchaseThankYouDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RadioGroupDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateStarsDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateUsDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemsDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SecurityDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SelectAlarmSoundDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/StoragePickerDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/UpgradeToProDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WhatsNewDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WritePermissionDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-sdk30.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-themes.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/AlertDialog.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Any.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/App.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ArrayList.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Bitmap.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/BufferedWriter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-contacts.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage-sdk30.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-styling.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Cursor.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/DocumentFile.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Drawable.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/EditText.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Editable.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ExifInterface.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/File.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/FileDirItem.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ImageView.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/InputStream.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Int.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/List.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Long.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Point.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/RemoteViews.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Resources.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/SeekBar.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TabLayout.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TextView.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/View.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ViewPager.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/fragments/BaseBottomSheetDialogFragment.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/AlphanumericComparator.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BaseConfig.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersExporter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersImporter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Constants.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ContactsHelper.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Converters.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ExternalStorageProviderHack.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Inlines.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/LocalContactsHelper.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContactsContentProvider.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContentProvider.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContextWrapper.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/SimpleContactsHelper.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/helpers/VcfExporter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ContactsDao.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/CopyMoveListener.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/GroupsDao.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/HashListener.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemMoveCallback.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemTouchHelperContract.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/LineColorPickerListener.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/MyActionModeCallback.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RecyclerScrollCallback.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RefreshRecyclerViewListener.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RenameTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/SecurityTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/StartReorderDragListener.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/AlarmSound.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/Android30RenameFormat.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/BlockedNumber.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/FAQItem.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/FileDirItem.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/LanguageContributor.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/License.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/MyTheme.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/PhoneNumber.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/RadioItem.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/RecyclerViewPayloads.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/Release.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/SharedTheme.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleContact.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleListItem.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Address.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Contact.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/ContactSource.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Email.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Event.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Group.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/IM.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/LocalContact.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Organization.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/PhoneNumberConverter.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/SocialAction.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/overloads/String.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/receivers/SharedThemeReceiver.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/BiometricIdTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/Breadcrumbs.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/ColorPickerSquare.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/FingerprintTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/LineColorPicker.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatCheckbox.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatSpinner.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAutoCompleteTextView.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyButton.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyCompatRadioButton.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyDialogViewPager.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyEditText.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyFloatingActionButton.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyGridLayoutManager.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyLinearLayoutManager.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyRecyclerView.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyScrollView.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MySearchMenu.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MySeekBar.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MySquareImageView.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextInputLayout.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextView.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/MyViewPager.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/PatternTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/PinTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/RenamePatternTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/RenameSimpleTab.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuCallback.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItem.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItemPopup.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuParser.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuPopup.kt create mode 100644 commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuView.kt create mode 100644 commons/src/main/res/anim/item_animation_fall_down.xml create mode 100644 commons/src/main/res/anim/layout_animation.xml create mode 100644 commons/src/main/res/anim/pulsing_animation.xml create mode 100644 commons/src/main/res/anim/shake_pulse_animation.xml create mode 100644 commons/src/main/res/anim/slide_down.xml create mode 100644 commons/src/main/res/drawable-hdpi/img_write_storage.webp create mode 100644 commons/src/main/res/drawable-hdpi/img_write_storage_create_doc_sdk_30.webp create mode 100644 commons/src/main/res/drawable-hdpi/img_write_storage_otg.webp create mode 100644 commons/src/main/res/drawable-hdpi/img_write_storage_sd.webp create mode 100644 commons/src/main/res/drawable-hdpi/img_write_storage_sdk_30.webp create mode 100644 commons/src/main/res/drawable-nodpi/img_color_picker_hue.png create mode 100644 commons/src/main/res/drawable-xhdpi/img_write_storage.webp create mode 100644 commons/src/main/res/drawable-xhdpi/img_write_storage_create_doc_sdk_30.webp create mode 100644 commons/src/main/res/drawable-xhdpi/img_write_storage_otg.webp create mode 100644 commons/src/main/res/drawable-xhdpi/img_write_storage_sd.webp create mode 100644 commons/src/main/res/drawable-xhdpi/img_write_storage_sdk_30.webp create mode 100644 commons/src/main/res/drawable-xxhdpi/img_write_storage.webp create mode 100644 commons/src/main/res/drawable-xxhdpi/img_write_storage_create_doc_sdk_30.webp create mode 100644 commons/src/main/res/drawable-xxhdpi/img_write_storage_otg.webp create mode 100644 commons/src/main/res/drawable-xxhdpi/img_write_storage_sd.webp create mode 100644 commons/src/main/res/drawable-xxhdpi/img_write_storage_sdk_30.webp create mode 100644 commons/src/main/res/drawable-xxxhdpi/img_write_storage.webp create mode 100644 commons/src/main/res/drawable-xxxhdpi/img_write_storage_create_doc_sdk_30.webp create mode 100644 commons/src/main/res/drawable-xxxhdpi/img_write_storage_otg.webp create mode 100644 commons/src/main/res/drawable-xxxhdpi/img_write_storage_sd.webp create mode 100644 commons/src/main/res/drawable-xxxhdpi/img_write_storage_sdk_30.webp create mode 100644 commons/src/main/res/drawable/actionmenu_background.xml create mode 100644 commons/src/main/res/drawable/black_dialog_background.xml create mode 100644 commons/src/main/res/drawable/bottom_sheet_bg.xml create mode 100644 commons/src/main/res/drawable/bottom_sheet_bg_black.xml create mode 100644 commons/src/main/res/drawable/button_background.9.png create mode 100644 commons/src/main/res/drawable/button_background_rounded.xml create mode 100644 commons/src/main/res/drawable/button_background_stroke.xml create mode 100644 commons/src/main/res/drawable/circle_background.xml create mode 100644 commons/src/main/res/drawable/color_picker_circle.xml create mode 100644 commons/src/main/res/drawable/dialog_bg.xml create mode 100644 commons/src/main/res/drawable/dialog_you_background.xml create mode 100644 commons/src/main/res/drawable/divider.xml create mode 100644 commons/src/main/res/drawable/gradient_background.xml create mode 100644 commons/src/main/res/drawable/gradient_background_flipped.xml create mode 100644 commons/src/main/res/drawable/ic_add_person_vector.xml create mode 100644 commons/src/main/res/drawable/ic_arrow_left_vector.xml create mode 100644 commons/src/main/res/drawable/ic_arrow_right_vector.xml create mode 100644 commons/src/main/res/drawable/ic_article_vector.xml create mode 100644 commons/src/main/res/drawable/ic_attach_file_vector.xml create mode 100644 commons/src/main/res/drawable/ic_bell_vector.xml create mode 100644 commons/src/main/res/drawable/ic_block_vector.xml create mode 100644 commons/src/main/res/drawable/ic_business_vector.xml create mode 100644 commons/src/main/res/drawable/ic_camera_vector.xml create mode 100644 commons/src/main/res/drawable/ic_change_view_vector.xml create mode 100644 commons/src/main/res/drawable/ic_check_circle_vector.xml create mode 100644 commons/src/main/res/drawable/ic_check_vector.xml create mode 100644 commons/src/main/res/drawable/ic_chevron_left_vector.xml create mode 100644 commons/src/main/res/drawable/ic_chevron_right_unpadded_vector.xml create mode 100644 commons/src/main/res/drawable/ic_chevron_right_vector.xml create mode 100644 commons/src/main/res/drawable/ic_clear_vector.xml create mode 100644 commons/src/main/res/drawable/ic_clock_filled_vector.xml create mode 100644 commons/src/main/res/drawable/ic_clock_vector.xml create mode 100644 commons/src/main/res/drawable/ic_code_vector.xml create mode 100644 commons/src/main/res/drawable/ic_column_count_vector.xml create mode 100644 commons/src/main/res/drawable/ic_copy_vector.xml create mode 100644 commons/src/main/res/drawable/ic_cross_vector.xml create mode 100644 commons/src/main/res/drawable/ic_delete_vector.xml create mode 100644 commons/src/main/res/drawable/ic_dialpad_vector.xml create mode 100644 commons/src/main/res/drawable/ic_dollar_vector.xml create mode 100644 commons/src/main/res/drawable/ic_drag_handle_vector.xml create mode 100644 commons/src/main/res/drawable/ic_edit_vector.xml create mode 100644 commons/src/main/res/drawable/ic_face_vector.xml create mode 100644 commons/src/main/res/drawable/ic_facebook_vector.xml create mode 100644 commons/src/main/res/drawable/ic_file_aep.xml create mode 100644 commons/src/main/res/drawable/ic_file_ai.xml create mode 100644 commons/src/main/res/drawable/ic_file_avi.xml create mode 100644 commons/src/main/res/drawable/ic_file_css.xml create mode 100644 commons/src/main/res/drawable/ic_file_csv.xml create mode 100644 commons/src/main/res/drawable/ic_file_dbf.xml create mode 100644 commons/src/main/res/drawable/ic_file_doc.xml create mode 100644 commons/src/main/res/drawable/ic_file_dwg.xml create mode 100644 commons/src/main/res/drawable/ic_file_exe.xml create mode 100644 commons/src/main/res/drawable/ic_file_fla.xml create mode 100644 commons/src/main/res/drawable/ic_file_flv.xml create mode 100644 commons/src/main/res/drawable/ic_file_generic.xml create mode 100644 commons/src/main/res/drawable/ic_file_html.xml create mode 100644 commons/src/main/res/drawable/ic_file_ics.xml create mode 100644 commons/src/main/res/drawable/ic_file_indd.xml create mode 100644 commons/src/main/res/drawable/ic_file_iso.xml create mode 100644 commons/src/main/res/drawable/ic_file_jpg.xml create mode 100644 commons/src/main/res/drawable/ic_file_js.xml create mode 100644 commons/src/main/res/drawable/ic_file_json.xml create mode 100644 commons/src/main/res/drawable/ic_file_m4a.xml create mode 100644 commons/src/main/res/drawable/ic_file_mp3.xml create mode 100644 commons/src/main/res/drawable/ic_file_mp4.xml create mode 100644 commons/src/main/res/drawable/ic_file_ogg.xml create mode 100644 commons/src/main/res/drawable/ic_file_pdf.xml create mode 100644 commons/src/main/res/drawable/ic_file_plproj.xml create mode 100644 commons/src/main/res/drawable/ic_file_png.xml create mode 100644 commons/src/main/res/drawable/ic_file_ppt.xml create mode 100644 commons/src/main/res/drawable/ic_file_prproj.xml create mode 100644 commons/src/main/res/drawable/ic_file_psd.xml create mode 100644 commons/src/main/res/drawable/ic_file_rtf.xml create mode 100644 commons/src/main/res/drawable/ic_file_sesx.xml create mode 100644 commons/src/main/res/drawable/ic_file_sql.xml create mode 100644 commons/src/main/res/drawable/ic_file_svg.xml create mode 100644 commons/src/main/res/drawable/ic_file_txt.xml create mode 100644 commons/src/main/res/drawable/ic_file_vcf.xml create mode 100644 commons/src/main/res/drawable/ic_file_wav.xml create mode 100644 commons/src/main/res/drawable/ic_file_wmv.xml create mode 100644 commons/src/main/res/drawable/ic_file_xls.xml create mode 100644 commons/src/main/res/drawable/ic_file_xml.xml create mode 100644 commons/src/main/res/drawable/ic_file_zip.xml create mode 100644 commons/src/main/res/drawable/ic_filter_vector.xml create mode 100644 commons/src/main/res/drawable/ic_fingerprint_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_arabic_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_azerbaijani_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_basque_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_bengali_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_catalan_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_chinese_cn_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_chinese_hk_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_chinese_tw_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_croatian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_czech_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_danish_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_dutch_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_finnish_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_french_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_galician_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_german_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_greek_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_hebrew_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_hindi_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_hungarian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_indonesian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_italian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_japanese_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_korean_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_lithuanian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_nepali_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_norwegian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_persian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_polish_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_portuguese_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_romanian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_russian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_slovak_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_slovenian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_spanish_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_swedish_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_tamil_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_turkish_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_ukrainian_vector.xml create mode 100644 commons/src/main/res/drawable/ic_flag_welsh_vector.xml create mode 100644 commons/src/main/res/drawable/ic_folder_open_vector.xml create mode 100644 commons/src/main/res/drawable/ic_folder_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_folder_vector.xml create mode 100644 commons/src/main/res/drawable/ic_github_vector.xml create mode 100644 commons/src/main/res/drawable/ic_google_play_vector.xml create mode 100644 commons/src/main/res/drawable/ic_group_circle_bg.xml create mode 100644 commons/src/main/res/drawable/ic_heart_vector.xml create mode 100644 commons/src/main/res/drawable/ic_hide_vector.xml create mode 100644 commons/src/main/res/drawable/ic_info_vector.xml create mode 100644 commons/src/main/res/drawable/ic_label_vector.xml create mode 100644 commons/src/main/res/drawable/ic_link_vector.xml create mode 100644 commons/src/main/res/drawable/ic_lock_vector.xml create mode 100644 commons/src/main/res/drawable/ic_mail_vector.xml create mode 100644 commons/src/main/res/drawable/ic_microphone_vector.xml create mode 100644 commons/src/main/res/drawable/ic_minus_circle_vector.xml create mode 100644 commons/src/main/res/drawable/ic_minus_vector.xml create mode 100644 commons/src/main/res/drawable/ic_move_to_bottom_vector.xml create mode 100644 commons/src/main/res/drawable/ic_move_to_top_vector.xml create mode 100644 commons/src/main/res/drawable/ic_move_vector.xml create mode 100644 commons/src/main/res/drawable/ic_next_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_next_vector.xml create mode 100644 commons/src/main/res/drawable/ic_orientation_auto_vector.xml create mode 100644 commons/src/main/res/drawable/ic_orientation_landscape_vector.xml create mode 100644 commons/src/main/res/drawable/ic_orientation_portrait_vector.xml create mode 100644 commons/src/main/res/drawable/ic_pause_crossed_vector.xml create mode 100644 commons/src/main/res/drawable/ic_pause_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_pause_vector.xml create mode 100644 commons/src/main/res/drawable/ic_people_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_people_vector.xml create mode 100644 commons/src/main/res/drawable/ic_person_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_person_vector.xml create mode 100644 commons/src/main/res/drawable/ic_phone_one_vector.xml create mode 100644 commons/src/main/res/drawable/ic_phone_two_vector.xml create mode 100644 commons/src/main/res/drawable/ic_phone_vector.xml create mode 100644 commons/src/main/res/drawable/ic_pin_filled_vector.xml create mode 100644 commons/src/main/res/drawable/ic_pin_vector.xml create mode 100644 commons/src/main/res/drawable/ic_place_vector.xml create mode 100644 commons/src/main/res/drawable/ic_play_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_play_vector.xml create mode 100644 commons/src/main/res/drawable/ic_plus_vector.xml create mode 100644 commons/src/main/res/drawable/ic_prev_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_previous_vector.xml create mode 100644 commons/src/main/res/drawable/ic_print_vector.xml create mode 100644 commons/src/main/res/drawable/ic_question_mark_vector.xml create mode 100644 commons/src/main/res/drawable/ic_reddit_vector.xml create mode 100644 commons/src/main/res/drawable/ic_redo_vector.xml create mode 100644 commons/src/main/res/drawable/ic_rename_vector.xml create mode 100644 commons/src/main/res/drawable/ic_reset_vector.xml create mode 100644 commons/src/main/res/drawable/ic_save_vector.xml create mode 100644 commons/src/main/res/drawable/ic_sd_card_vector.xml create mode 100644 commons/src/main/res/drawable/ic_search_vector.xml create mode 100644 commons/src/main/res/drawable/ic_select_all_vector.xml create mode 100644 commons/src/main/res/drawable/ic_send_vector.xml create mode 100644 commons/src/main/res/drawable/ic_set_as_vector.xml create mode 100644 commons/src/main/res/drawable/ic_settings_cog_vector.xml create mode 100644 commons/src/main/res/drawable/ic_share_vector.xml create mode 100644 commons/src/main/res/drawable/ic_sim_vector.xml create mode 100644 commons/src/main/res/drawable/ic_simple_phone_vector.xml create mode 100644 commons/src/main/res/drawable/ic_sms_vector.xml create mode 100644 commons/src/main/res/drawable/ic_snooze_vector.xml create mode 100644 commons/src/main/res/drawable/ic_sort_vector.xml create mode 100644 commons/src/main/res/drawable/ic_star_outline_vector.xml create mode 100644 commons/src/main/res/drawable/ic_star_vector.xml create mode 100644 commons/src/main/res/drawable/ic_stop_vector.xml create mode 100644 commons/src/main/res/drawable/ic_telegram_vector.xml create mode 100644 commons/src/main/res/drawable/ic_three_dots_vector.xml create mode 100644 commons/src/main/res/drawable/ic_undo_vector.xml create mode 100644 commons/src/main/res/drawable/ic_unhide_vector.xml create mode 100644 commons/src/main/res/drawable/ic_usb_vector.xml create mode 100644 commons/src/main/res/drawable/ic_vibrate_vector.xml create mode 100644 commons/src/main/res/drawable/ic_view_contact_details_vector.xml create mode 100644 commons/src/main/res/drawable/pill_background.xml create mode 100644 commons/src/main/res/drawable/popup_menu_bg_you.xml create mode 100644 commons/src/main/res/drawable/ripple_all_corners.xml create mode 100644 commons/src/main/res/drawable/ripple_background.xml create mode 100644 commons/src/main/res/drawable/ripple_bottom_corners.xml create mode 100644 commons/src/main/res/drawable/ripple_top_corners.xml create mode 100644 commons/src/main/res/drawable/search_menu_background.xml create mode 100644 commons/src/main/res/drawable/section_holder_stroke.xml create mode 100644 commons/src/main/res/drawable/selector.xml create mode 100644 commons/src/main/res/drawable/shortcut_plus.xml create mode 100644 commons/src/main/res/drawable/top_popup_menu_bg_dark.xml create mode 100644 commons/src/main/res/drawable/top_popup_menu_bg_light.xml create mode 100644 commons/src/main/res/drawable/transparent_button.xml create mode 100644 commons/src/main/res/drawable/transparent_button_pressed.xml create mode 100644 commons/src/main/res/drawable/widget_config_seekbar_background.xml create mode 100644 commons/src/main/res/drawable/widget_round_background.xml create mode 100644 commons/src/main/res/layout/actionbar_title.xml create mode 100644 commons/src/main/res/layout/activity_about.xml create mode 100644 commons/src/main/res/layout/activity_contributors.xml create mode 100644 commons/src/main/res/layout/activity_customization.xml create mode 100644 commons/src/main/res/layout/activity_faq.xml create mode 100644 commons/src/main/res/layout/activity_license.xml create mode 100644 commons/src/main/res/layout/activity_manage_blocked_numbers.xml create mode 100644 commons/src/main/res/layout/bottom_tablayout_item.xml create mode 100644 commons/src/main/res/layout/dialog_add_blocked_number.xml create mode 100644 commons/src/main/res/layout/dialog_bottom_sheet.xml create mode 100644 commons/src/main/res/layout/dialog_call_confirmation.xml create mode 100644 commons/src/main/res/layout/dialog_change_date_time_format.xml create mode 100644 commons/src/main/res/layout/dialog_color_picker.xml create mode 100644 commons/src/main/res/layout/dialog_create_new_folder.xml create mode 100644 commons/src/main/res/layout/dialog_custom_interval_picker.xml create mode 100644 commons/src/main/res/layout/dialog_donate.xml create mode 100644 commons/src/main/res/layout/dialog_export_blocked_numbers.xml create mode 100644 commons/src/main/res/layout/dialog_export_settings.xml create mode 100644 commons/src/main/res/layout/dialog_feature_locked.xml create mode 100644 commons/src/main/res/layout/dialog_file_conflict.xml create mode 100644 commons/src/main/res/layout/dialog_filepicker.xml create mode 100644 commons/src/main/res/layout/dialog_line_color_picker.xml create mode 100644 commons/src/main/res/layout/dialog_message.xml create mode 100644 commons/src/main/res/layout/dialog_new_apps_icons.xml create mode 100644 commons/src/main/res/layout/dialog_properties.xml create mode 100644 commons/src/main/res/layout/dialog_purchase_thank_you.xml create mode 100644 commons/src/main/res/layout/dialog_radio_group.xml create mode 100644 commons/src/main/res/layout/dialog_rate_stars.xml create mode 100644 commons/src/main/res/layout/dialog_rename.xml create mode 100644 commons/src/main/res/layout/dialog_rename_item.xml create mode 100644 commons/src/main/res/layout/dialog_rename_items.xml create mode 100644 commons/src/main/res/layout/dialog_rename_items_pattern.xml create mode 100644 commons/src/main/res/layout/dialog_security.xml create mode 100644 commons/src/main/res/layout/dialog_select_alarm_sound.xml create mode 100644 commons/src/main/res/layout/dialog_textview.xml create mode 100644 commons/src/main/res/layout/dialog_title.xml create mode 100644 commons/src/main/res/layout/dialog_upgrade_to_pro.xml create mode 100644 commons/src/main/res/layout/dialog_whats_new.xml create mode 100644 commons/src/main/res/layout/dialog_write_permission.xml create mode 100644 commons/src/main/res/layout/dialog_write_permission_otg.xml create mode 100644 commons/src/main/res/layout/divider.xml create mode 100644 commons/src/main/res/layout/empty_image_view.xml create mode 100644 commons/src/main/res/layout/filepicker_favorite.xml create mode 100644 commons/src/main/res/layout/item_about.xml create mode 100644 commons/src/main/res/layout/item_action_mode.xml create mode 100644 commons/src/main/res/layout/item_action_mode_popup.xml create mode 100644 commons/src/main/res/layout/item_breadcrumb.xml create mode 100644 commons/src/main/res/layout/item_breadcrumb_first.xml create mode 100644 commons/src/main/res/layout/item_contact_with_number.xml create mode 100644 commons/src/main/res/layout/item_contact_without_number.xml create mode 100644 commons/src/main/res/layout/item_faq.xml create mode 100644 commons/src/main/res/layout/item_filepicker_list.xml create mode 100644 commons/src/main/res/layout/item_language_contributor.xml create mode 100644 commons/src/main/res/layout/item_license.xml create mode 100644 commons/src/main/res/layout/item_manage_blocked_number.xml create mode 100644 commons/src/main/res/layout/item_property.xml create mode 100644 commons/src/main/res/layout/item_select_alarm_sound.xml create mode 100644 commons/src/main/res/layout/item_simple_list.xml create mode 100644 commons/src/main/res/layout/menu_search.xml create mode 100644 commons/src/main/res/layout/radio_button.xml create mode 100644 commons/src/main/res/layout/search_bar.xml create mode 100644 commons/src/main/res/layout/tab_biometric_id.xml create mode 100644 commons/src/main/res/layout/tab_fingerprint.xml create mode 100644 commons/src/main/res/layout/tab_pattern.xml create mode 100644 commons/src/main/res/layout/tab_pin.xml create mode 100644 commons/src/main/res/layout/tab_rename_pattern.xml create mode 100644 commons/src/main/res/layout/tab_rename_simple.xml create mode 100644 commons/src/main/res/menu/cab_blocked_numbers.xml create mode 100644 commons/src/main/res/menu/cab_delete_only.xml create mode 100644 commons/src/main/res/menu/cab_remove_only.xml create mode 100644 commons/src/main/res/menu/menu_add_blocked_number.xml create mode 100644 commons/src/main/res/menu/menu_customization.xml create mode 100644 commons/src/main/res/mipmap-hdpi/ic_app_launcher.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_calculator.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_calendar.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_camera.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_clock.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_contacts.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_dialer.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_draw.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_file_manager.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_flashlight.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_gallery.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_keyboard.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_music_player.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_notes.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_simple_launcher.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_sms_messenger.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_thank_you.png create mode 100644 commons/src/main/res/mipmap-hdpi/ic_voice_recorder.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_app_launcher.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_calculator.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_calendar.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_camera.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_clock.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_contacts.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_dialer.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_draw.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_file_manager.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_flashlight.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_gallery.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_keyboard.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_music_player.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_notes.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_simple_launcher.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_sms_messenger.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_thank_you.png create mode 100644 commons/src/main/res/mipmap-xhdpi/ic_voice_recorder.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_app_launcher.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_calculator.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_calendar.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_camera.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_clock.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_contacts.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_dialer.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_draw.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_file_manager.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_flashlight.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_gallery.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_keyboard.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_music_player.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_notes.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_simple_launcher.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_sms_messenger.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_thank_you.png create mode 100644 commons/src/main/res/mipmap-xxhdpi/ic_voice_recorder.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_app_launcher.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_calculator.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_calendar.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_camera.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_clock.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_contacts.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_dialer.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_draw.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_file_manager.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_flashlight.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_gallery.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_keyboard.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_music_player.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_notes.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_simple_launcher.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_sms_messenger.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_thank_you.png create mode 100644 commons/src/main/res/mipmap-xxxhdpi/ic_voice_recorder.png create mode 100644 commons/src/main/res/values-ar/strings.xml create mode 100644 commons/src/main/res/values-az/strings.xml create mode 100644 commons/src/main/res/values-be/strings.xml create mode 100644 commons/src/main/res/values-bg/strings.xml create mode 100644 commons/src/main/res/values-bn/strings.xml create mode 100644 commons/src/main/res/values-br/strings.xml create mode 100644 commons/src/main/res/values-ca/strings.xml create mode 100644 commons/src/main/res/values-cs/strings.xml create mode 100644 commons/src/main/res/values-cy/strings.xml create mode 100644 commons/src/main/res/values-da/strings.xml create mode 100644 commons/src/main/res/values-de/strings.xml create mode 100644 commons/src/main/res/values-el/strings.xml create mode 100644 commons/src/main/res/values-eo/strings.xml create mode 100644 commons/src/main/res/values-es/strings.xml create mode 100644 commons/src/main/res/values-et/strings.xml create mode 100644 commons/src/main/res/values-eu/strings.xml create mode 100644 commons/src/main/res/values-fa/strings.xml create mode 100644 commons/src/main/res/values-fi/strings.xml create mode 100644 commons/src/main/res/values-fr/strings.xml create mode 100644 commons/src/main/res/values-gl/strings.xml create mode 100644 commons/src/main/res/values-hi-rIN/strings.xml create mode 100644 commons/src/main/res/values-hr/strings.xml create mode 100644 commons/src/main/res/values-hu/strings.xml create mode 100644 commons/src/main/res/values-in/strings.xml create mode 100644 commons/src/main/res/values-it/strings.xml create mode 100644 commons/src/main/res/values-iw/strings.xml create mode 100644 commons/src/main/res/values-ja/strings.xml create mode 100644 commons/src/main/res/values-ko-rKR/strings.xml create mode 100644 commons/src/main/res/values-lt/strings.xml create mode 100644 commons/src/main/res/values-ml/strings.xml create mode 100644 commons/src/main/res/values-nb-rNO/strings.xml create mode 100644 commons/src/main/res/values-night-v31/colors.xml create mode 100644 commons/src/main/res/values-nl/strings.xml create mode 100644 commons/src/main/res/values-pa-rPK/strings.xml create mode 100644 commons/src/main/res/values-pa/strings.xml create mode 100644 commons/src/main/res/values-pl/strings.xml create mode 100644 commons/src/main/res/values-pt-rBR/strings.xml create mode 100644 commons/src/main/res/values-pt/strings.xml create mode 100644 commons/src/main/res/values-ro/strings.xml create mode 100644 commons/src/main/res/values-ru/strings.xml create mode 100644 commons/src/main/res/values-sk/strings.xml create mode 100644 commons/src/main/res/values-sl/strings.xml create mode 100644 commons/src/main/res/values-sr/strings.xml create mode 100644 commons/src/main/res/values-sv/strings.xml create mode 100644 commons/src/main/res/values-sw600dp/dimens.xml create mode 100644 commons/src/main/res/values-ta/strings.xml create mode 100644 commons/src/main/res/values-th/strings.xml create mode 100644 commons/src/main/res/values-tr/strings.xml create mode 100644 commons/src/main/res/values-uk/strings.xml create mode 100644 commons/src/main/res/values-v31/colors.xml create mode 100644 commons/src/main/res/values-vi/strings.xml create mode 100644 commons/src/main/res/values-zh-rCN/strings.xml create mode 100644 commons/src/main/res/values-zh-rHK/strings.xml create mode 100644 commons/src/main/res/values-zh-rTW/strings.xml create mode 100644 commons/src/main/res/values/arrays.xml create mode 100644 commons/src/main/res/values/attrs.xml create mode 100644 commons/src/main/res/values/bools.xml create mode 100644 commons/src/main/res/values/colors.xml create mode 100644 commons/src/main/res/values/dimens.xml create mode 100644 commons/src/main/res/values/donottranslate.xml create mode 100644 commons/src/main/res/values/ids.xml create mode 100644 commons/src/main/res/values/integers.xml create mode 100644 commons/src/main/res/values/strings.xml create mode 100644 commons/src/main/res/values/styles.xml create mode 100644 commons/src/main/res/xml/locale_config.xml diff --git a/app/build.gradle b/app/build.gradle index bf0e3a5a4..dc87f44db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,10 +13,10 @@ android { compileSdkVersion 33 defaultConfig { - applicationId "com.simplemobiletools.gallery.pro" + applicationId "com.gallery.raw" minSdkVersion 24 targetSdkVersion 33 - versionCode 388 + versionCode 389 versionName "6.26.7" setProperty("archivesBaseName", "gallery-$versionCode") vectorDrawables.useSupportLibrary = true @@ -84,7 +84,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:925e7f9bd7' +// implementation 'com.github.SimpleMobileTools:Simple-Commons:925e7f9bd7' implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0' implementation 'androidx.exifinterface:exifinterface:1.3.6' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.24' @@ -106,6 +106,7 @@ dependencies { } compileOnly 'com.squareup.okhttp3:okhttp:4.9.0' implementation project(path: ':libraw') + implementation project(path: ':commons') kapt 'com.github.bumptech.glide:compiler:4.13.2' kapt 'androidx.room:room-compiler:2.4.3' diff --git a/app/src/proprietary/AndroidManifest.xml b/app/src/proprietary/AndroidManifest.xml index 965ff4d64..98e2ba1a5 100644 --- a/app/src/proprietary/AndroidManifest.xml +++ b/app/src/proprietary/AndroidManifest.xml @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt new file mode 100644 index 000000000..be276f2d5 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/AboutActivity.kt @@ -0,0 +1,431 @@ +package com.simplemobiletools.commons.activities + +import android.content.ActivityNotFoundException +import android.content.Intent +import android.content.Intent.* +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.view.LayoutInflater +import android.view.View +import androidx.core.net.toUri +import androidx.core.view.isEmpty +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog +import com.simplemobiletools.commons.dialogs.RateStarsDialog +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.FAQItem +import kotlinx.android.synthetic.main.activity_about.* +import kotlinx.android.synthetic.main.item_about.view.* + +class AboutActivity : BaseSimpleActivity() { + private var appName = "" + private var primaryColor = 0 + private var textColor = 0 + private var backgroundColor = 0 + private var inflater: LayoutInflater? = null + + private var firstVersionClickTS = 0L + private var clicksSinceFirstClick = 0 + private val EASTER_EGG_TIME_LIMIT = 3000L + private val EASTER_EGG_REQUIRED_CLICKS = 7 + + override fun getAppIconIDs() = intent.getIntegerArrayListExtra(APP_ICON_IDS) ?: ArrayList() + + override fun getAppLauncherName() = intent.getStringExtra(APP_LAUNCHER_NAME) ?: "" + + override fun onCreate(savedInstanceState: Bundle?) { + isMaterialActivity = true + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_about) + + primaryColor = getProperPrimaryColor() + textColor = getProperTextColor() + backgroundColor = getProperBackgroundColor() + inflater = LayoutInflater.from(this) + + updateMaterialActivityViews(about_coordinator, about_holder, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(about_nested_scrollview, about_toolbar) + + appName = intent.getStringExtra(APP_NAME) ?: "" + + } + + override fun onResume() { + super.onResume() + updateTextColors(about_nested_scrollview) + setupToolbar(about_toolbar, NavigationIcon.Arrow) + + about_support_layout.removeAllViews() + about_social_layout.removeAllViews() + about_other_layout.removeAllViews() + + setupEmail() + setupRateUs() + setupInvite() + setupContributors() + setupDonate() + setupGitHub() + setupReddit() + setupTelegram() + setupMoreApps() + setupWebsite() + setupPrivacyPolicy() + setupLicense() + setupVersion() + } + + private fun setupFAQ() { + val faqItems = intent.getSerializableExtra(APP_FAQ) as ArrayList + if (faqItems.isNotEmpty()) { + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_question_mark_vector, R.string.frequently_asked_questions) + about_support_layout.addView(this) + + setOnClickListener { + launchFAQActivity() + } + } + } + } + + private fun launchFAQActivity() { + val faqItems = intent.getSerializableExtra(APP_FAQ) as ArrayList + Intent(applicationContext, FAQActivity::class.java).apply { + putExtra(APP_ICON_IDS, getAppIconIDs()) + putExtra(APP_LAUNCHER_NAME, getAppLauncherName()) + putExtra(APP_FAQ, faqItems) + startActivity(this) + } + } + + private fun setupEmail() { + if (resources.getBoolean(R.bool.hide_all_external_links)) { + if (about_support_layout.isEmpty()) { + about_support.beGone() + about_support_divider.beGone() + } + + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_mail_vector, R.string.my_email) + about_support_layout.addView(this) + + setOnClickListener { + val msg = "${getString(R.string.before_asking_question_read_faq)}\n\n${getString(R.string.make_sure_latest)}" + if (intent.getBooleanExtra(SHOW_FAQ_BEFORE_MAIL, false) && !baseConfig.wasBeforeAskingShown) { + baseConfig.wasBeforeAskingShown = true + ConfirmationAdvancedDialog(this@AboutActivity, msg, 0, R.string.read_faq, R.string.skip) { success -> + if (success) { + launchFAQActivity() + } else { + launchEmailIntent() + } + } + } else { + launchEmailIntent() + } + } + } + } + + private fun launchEmailIntent() { + val appVersion = String.format(getString(R.string.app_version, intent.getStringExtra(APP_VERSION_NAME))) + val deviceOS = String.format(getString(R.string.device_os), Build.VERSION.RELEASE) + val newline = "\n" + val separator = "------------------------------" + val body = "$appVersion$newline$deviceOS$newline$separator$newline$newline" + + val address = if (packageName.startsWith("com.simplemobiletools")) { + getString(R.string.my_email) + } else { + getString(R.string.my_fake_email) + } + + val selectorIntent = Intent(ACTION_SENDTO) + .setData("mailto:$address".toUri()) + val emailIntent = Intent(ACTION_SEND).apply { + putExtra(EXTRA_EMAIL, arrayOf(address)) + putExtra(EXTRA_SUBJECT, appName) + putExtra(EXTRA_TEXT, body) + selector = selectorIntent + } + + try { + startActivity(emailIntent) + } catch (e: ActivityNotFoundException) { + val chooser = createChooser(emailIntent, getString(R.string.send_email)) + try { + startActivity(chooser) + } catch (e: Exception) { + toast(R.string.no_email_client_found) + } + } catch (e: Exception) { + showErrorToast(e) + } + } + + private fun setupRateUs() { + if (resources.getBoolean(R.bool.hide_google_relations) || resources.getBoolean(R.bool.hide_all_external_links)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_star_vector, R.string.rate_us) + + setOnClickListener { + if (baseConfig.wasBeforeRateShown) { + launchRateUsPrompt() + } else { + baseConfig.wasBeforeRateShown = true + val msg = "${getString(R.string.before_rate_read_faq)}\n\n${getString(R.string.make_sure_latest)}" + ConfirmationAdvancedDialog(this@AboutActivity, msg, 0, R.string.read_faq, R.string.skip) { success -> + if (success) { + launchFAQActivity() + } else { + launchRateUsPrompt() + } + } + } + } + } + } + + private fun launchRateUsPrompt() { + if (baseConfig.wasAppRated) { + redirectToRateUs() + } else { + RateStarsDialog(this@AboutActivity) + } + } + + private fun setupInvite() { + if (resources.getBoolean(R.bool.hide_google_relations) || resources.getBoolean(R.bool.hide_all_external_links)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_add_person_vector, R.string.invite_friends) + + setOnClickListener { + val text = String.format(getString(R.string.share_text), appName, getStoreUrl()) + Intent().apply { + action = ACTION_SEND + putExtra(EXTRA_SUBJECT, appName) + putExtra(EXTRA_TEXT, text) + type = "text/plain" + startActivity(createChooser(this, getString(R.string.invite_via))) + } + } + } + } + + private fun setupContributors() { + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_face_vector, R.string.contributors) + + setOnClickListener { + val intent = Intent(applicationContext, ContributorsActivity::class.java) + startActivity(intent) + } + } + } + + private fun setupDonate() { + if (resources.getBoolean(R.bool.show_donate_in_about) && !resources.getBoolean(R.bool.hide_all_external_links)) { + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_dollar_vector, R.string.donate) + + setOnClickListener { + launchViewIntent(getString(R.string.donate_url)) + } + } + } + } + + private fun setupFacebook() { + if (resources.getBoolean(R.bool.hide_all_external_links)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + about_item_icon.setImageResource(R.drawable.ic_facebook_vector) + about_item_label.setText(R.string.facebook) + about_item_label.setTextColor(textColor) + about_social_layout.addView(this) + + setOnClickListener { + var link = "https://www.facebook.com/simplemobiletools" + try { + packageManager.getPackageInfo("com.facebook.katana", 0) + link = "fb://page/150270895341774" + } catch (ignored: Exception) { + } + + launchViewIntent(link) + } + } + } + + private fun setupGitHub() { + if (resources.getBoolean(R.bool.hide_all_external_links)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + about_item_icon.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_github_vector, backgroundColor.getContrastColor())) + about_item_label.setText(R.string.github) + about_item_label.setTextColor(textColor) + about_social_layout.addView(this) + + setOnClickListener { + launchViewIntent("https://github.com/RikardoMexican/GalleryRAW") + } + } + } + + private fun setupReddit() { + if (resources.getBoolean(R.bool.hide_all_external_links)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + about_item_icon.setImageResource(R.drawable.ic_reddit_vector) + about_item_label.setText(R.string.reddit) + about_item_label.setTextColor(textColor) + about_social_layout.addView(this) + + setOnClickListener { + launchViewIntent("https://www.reddit.com/r/GalleryRAW/") + } + } + } + + private fun setupTelegram() { + if (resources.getBoolean(R.bool.hide_all_external_links)) { + if (about_social_layout.isEmpty()) { + about_social.beGone() + about_social_divider.beGone() + } + + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + about_item_icon.setImageResource(R.drawable.ic_telegram_vector) + about_item_label.setText(R.string.telegram) + about_item_label.setTextColor(textColor) + about_social_layout.addView(this) + + setOnClickListener { + launchViewIntent("https://t.me/GalleryRAW") + } + } + } + + private fun setupMoreApps() { + if (resources.getBoolean(R.bool.hide_google_relations)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_heart_vector, R.string.more_apps_from_us) + about_other_layout.addView(this) + + setOnClickListener { + launchMoreAppsFromUsIntent() + } + } + } + + private fun setupWebsite() { + if (!resources.getBoolean(R.bool.show_donate_in_about) || resources.getBoolean(R.bool.hide_all_external_links)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_link_vector, R.string.website) + about_other_layout.addView(this) + + setOnClickListener { + launchViewIntent("https://gallery-raw.webflow.io/") + } + } + } + + private fun setupPrivacyPolicy() { + if (resources.getBoolean(R.bool.hide_all_external_links)) { + return + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_unhide_vector, R.string.privacy_policy) + about_other_layout.addView(this) + + setOnClickListener { + val appId = baseConfig.appId.removeSuffix(".debug").removeSuffix(".pro").removePrefix("com.simplemobiletools.") + val url = "https://simplemobiletools.com/privacy/$appId.txt" + launchViewIntent(url) + } + } + } + + private fun setupLicense() { + inflater?.inflate(R.layout.item_about, null)?.apply { + setupAboutItem(this, R.drawable.ic_article_vector, R.string.third_party_licences) + about_other_layout.addView(this) + + setOnClickListener { + Intent(applicationContext, LicenseActivity::class.java).apply { + putExtra(APP_ICON_IDS, getAppIconIDs()) + putExtra(APP_LAUNCHER_NAME, getAppLauncherName()) + putExtra(APP_LICENSES, intent.getLongExtra(APP_LICENSES, 0)) + startActivity(this) + } + } + } + } + + private fun setupVersion() { + var version = intent.getStringExtra(APP_VERSION_NAME) ?: "" + if (baseConfig.appId.removeSuffix(".debug").endsWith(".pro")) { + version += " ${getString(R.string.pro)}" + } + + inflater?.inflate(R.layout.item_about, null)?.apply { + about_item_icon.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_info_vector, textColor)) + val fullVersion = String.format(getString(R.string.version_placeholder, version)) + about_item_label.text = fullVersion + about_item_label.setTextColor(textColor) + about_other_layout.addView(this) + + setOnClickListener { + if (firstVersionClickTS == 0L) { + firstVersionClickTS = System.currentTimeMillis() + Handler().postDelayed({ + firstVersionClickTS = 0L + clicksSinceFirstClick = 0 + }, EASTER_EGG_TIME_LIMIT) + } + + clicksSinceFirstClick++ + if (clicksSinceFirstClick >= EASTER_EGG_REQUIRED_CLICKS) { + toast(R.string.hello) + firstVersionClickTS = 0L + clicksSinceFirstClick = 0 + } + } + } + } + + private fun setupAboutItem(view: View, drawableId: Int, textId: Int) { + view.apply { + about_item_icon.setImageDrawable(resources.getColoredDrawableWithColor(drawableId, textColor)) + about_item_label.setText(textId) + about_item_label.setTextColor(textColor) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSimpleActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSimpleActivity.kt new file mode 100644 index 000000000..7bce7e959 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSimpleActivity.kt @@ -0,0 +1,1180 @@ +package com.simplemobiletools.commons.activities + +import android.animation.ArgbEvaluator +import android.animation.ValueAnimator +import android.annotation.SuppressLint +import android.app.Activity +import android.app.ActivityManager +import android.app.RecoverableSecurityException +import android.app.role.RoleManager +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.content.res.Configuration +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.PorterDuff +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.provider.Settings +import android.telecom.TelecomManager +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.WindowManager +import android.widget.EditText +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.Toast +import androidx.annotation.RequiresApi +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.app.ActivityCompat +import androidx.core.util.Pair +import androidx.core.view.ScrollingView +import androidx.core.view.WindowInsetsCompat +import androidx.core.widget.NestedScrollView +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.asynctasks.CopyMoveTask +import com.simplemobiletools.commons.dialogs.* +import com.simplemobiletools.commons.dialogs.WritePermissionDialog.Mode +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.interfaces.CopyMoveListener +import com.simplemobiletools.commons.models.FAQItem +import com.simplemobiletools.commons.models.FileDirItem +import java.io.File +import java.io.OutputStream +import java.util.regex.Pattern + +abstract class BaseSimpleActivity : AppCompatActivity() { + var materialScrollColorAnimation: ValueAnimator? = null + var copyMoveCallback: ((destinationPath: String) -> Unit)? = null + var actionOnPermission: ((granted: Boolean) -> Unit)? = null + var isAskingPermissions = false + var useDynamicTheme = true + var showTransparentTop = false + var isMaterialActivity = false // by material activity we mean translucent navigation bar and opaque status and action bars + var checkedDocumentPath = "" + var currentScrollY = 0 + var configItemsToExport = LinkedHashMap() + + private var mainCoordinatorLayout: CoordinatorLayout? = null + private var nestedView: View? = null + private var scrollingView: ScrollingView? = null + private var toolbar: Toolbar? = null + private var useTransparentNavigation = false + private var useTopSearchMenu = false + private val GENERIC_PERM_HANDLER = 100 + private val DELETE_FILE_SDK_30_HANDLER = 300 + private val RECOVERABLE_SECURITY_HANDLER = 301 + private val UPDATE_FILE_SDK_30_HANDLER = 302 + private val MANAGE_MEDIA_RC = 303 + + companion object { + var funAfterSAFPermission: ((success: Boolean) -> Unit)? = null + var funAfterSdk30Action: ((success: Boolean) -> Unit)? = null + var funAfterUpdate30File: ((success: Boolean) -> Unit)? = null + var funRecoverableSecurity: ((success: Boolean) -> Unit)? = null + var funAfterManageMediaPermission: (() -> Unit)? = null + } + + abstract fun getAppIconIDs(): ArrayList + + abstract fun getAppLauncherName(): String + + override fun onCreate(savedInstanceState: Bundle?) { + if (useDynamicTheme) { + setTheme(getThemeId(showTransparentTop = showTransparentTop)) + } + + super.onCreate(savedInstanceState) + if (!packageName.startsWith("com.simplemobiletools.", true)) { + if ((0..50).random() == 10 || baseConfig.appRunCount % 100 == 0) { + val label = "You are using a fake version of the app. For your own safety download the original one from www.simplemobiletools.com. Thanks" + ConfirmationDialog(this, label, positive = R.string.ok, negative = 0) { + launchViewIntent("https://play.google.com/store/apps/dev?id=9070296388022589266") + } + } + } + } + + @SuppressLint("NewApi") + override fun onResume() { + super.onResume() + if (useDynamicTheme) { + setTheme(getThemeId(showTransparentTop = showTransparentTop)) + + val backgroundColor = if (baseConfig.isUsingSystemTheme) { + resources.getColor(R.color.you_background_color, theme) + } else { + baseConfig.backgroundColor + } + + updateBackgroundColor(backgroundColor) + } + + if (showTransparentTop) { + window.statusBarColor = Color.TRANSPARENT + } else if (!isMaterialActivity) { + val color = if (baseConfig.isUsingSystemTheme) { + resources.getColor(R.color.you_status_bar_color) + } else { + getProperStatusBarColor() + } + + updateActionbarColor(color) + } + + updateRecentsAppIcon() + + var navBarColor = getProperBackgroundColor() + if (isMaterialActivity) { + navBarColor = navBarColor.adjustAlpha(HIGHER_ALPHA) + } + + updateNavigationBarColor(navBarColor) + } + + override fun onDestroy() { + super.onDestroy() + funAfterSAFPermission = null + actionOnPermission = null + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + handleNavigationAndScrolling() + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + hideKeyboard() + finish() + } + + else -> return super.onOptionsItemSelected(item) + } + return true + } + + override fun attachBaseContext(newBase: Context) { + if (newBase.baseConfig.useEnglish && !isTiramisuPlus()) { + super.attachBaseContext(MyContextWrapper(newBase).wrap(newBase, "en")) + } else { + super.attachBaseContext(newBase) + } + } + + fun updateBackgroundColor(color: Int = baseConfig.backgroundColor) { + window.decorView.setBackgroundColor(color) + } + + fun updateStatusbarColor(color: Int) { + window.statusBarColor = color + + if (color.getContrastColor() == DARK_GREY) { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility.addBit(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) + } else { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility.removeBit(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) + } + } + + fun updateActionbarColor(color: Int = getProperStatusBarColor()) { + updateStatusbarColor(color) + setTaskDescription(ActivityManager.TaskDescription(null, null, color)) + } + + fun updateNavigationBarColor(color: Int) { + window.navigationBarColor = color + updateNavigationBarButtons(color) + } + + fun updateNavigationBarButtons(color: Int) { + if (isOreoPlus()) { + if (color.getContrastColor() == DARK_GREY) { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility.addBit(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) + } else { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility.removeBit(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) + } + } + } + + // use translucent navigation bar, set the background color to action and status bars + fun updateMaterialActivityViews( + mainCoordinatorLayout: CoordinatorLayout?, + nestedView: View?, + useTransparentNavigation: Boolean, + useTopSearchMenu: Boolean, + ) { + this.mainCoordinatorLayout = mainCoordinatorLayout + this.nestedView = nestedView + this.useTransparentNavigation = useTransparentNavigation + this.useTopSearchMenu = useTopSearchMenu + handleNavigationAndScrolling() + + val backgroundColor = getProperBackgroundColor() + updateStatusbarColor(backgroundColor) + updateActionbarColor(backgroundColor) + } + + private fun handleNavigationAndScrolling() { + if (useTransparentNavigation) { + if (navigationBarHeight > 0 || isUsingGestureNavigation()) { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility.addBit(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) + updateTopBottomInsets(statusBarHeight, navigationBarHeight) + // Don't touch this. Window Inset API often has a domino effect and things will most likely break. + onApplyWindowInsets { + val insets = it.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()) + updateTopBottomInsets(insets.top, insets.bottom) + } + } else { + window.decorView.systemUiVisibility = window.decorView.systemUiVisibility.removeBit(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) + updateTopBottomInsets(0, 0) + } + } + } + + private fun updateTopBottomInsets(top: Int, bottom: Int) { + nestedView?.run { + setPadding(paddingLeft, paddingTop, paddingRight, bottom) + } + (mainCoordinatorLayout?.layoutParams as? FrameLayout.LayoutParams)?.topMargin = top + } + + // colorize the top toolbar and statusbar at scrolling down a bit + fun setupMaterialScrollListener(scrollingView: ScrollingView?, toolbar: Toolbar) { + this.scrollingView = scrollingView + this.toolbar = toolbar + if (scrollingView is RecyclerView) { + scrollingView.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> + val newScrollY = scrollingView.computeVerticalScrollOffset() + scrollingChanged(newScrollY, currentScrollY) + currentScrollY = newScrollY + } + } else if (scrollingView is NestedScrollView) { + scrollingView.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> + scrollingChanged(scrollY, oldScrollY) + } + } + } + + private fun scrollingChanged(newScrollY: Int, oldScrollY: Int) { + if (newScrollY > 0 && oldScrollY == 0) { + val colorFrom = window.statusBarColor + val colorTo = getColoredMaterialStatusBarColor() + animateTopBarColors(colorFrom, colorTo) + } else if (newScrollY == 0 && oldScrollY > 0) { + val colorFrom = window.statusBarColor + val colorTo = getRequiredStatusBarColor() + animateTopBarColors(colorFrom, colorTo) + } + } + + fun animateTopBarColors(colorFrom: Int, colorTo: Int) { + if (toolbar == null) { + return + } + + materialScrollColorAnimation?.end() + materialScrollColorAnimation = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo) + materialScrollColorAnimation!!.addUpdateListener { animator -> + val color = animator.animatedValue as Int + if (toolbar != null) { + updateTopBarColors(toolbar!!, color) + } + } + + materialScrollColorAnimation!!.start() + } + + fun getRequiredStatusBarColor(): Int { + return if ((scrollingView is RecyclerView || scrollingView is NestedScrollView) && scrollingView?.computeVerticalScrollOffset() == 0) { + getProperBackgroundColor() + } else { + getColoredMaterialStatusBarColor() + } + } + + fun updateTopBarColors(toolbar: Toolbar, color: Int) { + val contrastColor = if (useTopSearchMenu) { + getProperBackgroundColor().getContrastColor() + } else { + color.getContrastColor() + } + + if (!useTopSearchMenu) { + updateStatusbarColor(color) + toolbar.setBackgroundColor(color) + toolbar.setTitleTextColor(contrastColor) + toolbar.navigationIcon?.applyColorFilter(contrastColor) + toolbar.collapseIcon = resources.getColoredDrawableWithColor(R.drawable.ic_arrow_left_vector, contrastColor) + } + + toolbar.overflowIcon = resources.getColoredDrawableWithColor(R.drawable.ic_three_dots_vector, contrastColor) + + val menu = toolbar.menu + for (i in 0 until menu.size()) { + try { + menu.getItem(i)?.icon?.setTint(contrastColor) + } catch (ignored: Exception) { + } + } + } + + fun updateStatusBarOnPageChange() { + if (scrollingView is RecyclerView || scrollingView is NestedScrollView) { + val scrollY = scrollingView!!.computeVerticalScrollOffset() + val colorFrom = window.statusBarColor + val colorTo = if (scrollY > 0) { + getColoredMaterialStatusBarColor() + } else { + getRequiredStatusBarColor() + } + animateTopBarColors(colorFrom, colorTo) + currentScrollY = scrollY + } + } + + fun setupToolbar( + toolbar: Toolbar, + toolbarNavigationIcon: NavigationIcon = NavigationIcon.None, + statusBarColor: Int = getRequiredStatusBarColor(), + searchMenuItem: MenuItem? = null + ) { + val contrastColor = statusBarColor.getContrastColor() + if (toolbarNavigationIcon != NavigationIcon.None) { + val drawableId = if (toolbarNavigationIcon == NavigationIcon.Cross) R.drawable.ic_cross_vector else R.drawable.ic_arrow_left_vector + toolbar.navigationIcon = resources.getColoredDrawableWithColor(drawableId, contrastColor) + } + + toolbar.setNavigationOnClickListener { + hideKeyboard() + finish() + } + + updateTopBarColors(toolbar, statusBarColor) + + if (!useTopSearchMenu) { + searchMenuItem?.actionView?.findViewById(androidx.appcompat.R.id.search_close_btn)?.apply { + applyColorFilter(contrastColor) + } + + searchMenuItem?.actionView?.findViewById(androidx.appcompat.R.id.search_src_text)?.apply { + setTextColor(contrastColor) + setHintTextColor(contrastColor.adjustAlpha(MEDIUM_ALPHA)) + hint = "${getString(R.string.search)}…" + + if (isQPlus()) { + textCursorDrawable = null + } + } + + // search underline + searchMenuItem?.actionView?.findViewById(androidx.appcompat.R.id.search_plate)?.apply { + background.setColorFilter(contrastColor, PorterDuff.Mode.MULTIPLY) + } + } + } + + fun updateRecentsAppIcon() { + if (baseConfig.isUsingModifiedAppIcon) { + val appIconIDs = getAppIconIDs() + val currentAppIconColorIndex = getCurrentAppIconColorIndex() + if (appIconIDs.size - 1 < currentAppIconColorIndex) { + return + } + + val recentsIcon = BitmapFactory.decodeResource(resources, appIconIDs[currentAppIconColorIndex]) + val title = getAppLauncherName() + val color = baseConfig.primaryColor + + val description = ActivityManager.TaskDescription(title, recentsIcon, color) + setTaskDescription(description) + } + } + + fun updateMenuItemColors(menu: Menu?, baseColor: Int = getProperStatusBarColor(), forceWhiteIcons: Boolean = false) { + if (menu == null) { + return + } + + var color = baseColor.getContrastColor() + if (forceWhiteIcons) { + color = Color.WHITE + } + + for (i in 0 until menu.size()) { + try { + menu.getItem(i)?.icon?.setTint(color) + } catch (ignored: Exception) { + } + } + } + + private fun getCurrentAppIconColorIndex(): Int { + val appIconColor = baseConfig.appIconColor + getAppIconColors().forEachIndexed { index, color -> + if (color == appIconColor) { + return index + } + } + return 0 + } + + fun setTranslucentNavigation() { + window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + val partition = try { + checkedDocumentPath.substring(9, 18) + } catch (e: Exception) { + "" + } + + val sdOtgPattern = Pattern.compile(SD_OTG_SHORT) + if (requestCode == CREATE_DOCUMENT_SDK_30) { + if (resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + + val treeUri = resultData.data + val checkedUri = buildDocumentUriSdk30(checkedDocumentPath) + + if (treeUri != checkedUri) { + toast(getString(R.string.wrong_folder_selected, checkedDocumentPath)) + return + } + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + applicationContext.contentResolver.takePersistableUriPermission(treeUri, takeFlags) + val funAfter = funAfterSdk30Action + funAfterSdk30Action = null + funAfter?.invoke(true) + } else { + funAfterSdk30Action?.invoke(false) + } + + } else if (requestCode == OPEN_DOCUMENT_TREE_FOR_SDK_30) { + if (resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + val treeUri = resultData.data + val checkedUri = createFirstParentTreeUri(checkedDocumentPath) + + if (treeUri != checkedUri) { + val level = getFirstParentLevel(checkedDocumentPath) + val firstParentPath = checkedDocumentPath.getFirstParentPath(this, level) + toast(getString(R.string.wrong_folder_selected, humanizePath(firstParentPath))) + return + } + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + applicationContext.contentResolver.takePersistableUriPermission(treeUri, takeFlags) + val funAfter = funAfterSdk30Action + funAfterSdk30Action = null + funAfter?.invoke(true) + } else { + funAfterSdk30Action?.invoke(false) + } + + } else if (requestCode == OPEN_DOCUMENT_TREE_FOR_ANDROID_DATA_OR_OBB) { + if (resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + if (isProperAndroidRoot(checkedDocumentPath, resultData.data!!)) { + if (resultData.dataString == baseConfig.OTGTreeUri || resultData.dataString == baseConfig.sdTreeUri) { + val pathToSelect = createAndroidDataOrObbPath(checkedDocumentPath) + toast(getString(R.string.wrong_folder_selected, pathToSelect)) + return + } + + val treeUri = resultData.data + storeAndroidTreeUri(checkedDocumentPath, treeUri.toString()) + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + applicationContext.contentResolver.takePersistableUriPermission(treeUri!!, takeFlags) + funAfterSAFPermission?.invoke(true) + funAfterSAFPermission = null + } else { + toast(getString(R.string.wrong_folder_selected, createAndroidDataOrObbPath(checkedDocumentPath))) + Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { + if (isRPlus()) { + putExtra(DocumentsContract.EXTRA_INITIAL_URI, createAndroidDataOrObbUri(checkedDocumentPath)) + } + + try { + startActivityForResult(this, requestCode) + } catch (e: Exception) { + showErrorToast(e) + } + } + } + } else { + funAfterSAFPermission?.invoke(false) + } + } else if (requestCode == OPEN_DOCUMENT_TREE_SD) { + if (resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + val isProperPartition = partition.isEmpty() || !sdOtgPattern.matcher(partition).matches() || (sdOtgPattern.matcher(partition) + .matches() && resultData.dataString!!.contains(partition)) + if (isProperSDRootFolder(resultData.data!!) && isProperPartition) { + if (resultData.dataString == baseConfig.OTGTreeUri) { + toast(R.string.sd_card_usb_same) + return + } + + saveTreeUri(resultData) + funAfterSAFPermission?.invoke(true) + funAfterSAFPermission = null + } else { + toast(R.string.wrong_root_selected) + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + + try { + startActivityForResult(intent, requestCode) + } catch (e: Exception) { + showErrorToast(e) + } + } + } else { + funAfterSAFPermission?.invoke(false) + } + } else if (requestCode == OPEN_DOCUMENT_TREE_OTG) { + if (resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + val isProperPartition = partition.isEmpty() || !sdOtgPattern.matcher(partition).matches() || (sdOtgPattern.matcher(partition) + .matches() && resultData.dataString!!.contains(partition)) + if (isProperOTGRootFolder(resultData.data!!) && isProperPartition) { + if (resultData.dataString == baseConfig.sdTreeUri) { + funAfterSAFPermission?.invoke(false) + toast(R.string.sd_card_usb_same) + return + } + baseConfig.OTGTreeUri = resultData.dataString!! + baseConfig.OTGPartition = baseConfig.OTGTreeUri.removeSuffix("%3A").substringAfterLast('/').trimEnd('/') + updateOTGPathFromPartition() + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + applicationContext.contentResolver.takePersistableUriPermission(resultData.data!!, takeFlags) + + funAfterSAFPermission?.invoke(true) + funAfterSAFPermission = null + } else { + toast(R.string.wrong_root_selected_usb) + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + + try { + startActivityForResult(intent, requestCode) + } catch (e: Exception) { + showErrorToast(e) + } + } + } else { + funAfterSAFPermission?.invoke(false) + } + } else if (requestCode == SELECT_EXPORT_SETTINGS_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + val outputStream = contentResolver.openOutputStream(resultData.data!!) + exportSettingsTo(outputStream, configItemsToExport) + } else if (requestCode == DELETE_FILE_SDK_30_HANDLER) { + funAfterSdk30Action?.invoke(resultCode == Activity.RESULT_OK) + } else if (requestCode == RECOVERABLE_SECURITY_HANDLER) { + funRecoverableSecurity?.invoke(resultCode == Activity.RESULT_OK) + funRecoverableSecurity = null + } else if (requestCode == UPDATE_FILE_SDK_30_HANDLER) { + funAfterUpdate30File?.invoke(resultCode == Activity.RESULT_OK) + } else if (requestCode == MANAGE_MEDIA_RC) { + funAfterManageMediaPermission?.invoke() + } + } + + private fun saveTreeUri(resultData: Intent) { + val treeUri = resultData.data + baseConfig.sdTreeUri = treeUri.toString() + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + applicationContext.contentResolver.takePersistableUriPermission(treeUri!!, takeFlags) + } + + private fun isProperSDRootFolder(uri: Uri) = isExternalStorageDocument(uri) && isRootUri(uri) && !isInternalStorage(uri) + private fun isProperSDFolder(uri: Uri) = isExternalStorageDocument(uri) && !isInternalStorage(uri) + + private fun isProperOTGRootFolder(uri: Uri) = isExternalStorageDocument(uri) && isRootUri(uri) && !isInternalStorage(uri) + private fun isProperOTGFolder(uri: Uri) = isExternalStorageDocument(uri) && !isInternalStorage(uri) + + private fun isRootUri(uri: Uri) = uri.lastPathSegment?.endsWith(":") ?: false + + private fun isInternalStorage(uri: Uri) = isExternalStorageDocument(uri) && DocumentsContract.getTreeDocumentId(uri).contains("primary") + private fun isAndroidDir(uri: Uri) = isExternalStorageDocument(uri) && DocumentsContract.getTreeDocumentId(uri).contains(":Android") + private fun isInternalStorageAndroidDir(uri: Uri) = isInternalStorage(uri) && isAndroidDir(uri) + private fun isOTGAndroidDir(uri: Uri) = isProperOTGFolder(uri) && isAndroidDir(uri) + private fun isSDAndroidDir(uri: Uri) = isProperSDFolder(uri) && isAndroidDir(uri) + private fun isExternalStorageDocument(uri: Uri) = EXTERNAL_STORAGE_PROVIDER_AUTHORITY == uri.authority + + private fun isProperAndroidRoot(path: String, uri: Uri): Boolean { + return when { + isPathOnOTG(path) -> isOTGAndroidDir(uri) + isPathOnSD(path) -> isSDAndroidDir(uri) + else -> isInternalStorageAndroidDir(uri) + } + } + + fun startAboutActivity(appNameId: Int, licenseMask: Long, versionName: String, faqItems: ArrayList, showFAQBeforeMail: Boolean) { + hideKeyboard() + Intent(applicationContext, AboutActivity::class.java).apply { + putExtra(APP_ICON_IDS, getAppIconIDs()) + putExtra(APP_LAUNCHER_NAME, getAppLauncherName()) + putExtra(APP_NAME, getString(appNameId)) + putExtra(APP_LICENSES, licenseMask) + putExtra(APP_VERSION_NAME, versionName) + putExtra(APP_FAQ, faqItems) + putExtra(SHOW_FAQ_BEFORE_MAIL, showFAQBeforeMail) + startActivity(this) + } + } + + fun startCustomizationActivity() { + if (!packageName.contains("slootelibomelpmis".reversed(), true)) { + if (baseConfig.appRunCount > 100) { + val label = "You are using a fake version of the app. For your own safety download the original one from www.simplemobiletools.com. Thanks" + ConfirmationDialog(this, label, positive = R.string.ok, negative = 0) { + launchViewIntent("https://play.google.com/store/apps/dev?id=9070296388022589266") + } + return + } + } + + Intent(applicationContext, CustomizationActivity::class.java).apply { + putExtra(APP_ICON_IDS, getAppIconIDs()) + putExtra(APP_LAUNCHER_NAME, getAppLauncherName()) + startActivity(this) + } + } + + fun handleCustomizeColorsClick() { + if (isOrWasThankYouInstalled()) { + startCustomizationActivity() + } else { + FeatureLockedDialog(this) {} + } + } + + @RequiresApi(Build.VERSION_CODES.O) + fun launchCustomizeNotificationsIntent() { + Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { + putExtra(Settings.EXTRA_APP_PACKAGE, packageName) + startActivity(this) + } + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun launchChangeAppLanguageIntent() { + try { + Intent(Settings.ACTION_APP_LOCALE_SETTINGS).apply { + data = Uri.fromParts("package", packageName, null) + startActivity(this) + } + } catch (e: Exception) { + try { + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", packageName, null) + startActivity(this) + } + } catch (e: Exception) { + showErrorToast(e) + } + } + } + + // synchronous return value determines only if we are showing the SAF dialog, callback result tells if the SD or OTG permission has been granted + fun handleSAFDialog(path: String, callback: (success: Boolean) -> Unit): Boolean { + hideKeyboard() + return if (!packageName.startsWith("com.simplemobiletools")) { + callback(true) + false + } else if (isShowingSAFDialog(path) || isShowingOTGDialog(path)) { + funAfterSAFPermission = callback + true + } else { + callback(true) + false + } + } + + fun handleSAFDialogSdk30(path: String, callback: (success: Boolean) -> Unit): Boolean { + hideKeyboard() + return if (!packageName.startsWith("com.simplemobiletools")) { + callback(true) + false + } else if (isShowingSAFDialogSdk30(path)) { + funAfterSdk30Action = callback + true + } else { + callback(true) + false + } + } + + fun checkManageMediaOrHandleSAFDialogSdk30(path: String, callback: (success: Boolean) -> Unit): Boolean { + hideKeyboard() + return if (canManageMedia()) { + callback(true) + false + } else { + handleSAFDialogSdk30(path, callback) + } + } + + fun handleSAFCreateDocumentDialogSdk30(path: String, callback: (success: Boolean) -> Unit): Boolean { + hideKeyboard() + return if (!packageName.startsWith("com.simplemobiletools")) { + callback(true) + false + } else if (isShowingSAFCreateDocumentDialogSdk30(path)) { + funAfterSdk30Action = callback + true + } else { + callback(true) + false + } + } + + fun handleAndroidSAFDialog(path: String, callback: (success: Boolean) -> Unit): Boolean { + hideKeyboard() + return if (!packageName.startsWith("com.simplemobiletools")) { + callback(true) + false + } else if (isShowingAndroidSAFDialog(path)) { + funAfterSAFPermission = callback + true + } else { + callback(true) + false + } + } + + fun handleOTGPermission(callback: (success: Boolean) -> Unit) { + hideKeyboard() + if (baseConfig.OTGTreeUri.isNotEmpty()) { + callback(true) + return + } + + funAfterSAFPermission = callback + WritePermissionDialog(this, Mode.Otg) { + Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_OTG) + return@apply + } catch (e: Exception) { + type = "*/*" + } + + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_OTG) + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + toast(R.string.unknown_error_occurred) + } + } + } + } + + @SuppressLint("NewApi") + fun deleteSDK30Uris(uris: List, callback: (success: Boolean) -> Unit) { + hideKeyboard() + if (isRPlus()) { + funAfterSdk30Action = callback + try { + val deleteRequest = MediaStore.createDeleteRequest(contentResolver, uris).intentSender + startIntentSenderForResult(deleteRequest, DELETE_FILE_SDK_30_HANDLER, null, 0, 0, 0) + } catch (e: Exception) { + showErrorToast(e) + } + } else { + callback(false) + } + } + + @SuppressLint("NewApi") + fun updateSDK30Uris(uris: List, callback: (success: Boolean) -> Unit) { + hideKeyboard() + if (isRPlus()) { + funAfterUpdate30File = callback + try { + val writeRequest = MediaStore.createWriteRequest(contentResolver, uris).intentSender + startIntentSenderForResult(writeRequest, UPDATE_FILE_SDK_30_HANDLER, null, 0, 0, 0) + } catch (e: Exception) { + showErrorToast(e) + } + } else { + callback(false) + } + } + + @SuppressLint("NewApi") + fun handleRecoverableSecurityException(callback: (success: Boolean) -> Unit) { + try { + callback.invoke(true) + } catch (securityException: SecurityException) { + if (isQPlus()) { + funRecoverableSecurity = callback + val recoverableSecurityException = securityException as? RecoverableSecurityException ?: throw securityException + val intentSender = recoverableSecurityException.userAction.actionIntent.intentSender + startIntentSenderForResult(intentSender, RECOVERABLE_SECURITY_HANDLER, null, 0, 0, 0) + } else { + callback(false) + } + } + } + + @RequiresApi(Build.VERSION_CODES.S) + fun launchMediaManagementIntent(callback: () -> Unit) { + Intent(Settings.ACTION_REQUEST_MANAGE_MEDIA).apply { + data = Uri.parse("package:$packageName") + try { + startActivityForResult(this, MANAGE_MEDIA_RC) + } catch (e: Exception) { + showErrorToast(e) + } + } + funAfterManageMediaPermission = callback + } + + fun copyMoveFilesTo( + fileDirItems: ArrayList, source: String, destination: String, isCopyOperation: Boolean, copyPhotoVideoOnly: Boolean, + copyHidden: Boolean, callback: (destinationPath: String) -> Unit + ) { + if (source == destination) { + toast(R.string.source_and_destination_same) + return + } + + if (!getDoesFilePathExist(destination)) { + toast(R.string.invalid_destination) + return + } + + handleSAFDialog(destination) { + if (!it) { + copyMoveListener.copyFailed() + return@handleSAFDialog + } + + handleSAFDialogSdk30(destination) { + if (!it) { + copyMoveListener.copyFailed() + return@handleSAFDialogSdk30 + } + + copyMoveCallback = callback + var fileCountToCopy = fileDirItems.size + if (isCopyOperation) { + val recycleBinPath = fileDirItems.first().isRecycleBinPath(this) + if (canManageMedia() && !recycleBinPath) { + val fileUris = getFileUrisFromFileDirItems(fileDirItems) + updateSDK30Uris(fileUris) { sdk30UriSuccess -> + if (sdk30UriSuccess) { + startCopyMove(fileDirItems, destination, isCopyOperation, copyPhotoVideoOnly, copyHidden) + } + } + } else { + startCopyMove(fileDirItems, destination, isCopyOperation, copyPhotoVideoOnly, copyHidden) + } + } else { + if (isPathOnOTG(source) || isPathOnOTG(destination) || isPathOnSD(source) || isPathOnSD(destination) || + isRestrictedSAFOnlyRoot(source) || isRestrictedSAFOnlyRoot(destination) || + isAccessibleWithSAFSdk30(source) || isAccessibleWithSAFSdk30(destination) || + fileDirItems.first().isDirectory + ) { + handleSAFDialog(source) { safSuccess -> + if (safSuccess) { + val recycleBinPath = fileDirItems.first().isRecycleBinPath(this) + if (canManageMedia() && !recycleBinPath) { + val fileUris = getFileUrisFromFileDirItems(fileDirItems) + updateSDK30Uris(fileUris) { sdk30UriSuccess -> + if (sdk30UriSuccess) { + startCopyMove(fileDirItems, destination, isCopyOperation, copyPhotoVideoOnly, copyHidden) + } + } + } else { + startCopyMove(fileDirItems, destination, isCopyOperation, copyPhotoVideoOnly, copyHidden) + } + } + } + } else { + try { + checkConflicts(fileDirItems, destination, 0, LinkedHashMap()) { + toast(R.string.moving) + ensureBackgroundThread { + val updatedPaths = ArrayList(fileDirItems.size) + val destinationFolder = File(destination) + for (oldFileDirItem in fileDirItems) { + var newFile = File(destinationFolder, oldFileDirItem.name) + if (newFile.exists()) { + when { + getConflictResolution(it, newFile.absolutePath) == CONFLICT_SKIP -> fileCountToCopy-- + getConflictResolution(it, newFile.absolutePath) == CONFLICT_KEEP_BOTH -> newFile = getAlternativeFile(newFile) + else -> + // this file is guaranteed to be on the internal storage, so just delete it this way + newFile.delete() + } + } + + if (!newFile.exists() && File(oldFileDirItem.path).renameTo(newFile)) { + if (!baseConfig.keepLastModified) { + newFile.setLastModified(System.currentTimeMillis()) + } + updatedPaths.add(newFile.absolutePath) + deleteFromMediaStore(oldFileDirItem.path) + } + } + + runOnUiThread { + if (updatedPaths.isEmpty()) { + copyMoveListener.copySucceeded(false, fileCountToCopy == 0, destination, false) + } else { + copyMoveListener.copySucceeded(false, fileCountToCopy <= updatedPaths.size, destination, updatedPaths.size == 1) + } + } + } + } + } catch (e: Exception) { + showErrorToast(e) + } + } + } + } + } + } + + fun getAlternativeFile(file: File): File { + var fileIndex = 1 + var newFile: File? + do { + val newName = String.format("%s(%d).%s", file.nameWithoutExtension, fileIndex, file.extension) + newFile = File(file.parent, newName) + fileIndex++ + } while (getDoesFilePathExist(newFile!!.absolutePath)) + return newFile + } + + private fun startCopyMove( + files: ArrayList, + destinationPath: String, + isCopyOperation: Boolean, + copyPhotoVideoOnly: Boolean, + copyHidden: Boolean + ) { + val availableSpace = destinationPath.getAvailableStorageB() + val sumToCopy = files.sumByLong { it.getProperSize(applicationContext, copyHidden) } + if (availableSpace == -1L || sumToCopy < availableSpace) { + checkConflicts(files, destinationPath, 0, LinkedHashMap()) { + toast(if (isCopyOperation) R.string.copying else R.string.moving) + val pair = Pair(files, destinationPath) + handleNotificationPermission { granted -> + if (granted) { + CopyMoveTask(this, isCopyOperation, copyPhotoVideoOnly, it, copyMoveListener, copyHidden).execute(pair) + } else { + PermissionRequiredDialog(this, R.string.allow_notifications_files) + } + } + } + } else { + val text = String.format(getString(R.string.no_space), sumToCopy.formatSize(), availableSpace.formatSize()) + toast(text, Toast.LENGTH_LONG) + } + } + + fun checkConflicts( + files: ArrayList, destinationPath: String, index: Int, conflictResolutions: LinkedHashMap, + callback: (resolutions: LinkedHashMap) -> Unit + ) { + if (index == files.size) { + callback(conflictResolutions) + return + } + + val file = files[index] + val newFileDirItem = FileDirItem("$destinationPath/${file.name}", file.name, file.isDirectory) + ensureBackgroundThread { + if (getDoesFilePathExist(newFileDirItem.path)) { + runOnUiThread { + FileConflictDialog(this, newFileDirItem, files.size > 1) { resolution, applyForAll -> + if (applyForAll) { + conflictResolutions.clear() + conflictResolutions[""] = resolution + checkConflicts(files, destinationPath, files.size, conflictResolutions, callback) + } else { + conflictResolutions[newFileDirItem.path] = resolution + checkConflicts(files, destinationPath, index + 1, conflictResolutions, callback) + } + } + } + } else { + runOnUiThread { + checkConflicts(files, destinationPath, index + 1, conflictResolutions, callback) + } + } + } + } + + fun handlePermission(permissionId: Int, callback: (granted: Boolean) -> Unit) { + actionOnPermission = null + if (hasPermission(permissionId)) { + callback(true) + } else { + isAskingPermissions = true + actionOnPermission = callback + ActivityCompat.requestPermissions(this, arrayOf(getPermissionString(permissionId)), GENERIC_PERM_HANDLER) + } + } + + fun handleNotificationPermission(callback: (granted: Boolean) -> Unit) { + if (!isTiramisuPlus()) { + callback(true) + } else { + handlePermission(PERMISSION_POST_NOTIFICATIONS) { granted -> + callback(granted) + } + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + isAskingPermissions = false + if (requestCode == GENERIC_PERM_HANDLER && grantResults.isNotEmpty()) { + actionOnPermission?.invoke(grantResults[0] == 0) + } + } + + val copyMoveListener = object : CopyMoveListener { + override fun copySucceeded(copyOnly: Boolean, copiedAll: Boolean, destinationPath: String, wasCopyingOneFileOnly: Boolean) { + if (copyOnly) { + toast( + if (copiedAll) { + if (wasCopyingOneFileOnly) { + R.string.copying_success_one + } else { + R.string.copying_success + } + } else { + R.string.copying_success_partial + } + ) + } else { + toast( + if (copiedAll) { + if (wasCopyingOneFileOnly) { + R.string.moving_success_one + } else { + R.string.moving_success + } + } else { + R.string.moving_success_partial + } + ) + } + + copyMoveCallback?.invoke(destinationPath) + copyMoveCallback = null + } + + override fun copyFailed() { + toast(R.string.copy_move_failed) + copyMoveCallback = null + } + } + + fun checkAppOnSDCard() { + if (!baseConfig.wasAppOnSDShown && isAppInstalledOnSDCard()) { + baseConfig.wasAppOnSDShown = true + ConfirmationDialog(this, "", R.string.app_on_sd_card, R.string.ok, 0) {} + } + } + + fun exportSettings(configItems: LinkedHashMap) { + if (isQPlus()) { + configItemsToExport = configItems + ExportSettingsDialog(this, getExportSettingsFilename(), true) { path, filename -> + Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TITLE, filename) + addCategory(Intent.CATEGORY_OPENABLE) + + try { + startActivityForResult(this, SELECT_EXPORT_SETTINGS_FILE_INTENT) + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + showErrorToast(e) + } + } + } + } else { + handlePermission(PERMISSION_WRITE_STORAGE) { + if (it) { + ExportSettingsDialog(this, getExportSettingsFilename(), false) { path, filename -> + val file = File(path) + getFileOutputStream(file.toFileDirItem(this), true) { + exportSettingsTo(it, configItems) + } + } + } + } + } + } + + private fun exportSettingsTo(outputStream: OutputStream?, configItems: LinkedHashMap) { + if (outputStream == null) { + toast(R.string.unknown_error_occurred) + return + } + + ensureBackgroundThread { + outputStream.bufferedWriter().use { out -> + for ((key, value) in configItems) { + out.writeLn("$key=$value") + } + } + + toast(R.string.settings_exported_successfully) + } + } + + private fun getExportSettingsFilename(): String { + val appName = baseConfig.appId.removeSuffix(".debug").removeSuffix(".pro").removePrefix("com.simplemobiletools.") + return "$appName-settings_${getCurrentFormattedDateTime()}" + } + + @SuppressLint("InlinedApi") + protected fun launchSetDefaultDialerIntent() { + if (isQPlus()) { + val roleManager = getSystemService(RoleManager::class.java) + if (roleManager!!.isRoleAvailable(RoleManager.ROLE_DIALER) && !roleManager.isRoleHeld(RoleManager.ROLE_DIALER)) { + val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER) + startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) + } + } else { + Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName).apply { + try { + startActivityForResult(this, REQUEST_CODE_SET_DEFAULT_DIALER) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: Exception) { + showErrorToast(e) + } + } + } + } + + @RequiresApi(Build.VERSION_CODES.Q) + fun setDefaultCallerIdApp() { + val roleManager = getSystemService(RoleManager::class.java) + if (roleManager.isRoleAvailable(RoleManager.ROLE_CALL_SCREENING) && !roleManager.isRoleHeld(RoleManager.ROLE_CALL_SCREENING)) { + val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING) + startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_CALLER_ID) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSplashActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSplashActivity.kt new file mode 100644 index 000000000..c03031567 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/BaseSplashActivity.kt @@ -0,0 +1,59 @@ +package com.simplemobiletools.commons.activities + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.SIDELOADING_TRUE +import com.simplemobiletools.commons.helpers.SIDELOADING_UNCHECKED + +abstract class BaseSplashActivity : AppCompatActivity() { + abstract fun initActivity() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + if (baseConfig.appSideloadingStatus == SIDELOADING_UNCHECKED) { + if (checkAppSideloading()) { + return + } + } else if (baseConfig.appSideloadingStatus == SIDELOADING_TRUE) { + showSideloadingDialog() + return + } + + baseConfig.apply { + if (isUsingAutoTheme) { + val isUsingSystemDarkTheme = isUsingSystemDarkTheme() + isUsingSharedTheme = false + textColor = resources.getColor(if (isUsingSystemDarkTheme) R.color.theme_dark_text_color else R.color.theme_light_text_color) + backgroundColor = resources.getColor(if (isUsingSystemDarkTheme) R.color.theme_dark_background_color else R.color.theme_light_background_color) + } + } + + if (!baseConfig.isUsingAutoTheme && !baseConfig.isUsingSystemTheme && isThankYouInstalled()) { + getSharedTheme { + if (it != null) { + baseConfig.apply { + wasSharedThemeForced = true + isUsingSharedTheme = true + wasSharedThemeEverActivated = true + + textColor = it.textColor + backgroundColor = it.backgroundColor + primaryColor = it.primaryColor + accentColor = it.accentColor + } + + if (baseConfig.appIconColor != it.appIconColor) { + baseConfig.appIconColor = it.appIconColor + checkAppIconColor() + } + } + initActivity() + } + } else { + initActivity() + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt new file mode 100644 index 000000000..4b3df1952 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ContributorsActivity.kt @@ -0,0 +1,119 @@ +package com.simplemobiletools.commons.activities + +import android.os.Bundle +import android.text.Html +import android.text.method.LinkMovementMethod +import android.view.LayoutInflater +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.APP_ICON_IDS +import com.simplemobiletools.commons.helpers.APP_LAUNCHER_NAME +import com.simplemobiletools.commons.helpers.NavigationIcon +import com.simplemobiletools.commons.models.LanguageContributor +import kotlinx.android.synthetic.main.activity_contributors.* +import kotlinx.android.synthetic.main.item_language_contributor.view.* + +class ContributorsActivity : BaseSimpleActivity() { + override fun getAppIconIDs() = intent.getIntegerArrayListExtra(APP_ICON_IDS) ?: ArrayList() + + override fun getAppLauncherName() = intent.getStringExtra(APP_LAUNCHER_NAME) ?: "" + + override fun onCreate(savedInstanceState: Bundle?) { + isMaterialActivity = true + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_contributors) + updateTextColors(contributors_holder) + + updateMaterialActivityViews(contributors_coordinator, contributors_holder, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(contributors_nested_scrollview, contributors_toolbar) + + val primaryColor = getProperPrimaryColor() + contributors_development_label.setTextColor(primaryColor) + contributors_translation_label.setTextColor(primaryColor) + + val inflater = LayoutInflater.from(this) + val languages = arrayListOf() + languages.addAll( + arrayListOf( + LanguageContributor(R.drawable.ic_flag_arabic_vector, R.string.translation_arabic, R.string.translators_arabic), + LanguageContributor(R.drawable.ic_flag_azerbaijani_vector, R.string.translation_azerbaijani, R.string.translators_azerbaijani), + LanguageContributor(R.drawable.ic_flag_bengali_vector, R.string.translation_bengali, R.string.translators_bengali), + LanguageContributor(R.drawable.ic_flag_catalan_vector, R.string.translation_catalan, R.string.translators_catalan), + LanguageContributor(R.drawable.ic_flag_czech_vector, R.string.translation_czech, R.string.translators_czech), + LanguageContributor(R.drawable.ic_flag_welsh_vector, R.string.translation_welsh, R.string.translators_welsh), + LanguageContributor(R.drawable.ic_flag_danish_vector, R.string.translation_danish, R.string.translators_danish), + LanguageContributor(R.drawable.ic_flag_german_vector, R.string.translation_german, R.string.translators_german), + LanguageContributor(R.drawable.ic_flag_greek_vector, R.string.translation_greek, R.string.translators_greek), + LanguageContributor(R.drawable.ic_flag_spanish_vector, R.string.translation_spanish, R.string.translators_spanish), + LanguageContributor(R.drawable.ic_flag_basque_vector, R.string.translation_basque, R.string.translators_basque), + LanguageContributor(R.drawable.ic_flag_persian_vector, R.string.translation_persian, R.string.translators_persian), + LanguageContributor(R.drawable.ic_flag_finnish_vector, R.string.translation_finnish, R.string.translators_finnish), + LanguageContributor(R.drawable.ic_flag_french_vector, R.string.translation_french, R.string.translators_french), + LanguageContributor(R.drawable.ic_flag_galician_vector, R.string.translation_galician, R.string.translators_galician), + LanguageContributor(R.drawable.ic_flag_hindi_vector, R.string.translation_hindi, R.string.translators_hindi), + LanguageContributor(R.drawable.ic_flag_croatian_vector, R.string.translation_croatian, R.string.translators_croatian), + LanguageContributor(R.drawable.ic_flag_hungarian_vector, R.string.translation_hungarian, R.string.translators_hungarian), + LanguageContributor(R.drawable.ic_flag_indonesian_vector, R.string.translation_indonesian, R.string.translators_indonesian), + LanguageContributor(R.drawable.ic_flag_italian_vector, R.string.translation_italian, R.string.translators_italian), + LanguageContributor(R.drawable.ic_flag_hebrew_vector, R.string.translation_hebrew, R.string.translators_hebrew), + LanguageContributor(R.drawable.ic_flag_japanese_vector, R.string.translation_japanese, R.string.translators_japanese), + LanguageContributor(R.drawable.ic_flag_korean_vector, R.string.translation_korean, R.string.translators_korean), + LanguageContributor(R.drawable.ic_flag_lithuanian_vector, R.string.translation_lithuanian, R.string.translators_lithuanian), + LanguageContributor(R.drawable.ic_flag_nepali_vector, R.string.translation_nepali, R.string.translators_nepali), + LanguageContributor(R.drawable.ic_flag_norwegian_vector, R.string.translation_norwegian, R.string.translators_norwegian), + LanguageContributor(R.drawable.ic_flag_dutch_vector, R.string.translation_dutch, R.string.translators_dutch), + LanguageContributor(R.drawable.ic_flag_polish_vector, R.string.translation_polish, R.string.translators_polish), + LanguageContributor(R.drawable.ic_flag_portuguese_vector, R.string.translation_portuguese, R.string.translators_portuguese), + LanguageContributor(R.drawable.ic_flag_romanian_vector, R.string.translation_romanian, R.string.translators_romanian), + LanguageContributor(R.drawable.ic_flag_russian_vector, R.string.translation_russian, R.string.translators_russian), + LanguageContributor(R.drawable.ic_flag_slovak_vector, R.string.translation_slovak, R.string.translators_slovak), + LanguageContributor(R.drawable.ic_flag_slovenian_vector, R.string.translation_slovenian, R.string.translators_slovenian), + LanguageContributor(R.drawable.ic_flag_swedish_vector, R.string.translation_swedish, R.string.translators_swedish), + LanguageContributor(R.drawable.ic_flag_tamil_vector, R.string.translation_tamil, R.string.translators_tamil), + LanguageContributor(R.drawable.ic_flag_turkish_vector, R.string.translation_turkish, R.string.translators_turkish), + LanguageContributor(R.drawable.ic_flag_ukrainian_vector, R.string.translation_ukrainian, R.string.translators_ukrainian), + LanguageContributor(R.drawable.ic_flag_chinese_hk_vector, R.string.translation_chinese_hk, R.string.translators_chinese_hk), + LanguageContributor(R.drawable.ic_flag_chinese_cn_vector, R.string.translation_chinese_cn, R.string.translators_chinese_cn), + LanguageContributor(R.drawable.ic_flag_chinese_tw_vector, R.string.translation_chinese_tw, R.string.translators_chinese_tw) + ) + ) + + val textColor = getProperTextColor() + languages.forEach { language -> + inflater.inflate(R.layout.item_language_contributor, null).apply { + language_icon.setImageDrawable(getDrawable(language.iconId)) + language_label.apply { + text = getString(language.labelId) + setTextColor(textColor) + } + + language_contributors.apply { + text = getString(language.contributorsId) + setTextColor(textColor) + } + + contributors_languages_holder.addView(this) + } + } + + contributors_label.apply { + setTextColor(textColor) + text = Html.fromHtml(getString(R.string.contributors_label)) + setLinkTextColor(primaryColor) + movementMethod = LinkMovementMethod.getInstance() + removeUnderlines() + } + + contributors_development_icon.applyColorFilter(textColor) + contributors_footer_icon.applyColorFilter(textColor) + + if (resources.getBoolean(R.bool.hide_all_external_links)) { + contributors_footer_layout.beGone() + } + } + + override fun onResume() { + super.onResume() + setupToolbar(contributors_toolbar, NavigationIcon.Arrow) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/CustomizationActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/CustomizationActivity.kt new file mode 100644 index 000000000..9f9e1699c --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/CustomizationActivity.kt @@ -0,0 +1,664 @@ +package com.simplemobiletools.commons.activities + +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.LayerDrawable +import android.graphics.drawable.RippleDrawable +import android.os.Bundle +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.dialogs.* +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.MyTheme +import com.simplemobiletools.commons.models.RadioItem +import com.simplemobiletools.commons.models.SharedTheme +import com.simplemobiletools.commons.views.MyTextView +import kotlinx.android.synthetic.main.activity_customization.* + +class CustomizationActivity : BaseSimpleActivity() { + private val THEME_LIGHT = 0 + private val THEME_DARK = 1 + private val THEME_SOLARIZED = 2 + private val THEME_DARK_RED = 3 + private val THEME_BLACK_WHITE = 4 + private val THEME_CUSTOM = 5 + private val THEME_SHARED = 6 + private val THEME_WHITE = 7 + private val THEME_AUTO = 8 + private val THEME_SYSTEM = 9 // Material You + + private var curTextColor = 0 + private var curBackgroundColor = 0 + private var curPrimaryColor = 0 + private var curAccentColor = 0 + private var curAppIconColor = 0 + private var curSelectedThemeId = 0 + private var originalAppIconColor = 0 + private var lastSavePromptTS = 0L + private var hasUnsavedChanges = false + private var isThankYou = false // show "Apply colors to all Simple apps" in Simple Thank You itself even with "Hide Google relations" enabled + private var predefinedThemes = LinkedHashMap() + private var curPrimaryLineColorPicker: LineColorPickerDialog? = null + private var storedSharedTheme: SharedTheme? = null + + override fun getAppIconIDs() = intent.getIntegerArrayListExtra(APP_ICON_IDS) ?: ArrayList() + + override fun getAppLauncherName() = intent.getStringExtra(APP_LAUNCHER_NAME) ?: "" + + override fun onCreate(savedInstanceState: Bundle?) { + isMaterialActivity = true + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_customization) + + setupOptionsMenu() + refreshMenuItems() + + updateMaterialActivityViews(customization_coordinator, customization_holder, useTransparentNavigation = true, useTopSearchMenu = false) + + isThankYou = packageName.removeSuffix(".debug") == "com.simplemobiletools.thankyou" + initColorVariables() + + if (isThankYouInstalled()) { + val cursorLoader = getMyContentProviderCursorLoader() + ensureBackgroundThread { + try { + storedSharedTheme = getSharedThemeSync(cursorLoader) + if (storedSharedTheme == null) { + baseConfig.isUsingSharedTheme = false + } else { + baseConfig.wasSharedThemeEverActivated = true + } + + runOnUiThread { + setupThemes() + val hideGoogleRelations = resources.getBoolean(R.bool.hide_google_relations) && !isThankYou + apply_to_all_holder.beVisibleIf( + storedSharedTheme == null && curSelectedThemeId != THEME_AUTO && curSelectedThemeId != THEME_SYSTEM && !hideGoogleRelations + ) + } + } catch (e: Exception) { + toast(R.string.update_thank_you) + finish() + } + } + } else { + setupThemes() + baseConfig.isUsingSharedTheme = false + } + + val textColor = if (baseConfig.isUsingSystemTheme) { + getProperTextColor() + } else { + baseConfig.textColor + } + + updateLabelColors(textColor) + originalAppIconColor = baseConfig.appIconColor + + if (resources.getBoolean(R.bool.hide_google_relations) && !isThankYou) { + apply_to_all_holder.beGone() + } + } + + override fun onResume() { + super.onResume() + setTheme(getThemeId(getCurrentPrimaryColor())) + + if (!baseConfig.isUsingSystemTheme) { + updateBackgroundColor(getCurrentBackgroundColor()) + updateActionbarColor(getCurrentStatusBarColor()) + } + + curPrimaryLineColorPicker?.getSpecificColor()?.apply { + updateActionbarColor(this) + setTheme(getThemeId(this)) + } + + setupToolbar(customization_toolbar, NavigationIcon.Cross, getColoredMaterialStatusBarColor()) + } + + private fun refreshMenuItems() { + customization_toolbar.menu.findItem(R.id.save).isVisible = hasUnsavedChanges + } + + private fun setupOptionsMenu() { + customization_toolbar.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.save -> { + saveChanges(true) + true + } + else -> false + } + } + } + + override fun onBackPressed() { + if (hasUnsavedChanges && System.currentTimeMillis() - lastSavePromptTS > SAVE_DISCARD_PROMPT_INTERVAL) { + promptSaveDiscard() + } else { + super.onBackPressed() + } + } + + private fun setupThemes() { + predefinedThemes.apply { + if (isSPlus()) { + put(THEME_SYSTEM, getSystemThemeColors()) + } + + put(THEME_AUTO, getAutoThemeColors()) + put( + THEME_LIGHT, + MyTheme( + getString(R.string.light_theme), + R.color.theme_light_text_color, + R.color.theme_light_background_color, + R.color.color_primary, + R.color.color_primary + ) + ) + put( + THEME_DARK, + MyTheme( + getString(R.string.dark_theme), + R.color.theme_dark_text_color, + R.color.theme_dark_background_color, + R.color.color_primary, + R.color.color_primary + ) + ) + put( + THEME_DARK_RED, + MyTheme( + getString(R.string.dark_red), + R.color.theme_dark_text_color, + R.color.theme_dark_background_color, + R.color.theme_dark_red_primary_color, + R.color.md_red_700 + ) + ) + put(THEME_WHITE, MyTheme(getString(R.string.white), R.color.dark_grey, android.R.color.white, android.R.color.white, R.color.color_primary)) + put( + THEME_BLACK_WHITE, + MyTheme(getString(R.string.black_white), android.R.color.white, android.R.color.black, android.R.color.black, R.color.md_grey_black) + ) + put(THEME_CUSTOM, MyTheme(getString(R.string.custom), 0, 0, 0, 0)) + + if (storedSharedTheme != null) { + put(THEME_SHARED, MyTheme(getString(R.string.shared), 0, 0, 0, 0)) + } + } + setupThemePicker() + setupColorsPickers() + } + + private fun setupThemePicker() { + curSelectedThemeId = getCurrentThemeId() + customization_theme.text = getThemeText() + updateAutoThemeFields() + handleAccentColorLayout() + customization_theme_holder.setOnClickListener { + if (baseConfig.wasAppIconCustomizationWarningShown) { + themePickerClicked() + } else { + ConfirmationDialog(this, "", R.string.app_icon_color_warning, R.string.ok, 0) { + baseConfig.wasAppIconCustomizationWarningShown = true + themePickerClicked() + } + } + } + + if (customization_theme.value == getMaterialYouString()) { + apply_to_all_holder.beGone() + } + } + + private fun themePickerClicked() { + val items = arrayListOf() + for ((key, value) in predefinedThemes) { + items.add(RadioItem(key, value.label)) + } + + RadioGroupDialog(this@CustomizationActivity, items, curSelectedThemeId) { + if (it == THEME_SHARED && !isThankYouInstalled()) { + PurchaseThankYouDialog(this) + return@RadioGroupDialog + } + + updateColorTheme(it as Int, true) + if (it != THEME_CUSTOM && it != THEME_SHARED && it != THEME_AUTO && it != THEME_SYSTEM && !baseConfig.wasCustomThemeSwitchDescriptionShown) { + baseConfig.wasCustomThemeSwitchDescriptionShown = true + toast(R.string.changing_color_description) + } + + val hideGoogleRelations = resources.getBoolean(R.bool.hide_google_relations) && !isThankYou + apply_to_all_holder.beVisibleIf( + curSelectedThemeId != THEME_AUTO && curSelectedThemeId != THEME_SYSTEM && curSelectedThemeId != THEME_SHARED && !hideGoogleRelations + ) + + updateMenuItemColors(customization_toolbar.menu, getCurrentStatusBarColor()) + setupToolbar(customization_toolbar, NavigationIcon.Cross, getCurrentStatusBarColor()) + } + } + + private fun updateColorTheme(themeId: Int, useStored: Boolean = false) { + curSelectedThemeId = themeId + customization_theme.text = getThemeText() + + resources.apply { + if (curSelectedThemeId == THEME_CUSTOM) { + if (useStored) { + curTextColor = baseConfig.customTextColor + curBackgroundColor = baseConfig.customBackgroundColor + curPrimaryColor = baseConfig.customPrimaryColor + curAccentColor = baseConfig.customAccentColor + curAppIconColor = baseConfig.customAppIconColor + setTheme(getThemeId(curPrimaryColor)) + updateMenuItemColors(customization_toolbar.menu, curPrimaryColor) + setupToolbar(customization_toolbar, NavigationIcon.Cross, curPrimaryColor) + setupColorsPickers() + } else { + baseConfig.customPrimaryColor = curPrimaryColor + baseConfig.customAccentColor = curAccentColor + baseConfig.customBackgroundColor = curBackgroundColor + baseConfig.customTextColor = curTextColor + baseConfig.customAppIconColor = curAppIconColor + } + } else if (curSelectedThemeId == THEME_SHARED) { + if (useStored) { + storedSharedTheme?.apply { + curTextColor = textColor + curBackgroundColor = backgroundColor + curPrimaryColor = primaryColor + curAccentColor = accentColor + curAppIconColor = appIconColor + } + setTheme(getThemeId(curPrimaryColor)) + setupColorsPickers() + updateMenuItemColors(customization_toolbar.menu, curPrimaryColor) + setupToolbar(customization_toolbar, NavigationIcon.Cross, curPrimaryColor) + } + } else { + val theme = predefinedThemes[curSelectedThemeId]!! + curTextColor = getColor(theme.textColorId) + curBackgroundColor = getColor(theme.backgroundColorId) + + if (curSelectedThemeId != THEME_AUTO && curSelectedThemeId != THEME_SYSTEM) { + curPrimaryColor = getColor(theme.primaryColorId) + curAccentColor = getColor(R.color.color_primary) + curAppIconColor = getColor(theme.appIconColorId) + } + + setTheme(getThemeId(getCurrentPrimaryColor())) + colorChanged() + updateMenuItemColors(customization_toolbar.menu, getCurrentStatusBarColor()) + setupToolbar(customization_toolbar, NavigationIcon.Cross, getCurrentStatusBarColor()) + } + } + + hasUnsavedChanges = true + refreshMenuItems() + updateLabelColors(getCurrentTextColor()) + updateBackgroundColor(getCurrentBackgroundColor()) + updateActionbarColor(getCurrentStatusBarColor()) + updateAutoThemeFields() + updateApplyToAllColors(getCurrentPrimaryColor()) + handleAccentColorLayout() + } + + private fun getAutoThemeColors(): MyTheme { + val isUsingSystemDarkTheme = isUsingSystemDarkTheme() + val textColor = if (isUsingSystemDarkTheme) R.color.theme_dark_text_color else R.color.theme_light_text_color + val backgroundColor = if (isUsingSystemDarkTheme) R.color.theme_dark_background_color else R.color.theme_light_background_color + return MyTheme(getString(R.string.auto_light_dark_theme), textColor, backgroundColor, R.color.color_primary, R.color.color_primary) + } + + // doesn't really matter what colors we use here, everything will be taken from the system. Use the default dark theme values here. + private fun getSystemThemeColors(): MyTheme { + return MyTheme( + getMaterialYouString(), + R.color.theme_dark_text_color, + R.color.theme_dark_background_color, + R.color.color_primary, + R.color.color_primary + ) + } + + private fun getCurrentThemeId(): Int { + if (baseConfig.isUsingSharedTheme) { + return THEME_SHARED + } else if ((baseConfig.isUsingSystemTheme && !hasUnsavedChanges) || curSelectedThemeId == THEME_SYSTEM) { + return THEME_SYSTEM + } else if (baseConfig.isUsingAutoTheme || curSelectedThemeId == THEME_AUTO) { + return THEME_AUTO + } + + var themeId = THEME_CUSTOM + resources.apply { + for ((key, value) in predefinedThemes.filter { it.key != THEME_CUSTOM && it.key != THEME_SHARED && it.key != THEME_AUTO && it.key != THEME_SYSTEM }) { + if (curTextColor == getColor(value.textColorId) && + curBackgroundColor == getColor(value.backgroundColorId) && + curPrimaryColor == getColor(value.primaryColorId) && + curAppIconColor == getColor(value.appIconColorId) + ) { + themeId = key + } + } + } + + return themeId + } + + private fun getThemeText(): String { + var label = getString(R.string.custom) + for ((key, value) in predefinedThemes) { + if (key == curSelectedThemeId) { + label = value.label + } + } + return label + } + + private fun updateAutoThemeFields() { + arrayOf(customization_text_color_holder, customization_background_color_holder).forEach { + it.beVisibleIf(curSelectedThemeId != THEME_AUTO && curSelectedThemeId != THEME_SYSTEM) + } + + customization_primary_color_holder.beVisibleIf(curSelectedThemeId != THEME_SYSTEM) + } + + private fun promptSaveDiscard() { + lastSavePromptTS = System.currentTimeMillis() + ConfirmationAdvancedDialog(this, "", R.string.save_before_closing, R.string.save, R.string.discard) { + if (it) { + saveChanges(true) + } else { + resetColors() + finish() + } + } + } + + private fun saveChanges(finishAfterSave: Boolean) { + val didAppIconColorChange = curAppIconColor != originalAppIconColor + baseConfig.apply { + textColor = curTextColor + backgroundColor = curBackgroundColor + primaryColor = curPrimaryColor + accentColor = curAccentColor + appIconColor = curAppIconColor + } + + if (didAppIconColorChange) { + checkAppIconColor() + } + + if (curSelectedThemeId == THEME_SHARED) { + val newSharedTheme = SharedTheme(curTextColor, curBackgroundColor, curPrimaryColor, curAppIconColor, 0, curAccentColor) + updateSharedTheme(newSharedTheme) + Intent().apply { + action = MyContentProvider.SHARED_THEME_UPDATED + sendBroadcast(this) + } + } + + baseConfig.isUsingSharedTheme = curSelectedThemeId == THEME_SHARED + baseConfig.shouldUseSharedTheme = curSelectedThemeId == THEME_SHARED + baseConfig.isUsingAutoTheme = curSelectedThemeId == THEME_AUTO + baseConfig.isUsingSystemTheme = curSelectedThemeId == THEME_SYSTEM + + hasUnsavedChanges = false + if (finishAfterSave) { + finish() + } else { + refreshMenuItems() + } + } + + private fun resetColors() { + hasUnsavedChanges = false + initColorVariables() + setupColorsPickers() + updateBackgroundColor() + updateActionbarColor() + refreshMenuItems() + updateLabelColors(getCurrentTextColor()) + } + + private fun initColorVariables() { + curTextColor = baseConfig.textColor + curBackgroundColor = baseConfig.backgroundColor + curPrimaryColor = baseConfig.primaryColor + curAccentColor = baseConfig.accentColor + curAppIconColor = baseConfig.appIconColor + } + + private fun setupColorsPickers() { + val textColor = getCurrentTextColor() + val backgroundColor = getCurrentBackgroundColor() + val primaryColor = getCurrentPrimaryColor() + customization_text_color.setFillWithStroke(textColor, backgroundColor) + customization_primary_color.setFillWithStroke(primaryColor, backgroundColor) + customization_accent_color.setFillWithStroke(curAccentColor, backgroundColor) + customization_background_color.setFillWithStroke(backgroundColor, backgroundColor) + customization_app_icon_color.setFillWithStroke(curAppIconColor, backgroundColor) + apply_to_all.setTextColor(primaryColor.getContrastColor()) + + customization_text_color_holder.setOnClickListener { pickTextColor() } + customization_background_color_holder.setOnClickListener { pickBackgroundColor() } + customization_primary_color_holder.setOnClickListener { pickPrimaryColor() } + customization_accent_color_holder.setOnClickListener { pickAccentColor() } + + handleAccentColorLayout() + apply_to_all.setOnClickListener { + applyToAll() + } + + customization_app_icon_color_holder.setOnClickListener { + if (baseConfig.wasAppIconCustomizationWarningShown) { + pickAppIconColor() + } else { + ConfirmationDialog(this, "", R.string.app_icon_color_warning, R.string.ok, 0) { + baseConfig.wasAppIconCustomizationWarningShown = true + pickAppIconColor() + } + } + } + } + + private fun hasColorChanged(old: Int, new: Int) = Math.abs(old - new) > 1 + + private fun colorChanged() { + hasUnsavedChanges = true + setupColorsPickers() + refreshMenuItems() + } + + private fun setCurrentTextColor(color: Int) { + curTextColor = color + updateLabelColors(color) + } + + private fun setCurrentBackgroundColor(color: Int) { + curBackgroundColor = color + updateBackgroundColor(color) + } + + private fun setCurrentPrimaryColor(color: Int) { + curPrimaryColor = color + updateActionbarColor(color) + updateApplyToAllColors(color) + } + + private fun updateApplyToAllColors(newColor: Int) { + if (newColor == baseConfig.primaryColor && !baseConfig.isUsingSystemTheme) { + apply_to_all.setBackgroundResource(R.drawable.button_background_rounded) + } else { + val applyBackground = resources.getDrawable(R.drawable.button_background_rounded, theme) as RippleDrawable + (applyBackground as LayerDrawable).findDrawableByLayerId(R.id.button_background_holder).applyColorFilter(newColor) + apply_to_all.background = applyBackground + } + } + + private fun handleAccentColorLayout() { + customization_accent_color_holder.beVisibleIf(curSelectedThemeId == THEME_WHITE || isCurrentWhiteTheme() || curSelectedThemeId == THEME_BLACK_WHITE || isCurrentBlackAndWhiteTheme()) + customization_accent_color_label.text = getString( + if (curSelectedThemeId == THEME_WHITE || isCurrentWhiteTheme()) { + R.string.accent_color_white + } else { + R.string.accent_color_black_and_white + } + ) + } + + private fun isCurrentWhiteTheme() = curTextColor == DARK_GREY && curPrimaryColor == Color.WHITE && curBackgroundColor == Color.WHITE + + private fun isCurrentBlackAndWhiteTheme() = curTextColor == Color.WHITE && curPrimaryColor == Color.BLACK && curBackgroundColor == Color.BLACK + + private fun pickTextColor() { + ColorPickerDialog(this, curTextColor) { wasPositivePressed, color -> + if (wasPositivePressed) { + if (hasColorChanged(curTextColor, color)) { + setCurrentTextColor(color) + colorChanged() + updateColorTheme(getUpdatedTheme()) + } + } + } + } + + private fun pickBackgroundColor() { + ColorPickerDialog(this, curBackgroundColor) { wasPositivePressed, color -> + if (wasPositivePressed) { + if (hasColorChanged(curBackgroundColor, color)) { + setCurrentBackgroundColor(color) + colorChanged() + updateColorTheme(getUpdatedTheme()) + } + } + } + } + + private fun pickPrimaryColor() { + if (!packageName.startsWith("com.simplemobiletools.", true) && baseConfig.appRunCount > 50) { + finish() + return + } + + curPrimaryLineColorPicker = LineColorPickerDialog(this, curPrimaryColor, true, toolbar = customization_toolbar) { wasPositivePressed, color -> + curPrimaryLineColorPicker = null + if (wasPositivePressed) { + if (hasColorChanged(curPrimaryColor, color)) { + setCurrentPrimaryColor(color) + colorChanged() + updateColorTheme(getUpdatedTheme()) + setTheme(getThemeId(color)) + } + updateMenuItemColors(customization_toolbar.menu, color) + setupToolbar(customization_toolbar, NavigationIcon.Cross, color) + } else { + updateActionbarColor(curPrimaryColor) + setTheme(getThemeId(curPrimaryColor)) + updateMenuItemColors(customization_toolbar.menu, curPrimaryColor) + setupToolbar(customization_toolbar, NavigationIcon.Cross, curPrimaryColor) + updateTopBarColors(customization_toolbar, curPrimaryColor) + } + } + } + + private fun pickAccentColor() { + ColorPickerDialog(this, curAccentColor) { wasPositivePressed, color -> + if (wasPositivePressed) { + if (hasColorChanged(curAccentColor, color)) { + curAccentColor = color + colorChanged() + + if (isCurrentWhiteTheme() || isCurrentBlackAndWhiteTheme()) { + updateActionbarColor(getCurrentStatusBarColor()) + } + } + } + } + } + + private fun pickAppIconColor() { + LineColorPickerDialog(this, curAppIconColor, false, R.array.md_app_icon_colors, getAppIconIDs()) { wasPositivePressed, color -> + if (wasPositivePressed) { + if (hasColorChanged(curAppIconColor, color)) { + curAppIconColor = color + colorChanged() + updateColorTheme(getUpdatedTheme()) + } + } + } + } + + private fun getUpdatedTheme() = if (curSelectedThemeId == THEME_SHARED) THEME_SHARED else getCurrentThemeId() + + private fun applyToAll() { + if (isThankYouInstalled()) { + ConfirmationDialog(this, "", R.string.share_colors_success, R.string.ok, 0) { + Intent().apply { + action = MyContentProvider.SHARED_THEME_ACTIVATED + sendBroadcast(this) + } + + if (!predefinedThemes.containsKey(THEME_SHARED)) { + predefinedThemes[THEME_SHARED] = MyTheme(getString(R.string.shared), 0, 0, 0, 0) + } + + baseConfig.wasSharedThemeEverActivated = true + apply_to_all_holder.beGone() + updateColorTheme(THEME_SHARED) + saveChanges(false) + } + } else { + PurchaseThankYouDialog(this) + } + } + + private fun updateLabelColors(textColor: Int) { + arrayListOf( + customization_theme_label, + customization_theme, + customization_text_color_label, + customization_background_color_label, + customization_primary_color_label, + customization_accent_color_label, + customization_app_icon_color_label + ).forEach { + it.setTextColor(textColor) + } + + val primaryColor = getCurrentPrimaryColor() + apply_to_all.setTextColor(primaryColor.getContrastColor()) + updateApplyToAllColors(primaryColor) + } + + private fun getCurrentTextColor() = if (customization_theme.value == getMaterialYouString()) { + resources.getColor(R.color.you_neutral_text_color) + } else { + curTextColor + } + + private fun getCurrentBackgroundColor() = if (customization_theme.value == getMaterialYouString()) { + resources.getColor(R.color.you_background_color) + } else { + curBackgroundColor + } + + private fun getCurrentPrimaryColor() = if (customization_theme.value == getMaterialYouString()) { + resources.getColor(R.color.you_primary_color) + } else { + curPrimaryColor + } + + private fun getCurrentStatusBarColor() = if (customization_theme.value == getMaterialYouString()) { + resources.getColor(R.color.you_status_bar_color) + } else { + curPrimaryColor + } + + private fun getMaterialYouString() = "${getString(R.string.system_default)} (${getString(R.string.material_you)})" +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/FAQActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/FAQActivity.kt new file mode 100644 index 000000000..9c47f6dea --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/FAQActivity.kt @@ -0,0 +1,66 @@ +package com.simplemobiletools.commons.activities + +import android.os.Bundle +import android.text.Html +import android.text.method.LinkMovementMethod +import android.view.LayoutInflater +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getProperBackgroundColor +import com.simplemobiletools.commons.extensions.getProperPrimaryColor +import com.simplemobiletools.commons.extensions.getProperTextColor +import com.simplemobiletools.commons.extensions.removeUnderlines +import com.simplemobiletools.commons.helpers.APP_FAQ +import com.simplemobiletools.commons.helpers.APP_ICON_IDS +import com.simplemobiletools.commons.helpers.APP_LAUNCHER_NAME +import com.simplemobiletools.commons.helpers.NavigationIcon +import com.simplemobiletools.commons.models.FAQItem +import kotlinx.android.synthetic.main.activity_faq.* +import kotlinx.android.synthetic.main.item_faq.view.* + +class FAQActivity : BaseSimpleActivity() { + override fun getAppIconIDs() = intent.getIntegerArrayListExtra(APP_ICON_IDS) ?: ArrayList() + + override fun getAppLauncherName() = intent.getStringExtra(APP_LAUNCHER_NAME) ?: "" + + override fun onCreate(savedInstanceState: Bundle?) { + isMaterialActivity = true + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_faq) + + updateMaterialActivityViews(faq_coordinator, faq_holder, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(faq_nested_scrollview, faq_toolbar) + + val textColor = getProperTextColor() + val backgroundColor = getProperBackgroundColor() + val primaryColor = getProperPrimaryColor() + + val inflater = LayoutInflater.from(this) + val faqItems = intent.getSerializableExtra(APP_FAQ) as ArrayList + faqItems.forEach { + val faqItem = it + inflater.inflate(R.layout.item_faq, null).apply { + faq_card.setCardBackgroundColor(backgroundColor) + faq_title.apply { + text = if (faqItem.title is Int) getString(faqItem.title) else faqItem.title as String + setTextColor(primaryColor) + } + + faq_text.apply { + text = if (faqItem.text is Int) Html.fromHtml(getString(faqItem.text)) else faqItem.text as String + setTextColor(textColor) + setLinkTextColor(primaryColor) + + movementMethod = LinkMovementMethod.getInstance() + removeUnderlines() + } + + faq_holder.addView(this) + } + } + } + + override fun onResume() { + super.onResume() + setupToolbar(faq_toolbar, NavigationIcon.Arrow) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/LicenseActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/LicenseActivity.kt new file mode 100644 index 000000000..3346e69b2 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/LicenseActivity.kt @@ -0,0 +1,94 @@ +package com.simplemobiletools.commons.activities + +import android.os.Bundle +import android.view.LayoutInflater +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.License +import kotlinx.android.synthetic.main.activity_license.* +import kotlinx.android.synthetic.main.item_license.view.* + +class LicenseActivity : BaseSimpleActivity() { + override fun getAppIconIDs() = intent.getIntegerArrayListExtra(APP_ICON_IDS) ?: ArrayList() + + override fun getAppLauncherName() = intent.getStringExtra(APP_LAUNCHER_NAME) ?: "" + + override fun onCreate(savedInstanceState: Bundle?) { + isMaterialActivity = true + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_license) + updateTextColors(licenses_holder) + + updateMaterialActivityViews(licenses_coordinator, licenses_holder, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(licenses_nested_scrollview, licenses_toolbar) + + val textColor = getProperTextColor() + val backgroundColor = getProperBackgroundColor() + val primaryColor = getProperPrimaryColor() + + val inflater = LayoutInflater.from(this) + val licenses = initLicenses() + val licenseMask = intent.getLongExtra(APP_LICENSES, 0) or LICENSE_KOTLIN + licenses.filter { licenseMask and it.id != 0L }.forEach { + val license = it + inflater.inflate(R.layout.item_license, null).apply { + license_card.setCardBackgroundColor(backgroundColor) + license_title.apply { + text = getString(license.titleId) + setTextColor(primaryColor) + setOnClickListener { + launchViewIntent(license.urlId) + } + } + + license_text.apply { + text = getString(license.textId) + setTextColor(textColor) + } + + licenses_holder.addView(this) + } + } + } + + override fun onResume() { + super.onResume() + setupToolbar(licenses_toolbar, NavigationIcon.Arrow) + } + + private fun initLicenses() = arrayOf( + License(LICENSE_KOTLIN, R.string.kotlin_title, R.string.kotlin_text, R.string.kotlin_url), + License(LICENSE_SUBSAMPLING, R.string.subsampling_title, R.string.subsampling_text, R.string.subsampling_url), + License(LICENSE_GLIDE, R.string.glide_title, R.string.glide_text, R.string.glide_url), + License(LICENSE_CROPPER, R.string.cropper_title, R.string.cropper_text, R.string.cropper_url), + License(LICENSE_RTL, R.string.rtl_viewpager_title, R.string.rtl_viewpager_text, R.string.rtl_viewpager_url), + License(LICENSE_JODA, R.string.joda_title, R.string.joda_text, R.string.joda_url), + License(LICENSE_STETHO, R.string.stetho_title, R.string.stetho_text, R.string.stetho_url), + License(LICENSE_OTTO, R.string.otto_title, R.string.otto_text, R.string.otto_url), + License(LICENSE_PHOTOVIEW, R.string.photoview_title, R.string.photoview_text, R.string.photoview_url), + License(LICENSE_PICASSO, R.string.picasso_title, R.string.picasso_text, R.string.picasso_url), + License(LICENSE_PATTERN, R.string.pattern_title, R.string.pattern_text, R.string.pattern_url), + License(LICENSE_REPRINT, R.string.reprint_title, R.string.reprint_text, R.string.reprint_url), + License(LICENSE_GIF_DRAWABLE, R.string.gif_drawable_title, R.string.gif_drawable_text, R.string.gif_drawable_url), + License(LICENSE_AUTOFITTEXTVIEW, R.string.autofittextview_title, R.string.autofittextview_text, R.string.autofittextview_url), + License(LICENSE_ROBOLECTRIC, R.string.robolectric_title, R.string.robolectric_text, R.string.robolectric_url), + License(LICENSE_ESPRESSO, R.string.espresso_title, R.string.espresso_text, R.string.espresso_url), + License(LICENSE_GSON, R.string.gson_title, R.string.gson_text, R.string.gson_url), + License(LICENSE_LEAK_CANARY, R.string.leak_canary_title, R.string.leakcanary_text, R.string.leakcanary_url), + License(LICENSE_NUMBER_PICKER, R.string.number_picker_title, R.string.number_picker_text, R.string.number_picker_url), + License(LICENSE_EXOPLAYER, R.string.exoplayer_title, R.string.exoplayer_text, R.string.exoplayer_url), + License(LICENSE_PANORAMA_VIEW, R.string.panorama_view_title, R.string.panorama_view_text, R.string.panorama_view_url), + License(LICENSE_SANSELAN, R.string.sanselan_title, R.string.sanselan_text, R.string.sanselan_url), + License(LICENSE_FILTERS, R.string.filters_title, R.string.filters_text, R.string.filters_url), + License(LICENSE_GESTURE_VIEWS, R.string.gesture_views_title, R.string.gesture_views_text, R.string.gesture_views_url), + License(LICENSE_INDICATOR_FAST_SCROLL, R.string.indicator_fast_scroll_title, R.string.indicator_fast_scroll_text, R.string.indicator_fast_scroll_url), + License(LICENSE_EVENT_BUS, R.string.event_bus_title, R.string.event_bus_text, R.string.event_bus_url), + License(LICENSE_AUDIO_RECORD_VIEW, R.string.audio_record_view_title, R.string.audio_record_view_text, R.string.audio_record_view_url), + License(LICENSE_SMS_MMS, R.string.sms_mms_title, R.string.sms_mms_text, R.string.sms_mms_url), + License(LICENSE_APNG, R.string.apng_title, R.string.apng_text, R.string.apng_url), + License(LICENSE_PDF_VIEW_PAGER, R.string.pdf_view_pager_title, R.string.pdf_view_pager_text, R.string.pdf_view_pager_url), + License(LICENSE_M3U_PARSER, R.string.m3u_parser_title, R.string.m3u_parser_text, R.string.m3u_parser_url), + License(LICENSE_ANDROID_LAME, R.string.android_lame_title, R.string.android_lame_text, R.string.android_lame_url) + ) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ManageBlockedNumbersActivity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ManageBlockedNumbersActivity.kt new file mode 100644 index 000000000..e582ea0d3 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/activities/ManageBlockedNumbersActivity.kt @@ -0,0 +1,269 @@ +package com.simplemobiletools.commons.activities + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.widget.Toast +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.adapters.ManageBlockedNumbersAdapter +import com.simplemobiletools.commons.dialogs.AddBlockedNumberDialog +import com.simplemobiletools.commons.dialogs.ExportBlockedNumbersDialog +import com.simplemobiletools.commons.dialogs.FilePickerDialog +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.helpers.BlockedNumbersExporter.ExportResult +import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener +import com.simplemobiletools.commons.models.BlockedNumber +import kotlinx.android.synthetic.main.activity_manage_blocked_numbers.* +import java.io.FileOutputStream +import java.io.OutputStream + +class ManageBlockedNumbersActivity : BaseSimpleActivity(), RefreshRecyclerViewListener { + private val PICK_IMPORT_SOURCE_INTENT = 11 + private val PICK_EXPORT_FILE_INTENT = 21 + + override fun getAppIconIDs() = intent.getIntegerArrayListExtra(APP_ICON_IDS) ?: ArrayList() + + override fun getAppLauncherName() = intent.getStringExtra(APP_LAUNCHER_NAME) ?: "" + + override fun onCreate(savedInstanceState: Bundle?) { + isMaterialActivity = true + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_manage_blocked_numbers) + updateBlockedNumbers() + setupOptionsMenu() + + updateMaterialActivityViews(block_numbers_coordinator, manage_blocked_numbers_list, useTransparentNavigation = true, useTopSearchMenu = false) + setupMaterialScrollListener(manage_blocked_numbers_list, block_numbers_toolbar) + updateTextColors(manage_blocked_numbers_wrapper) + updatePlaceholderTexts() + + val blockTitleRes = if (baseConfig.appId.startsWith("com.simplemobiletools.dialer")) R.string.block_unknown_calls else R.string.block_unknown_messages + + block_unknown.apply { + setText(blockTitleRes) + isChecked = baseConfig.blockUnknownNumbers + if (isChecked) { + maybeSetDefaultCallerIdApp() + } + } + + block_unknown_holder.setOnClickListener { + block_unknown.toggle() + baseConfig.blockUnknownNumbers = block_unknown.isChecked + if (block_unknown.isChecked) { + maybeSetDefaultCallerIdApp() + } + } + + manage_blocked_numbers_placeholder_2.apply { + underlineText() + setTextColor(getProperPrimaryColor()) + setOnClickListener { + if (isDefaultDialer()) { + addOrEditBlockedNumber() + } else { + launchSetDefaultDialerIntent() + } + } + } + } + + override fun onResume() { + super.onResume() + setupToolbar(block_numbers_toolbar, NavigationIcon.Arrow) + } + + private fun setupOptionsMenu() { + block_numbers_toolbar.setOnMenuItemClickListener { menuItem -> + when (menuItem.itemId) { + R.id.add_blocked_number -> { + addOrEditBlockedNumber() + true + } + R.id.import_blocked_numbers -> { + tryImportBlockedNumbers() + true + } + R.id.export_blocked_numbers -> { + tryExportBlockedNumbers() + true + } + else -> false + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) { + updatePlaceholderTexts() + updateBlockedNumbers() + } else if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + tryImportBlockedNumbersFromFile(resultData.data!!) + } else if (requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + val outputStream = contentResolver.openOutputStream(resultData.data!!) + exportBlockedNumbersTo(outputStream) + } else if (requestCode == REQUEST_CODE_SET_DEFAULT_CALLER_ID && resultCode != Activity.RESULT_OK) { + toast(R.string.must_make_default_caller_id_app, length = Toast.LENGTH_LONG) + baseConfig.blockUnknownNumbers = false + block_unknown.isChecked = false + } + } + + override fun refreshItems() { + updateBlockedNumbers() + } + + private fun updatePlaceholderTexts() { + manage_blocked_numbers_placeholder.text = getString(if (isDefaultDialer()) R.string.not_blocking_anyone else R.string.must_make_default_dialer) + manage_blocked_numbers_placeholder_2.text = getString(if (isDefaultDialer()) R.string.add_a_blocked_number else R.string.set_as_default) + } + + private fun updateBlockedNumbers() { + ensureBackgroundThread { + val blockedNumbers = getBlockedNumbers() + runOnUiThread { + ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) { + addOrEditBlockedNumber(it as BlockedNumber) + }.apply { + manage_blocked_numbers_list.adapter = this + } + + manage_blocked_numbers_placeholder.beVisibleIf(blockedNumbers.isEmpty()) + manage_blocked_numbers_placeholder_2.beVisibleIf(blockedNumbers.isEmpty()) + + if (blockedNumbers.any { it.number.isBlockedNumberPattern() }) { + maybeSetDefaultCallerIdApp() + } + } + } + } + + private fun addOrEditBlockedNumber(currentNumber: BlockedNumber? = null) { + AddBlockedNumberDialog(this, currentNumber) { + updateBlockedNumbers() + } + } + + private fun tryImportBlockedNumbers() { + if (isQPlus()) { + Intent(Intent.ACTION_GET_CONTENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "text/plain" + + try { + startActivityForResult(this, PICK_IMPORT_SOURCE_INTENT) + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + showErrorToast(e) + } + } + } else { + handlePermission(PERMISSION_READ_STORAGE) { + if (it) { + pickFileToImportBlockedNumbers() + } + } + } + } + + private fun tryImportBlockedNumbersFromFile(uri: Uri) { + when (uri.scheme) { + "file" -> importBlockedNumbers(uri.path!!) + "content" -> { + val tempFile = getTempFile("blocked", "blocked_numbers.txt") + if (tempFile == null) { + toast(R.string.unknown_error_occurred) + return + } + + try { + val inputStream = contentResolver.openInputStream(uri) + val out = FileOutputStream(tempFile) + inputStream!!.copyTo(out) + importBlockedNumbers(tempFile.absolutePath) + } catch (e: Exception) { + showErrorToast(e) + } + } + else -> toast(R.string.invalid_file_format) + } + } + + private fun pickFileToImportBlockedNumbers() { + FilePickerDialog(this) { + importBlockedNumbers(it) + } + } + + private fun importBlockedNumbers(path: String) { + ensureBackgroundThread { + val result = BlockedNumbersImporter(this).importBlockedNumbers(path) + toast( + when (result) { + BlockedNumbersImporter.ImportResult.IMPORT_OK -> R.string.importing_successful + BlockedNumbersImporter.ImportResult.IMPORT_FAIL -> R.string.no_items_found + } + ) + updateBlockedNumbers() + } + } + + private fun tryExportBlockedNumbers() { + if (isQPlus()) { + ExportBlockedNumbersDialog(this, baseConfig.lastBlockedNumbersExportPath, true) { file -> + Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TITLE, file.name) + addCategory(Intent.CATEGORY_OPENABLE) + + try { + startActivityForResult(this, PICK_EXPORT_FILE_INTENT) + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + showErrorToast(e) + } + } + } + } else { + handlePermission(PERMISSION_WRITE_STORAGE) { + if (it) { + ExportBlockedNumbersDialog(this, baseConfig.lastBlockedNumbersExportPath, false) { file -> + getFileOutputStream(file.toFileDirItem(this), true) { out -> + exportBlockedNumbersTo(out) + } + } + } + } + } + } + + private fun exportBlockedNumbersTo(outputStream: OutputStream?) { + ensureBackgroundThread { + val blockedNumbers = getBlockedNumbers() + if (blockedNumbers.isEmpty()) { + toast(R.string.no_entries_for_exporting) + } else { + BlockedNumbersExporter().exportBlockedNumbers(blockedNumbers, outputStream) { + toast( + when (it) { + ExportResult.EXPORT_OK -> R.string.exporting_successful + ExportResult.EXPORT_FAIL -> R.string.exporting_failed + } + ) + } + } + } + } + + private fun maybeSetDefaultCallerIdApp() { + if (isQPlus() && baseConfig.appId.startsWith("com.simplemobiletools.dialer")) { + setDefaultCallerIdApp() + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerFavoritesAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerFavoritesAdapter.kt new file mode 100644 index 000000000..2c43aed47 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerFavoritesAdapter.kt @@ -0,0 +1,61 @@ +package com.simplemobiletools.commons.adapters + +import android.util.TypedValue +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.getTextSize +import com.simplemobiletools.commons.views.MyRecyclerView +import kotlinx.android.synthetic.main.filepicker_favorite.view.* + +class FilepickerFavoritesAdapter( + activity: BaseSimpleActivity, val paths: List, recyclerView: MyRecyclerView, + itemClick: (Any) -> Unit +) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { + + private var fontSize = 0f + + init { + fontSize = activity.getTextSize() + } + + override fun getActionMenuId() = 0 + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.filepicker_favorite, parent) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val path = paths[position] + holder.bindView(path, true, false) { itemView, adapterPosition -> + setupView(itemView, path) + } + bindViewHolder(holder) + } + + override fun getItemCount() = paths.size + + override fun prepareActionMode(menu: Menu) {} + + override fun actionItemPressed(id: Int) {} + + override fun getSelectableItemCount() = paths.size + + override fun getIsItemSelectable(position: Int) = false + + override fun getItemKeyPosition(key: Int) = paths.indexOfFirst { it.hashCode() == key } + + override fun getItemSelectionKey(position: Int) = paths[position].hashCode() + + override fun onActionModeCreated() {} + + override fun onActionModeDestroyed() {} + + private fun setupView(view: View, path: String) { + view.apply { + filepicker_favorite_label.text = path + filepicker_favorite_label.setTextColor(textColor) + filepicker_favorite_label.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerItemsAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerItemsAdapter.kt new file mode 100644 index 000000000..596feb3e6 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/FilepickerItemsAdapter.kt @@ -0,0 +1,152 @@ +package com.simplemobiletools.commons.adapters + +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import android.util.TypedValue +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade +import com.bumptech.glide.request.RequestOptions +import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.getFilePlaceholderDrawables +import com.simplemobiletools.commons.models.FileDirItem +import com.simplemobiletools.commons.views.MyRecyclerView +import kotlinx.android.synthetic.main.item_filepicker_list.view.* +import java.util.* + +class FilepickerItemsAdapter( + activity: BaseSimpleActivity, val fileDirItems: List, recyclerView: MyRecyclerView, + itemClick: (Any) -> Unit +) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate { + + private lateinit var fileDrawable: Drawable + private lateinit var folderDrawable: Drawable + private var fileDrawables = HashMap() + private val hasOTGConnected = activity.hasOTGConnected() + private var fontSize = 0f + private val cornerRadius = resources.getDimension(R.dimen.rounded_corner_radius_small).toInt() + private val dateFormat = activity.baseConfig.dateFormat + private val timeFormat = activity.getTimeFormat() + + init { + initDrawables() + fontSize = activity.getTextSize() + } + + override fun getActionMenuId() = 0 + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_filepicker_list, parent) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val fileDirItem = fileDirItems[position] + holder.bindView(fileDirItem, true, false) { itemView, adapterPosition -> + setupView(itemView, fileDirItem) + } + bindViewHolder(holder) + } + + override fun getItemCount() = fileDirItems.size + + override fun prepareActionMode(menu: Menu) {} + + override fun actionItemPressed(id: Int) {} + + override fun getSelectableItemCount() = fileDirItems.size + + override fun getIsItemSelectable(position: Int) = false + + override fun getItemKeyPosition(key: Int) = fileDirItems.indexOfFirst { it.path.hashCode() == key } + + override fun getItemSelectionKey(position: Int) = fileDirItems[position].path.hashCode() + + override fun onActionModeCreated() {} + + override fun onActionModeDestroyed() {} + + override fun onViewRecycled(holder: ViewHolder) { + super.onViewRecycled(holder) + if (!activity.isDestroyed && !activity.isFinishing) { + Glide.with(activity).clear(holder.itemView.list_item_icon!!) + } + } + + private fun setupView(view: View, fileDirItem: FileDirItem) { + view.apply { + list_item_name.text = fileDirItem.name + list_item_name.setTextColor(textColor) + list_item_name.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + + list_item_details.setTextColor(textColor) + list_item_details.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + + if (fileDirItem.isDirectory) { + list_item_icon.setImageDrawable(folderDrawable) + list_item_details.text = getChildrenCnt(fileDirItem) + } else { + list_item_details.text = fileDirItem.size.formatSize() + val path = fileDirItem.path + val placeholder = fileDrawables.getOrElse(fileDirItem.name.substringAfterLast(".").toLowerCase(Locale.getDefault()), { fileDrawable }) + val options = RequestOptions() + .signature(fileDirItem.getKey()) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .centerCrop() + .error(placeholder) + + var itemToLoad = if (fileDirItem.name.endsWith(".apk", true)) { + val packageInfo = context.packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES) + if (packageInfo != null) { + val appInfo = packageInfo.applicationInfo + appInfo.sourceDir = path + appInfo.publicSourceDir = path + appInfo.loadIcon(context.packageManager) + } else { + path + } + } else { + path + } + + if (!activity.isDestroyed && !activity.isFinishing) { + if (activity.isRestrictedSAFOnlyRoot(path)) { + itemToLoad = activity.getAndroidSAFUri(path) + } else if (hasOTGConnected && itemToLoad is String && activity.isPathOnOTG(itemToLoad)) { + itemToLoad = itemToLoad.getOTGPublicPath(activity) + } + + if (itemToLoad.toString().isGif()) { + Glide.with(activity).asBitmap().load(itemToLoad).apply(options).into(list_item_icon) + } else { + Glide.with(activity) + .load(itemToLoad) + .transition(withCrossFade()) + .apply(options) + .transform(CenterCrop(), RoundedCorners(cornerRadius)) + .into(list_item_icon) + } + } + } + } + } + + private fun getChildrenCnt(item: FileDirItem): String { + val children = item.children + return activity.resources.getQuantityString(R.plurals.items, children, children) + } + + private fun initDrawables() { + folderDrawable = resources.getColoredDrawableWithColor(R.drawable.ic_folder_vector, textColor) + folderDrawable.alpha = 180 + fileDrawable = resources.getDrawable(R.drawable.ic_file_generic) + fileDrawables = getFilePlaceholderDrawables(activity) + } + + override fun onChange(position: Int) = fileDirItems.getOrNull(position)?.getBubbleText(activity, dateFormat, timeFormat) ?: "" +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/ManageBlockedNumbersAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/ManageBlockedNumbersAdapter.kt new file mode 100644 index 000000000..0a6dc3d9e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/ManageBlockedNumbersAdapter.kt @@ -0,0 +1,142 @@ +package com.simplemobiletools.commons.adapters + +import android.view.* +import android.widget.PopupMenu +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.copyToClipboard +import com.simplemobiletools.commons.extensions.deleteBlockedNumber +import com.simplemobiletools.commons.extensions.getPopupMenuTheme +import com.simplemobiletools.commons.extensions.getProperTextColor +import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener +import com.simplemobiletools.commons.models.BlockedNumber +import com.simplemobiletools.commons.views.MyRecyclerView +import kotlinx.android.synthetic.main.item_manage_blocked_number.view.* + +class ManageBlockedNumbersAdapter( + activity: BaseSimpleActivity, var blockedNumbers: ArrayList, val listener: RefreshRecyclerViewListener?, + recyclerView: MyRecyclerView, itemClick: (Any) -> Unit +) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { + init { + setupDragListener(true) + } + + override fun getActionMenuId() = R.menu.cab_blocked_numbers + + override fun prepareActionMode(menu: Menu) { + menu.apply { + findItem(R.id.cab_copy_number).isVisible = isOneItemSelected() + } + } + + override fun actionItemPressed(id: Int) { + if (selectedKeys.isEmpty()) { + return + } + + when (id) { + R.id.cab_copy_number -> copyNumberToClipboard() + R.id.cab_delete -> deleteSelection() + } + } + + override fun getSelectableItemCount() = blockedNumbers.size + + override fun getIsItemSelectable(position: Int) = true + + override fun getItemSelectionKey(position: Int) = blockedNumbers.getOrNull(position)?.id?.toInt() + + override fun getItemKeyPosition(key: Int) = blockedNumbers.indexOfFirst { it.id.toInt() == key } + + override fun onActionModeCreated() {} + + override fun onActionModeDestroyed() {} + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_blocked_number, parent) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val blockedNumber = blockedNumbers[position] + holder.bindView(blockedNumber, true, true) { itemView, _ -> + setupView(itemView, blockedNumber) + } + bindViewHolder(holder) + } + + override fun getItemCount() = blockedNumbers.size + + private fun getSelectedItems() = blockedNumbers.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList + + private fun setupView(view: View, blockedNumber: BlockedNumber) { + view.apply { + manage_blocked_number_holder?.isSelected = selectedKeys.contains(blockedNumber.id.toInt()) + manage_blocked_number_title.apply { + text = blockedNumber.number + setTextColor(textColor) + } + + overflow_menu_icon.drawable.apply { + mutate() + setTint(activity.getProperTextColor()) + } + + overflow_menu_icon.setOnClickListener { + showPopupMenu(overflow_menu_anchor, blockedNumber) + } + } + } + + private fun showPopupMenu(view: View, blockedNumber: BlockedNumber) { + finishActMode() + val theme = activity.getPopupMenuTheme() + val contextTheme = ContextThemeWrapper(activity, theme) + + PopupMenu(contextTheme, view, Gravity.END).apply { + inflate(getActionMenuId()) + setOnMenuItemClickListener { item -> + val blockedNumberId = blockedNumber.id.toInt() + when (item.itemId) { + R.id.cab_copy_number -> { + executeItemMenuOperation(blockedNumberId) { + copyNumberToClipboard() + } + } + R.id.cab_delete -> { + executeItemMenuOperation(blockedNumberId) { + deleteSelection() + } + } + } + true + } + show() + } + } + + private fun executeItemMenuOperation(blockedNumberId: Int, callback: () -> Unit) { + selectedKeys.add(blockedNumberId) + callback() + selectedKeys.remove(blockedNumberId) + } + + private fun copyNumberToClipboard() { + val selectedNumber = getSelectedItems().firstOrNull() ?: return + activity.copyToClipboard(selectedNumber.number) + finishActMode() + } + + private fun deleteSelection() { + val deleteBlockedNumbers = ArrayList(selectedKeys.size) + val positions = getSelectedItemPositions() + + getSelectedItems().forEach { + deleteBlockedNumbers.add(it) + activity.deleteBlockedNumber(it.number) + } + + blockedNumbers.removeAll(deleteBlockedNumbers) + removeSelectedItems(positions) + if (blockedNumbers.isEmpty()) { + listener?.refreshItems() + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyArrayAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyArrayAdapter.kt new file mode 100644 index 000000000..cf7539145 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyArrayAdapter.kt @@ -0,0 +1,23 @@ +package com.simplemobiletools.commons.adapters + +import android.content.Context +import android.graphics.drawable.ColorDrawable +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import android.widget.TextView + +class MyArrayAdapter(context: Context, res: Int, items: Array, val textColor: Int, val backgroundColor: Int, val padding: Int) : + ArrayAdapter(context, res, items) { + override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { + val view = super.getView(position, convertView, parent) + + view.findViewById(android.R.id.text1).apply { + setTextColor(textColor) + setPadding(padding, padding, padding, padding) + background = ColorDrawable(backgroundColor) + } + + return view + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewAdapter.kt new file mode 100644 index 000000000..ec6c6eda4 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewAdapter.kt @@ -0,0 +1,348 @@ +package com.simplemobiletools.commons.adapters + +import android.graphics.Color +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.appcompat.app.ActionBar +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.interfaces.MyActionModeCallback +import com.simplemobiletools.commons.views.MyRecyclerView + +abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyclerView: MyRecyclerView, val itemClick: (Any) -> Unit) : + RecyclerView.Adapter() { + protected val baseConfig = activity.baseConfig + protected val resources = activity.resources!! + protected val layoutInflater = activity.layoutInflater + protected var textColor = activity.getProperTextColor() + protected var backgroundColor = activity.getProperBackgroundColor() + protected var properPrimaryColor = activity.getProperPrimaryColor() + protected var contrastColor = properPrimaryColor.getContrastColor() + protected var actModeCallback: MyActionModeCallback + protected var selectedKeys = LinkedHashSet() + protected var positionOffset = 0 + protected var actMode: ActionMode? = null + + private var actBarTextView: TextView? = null + private var lastLongPressedItem = -1 + + abstract fun getActionMenuId(): Int + + abstract fun prepareActionMode(menu: Menu) + + abstract fun actionItemPressed(id: Int) + + abstract fun getSelectableItemCount(): Int + + abstract fun getIsItemSelectable(position: Int): Boolean + + abstract fun getItemSelectionKey(position: Int): Int? + + abstract fun getItemKeyPosition(key: Int): Int + + abstract fun onActionModeCreated() + + abstract fun onActionModeDestroyed() + + protected fun isOneItemSelected() = selectedKeys.size == 1 + + init { + actModeCallback = object : MyActionModeCallback() { + override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { + actionItemPressed(item.itemId) + return true + } + + override fun onCreateActionMode(actionMode: ActionMode, menu: Menu?): Boolean { + if (getActionMenuId() == 0) { + return true + } + + selectedKeys.clear() + isSelectable = true + actMode = actionMode + actBarTextView = layoutInflater.inflate(R.layout.actionbar_title, null) as TextView + actBarTextView!!.layoutParams = ActionBar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT) + actMode!!.customView = actBarTextView + actBarTextView!!.setOnClickListener { + if (getSelectableItemCount() == selectedKeys.size) { + finishActMode() + } else { + selectAll() + } + } + + activity.menuInflater.inflate(getActionMenuId(), menu) + val bgColor = if (baseConfig.isUsingSystemTheme) { + resources.getColor(R.color.you_contextual_status_bar_color, activity.theme) + } else { + Color.BLACK + } + + actBarTextView!!.setTextColor(bgColor.getContrastColor()) + activity.updateMenuItemColors(menu, baseColor = bgColor) + onActionModeCreated() + + if (baseConfig.isUsingSystemTheme) { + actBarTextView?.onGlobalLayout { + val backArrow = activity.findViewById(R.id.action_mode_close_button) + backArrow?.applyColorFilter(bgColor.getContrastColor()) + } + } + return true + } + + override fun onPrepareActionMode(actionMode: ActionMode, menu: Menu): Boolean { + prepareActionMode(menu) + return true + } + + override fun onDestroyActionMode(actionMode: ActionMode) { + isSelectable = false + (selectedKeys.clone() as HashSet).forEach { + val position = getItemKeyPosition(it) + if (position != -1) { + toggleItemSelection(false, position, false) + } + } + updateTitle() + selectedKeys.clear() + actBarTextView?.text = "" + actMode = null + lastLongPressedItem = -1 + onActionModeDestroyed() + } + } + } + + protected fun toggleItemSelection(select: Boolean, pos: Int, updateTitle: Boolean = true) { + if (select && !getIsItemSelectable(pos)) { + return + } + + val itemKey = getItemSelectionKey(pos) ?: return + if ((select && selectedKeys.contains(itemKey)) || (!select && !selectedKeys.contains(itemKey))) { + return + } + + if (select) { + selectedKeys.add(itemKey) + } else { + selectedKeys.remove(itemKey) + } + + notifyItemChanged(pos + positionOffset) + + if (updateTitle) { + updateTitle() + } + + if (selectedKeys.isEmpty()) { + finishActMode() + } + } + + private fun updateTitle() { + val selectableItemCount = getSelectableItemCount() + val selectedCount = Math.min(selectedKeys.size, selectableItemCount) + val oldTitle = actBarTextView?.text + val newTitle = "$selectedCount / $selectableItemCount" + if (oldTitle != newTitle) { + actBarTextView?.text = newTitle + actMode?.invalidate() + } + } + + fun itemLongClicked(position: Int) { + recyclerView.setDragSelectActive(position) + lastLongPressedItem = if (lastLongPressedItem == -1) { + position + } else { + val min = Math.min(lastLongPressedItem, position) + val max = Math.max(lastLongPressedItem, position) + for (i in min..max) { + toggleItemSelection(true, i, false) + } + updateTitle() + position + } + } + + protected fun getSelectedItemPositions(sortDescending: Boolean = true): ArrayList { + val positions = ArrayList() + val keys = selectedKeys.toList() + keys.forEach { + val position = getItemKeyPosition(it) + if (position != -1) { + positions.add(position) + } + } + + if (sortDescending) { + positions.sortDescending() + } + return positions + } + + protected fun selectAll() { + val cnt = itemCount - positionOffset + for (i in 0 until cnt) { + toggleItemSelection(true, i, false) + } + lastLongPressedItem = -1 + updateTitle() + } + + protected fun setupDragListener(enable: Boolean) { + if (enable) { + recyclerView.setupDragListener(object : MyRecyclerView.MyDragListener { + override fun selectItem(position: Int) { + toggleItemSelection(true, position, true) + } + + override fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int) { + selectItemRange( + initialSelection, + Math.max(0, lastDraggedIndex - positionOffset), + Math.max(0, minReached - positionOffset), + maxReached - positionOffset + ) + if (minReached != maxReached) { + lastLongPressedItem = -1 + } + } + }) + } else { + recyclerView.setupDragListener(null) + } + } + + protected fun selectItemRange(from: Int, to: Int, min: Int, max: Int) { + if (from == to) { + (min..max).filter { it != from }.forEach { toggleItemSelection(false, it, true) } + return + } + + if (to < from) { + for (i in to..from) { + toggleItemSelection(true, i, true) + } + + if (min > -1 && min < to) { + (min until to).filter { it != from }.forEach { toggleItemSelection(false, it, true) } + } + + if (max > -1) { + for (i in from + 1..max) { + toggleItemSelection(false, i, true) + } + } + } else { + for (i in from..to) { + toggleItemSelection(true, i, true) + } + + if (max > -1 && max > to) { + (to + 1..max).filter { it != from }.forEach { toggleItemSelection(false, it, true) } + } + + if (min > -1) { + for (i in min until from) { + toggleItemSelection(false, i, true) + } + } + } + } + + fun setupZoomListener(zoomListener: MyRecyclerView.MyZoomListener?) { + recyclerView.setupZoomListener(zoomListener) + } + + fun addVerticalDividers(add: Boolean) { + if (recyclerView.itemDecorationCount > 0) { + recyclerView.removeItemDecorationAt(0) + } + + if (add) { + DividerItemDecoration(activity, DividerItemDecoration.VERTICAL).apply { + setDrawable(resources.getDrawable(R.drawable.divider)) + recyclerView.addItemDecoration(this) + } + } + } + + fun finishActMode() { + actMode?.finish() + } + + fun updateTextColor(textColor: Int) { + this.textColor = textColor + notifyDataSetChanged() + } + + fun updatePrimaryColor() { + properPrimaryColor = activity.getProperPrimaryColor() + contrastColor = properPrimaryColor.getContrastColor() + } + + fun updateBackgroundColor(backgroundColor: Int) { + this.backgroundColor = backgroundColor + } + + protected fun createViewHolder(layoutType: Int, parent: ViewGroup?): ViewHolder { + val view = layoutInflater.inflate(layoutType, parent, false) + return ViewHolder(view) + } + + protected fun bindViewHolder(holder: ViewHolder) { + holder.itemView.tag = holder + } + + protected fun removeSelectedItems(positions: ArrayList) { + positions.forEach { + notifyItemRemoved(it) + } + finishActMode() + } + + open inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(any: Any, allowSingleClick: Boolean, allowLongClick: Boolean, callback: (itemView: View, adapterPosition: Int) -> Unit): View { + return itemView.apply { + callback(this, adapterPosition) + + if (allowSingleClick) { + setOnClickListener { viewClicked(any) } + setOnLongClickListener { if (allowLongClick) viewLongClicked() else viewClicked(any); true } + } else { + setOnClickListener(null) + setOnLongClickListener(null) + } + } + } + + fun viewClicked(any: Any) { + if (actModeCallback.isSelectable) { + val currentPosition = adapterPosition - positionOffset + val isSelected = selectedKeys.contains(getItemSelectionKey(currentPosition)) + toggleItemSelection(!isSelected, currentPosition, true) + } else { + itemClick.invoke(any) + } + lastLongPressedItem = -1 + } + + fun viewLongClicked() { + val currentPosition = adapterPosition - positionOffset + if (!actModeCallback.isSelectable) { + activity.startActionMode(actModeCallback) + } + + toggleItemSelection(true, currentPosition, true) + itemLongClicked(currentPosition) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewListAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewListAdapter.kt new file mode 100644 index 000000000..d0391492f --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/MyRecyclerViewListAdapter.kt @@ -0,0 +1,367 @@ +package com.simplemobiletools.commons.adapters + +import android.graphics.Color +import android.view.* +import android.widget.ImageView +import android.widget.TextView +import androidx.appcompat.app.ActionBar +import androidx.core.content.res.ResourcesCompat +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.interfaces.MyActionModeCallback +import com.simplemobiletools.commons.models.RecyclerSelectionPayload +import com.simplemobiletools.commons.views.MyRecyclerView +import kotlin.math.max +import kotlin.math.min + +abstract class MyRecyclerViewListAdapter( + val activity: BaseSimpleActivity, + val recyclerView: MyRecyclerView, + diffUtil: DiffUtil.ItemCallback, + val itemClick: (T) -> Unit, + val onRefresh: () -> Unit = {} +) : ListAdapter.ViewHolder>(diffUtil) { + protected val baseConfig = activity.baseConfig + protected val resources = activity.resources!! + protected val layoutInflater = activity.layoutInflater + protected var textColor = activity.getProperTextColor() + protected var backgroundColor = activity.getProperBackgroundColor() + protected var properPrimaryColor = activity.getProperPrimaryColor() + protected var contrastColor = properPrimaryColor.getContrastColor() + protected var actModeCallback: MyActionModeCallback + protected var selectedKeys = LinkedHashSet() + protected var positionOffset = 0 + protected var actMode: ActionMode? = null + + private var actBarTextView: TextView? = null + private var lastLongPressedItem = -1 + + abstract fun getActionMenuId(): Int + + abstract fun prepareActionMode(menu: Menu) + + abstract fun actionItemPressed(id: Int) + + abstract fun getSelectableItemCount(): Int + + abstract fun getIsItemSelectable(position: Int): Boolean + + abstract fun getItemSelectionKey(position: Int): Int? + + abstract fun getItemKeyPosition(key: Int): Int + + abstract fun onActionModeCreated() + + abstract fun onActionModeDestroyed() + + protected fun isOneItemSelected() = selectedKeys.size == 1 + + init { + actModeCallback = object : MyActionModeCallback() { + override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { + actionItemPressed(item.itemId) + return true + } + + override fun onCreateActionMode(actionMode: ActionMode, menu: Menu?): Boolean { + if (getActionMenuId() == 0) { + return true + } + + isSelectable = true + actMode = actionMode + actBarTextView = layoutInflater.inflate(R.layout.actionbar_title, null) as TextView + actBarTextView!!.layoutParams = ActionBar.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT) + actMode!!.customView = actBarTextView + actBarTextView!!.setOnClickListener { + if (getSelectableItemCount() == selectedKeys.size) { + finishActMode() + } else { + selectAll() + } + } + + activity.menuInflater.inflate(getActionMenuId(), menu) + val bgColor = if (baseConfig.isUsingSystemTheme) { + ResourcesCompat.getColor(resources, R.color.you_contextual_status_bar_color, activity.theme) + } else { + Color.BLACK + } + + actBarTextView!!.setTextColor(bgColor.getContrastColor()) + activity.updateMenuItemColors(menu, baseColor = bgColor) + onActionModeCreated() + + if (baseConfig.isUsingSystemTheme) { + actBarTextView?.onGlobalLayout { + val backArrow = activity.findViewById(R.id.action_mode_close_button) + backArrow?.applyColorFilter(bgColor.getContrastColor()) + } + } + return true + } + + override fun onPrepareActionMode(actionMode: ActionMode, menu: Menu): Boolean { + prepareActionMode(menu) + return true + } + + override fun onDestroyActionMode(actionMode: ActionMode) { + isSelectable = false + (selectedKeys.clone() as HashSet).forEach { + val position = getItemKeyPosition(it) + if (position != -1) { + toggleItemSelection(false, position, false) + } + } + updateTitle() + selectedKeys.clear() + actBarTextView?.text = "" + actMode = null + lastLongPressedItem = -1 + onActionModeDestroyed() + } + } + } + + protected fun toggleItemSelection(select: Boolean, pos: Int, updateTitle: Boolean = true) { + if (select && !getIsItemSelectable(pos)) { + return + } + + val itemKey = getItemSelectionKey(pos) ?: return + if ((select && selectedKeys.contains(itemKey)) || (!select && !selectedKeys.contains(itemKey))) { + return + } + + if (select) { + selectedKeys.add(itemKey) + } else { + selectedKeys.remove(itemKey) + } + + notifyItemChanged(pos + positionOffset, RecyclerSelectionPayload(select)) + + if (updateTitle) { + updateTitle() + } + + if (selectedKeys.isEmpty()) { + finishActMode() + } + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList) { + val any = payloads.firstOrNull() + if (any is RecyclerSelectionPayload) { + holder.itemView.isSelected = any.selected + } else { + onBindViewHolder(holder, position) + } + } + + private fun updateTitle() { + val selectableItemCount = getSelectableItemCount() + val selectedCount = min(selectedKeys.size, selectableItemCount) + val oldTitle = actBarTextView?.text + val newTitle = "$selectedCount / $selectableItemCount" + if (oldTitle != newTitle) { + actBarTextView?.text = newTitle + actMode?.invalidate() + } + } + + fun itemLongClicked(position: Int) { + recyclerView.setDragSelectActive(position) + lastLongPressedItem = if (lastLongPressedItem == -1) { + position + } else { + val min = min(lastLongPressedItem, position) + val max = max(lastLongPressedItem, position) + for (i in min..max) { + toggleItemSelection(true, i, false) + } + updateTitle() + position + } + } + + protected fun getSelectedItemPositions(sortDescending: Boolean = true): ArrayList { + val positions = ArrayList() + val keys = selectedKeys.toList() + keys.forEach { + val position = getItemKeyPosition(it) + if (position != -1) { + positions.add(position) + } + } + + if (sortDescending) { + positions.sortDescending() + } + return positions + } + + protected fun selectAll() { + val cnt = itemCount - positionOffset + for (i in 0 until cnt) { + toggleItemSelection(true, i, false) + } + lastLongPressedItem = -1 + updateTitle() + } + + protected fun setupDragListener(enable: Boolean) { + if (enable) { + recyclerView.setupDragListener(object : MyRecyclerView.MyDragListener { + override fun selectItem(position: Int) { + toggleItemSelection(true, position, true) + } + + override fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int) { + selectItemRange( + initialSelection, + max(0, lastDraggedIndex - positionOffset), + max(0, minReached - positionOffset), + maxReached - positionOffset + ) + if (minReached != maxReached) { + lastLongPressedItem = -1 + } + } + }) + } else { + recyclerView.setupDragListener(null) + } + } + + protected fun selectItemRange(from: Int, to: Int, min: Int, max: Int) { + if (from == to) { + (min..max).filter { it != from }.forEach { toggleItemSelection(false, it, true) } + return + } + + if (to < from) { + for (i in to..from) { + toggleItemSelection(true, i, true) + } + + if (min > -1 && min < to) { + (min until to).filter { it != from }.forEach { toggleItemSelection(false, it, true) } + } + + if (max > -1) { + for (i in from + 1..max) { + toggleItemSelection(false, i, true) + } + } + } else { + for (i in from..to) { + toggleItemSelection(true, i, true) + } + + if (max > -1 && max > to) { + (to + 1..max).filter { it != from }.forEach { toggleItemSelection(false, it, true) } + } + + if (min > -1) { + for (i in min until from) { + toggleItemSelection(false, i, true) + } + } + } + } + + fun setupZoomListener(zoomListener: MyRecyclerView.MyZoomListener?) { + recyclerView.setupZoomListener(zoomListener) + } + + fun addVerticalDividers(add: Boolean) { + if (recyclerView.itemDecorationCount > 0) { + recyclerView.removeItemDecorationAt(0) + } + + if (add) { + DividerItemDecoration(activity, DividerItemDecoration.VERTICAL).apply { + setDrawable(resources.getDrawable(R.drawable.divider)) + recyclerView.addItemDecoration(this) + } + } + } + + fun finishActMode() { + actMode?.finish() + } + + fun updateTextColor(textColor: Int) { + this.textColor = textColor + onRefresh.invoke() + } + + fun updatePrimaryColor() { + properPrimaryColor = activity.getProperPrimaryColor() + contrastColor = properPrimaryColor.getContrastColor() + } + + fun updateBackgroundColor(backgroundColor: Int) { + this.backgroundColor = backgroundColor + } + + protected fun createViewHolder(layoutType: Int, parent: ViewGroup?): ViewHolder { + val view = layoutInflater.inflate(layoutType, parent, false) + return ViewHolder(view) + } + + protected fun bindViewHolder(holder: ViewHolder) { + holder.itemView.tag = holder + } + + protected fun removeSelectedItems(positions: ArrayList) { + positions.forEach { + notifyItemRemoved(it) + } + finishActMode() + } + + open inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(item: T, allowSingleClick: Boolean, allowLongClick: Boolean, callback: (itemView: View, adapterPosition: Int) -> Unit): View { + return itemView.apply { + callback(this, adapterPosition) + + if (allowSingleClick) { + setOnClickListener { viewClicked(item) } + setOnLongClickListener { if (allowLongClick) viewLongClicked() else viewClicked(item); true } + } else { + setOnClickListener(null) + setOnLongClickListener(null) + } + } + } + + fun viewClicked(any: T) { + if (actModeCallback.isSelectable) { + val currentPosition = adapterPosition - positionOffset + val isSelected = selectedKeys.contains(getItemSelectionKey(currentPosition)) + toggleItemSelection(!isSelected, currentPosition, true) + } else { + itemClick.invoke(any) + } + lastLongPressedItem = -1 + } + + fun viewLongClicked() { + val currentPosition = adapterPosition - positionOffset + if (!actModeCallback.isSelectable) { + activity.startActionMode(actModeCallback) + } + + toggleItemSelection(true, currentPosition, true) + itemLongClicked(currentPosition) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/PasswordTypesAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/PasswordTypesAdapter.kt new file mode 100644 index 000000000..32251afa6 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/PasswordTypesAdapter.kt @@ -0,0 +1,57 @@ +package com.simplemobiletools.commons.adapters + +import android.content.Context +import android.util.SparseArray +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.biometric.auth.AuthPromptHost +import androidx.viewpager.widget.PagerAdapter +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT +import com.simplemobiletools.commons.helpers.PROTECTION_PATTERN +import com.simplemobiletools.commons.helpers.PROTECTION_PIN +import com.simplemobiletools.commons.helpers.isRPlus +import com.simplemobiletools.commons.interfaces.HashListener +import com.simplemobiletools.commons.interfaces.SecurityTab +import com.simplemobiletools.commons.views.MyScrollView + +class PasswordTypesAdapter( + private val context: Context, + private val requiredHash: String, + private val hashListener: HashListener, + private val scrollView: MyScrollView, + private val biometricPromptHost: AuthPromptHost, + private val showBiometricIdTab: Boolean, + private val showBiometricAuthentication: Boolean +) : PagerAdapter() { + private val tabs = SparseArray() + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate(layoutSelection(position), container, false) + container.addView(view) + tabs.put(position, view as SecurityTab) + (view as SecurityTab).initTab(requiredHash, hashListener, scrollView, biometricPromptHost, showBiometricAuthentication) + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, item: Any) { + tabs.remove(position) + container.removeView(item as View) + } + + override fun getCount() = if (showBiometricIdTab) 3 else 2 + + override fun isViewFromObject(view: View, item: Any) = view == item + + private fun layoutSelection(position: Int): Int = when (position) { + PROTECTION_PATTERN -> R.layout.tab_pattern + PROTECTION_PIN -> R.layout.tab_pin + PROTECTION_FINGERPRINT -> if (isRPlus()) R.layout.tab_biometric_id else R.layout.tab_fingerprint + else -> throw RuntimeException("Only 3 tabs allowed") + } + + fun isTabVisible(position: Int, isVisible: Boolean) { + tabs[position]?.visibilityChanged(isVisible) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/RenameAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/RenameAdapter.kt new file mode 100644 index 000000000..85771bbe9 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/RenameAdapter.kt @@ -0,0 +1,42 @@ +package com.simplemobiletools.commons.adapters + +import android.util.SparseArray +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewpager.widget.PagerAdapter +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.interfaces.RenameTab +import java.util.* + +class RenameAdapter(val activity: BaseSimpleActivity, val paths: ArrayList) : PagerAdapter() { + private val tabs = SparseArray() + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(activity).inflate(layoutSelection(position), container, false) + container.addView(view) + tabs.put(position, view as RenameTab) + (view as RenameTab).initTab(activity, paths) + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, item: Any) { + tabs.remove(position) + container.removeView(item as View) + } + + override fun getCount() = 2 + + override fun isViewFromObject(view: View, item: Any) = view == item + + private fun layoutSelection(position: Int): Int = when (position) { + 0 -> R.layout.tab_rename_simple + 1 -> R.layout.tab_rename_pattern + else -> throw RuntimeException("Only 2 tabs allowed") + } + + fun dialogConfirmed(useMediaFileExtension: Boolean, position: Int, callback: (success: Boolean) -> Unit) { + tabs[position].dialogConfirmed(useMediaFileExtension, callback) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/SimpleListItemAdapter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/SimpleListItemAdapter.kt new file mode 100644 index 000000000..e6003a5df --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/adapters/SimpleListItemAdapter.kt @@ -0,0 +1,64 @@ +package com.simplemobiletools.commons.adapters + +import android.app.Activity +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.models.SimpleListItem +import kotlinx.android.synthetic.main.item_simple_list.view.* + +open class SimpleListItemAdapter(val activity: Activity, val onItemClicked: (SimpleListItem) -> Unit) : + ListAdapter(SimpleListItemDiffCallback()) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleItemViewHolder { + val view = activity.layoutInflater.inflate(R.layout.item_simple_list, parent, false) + return SimpleItemViewHolder(view) + } + + override fun onBindViewHolder(holder: SimpleItemViewHolder, position: Int) { + val route = getItem(position) + holder.bindView(route) + } + + open inner class SimpleItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + fun bindView(item: SimpleListItem) { + setupSimpleListItem(itemView, item, onItemClicked) + } + } + + private class SimpleListItemDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: SimpleListItem, newItem: SimpleListItem): Boolean { + return SimpleListItem.areItemsTheSame(oldItem, newItem) + } + + override fun areContentsTheSame(oldItem: SimpleListItem, newItem: SimpleListItem): Boolean { + return SimpleListItem.areContentsTheSame(oldItem, newItem) + } + } +} + +fun setupSimpleListItem(view: View, item: SimpleListItem, onItemClicked: (SimpleListItem) -> Unit) { + view.apply { + val color = if (item.selected) { + context.getProperPrimaryColor() + } else { + context.getProperTextColor() + } + + bottom_sheet_item_title.setText(item.textRes) + bottom_sheet_item_title.setTextColor(color) + bottom_sheet_item_icon.setImageResourceOrBeGone(item.imageRes) + bottom_sheet_item_icon.applyColorFilter(color) + bottom_sheet_selected_icon.beVisibleIf(item.selected) + bottom_sheet_selected_icon.applyColorFilter(color) + + setOnClickListener { + onItemClicked(item) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/asynctasks/CopyMoveTask.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/asynctasks/CopyMoveTask.kt new file mode 100644 index 000000000..6db4c3993 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/asynctasks/CopyMoveTask.kt @@ -0,0 +1,363 @@ +package com.simplemobiletools.commons.asynctasks + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.ContentValues +import android.os.AsyncTask +import android.os.Handler +import android.provider.MediaStore +import androidx.core.app.NotificationCompat +import androidx.core.util.Pair +import androidx.documentfile.provider.DocumentFile +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.CONFLICT_KEEP_BOTH +import com.simplemobiletools.commons.helpers.CONFLICT_SKIP +import com.simplemobiletools.commons.helpers.getConflictResolution +import com.simplemobiletools.commons.helpers.isOreoPlus +import com.simplemobiletools.commons.interfaces.CopyMoveListener +import com.simplemobiletools.commons.models.FileDirItem +import java.io.File +import java.io.InputStream +import java.io.OutputStream +import java.lang.ref.WeakReference + +class CopyMoveTask( + val activity: BaseSimpleActivity, val copyOnly: Boolean, val copyMediaOnly: Boolean, val conflictResolutions: LinkedHashMap, + listener: CopyMoveListener, val copyHidden: Boolean +) : AsyncTask, String>, Void, Boolean>() { + private val INITIAL_PROGRESS_DELAY = 3000L + private val PROGRESS_RECHECK_INTERVAL = 500L + + private var mListener: WeakReference? = null + private var mTransferredFiles = ArrayList() + private var mFileDirItemsToDelete = ArrayList() // confirm the deletion of files on Android 11 from Downloads and Android at once + private var mDocuments = LinkedHashMap() + private var mFiles = ArrayList() + private var mFileCountToCopy = 0 + private var mDestinationPath = "" + + // progress indication + private var mNotificationBuilder: NotificationCompat.Builder + private var mCurrFilename = "" + private var mCurrentProgress = 0L + private var mMaxSize = 0 + private var mNotifId = 0 + private var mIsTaskOver = false + private var mProgressHandler = Handler() + + init { + mListener = WeakReference(listener) + mNotificationBuilder = NotificationCompat.Builder(activity) + } + + override fun doInBackground(vararg params: Pair, String>): Boolean? { + if (params.isEmpty()) { + return false + } + + val pair = params[0] + mFiles = pair.first!! + mDestinationPath = pair.second!! + mFileCountToCopy = mFiles.size + mNotifId = (System.currentTimeMillis() / 1000).toInt() + mMaxSize = 0 + for (file in mFiles) { + if (file.size == 0L) { + file.size = file.getProperSize(activity, copyHidden) + } + + val newPath = "$mDestinationPath/${file.name}" + val fileExists = activity.getDoesFilePathExist(newPath) + if (getConflictResolution(conflictResolutions, newPath) != CONFLICT_SKIP || !fileExists) { + mMaxSize += (file.size / 1000).toInt() + } + } + + mProgressHandler.postDelayed({ + initProgressNotification() + updateProgress() + }, INITIAL_PROGRESS_DELAY) + + for (file in mFiles) { + try { + val newPath = "$mDestinationPath/${file.name}" + var newFileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), file.isDirectory) + if (activity.getDoesFilePathExist(newPath)) { + val resolution = getConflictResolution(conflictResolutions, newPath) + if (resolution == CONFLICT_SKIP) { + mFileCountToCopy-- + continue + } else if (resolution == CONFLICT_KEEP_BOTH) { + val newFile = activity.getAlternativeFile(File(newFileDirItem.path)) + newFileDirItem = FileDirItem(newFile.path, newFile.name, newFile.isDirectory) + } + } + + copy(file, newFileDirItem) + } catch (e: Exception) { + activity.showErrorToast(e) + return false + } + } + + return true + } + + override fun onPostExecute(success: Boolean) { + if (activity.isFinishing || activity.isDestroyed) { + return + } + + deleteProtectedFiles() + mProgressHandler.removeCallbacksAndMessages(null) + activity.notificationManager.cancel(mNotifId) + val listener = mListener?.get() ?: return + + if (success) { + listener.copySucceeded(copyOnly, mTransferredFiles.size >= mFileCountToCopy, mDestinationPath, mTransferredFiles.size == 1) + } else { + listener.copyFailed() + } + } + + private fun initProgressNotification() { + val channelId = "Copy/Move" + val title = activity.getString(if (copyOnly) R.string.copying else R.string.moving) + if (isOreoPlus()) { + val importance = NotificationManager.IMPORTANCE_LOW + NotificationChannel(channelId, title, importance).apply { + enableLights(false) + enableVibration(false) + activity.notificationManager.createNotificationChannel(this) + } + } + + mNotificationBuilder.setContentTitle(title) + .setSmallIcon(R.drawable.ic_copy_vector) + .setChannelId(channelId) + } + + private fun updateProgress() { + if (mIsTaskOver) { + activity.notificationManager.cancel(mNotifId) + cancel(true) + return + } + + mNotificationBuilder.apply { + setContentText(mCurrFilename) + setProgress(mMaxSize, (mCurrentProgress / 1000).toInt(), false) + activity.notificationManager.notify(mNotifId, build()) + } + + mProgressHandler.removeCallbacksAndMessages(null) + mProgressHandler.postDelayed({ + updateProgress() + + if (mCurrentProgress / 1000 >= mMaxSize) { + mIsTaskOver = true + } + }, PROGRESS_RECHECK_INTERVAL) + } + + private fun copy(source: FileDirItem, destination: FileDirItem) { + if (source.isDirectory) { + copyDirectory(source, destination.path) + } else { + copyFile(source, destination) + } + } + + private fun copyDirectory(source: FileDirItem, destinationPath: String) { + if (!activity.createDirectorySync(destinationPath)) { + val error = String.format(activity.getString(R.string.could_not_create_folder), destinationPath) + activity.showErrorToast(error) + return + } + + if (activity.isPathOnOTG(source.path)) { + val children = activity.getDocumentFile(source.path)?.listFiles() ?: return + for (child in children) { + val newPath = "$destinationPath/${child.name}" + if (File(newPath).exists()) { + continue + } + + val oldPath = "${source.path}/${child.name}" + val oldFileDirItem = FileDirItem(oldPath, child.name!!, child.isDirectory, 0, child.length()) + val newFileDirItem = FileDirItem(newPath, child.name!!, child.isDirectory) + copy(oldFileDirItem, newFileDirItem) + } + mTransferredFiles.add(source) + } else if (activity.isRestrictedSAFOnlyRoot(source.path)) { + activity.getAndroidSAFFileItems(source.path, true) { files -> + for (child in files) { + val newPath = "$destinationPath/${child.name}" + if (activity.getDoesFilePathExist(newPath)) { + continue + } + + val oldPath = "${source.path}/${child.name}" + val oldFileDirItem = FileDirItem(oldPath, child.name, child.isDirectory, 0, child.size) + val newFileDirItem = FileDirItem(newPath, child.name, child.isDirectory) + copy(oldFileDirItem, newFileDirItem) + } + mTransferredFiles.add(source) + } + } else if (activity.isAccessibleWithSAFSdk30(source.path)) { + val children = activity.getDocumentSdk30(source.path)?.listFiles() ?: return + for (child in children) { + val newPath = "$destinationPath/${child.name}" + if (File(newPath).exists()) { + continue + } + + val oldPath = "${source.path}/${child.name}" + val oldFileDirItem = FileDirItem(oldPath, child.name!!, child.isDirectory, 0, child.length()) + val newFileDirItem = FileDirItem(newPath, child.name!!, child.isDirectory) + copy(oldFileDirItem, newFileDirItem) + } + mTransferredFiles.add(source) + } else { + val children = File(source.path).list() + for (child in children) { + val newPath = "$destinationPath/$child" + if (activity.getDoesFilePathExist(newPath)) { + continue + } + + val oldFile = File(source.path, child) + val oldFileDirItem = oldFile.toFileDirItem(activity) + val newFileDirItem = FileDirItem(newPath, newPath.getFilenameFromPath(), oldFile.isDirectory) + copy(oldFileDirItem, newFileDirItem) + } + mTransferredFiles.add(source) + } + } + + private fun copyFile(source: FileDirItem, destination: FileDirItem) { + if (copyMediaOnly && !source.path.isMediaFile()) { + mCurrentProgress += source.size + return + } + + val directory = destination.getParentPath() + if (!activity.createDirectorySync(directory)) { + val error = String.format(activity.getString(R.string.could_not_create_folder), directory) + activity.showErrorToast(error) + mCurrentProgress += source.size + return + } + + mCurrFilename = source.name + var inputStream: InputStream? = null + var out: OutputStream? = null + try { + if (!mDocuments.containsKey(directory) && activity.needsStupidWritePermissions(destination.path)) { + mDocuments[directory] = activity.getDocumentFile(directory) + } + + out = activity.getFileOutputStreamSync(destination.path, source.path.getMimeType(), mDocuments[directory]) + inputStream = activity.getFileInputStreamSync(source.path)!! + + var copiedSize = 0L + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + var bytes = inputStream.read(buffer) + while (bytes >= 0) { + out!!.write(buffer, 0, bytes) + copiedSize += bytes + mCurrentProgress += bytes + bytes = inputStream.read(buffer) + } + + out?.flush() + + if (source.size == copiedSize && activity.getDoesFilePathExist(destination.path)) { + mTransferredFiles.add(source) + if (copyOnly) { + activity.rescanPath(destination.path) { + if (activity.baseConfig.keepLastModified) { + updateLastModifiedValues(source, destination) + activity.rescanPath(destination.path) + } + } + } else if (activity.baseConfig.keepLastModified) { + updateLastModifiedValues(source, destination) + activity.rescanPath(destination.path) + inputStream.close() + out?.close() + deleteSourceFile(source) + } else { + inputStream.close() + out?.close() + deleteSourceFile(source) + } + } + } catch (e: Exception) { + activity.showErrorToast(e) + } finally { + inputStream?.close() + out?.close() + } + } + + private fun updateLastModifiedValues(source: FileDirItem, destination: FileDirItem) { + copyOldLastModified(source.path, destination.path) + val lastModified = File(source.path).lastModified() + if (lastModified != 0L) { + File(destination.path).setLastModified(lastModified) + } + } + + private fun deleteSourceFile(source: FileDirItem) { + if (activity.isRestrictedWithSAFSdk30(source.path) && !activity.canManageMedia()) { + mFileDirItemsToDelete.add(source) + } else { + activity.deleteFileBg(source, isDeletingMultipleFiles = false) + activity.deleteFromMediaStore(source.path) + } + } + + // if we delete multiple files from Downloads folder on Android 11 or 12 without being a Media Management app, show the confirmation dialog just once + private fun deleteProtectedFiles() { + if (mFileDirItemsToDelete.isNotEmpty()) { + val fileUris = activity.getFileUrisFromFileDirItems(mFileDirItemsToDelete) + activity.deleteSDK30Uris(fileUris) { success -> + if (success) { + mFileDirItemsToDelete.forEach { + activity.deleteFromMediaStore(it.path) + } + } + } + } + } + + private fun copyOldLastModified(sourcePath: String, destinationPath: String) { + val projection = arrayOf( + MediaStore.Images.Media.DATE_TAKEN, + MediaStore.Images.Media.DATE_MODIFIED + ) + + val uri = MediaStore.Files.getContentUri("external") + val selection = "${MediaStore.MediaColumns.DATA} = ?" + var selectionArgs = arrayOf(sourcePath) + val cursor = activity.applicationContext.contentResolver.query(uri, projection, selection, selectionArgs, null) + + cursor?.use { + if (cursor.moveToFirst()) { + val dateTaken = cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN) + val dateModified = cursor.getIntValue(MediaStore.Images.Media.DATE_MODIFIED) + + val values = ContentValues().apply { + put(MediaStore.Images.Media.DATE_TAKEN, dateTaken) + put(MediaStore.Images.Media.DATE_MODIFIED, dateModified) + } + + selectionArgs = arrayOf(destinationPath) + activity.applicationContext.contentResolver.update(uri, values, selection, selectionArgs) + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/databases/ContactsDatabase.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/databases/ContactsDatabase.kt new file mode 100644 index 000000000..b78d27a66 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/databases/ContactsDatabase.kt @@ -0,0 +1,90 @@ +package com.simplemobiletools.commons.databases + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import com.simplemobiletools.commons.helpers.Converters +import com.simplemobiletools.commons.helpers.FIRST_CONTACT_ID +import com.simplemobiletools.commons.helpers.FIRST_GROUP_ID +import com.simplemobiletools.commons.helpers.getEmptyLocalContact +import com.simplemobiletools.commons.interfaces.ContactsDao +import com.simplemobiletools.commons.models.contacts.Group +import com.simplemobiletools.commons.models.contacts.LocalContact +import com.simplemobiletools.commons.interfaces.GroupsDao +import java.util.concurrent.Executors + +@Database(entities = [LocalContact::class, Group::class], version = 3) +@TypeConverters(Converters::class) +abstract class ContactsDatabase : RoomDatabase() { + + abstract fun ContactsDao(): ContactsDao + + abstract fun GroupsDao(): GroupsDao + + companion object { + private var db: ContactsDatabase? = null + + fun getInstance(context: Context): ContactsDatabase { + if (db == null) { + synchronized(ContactsDatabase::class) { + if (db == null) { + db = Room.databaseBuilder(context.applicationContext, ContactsDatabase::class.java, "local_contacts.db") + .addCallback(object : Callback() { + override fun onCreate(db: SupportSQLiteDatabase) { + super.onCreate(db) + increaseAutoIncrementIds() + } + }) + .addMigrations(MIGRATION_1_2) + .addMigrations(MIGRATION_2_3) + .build() + } + } + } + return db!! + } + + fun destroyInstance() { + db = null + } + + // start autoincrement ID from FIRST_CONTACT_ID/FIRST_GROUP_ID to avoid conflicts + // Room doesn't seem to have a built in way for it, so just create a contact/group and delete it + private fun increaseAutoIncrementIds() { + Executors.newSingleThreadExecutor().execute { + val emptyContact = getEmptyLocalContact() + emptyContact.id = FIRST_CONTACT_ID + db!!.ContactsDao().apply { + insertOrUpdate(emptyContact) + deleteContactId(FIRST_CONTACT_ID) + } + + val emptyGroup = Group(FIRST_GROUP_ID, "") + db!!.GroupsDao().apply { + insertOrUpdate(emptyGroup) + deleteGroupId(FIRST_GROUP_ID) + } + } + } + + private val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(database: SupportSQLiteDatabase) { + database.apply { + execSQL("ALTER TABLE contacts ADD COLUMN photo_uri TEXT NOT NULL DEFAULT ''") + } + } + } + + private val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(database: SupportSQLiteDatabase) { + database.apply { + execSQL("ALTER TABLE contacts ADD COLUMN ringtone TEXT DEFAULT ''") + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AddBlockedNumberDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AddBlockedNumberDialog.kt new file mode 100644 index 000000000..efb09f949 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AddBlockedNumberDialog.kt @@ -0,0 +1,44 @@ +package com.simplemobiletools.commons.dialogs + +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.models.BlockedNumber +import kotlinx.android.synthetic.main.dialog_add_blocked_number.view.* + +class AddBlockedNumberDialog(val activity: BaseSimpleActivity, val originalNumber: BlockedNumber? = null, val callback: () -> Unit) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_add_blocked_number, null).apply { + if (originalNumber != null) { + add_blocked_number_edittext.setText(originalNumber.number) + } + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this) { alertDialog -> + alertDialog.showKeyboard(view.add_blocked_number_edittext) + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + var newBlockedNumber = view.add_blocked_number_edittext.value + if (originalNumber != null && newBlockedNumber != originalNumber.number) { + activity.deleteBlockedNumber(originalNumber.number) + } + + if (newBlockedNumber.isNotEmpty()) { + // in case the user also added a '.' in the pattern, remove it + if (newBlockedNumber.contains(".*")) { + newBlockedNumber = newBlockedNumber.replace(".*", "*") + } + activity.addBlockedNumber(newBlockedNumber) + } + + callback() + alertDialog.dismiss() + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AppSideloadedDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AppSideloadedDialog.kt new file mode 100644 index 000000000..259e0b06e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/AppSideloadedDialog.kt @@ -0,0 +1,47 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.Html +import android.text.method.LinkMovementMethod +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.getStringsPackageName +import com.simplemobiletools.commons.extensions.launchViewIntent +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_textview.view.* + +class AppSideloadedDialog(val activity: Activity, val callback: () -> Unit) { + private var dialog: AlertDialog? = null + private val url = "https://play.google.com/store/apps/details?id=${activity.getStringsPackageName()}" + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_textview, null).apply { + val text = String.format(activity.getString(R.string.sideloaded_app), url) + text_view.text = Html.fromHtml(text) + text_view.movementMethod = LinkMovementMethod.getInstance() + } + + activity.getAlertDialogBuilder() + .setNegativeButton(R.string.cancel) { dialog, which -> negativePressed() } + .setPositiveButton(R.string.download, null) + .setOnCancelListener { negativePressed() } + .apply { + activity.setupDialogStuff(view, this, R.string.app_corrupt) { alertDialog -> + dialog = alertDialog + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + downloadApp() + } + } + } + } + + private fun downloadApp() { + activity.launchViewIntent(url) + } + + private fun negativePressed() { + dialog?.dismiss() + callback() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/BottomSheetChooserDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/BottomSheetChooserDialog.kt new file mode 100644 index 000000000..4f0970746 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/BottomSheetChooserDialog.kt @@ -0,0 +1,54 @@ +package com.simplemobiletools.commons.dialogs + +import android.os.Bundle +import android.view.ViewGroup +import androidx.fragment.app.FragmentManager +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.adapters.setupSimpleListItem +import com.simplemobiletools.commons.fragments.BaseBottomSheetDialogFragment +import com.simplemobiletools.commons.models.SimpleListItem + +open class BottomSheetChooserDialog : BaseBottomSheetDialogFragment() { + + var onItemClick: ((SimpleListItem) -> Unit)? = null + + override fun setupContentView(parent: ViewGroup) { + val listItems = arguments?.getParcelableArray(ITEMS) as Array + listItems.forEach { item -> + val view = layoutInflater.inflate(R.layout.item_simple_list, parent, false) + setupSimpleListItem(view, item) { + onItemClick?.invoke(it) + } + parent.addView(view) + } + } + + override fun onDestroy() { + super.onDestroy() + onItemClick = null + } + + companion object { + private const val TAG = "BottomSheetChooserDialog" + private const val ITEMS = "data" + + fun createChooser( + fragmentManager: FragmentManager, + title: Int?, + items: Array, + callback: (SimpleListItem) -> Unit + ): BottomSheetChooserDialog { + val extras = Bundle().apply { + if (title != null) { + putInt(BOTTOM_SHEET_TITLE, title) + } + putParcelableArray(ITEMS, items) + } + return BottomSheetChooserDialog().apply { + arguments = extras + onItemClick = callback + show(fragmentManager, TAG) + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CallConfirmationDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CallConfirmationDialog.kt new file mode 100644 index 000000000..2fedaa186 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CallConfirmationDialog.kt @@ -0,0 +1,32 @@ +package com.simplemobiletools.commons.dialogs + +import android.view.animation.AnimationUtils +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.getProperTextColor +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_call_confirmation.view.* + +class CallConfirmationDialog(val activity: BaseSimpleActivity, val callee: String, private val callback: () -> Unit) { + private var view = activity.layoutInflater.inflate(R.layout.dialog_call_confirmation, null) + + init { + view.call_confirm_phone.applyColorFilter(activity.getProperTextColor()) + activity.getAlertDialogBuilder() + .setNegativeButton(R.string.cancel, null) + .apply { + val title = String.format(activity.getString(R.string.confirm_calling_person), callee) + activity.setupDialogStuff(view, this, titleText = title) { alertDialog -> + view.call_confirm_phone.apply { + startAnimation(AnimationUtils.loadAnimation(activity, R.anim.shake_pulse_animation)) + setOnClickListener { + callback.invoke() + alertDialog.dismiss() + } + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ChangeDateTimeFormatDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ChangeDateTimeFormatDialog.kt new file mode 100644 index 000000000..2f2064b9c --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ChangeDateTimeFormatDialog.kt @@ -0,0 +1,73 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.format.DateFormat +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.R.id.* +import com.simplemobiletools.commons.extensions.baseConfig +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.helpers.* +import kotlinx.android.synthetic.main.dialog_change_date_time_format.view.* +import java.util.* + +class ChangeDateTimeFormatDialog(val activity: Activity, val callback: () -> Unit) { + private val view = activity.layoutInflater.inflate(R.layout.dialog_change_date_time_format, null)!! + private val sampleTS = 1613422500000 // February 15, 2021 + + init { + view.apply { + change_date_time_dialog_radio_one.text = formatDateSample(DATE_FORMAT_ONE) + change_date_time_dialog_radio_two.text = formatDateSample(DATE_FORMAT_TWO) + change_date_time_dialog_radio_three.text = formatDateSample(DATE_FORMAT_THREE) + change_date_time_dialog_radio_four.text = formatDateSample(DATE_FORMAT_FOUR) + change_date_time_dialog_radio_five.text = formatDateSample(DATE_FORMAT_FIVE) + change_date_time_dialog_radio_six.text = formatDateSample(DATE_FORMAT_SIX) + change_date_time_dialog_radio_seven.text = formatDateSample(DATE_FORMAT_SEVEN) + change_date_time_dialog_radio_eight.text = formatDateSample(DATE_FORMAT_EIGHT) + + change_date_time_dialog_24_hour.isChecked = activity.baseConfig.use24HourFormat + + val formatButton = when (activity.baseConfig.dateFormat) { + DATE_FORMAT_ONE -> change_date_time_dialog_radio_one + DATE_FORMAT_TWO -> change_date_time_dialog_radio_two + DATE_FORMAT_THREE -> change_date_time_dialog_radio_three + DATE_FORMAT_FOUR -> change_date_time_dialog_radio_four + DATE_FORMAT_FIVE -> change_date_time_dialog_radio_five + DATE_FORMAT_SIX -> change_date_time_dialog_radio_six + DATE_FORMAT_SEVEN -> change_date_time_dialog_radio_seven + else -> change_date_time_dialog_radio_eight + } + formatButton.isChecked = true + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this) + } + } + + private fun dialogConfirmed() { + activity.baseConfig.dateFormat = when (view.change_date_time_dialog_radio_group.checkedRadioButtonId) { + change_date_time_dialog_radio_one -> DATE_FORMAT_ONE + change_date_time_dialog_radio_two -> DATE_FORMAT_TWO + change_date_time_dialog_radio_three -> DATE_FORMAT_THREE + change_date_time_dialog_radio_four -> DATE_FORMAT_FOUR + change_date_time_dialog_radio_five -> DATE_FORMAT_FIVE + change_date_time_dialog_radio_six -> DATE_FORMAT_SIX + change_date_time_dialog_radio_seven -> DATE_FORMAT_SEVEN + else -> DATE_FORMAT_EIGHT + } + + activity.baseConfig.use24HourFormat = view.change_date_time_dialog_24_hour.isChecked + callback() + } + + private fun formatDateSample(format: String): String { + val cal = Calendar.getInstance(Locale.ENGLISH) + cal.timeInMillis = sampleTS + return DateFormat.format(format, cal).toString() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ColorPickerDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ColorPickerDialog.kt new file mode 100644 index 000000000..a247493b0 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ColorPickerDialog.kt @@ -0,0 +1,253 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.graphics.Color +import android.view.MotionEvent +import android.view.View +import android.view.View.OnTouchListener +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.EditText +import android.widget.ImageView +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.isQPlus +import com.simplemobiletools.commons.views.ColorPickerSquare +import kotlinx.android.synthetic.main.dialog_color_picker.view.* +import java.util.LinkedList + +private const val RECENT_COLORS_NUMBER = 5 + +// forked from https://github.com/yukuku/ambilwarna +class ColorPickerDialog( + val activity: Activity, + color: Int, + val removeDimmedBackground: Boolean = false, + val addDefaultColorButton: Boolean = false, + val currentColorCallback: ((color: Int) -> Unit)? = null, + val callback: (wasPositivePressed: Boolean, color: Int) -> Unit +) { + var viewHue: View + var viewSatVal: ColorPickerSquare + var viewCursor: ImageView + var viewNewColor: ImageView + var viewTarget: ImageView + var newHexField: EditText + var viewContainer: ViewGroup + private val baseConfig = activity.baseConfig + private val currentColorHsv = FloatArray(3) + private val backgroundColor = baseConfig.backgroundColor + private var isHueBeingDragged = false + private var wasDimmedBackgroundRemoved = false + private var dialog: AlertDialog? = null + + init { + Color.colorToHSV(color, currentColorHsv) + + val view = activity.layoutInflater.inflate(R.layout.dialog_color_picker, null).apply { + if (isQPlus()) { + isForceDarkAllowed = false + } + + viewHue = color_picker_hue + viewSatVal = color_picker_square + viewCursor = color_picker_hue_cursor + + viewNewColor = color_picker_new_color + viewTarget = color_picker_cursor + viewContainer = color_picker_holder + newHexField = color_picker_new_hex + + viewSatVal.setHue(getHue()) + + viewNewColor.setFillWithStroke(getColor(), backgroundColor) + color_picker_old_color.setFillWithStroke(color, backgroundColor) + + val hexCode = getHexCode(color) + color_picker_old_hex.text = "#$hexCode" + color_picker_old_hex.setOnLongClickListener { + activity.copyToClipboard(hexCode) + true + } + newHexField.setText(hexCode) + setupRecentColors() + } + + viewHue.setOnTouchListener(OnTouchListener { v, event -> + if (event.action == MotionEvent.ACTION_DOWN) { + isHueBeingDragged = true + } + + if (event.action == MotionEvent.ACTION_MOVE || event.action == MotionEvent.ACTION_DOWN || event.action == MotionEvent.ACTION_UP) { + var y = event.y + if (y < 0f) + y = 0f + + if (y > viewHue.measuredHeight) { + y = viewHue.measuredHeight - 0.001f // to avoid jumping the cursor from bottom to top. + } + var hue = 360f - 360f / viewHue.measuredHeight * y + if (hue == 360f) + hue = 0f + + currentColorHsv[0] = hue + updateHue() + newHexField.setText(getHexCode(getColor())) + + if (event.action == MotionEvent.ACTION_UP) { + isHueBeingDragged = false + } + return@OnTouchListener true + } + false + }) + + viewSatVal.setOnTouchListener(OnTouchListener { v, event -> + if (event.action == MotionEvent.ACTION_MOVE || event.action == MotionEvent.ACTION_DOWN || event.action == MotionEvent.ACTION_UP) { + var x = event.x + var y = event.y + + if (x < 0f) + x = 0f + if (x > viewSatVal.measuredWidth) + x = viewSatVal.measuredWidth.toFloat() + if (y < 0f) + y = 0f + if (y > viewSatVal.measuredHeight) + y = viewSatVal.measuredHeight.toFloat() + + currentColorHsv[1] = 1f / viewSatVal.measuredWidth * x + currentColorHsv[2] = 1f - 1f / viewSatVal.measuredHeight * y + + moveColorPicker() + viewNewColor.setFillWithStroke(getColor(), backgroundColor) + newHexField.setText(getHexCode(getColor())) + return@OnTouchListener true + } + false + }) + + newHexField.onTextChangeListener { + if (it.length == 6 && !isHueBeingDragged) { + try { + val newColor = Color.parseColor("#$it") + Color.colorToHSV(newColor, currentColorHsv) + updateHue() + moveColorPicker() + } catch (ignored: Exception) { + } + } + } + + val textColor = activity.getProperTextColor() + val builder = activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok) { _, _ -> confirmNewColor() } + .setNegativeButton(R.string.cancel) { _, _ -> dialogDismissed() } + .setOnCancelListener { dialogDismissed() } + .apply { + if (addDefaultColorButton) { + setNeutralButton(R.string.default_color) { _, _ -> confirmDefaultColor() } + } + } + + builder.apply { + activity.setupDialogStuff(view, this) { alertDialog -> + dialog = alertDialog + view.color_picker_arrow.applyColorFilter(textColor) + view.color_picker_hex_arrow.applyColorFilter(textColor) + viewCursor.applyColorFilter(textColor) + } + } + + view.onGlobalLayout { + moveHuePicker() + moveColorPicker() + } + } + + private fun View.setupRecentColors() { + val recentColors = baseConfig.colorPickerRecentColors + if (recentColors.isNotEmpty()) { + recent_colors.beVisible() + val squareSize = context.resources.getDimensionPixelSize(R.dimen.colorpicker_hue_width) + recentColors.take(RECENT_COLORS_NUMBER).forEach { recentColor -> + val recentColorView = ImageView(context) + recentColorView.id = View.generateViewId() + recentColorView.layoutParams = ViewGroup.LayoutParams(squareSize, squareSize) + recentColorView.setFillWithStroke(recentColor, backgroundColor) + recentColorView.setOnClickListener { newHexField.setText(getHexCode(recentColor)) } + recent_colors.addView(recentColorView) + recent_colors_flow.addView(recentColorView) + } + } + } + + private fun dialogDismissed() { + callback(false, 0) + } + + private fun confirmDefaultColor() { + callback(true, 0) + } + + private fun confirmNewColor() { + val hexValue = newHexField.value + val newColor = if (hexValue.length == 6) { + Color.parseColor("#$hexValue") + } else { + getColor() + } + + addRecentColor(newColor) + callback(true, newColor) + } + + private fun addRecentColor(color: Int) { + var recentColors = baseConfig.colorPickerRecentColors + + recentColors.remove(color) + if (recentColors.size >= RECENT_COLORS_NUMBER) { + val numberOfColorsToDrop = recentColors.size - RECENT_COLORS_NUMBER + 1 + recentColors = LinkedList(recentColors.dropLast(numberOfColorsToDrop)) + } + recentColors.addFirst(color) + + baseConfig.colorPickerRecentColors = recentColors + } + + private fun getHexCode(color: Int) = color.toHex().substring(1) + + private fun updateHue() { + viewSatVal.setHue(getHue()) + moveHuePicker() + viewNewColor.setFillWithStroke(getColor(), backgroundColor) + if (removeDimmedBackground && !wasDimmedBackgroundRemoved) { + dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + wasDimmedBackgroundRemoved = true + } + + currentColorCallback?.invoke(getColor()) + } + + private fun moveHuePicker() { + var y = viewHue.measuredHeight - getHue() * viewHue.measuredHeight / 360f + if (y == viewHue.measuredHeight.toFloat()) + y = 0f + + viewCursor.x = (viewHue.left - viewCursor.width).toFloat() + viewCursor.y = viewHue.top + y - viewCursor.height / 2 + } + + private fun moveColorPicker() { + val x = getSat() * viewSatVal.measuredWidth + val y = (1f - getVal()) * viewSatVal.measuredHeight + viewTarget.x = viewSatVal.left + x - viewTarget.width / 2 + viewTarget.y = viewSatVal.top + y - viewTarget.height / 2 + } + + private fun getColor() = Color.HSVToColor(currentColorHsv) + private fun getHue() = currentColorHsv[0] + private fun getSat() = currentColorHsv[1] + private fun getVal() = currentColorHsv[2] +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationAdvancedDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationAdvancedDialog.kt new file mode 100644 index 000000000..9eb202825 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationAdvancedDialog.kt @@ -0,0 +1,48 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_message.view.* + +// similar fo ConfirmationDialog, but has a callback for negative button too +class ConfirmationAdvancedDialog( + activity: Activity, message: String = "", messageId: Int = R.string.proceed_with_deletion, positive: Int = R.string.yes, + negative: Int = R.string.no, val cancelOnTouchOutside: Boolean = true, val callback: (result: Boolean) -> Unit +) { + private var dialog: AlertDialog? = null + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_message, null) + view.message.text = if (message.isEmpty()) activity.resources.getString(messageId) else message + + val builder = activity.getAlertDialogBuilder() + .setPositiveButton(positive) { dialog, which -> positivePressed() } + + if (negative != 0) { + builder.setNegativeButton(negative) { dialog, which -> negativePressed() } + } + + if (!cancelOnTouchOutside) { + builder.setOnCancelListener { negativePressed() } + } + + builder.apply { + activity.setupDialogStuff(view, this, cancelOnTouchOutside = cancelOnTouchOutside) { alertDialog -> + dialog = alertDialog + } + } + } + + private fun positivePressed() { + dialog?.dismiss() + callback(true) + } + + private fun negativePressed() { + dialog?.dismiss() + callback(false) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationDialog.kt new file mode 100644 index 000000000..d76764506 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ConfirmationDialog.kt @@ -0,0 +1,48 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_message.view.* + +/** + * A simple dialog without any view, just a messageId, a positive button and optionally a negative button + * + * @param activity has to be activity context to avoid some Theme.AppCompat issues + * @param message the dialogs message, can be any String. If empty, messageId is used + * @param messageId the dialogs messageId ID. Used only if message is empty + * @param positive positive buttons text ID + * @param negative negative buttons text ID (optional) + * @param callback an anonymous function + */ +class ConfirmationDialog( + activity: Activity, message: String = "", messageId: Int = R.string.proceed_with_deletion, positive: Int = R.string.yes, + negative: Int = R.string.no, val cancelOnTouchOutside: Boolean = true, dialogTitle: String = "", val callback: () -> Unit +) { + private var dialog: AlertDialog? = null + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_message, null) + view.message.text = if (message.isEmpty()) activity.resources.getString(messageId) else message + + val builder = activity.getAlertDialogBuilder() + .setPositiveButton(positive) { dialog, which -> dialogConfirmed() } + + if (negative != 0) { + builder.setNegativeButton(negative, null) + } + + builder.apply { + activity.setupDialogStuff(view, this, titleText = dialogTitle, cancelOnTouchOutside = cancelOnTouchOutside) { alertDialog -> + dialog = alertDialog + } + } + } + + private fun dialogConfirmed() { + dialog?.dismiss() + callback() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CreateNewFolderDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CreateNewFolderDialog.kt new file mode 100644 index 000000000..f81da565d --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CreateNewFolderDialog.kt @@ -0,0 +1,84 @@ +package com.simplemobiletools.commons.dialogs + +import android.view.View +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.isRPlus +import kotlinx.android.synthetic.main.dialog_create_new_folder.view.* +import java.io.File + +class CreateNewFolderDialog(val activity: BaseSimpleActivity, val path: String, val callback: (path: String) -> Unit) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_create_new_folder, null) + view.folder_path.setText("${activity.humanizePath(path).trimEnd('/')}/") + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this, R.string.create_new_folder) { alertDialog -> + alertDialog.showKeyboard(view.folder_name) + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(View.OnClickListener { + val name = view.folder_name.value + when { + name.isEmpty() -> activity.toast(R.string.empty_name) + name.isAValidFilename() -> { + val file = File(path, name) + if (file.exists()) { + activity.toast(R.string.name_taken) + return@OnClickListener + } + + createFolder("$path/$name", alertDialog) + } + else -> activity.toast(R.string.invalid_name) + } + }) + } + } + } + + private fun createFolder(path: String, alertDialog: AlertDialog) { + try { + when { + activity.isRestrictedSAFOnlyRoot(path) && activity.createAndroidSAFDirectory(path) -> sendSuccess(alertDialog, path) + activity.isAccessibleWithSAFSdk30(path) -> activity.handleSAFDialogSdk30(path) { + if (it && activity.createSAFDirectorySdk30(path)) { + sendSuccess(alertDialog, path) + } + } + activity.needsStupidWritePermissions(path) -> activity.handleSAFDialog(path) { + if (it) { + try { + val documentFile = activity.getDocumentFile(path.getParentPath()) + val newDir = documentFile?.createDirectory(path.getFilenameFromPath()) ?: activity.getDocumentFile(path) + if (newDir != null) { + sendSuccess(alertDialog, path) + } else { + activity.toast(R.string.unknown_error_occurred) + } + } catch (e: SecurityException) { + activity.showErrorToast(e) + } + } + } + File(path).mkdirs() -> sendSuccess(alertDialog, path) + isRPlus() && activity.isAStorageRootFolder(path.getParentPath()) -> activity.handleSAFCreateDocumentDialogSdk30(path) { + if (it) { + sendSuccess(alertDialog, path) + } + } + else -> activity.toast(activity.getString(R.string.could_not_create_folder, path.getFilenameFromPath())) + } + } catch (e: Exception) { + activity.showErrorToast(e) + } + } + + private fun sendSuccess(alertDialog: AlertDialog, path: String) { + callback(path.trimEnd('/')) + alertDialog.dismiss() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CustomIntervalPickerDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CustomIntervalPickerDialog.kt new file mode 100644 index 000000000..69d042330 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/CustomIntervalPickerDialog.kt @@ -0,0 +1,81 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.content.DialogInterface +import android.view.KeyEvent +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.DAY_SECONDS +import com.simplemobiletools.commons.helpers.HOUR_SECONDS +import com.simplemobiletools.commons.helpers.MINUTE_SECONDS +import kotlinx.android.synthetic.main.dialog_custom_interval_picker.view.* + +class CustomIntervalPickerDialog(val activity: Activity, val selectedSeconds: Int = 0, val showSeconds: Boolean = false, val callback: (minutes: Int) -> Unit) { + private var dialog: AlertDialog? = null + private var view = (activity.layoutInflater.inflate(R.layout.dialog_custom_interval_picker, null) as ViewGroup) + + init { + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmReminder() } + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this) { alertDialog -> + dialog = alertDialog + alertDialog.showKeyboard(view.findViewById(R.id.dialog_custom_interval_value)) + } + } + + view.apply { + dialog_radio_seconds.beVisibleIf(showSeconds) + when { + selectedSeconds == 0 -> dialog_radio_view.check(R.id.dialog_radio_minutes) + selectedSeconds % DAY_SECONDS == 0 -> { + dialog_radio_view.check(R.id.dialog_radio_days) + dialog_custom_interval_value.setText((selectedSeconds / DAY_SECONDS).toString()) + } + selectedSeconds % HOUR_SECONDS == 0 -> { + dialog_radio_view.check(R.id.dialog_radio_hours) + dialog_custom_interval_value.setText((selectedSeconds / HOUR_SECONDS).toString()) + } + selectedSeconds % MINUTE_SECONDS == 0 -> { + dialog_radio_view.check(R.id.dialog_radio_minutes) + dialog_custom_interval_value.setText((selectedSeconds / MINUTE_SECONDS).toString()) + } + else -> { + dialog_radio_view.check(R.id.dialog_radio_seconds) + dialog_custom_interval_value.setText(selectedSeconds.toString()) + } + } + + dialog_custom_interval_value.setOnKeyListener(object : View.OnKeyListener { + override fun onKey(v: View?, keyCode: Int, event: KeyEvent): Boolean { + if (event.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) { + dialog?.getButton(DialogInterface.BUTTON_POSITIVE)?.performClick() + return true + } + + return false + } + }) + } + } + + private fun confirmReminder() { + val value = view.dialog_custom_interval_value.value + val multiplier = getMultiplier(view.dialog_radio_view.checkedRadioButtonId) + val minutes = Integer.valueOf(if (value.isEmpty()) "0" else value) + callback(minutes * multiplier) + activity.hideKeyboard() + dialog?.dismiss() + } + + private fun getMultiplier(id: Int) = when (id) { + R.id.dialog_radio_days -> DAY_SECONDS + R.id.dialog_radio_hours -> HOUR_SECONDS + R.id.dialog_radio_minutes -> MINUTE_SECONDS + else -> 1 + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/DonateDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/DonateDialog.kt new file mode 100644 index 000000000..9d4fb4d39 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/DonateDialog.kt @@ -0,0 +1,28 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.Html +import android.text.method.LinkMovementMethod +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_donate.view.* + +class DonateDialog(val activity: Activity) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_donate, null).apply { + dialog_donate_image.applyColorFilter(activity.getProperTextColor()) + dialog_donate_text.text = Html.fromHtml(activity.getString(R.string.donate_short)) + dialog_donate_text.movementMethod = LinkMovementMethod.getInstance() + dialog_donate_image.setOnClickListener { + activity.launchViewIntent(R.string.thank_you_url) + } + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.purchase) { dialog, which -> activity.launchViewIntent(R.string.thank_you_url) } + .setNegativeButton(R.string.later, null) + .apply { + activity.setupDialogStuff(view, this, cancelOnTouchOutside = false) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportBlockedNumbersDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportBlockedNumbersDialog.kt new file mode 100644 index 000000000..eb3f4d58e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportBlockedNumbersDialog.kt @@ -0,0 +1,68 @@ +package com.simplemobiletools.commons.dialogs + +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.BLOCKED_NUMBERS_EXPORT_EXTENSION +import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import kotlinx.android.synthetic.main.dialog_export_blocked_numbers.view.* +import java.io.File + +class ExportBlockedNumbersDialog( + val activity: BaseSimpleActivity, + val path: String, + val hidePath: Boolean, + callback: (file: File) -> Unit, +) { + private var realPath = if (path.isEmpty()) activity.internalStoragePath else path + private val config = activity.baseConfig + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_export_blocked_numbers, null).apply { + export_blocked_numbers_folder.text = activity.humanizePath(realPath) + export_blocked_numbers_filename.setText("${activity.getString(R.string.blocked_numbers)}_${activity.getCurrentFormattedDateTime()}") + + if (hidePath) { + export_blocked_numbers_folder_label.beGone() + export_blocked_numbers_folder.beGone() + } else { + export_blocked_numbers_folder.setOnClickListener { + FilePickerDialog(activity, realPath, false, showFAB = true) { + export_blocked_numbers_folder.text = activity.humanizePath(it) + realPath = it + } + } + } + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this, R.string.export_blocked_numbers) { alertDialog -> + alertDialog.showKeyboard(view.export_blocked_numbers_filename) + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val filename = view.export_blocked_numbers_filename.value + when { + filename.isEmpty() -> activity.toast(R.string.empty_name) + filename.isAValidFilename() -> { + val file = File(realPath, "$filename$BLOCKED_NUMBERS_EXPORT_EXTENSION") + if (!hidePath && file.exists()) { + activity.toast(R.string.name_taken) + return@setOnClickListener + } + + ensureBackgroundThread { + config.lastBlockedNumbersExportPath = file.absolutePath.getParentPath() + callback(file) + alertDialog.dismiss() + } + } + else -> activity.toast(R.string.invalid_name) + } + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportSettingsDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportSettingsDialog.kt new file mode 100644 index 000000000..6b5589d5e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/ExportSettingsDialog.kt @@ -0,0 +1,71 @@ +package com.simplemobiletools.commons.dialogs + +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_export_settings.view.* + +class ExportSettingsDialog( + val activity: BaseSimpleActivity, val defaultFilename: String, val hidePath: Boolean, + callback: (path: String, filename: String) -> Unit +) { + init { + val lastUsedFolder = activity.baseConfig.lastExportedSettingsFolder + var folder = if (lastUsedFolder.isNotEmpty() && activity.getDoesFilePathExist(lastUsedFolder)) { + lastUsedFolder + } else { + activity.internalStoragePath + } + + val view = activity.layoutInflater.inflate(R.layout.dialog_export_settings, null).apply { + export_settings_filename.setText(defaultFilename.removeSuffix(".txt")) + + if (hidePath) { + export_settings_path_hint.beGone() + } else { + export_settings_path.setText(activity.humanizePath(folder)) + export_settings_path.setOnClickListener { + FilePickerDialog(activity, folder, false, showFAB = true) { + export_settings_path.setText(activity.humanizePath(it)) + folder = it + } + } + } + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this, R.string.export_settings) { alertDialog -> + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + var filename = view.export_settings_filename.value + if (filename.isEmpty()) { + activity.toast(R.string.filename_cannot_be_empty) + return@setOnClickListener + } + + filename += ".txt" + val newPath = "${folder.trimEnd('/')}/$filename" + if (!newPath.getFilenameFromPath().isAValidFilename()) { + activity.toast(R.string.filename_invalid_characters) + return@setOnClickListener + } + + activity.baseConfig.lastExportedSettingsFolder = folder + if (!hidePath && activity.getDoesFilePathExist(newPath)) { + val title = String.format(activity.getString(R.string.file_already_exists_overwrite), newPath.getFilenameFromPath()) + ConfirmationDialog(activity, title) { + callback(newPath, filename) + alertDialog.dismiss() + } + } else { + callback(newPath, filename) + alertDialog.dismiss() + } + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FeatureLockedDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FeatureLockedDialog.kt new file mode 100644 index 000000000..6c05e9c36 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FeatureLockedDialog.kt @@ -0,0 +1,40 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.Html +import android.text.method.LinkMovementMethod +import android.view.View +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_feature_locked.view.* + +class FeatureLockedDialog(val activity: Activity, val callback: () -> Unit) { + private var dialog: AlertDialog? = null + + init { + val view: View = activity.layoutInflater.inflate(R.layout.dialog_feature_locked, null) + view.feature_locked_image.applyColorFilter(activity.getProperTextColor()) + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.purchase, null) + .setNegativeButton(R.string.later) { dialog, which -> dismissDialog() } + .setOnDismissListener { dismissDialog() } + .apply { + activity.setupDialogStuff(view, this, cancelOnTouchOutside = false) { alertDialog -> + dialog = alertDialog + view.feature_locked_description.text = Html.fromHtml(activity.getString(R.string.features_locked)) + view.feature_locked_description.movementMethod = LinkMovementMethod.getInstance() + + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + activity.launchPurchaseThankYouIntent() + } + } + } + } + + fun dismissDialog() { + dialog?.dismiss() + callback() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FileConflictDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FileConflictDialog.kt new file mode 100644 index 000000000..d425c11d5 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FileConflictDialog.kt @@ -0,0 +1,66 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.R.id.conflict_dialog_radio_keep_both +import com.simplemobiletools.commons.R.id.conflict_dialog_radio_merge +import com.simplemobiletools.commons.R.id.conflict_dialog_radio_skip +import com.simplemobiletools.commons.extensions.baseConfig +import com.simplemobiletools.commons.extensions.beVisibleIf +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.helpers.CONFLICT_KEEP_BOTH +import com.simplemobiletools.commons.helpers.CONFLICT_MERGE +import com.simplemobiletools.commons.helpers.CONFLICT_OVERWRITE +import com.simplemobiletools.commons.helpers.CONFLICT_SKIP +import com.simplemobiletools.commons.models.FileDirItem +import kotlinx.android.synthetic.main.dialog_file_conflict.view.* + +class FileConflictDialog( + val activity: Activity, val fileDirItem: FileDirItem, val showApplyToAllCheckbox: Boolean, + val callback: (resolution: Int, applyForAll: Boolean) -> Unit +) { + val view = activity.layoutInflater.inflate(R.layout.dialog_file_conflict, null)!! + + init { + view.apply { + val stringBase = if (fileDirItem.isDirectory) R.string.folder_already_exists else R.string.file_already_exists + conflict_dialog_title.text = String.format(activity.getString(stringBase), fileDirItem.name) + conflict_dialog_apply_to_all.isChecked = activity.baseConfig.lastConflictApplyToAll + conflict_dialog_apply_to_all.beVisibleIf(showApplyToAllCheckbox) + conflict_dialog_divider.beVisibleIf(showApplyToAllCheckbox) + conflict_dialog_radio_merge.beVisibleIf(fileDirItem.isDirectory) + + val resolutionButton = when (activity.baseConfig.lastConflictResolution) { + CONFLICT_OVERWRITE -> conflict_dialog_radio_overwrite + CONFLICT_MERGE -> conflict_dialog_radio_merge + else -> conflict_dialog_radio_skip + } + resolutionButton.isChecked = true + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this) + } + } + + private fun dialogConfirmed() { + val resolution = when (view.conflict_dialog_radio_group.checkedRadioButtonId) { + conflict_dialog_radio_skip -> CONFLICT_SKIP + conflict_dialog_radio_merge -> CONFLICT_MERGE + conflict_dialog_radio_keep_both -> CONFLICT_KEEP_BOTH + else -> CONFLICT_OVERWRITE + } + + val applyToAll = view.conflict_dialog_apply_to_all.isChecked + activity.baseConfig.apply { + lastConflictApplyToAll = applyToAll + lastConflictResolution = resolution + } + + callback(resolution, applyToAll) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FilePickerDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FilePickerDialog.kt new file mode 100644 index 000000000..3582c322d --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FilePickerDialog.kt @@ -0,0 +1,356 @@ +package com.simplemobiletools.commons.dialogs + +import android.os.Environment +import android.os.Parcelable +import android.view.KeyEvent +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.documentfile.provider.DocumentFile +import androidx.recyclerview.widget.LinearLayoutManager +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.adapters.FilepickerFavoritesAdapter +import com.simplemobiletools.commons.adapters.FilepickerItemsAdapter +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.models.FileDirItem +import com.simplemobiletools.commons.views.Breadcrumbs +import kotlinx.android.synthetic.main.dialog_filepicker.view.* +import java.io.File + +/** + * The only filepicker constructor with a couple optional parameters + * + * @param activity has to be activity to avoid some Theme.AppCompat issues + * @param currPath initial path of the dialog, defaults to the external storage + * @param pickFile toggle used to determine if we are picking a file or a folder + * @param showHidden toggle for showing hidden items, whose name starts with a dot + * @param showFAB toggle the displaying of a Floating Action Button for creating new folders + * @param callback the callback used for returning the selected file/folder + */ +class FilePickerDialog( + val activity: BaseSimpleActivity, + var currPath: String = Environment.getExternalStorageDirectory().toString(), + val pickFile: Boolean = true, + var showHidden: Boolean = false, + val showFAB: Boolean = false, + val canAddShowHiddenButton: Boolean = false, + val forceShowRoot: Boolean = false, + val showFavoritesButton: Boolean = false, + private val enforceStorageRestrictions: Boolean = true, + val callback: (pickedPath: String) -> Unit +) : Breadcrumbs.BreadcrumbsListener { + + private var mFirstUpdate = true + private var mPrevPath = "" + private var mScrollStates = HashMap() + + private var mDialog: AlertDialog? = null + private var mDialogView = activity.layoutInflater.inflate(R.layout.dialog_filepicker, null) + + init { + if (!activity.getDoesFilePathExist(currPath)) { + currPath = activity.internalStoragePath + } + + if (!activity.getIsPathDirectory(currPath)) { + currPath = currPath.getParentPath() + } + + // do not allow copying files in the recycle bin manually + if (currPath.startsWith(activity.filesDir.absolutePath)) { + currPath = activity.internalStoragePath + } + + mDialogView.filepicker_breadcrumbs.apply { + listener = this@FilePickerDialog + updateFontSize(activity.getTextSize(), false) + isShownInDialog = true + } + + tryUpdateItems() + setupFavorites() + + val builder = activity.getAlertDialogBuilder() + .setNegativeButton(R.string.cancel, null) + .setOnKeyListener { dialogInterface, i, keyEvent -> + if (keyEvent.action == KeyEvent.ACTION_UP && i == KeyEvent.KEYCODE_BACK) { + val breadcrumbs = mDialogView.filepicker_breadcrumbs + if (breadcrumbs.getItemCount() > 1) { + breadcrumbs.removeBreadcrumb() + currPath = breadcrumbs.getLastItem().path.trimEnd('/') + tryUpdateItems() + } else { + mDialog?.dismiss() + } + } + true + } + + if (!pickFile) { + builder.setPositiveButton(R.string.ok, null) + } + + if (showFAB) { + mDialogView.filepicker_fab.apply { + beVisible() + setOnClickListener { createNewFolder() } + } + } + + val secondaryFabBottomMargin = activity.resources.getDimension(if (showFAB) R.dimen.secondary_fab_bottom_margin else R.dimen.activity_margin).toInt() + mDialogView.filepicker_fabs_holder.apply { + (layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = secondaryFabBottomMargin + } + + mDialogView.filepicker_placeholder.setTextColor(activity.getProperTextColor()) + mDialogView.filepicker_fastscroller.updateColors(activity.getProperPrimaryColor()) + mDialogView.filepicker_fab_show_hidden.apply { + beVisibleIf(!showHidden && canAddShowHiddenButton) + setOnClickListener { + activity.handleHiddenFolderPasswordProtection { + beGone() + showHidden = true + tryUpdateItems() + } + } + } + + mDialogView.filepicker_favorites_label.text = "${activity.getString(R.string.favorites)}:" + mDialogView.filepicker_fab_show_favorites.apply { + beVisibleIf(showFavoritesButton && context.baseConfig.favorites.isNotEmpty()) + setOnClickListener { + if (mDialogView.filepicker_favorites_holder.isVisible()) { + hideFavorites() + } else { + showFavorites() + } + } + } + + builder.apply { + activity.setupDialogStuff(mDialogView, this, getTitle()) { alertDialog -> + mDialog = alertDialog + } + } + + if (!pickFile) { + mDialog?.getButton(AlertDialog.BUTTON_POSITIVE)?.setOnClickListener { + verifyPath() + } + } + } + + private fun getTitle() = if (pickFile) R.string.select_file else R.string.select_folder + + private fun createNewFolder() { + CreateNewFolderDialog(activity, currPath) { + callback(it) + mDialog?.dismiss() + } + } + + private fun tryUpdateItems() { + ensureBackgroundThread { + getItems(currPath) { + activity.runOnUiThread { + mDialogView.filepicker_placeholder.beGone() + updateItems(it as ArrayList) + } + } + } + } + + private fun updateItems(items: ArrayList) { + if (!containsDirectory(items) && !mFirstUpdate && !pickFile && !showFAB) { + verifyPath() + return + } + + val sortedItems = items.sortedWith(compareBy({ !it.isDirectory }, { it.name.toLowerCase() })) + val adapter = FilepickerItemsAdapter(activity, sortedItems, mDialogView.filepicker_list) { + if ((it as FileDirItem).isDirectory) { + activity.handleLockedFolderOpening(it.path) { success -> + if (success) { + currPath = it.path + tryUpdateItems() + } + } + } else if (pickFile) { + currPath = it.path + verifyPath() + } + } + + val layoutManager = mDialogView.filepicker_list.layoutManager as LinearLayoutManager + mScrollStates[mPrevPath.trimEnd('/')] = layoutManager.onSaveInstanceState()!! + + mDialogView.apply { + filepicker_list.adapter = adapter + filepicker_breadcrumbs.setBreadcrumb(currPath) + + if (context.areSystemAnimationsEnabled) { + filepicker_list.scheduleLayoutAnimation() + } + + layoutManager.onRestoreInstanceState(mScrollStates[currPath.trimEnd('/')]) + } + + mFirstUpdate = false + mPrevPath = currPath + } + + private fun verifyPath() { + when { + activity.isRestrictedSAFOnlyRoot(currPath) -> { + val document = activity.getSomeAndroidSAFDocument(currPath) ?: return + sendSuccessForDocumentFile(document) + } + activity.isPathOnOTG(currPath) -> { + val fileDocument = activity.getSomeDocumentFile(currPath) ?: return + sendSuccessForDocumentFile(fileDocument) + } + activity.isAccessibleWithSAFSdk30(currPath) -> { + if (enforceStorageRestrictions) { + activity.handleSAFDialogSdk30(currPath) { + if (it) { + val document = activity.getSomeDocumentSdk30(currPath) + sendSuccessForDocumentFile(document ?: return@handleSAFDialogSdk30) + } + } + } else { + sendSuccessForDirectFile() + } + + } + activity.isRestrictedWithSAFSdk30(currPath) -> { + if (enforceStorageRestrictions) { + if (activity.isInDownloadDir(currPath)) { + sendSuccessForDirectFile() + } else { + activity.toast(R.string.system_folder_restriction, Toast.LENGTH_LONG) + } + } else { + sendSuccessForDirectFile() + } + } + else -> { + sendSuccessForDirectFile() + } + } + } + + private fun sendSuccessForDocumentFile(document: DocumentFile) { + if ((pickFile && document.isFile) || (!pickFile && document.isDirectory)) { + sendSuccess() + } + } + + private fun sendSuccessForDirectFile() { + val file = File(currPath) + if ((pickFile && file.isFile) || (!pickFile && file.isDirectory)) { + sendSuccess() + } + } + + private fun sendSuccess() { + currPath = if (currPath.length == 1) { + currPath + } else { + currPath.trimEnd('/') + } + + callback(currPath) + mDialog?.dismiss() + } + + private fun getItems(path: String, callback: (List) -> Unit) { + when { + activity.isRestrictedSAFOnlyRoot(path) -> { + activity.handleAndroidSAFDialog(path) { + activity.getAndroidSAFFileItems(path, showHidden) { + callback(it) + } + } + } + activity.isPathOnOTG(path) -> activity.getOTGItems(path, showHidden, false, callback) + else -> { + val lastModifieds = activity.getFolderLastModifieds(path) + getRegularItems(path, lastModifieds, callback) + } + } + } + + private fun getRegularItems(path: String, lastModifieds: HashMap, callback: (List) -> Unit) { + val items = ArrayList() + val files = File(path).listFiles()?.filterNotNull() + if (files == null) { + callback(items) + return + } + + for (file in files) { + if (!showHidden && file.name.startsWith('.')) { + continue + } + + val curPath = file.absolutePath + val curName = curPath.getFilenameFromPath() + val size = file.length() + var lastModified = lastModifieds.remove(curPath) + val isDirectory = if (lastModified != null) false else file.isDirectory + if (lastModified == null) { + lastModified = 0 // we don't actually need the real lastModified that badly, do not check file.lastModified() + } + + val children = if (isDirectory) file.getDirectChildrenCount(activity, showHidden) else 0 + items.add(FileDirItem(curPath, curName, isDirectory, children, size, lastModified)) + } + callback(items) + } + + private fun containsDirectory(items: List) = items.any { it.isDirectory } + + private fun setupFavorites() { + FilepickerFavoritesAdapter(activity, activity.baseConfig.favorites.toMutableList(), mDialogView.filepicker_favorites_list) { + currPath = it as String + verifyPath() + }.apply { + mDialogView.filepicker_favorites_list.adapter = this + } + } + + private fun showFavorites() { + mDialogView.apply { + filepicker_favorites_holder.beVisible() + filepicker_files_holder.beGone() + val drawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_folder_vector, activity.getProperPrimaryColor().getContrastColor()) + filepicker_fab_show_favorites.setImageDrawable(drawable) + } + } + + private fun hideFavorites() { + mDialogView.apply { + filepicker_favorites_holder.beGone() + filepicker_files_holder.beVisible() + val drawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_star_vector, activity.getProperPrimaryColor().getContrastColor()) + filepicker_fab_show_favorites.setImageDrawable(drawable) + } + } + + override fun breadcrumbClicked(id: Int) { + if (id == 0) { + StoragePickerDialog(activity, currPath, forceShowRoot, true) { + currPath = it + tryUpdateItems() + } + } else { + val item = mDialogView.filepicker_breadcrumbs.getItem(id) + if (currPath != item.path.trimEnd('/')) { + currPath = item.path + tryUpdateItems() + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FolderLockingNoticeDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FolderLockingNoticeDialog.kt new file mode 100644 index 000000000..8049cd4a8 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/FolderLockingNoticeDialog.kt @@ -0,0 +1,28 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.baseConfig +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_textview.view.* + +class FolderLockingNoticeDialog(val activity: Activity, val callback: () -> Unit) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_textview, null).apply { + text_view.text = activity.getString(R.string.lock_folder_notice) + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this, R.string.disclaimer) + } + } + + private fun dialogConfirmed() { + activity.baseConfig.wasFolderLockingNoticeShown = true + callback() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/LineColorPickerDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/LineColorPickerDialog.kt new file mode 100644 index 000000000..0c38870eb --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/LineColorPickerDialog.kt @@ -0,0 +1,147 @@ +package com.simplemobiletools.commons.dialogs + +import android.view.View +import android.view.WindowManager +import androidx.appcompat.app.AlertDialog +import com.google.android.material.appbar.MaterialToolbar +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.interfaces.LineColorPickerListener +import kotlinx.android.synthetic.main.dialog_line_color_picker.view.* + +class LineColorPickerDialog( + val activity: BaseSimpleActivity, val color: Int, val isPrimaryColorPicker: Boolean, val primaryColors: Int = R.array.md_primary_colors, + val appIconIDs: ArrayList? = null, val toolbar: MaterialToolbar? = null, val callback: (wasPositivePressed: Boolean, color: Int) -> Unit +) { + private val PRIMARY_COLORS_COUNT = 19 + private val DEFAULT_PRIMARY_COLOR_INDEX = 14 + private val DEFAULT_SECONDARY_COLOR_INDEX = 6 + private val DEFAULT_COLOR_VALUE = activity.resources.getColor(R.color.color_primary) + + private var wasDimmedBackgroundRemoved = false + private var dialog: AlertDialog? = null + private var view: View = activity.layoutInflater.inflate(R.layout.dialog_line_color_picker, null) + + init { + view.apply { + hex_code.text = color.toHex() + hex_code.setOnLongClickListener { + activity.copyToClipboard(hex_code.value.substring(1)) + true + } + + line_color_picker_icon.beGoneIf(isPrimaryColorPicker) + val indexes = getColorIndexes(color) + + val primaryColorIndex = indexes.first + primaryColorChanged(primaryColorIndex) + primary_line_color_picker.updateColors(getColors(primaryColors), primaryColorIndex) + primary_line_color_picker.listener = object : LineColorPickerListener { + override fun colorChanged(index: Int, color: Int) { + val secondaryColors = getColorsForIndex(index) + secondary_line_color_picker.updateColors(secondaryColors) + + val newColor = if (isPrimaryColorPicker) secondary_line_color_picker.getCurrentColor() else color + colorUpdated(newColor) + + if (!isPrimaryColorPicker) { + primaryColorChanged(index) + } + } + } + + secondary_line_color_picker.beVisibleIf(isPrimaryColorPicker) + secondary_line_color_picker.updateColors(getColorsForIndex(primaryColorIndex), indexes.second) + secondary_line_color_picker.listener = object : LineColorPickerListener { + override fun colorChanged(index: Int, color: Int) { + colorUpdated(color) + } + } + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(R.string.cancel) { dialog, which -> dialogDismissed() } + .setOnCancelListener { dialogDismissed() } + .apply { + activity.setupDialogStuff(view, this) { alertDialog -> + dialog = alertDialog + } + } + } + + fun getSpecificColor() = view.secondary_line_color_picker.getCurrentColor() + + private fun colorUpdated(color: Int) { + view.hex_code.text = color.toHex() + if (isPrimaryColorPicker) { + + if (toolbar != null) { + activity.updateTopBarColors(toolbar, color) + } + + if (!wasDimmedBackgroundRemoved) { + dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + wasDimmedBackgroundRemoved = true + } + } + } + + private fun getColorIndexes(color: Int): Pair { + if (color == DEFAULT_COLOR_VALUE) { + return getDefaultColorPair() + } + + for (i in 0 until PRIMARY_COLORS_COUNT) { + getColorsForIndex(i).indexOfFirst { color == it }.apply { + if (this != -1) { + return Pair(i, this) + } + } + } + + return getDefaultColorPair() + } + + private fun primaryColorChanged(index: Int) { + view.line_color_picker_icon.setImageResource(appIconIDs?.getOrNull(index) ?: 0) + } + + private fun getDefaultColorPair() = Pair(DEFAULT_PRIMARY_COLOR_INDEX, DEFAULT_SECONDARY_COLOR_INDEX) + + private fun dialogDismissed() { + callback(false, 0) + } + + private fun dialogConfirmed() { + val targetView = if (isPrimaryColorPicker) view.secondary_line_color_picker else view.primary_line_color_picker + val color = targetView.getCurrentColor() + callback(true, color) + } + + private fun getColorsForIndex(index: Int) = when (index) { + 0 -> getColors(R.array.md_reds) + 1 -> getColors(R.array.md_pinks) + 2 -> getColors(R.array.md_purples) + 3 -> getColors(R.array.md_deep_purples) + 4 -> getColors(R.array.md_indigos) + 5 -> getColors(R.array.md_blues) + 6 -> getColors(R.array.md_light_blues) + 7 -> getColors(R.array.md_cyans) + 8 -> getColors(R.array.md_teals) + 9 -> getColors(R.array.md_greens) + 10 -> getColors(R.array.md_light_greens) + 11 -> getColors(R.array.md_limes) + 12 -> getColors(R.array.md_yellows) + 13 -> getColors(R.array.md_ambers) + 14 -> getColors(R.array.md_oranges) + 15 -> getColors(R.array.md_deep_oranges) + 16 -> getColors(R.array.md_browns) + 17 -> getColors(R.array.md_blue_greys) + 18 -> getColors(R.array.md_greys) + else -> throw RuntimeException("Invalid color id $index") + } + + private fun getColors(id: Int) = activity.resources.getIntArray(id).toCollection(ArrayList()) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppDialog.kt new file mode 100644 index 000000000..d362076c6 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppDialog.kt @@ -0,0 +1,30 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.Html +import android.text.method.LinkMovementMethod +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_textview.view.* + +class NewAppDialog(val activity: Activity, val packageName: String, val title: String, val packageName2: String, val title2: String) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_textview, null).apply { + val text = String.format( + activity.getString(R.string.new_app), + "https://play.google.com/store/apps/details?id=$packageName", title, + "https://play.google.com/store/apps/details?id=$packageName2", title2 + ) + + text_view.text = Html.fromHtml(text) + text_view.movementMethod = LinkMovementMethod.getInstance() + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .apply { + activity.setupDialogStuff(view, this, cancelOnTouchOutside = false) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppsIconsDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppsIconsDialog.kt new file mode 100644 index 000000000..2d8896746 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/NewAppsIconsDialog.kt @@ -0,0 +1,40 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.Html +import android.text.method.LinkMovementMethod +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.launchViewIntent +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_new_apps_icons.view.* + +class NewAppsIconsDialog(val activity: Activity) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_new_apps_icons, null).apply { + val dialerUrl = "https://play.google.com/store/apps/details?id=com.simplemobiletools.dialer" + val smsMessengerUrl = "https://play.google.com/store/apps/details?id=com.simplemobiletools.smsmessenger" + val voiceRecorderUrl = "https://play.google.com/store/apps/details?id=com.simplemobiletools.voicerecorder" + + val text = String.format( + activity.getString(R.string.new_app), + dialerUrl, activity.getString(R.string.simple_dialer), + smsMessengerUrl, activity.getString(R.string.simple_sms_messenger), + voiceRecorderUrl, activity.getString(R.string.simple_voice_recorder) + ) + + new_apps_text.text = Html.fromHtml(text) + new_apps_text.movementMethod = LinkMovementMethod.getInstance() + + new_apps_dialer.setOnClickListener { activity.launchViewIntent(dialerUrl) } + new_apps_sms_messenger.setOnClickListener { activity.launchViewIntent(smsMessengerUrl) } + new_apps_voice_recorder.setOnClickListener { activity.launchViewIntent(voiceRecorderUrl) } + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .apply { + activity.setupDialogStuff(view, this, cancelOnTouchOutside = false) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PermissionRequiredDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PermissionRequiredDialog.kt new file mode 100644 index 000000000..88fcf7cec --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PermissionRequiredDialog.kt @@ -0,0 +1,27 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.openNotificationSettings +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_message.view.* + +class PermissionRequiredDialog(val activity: Activity, textId: Int) { + private var dialog: AlertDialog? = null + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_message, null) + view.message.text = activity.getString(textId) + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.grant_permission) { dialog, which -> activity.openNotificationSettings() } + .setNegativeButton(R.string.cancel, null).apply { + val title = activity.getString(R.string.permission_required) + activity.setupDialogStuff(view, this, titleText = title) { alertDialog -> + dialog = alertDialog + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PropertiesDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PropertiesDialog.kt new file mode 100644 index 000000000..8345443e1 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PropertiesDialog.kt @@ -0,0 +1,373 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.content.res.Resources +import android.net.Uri +import android.os.Environment +import android.provider.MediaStore +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.TextView +import androidx.appcompat.app.AlertDialog +import androidx.exifinterface.media.ExifInterface +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.FileDirItem +import kotlinx.android.synthetic.main.dialog_properties.view.* +import kotlinx.android.synthetic.main.item_property.view.* +import java.io.File +import java.util.* + +class PropertiesDialog() { + private lateinit var mInflater: LayoutInflater + private lateinit var mPropertyView: ViewGroup + private lateinit var mResources: Resources + private lateinit var mActivity: Activity + private lateinit var mDialogView: View + private var mCountHiddenItems = false + + /** + * A File Properties dialog constructor with an optional parameter, usable at 1 file selected + * + * @param activity request activity to avoid some Theme.AppCompat issues + * @param path the file path + * @param countHiddenItems toggle determining if we will count hidden files themselves and their sizes (reasonable only at directory properties) + */ + constructor(activity: Activity, path: String, countHiddenItems: Boolean = false) : this() { + if (!activity.getDoesFilePathExist(path) && !path.startsWith("content://")) { + activity.toast(String.format(activity.getString(R.string.source_file_doesnt_exist), path)) + return + } + + mActivity = activity + mInflater = LayoutInflater.from(activity) + mResources = activity.resources + mDialogView = mInflater.inflate(R.layout.dialog_properties, null) + mCountHiddenItems = countHiddenItems + mPropertyView = mDialogView.properties_holder!! + addProperties(path) + + val builder = activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + + if (!path.startsWith("content://") && path.canModifyEXIF() && activity.isPathOnInternalStorage(path)) { + if ((isRPlus() && Environment.isExternalStorageManager()) || (!isRPlus() && activity.hasPermission(PERMISSION_WRITE_STORAGE))) { + builder.setNeutralButton(R.string.remove_exif, null) + } + } + + builder.apply { + mActivity.setupDialogStuff(mDialogView, this, R.string.properties) { alertDialog -> + alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener { + removeEXIFFromPath(path) + } + } + } + } + + private fun addProperties(path: String) { + val fileDirItem = FileDirItem(path, path.getFilenameFromPath(), mActivity.getIsPathDirectory(path)) + addProperty(R.string.name, fileDirItem.name) + addProperty(R.string.path, fileDirItem.getParentPath()) + addProperty(R.string.size, "…", R.id.properties_size) + + ensureBackgroundThread { + val fileCount = fileDirItem.getProperFileCount(mActivity, mCountHiddenItems) + val size = fileDirItem.getProperSize(mActivity, mCountHiddenItems).formatSize() + + val directChildrenCount = if (fileDirItem.isDirectory) { + fileDirItem.getDirectChildrenCount(mActivity, mCountHiddenItems).toString() + } else { + 0 + } + + this.mActivity.runOnUiThread { + (mDialogView.findViewById(R.id.properties_size).property_value as TextView).text = size + + if (fileDirItem.isDirectory) { + (mDialogView.findViewById(R.id.properties_file_count).property_value as TextView).text = fileCount.toString() + (mDialogView.findViewById(R.id.properties_direct_children_count).property_value as TextView).text = + directChildrenCount.toString() + } + } + + if (!fileDirItem.isDirectory) { + val projection = arrayOf(MediaStore.Images.Media.DATE_MODIFIED) + val uri = MediaStore.Files.getContentUri("external") + val selection = "${MediaStore.MediaColumns.DATA} = ?" + val selectionArgs = arrayOf(path) + val cursor = mActivity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + val dateModified = cursor.getLongValue(MediaStore.Images.Media.DATE_MODIFIED) * 1000L + updateLastModified(mActivity, mDialogView, dateModified) + } else { + updateLastModified(mActivity, mDialogView, fileDirItem.getLastModified(mActivity)) + } + } + + val exif = if (isNougatPlus() && mActivity.isPathOnOTG(fileDirItem.path)) { + ExifInterface((mActivity as BaseSimpleActivity).getFileInputStreamSync(fileDirItem.path)!!) + } else if (isNougatPlus() && fileDirItem.path.startsWith("content://")) { + try { + ExifInterface(mActivity.contentResolver.openInputStream(Uri.parse(fileDirItem.path))!!) + } catch (e: Exception) { + return@ensureBackgroundThread + } + } else if (mActivity.isRestrictedSAFOnlyRoot(path)) { + try { + ExifInterface(mActivity.contentResolver.openInputStream(mActivity.getAndroidSAFUri(path))!!) + } catch (e: Exception) { + return@ensureBackgroundThread + } + } else { + try { + ExifInterface(fileDirItem.path) + } catch (e: Exception) { + return@ensureBackgroundThread + } + } + + val latLon = FloatArray(2) + if (exif.getLatLong(latLon)) { + mActivity.runOnUiThread { + addProperty(R.string.gps_coordinates, "${latLon[0]}, ${latLon[1]}") + } + } + + val altitude = exif.getAltitude(0.0) + if (altitude != 0.0) { + mActivity.runOnUiThread { + addProperty(R.string.altitude, "${altitude}m") + } + } + } + } + + when { + fileDirItem.isDirectory -> { + addProperty(R.string.direct_children_count, "…", R.id.properties_direct_children_count) + addProperty(R.string.files_count, "…", R.id.properties_file_count) + } + fileDirItem.path.isImageSlow() -> { + fileDirItem.getResolution(mActivity)?.let { addProperty(R.string.resolution, it.formatAsResolution()) } + } + fileDirItem.path.isAudioSlow() -> { + fileDirItem.getDuration(mActivity)?.let { addProperty(R.string.duration, it) } + fileDirItem.getTitle(mActivity)?.let { addProperty(R.string.song_title, it) } + fileDirItem.getArtist(mActivity)?.let { addProperty(R.string.artist, it) } + fileDirItem.getAlbum(mActivity)?.let { addProperty(R.string.album, it) } + } + fileDirItem.path.isVideoSlow() -> { + fileDirItem.getDuration(mActivity)?.let { addProperty(R.string.duration, it) } + fileDirItem.getResolution(mActivity)?.let { addProperty(R.string.resolution, it.formatAsResolution()) } + fileDirItem.getArtist(mActivity)?.let { addProperty(R.string.artist, it) } + fileDirItem.getAlbum(mActivity)?.let { addProperty(R.string.album, it) } + } + } + + if (fileDirItem.isDirectory) { + addProperty(R.string.last_modified, fileDirItem.getLastModified(mActivity).formatDate(mActivity)) + } else { + addProperty(R.string.last_modified, "…", R.id.properties_last_modified) + try { + addExifProperties(path, mActivity) + } catch (e: Exception) { + mActivity.showErrorToast(e) + return + } + + if (mActivity.baseConfig.appId.removeSuffix(".debug") == "com.simplemobiletools.filemanager.pro") { + addProperty(R.string.md5, "…", R.id.properties_md5) + ensureBackgroundThread { + val md5 = if (mActivity.isRestrictedSAFOnlyRoot(path)) { + mActivity.contentResolver.openInputStream(mActivity.getAndroidSAFUri(path))?.md5() + } else { + File(path).md5() + } + + mActivity.runOnUiThread { + if (md5 != null) { + (mDialogView.findViewById(R.id.properties_md5).property_value as TextView).text = md5 + } else { + mDialogView.findViewById(R.id.properties_md5).beGone() + } + } + } + } + } + } + + private fun updateLastModified(activity: Activity, view: View, timestamp: Long) { + activity.runOnUiThread { + (view.findViewById(R.id.properties_last_modified).property_value as TextView).text = timestamp.formatDate(activity) + } + } + + /** + * A File Properties dialog constructor with an optional parameter, usable at multiple items selected + * + * @param activity request activity to avoid some Theme.AppCompat issues + * @param path the file path + * @param countHiddenItems toggle determining if we will count hidden files themselves and their sizes + */ + constructor(activity: Activity, paths: List, countHiddenItems: Boolean = false) : this() { + mActivity = activity + mInflater = LayoutInflater.from(activity) + mResources = activity.resources + mDialogView = mInflater.inflate(R.layout.dialog_properties, null) + mCountHiddenItems = countHiddenItems + mPropertyView = mDialogView.properties_holder + + val fileDirItems = ArrayList(paths.size) + paths.forEach { + val fileDirItem = FileDirItem(it, it.getFilenameFromPath(), activity.getIsPathDirectory(it)) + fileDirItems.add(fileDirItem) + } + + val isSameParent = isSameParent(fileDirItems) + + addProperty(R.string.items_selected, paths.size.toString()) + if (isSameParent) { + addProperty(R.string.path, fileDirItems[0].getParentPath()) + } + + addProperty(R.string.size, "…", R.id.properties_size) + addProperty(R.string.files_count, "…", R.id.properties_file_count) + + ensureBackgroundThread { + val fileCount = fileDirItems.sumByInt { it.getProperFileCount(activity, countHiddenItems) } + val size = fileDirItems.sumByLong { it.getProperSize(activity, countHiddenItems) }.formatSize() + activity.runOnUiThread { + (mDialogView.findViewById(R.id.properties_size).property_value as TextView).text = size + (mDialogView.findViewById(R.id.properties_file_count).property_value as TextView).text = fileCount.toString() + } + } + + val builder = activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + + if (!paths.any { it.startsWith("content://") } && paths.any { it.canModifyEXIF() } && paths.any { activity.isPathOnInternalStorage(it) }) { + if ((isRPlus() && Environment.isExternalStorageManager()) || (!isRPlus() && activity.hasPermission(PERMISSION_WRITE_STORAGE))) { + builder.setNeutralButton(R.string.remove_exif, null) + } + } + + builder.apply { + mActivity.setupDialogStuff(mDialogView, this, R.string.properties) { alertDialog -> + alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener { + removeEXIFFromPaths(paths) + } + } + } + } + + private fun addExifProperties(path: String, activity: Activity) { + val exif = if (isNougatPlus() && activity.isPathOnOTG(path)) { + ExifInterface((activity as BaseSimpleActivity).getFileInputStreamSync(path)!!) + } else if (isNougatPlus() && path.startsWith("content://")) { + try { + ExifInterface(activity.contentResolver.openInputStream(Uri.parse(path))!!) + } catch (e: Exception) { + return + } + } else if (activity.isRestrictedSAFOnlyRoot(path)) { + try { + ExifInterface(activity.contentResolver.openInputStream(activity.getAndroidSAFUri(path))!!) + } catch (e: Exception) { + return + } + } else { + ExifInterface(path) + } + + val dateTaken = exif.getExifDateTaken(activity) + if (dateTaken.isNotEmpty()) { + addProperty(R.string.date_taken, dateTaken) + } + + val cameraModel = exif.getExifCameraModel() + if (cameraModel.isNotEmpty()) { + addProperty(R.string.camera, cameraModel) + } + + val exifString = exif.getExifProperties() + if (exifString.isNotEmpty()) { + addProperty(R.string.exif, exifString) + } + } + + private fun removeEXIFFromPath(path: String) { + ConfirmationDialog(mActivity, "", R.string.remove_exif_confirmation) { + try { + ExifInterface(path).removeValues() + mActivity.toast(R.string.exif_removed) + + mPropertyView.properties_holder.removeAllViews() + addProperties(path) + } catch (e: Exception) { + mActivity.showErrorToast(e) + } + } + } + + private fun removeEXIFFromPaths(paths: List) { + ConfirmationDialog(mActivity, "", R.string.remove_exif_confirmation) { + try { + paths.filter { mActivity.isPathOnInternalStorage(it) && it.canModifyEXIF() }.forEach { + ExifInterface(it).removeValues() + } + mActivity.toast(R.string.exif_removed) + } catch (e: Exception) { + mActivity.showErrorToast(e) + } + } + } + + private fun isSameParent(fileDirItems: List): Boolean { + var parent = fileDirItems[0].getParentPath() + for (file in fileDirItems) { + val curParent = file.getParentPath() + if (curParent != parent) { + return false + } + + parent = curParent + } + return true + } + + private fun addProperty(labelId: Int, value: String?, viewId: Int = 0) { + if (value == null) { + return + } + + mInflater.inflate(R.layout.item_property, mPropertyView, false).apply { + property_value.setTextColor(mActivity.getProperTextColor()) + property_label.setTextColor(mActivity.getProperTextColor()) + + property_label.text = mResources.getString(labelId) + property_value.text = value + mPropertyView.properties_holder.addView(this) + + setOnLongClickListener { + mActivity.copyToClipboard(property_value.value) + true + } + + if (labelId == R.string.gps_coordinates) { + setOnClickListener { + mActivity.showLocationOnMap(value) + } + } + + if (viewId != 0) { + id = viewId + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PurchaseThankYouDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PurchaseThankYouDialog.kt new file mode 100644 index 000000000..3e37c887f --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/PurchaseThankYouDialog.kt @@ -0,0 +1,30 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.Html +import android.text.method.LinkMovementMethod +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_purchase_thank_you.view.* + +class PurchaseThankYouDialog(val activity: Activity) { + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_purchase_thank_you, null).apply { + var text = activity.getString(R.string.purchase_thank_you) + if (activity.baseConfig.appId.removeSuffix(".debug").endsWith(".pro")) { + text += "

${activity.getString(R.string.shared_theme_note)}" + } + + purchase_thank_you.text = Html.fromHtml(text) + purchase_thank_you.movementMethod = LinkMovementMethod.getInstance() + purchase_thank_you.removeUnderlines() + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.purchase) { dialog, which -> activity.launchPurchaseThankYouIntent() } + .setNegativeButton(R.string.later, null) + .apply { + activity.setupDialogStuff(view, this, cancelOnTouchOutside = false) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RadioGroupDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RadioGroupDialog.kt new file mode 100644 index 000000000..7907e5258 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RadioGroupDialog.kt @@ -0,0 +1,73 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.view.View +import android.view.ViewGroup +import android.widget.RadioButton +import android.widget.RadioGroup +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.onGlobalLayout +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.models.RadioItem +import kotlinx.android.synthetic.main.dialog_radio_group.view.* + +class RadioGroupDialog( + val activity: Activity, val items: ArrayList, val checkedItemId: Int = -1, val titleId: Int = 0, + showOKButton: Boolean = false, val cancelCallback: (() -> Unit)? = null, val callback: (newValue: Any) -> Unit +) { + private var dialog: AlertDialog? = null + private var wasInit = false + private var selectedItemId = -1 + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_radio_group, null) + view.dialog_radio_group.apply { + for (i in 0 until items.size) { + val radioButton = (activity.layoutInflater.inflate(R.layout.radio_button, null) as RadioButton).apply { + text = items[i].title + isChecked = items[i].id == checkedItemId + id = i + setOnClickListener { itemSelected(i) } + } + + if (items[i].id == checkedItemId) { + selectedItemId = i + } + + addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) + } + } + + val builder = activity.getAlertDialogBuilder() + .setOnCancelListener { cancelCallback?.invoke() } + + if (selectedItemId != -1 && showOKButton) { + builder.setPositiveButton(R.string.ok) { dialog, which -> itemSelected(selectedItemId) } + } + + builder.apply { + activity.setupDialogStuff(view, this, titleId) { alertDialog -> + dialog = alertDialog + } + } + + if (selectedItemId != -1) { + view.dialog_radio_holder.apply { + onGlobalLayout { + scrollY = view.dialog_radio_group.findViewById(selectedItemId).bottom - height + } + } + } + + wasInit = true + } + + private fun itemSelected(checkedId: Int) { + if (wasInit) { + callback(items[checkedId].value) + dialog?.dismiss() + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateStarsDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateStarsDialog.kt new file mode 100644 index 000000000..1b0948aea --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateStarsDialog.kt @@ -0,0 +1,46 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_rate_stars.view.* + +class RateStarsDialog(val activity: Activity) { + private var dialog: AlertDialog? = null + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_rate_stars, null).apply { + val primaryColor = activity.getProperPrimaryColor() + arrayOf(rate_star_1, rate_star_2, rate_star_3, rate_star_4, rate_star_5).forEach { + it.applyColorFilter(primaryColor) + } + + rate_star_1.setOnClickListener { dialogCancelled(true) } + rate_star_2.setOnClickListener { dialogCancelled(true) } + rate_star_3.setOnClickListener { dialogCancelled(true) } + rate_star_4.setOnClickListener { dialogCancelled(true) } + rate_star_5.setOnClickListener { + activity.redirectToRateUs() + dialogCancelled(true) + } + } + + activity.getAlertDialogBuilder() + .setNegativeButton(R.string.later) { dialog, which -> dialogCancelled(false) } + .setOnCancelListener { dialogCancelled(false) } + .apply { + activity.setupDialogStuff(view, this, cancelOnTouchOutside = false) { alertDialog -> + dialog = alertDialog + } + } + } + + private fun dialogCancelled(showThankYou: Boolean) { + dialog?.dismiss() + if (showThankYou) { + activity.toast(R.string.thank_you) + activity.baseConfig.wasAppRated = true + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateUsDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateUsDialog.kt new file mode 100644 index 000000000..b9eb11961 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RateUsDialog.kt @@ -0,0 +1,24 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.content.ActivityNotFoundException +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getStoreUrl +import com.simplemobiletools.commons.extensions.launchViewIntent + +class RateUsDialog(val activity: Activity) { + + init { + ConfirmationDialog(activity, "", R.string.rate_us_prompt, R.string.rate, R.string.cancel) { + launchGooglePlay() + } + } + + private fun launchGooglePlay() { + try { + activity.launchViewIntent("market://details?id=${activity.packageName.removeSuffix(".debug")}") + } catch (ignored: ActivityNotFoundException) { + activity.launchViewIntent(activity.getStoreUrl()) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameDialog.kt new file mode 100644 index 000000000..3e338ae72 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameDialog.kt @@ -0,0 +1,76 @@ +package com.simplemobiletools.commons.dialogs + +import android.view.LayoutInflater +import android.view.WindowManager +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.adapters.RenameAdapter +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.RENAME_PATTERN +import com.simplemobiletools.commons.helpers.RENAME_SIMPLE +import com.simplemobiletools.commons.views.MyViewPager +import kotlinx.android.synthetic.main.dialog_rename.view.* + +class RenameDialog(val activity: BaseSimpleActivity, val paths: ArrayList, val useMediaFileExtension: Boolean, val callback: () -> Unit) { + var dialog: AlertDialog? = null + val view = LayoutInflater.from(activity).inflate(R.layout.dialog_rename, null) + var tabsAdapter: RenameAdapter + var viewPager: MyViewPager + + init { + view.apply { + viewPager = findViewById(R.id.dialog_tab_view_pager) + tabsAdapter = RenameAdapter(activity, paths) + viewPager.adapter = tabsAdapter + viewPager.onPageChangeListener { + dialog_tab_layout.getTabAt(it)!!.select() + } + viewPager.currentItem = activity.baseConfig.lastRenameUsed + + if (activity.baseConfig.isUsingSystemTheme) { + dialog_tab_layout.setBackgroundColor(activity.resources.getColor(R.color.you_dialog_background_color)) + } else { + dialog_tab_layout.setBackgroundColor(context.getProperBackgroundColor()) + } + + val textColor = context.getProperTextColor() + dialog_tab_layout.setTabTextColors(textColor, textColor) + dialog_tab_layout.setSelectedTabIndicatorColor(context.getProperPrimaryColor()) + + if (activity.baseConfig.isUsingSystemTheme) { + dialog_tab_layout.setBackgroundColor(activity.resources.getColor(R.color.you_dialog_background_color)) + } + + dialog_tab_layout.onTabSelectionChanged(tabSelectedAction = { + viewPager.currentItem = when { + it.text.toString().equals(resources.getString(R.string.simple_renaming), true) -> RENAME_SIMPLE + else -> RENAME_PATTERN + } + }) + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel) { dialog, which -> dismissDialog() } + .apply { + activity.setupDialogStuff(view, this) { alertDialog -> + dialog = alertDialog + alertDialog.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + tabsAdapter.dialogConfirmed(useMediaFileExtension, viewPager.currentItem) { + dismissDialog() + if (it) { + activity.baseConfig.lastRenameUsed = viewPager.currentItem + callback() + } + } + } + } + } + } + + private fun dismissDialog() { + dialog?.dismiss() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemDialog.kt new file mode 100644 index 000000000..b39295092 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemDialog.kt @@ -0,0 +1,88 @@ +package com.simplemobiletools.commons.dialogs + +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_rename_item.view.* + +class RenameItemDialog(val activity: BaseSimpleActivity, val path: String, val callback: (newPath: String) -> Unit) { + init { + var ignoreClicks = false + val fullName = path.getFilenameFromPath() + val dotAt = fullName.lastIndexOf(".") + var name = fullName + + val view = activity.layoutInflater.inflate(R.layout.dialog_rename_item, null).apply { + if (dotAt > 0 && !activity.getIsPathDirectory(path)) { + name = fullName.substring(0, dotAt) + val extension = fullName.substring(dotAt + 1) + rename_item_extension.setText(extension) + } else { + rename_item_extension_hint.beGone() + } + + rename_item_name.setText(name) + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this, R.string.rename) { alertDialog -> + alertDialog.showKeyboard(view.rename_item_name) + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + if (ignoreClicks) { + return@setOnClickListener + } + + var newName = view.rename_item_name.value + val newExtension = view.rename_item_extension.value + + if (newName.isEmpty()) { + activity.toast(R.string.empty_name) + return@setOnClickListener + } + + if (!newName.isAValidFilename()) { + activity.toast(R.string.invalid_name) + return@setOnClickListener + } + + val updatedPaths = ArrayList() + updatedPaths.add(path) + if (!newExtension.isEmpty()) { + newName += ".$newExtension" + } + + if (!activity.getDoesFilePathExist(path)) { + activity.toast(String.format(activity.getString(R.string.source_file_doesnt_exist), path)) + return@setOnClickListener + } + + val newPath = "${path.getParentPath()}/$newName" + + if (path == newPath) { + activity.toast(R.string.name_taken) + return@setOnClickListener + } + + if (!path.equals(newPath, ignoreCase = true) && activity.getDoesFilePathExist(newPath)) { + activity.toast(R.string.name_taken) + return@setOnClickListener + } + + updatedPaths.add(newPath) + ignoreClicks = true + activity.renameFile(path, newPath, false) { success, _ -> + ignoreClicks = false + if (success) { + callback(newPath) + alertDialog.dismiss() + } + } + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemsDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemsDialog.kt new file mode 100644 index 000000000..e5a6395aa --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/RenameItemsDialog.kt @@ -0,0 +1,95 @@ +package com.simplemobiletools.commons.dialogs + +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_rename_items.view.* + +// used at renaming folders +class RenameItemsDialog(val activity: BaseSimpleActivity, val paths: ArrayList, val callback: () -> Unit) { + init { + var ignoreClicks = false + val view = activity.layoutInflater.inflate(R.layout.dialog_rename_items, null) + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this, R.string.rename) { alertDialog -> + alertDialog.showKeyboard(view.rename_items_value) + alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + if (ignoreClicks) { + return@setOnClickListener + } + + val valueToAdd = view.rename_items_value.text.toString() + val append = view.rename_items_radio_group.checkedRadioButtonId == view.rename_items_radio_append.id + + if (valueToAdd.isEmpty()) { + callback() + alertDialog.dismiss() + return@setOnClickListener + } + + if (!valueToAdd.isAValidFilename()) { + activity.toast(R.string.invalid_name) + return@setOnClickListener + } + + val validPaths = paths.filter { activity.getDoesFilePathExist(it) } + val sdFilePath = validPaths.firstOrNull { activity.isPathOnSD(it) } ?: validPaths.firstOrNull() + if (sdFilePath == null) { + activity.toast(R.string.unknown_error_occurred) + alertDialog.dismiss() + return@setOnClickListener + } + + activity.handleSAFDialog(sdFilePath) { + if (!it) { + return@handleSAFDialog + } + + ignoreClicks = true + var pathsCnt = validPaths.size + for (path in validPaths) { + val fullName = path.getFilenameFromPath() + var dotAt = fullName.lastIndexOf(".") + if (dotAt == -1) { + dotAt = fullName.length + } + + val name = fullName.substring(0, dotAt) + val extension = if (fullName.contains(".")) ".${fullName.getFilenameExtension()}" else "" + + val newName = if (append) { + "$name$valueToAdd$extension" + } else { + "$valueToAdd$fullName" + } + + val newPath = "${path.getParentPath()}/$newName" + + if (activity.getDoesFilePathExist(newPath)) { + continue + } + + activity.renameFile(path, newPath, true) { success, _ -> + if (success) { + pathsCnt-- + if (pathsCnt == 0) { + callback() + alertDialog.dismiss() + } + } else { + ignoreClicks = false + alertDialog.dismiss() + } + } + } + } + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SecurityDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SecurityDialog.kt new file mode 100644 index 000000000..ea39eb2d5 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SecurityDialog.kt @@ -0,0 +1,118 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.view.LayoutInflater +import androidx.appcompat.app.AlertDialog +import androidx.biometric.auth.AuthPromptHost +import androidx.fragment.app.FragmentActivity +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.adapters.PasswordTypesAdapter +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.interfaces.HashListener +import com.simplemobiletools.commons.views.MyDialogViewPager +import kotlinx.android.synthetic.main.dialog_security.view.* + +class SecurityDialog( + private val activity: Activity, + private val requiredHash: String, + private val showTabIndex: Int, + private val callback: (hash: String, type: Int, success: Boolean) -> Unit +) : HashListener { + private var dialog: AlertDialog? = null + private val view = LayoutInflater.from(activity).inflate(R.layout.dialog_security, null) + private var tabsAdapter: PasswordTypesAdapter + private var viewPager: MyDialogViewPager + + init { + view.apply { + viewPager = findViewById(R.id.dialog_tab_view_pager) + viewPager.offscreenPageLimit = 2 + tabsAdapter = PasswordTypesAdapter( + context = context, + requiredHash = requiredHash, + hashListener = this@SecurityDialog, + scrollView = dialog_scrollview, + biometricPromptHost = AuthPromptHost(activity as FragmentActivity), + showBiometricIdTab = shouldShowBiometricIdTab(), + showBiometricAuthentication = showTabIndex == PROTECTION_FINGERPRINT && isRPlus() + ) + viewPager.adapter = tabsAdapter + viewPager.onPageChangeListener { + dialog_tab_layout.getTabAt(it)?.select() + } + + viewPager.onGlobalLayout { + updateTabVisibility() + } + + if (showTabIndex == SHOW_ALL_TABS) { + val textColor = context.getProperTextColor() + + if (shouldShowBiometricIdTab()) { + val tabTitle = if (isRPlus()) R.string.biometrics else R.string.fingerprint + dialog_tab_layout.addTab(dialog_tab_layout.newTab().setText(tabTitle), PROTECTION_FINGERPRINT) + } + + if (activity.baseConfig.isUsingSystemTheme) { + dialog_tab_layout.setBackgroundColor(activity.resources.getColor(R.color.you_dialog_background_color)) + } else { + dialog_tab_layout.setBackgroundColor(context.getProperBackgroundColor()) + } + + dialog_tab_layout.setTabTextColors(textColor, textColor) + dialog_tab_layout.setSelectedTabIndicatorColor(context.getProperPrimaryColor()) + dialog_tab_layout.onTabSelectionChanged(tabSelectedAction = { + viewPager.currentItem = when { + it.text.toString().equals(resources.getString(R.string.pattern), true) -> PROTECTION_PATTERN + it.text.toString().equals(resources.getString(R.string.pin), true) -> PROTECTION_PIN + else -> PROTECTION_FINGERPRINT + } + updateTabVisibility() + }) + } else { + dialog_tab_layout.beGone() + viewPager.currentItem = showTabIndex + viewPager.allowSwiping = false + } + } + + activity.getAlertDialogBuilder() + .setOnCancelListener { onCancelFail() } + .setNegativeButton(R.string.cancel) { _, _ -> onCancelFail() } + .apply { + activity.setupDialogStuff(view, this) { alertDialog -> + dialog = alertDialog + } + } + } + + private fun onCancelFail() { + callback("", 0, false) + dialog?.dismiss() + } + + override fun receivedHash(hash: String, type: Int) { + callback(hash, type, true) + if (!activity.isFinishing) { + try { + dialog?.dismiss() + } catch (ignored: Exception) { + } + } + } + + private fun updateTabVisibility() { + for (i in 0..2) { + tabsAdapter.isTabVisible(i, viewPager.currentItem == i) + } + } + + private fun shouldShowBiometricIdTab(): Boolean { + return if (isRPlus()) { + activity.isBiometricIdAvailable() + } else { + activity.isFingerPrintSensorAvailable() + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SelectAlarmSoundDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SelectAlarmSoundDialog.kt new file mode 100644 index 000000000..a947a3468 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/SelectAlarmSoundDialog.kt @@ -0,0 +1,166 @@ +package com.simplemobiletools.commons.dialogs + +import android.content.ActivityNotFoundException +import android.content.Intent +import android.media.MediaPlayer +import android.net.Uri +import android.view.ViewGroup +import android.widget.RadioGroup +import androidx.appcompat.app.AlertDialog +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.SILENT +import com.simplemobiletools.commons.models.AlarmSound +import com.simplemobiletools.commons.models.RadioItem +import com.simplemobiletools.commons.views.MyCompatRadioButton +import kotlinx.android.synthetic.main.dialog_select_alarm_sound.view.* + +class SelectAlarmSoundDialog( + val activity: BaseSimpleActivity, val currentUri: String, val audioStream: Int, val pickAudioIntentId: Int, + val type: Int, val loopAudio: Boolean, val onAlarmPicked: (alarmSound: AlarmSound?) -> Unit, + val onAlarmSoundDeleted: (alarmSound: AlarmSound) -> Unit +) { + private val ADD_NEW_SOUND_ID = -2 + + private val view = activity.layoutInflater.inflate(R.layout.dialog_select_alarm_sound, null) + private var systemAlarmSounds = ArrayList() + private var yourAlarmSounds = ArrayList() + private var mediaPlayer: MediaPlayer? = null + private val config = activity.baseConfig + private var dialog: AlertDialog? = null + + init { + activity.getAlarmSounds(type) { + systemAlarmSounds = it + gotSystemAlarms() + } + + view.dialog_select_alarm_your_label.setTextColor(activity.getProperPrimaryColor()) + view.dialog_select_alarm_system_label.setTextColor(activity.getProperPrimaryColor()) + + addYourAlarms() + + activity.getAlertDialogBuilder() + .setOnDismissListener { mediaPlayer?.stop() } + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this) { alertDialog -> + dialog = alertDialog + alertDialog.window?.volumeControlStream = audioStream + } + } + } + + private fun addYourAlarms() { + view.dialog_select_alarm_your_radio.removeAllViews() + val token = object : TypeToken>() {}.type + yourAlarmSounds = Gson().fromJson>(config.yourAlarmSounds, token) ?: ArrayList() + yourAlarmSounds.add(AlarmSound(ADD_NEW_SOUND_ID, activity.getString(R.string.add_new_sound), "")) + yourAlarmSounds.forEach { + addAlarmSound(it, view.dialog_select_alarm_your_radio) + } + } + + private fun gotSystemAlarms() { + systemAlarmSounds.forEach { + addAlarmSound(it, view.dialog_select_alarm_system_radio) + } + } + + private fun addAlarmSound(alarmSound: AlarmSound, holder: ViewGroup) { + val radioButton = (activity.layoutInflater.inflate(R.layout.item_select_alarm_sound, null) as MyCompatRadioButton).apply { + text = alarmSound.title + isChecked = alarmSound.uri == currentUri + id = alarmSound.id + setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) + setOnClickListener { + alarmClicked(alarmSound) + + if (holder == view.dialog_select_alarm_system_radio) { + view.dialog_select_alarm_your_radio.clearCheck() + } else { + view.dialog_select_alarm_system_radio.clearCheck() + } + } + + if (alarmSound.id != -2 && holder == view.dialog_select_alarm_your_radio) { + setOnLongClickListener { + val items = arrayListOf(RadioItem(1, context.getString(R.string.remove))) + + RadioGroupDialog(activity, items) { + removeAlarmSound(alarmSound) + } + true + } + } + } + + holder.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) + } + + private fun alarmClicked(alarmSound: AlarmSound) { + when { + alarmSound.uri == SILENT -> mediaPlayer?.stop() + alarmSound.id == ADD_NEW_SOUND_ID -> { + val action = Intent.ACTION_OPEN_DOCUMENT + val intent = Intent(action).apply { + type = "audio/*" + flags = flags or Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION + } + + try { + activity.startActivityForResult(intent, pickAudioIntentId) + } catch (e: ActivityNotFoundException) { + activity.toast(R.string.no_app_found) + } + dialog?.dismiss() + } + else -> try { + mediaPlayer?.reset() + if (mediaPlayer == null) { + mediaPlayer = MediaPlayer().apply { + setAudioStreamType(audioStream) + isLooping = loopAudio + } + } + + mediaPlayer?.apply { + setDataSource(activity, Uri.parse(alarmSound.uri)) + prepare() + start() + } + } catch (e: Exception) { + activity.showErrorToast(e) + } + } + } + + private fun removeAlarmSound(alarmSound: AlarmSound) { + val token = object : TypeToken>() {}.type + yourAlarmSounds = Gson().fromJson>(config.yourAlarmSounds, token) ?: ArrayList() + yourAlarmSounds.remove(alarmSound) + config.yourAlarmSounds = Gson().toJson(yourAlarmSounds) + addYourAlarms() + + if (alarmSound.id == view.dialog_select_alarm_your_radio.checkedRadioButtonId) { + view.dialog_select_alarm_your_radio.clearCheck() + view.dialog_select_alarm_system_radio.check(systemAlarmSounds.firstOrNull()?.id ?: 0) + } + + onAlarmSoundDeleted(alarmSound) + } + + private fun dialogConfirmed() { + if (view.dialog_select_alarm_your_radio.checkedRadioButtonId != -1) { + val checkedId = view.dialog_select_alarm_your_radio.checkedRadioButtonId + onAlarmPicked(yourAlarmSounds.firstOrNull { it.id == checkedId }) + } else { + val checkedId = view.dialog_select_alarm_system_radio.checkedRadioButtonId + onAlarmPicked(systemAlarmSounds.firstOrNull { it.id == checkedId }) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/StoragePickerDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/StoragePickerDialog.kt new file mode 100644 index 000000000..0d7355b37 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/StoragePickerDialog.kt @@ -0,0 +1,146 @@ +package com.simplemobiletools.commons.dialogs + +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.RadioButton +import android.widget.RadioGroup +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_radio_group.view.* + +/** + * A dialog for choosing between internal, root, SD card (optional) storage + * + * @param activity has to be activity to avoid some Theme.AppCompat issues + * @param currPath current path to decide which storage should be preselected + * @param pickSingleOption if only one option like "Internal" is available, select it automatically + * @param callback an anonymous function + * + */ +class StoragePickerDialog( + val activity: BaseSimpleActivity, val currPath: String, val showRoot: Boolean, pickSingleOption: Boolean, + val callback: (pickedPath: String) -> Unit +) { + private val ID_INTERNAL = 1 + private val ID_SD = 2 + private val ID_OTG = 3 + private val ID_ROOT = 4 + + private lateinit var radioGroup: RadioGroup + private var dialog: AlertDialog? = null + private var defaultSelectedId = 0 + private val availableStorages = ArrayList() + + init { + availableStorages.add(activity.internalStoragePath) + when { + activity.hasExternalSDCard() -> availableStorages.add(activity.sdCardPath) + activity.hasOTGConnected() -> availableStorages.add("otg") + showRoot -> availableStorages.add("root") + } + + if (pickSingleOption && availableStorages.size == 1) { + callback(availableStorages.first()) + } else { + initDialog() + } + } + + private fun initDialog() { + val inflater = LayoutInflater.from(activity) + val resources = activity.resources + val layoutParams = RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + val view = inflater.inflate(R.layout.dialog_radio_group, null) + radioGroup = view.dialog_radio_group + val basePath = currPath.getBasePath(activity) + + val internalButton = inflater.inflate(R.layout.radio_button, null) as RadioButton + internalButton.apply { + id = ID_INTERNAL + text = resources.getString(R.string.internal) + isChecked = basePath == context.internalStoragePath + setOnClickListener { internalPicked() } + if (isChecked) { + defaultSelectedId = id + } + } + radioGroup.addView(internalButton, layoutParams) + + if (activity.hasExternalSDCard()) { + val sdButton = inflater.inflate(R.layout.radio_button, null) as RadioButton + sdButton.apply { + id = ID_SD + text = resources.getString(R.string.sd_card) + isChecked = basePath == context.sdCardPath + setOnClickListener { sdPicked() } + if (isChecked) { + defaultSelectedId = id + } + } + radioGroup.addView(sdButton, layoutParams) + } + + if (activity.hasOTGConnected()) { + val otgButton = inflater.inflate(R.layout.radio_button, null) as RadioButton + otgButton.apply { + id = ID_OTG + text = resources.getString(R.string.usb) + isChecked = basePath == context.otgPath + setOnClickListener { otgPicked() } + if (isChecked) { + defaultSelectedId = id + } + } + radioGroup.addView(otgButton, layoutParams) + } + + // allow for example excluding the root folder at the gallery + if (showRoot) { + val rootButton = inflater.inflate(R.layout.radio_button, null) as RadioButton + rootButton.apply { + id = ID_ROOT + text = resources.getString(R.string.root) + isChecked = basePath == "/" + setOnClickListener { rootPicked() } + if (isChecked) { + defaultSelectedId = id + } + } + radioGroup.addView(rootButton, layoutParams) + } + + activity.getAlertDialogBuilder().apply { + activity.setupDialogStuff(view, this, R.string.select_storage) { alertDialog -> + dialog = alertDialog + } + } + } + + private fun internalPicked() { + dialog?.dismiss() + callback(activity.internalStoragePath) + } + + private fun sdPicked() { + dialog?.dismiss() + callback(activity.sdCardPath) + } + + private fun otgPicked() { + activity.handleOTGPermission { + if (it) { + callback(activity.otgPath) + dialog?.dismiss() + } else { + radioGroup.check(defaultSelectedId) + } + } + } + + private fun rootPicked() { + dialog?.dismiss() + callback("/") + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/UpgradeToProDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/UpgradeToProDialog.kt new file mode 100644 index 000000000..86563e638 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/UpgradeToProDialog.kt @@ -0,0 +1,39 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.launchUpgradeToProIntent +import com.simplemobiletools.commons.extensions.launchViewIntent +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_upgrade_to_pro.view.* + +class UpgradeToProDialog(val activity: Activity) { + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_upgrade_to_pro, null).apply { + upgrade_to_pro.text = activity.getString(R.string.upgrade_to_pro_long) + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.upgrade) { dialog, which -> upgradeApp() } + .setNeutralButton(R.string.more_info, null) // do not dismiss the dialog on pressing More Info + .setNegativeButton(R.string.later, null) + .apply { + activity.setupDialogStuff(view, this, R.string.upgrade_to_pro, cancelOnTouchOutside = false) { alertDialog -> + alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener { + moreInfo() + } + } + } + } + + private fun upgradeApp() { + activity.launchUpgradeToProIntent() + } + + private fun moreInfo() { + activity.launchViewIntent("https://simplemobiletools.com/upgrade_to_pro") + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WhatsNewDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WhatsNewDialog.kt new file mode 100644 index 000000000..52b453975 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WhatsNewDialog.kt @@ -0,0 +1,35 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.view.LayoutInflater +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.models.Release +import kotlinx.android.synthetic.main.dialog_whats_new.view.* + +class WhatsNewDialog(val activity: Activity, val releases: List) { + init { + val view = LayoutInflater.from(activity).inflate(R.layout.dialog_whats_new, null) + view.whats_new_content.text = getNewReleases() + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok, null) + .apply { + activity.setupDialogStuff(view, this, R.string.whats_new, cancelOnTouchOutside = false) + } + } + + private fun getNewReleases(): String { + val sb = StringBuilder() + + releases.forEach { + val parts = activity.getString(it.textId).split("\n").map(String::trim) + parts.forEach { + sb.append("- $it\n") + } + } + + return sb.toString() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WritePermissionDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WritePermissionDialog.kt new file mode 100644 index 000000000..5fa9070c1 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/dialogs/WritePermissionDialog.kt @@ -0,0 +1,81 @@ +package com.simplemobiletools.commons.dialogs + +import android.app.Activity +import android.text.Html +import androidx.appcompat.app.AlertDialog +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.humanizePath +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_write_permission.view.* +import kotlinx.android.synthetic.main.dialog_write_permission_otg.view.* + +class WritePermissionDialog(activity: Activity, val mode: Mode, val callback: () -> Unit) { + sealed class Mode { + object Otg : Mode() + object SdCard : Mode() + data class OpenDocumentTreeSDK30(val path: String) : Mode() + object CreateDocumentSDK30 : Mode() + } + + private var dialog: AlertDialog? = null + + init { + val layout = if (mode == Mode.SdCard) R.layout.dialog_write_permission else R.layout.dialog_write_permission_otg + val view = activity.layoutInflater.inflate(layout, null) + var dialogTitle = R.string.confirm_storage_access_title + + val glide = Glide.with(activity) + val crossFade = DrawableTransitionOptions.withCrossFade() + when (mode) { + Mode.Otg -> { + view.write_permissions_dialog_otg_text.setText(R.string.confirm_usb_storage_access_text) + glide.load(R.drawable.img_write_storage_otg).transition(crossFade).into(view.write_permissions_dialog_otg_image) + } + Mode.SdCard -> { + glide.load(R.drawable.img_write_storage).transition(crossFade).into(view.write_permissions_dialog_image) + glide.load(R.drawable.img_write_storage_sd).transition(crossFade).into(view.write_permissions_dialog_image_sd) + } + is Mode.OpenDocumentTreeSDK30 -> { + dialogTitle = R.string.confirm_folder_access_title + val humanizedPath = activity.humanizePath(mode.path) + view.write_permissions_dialog_otg_text.text = + Html.fromHtml(activity.getString(R.string.confirm_storage_access_android_text_specific, humanizedPath)) + glide.load(R.drawable.img_write_storage_sdk_30).transition(crossFade).into(view.write_permissions_dialog_otg_image) + + view.write_permissions_dialog_otg_image.setOnClickListener { + dialogConfirmed() + } + } + Mode.CreateDocumentSDK30 -> { + dialogTitle = R.string.confirm_folder_access_title + view.write_permissions_dialog_otg_text.text = Html.fromHtml(activity.getString(R.string.confirm_create_doc_for_new_folder_text)) + glide.load(R.drawable.img_write_storage_create_doc_sdk_30).transition(crossFade).into(view.write_permissions_dialog_otg_image) + + view.write_permissions_dialog_otg_image.setOnClickListener { + dialogConfirmed() + } + } + } + + activity.getAlertDialogBuilder() + .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + .setOnCancelListener { + BaseSimpleActivity.funAfterSAFPermission?.invoke(false) + BaseSimpleActivity.funAfterSAFPermission = null + } + .apply { + activity.setupDialogStuff(view, this, dialogTitle) { alertDialog -> + dialog = alertDialog + } + } + } + + private fun dialogConfirmed() { + dialog?.dismiss() + callback() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-sdk30.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-sdk30.kt new file mode 100644 index 000000000..40a044601 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-sdk30.kt @@ -0,0 +1,77 @@ +package com.simplemobiletools.commons.extensions + +import android.content.ContentValues +import android.provider.MediaStore +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.models.FileDirItem +import java.io.File +import java.io.InputStream +import java.io.OutputStream + +fun BaseSimpleActivity.copySingleFileSdk30(source: FileDirItem, destination: FileDirItem): Boolean { + val directory = destination.getParentPath() + if (!createDirectorySync(directory)) { + val error = String.format(getString(R.string.could_not_create_folder), directory) + showErrorToast(error) + return false + } + + var inputStream: InputStream? = null + var out: OutputStream? = null + try { + + out = getFileOutputStreamSync(destination.path, source.path.getMimeType()) + inputStream = getFileInputStreamSync(source.path)!! + + var copiedSize = 0L + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + var bytes = inputStream.read(buffer) + while (bytes >= 0) { + out!!.write(buffer, 0, bytes) + copiedSize += bytes + bytes = inputStream.read(buffer) + } + + out?.flush() + + return if (source.size == copiedSize && getDoesFilePathExist(destination.path)) { + if (baseConfig.keepLastModified) { + copyOldLastModified(source.path, destination.path) + val lastModified = File(source.path).lastModified() + if (lastModified != 0L) { + File(destination.path).setLastModified(lastModified) + } + } + true + } else { + false + } + } finally { + inputStream?.close() + out?.close() + } +} + +fun BaseSimpleActivity.copyOldLastModified(sourcePath: String, destinationPath: String) { + val projection = arrayOf(MediaStore.Images.Media.DATE_TAKEN, MediaStore.Images.Media.DATE_MODIFIED) + val uri = MediaStore.Files.getContentUri("external") + val selection = "${MediaStore.MediaColumns.DATA} = ?" + var selectionArgs = arrayOf(sourcePath) + val cursor = applicationContext.contentResolver.query(uri, projection, selection, selectionArgs, null) + + cursor?.use { + if (cursor.moveToFirst()) { + val dateTaken = cursor.getLongValue(MediaStore.Images.Media.DATE_TAKEN) + val dateModified = cursor.getIntValue(MediaStore.Images.Media.DATE_MODIFIED) + + val values = ContentValues().apply { + put(MediaStore.Images.Media.DATE_TAKEN, dateTaken) + put(MediaStore.Images.Media.DATE_MODIFIED, dateModified) + } + + selectionArgs = arrayOf(destinationPath) + applicationContext.contentResolver.update(uri, values, selection, selectionArgs) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-themes.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-themes.kt new file mode 100644 index 000000000..4eaeb3470 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity-themes.kt @@ -0,0 +1,410 @@ +package com.simplemobiletools.commons.extensions + +import android.app.Activity +import android.graphics.Color +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.helpers.DARK_GREY + +fun Activity.getThemeId(color: Int = baseConfig.primaryColor, showTransparentTop: Boolean = false) = when { + baseConfig.isUsingSystemTheme -> if (isUsingSystemDarkTheme()) R.style.AppTheme_Base_System else R.style.AppTheme_Base_System_Light + isBlackAndWhiteTheme() -> when { + showTransparentTop -> R.style.AppTheme_BlackAndWhite_NoActionBar + baseConfig.primaryColor.getContrastColor() == DARK_GREY -> R.style.AppTheme_BlackAndWhite_DarkTextColor + else -> R.style.AppTheme_BlackAndWhite + } + isWhiteTheme() -> when { + showTransparentTop -> R.style.AppTheme_White_NoActionBar + baseConfig.primaryColor.getContrastColor() == Color.WHITE -> R.style.AppTheme_White_LightTextColor + else -> R.style.AppTheme_White + } + showTransparentTop -> { + when (color) { + -12846 -> R.style.AppTheme_Red_100_core + -1074534 -> R.style.AppTheme_Red_200_core + -1739917 -> R.style.AppTheme_Red_300_core + -1092784 -> R.style.AppTheme_Red_400_core + -769226 -> R.style.AppTheme_Red_500_core + -1754827 -> R.style.AppTheme_Red_600_core + -2937041 -> R.style.AppTheme_Red_700_core + -3790808 -> R.style.AppTheme_Red_800_core + -4776932 -> R.style.AppTheme_Red_900_core + + -476208 -> R.style.AppTheme_Pink_100_core + -749647 -> R.style.AppTheme_Pink_200_core + -1023342 -> R.style.AppTheme_Pink_300_core + -1294214 -> R.style.AppTheme_Pink_400_core + -1499549 -> R.style.AppTheme_Pink_500_core + -2614432 -> R.style.AppTheme_Pink_600_core + -4056997 -> R.style.AppTheme_Pink_700_core + -5434281 -> R.style.AppTheme_Pink_800_core + -7860657 -> R.style.AppTheme_Pink_900_core + + -1982745 -> R.style.AppTheme_Purple_100_core + -3238952 -> R.style.AppTheme_Purple_200_core + -4560696 -> R.style.AppTheme_Purple_300_core + -5552196 -> R.style.AppTheme_Purple_400_core + -6543440 -> R.style.AppTheme_Purple_500_core + -7461718 -> R.style.AppTheme_Purple_600_core + -8708190 -> R.style.AppTheme_Purple_700_core + -9823334 -> R.style.AppTheme_Purple_800_core + -11922292 -> R.style.AppTheme_Purple_900_core + + -3029783 -> R.style.AppTheme_Deep_Purple_100_core + -5005861 -> R.style.AppTheme_Deep_Purple_200_core + -6982195 -> R.style.AppTheme_Deep_Purple_300_core + -8497214 -> R.style.AppTheme_Deep_Purple_400_core + -10011977 -> R.style.AppTheme_Deep_Purple_500_core + -10603087 -> R.style.AppTheme_Deep_Purple_600_core + -11457112 -> R.style.AppTheme_Deep_Purple_700_core + -12245088 -> R.style.AppTheme_Deep_Purple_800_core + -13558894 -> R.style.AppTheme_Deep_Purple_900_core + + -3814679 -> R.style.AppTheme_Indigo_100_core + -6313766 -> R.style.AppTheme_Indigo_200_core + -8812853 -> R.style.AppTheme_Indigo_300_core + -10720320 -> R.style.AppTheme_Indigo_400_core + -12627531 -> R.style.AppTheme_Indigo_500_core + -13022805 -> R.style.AppTheme_Indigo_600_core + -13615201 -> R.style.AppTheme_Indigo_700_core + -14142061 -> R.style.AppTheme_Indigo_800_core + -15064194 -> R.style.AppTheme_Indigo_900_core + + -4464901 -> R.style.AppTheme_Blue_100_core + -7288071 -> R.style.AppTheme_Blue_200_core + -10177034 -> R.style.AppTheme_Blue_300_core + -12409355 -> R.style.AppTheme_Blue_400_core + -14575885 -> R.style.AppTheme_Blue_500_core + -14776091 -> R.style.AppTheme_Blue_600_core + -15108398 -> R.style.AppTheme_Blue_700_core + -15374912 -> R.style.AppTheme_Blue_800_core + -15906911 -> R.style.AppTheme_Blue_900_core + + -4987396 -> R.style.AppTheme_Light_Blue_100_core + -8268550 -> R.style.AppTheme_Light_Blue_200_core + -11549705 -> R.style.AppTheme_Light_Blue_300_core + -14043396 -> R.style.AppTheme_Light_Blue_400_core + -16537100 -> R.style.AppTheme_Light_Blue_500_core + -16540699 -> R.style.AppTheme_Light_Blue_600_core + -16611119 -> R.style.AppTheme_Light_Blue_700_core + -16615491 -> R.style.AppTheme_Light_Blue_800_core + -16689253 -> R.style.AppTheme_Light_Blue_900_core + + -5051406 -> R.style.AppTheme_Cyan_100_core + -8331542 -> R.style.AppTheme_Cyan_200_core + -11677471 -> R.style.AppTheme_Cyan_300_core + -14235942 -> R.style.AppTheme_Cyan_400_core + -16728876 -> R.style.AppTheme_Cyan_500_core + -16732991 -> R.style.AppTheme_Cyan_600_core + -16738393 -> R.style.AppTheme_Cyan_700_core + -16743537 -> R.style.AppTheme_Cyan_800_core + -16752540 -> R.style.AppTheme_Cyan_900_core + + -5054501 -> R.style.AppTheme_Teal_100_core + -8336444 -> R.style.AppTheme_Teal_200_core + -11684180 -> R.style.AppTheme_Teal_300_core + -14244198 -> R.style.AppTheme_Teal_400_core + -16738680 -> R.style.AppTheme_Teal_500_core + -16742021 -> R.style.AppTheme_Teal_600_core + -16746133 -> R.style.AppTheme_Teal_700_core + -16750244 -> R.style.AppTheme_Teal_800_core + -16757440 -> R.style.AppTheme_Teal_900_core + + -3610935 -> R.style.AppTheme_Green_100_core + -5908825 -> R.style.AppTheme_Green_200_core + -8271996 -> R.style.AppTheme_Green_300_core + -10044566 -> R.style.AppTheme_Green_400_core + -11751600 -> R.style.AppTheme_Green_500_core + -12345273 -> R.style.AppTheme_Green_600_core + -13070788 -> R.style.AppTheme_Green_700_core + -13730510 -> R.style.AppTheme_Green_800_core + -14983648 -> R.style.AppTheme_Green_900_core + + -2298424 -> R.style.AppTheme_Light_Green_100_core + -3808859 -> R.style.AppTheme_Light_Green_200_core + -5319295 -> R.style.AppTheme_Light_Green_300_core + -6501275 -> R.style.AppTheme_Light_Green_400_core + -7617718 -> R.style.AppTheme_Light_Green_500_core + -8604862 -> R.style.AppTheme_Light_Green_600_core + -9920712 -> R.style.AppTheme_Light_Green_700_core + -11171025 -> R.style.AppTheme_Light_Green_800_core + -13407970 -> R.style.AppTheme_Light_Green_900_core + + -985917 -> R.style.AppTheme_Lime_100_core + -1642852 -> R.style.AppTheme_Lime_200_core + -2300043 -> R.style.AppTheme_Lime_300_core + -2825897 -> R.style.AppTheme_Lime_400_core + -3285959 -> R.style.AppTheme_Lime_500_core + -4142541 -> R.style.AppTheme_Lime_600_core + -5983189 -> R.style.AppTheme_Lime_700_core + -6382300 -> R.style.AppTheme_Lime_800_core + -8227049 -> R.style.AppTheme_Lime_900_core + + -1596 -> R.style.AppTheme_Yellow_100_core + -2672 -> R.style.AppTheme_Yellow_200_core + -3722 -> R.style.AppTheme_Yellow_300_core + -4520 -> R.style.AppTheme_Yellow_400_core + -5317 -> R.style.AppTheme_Yellow_500_core + -141259 -> R.style.AppTheme_Yellow_600_core + -278483 -> R.style.AppTheme_Yellow_700_core + -415707 -> R.style.AppTheme_Yellow_800_core + -688361 -> R.style.AppTheme_Yellow_900_core + + -4941 -> R.style.AppTheme_Amber_100_core + -8062 -> R.style.AppTheme_Amber_200_core + -10929 -> R.style.AppTheme_Amber_300_core + -13784 -> R.style.AppTheme_Amber_400_core + -16121 -> R.style.AppTheme_Amber_500_core + -19712 -> R.style.AppTheme_Amber_600_core + -24576 -> R.style.AppTheme_Amber_700_core + -28928 -> R.style.AppTheme_Amber_800_core + -37120 -> R.style.AppTheme_Amber_900_core + + -8014 -> R.style.AppTheme_Orange_100_core + -13184 -> R.style.AppTheme_Orange_200_core + -18611 -> R.style.AppTheme_Orange_300_core + -22746 -> R.style.AppTheme_Orange_400_core + -26624 -> R.style.AppTheme_Orange_500_core + -291840 -> R.style.AppTheme_Orange_600_core + -689152 -> R.style.AppTheme_Orange_700_core + -1086464 -> R.style.AppTheme_Orange_800_core + -1683200 -> R.style.AppTheme_Orange_900_core + + -13124 -> R.style.AppTheme_Deep_Orange_100_core + -21615 -> R.style.AppTheme_Deep_Orange_200_core + -30107 -> R.style.AppTheme_Deep_Orange_300_core + -36797 -> R.style.AppTheme_Deep_Orange_400_core + -43230 -> R.style.AppTheme_Deep_Orange_500_core + -765666 -> R.style.AppTheme_Deep_Orange_600_core + -1684967 -> R.style.AppTheme_Deep_Orange_700_core + -2604267 -> R.style.AppTheme_Deep_Orange_800_core + -4246004 -> R.style.AppTheme_Deep_Orange_900_core + + -2634552 -> R.style.AppTheme_Brown_100_core + -4412764 -> R.style.AppTheme_Brown_200_core + -6190977 -> R.style.AppTheme_Brown_300_core + -7508381 -> R.style.AppTheme_Brown_400_core + -8825528 -> R.style.AppTheme_Brown_500_core + -9614271 -> R.style.AppTheme_Brown_600_core + -10665929 -> R.style.AppTheme_Brown_700_core + -11652050 -> R.style.AppTheme_Brown_800_core + -12703965 -> R.style.AppTheme_Brown_900_core + + -3155748 -> R.style.AppTheme_Blue_Grey_100_core + -5194811 -> R.style.AppTheme_Blue_Grey_200_core + -7297874 -> R.style.AppTheme_Blue_Grey_300_core + -8875876 -> R.style.AppTheme_Blue_Grey_400_core + -10453621 -> R.style.AppTheme_Blue_Grey_500_core + -11243910 -> R.style.AppTheme_Blue_Grey_600_core + -12232092 -> R.style.AppTheme_Blue_Grey_700_core + -13154481 -> R.style.AppTheme_Blue_Grey_800_core + -14273992 -> R.style.AppTheme_Blue_Grey_900_core + + -1 -> R.style.AppTheme_Grey_100_core + -1118482 -> R.style.AppTheme_Grey_200_core + -2039584 -> R.style.AppTheme_Grey_300_core + -4342339 -> R.style.AppTheme_Grey_400_core + -6381922 -> R.style.AppTheme_Grey_500_core + -9079435 -> R.style.AppTheme_Grey_600_core + -10395295 -> R.style.AppTheme_Grey_700_core + -12434878 -> R.style.AppTheme_Grey_800_core + -16777216 -> R.style.AppTheme_Grey_900_core + + else -> R.style.AppTheme_Orange_700_core + } + } + else -> { + when (color) { + -12846 -> R.style.AppTheme_Red_100 + -1074534 -> R.style.AppTheme_Red_200 + -1739917 -> R.style.AppTheme_Red_300 + -1092784 -> R.style.AppTheme_Red_400 + -769226 -> R.style.AppTheme_Red_500 + -1754827 -> R.style.AppTheme_Red_600 + -2937041 -> R.style.AppTheme_Red_700 + -3790808 -> R.style.AppTheme_Red_800 + -4776932 -> R.style.AppTheme_Red_900 + + -476208 -> R.style.AppTheme_Pink_100 + -749647 -> R.style.AppTheme_Pink_200 + -1023342 -> R.style.AppTheme_Pink_300 + -1294214 -> R.style.AppTheme_Pink_400 + -1499549 -> R.style.AppTheme_Pink_500 + -2614432 -> R.style.AppTheme_Pink_600 + -4056997 -> R.style.AppTheme_Pink_700 + -5434281 -> R.style.AppTheme_Pink_800 + -7860657 -> R.style.AppTheme_Pink_900 + + -1982745 -> R.style.AppTheme_Purple_100 + -3238952 -> R.style.AppTheme_Purple_200 + -4560696 -> R.style.AppTheme_Purple_300 + -5552196 -> R.style.AppTheme_Purple_400 + -6543440 -> R.style.AppTheme_Purple_500 + -7461718 -> R.style.AppTheme_Purple_600 + -8708190 -> R.style.AppTheme_Purple_700 + -9823334 -> R.style.AppTheme_Purple_800 + -11922292 -> R.style.AppTheme_Purple_900 + + -3029783 -> R.style.AppTheme_Deep_Purple_100 + -5005861 -> R.style.AppTheme_Deep_Purple_200 + -6982195 -> R.style.AppTheme_Deep_Purple_300 + -8497214 -> R.style.AppTheme_Deep_Purple_400 + -10011977 -> R.style.AppTheme_Deep_Purple_500 + -10603087 -> R.style.AppTheme_Deep_Purple_600 + -11457112 -> R.style.AppTheme_Deep_Purple_700 + -12245088 -> R.style.AppTheme_Deep_Purple_800 + -13558894 -> R.style.AppTheme_Deep_Purple_900 + + -3814679 -> R.style.AppTheme_Indigo_100 + -6313766 -> R.style.AppTheme_Indigo_200 + -8812853 -> R.style.AppTheme_Indigo_300 + -10720320 -> R.style.AppTheme_Indigo_400 + -12627531 -> R.style.AppTheme_Indigo_500 + -13022805 -> R.style.AppTheme_Indigo_600 + -13615201 -> R.style.AppTheme_Indigo_700 + -14142061 -> R.style.AppTheme_Indigo_800 + -15064194 -> R.style.AppTheme_Indigo_900 + + -4464901 -> R.style.AppTheme_Blue_100 + -7288071 -> R.style.AppTheme_Blue_200 + -10177034 -> R.style.AppTheme_Blue_300 + -12409355 -> R.style.AppTheme_Blue_400 + -14575885 -> R.style.AppTheme_Blue_500 + -14776091 -> R.style.AppTheme_Blue_600 + -15108398 -> R.style.AppTheme_Blue_700 + -15374912 -> R.style.AppTheme_Blue_800 + -15906911 -> R.style.AppTheme_Blue_900 + + -4987396 -> R.style.AppTheme_Light_Blue_100 + -8268550 -> R.style.AppTheme_Light_Blue_200 + -11549705 -> R.style.AppTheme_Light_Blue_300 + -14043396 -> R.style.AppTheme_Light_Blue_400 + -16537100 -> R.style.AppTheme_Light_Blue_500 + -16540699 -> R.style.AppTheme_Light_Blue_600 + -16611119 -> R.style.AppTheme_Light_Blue_700 + -16615491 -> R.style.AppTheme_Light_Blue_800 + -16689253 -> R.style.AppTheme_Light_Blue_900 + + -5051406 -> R.style.AppTheme_Cyan_100 + -8331542 -> R.style.AppTheme_Cyan_200 + -11677471 -> R.style.AppTheme_Cyan_300 + -14235942 -> R.style.AppTheme_Cyan_400 + -16728876 -> R.style.AppTheme_Cyan_500 + -16732991 -> R.style.AppTheme_Cyan_600 + -16738393 -> R.style.AppTheme_Cyan_700 + -16743537 -> R.style.AppTheme_Cyan_800 + -16752540 -> R.style.AppTheme_Cyan_900 + + -5054501 -> R.style.AppTheme_Teal_100 + -8336444 -> R.style.AppTheme_Teal_200 + -11684180 -> R.style.AppTheme_Teal_300 + -14244198 -> R.style.AppTheme_Teal_400 + -16738680 -> R.style.AppTheme_Teal_500 + -16742021 -> R.style.AppTheme_Teal_600 + -16746133 -> R.style.AppTheme_Teal_700 + -16750244 -> R.style.AppTheme_Teal_800 + -16757440 -> R.style.AppTheme_Teal_900 + + -3610935 -> R.style.AppTheme_Green_100 + -5908825 -> R.style.AppTheme_Green_200 + -8271996 -> R.style.AppTheme_Green_300 + -10044566 -> R.style.AppTheme_Green_400 + -11751600 -> R.style.AppTheme_Green_500 + -12345273 -> R.style.AppTheme_Green_600 + -13070788 -> R.style.AppTheme_Green_700 + -13730510 -> R.style.AppTheme_Green_800 + -14983648 -> R.style.AppTheme_Green_900 + + -2298424 -> R.style.AppTheme_Light_Green_100 + -3808859 -> R.style.AppTheme_Light_Green_200 + -5319295 -> R.style.AppTheme_Light_Green_300 + -6501275 -> R.style.AppTheme_Light_Green_400 + -7617718 -> R.style.AppTheme_Light_Green_500 + -8604862 -> R.style.AppTheme_Light_Green_600 + -9920712 -> R.style.AppTheme_Light_Green_700 + -11171025 -> R.style.AppTheme_Light_Green_800 + -13407970 -> R.style.AppTheme_Light_Green_900 + + -985917 -> R.style.AppTheme_Lime_100 + -1642852 -> R.style.AppTheme_Lime_200 + -2300043 -> R.style.AppTheme_Lime_300 + -2825897 -> R.style.AppTheme_Lime_400 + -3285959 -> R.style.AppTheme_Lime_500 + -4142541 -> R.style.AppTheme_Lime_600 + -5983189 -> R.style.AppTheme_Lime_700 + -6382300 -> R.style.AppTheme_Lime_800 + -8227049 -> R.style.AppTheme_Lime_900 + + -1596 -> R.style.AppTheme_Yellow_100 + -2672 -> R.style.AppTheme_Yellow_200 + -3722 -> R.style.AppTheme_Yellow_300 + -4520 -> R.style.AppTheme_Yellow_400 + -5317 -> R.style.AppTheme_Yellow_500 + -141259 -> R.style.AppTheme_Yellow_600 + -278483 -> R.style.AppTheme_Yellow_700 + -415707 -> R.style.AppTheme_Yellow_800 + -688361 -> R.style.AppTheme_Yellow_900 + + -4941 -> R.style.AppTheme_Amber_100 + -8062 -> R.style.AppTheme_Amber_200 + -10929 -> R.style.AppTheme_Amber_300 + -13784 -> R.style.AppTheme_Amber_400 + -16121 -> R.style.AppTheme_Amber_500 + -19712 -> R.style.AppTheme_Amber_600 + -24576 -> R.style.AppTheme_Amber_700 + -28928 -> R.style.AppTheme_Amber_800 + -37120 -> R.style.AppTheme_Amber_900 + + -8014 -> R.style.AppTheme_Orange_100 + -13184 -> R.style.AppTheme_Orange_200 + -18611 -> R.style.AppTheme_Orange_300 + -22746 -> R.style.AppTheme_Orange_400 + -26624 -> R.style.AppTheme_Orange_500 + -291840 -> R.style.AppTheme_Orange_600 + -689152 -> R.style.AppTheme_Orange_700 + -1086464 -> R.style.AppTheme_Orange_800 + -1683200 -> R.style.AppTheme_Orange_900 + + -13124 -> R.style.AppTheme_Deep_Orange_100 + -21615 -> R.style.AppTheme_Deep_Orange_200 + -30107 -> R.style.AppTheme_Deep_Orange_300 + -36797 -> R.style.AppTheme_Deep_Orange_400 + -43230 -> R.style.AppTheme_Deep_Orange_500 + -765666 -> R.style.AppTheme_Deep_Orange_600 + -1684967 -> R.style.AppTheme_Deep_Orange_700 + -2604267 -> R.style.AppTheme_Deep_Orange_800 + -4246004 -> R.style.AppTheme_Deep_Orange_900 + + -2634552 -> R.style.AppTheme_Brown_100 + -4412764 -> R.style.AppTheme_Brown_200 + -6190977 -> R.style.AppTheme_Brown_300 + -7508381 -> R.style.AppTheme_Brown_400 + -8825528 -> R.style.AppTheme_Brown_500 + -9614271 -> R.style.AppTheme_Brown_600 + -10665929 -> R.style.AppTheme_Brown_700 + -11652050 -> R.style.AppTheme_Brown_800 + -12703965 -> R.style.AppTheme_Brown_900 + + -3155748 -> R.style.AppTheme_Blue_Grey_100 + -5194811 -> R.style.AppTheme_Blue_Grey_200 + -7297874 -> R.style.AppTheme_Blue_Grey_300 + -8875876 -> R.style.AppTheme_Blue_Grey_400 + -10453621 -> R.style.AppTheme_Blue_Grey_500 + -11243910 -> R.style.AppTheme_Blue_Grey_600 + -12232092 -> R.style.AppTheme_Blue_Grey_700 + -13154481 -> R.style.AppTheme_Blue_Grey_800 + -14273992 -> R.style.AppTheme_Blue_Grey_900 + + -1 -> R.style.AppTheme_Grey_100 + -1118482 -> R.style.AppTheme_Grey_200 + -2039584 -> R.style.AppTheme_Grey_300 + -4342339 -> R.style.AppTheme_Grey_400 + -6381922 -> R.style.AppTheme_Grey_500 + -9079435 -> R.style.AppTheme_Grey_600 + -10395295 -> R.style.AppTheme_Grey_700 + -12434878 -> R.style.AppTheme_Grey_800 + -16777216 -> R.style.AppTheme_Grey_900 + + else -> R.style.AppTheme_Orange_700 + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity.kt new file mode 100644 index 000000000..484bfa6fb --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Activity.kt @@ -0,0 +1,1739 @@ +package com.simplemobiletools.commons.extensions + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.Dialog +import android.app.TimePickerDialog +import android.content.* +import android.content.Intent.EXTRA_STREAM +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.media.RingtoneManager +import android.net.Uri +import android.os.Environment +import android.os.Handler +import android.os.Looper +import android.os.TransactionTooLargeException +import android.provider.ContactsContract +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.telecom.PhoneAccountHandle +import android.telecom.TelecomManager +import android.view.View +import android.view.ViewGroup +import android.view.Window +import android.view.WindowManager +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.biometric.BiometricPrompt +import androidx.biometric.auth.AuthPromptCallback +import androidx.biometric.auth.AuthPromptHost +import androidx.biometric.auth.Class2BiometricAuthPrompt +import androidx.core.view.WindowInsetsCompat +import androidx.documentfile.provider.DocumentFile +import androidx.fragment.app.FragmentActivity +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.dialogs.* +import com.simplemobiletools.commons.dialogs.WritePermissionDialog.Mode +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.* +import com.simplemobiletools.commons.views.MyTextView +import kotlinx.android.synthetic.main.dialog_title.view.* +import java.io.* +import java.util.* + +fun Activity.appLaunched(appId: String) { + baseConfig.internalStoragePath = getInternalStoragePath() + updateSDCardPath() + baseConfig.appId = appId + if (baseConfig.appRunCount == 0) { + baseConfig.wasOrangeIconChecked = true + checkAppIconColor() + } else if (!baseConfig.wasOrangeIconChecked) { + baseConfig.wasOrangeIconChecked = true + val primaryColor = resources.getColor(R.color.color_primary) + if (baseConfig.appIconColor != primaryColor) { + getAppIconColors().forEachIndexed { index, color -> + toggleAppIconColor(appId, index, color, false) + } + + val defaultClassName = "${baseConfig.appId.removeSuffix(".debug")}.activities.SplashActivity" + packageManager.setComponentEnabledSetting( + ComponentName(baseConfig.appId, defaultClassName), + PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, + PackageManager.DONT_KILL_APP + ) + + val orangeClassName = "${baseConfig.appId.removeSuffix(".debug")}.activities.SplashActivity.Orange" + packageManager.setComponentEnabledSetting( + ComponentName(baseConfig.appId, orangeClassName), + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP + ) + + baseConfig.appIconColor = primaryColor + baseConfig.lastIconColor = primaryColor + } + } + + baseConfig.appRunCount++ + if (baseConfig.appRunCount % 30 == 0 && !isAProApp()) { + if (!resources.getBoolean(R.bool.hide_google_relations)) { + showDonateOrUpgradeDialog() + } + } + + if (baseConfig.appRunCount % 40 == 0 && !baseConfig.wasAppRated) { + if (!resources.getBoolean(R.bool.hide_google_relations)) { + RateStarsDialog(this) + } + } +} + +fun Activity.showDonateOrUpgradeDialog() { + if (getCanAppBeUpgraded()) { + UpgradeToProDialog(this) + } else if (!isOrWasThankYouInstalled()) { + DonateDialog(this) + } +} + +fun Activity.isAppInstalledOnSDCard(): Boolean = try { + val applicationInfo = packageManager.getPackageInfo(packageName, 0).applicationInfo + (applicationInfo.flags and ApplicationInfo.FLAG_EXTERNAL_STORAGE) == ApplicationInfo.FLAG_EXTERNAL_STORAGE +} catch (e: Exception) { + false +} + +fun BaseSimpleActivity.isShowingSAFDialog(path: String): Boolean { + return if ((!isRPlus() && isPathOnSD(path) && !isSDCardSetAsDefaultStorage() && (baseConfig.sdTreeUri.isEmpty() || !hasProperStoredTreeUri(false)))) { + runOnUiThread { + if (!isDestroyed && !isFinishing) { + WritePermissionDialog(this, Mode.SdCard) { + Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { + putExtra(EXTRA_SHOW_ADVANCED, true) + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_SD) + checkedDocumentPath = path + return@apply + } catch (e: Exception) { + type = "*/*" + } + + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_SD) + checkedDocumentPath = path + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + toast(R.string.unknown_error_occurred) + } + } + } + } + } + true + } else { + false + } +} + +@SuppressLint("InlinedApi") +fun BaseSimpleActivity.isShowingSAFDialogSdk30(path: String): Boolean { + return if (isAccessibleWithSAFSdk30(path) && !hasProperStoredFirstParentUri(path)) { + runOnUiThread { + if (!isDestroyed && !isFinishing) { + val level = getFirstParentLevel(path) + WritePermissionDialog(this, Mode.OpenDocumentTreeSDK30(path.getFirstParentPath(this, level))) { + Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { + putExtra(EXTRA_SHOW_ADVANCED, true) + putExtra(DocumentsContract.EXTRA_INITIAL_URI, createFirstParentTreeUriUsingRootTree(path)) + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_FOR_SDK_30) + checkedDocumentPath = path + return@apply + } catch (e: Exception) { + type = "*/*" + } + + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_FOR_SDK_30) + checkedDocumentPath = path + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + toast(R.string.unknown_error_occurred) + } + } + } + } + } + true + } else { + false + } +} + +@SuppressLint("InlinedApi") +fun BaseSimpleActivity.isShowingSAFCreateDocumentDialogSdk30(path: String): Boolean { + return if (!hasProperStoredDocumentUriSdk30(path)) { + runOnUiThread { + if (!isDestroyed && !isFinishing) { + WritePermissionDialog(this, Mode.CreateDocumentSDK30) { + Intent(Intent.ACTION_CREATE_DOCUMENT).apply { + type = DocumentsContract.Document.MIME_TYPE_DIR + putExtra(EXTRA_SHOW_ADVANCED, true) + addCategory(Intent.CATEGORY_OPENABLE) + putExtra(DocumentsContract.EXTRA_INITIAL_URI, buildDocumentUriSdk30(path.getParentPath())) + putExtra(Intent.EXTRA_TITLE, path.getFilenameFromPath()) + try { + startActivityForResult(this, CREATE_DOCUMENT_SDK_30) + checkedDocumentPath = path + return@apply + } catch (e: Exception) { + type = "*/*" + } + + try { + startActivityForResult(this, CREATE_DOCUMENT_SDK_30) + checkedDocumentPath = path + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + toast(R.string.unknown_error_occurred) + } + } + } + } + } + true + } else { + false + } +} + +fun BaseSimpleActivity.isShowingAndroidSAFDialog(path: String): Boolean { + return if (isRestrictedSAFOnlyRoot(path) && (getAndroidTreeUri(path).isEmpty() || !hasProperStoredAndroidTreeUri(path))) { + runOnUiThread { + if (!isDestroyed && !isFinishing) { + ConfirmationAdvancedDialog(this, "", R.string.confirm_storage_access_android_text, R.string.ok, R.string.cancel) { success -> + if (success) { + Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { + putExtra(EXTRA_SHOW_ADVANCED, true) + putExtra(DocumentsContract.EXTRA_INITIAL_URI, createAndroidDataOrObbUri(path)) + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_FOR_ANDROID_DATA_OR_OBB) + checkedDocumentPath = path + return@apply + } catch (e: Exception) { + type = "*/*" + } + + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_FOR_ANDROID_DATA_OR_OBB) + checkedDocumentPath = path + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + toast(R.string.unknown_error_occurred) + } + } + } + } + } + } + true + } else { + false + } +} + +fun BaseSimpleActivity.isShowingOTGDialog(path: String): Boolean { + return if (!isRPlus() && isPathOnOTG(path) && (baseConfig.OTGTreeUri.isEmpty() || !hasProperStoredTreeUri(true))) { + showOTGPermissionDialog(path) + true + } else { + false + } +} + +fun BaseSimpleActivity.showOTGPermissionDialog(path: String) { + runOnUiThread { + if (!isDestroyed && !isFinishing) { + WritePermissionDialog(this, Mode.Otg) { + Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_OTG) + checkedDocumentPath = path + return@apply + } catch (e: Exception) { + type = "*/*" + } + + try { + startActivityForResult(this, OPEN_DOCUMENT_TREE_OTG) + checkedDocumentPath = path + } catch (e: ActivityNotFoundException) { + toast(R.string.system_service_disabled, Toast.LENGTH_LONG) + } catch (e: Exception) { + toast(R.string.unknown_error_occurred) + } + } + } + } + } +} + +fun Activity.launchPurchaseThankYouIntent() { + hideKeyboard() + try { + launchViewIntent("market://details?id=com.simplemobiletools.thankyou") + } catch (ignored: Exception) { + launchViewIntent(getString(R.string.thank_you_url)) + } +} + +fun Activity.launchUpgradeToProIntent() { + hideKeyboard() + try { + launchViewIntent("market://details?id=${baseConfig.appId.removeSuffix(".debug")}.pro") + } catch (ignored: Exception) { + launchViewIntent(getStoreUrl()) + } +} + +fun Activity.launchMoreAppsFromUsIntent() { + launchViewIntent("https://play.google.com/store/apps/dev?id=9070296388022589266") +} + +fun Activity.launchViewIntent(id: Int) = launchViewIntent(getString(id)) + +fun Activity.launchViewIntent(url: String) { + hideKeyboard() + ensureBackgroundThread { + Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { + try { + startActivity(this) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_browser_found) + } catch (e: Exception) { + showErrorToast(e) + } + } + } +} + +fun Activity.redirectToRateUs() { + hideKeyboard() + try { + launchViewIntent("market://details?id=${packageName.removeSuffix(".debug")}") + } catch (ignored: ActivityNotFoundException) { + launchViewIntent(getStoreUrl()) + } +} + +fun Activity.sharePathIntent(path: String, applicationId: String) { + ensureBackgroundThread { + val newUri = getFinalUriFromPath(path, applicationId) ?: return@ensureBackgroundThread + Intent().apply { + action = Intent.ACTION_SEND + putExtra(EXTRA_STREAM, newUri) + type = getUriMimeType(path, newUri) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + grantUriPermission("android", newUri, Intent.FLAG_GRANT_READ_URI_PERMISSION) + + try { + startActivity(Intent.createChooser(this, getString(R.string.share_via))) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: RuntimeException) { + if (e.cause is TransactionTooLargeException) { + toast(R.string.maximum_share_reached) + } else { + showErrorToast(e) + } + } catch (e: Exception) { + showErrorToast(e) + } + } + } +} + +fun Activity.sharePathsIntent(paths: List, applicationId: String) { + ensureBackgroundThread { + if (paths.size == 1) { + sharePathIntent(paths.first(), applicationId) + } else { + val uriPaths = ArrayList() + val newUris = paths.map { + val uri = getFinalUriFromPath(it, applicationId) ?: return@ensureBackgroundThread + uriPaths.add(uri.path!!) + uri + } as ArrayList + + var mimeType = uriPaths.getMimeType() + if (mimeType.isEmpty() || mimeType == "*/*") { + mimeType = paths.getMimeType() + } + + Intent().apply { + action = Intent.ACTION_SEND_MULTIPLE + type = mimeType + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + putParcelableArrayListExtra(EXTRA_STREAM, newUris) + + try { + startActivity(Intent.createChooser(this, getString(R.string.share_via))) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: RuntimeException) { + if (e.cause is TransactionTooLargeException) { + toast(R.string.maximum_share_reached) + } else { + showErrorToast(e) + } + } catch (e: Exception) { + showErrorToast(e) + } + } + } + } +} + +fun Activity.setAsIntent(path: String, applicationId: String) { + ensureBackgroundThread { + val newUri = getFinalUriFromPath(path, applicationId) ?: return@ensureBackgroundThread + Intent().apply { + action = Intent.ACTION_ATTACH_DATA + setDataAndType(newUri, getUriMimeType(path, newUri)) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + val chooser = Intent.createChooser(this, getString(R.string.set_as)) + + try { + startActivityForResult(chooser, REQUEST_SET_AS) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: Exception) { + showErrorToast(e) + } + } + } +} + +fun Activity.shareTextIntent(text: String) { + ensureBackgroundThread { + Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, text) + + try { + startActivity(Intent.createChooser(this, getString(R.string.share_via))) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: RuntimeException) { + if (e.cause is TransactionTooLargeException) { + toast(R.string.maximum_share_reached) + } else { + showErrorToast(e) + } + } catch (e: Exception) { + showErrorToast(e) + } + } + } +} + +fun Activity.openEditorIntent(path: String, forceChooser: Boolean, applicationId: String) { + ensureBackgroundThread { + val newUri = getFinalUriFromPath(path, applicationId) ?: return@ensureBackgroundThread + Intent().apply { + action = Intent.ACTION_EDIT + setDataAndType(newUri, getUriMimeType(path, newUri)) + if (!isRPlus() || (isRPlus() && (hasProperStoredDocumentUriSdk30(path) || Environment.isExternalStorageManager()))) { + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + } + + val parent = path.getParentPath() + val newFilename = "${path.getFilenameFromPath().substringBeforeLast('.')}_1" + val extension = path.getFilenameExtension() + val newFilePath = File(parent, "$newFilename.$extension") + + val outputUri = if (isPathOnOTG(path)) newUri else getFinalUriFromPath("$newFilePath", applicationId) + if (!isRPlus()) { + val resInfoList = packageManager.queryIntentActivities(this, PackageManager.MATCH_DEFAULT_ONLY) + for (resolveInfo in resInfoList) { + val packageName = resolveInfo.activityInfo.packageName + grantUriPermission(packageName, outputUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + } + + if (!isRPlus()) { + putExtra(MediaStore.EXTRA_OUTPUT, outputUri) + } + + putExtra(REAL_FILE_PATH, path) + + try { + val chooser = Intent.createChooser(this, getString(R.string.edit_with)) + startActivityForResult(if (forceChooser) chooser else this, REQUEST_EDIT_IMAGE) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: Exception) { + showErrorToast(e) + } + } + } +} + +fun Activity.openPathIntent( + path: String, + forceChooser: Boolean, + applicationId: String, + forceMimeType: String = "", + extras: HashMap = HashMap() +) { + ensureBackgroundThread { + val newUri = getFinalUriFromPath(path, applicationId) ?: return@ensureBackgroundThread + val mimeType = if (forceMimeType.isNotEmpty()) forceMimeType else getUriMimeType(path, newUri) + Intent().apply { + action = Intent.ACTION_VIEW + setDataAndType(newUri, mimeType) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + + if (applicationId == "com.simplemobiletools.gallery.pro" || applicationId == "com.simplemobiletools.gallery.pro.debug") { + putExtra(IS_FROM_GALLERY, true) + } + + for ((key, value) in extras) { + putExtra(key, value) + } + + putExtra(REAL_FILE_PATH, path) + + try { + val chooser = Intent.createChooser(this, getString(R.string.open_with)) + startActivity(if (forceChooser) chooser else this) + } catch (e: ActivityNotFoundException) { + if (!tryGenericMimeType(this, mimeType, newUri)) { + toast(R.string.no_app_found) + } + } catch (e: Exception) { + showErrorToast(e) + } + } + } +} + +fun Activity.launchViewContactIntent(uri: Uri) { + Intent().apply { + action = ContactsContract.QuickContact.ACTION_QUICK_CONTACT + data = uri + launchActivityIntent(this) + } +} + +fun BaseSimpleActivity.launchCallIntent(recipient: String, handle: PhoneAccountHandle? = null) { + handlePermission(PERMISSION_CALL_PHONE) { + val action = if (it) Intent.ACTION_CALL else Intent.ACTION_DIAL + Intent(action).apply { + data = Uri.fromParts("tel", recipient, null) + + if (handle != null) { + putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle) + } + + if (isDefaultDialer()) { + val packageName = if (baseConfig.appId.contains(".debug", true)) "com.simplemobiletools.dialer.debug" else "com.simplemobiletools.dialer" + val className = "com.simplemobiletools.dialer.activities.DialerActivity" + setClassName(packageName, className) + } + + launchActivityIntent(this) + } + } +} + +fun Activity.launchSendSMSIntent(recipient: String) { + Intent(Intent.ACTION_SENDTO).apply { + data = Uri.fromParts("smsto", recipient, null) + launchActivityIntent(this) + } +} + +fun Activity.showLocationOnMap(coordinates: String) { + val uriBegin = "geo:${coordinates.replace(" ", "")}" + val encodedQuery = Uri.encode(coordinates) + val uriString = "$uriBegin?q=$encodedQuery&z=16" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(uriString)) + launchActivityIntent(intent) +} + +fun Activity.getFinalUriFromPath(path: String, applicationId: String): Uri? { + val uri = try { + ensurePublicUri(path, applicationId) + } catch (e: Exception) { + showErrorToast(e) + return null + } + + if (uri == null) { + toast(R.string.unknown_error_occurred) + return null + } + + return uri +} + +fun Activity.tryGenericMimeType(intent: Intent, mimeType: String, uri: Uri): Boolean { + var genericMimeType = mimeType.getGenericMimeType() + if (genericMimeType.isEmpty()) { + genericMimeType = "*/*" + } + + intent.setDataAndType(uri, genericMimeType) + + return try { + startActivity(intent) + true + } catch (e: Exception) { + false + } +} + +fun BaseSimpleActivity.checkWhatsNew(releases: List, currVersion: Int) { + if (baseConfig.lastVersion == 0) { + baseConfig.lastVersion = currVersion + return + } + + val newReleases = arrayListOf() + releases.filterTo(newReleases) { it.id > baseConfig.lastVersion } + + if (newReleases.isNotEmpty()) { + WhatsNewDialog(this, newReleases) + } + + baseConfig.lastVersion = currVersion +} + +fun BaseSimpleActivity.deleteFolders(folders: List, deleteMediaOnly: Boolean = true, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + ensureBackgroundThread { + deleteFoldersBg(folders, deleteMediaOnly, callback) + } +} + +fun BaseSimpleActivity.deleteFoldersBg(folders: List, deleteMediaOnly: Boolean = true, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + var wasSuccess = false + var needPermissionForPath = "" + for (folder in folders) { + if (needsStupidWritePermissions(folder.path) && baseConfig.sdTreeUri.isEmpty()) { + needPermissionForPath = folder.path + break + } + } + + handleSAFDialog(needPermissionForPath) { + if (!it) { + return@handleSAFDialog + } + + folders.forEachIndexed { index, folder -> + deleteFolderBg(folder, deleteMediaOnly) { + if (it) + wasSuccess = true + + if (index == folders.size - 1) { + runOnUiThread { + callback?.invoke(wasSuccess) + } + } + } + } + } +} + +fun BaseSimpleActivity.deleteFolder(folder: FileDirItem, deleteMediaOnly: Boolean = true, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + ensureBackgroundThread { + deleteFolderBg(folder, deleteMediaOnly, callback) + } +} + +fun BaseSimpleActivity.deleteFolderBg(fileDirItem: FileDirItem, deleteMediaOnly: Boolean = true, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + val folder = File(fileDirItem.path) + if (folder.exists()) { + val filesArr = folder.listFiles() + if (filesArr == null) { + runOnUiThread { + callback?.invoke(true) + } + return + } + + val files = filesArr.toMutableList().filter { !deleteMediaOnly || it.isMediaFile() } + for (file in files) { + deleteFileBg(file.toFileDirItem(applicationContext), allowDeleteFolder = false, isDeletingMultipleFiles = false) { } + } + + if (folder.listFiles()?.isEmpty() == true) { + deleteFileBg(fileDirItem, allowDeleteFolder = true, isDeletingMultipleFiles = false) { } + } + } + runOnUiThread { + callback?.invoke(true) + } +} + +fun BaseSimpleActivity.deleteFile(file: FileDirItem, allowDeleteFolder: Boolean = false, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + deleteFiles(arrayListOf(file), allowDeleteFolder, callback) +} + +fun BaseSimpleActivity.deleteFiles(files: List, allowDeleteFolder: Boolean = false, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + ensureBackgroundThread { + deleteFilesBg(files, allowDeleteFolder, callback) + } +} + +fun BaseSimpleActivity.deleteFilesBg(files: List, allowDeleteFolder: Boolean = false, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + if (files.isEmpty()) { + runOnUiThread { + callback?.invoke(true) + } + return + } + + val firstFile = files.first() + val firstFilePath = firstFile.path + handleSAFDialog(firstFilePath) { + if (!it) { + return@handleSAFDialog + } + + checkManageMediaOrHandleSAFDialogSdk30(firstFilePath) { + if (!it) { + return@checkManageMediaOrHandleSAFDialogSdk30 + } + + val recycleBinPath = firstFile.isRecycleBinPath(this) + if (canManageMedia() && !recycleBinPath && !firstFilePath.doesThisOrParentHaveNoMedia(HashMap(), null)) { + val fileUris = getFileUrisFromFileDirItems(files) + + deleteSDK30Uris(fileUris) { success -> + runOnUiThread { + callback?.invoke(success) + } + } + } else { + deleteFilesCasual(files, allowDeleteFolder, callback) + } + } + } +} + +private fun BaseSimpleActivity.deleteFilesCasual( + files: List, + allowDeleteFolder: Boolean = false, + callback: ((wasSuccess: Boolean) -> Unit)? = null +) { + var wasSuccess = false + val failedFileDirItems = ArrayList() + files.forEachIndexed { index, file -> + deleteFileBg(file, allowDeleteFolder, true) { + if (it) { + wasSuccess = true + } else { + failedFileDirItems.add(file) + } + + if (index == files.lastIndex) { + if (isRPlus() && failedFileDirItems.isNotEmpty()) { + val fileUris = getFileUrisFromFileDirItems(failedFileDirItems) + deleteSDK30Uris(fileUris) { success -> + runOnUiThread { + callback?.invoke(success) + } + } + } else { + runOnUiThread { + callback?.invoke(wasSuccess) + } + } + } + } + } +} + +fun BaseSimpleActivity.deleteFile( + fileDirItem: FileDirItem, + allowDeleteFolder: Boolean = false, + isDeletingMultipleFiles: Boolean, + callback: ((wasSuccess: Boolean) -> Unit)? = null +) { + ensureBackgroundThread { + deleteFileBg(fileDirItem, allowDeleteFolder, isDeletingMultipleFiles, callback) + } +} + +fun BaseSimpleActivity.deleteFileBg( + fileDirItem: FileDirItem, + allowDeleteFolder: Boolean = false, + isDeletingMultipleFiles: Boolean, + callback: ((wasSuccess: Boolean) -> Unit)? = null, +) { + val path = fileDirItem.path + if (isRestrictedSAFOnlyRoot(path)) { + deleteAndroidSAFDirectory(path, allowDeleteFolder, callback) + } else { + val file = File(path) + if (!isRPlus() && file.absolutePath.startsWith(internalStoragePath) && !file.canWrite()) { + callback?.invoke(false) + return + } + + var fileDeleted = !isPathOnOTG(path) && ((!file.exists() && file.length() == 0L) || file.delete()) + if (fileDeleted) { + deleteFromMediaStore(path) { needsRescan -> + if (needsRescan) { + rescanAndDeletePath(path) { + runOnUiThread { + callback?.invoke(true) + } + } + } else { + runOnUiThread { + callback?.invoke(true) + } + } + } + } else { + if (getIsPathDirectory(file.absolutePath) && allowDeleteFolder) { + fileDeleted = deleteRecursively(file, this) + } + + if (!fileDeleted) { + if (needsStupidWritePermissions(path)) { + handleSAFDialog(path) { + if (it) { + trySAFFileDelete(fileDirItem, allowDeleteFolder, callback) + } + } + } else if (isAccessibleWithSAFSdk30(path)) { + if (canManageMedia()) { + deleteSdk30(fileDirItem, callback) + } else { + handleSAFDialogSdk30(path) { + if (it) { + deleteDocumentWithSAFSdk30(fileDirItem, allowDeleteFolder, callback) + } + } + } + } else if (isRPlus() && !isDeletingMultipleFiles) { + deleteSdk30(fileDirItem, callback) + } else { + callback?.invoke(false) + } + } + } + } +} + +private fun BaseSimpleActivity.deleteSdk30(fileDirItem: FileDirItem, callback: ((wasSuccess: Boolean) -> Unit)?) { + val fileUris = getFileUrisFromFileDirItems(arrayListOf(fileDirItem)) + deleteSDK30Uris(fileUris) { success -> + runOnUiThread { + callback?.invoke(success) + } + } +} + +private fun deleteRecursively(file: File, context: Context): Boolean { + if (file.isDirectory) { + val files = file.listFiles() ?: return file.delete() + for (child in files) { + deleteRecursively(child, context) + } + } + + val deleted = file.delete() + if (deleted) { + context.deleteFromMediaStore(file.absolutePath) + } + return deleted +} + +fun Activity.scanFileRecursively(file: File, callback: (() -> Unit)? = null) { + applicationContext.scanFileRecursively(file, callback) +} + +fun Activity.scanPathRecursively(path: String, callback: (() -> Unit)? = null) { + applicationContext.scanPathRecursively(path, callback) +} + +fun Activity.scanFilesRecursively(files: List, callback: (() -> Unit)? = null) { + applicationContext.scanFilesRecursively(files, callback) +} + +fun Activity.scanPathsRecursively(paths: List, callback: (() -> Unit)? = null) { + applicationContext.scanPathsRecursively(paths, callback) +} + +fun Activity.rescanPath(path: String, callback: (() -> Unit)? = null) { + applicationContext.rescanPath(path, callback) +} + +fun Activity.rescanPaths(paths: List, callback: (() -> Unit)? = null) { + applicationContext.rescanPaths(paths, callback) +} + +fun BaseSimpleActivity.renameFile( + oldPath: String, + newPath: String, + isRenamingMultipleFiles: Boolean, + callback: ((success: Boolean, android30RenameFormat: Android30RenameFormat) -> Unit)? = null +) { + if (isRestrictedSAFOnlyRoot(oldPath)) { + handleAndroidSAFDialog(oldPath) { + if (!it) { + runOnUiThread { + callback?.invoke(false, Android30RenameFormat.NONE) + } + return@handleAndroidSAFDialog + } + + try { + ensureBackgroundThread { + val success = renameAndroidSAFDocument(oldPath, newPath) + runOnUiThread { + callback?.invoke(success, Android30RenameFormat.NONE) + } + } + } catch (e: Exception) { + showErrorToast(e) + runOnUiThread { + callback?.invoke(false, Android30RenameFormat.NONE) + } + } + } + } else if (isAccessibleWithSAFSdk30(oldPath)) { + if (canManageMedia() && !File(oldPath).isDirectory && isPathOnInternalStorage(oldPath)) { + renameCasually(oldPath, newPath, isRenamingMultipleFiles, callback) + } else { + handleSAFDialogSdk30(oldPath) { + if (!it) { + return@handleSAFDialogSdk30 + } + + try { + ensureBackgroundThread { + val success = renameDocumentSdk30(oldPath, newPath) + if (success) { + updateInMediaStore(oldPath, newPath) + rescanPath(newPath) { + runOnUiThread { + callback?.invoke(true, Android30RenameFormat.NONE) + } + if (!oldPath.equals(newPath, true)) { + deleteFromMediaStore(oldPath) + } + scanPathRecursively(newPath) + } + } else { + runOnUiThread { + callback?.invoke(false, Android30RenameFormat.NONE) + } + } + } + } catch (e: Exception) { + showErrorToast(e) + runOnUiThread { + callback?.invoke(false, Android30RenameFormat.NONE) + } + } + } + } + } else if (needsStupidWritePermissions(newPath)) { + handleSAFDialog(newPath) { + if (!it) { + return@handleSAFDialog + } + + val document = getSomeDocumentFile(oldPath) + if (document == null || (File(oldPath).isDirectory != document.isDirectory)) { + runOnUiThread { + toast(R.string.unknown_error_occurred) + callback?.invoke(false, Android30RenameFormat.NONE) + } + return@handleSAFDialog + } + + try { + ensureBackgroundThread { + try { + DocumentsContract.renameDocument(applicationContext.contentResolver, document.uri, newPath.getFilenameFromPath()) + } catch (ignored: FileNotFoundException) { + // FileNotFoundException is thrown in some weird cases, but renaming works just fine + } catch (e: Exception) { + showErrorToast(e) + callback?.invoke(false, Android30RenameFormat.NONE) + return@ensureBackgroundThread + } + + updateInMediaStore(oldPath, newPath) + rescanPaths(arrayListOf(oldPath, newPath)) { + if (!baseConfig.keepLastModified) { + updateLastModified(newPath, System.currentTimeMillis()) + } + deleteFromMediaStore(oldPath) + runOnUiThread { + callback?.invoke(true, Android30RenameFormat.NONE) + } + } + } + } catch (e: Exception) { + showErrorToast(e) + runOnUiThread { + callback?.invoke(false, Android30RenameFormat.NONE) + } + } + } + } else renameCasually(oldPath, newPath, isRenamingMultipleFiles, callback) +} + +private fun BaseSimpleActivity.renameCasually( + oldPath: String, + newPath: String, + isRenamingMultipleFiles: Boolean, + callback: ((success: Boolean, android30RenameFormat: Android30RenameFormat) -> Unit)? +) { + val oldFile = File(oldPath) + val newFile = File(newPath) + val tempFile = try { + createTempFile(oldFile) ?: return + } catch (exception: Exception) { + if (isRPlus() && exception is java.nio.file.FileSystemException) { + // if we are renaming multiple files at once, we should give the Android 30+ permission dialog all uris together, not one by one + if (isRenamingMultipleFiles) { + callback?.invoke(false, Android30RenameFormat.CONTENT_RESOLVER) + } else { + val fileUris = getFileUrisFromFileDirItems(arrayListOf(File(oldPath).toFileDirItem(this))) + updateSDK30Uris(fileUris) { success -> + if (success) { + val values = ContentValues().apply { + put(MediaStore.Images.Media.DISPLAY_NAME, newPath.getFilenameFromPath()) + } + + try { + contentResolver.update(fileUris.first(), values, null, null) + callback?.invoke(true, Android30RenameFormat.NONE) + } catch (e: Exception) { + showErrorToast(e) + callback?.invoke(false, Android30RenameFormat.NONE) + } + } else { + callback?.invoke(false, Android30RenameFormat.NONE) + } + } + } + } else { + if (exception is IOException && File(oldPath).isDirectory && isRestrictedWithSAFSdk30(oldPath)) { + toast(R.string.cannot_rename_folder) + } else { + showErrorToast(exception) + } + callback?.invoke(false, Android30RenameFormat.NONE) + } + return + } + + val oldToTempSucceeds = oldFile.renameTo(tempFile) + val tempToNewSucceeds = tempFile.renameTo(newFile) + if (oldToTempSucceeds && tempToNewSucceeds) { + if (newFile.isDirectory) { + updateInMediaStore(oldPath, newPath) + rescanPath(newPath) { + runOnUiThread { + callback?.invoke(true, Android30RenameFormat.NONE) + } + if (!oldPath.equals(newPath, true)) { + deleteFromMediaStore(oldPath) + } + scanPathRecursively(newPath) + } + } else { + if (!baseConfig.keepLastModified) { + newFile.setLastModified(System.currentTimeMillis()) + } + updateInMediaStore(oldPath, newPath) + scanPathsRecursively(arrayListOf(newPath)) { + if (!oldPath.equals(newPath, true)) { + deleteFromMediaStore(oldPath) + } + runOnUiThread { + callback?.invoke(true, Android30RenameFormat.NONE) + } + } + } + } else { + tempFile.delete() + newFile.delete() + if (isRPlus()) { + // if we are renaming multiple files at once, we should give the Android 30+ permission dialog all uris together, not one by one + if (isRenamingMultipleFiles) { + callback?.invoke(false, Android30RenameFormat.SAF) + } else { + val fileUris = getFileUrisFromFileDirItems(arrayListOf(File(oldPath).toFileDirItem(this))) + updateSDK30Uris(fileUris) { success -> + if (!success) { + return@updateSDK30Uris + } + try { + val sourceUri = fileUris.first() + val sourceFile = File(oldPath).toFileDirItem(this) + + if (oldPath.equals(newPath, true)) { + val tempDestination = try { + createTempFile(File(sourceFile.path)) ?: return@updateSDK30Uris + } catch (exception: Exception) { + showErrorToast(exception) + callback?.invoke(false, Android30RenameFormat.NONE) + return@updateSDK30Uris + } + + val copyTempSuccess = copySingleFileSdk30(sourceFile, tempDestination.toFileDirItem(this)) + if (copyTempSuccess) { + contentResolver.delete(sourceUri, null) + tempDestination.renameTo(File(newPath)) + if (!baseConfig.keepLastModified) { + newFile.setLastModified(System.currentTimeMillis()) + } + updateInMediaStore(oldPath, newPath) + scanPathsRecursively(arrayListOf(newPath)) { + runOnUiThread { + callback?.invoke(true, Android30RenameFormat.NONE) + } + } + } else { + callback?.invoke(false, Android30RenameFormat.NONE) + } + } else { + val destinationFile = FileDirItem( + newPath, + newPath.getFilenameFromPath(), + sourceFile.isDirectory, + sourceFile.children, + sourceFile.size, + sourceFile.modified + ) + val copySuccessful = copySingleFileSdk30(sourceFile, destinationFile) + if (copySuccessful) { + if (!baseConfig.keepLastModified) { + newFile.setLastModified(System.currentTimeMillis()) + } + contentResolver.delete(sourceUri, null) + updateInMediaStore(oldPath, newPath) + scanPathsRecursively(arrayListOf(newPath)) { + runOnUiThread { + callback?.invoke(true, Android30RenameFormat.NONE) + } + } + } else { + toast(R.string.unknown_error_occurred) + callback?.invoke(false, Android30RenameFormat.NONE) + } + } + + } catch (e: Exception) { + showErrorToast(e) + callback?.invoke(false, Android30RenameFormat.NONE) + } + } + } + } else { + toast(R.string.unknown_error_occurred) + callback?.invoke(false, Android30RenameFormat.NONE) + } + } +} + +fun Activity.createTempFile(file: File): File? { + return if (file.isDirectory) { + createTempDir("temp", "${System.currentTimeMillis()}", file.parentFile) + } else { + if (isRPlus()) { + // this can throw FileSystemException, lets catch and handle it at the place calling this function + kotlin.io.path.createTempFile(file.parentFile.toPath(), "temp", "${System.currentTimeMillis()}").toFile() + } else { + createTempFile("temp", "${System.currentTimeMillis()}", file.parentFile) + } + } +} + +fun Activity.hideKeyboard() { + if (isOnMainThread()) { + hideKeyboardSync() + } else { + Handler(Looper.getMainLooper()).post { + hideKeyboardSync() + } + } +} + +fun Activity.hideKeyboardSync() { + val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow((currentFocus ?: View(this)).windowToken, 0) + window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) + currentFocus?.clearFocus() +} + +fun Activity.showKeyboard(et: EditText) { + et.requestFocus() + val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT) +} + +fun Activity.hideKeyboard(view: View) { + val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) +} + +fun BaseSimpleActivity.getFileOutputStream(fileDirItem: FileDirItem, allowCreatingNewFile: Boolean = false, callback: (outputStream: OutputStream?) -> Unit) { + val targetFile = File(fileDirItem.path) + when { + isRestrictedSAFOnlyRoot(fileDirItem.path) -> { + handleAndroidSAFDialog(fileDirItem.path) { + if (!it) { + return@handleAndroidSAFDialog + } + + val uri = getAndroidSAFUri(fileDirItem.path) + if (!getDoesFilePathExist(fileDirItem.path)) { + createAndroidSAFFile(fileDirItem.path) + } + callback.invoke(applicationContext.contentResolver.openOutputStream(uri, "wt")) + } + } + needsStupidWritePermissions(fileDirItem.path) -> { + handleSAFDialog(fileDirItem.path) { + if (!it) { + return@handleSAFDialog + } + + var document = getDocumentFile(fileDirItem.path) + if (document == null && allowCreatingNewFile) { + document = getDocumentFile(fileDirItem.getParentPath()) + } + + if (document == null) { + showFileCreateError(fileDirItem.path) + callback(null) + return@handleSAFDialog + } + + if (!getDoesFilePathExist(fileDirItem.path)) { + document = getDocumentFile(fileDirItem.path) ?: document.createFile("", fileDirItem.name) + } + + if (document?.exists() == true) { + try { + callback(applicationContext.contentResolver.openOutputStream(document.uri, "wt")) + } catch (e: FileNotFoundException) { + showErrorToast(e) + callback(null) + } + } else { + showFileCreateError(fileDirItem.path) + callback(null) + } + } + } + isAccessibleWithSAFSdk30(fileDirItem.path) -> { + handleSAFDialogSdk30(fileDirItem.path) { + if (!it) { + return@handleSAFDialogSdk30 + } + + callback.invoke( + try { + val uri = createDocumentUriUsingFirstParentTreeUri(fileDirItem.path) + if (!getDoesFilePathExist(fileDirItem.path)) { + createSAFFileSdk30(fileDirItem.path) + } + applicationContext.contentResolver.openOutputStream(uri, "wt") + } catch (e: Exception) { + null + } ?: createCasualFileOutputStream(this, targetFile) + ) + } + } + isRestrictedWithSAFSdk30(fileDirItem.path) -> { + callback.invoke( + try { + val fileUri = getFileUrisFromFileDirItems(arrayListOf(fileDirItem)) + applicationContext.contentResolver.openOutputStream(fileUri.first(), "wt") + } catch (e: Exception) { + null + } ?: createCasualFileOutputStream(this, targetFile) + ) + } + else -> { + callback.invoke(createCasualFileOutputStream(this, targetFile)) + } + } +} + +fun BaseSimpleActivity.showFileCreateError(path: String) { + val error = String.format(getString(R.string.could_not_create_file), path) + baseConfig.sdTreeUri = "" + showErrorToast(error) +} + +fun BaseSimpleActivity.getFileOutputStreamSync(path: String, mimeType: String, parentDocumentFile: DocumentFile? = null): OutputStream? { + val targetFile = File(path) + + return when { + isRestrictedSAFOnlyRoot(path) -> { + val uri = getAndroidSAFUri(path) + if (!getDoesFilePathExist(path)) { + createAndroidSAFFile(path) + } + applicationContext.contentResolver.openOutputStream(uri, "wt") + } + needsStupidWritePermissions(path) -> { + var documentFile = parentDocumentFile + if (documentFile == null) { + if (getDoesFilePathExist(targetFile.parentFile.absolutePath)) { + documentFile = getDocumentFile(targetFile.parent) + } else { + documentFile = getDocumentFile(targetFile.parentFile.parent) + documentFile = documentFile!!.createDirectory(targetFile.parentFile.name) ?: getDocumentFile(targetFile.parentFile.absolutePath) + } + } + + if (documentFile == null) { + val casualOutputStream = createCasualFileOutputStream(this, targetFile) + return if (casualOutputStream == null) { + showFileCreateError(targetFile.parent) + null + } else { + casualOutputStream + } + } + + try { + val uri = if (getDoesFilePathExist(path)) { + createDocumentUriFromRootTree(path) + } else { + documentFile.createFile(mimeType, path.getFilenameFromPath())!!.uri + } + applicationContext.contentResolver.openOutputStream(uri, "wt") + } catch (e: Exception) { + showErrorToast(e) + null + } + } + isAccessibleWithSAFSdk30(path) -> { + try { + val uri = createDocumentUriUsingFirstParentTreeUri(path) + if (!getDoesFilePathExist(path)) { + createSAFFileSdk30(path) + } + applicationContext.contentResolver.openOutputStream(uri, "wt") + } catch (e: Exception) { + null + } ?: createCasualFileOutputStream(this, targetFile) + } + else -> return createCasualFileOutputStream(this, targetFile) + } +} + +private fun createCasualFileOutputStream(activity: BaseSimpleActivity, targetFile: File): OutputStream? { + if (targetFile.parentFile?.exists() == false) { + targetFile.parentFile?.mkdirs() + } + + return try { + FileOutputStream(targetFile) + } catch (e: Exception) { + activity.showErrorToast(e) + null + } +} + +fun Activity.performSecurityCheck( + protectionType: Int, + requiredHash: String, + successCallback: ((String, Int) -> Unit)? = null, + failureCallback: (() -> Unit)? = null +) { + if (protectionType == PROTECTION_FINGERPRINT && isRPlus()) { + showBiometricPrompt(successCallback, failureCallback) + } else { + SecurityDialog( + activity = this, + requiredHash = requiredHash, + showTabIndex = protectionType, + callback = { hash, type, success -> + if (success) { + successCallback?.invoke(hash, type) + } else { + failureCallback?.invoke() + } + } + ) + } +} + +fun Activity.showBiometricPrompt( + successCallback: ((String, Int) -> Unit)? = null, + failureCallback: (() -> Unit)? = null +) { + Class2BiometricAuthPrompt.Builder(getText(R.string.authenticate), getText(R.string.cancel)) + .build() + .startAuthentication( + AuthPromptHost(this as FragmentActivity), + object : AuthPromptCallback() { + override fun onAuthenticationSucceeded(activity: FragmentActivity?, result: BiometricPrompt.AuthenticationResult) { + successCallback?.invoke("", PROTECTION_FINGERPRINT) + } + + override fun onAuthenticationError(activity: FragmentActivity?, errorCode: Int, errString: CharSequence) { + val isCanceledByUser = errorCode == BiometricPrompt.ERROR_NEGATIVE_BUTTON || errorCode == BiometricPrompt.ERROR_USER_CANCELED + if (!isCanceledByUser) { + toast(errString.toString()) + } + failureCallback?.invoke() + } + + override fun onAuthenticationFailed(activity: FragmentActivity?) { + toast(R.string.authentication_failed) + failureCallback?.invoke() + } + } + ) +} + +fun Activity.handleHiddenFolderPasswordProtection(callback: () -> Unit) { + if (baseConfig.isHiddenPasswordProtectionOn) { + SecurityDialog(this, baseConfig.hiddenPasswordHash, baseConfig.hiddenProtectionType) { _, _, success -> + if (success) { + callback() + } + } + } else { + callback() + } +} + +fun Activity.handleAppPasswordProtection(callback: (success: Boolean) -> Unit) { + if (baseConfig.isAppPasswordProtectionOn) { + SecurityDialog(this, baseConfig.appPasswordHash, baseConfig.appProtectionType) { _, _, success -> + callback(success) + } + } else { + callback(true) + } +} + +fun Activity.handleDeletePasswordProtection(callback: () -> Unit) { + if (baseConfig.isDeletePasswordProtectionOn) { + SecurityDialog(this, baseConfig.deletePasswordHash, baseConfig.deleteProtectionType) { _, _, success -> + if (success) { + callback() + } + } + } else { + callback() + } +} + +fun Activity.handleLockedFolderOpening(path: String, callback: (success: Boolean) -> Unit) { + if (baseConfig.isFolderProtected(path)) { + SecurityDialog(this, baseConfig.getFolderProtectionHash(path), baseConfig.getFolderProtectionType(path)) { _, _, success -> + callback(success) + } + } else { + callback(true) + } +} + +fun BaseSimpleActivity.createDirectorySync(directory: String): Boolean { + if (getDoesFilePathExist(directory)) { + return true + } + + if (needsStupidWritePermissions(directory)) { + val documentFile = getDocumentFile(directory.getParentPath()) ?: return false + val newDir = documentFile.createDirectory(directory.getFilenameFromPath()) ?: getDocumentFile(directory) + return newDir != null + } + + if (isRestrictedSAFOnlyRoot(directory)) { + return createAndroidSAFDirectory(directory) + } + + if (isAccessibleWithSAFSdk30(directory)) { + return createSAFDirectorySdk30(directory) + } + + return File(directory).mkdirs() +} + +fun Activity.updateSharedTheme(sharedTheme: SharedTheme) { + try { + val contentValues = MyContentProvider.fillThemeContentValues(sharedTheme) + applicationContext.contentResolver.update(MyContentProvider.MY_CONTENT_URI, contentValues, null, null) + } catch (e: Exception) { + showErrorToast(e) + } +} + +fun Activity.setupDialogStuff( + view: View, + dialog: AlertDialog.Builder, + titleId: Int = 0, + titleText: String = "", + cancelOnTouchOutside: Boolean = true, + callback: ((alertDialog: AlertDialog) -> Unit)? = null +) { + if (isDestroyed || isFinishing) { + return + } + + val textColor = getProperTextColor() + val backgroundColor = getProperBackgroundColor() + val primaryColor = getProperPrimaryColor() + if (view is ViewGroup) { + updateTextColors(view) + } else if (view is MyTextView) { + view.setColors(textColor, primaryColor, backgroundColor) + } + + if (dialog is MaterialAlertDialogBuilder) { + dialog.create().apply { + if (titleId != 0) { + setTitle(titleId) + } else if (titleText.isNotEmpty()) { + setTitle(titleText) + } + + setView(view) + setCancelable(cancelOnTouchOutside) + if (!isFinishing) { + show() + } + getButton(Dialog.BUTTON_POSITIVE)?.setTextColor(primaryColor) + getButton(Dialog.BUTTON_NEGATIVE)?.setTextColor(primaryColor) + getButton(Dialog.BUTTON_NEUTRAL)?.setTextColor(primaryColor) + callback?.invoke(this) + } + } else { + var title: TextView? = null + if (titleId != 0 || titleText.isNotEmpty()) { + title = layoutInflater.inflate(R.layout.dialog_title, null) as TextView + title.dialog_title_textview.apply { + if (titleText.isNotEmpty()) { + text = titleText + } else { + setText(titleId) + } + setTextColor(textColor) + } + } + + // if we use the same primary and background color, use the text color for dialog confirmation buttons + val dialogButtonColor = if (primaryColor == baseConfig.backgroundColor) { + textColor + } else { + primaryColor + } + + dialog.create().apply { + setView(view) + requestWindowFeature(Window.FEATURE_NO_TITLE) + setCustomTitle(title) + setCanceledOnTouchOutside(cancelOnTouchOutside) + if (!isFinishing) { + show() + } + getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(dialogButtonColor) + getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(dialogButtonColor) + getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(dialogButtonColor) + + val bgDrawable = when { + isBlackAndWhiteTheme() -> resources.getDrawable(R.drawable.black_dialog_background, theme) + baseConfig.isUsingSystemTheme -> resources.getDrawable(R.drawable.dialog_you_background, theme) + else -> resources.getColoredDrawableWithColor(R.drawable.dialog_bg, baseConfig.backgroundColor) + } + + window?.setBackgroundDrawable(bgDrawable) + callback?.invoke(this) + } + } +} + +fun Activity.getAlertDialogBuilder() = if (baseConfig.isUsingSystemTheme) { + MaterialAlertDialogBuilder(this) +} else { + AlertDialog.Builder(this) +} + +fun Activity.showPickSecondsDialogHelper( + curMinutes: Int, isSnoozePicker: Boolean = false, showSecondsAtCustomDialog: Boolean = false, showDuringDayOption: Boolean = false, + cancelCallback: (() -> Unit)? = null, callback: (seconds: Int) -> Unit +) { + val seconds = if (curMinutes == -1) curMinutes else curMinutes * 60 + showPickSecondsDialog(seconds, isSnoozePicker, showSecondsAtCustomDialog, showDuringDayOption, cancelCallback, callback) +} + +fun Activity.showPickSecondsDialog( + curSeconds: Int, isSnoozePicker: Boolean = false, showSecondsAtCustomDialog: Boolean = false, showDuringDayOption: Boolean = false, + cancelCallback: (() -> Unit)? = null, callback: (seconds: Int) -> Unit +) { + hideKeyboard() + val seconds = TreeSet() + seconds.apply { + if (!isSnoozePicker) { + add(-1) + add(0) + } + add(1 * MINUTE_SECONDS) + add(5 * MINUTE_SECONDS) + add(10 * MINUTE_SECONDS) + add(30 * MINUTE_SECONDS) + add(60 * MINUTE_SECONDS) + add(curSeconds) + } + + val items = ArrayList(seconds.size + 1) + seconds.mapIndexedTo(items) { index, value -> + RadioItem(index, getFormattedSeconds(value, !isSnoozePicker), value) + } + + var selectedIndex = 0 + seconds.forEachIndexed { index, value -> + if (value == curSeconds) { + selectedIndex = index + } + } + + items.add(RadioItem(-2, getString(R.string.custom))) + + if (showDuringDayOption) { + items.add(RadioItem(-3, getString(R.string.during_day_at_hh_mm))) + } + + RadioGroupDialog(this, items, selectedIndex, showOKButton = isSnoozePicker, cancelCallback = cancelCallback) { + when (it) { + -2 -> { + CustomIntervalPickerDialog(this, showSeconds = showSecondsAtCustomDialog) { + callback(it) + } + } + -3 -> { + TimePickerDialog( + this, getTimePickerDialogTheme(), + { view, hourOfDay, minute -> callback(hourOfDay * -3600 + minute * -60) }, + curSeconds / 3600, curSeconds % 3600, baseConfig.use24HourFormat + ).show() + } + else -> { + callback(it as Int) + } + } + } +} + +fun BaseSimpleActivity.getAlarmSounds(type: Int, callback: (ArrayList) -> Unit) { + val alarms = ArrayList() + val manager = RingtoneManager(this) + manager.setType(type) + + try { + val cursor = manager.cursor + var curId = 1 + val silentAlarm = AlarmSound(curId++, getString(R.string.no_sound), SILENT) + alarms.add(silentAlarm) + + while (cursor.moveToNext()) { + val title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX) + var uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX) + val id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX) + if (!uri.endsWith(id)) { + uri += "/$id" + } + + val alarmSound = AlarmSound(curId++, title, uri) + alarms.add(alarmSound) + } + callback(alarms) + } catch (e: Exception) { + if (e is SecurityException) { + handlePermission(PERMISSION_READ_STORAGE) { + if (it) { + getAlarmSounds(type, callback) + } else { + showErrorToast(e) + callback(ArrayList()) + } + } + } else { + showErrorToast(e) + callback(ArrayList()) + } + } +} + +fun Activity.checkAppSideloading(): Boolean { + val isSideloaded = when (baseConfig.appSideloadingStatus) { + SIDELOADING_TRUE -> true + SIDELOADING_FALSE -> false + else -> isAppSideloaded() + } + + baseConfig.appSideloadingStatus = if (isSideloaded) SIDELOADING_TRUE else SIDELOADING_FALSE + if (isSideloaded) { + showSideloadingDialog() + } + + return isSideloaded +} + +fun Activity.isAppSideloaded(): Boolean { + return try { + getDrawable(R.drawable.ic_camera_vector) + false + } catch (e: Exception) { + true + } +} + +fun Activity.showSideloadingDialog() { + AppSideloadedDialog(this) { + finish() + } +} + +fun BaseSimpleActivity.getTempFile(folderName: String, filename: String): File? { + val folder = File(cacheDir, folderName) + if (!folder.exists()) { + if (!folder.mkdir()) { + toast(R.string.unknown_error_occurred) + return null + } + } + + return File(folder, filename) +} + +fun Activity.onApplyWindowInsets(callback: (WindowInsetsCompat) -> Unit) { + window.decorView.setOnApplyWindowInsetsListener { view, insets -> + callback(WindowInsetsCompat.toWindowInsetsCompat(insets)) + view.onApplyWindowInsets(insets) + insets + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/AlertDialog.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/AlertDialog.kt new file mode 100644 index 000000000..fb65e515d --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/AlertDialog.kt @@ -0,0 +1,20 @@ +package com.simplemobiletools.commons.extensions + +import android.view.WindowManager +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.widget.AppCompatEditText + +// in dialogs, lets use findViewById, because while some dialogs use MyEditText, material theme dialogs use TextInputEditText so the system takes care of it +fun AlertDialog.showKeyboard(editText: AppCompatEditText) { + window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) + editText.apply { + requestFocus() + onGlobalLayout { + setSelection(text.toString().length) + } + } +} + +fun AlertDialog.hideKeyboard() { + window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Any.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Any.kt new file mode 100644 index 000000000..2b969e3fa --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Any.kt @@ -0,0 +1,8 @@ +package com.simplemobiletools.commons.extensions + +// extensions used mostly at importing app settings for now +fun Any.toBoolean() = toString() == "true" + +fun Any.toInt() = Integer.parseInt(toString()) + +fun Any.toStringSet() = toString().split(",".toRegex()).toSet() diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/App.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/App.kt new file mode 100644 index 000000000..49d5d91b7 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/App.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.commons.extensions + +import android.app.Application +import com.simplemobiletools.commons.helpers.isNougatPlus +import java.util.* + +fun Application.checkUseEnglish() { + if (baseConfig.useEnglish && !isNougatPlus()) { + val conf = resources.configuration + conf.locale = Locale.ENGLISH + resources.updateConfiguration(conf, resources.displayMetrics) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ArrayList.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ArrayList.kt new file mode 100644 index 000000000..71b972a5e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ArrayList.kt @@ -0,0 +1,8 @@ +package com.simplemobiletools.commons.extensions + +import java.util.* + +fun ArrayList.moveLastItemToFront() { + val last = removeAt(size - 1) + add(0, last) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Bitmap.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Bitmap.kt new file mode 100644 index 000000000..9034b6bef --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Bitmap.kt @@ -0,0 +1,15 @@ +package com.simplemobiletools.commons.extensions + +import android.graphics.Bitmap +import java.io.ByteArrayOutputStream + +fun Bitmap.getByteArray(): ByteArray { + var baos: ByteArrayOutputStream? = null + try { + baos = ByteArrayOutputStream() + compress(Bitmap.CompressFormat.JPEG, 80, baos) + return baos.toByteArray() + } finally { + baos?.close() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/BufferedWriter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/BufferedWriter.kt new file mode 100644 index 000000000..fb70f8312 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/BufferedWriter.kt @@ -0,0 +1,8 @@ +package com.simplemobiletools.commons.extensions + +import java.io.BufferedWriter + +fun BufferedWriter.writeLn(line: String) { + write(line) + newLine() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-contacts.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-contacts.kt new file mode 100644 index 000000000..fc31ff92c --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-contacts.kt @@ -0,0 +1,323 @@ +package com.simplemobiletools.commons.extensions + +import android.content.Context +import android.content.Intent +import android.database.Cursor +import android.net.Uri +import android.os.Handler +import android.os.Looper +import android.provider.ContactsContract +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.databases.ContactsDatabase +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.interfaces.ContactsDao +import com.simplemobiletools.commons.interfaces.GroupsDao +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.commons.models.contacts.ContactSource +import com.simplemobiletools.commons.models.contacts.Organization +import com.simplemobiletools.commons.models.contacts.SocialAction +import java.io.File + +val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() + +val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao() + +fun Context.getEmptyContact(): Contact { + val originalContactSource = if (hasContactPermissions()) baseConfig.lastUsedContactSource else SMT_PRIVATE + val organization = Organization("", "") + return Contact( + 0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "", + null, "", ArrayList(), organization, ArrayList(), ArrayList(), DEFAULT_MIMETYPE, null + ) +} + +fun Context.sendAddressIntent(address: String) { + val location = Uri.encode(address) + val uri = Uri.parse("geo:0,0?q=$location") + + Intent(Intent.ACTION_VIEW, uri).apply { + launchActivityIntent(this) + } +} + +fun Context.openWebsiteIntent(url: String) { + val website = if (url.startsWith("http")) { + url + } else { + "https://$url" + } + + Intent(Intent.ACTION_VIEW).apply { + data = Uri.parse(website) + launchActivityIntent(this) + } +} + +fun Context.getLookupUriRawId(dataUri: Uri): Int { + val lookupKey = getLookupKeyFromUri(dataUri) + if (lookupKey != null) { + val uri = lookupContactUri(lookupKey, this) + if (uri != null) { + return getContactUriRawId(uri) + } + } + return -1 +} + +fun Context.getContactUriRawId(uri: Uri): Int { + val projection = arrayOf(ContactsContract.Contacts.NAME_RAW_CONTACT_ID) + var cursor: Cursor? = null + try { + cursor = contentResolver.query(uri, projection, null, null, null) + if (cursor!!.moveToFirst()) { + return cursor.getIntValue(ContactsContract.Contacts.NAME_RAW_CONTACT_ID) + } + } catch (ignored: Exception) { + } finally { + cursor?.close() + } + return -1 +} + +// from https://android.googlesource.com/platform/packages/apps/Dialer/+/68038172793ee0e2ab3e2e56ddfbeb82879d1f58/java/com/android/contacts/common/util/UriUtils.java +fun getLookupKeyFromUri(lookupUri: Uri): String? { + return if (!isEncodedContactUri(lookupUri)) { + val segments = lookupUri.pathSegments + if (segments.size < 3) null else Uri.encode(segments[2]) + } else { + null + } +} + +fun isEncodedContactUri(uri: Uri?): Boolean { + if (uri == null) { + return false + } + val lastPathSegment = uri.lastPathSegment ?: return false + return lastPathSegment == "encoded" +} + +fun lookupContactUri(lookup: String, context: Context): Uri? { + val lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookup) + return try { + ContactsContract.Contacts.lookupContact(context.contentResolver, lookupUri) + } catch (e: Exception) { + null + } +} + +fun Context.getCachePhoto(): File { + val imagesFolder = File(cacheDir, "my_cache") + if (!imagesFolder.exists()) { + imagesFolder.mkdirs() + } + + val file = File(imagesFolder, "Photo_${System.currentTimeMillis()}.jpg") + file.createNewFile() + return file +} + +fun Context.getPhotoThumbnailSize(): Int { + val uri = ContactsContract.DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI + val projection = arrayOf(ContactsContract.DisplayPhoto.THUMBNAIL_MAX_DIM) + var cursor: Cursor? = null + try { + cursor = contentResolver.query(uri, projection, null, null, null) + if (cursor?.moveToFirst() == true) { + return cursor.getIntValue(ContactsContract.DisplayPhoto.THUMBNAIL_MAX_DIM) + } + } catch (ignored: Exception) { + } finally { + cursor?.close() + } + return 0 +} + +fun Context.hasContactPermissions() = hasPermission(PERMISSION_READ_CONTACTS) && hasPermission(PERMISSION_WRITE_CONTACTS) + +fun Context.getPublicContactSource(source: String, callback: (String) -> Unit) { + when (source) { + SMT_PRIVATE -> callback(getString(R.string.phone_storage_hidden)) + else -> { + ContactsHelper(this).getContactSources { + var newSource = source + for (contactSource in it) { + if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { + newSource = getString(R.string.telegram) + break + } else if (contactSource.name == source && contactSource.type == VIBER_PACKAGE) { + newSource = getString(R.string.viber) + break + } + } + Handler(Looper.getMainLooper()).post { + callback(newSource) + } + } + } + } +} + +fun Context.getPublicContactSourceSync(source: String, contactSources: ArrayList): String { + return when (source) { + SMT_PRIVATE -> getString(R.string.phone_storage_hidden) + else -> { + var newSource = source + for (contactSource in contactSources) { + if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { + newSource = getString(R.string.telegram) + break + } else if (contactSource.name == source && contactSource.type == VIBER_PACKAGE) { + newSource = getString(R.string.viber) + break + } + } + + return newSource + } + } +} + +fun Context.sendSMSToContacts(contacts: ArrayList) { + val numbers = StringBuilder() + contacts.forEach { + val number = it.phoneNumbers.firstOrNull { it.type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE } + ?: it.phoneNumbers.firstOrNull() + if (number != null) { + numbers.append("${Uri.encode(number.value)};") + } + } + + val uriString = "smsto:${numbers.toString().trimEnd(';')}" + Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply { + launchActivityIntent(this) + } +} + +fun Context.sendEmailToContacts(contacts: ArrayList) { + val emails = ArrayList() + contacts.forEach { + it.emails.forEach { + if (it.value.isNotEmpty()) { + emails.add(it.value) + } + } + } + + Intent(Intent.ACTION_SEND_MULTIPLE).apply { + type = "message/rfc822" + putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray()) + launchActivityIntent(this) + } +} + +fun Context.getTempFile(filename: String = DEFAULT_FILE_NAME): File? { + val folder = File(cacheDir, "contacts") + if (!folder.exists()) { + if (!folder.mkdir()) { + toast(R.string.unknown_error_occurred) + return null + } + } + + return File(folder, filename) +} + +fun Context.addContactsToGroup(contacts: ArrayList, groupId: Long) { + val publicContacts = contacts.filter { !it.isPrivate() }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.isPrivate() }.toMutableList() as ArrayList + if (publicContacts.isNotEmpty()) { + ContactsHelper(this).addContactsToGroup(publicContacts, groupId) + } + + if (privateContacts.isNotEmpty()) { + LocalContactsHelper(this).addContactsToGroup(privateContacts, groupId) + } +} + +fun Context.removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + val publicContacts = contacts.filter { !it.isPrivate() }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.isPrivate() }.toMutableList() as ArrayList + if (publicContacts.isNotEmpty() && hasContactPermissions()) { + ContactsHelper(this).removeContactsFromGroup(publicContacts, groupId) + } + + if (privateContacts.isNotEmpty()) { + LocalContactsHelper(this).removeContactsFromGroup(privateContacts, groupId) + } +} + +fun Context.getContactPublicUri(contact: Contact): Uri { + val lookupKey = if (contact.isPrivate()) { + "local_${contact.id}" + } else { + SimpleContactsHelper(this).getContactLookupKey(contact.id.toString()) + } + return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey) +} + +fun Context.getVisibleContactSources(): ArrayList { + val sources = getAllContactSources() + val ignoredContactSources = baseConfig.ignoredContactSources + return ArrayList(sources).filter { !ignoredContactSources.contains(it.getFullIdentifier()) } + .map { it.name }.toMutableList() as ArrayList +} + +fun Context.getAllContactSources(): ArrayList { + val sources = ContactsHelper(this).getDeviceContactSources() + sources.add(getPrivateContactSource()) + return sources.toMutableList() as ArrayList +} + +fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden)) + +fun Context.getSocialActions(id: Int): ArrayList { + val uri = ContactsContract.Data.CONTENT_URI + val projection = arrayOf( + ContactsContract.Data._ID, + ContactsContract.Data.DATA3, + ContactsContract.Data.MIMETYPE, + ContactsContract.Data.ACCOUNT_TYPE_AND_DATA_SET + ) + + val socialActions = ArrayList() + var curActionId = 0 + val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(id.toString()) + queryCursor(uri, projection, selection, selectionArgs, null, true) { cursor -> + val mimetype = cursor.getStringValue(ContactsContract.Data.MIMETYPE) + val type = when (mimetype) { + // WhatsApp + "vnd.android.cursor.item/vnd.com.whatsapp.profile" -> SOCIAL_MESSAGE + "vnd.android.cursor.item/vnd.com.whatsapp.voip.call" -> SOCIAL_VOICE_CALL + "vnd.android.cursor.item/vnd.com.whatsapp.video.call" -> SOCIAL_VIDEO_CALL + + // Viber + "vnd.android.cursor.item/vnd.com.viber.voip.viber_number_call" -> SOCIAL_VOICE_CALL + "vnd.android.cursor.item/vnd.com.viber.voip.viber_out_call_viber" -> SOCIAL_VOICE_CALL + "vnd.android.cursor.item/vnd.com.viber.voip.viber_out_call_none_viber" -> SOCIAL_VOICE_CALL + "vnd.android.cursor.item/vnd.com.viber.voip.viber_number_message" -> SOCIAL_MESSAGE + + // Signal + "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.contact" -> SOCIAL_MESSAGE + "vnd.android.cursor.item/vnd.org.thoughtcrime.securesms.call" -> SOCIAL_VOICE_CALL + + // Telegram + "vnd.android.cursor.item/vnd.org.telegram.messenger.android.call" -> SOCIAL_VOICE_CALL + "vnd.android.cursor.item/vnd.org.telegram.messenger.android.call.video" -> SOCIAL_VIDEO_CALL + "vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile" -> SOCIAL_MESSAGE + + // Threema + "vnd.android.cursor.item/vnd.ch.threema.app.profile" -> SOCIAL_MESSAGE + "vnd.android.cursor.item/vnd.ch.threema.app.call" -> SOCIAL_VOICE_CALL + else -> return@queryCursor + } + + val label = cursor.getStringValue(ContactsContract.Data.DATA3) + val realID = cursor.getLongValue(ContactsContract.Data._ID) + val packageName = cursor.getStringValue(ContactsContract.Data.ACCOUNT_TYPE_AND_DATA_SET) + val socialAction = SocialAction(curActionId++, type, label, mimetype, realID, packageName) + socialActions.add(socialAction) + } + return socialActions +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage-sdk30.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage-sdk30.kt new file mode 100644 index 000000000..2a33ddf11 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage-sdk30.kt @@ -0,0 +1,256 @@ +package com.simplemobiletools.commons.extensions + +import android.content.Context +import android.net.Uri +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import androidx.documentfile.provider.DocumentFile +import com.simplemobiletools.commons.helpers.EXTERNAL_STORAGE_PROVIDER_AUTHORITY +import com.simplemobiletools.commons.helpers.isRPlus +import com.simplemobiletools.commons.helpers.isSPlus +import com.simplemobiletools.commons.models.FileDirItem +import java.io.File + +private const val DOWNLOAD_DIR = "Download" +private const val ANDROID_DIR = "Android" +private val DIRS_INACCESSIBLE_WITH_SAF_SDK_30 = listOf(DOWNLOAD_DIR, ANDROID_DIR) + +fun Context.hasProperStoredFirstParentUri(path: String): Boolean { + val firstParentUri = createFirstParentTreeUri(path) + return contentResolver.persistedUriPermissions.any { it.uri.toString() == firstParentUri.toString() } +} + +fun Context.isAccessibleWithSAFSdk30(path: String): Boolean { + if (path.startsWith(recycleBinPath) || isExternalStorageManager()) { + return false + } + + val level = getFirstParentLevel(path) + val firstParentDir = path.getFirstParentDirName(this, level) + val firstParentPath = path.getFirstParentPath(this, level) + + val isValidName = firstParentDir != null + val isDirectory = File(firstParentPath).isDirectory + val isAnAccessibleDirectory = DIRS_INACCESSIBLE_WITH_SAF_SDK_30.all { !firstParentDir.equals(it, true) } + return isRPlus() && isValidName && isDirectory && isAnAccessibleDirectory +} + +fun Context.getFirstParentLevel(path: String): Int { + return when { + isRPlus() && (isInAndroidDir(path) || isInSubFolderInDownloadDir(path)) -> 1 + else -> 0 + } +} + +fun Context.isRestrictedWithSAFSdk30(path: String): Boolean { + if (path.startsWith(recycleBinPath) || isExternalStorageManager()) { + return false + } + + val level = getFirstParentLevel(path) + val firstParentDir = path.getFirstParentDirName(this, level) + val firstParentPath = path.getFirstParentPath(this, level) + + val isInvalidName = firstParentDir == null + val isDirectory = File(firstParentPath).isDirectory + val isARestrictedDirectory = DIRS_INACCESSIBLE_WITH_SAF_SDK_30.any { firstParentDir.equals(it, true) } + return isRPlus() && (isInvalidName || (isDirectory && isARestrictedDirectory)) +} + +fun Context.isInDownloadDir(path: String): Boolean { + if (path.startsWith(recycleBinPath)) { + return false + } + val firstParentDir = path.getFirstParentDirName(this, 0) + return firstParentDir.equals(DOWNLOAD_DIR, true) +} + +fun Context.isInSubFolderInDownloadDir(path: String): Boolean { + if (path.startsWith(recycleBinPath)) { + return false + } + val firstParentDir = path.getFirstParentDirName(this, 1) + return if (firstParentDir == null) { + false + } else { + val startsWithDownloadDir = firstParentDir.startsWith(DOWNLOAD_DIR, true) + val hasAtLeast1PathSegment = firstParentDir.split("/").filter { it.isNotEmpty() }.size > 1 + val firstParentPath = path.getFirstParentPath(this, 1) + startsWithDownloadDir && hasAtLeast1PathSegment && File(firstParentPath).isDirectory + } +} + +fun Context.isInAndroidDir(path: String): Boolean { + if (path.startsWith(recycleBinPath)) { + return false + } + val firstParentDir = path.getFirstParentDirName(this, 0) + return firstParentDir.equals(ANDROID_DIR, true) +} + +fun isExternalStorageManager(): Boolean { + return isRPlus() && Environment.isExternalStorageManager() +} + +// is the app a Media Management App on Android 12+? +fun Context.canManageMedia(): Boolean { + return isSPlus() && MediaStore.canManageMedia(this) +} + +fun Context.createFirstParentTreeUriUsingRootTree(fullPath: String): Uri { + val storageId = getSAFStorageId(fullPath) + val level = getFirstParentLevel(fullPath) + val rootParentDirName = fullPath.getFirstParentDirName(this, level) + val treeUri = DocumentsContract.buildTreeDocumentUri(EXTERNAL_STORAGE_PROVIDER_AUTHORITY, "$storageId:") + val documentId = "${storageId}:$rootParentDirName" + return DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) +} + +fun Context.createFirstParentTreeUri(fullPath: String): Uri { + val storageId = getSAFStorageId(fullPath) + val level = getFirstParentLevel(fullPath) + val rootParentDirName = fullPath.getFirstParentDirName(this, level) + val firstParentId = "$storageId:$rootParentDirName" + return DocumentsContract.buildTreeDocumentUri(EXTERNAL_STORAGE_PROVIDER_AUTHORITY, firstParentId) +} + +fun Context.createDocumentUriUsingFirstParentTreeUri(fullPath: String): Uri { + val storageId = getSAFStorageId(fullPath) + val relativePath = when { + fullPath.startsWith(internalStoragePath) -> fullPath.substring(internalStoragePath.length).trim('/') + else -> fullPath.substringAfter(storageId).trim('/') + } + val treeUri = createFirstParentTreeUri(fullPath) + val documentId = "${storageId}:$relativePath" + return DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) +} + +fun Context.getSAFDocumentId(path: String): String { + val basePath = path.getBasePath(this) + val relativePath = path.substring(basePath.length).trim('/') + val storageId = getSAFStorageId(path) + return "$storageId:$relativePath" +} + +fun Context.createSAFDirectorySdk30(path: String): Boolean { + return try { + val treeUri = createFirstParentTreeUri(path) + val parentPath = path.getParentPath() + if (!getDoesFilePathExistSdk30(parentPath)) { + createSAFDirectorySdk30(parentPath) + } + + val documentId = getSAFDocumentId(parentPath) + val parentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + DocumentsContract.createDocument(contentResolver, parentUri, DocumentsContract.Document.MIME_TYPE_DIR, path.getFilenameFromPath()) != null + } catch (e: IllegalStateException) { + showErrorToast(e) + false + } +} + +fun Context.createSAFFileSdk30(path: String): Boolean { + return try { + val treeUri = createFirstParentTreeUri(path) + val parentPath = path.getParentPath() + if (!getDoesFilePathExistSdk30(parentPath)) { + createSAFDirectorySdk30(parentPath) + } + + val documentId = getSAFDocumentId(parentPath) + val parentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + DocumentsContract.createDocument(contentResolver, parentUri, path.getMimeType(), path.getFilenameFromPath()) != null + } catch (e: IllegalStateException) { + showErrorToast(e) + false + } +} + +fun Context.getDoesFilePathExistSdk30(path: String): Boolean { + return when { + isAccessibleWithSAFSdk30(path) -> getFastDocumentSdk30(path)?.exists() ?: false + else -> File(path).exists() + } +} + +fun Context.getSomeDocumentSdk30(path: String): DocumentFile? = getFastDocumentSdk30(path) ?: getDocumentSdk30(path) + +fun Context.getFastDocumentSdk30(path: String): DocumentFile? { + val uri = createDocumentUriUsingFirstParentTreeUri(path) + return DocumentFile.fromSingleUri(this, uri) +} + +fun Context.getDocumentSdk30(path: String): DocumentFile? { + val level = getFirstParentLevel(path) + val firstParentPath = path.getFirstParentPath(this, level) + var relativePath = path.substring(firstParentPath.length) + if (relativePath.startsWith(File.separator)) { + relativePath = relativePath.substring(1) + } + + return try { + val treeUri = createFirstParentTreeUri(path) + var document = DocumentFile.fromTreeUri(applicationContext, treeUri) + val parts = relativePath.split("/").filter { it.isNotEmpty() } + for (part in parts) { + document = document?.findFile(part) + } + document + } catch (ignored: Exception) { + null + } +} + +fun Context.deleteDocumentWithSAFSdk30(fileDirItem: FileDirItem, allowDeleteFolder: Boolean, callback: ((wasSuccess: Boolean) -> Unit)?) { + try { + var fileDeleted = false + if (fileDirItem.isDirectory.not() || allowDeleteFolder) { + val fileUri = createDocumentUriUsingFirstParentTreeUri(fileDirItem.path) + fileDeleted = DocumentsContract.deleteDocument(contentResolver, fileUri) + } + + if (fileDeleted) { + deleteFromMediaStore(fileDirItem.path) + callback?.invoke(true) + } + + } catch (e: Exception) { + callback?.invoke(false) + showErrorToast(e) + } +} + +fun Context.renameDocumentSdk30(oldPath: String, newPath: String): Boolean { + return try { + val treeUri = createFirstParentTreeUri(oldPath) + val documentId = getSAFDocumentId(oldPath) + val parentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + DocumentsContract.renameDocument(contentResolver, parentUri, newPath.getFilenameFromPath()) != null + } catch (e: IllegalStateException) { + showErrorToast(e) + false + } +} + +fun Context.hasProperStoredDocumentUriSdk30(path: String): Boolean { + val documentUri = buildDocumentUriSdk30(path) + return contentResolver.persistedUriPermissions.any { it.uri.toString() == documentUri.toString() } +} + +fun Context.buildDocumentUriSdk30(fullPath: String): Uri { + val storageId = getSAFStorageId(fullPath) + + val relativePath = when { + fullPath.startsWith(internalStoragePath) -> fullPath.substring(internalStoragePath.length).trim('/') + else -> fullPath.substringAfter(storageId).trim('/') + } + + val documentId = "${storageId}:$relativePath" + return DocumentsContract.buildDocumentUri(EXTERNAL_STORAGE_PROVIDER_AUTHORITY, documentId) +} + +fun Context.getPicturesDirectoryPath(fullPath: String): String { + val basePath = fullPath.getBasePath(this) + return File(basePath, Environment.DIRECTORY_PICTURES).absolutePath +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage.kt new file mode 100644 index 000000000..bf5413dfb --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-storage.kt @@ -0,0 +1,993 @@ +package com.simplemobiletools.commons.extensions + +import android.content.ContentUris +import android.content.ContentValues +import android.content.Context +import android.content.Intent +import android.hardware.usb.UsbConstants +import android.hardware.usb.UsbManager +import android.media.MediaScannerConnection +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.os.Handler +import android.os.Looper +import android.provider.DocumentsContract +import android.provider.DocumentsContract.Document +import android.provider.MediaStore.* +import android.text.TextUtils +import androidx.annotation.RequiresApi +import androidx.core.content.FileProvider +import androidx.core.net.toUri +import androidx.documentfile.provider.DocumentFile +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.FileDirItem +import java.io.File +import java.io.FileInputStream +import java.io.InputStream +import java.net.URLDecoder +import java.util.* +import java.util.regex.Pattern + +private const val ANDROID_DATA_DIR = "/Android/data/" +private const val ANDROID_OBB_DIR = "/Android/obb/" +val DIRS_ACCESSIBLE_ONLY_WITH_SAF = listOf(ANDROID_DATA_DIR, ANDROID_OBB_DIR) +val Context.recycleBinPath: String get() = filesDir.absolutePath + +// http://stackoverflow.com/a/40582634/1967672 +fun Context.getSDCardPath(): String { + val directories = getStorageDirectories().filter { + !it.equals(getInternalStoragePath()) && !it.equals( + "/storage/emulated/0", + true + ) && (baseConfig.OTGPartition.isEmpty() || !it.endsWith(baseConfig.OTGPartition)) + } + + val fullSDpattern = Pattern.compile(SD_OTG_PATTERN) + var sdCardPath = directories.firstOrNull { fullSDpattern.matcher(it).matches() } + ?: directories.firstOrNull { !physicalPaths.contains(it.toLowerCase()) } ?: "" + + // on some devices no method retrieved any SD card path, so test if its not sdcard1 by any chance. It happened on an Android 5.1 + if (sdCardPath.trimEnd('/').isEmpty()) { + val file = File("/storage/sdcard1") + if (file.exists()) { + return file.absolutePath + } + + sdCardPath = directories.firstOrNull() ?: "" + } + + if (sdCardPath.isEmpty()) { + val SDpattern = Pattern.compile(SD_OTG_SHORT) + try { + File("/storage").listFiles()?.forEach { + if (SDpattern.matcher(it.name).matches()) { + sdCardPath = "/storage/${it.name}" + } + } + } catch (e: Exception) { + } + } + + val finalPath = sdCardPath.trimEnd('/') + baseConfig.sdCardPath = finalPath + return finalPath +} + +fun Context.hasExternalSDCard() = sdCardPath.isNotEmpty() + +fun Context.hasOTGConnected(): Boolean { + return try { + (getSystemService(Context.USB_SERVICE) as UsbManager).deviceList.any { + it.value.getInterface(0).interfaceClass == UsbConstants.USB_CLASS_MASS_STORAGE + } + } catch (e: Exception) { + false + } +} + +fun Context.getStorageDirectories(): Array { + val paths = HashSet() + val rawExternalStorage = System.getenv("EXTERNAL_STORAGE") + val rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE") + val rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET") + if (TextUtils.isEmpty(rawEmulatedStorageTarget)) { + getExternalFilesDirs(null).filterNotNull().map { it.absolutePath } + .mapTo(paths) { it.substring(0, it.indexOf("Android/data")) } + } else { + val path = Environment.getExternalStorageDirectory().absolutePath + val folders = Pattern.compile("/").split(path) + val lastFolder = folders[folders.size - 1] + var isDigit = false + try { + Integer.valueOf(lastFolder) + isDigit = true + } catch (ignored: NumberFormatException) { + } + + val rawUserId = if (isDigit) lastFolder else "" + if (TextUtils.isEmpty(rawUserId)) { + paths.add(rawEmulatedStorageTarget!!) + } else { + paths.add(rawEmulatedStorageTarget + File.separator + rawUserId) + } + } + + if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) { + val rawSecondaryStorages = rawSecondaryStoragesStr!!.split(File.pathSeparator.toRegex()).dropLastWhile(String::isEmpty).toTypedArray() + Collections.addAll(paths, *rawSecondaryStorages) + } + return paths.map { it.trimEnd('/') }.toTypedArray() +} + +fun Context.getHumanReadablePath(path: String): String { + return getString( + when (path) { + "/" -> R.string.root + internalStoragePath -> R.string.internal + otgPath -> R.string.usb + else -> R.string.sd_card + } + ) +} + +fun Context.humanizePath(path: String): String { + val trimmedPath = path.trimEnd('/') + val basePath = path.getBasePath(this) + return when (basePath) { + "/" -> "${getHumanReadablePath(basePath)}$trimmedPath" + else -> trimmedPath.replaceFirst(basePath, getHumanReadablePath(basePath)) + } +} + +fun Context.getInternalStoragePath() = + if (File("/storage/emulated/0").exists()) "/storage/emulated/0" else Environment.getExternalStorageDirectory().absolutePath.trimEnd('/') + +fun Context.isPathOnSD(path: String) = sdCardPath.isNotEmpty() && path.startsWith(sdCardPath) + +fun Context.isPathOnOTG(path: String) = otgPath.isNotEmpty() && path.startsWith(otgPath) + +fun Context.isPathOnInternalStorage(path: String) = internalStoragePath.isNotEmpty() && path.startsWith(internalStoragePath) + +fun Context.getSAFOnlyDirs(): List { + return DIRS_ACCESSIBLE_ONLY_WITH_SAF.map { "$internalStoragePath$it" } + + DIRS_ACCESSIBLE_ONLY_WITH_SAF.map { "$sdCardPath$it" } +} + +fun Context.isSAFOnlyRoot(path: String): Boolean { + return getSAFOnlyDirs().any { "${path.trimEnd('/')}/".startsWith(it) } +} + +fun Context.isRestrictedSAFOnlyRoot(path: String): Boolean { + return isRPlus() && isSAFOnlyRoot(path) +} + +// no need to use DocumentFile if an SD card is set as the default storage +fun Context.needsStupidWritePermissions(path: String) = !isRPlus() && (isPathOnSD(path) || isPathOnOTG(path)) && !isSDCardSetAsDefaultStorage() + +fun Context.isSDCardSetAsDefaultStorage() = sdCardPath.isNotEmpty() && Environment.getExternalStorageDirectory().absolutePath.equals(sdCardPath, true) + +fun Context.hasProperStoredTreeUri(isOTG: Boolean): Boolean { + val uri = if (isOTG) baseConfig.OTGTreeUri else baseConfig.sdTreeUri + val hasProperUri = contentResolver.persistedUriPermissions.any { it.uri.toString() == uri } + if (!hasProperUri) { + if (isOTG) { + baseConfig.OTGTreeUri = "" + } else { + baseConfig.sdTreeUri = "" + } + } + return hasProperUri +} + +fun Context.hasProperStoredAndroidTreeUri(path: String): Boolean { + val uri = getAndroidTreeUri(path) + val hasProperUri = contentResolver.persistedUriPermissions.any { it.uri.toString() == uri } + if (!hasProperUri) { + storeAndroidTreeUri(path, "") + } + return hasProperUri +} + +fun Context.getAndroidTreeUri(path: String): String { + return when { + isPathOnOTG(path) -> if (isAndroidDataDir(path)) baseConfig.otgAndroidDataTreeUri else baseConfig.otgAndroidObbTreeUri + isPathOnSD(path) -> if (isAndroidDataDir(path)) baseConfig.sdAndroidDataTreeUri else baseConfig.sdAndroidObbTreeUri + else -> if (isAndroidDataDir(path)) baseConfig.primaryAndroidDataTreeUri else baseConfig.primaryAndroidObbTreeUri + } +} + +fun isAndroidDataDir(path: String): Boolean { + val resolvedPath = "${path.trimEnd('/')}/" + return resolvedPath.contains(ANDROID_DATA_DIR) +} + +fun Context.storeAndroidTreeUri(path: String, treeUri: String) { + return when { + isPathOnOTG(path) -> if (isAndroidDataDir(path)) baseConfig.otgAndroidDataTreeUri = treeUri else baseConfig.otgAndroidObbTreeUri = treeUri + isPathOnSD(path) -> if (isAndroidDataDir(path)) baseConfig.sdAndroidDataTreeUri = treeUri else baseConfig.sdAndroidObbTreeUri = treeUri + else -> if (isAndroidDataDir(path)) baseConfig.primaryAndroidDataTreeUri = treeUri else baseConfig.primaryAndroidObbTreeUri = treeUri + } +} + +fun Context.getSAFStorageId(fullPath: String): String { + return if (fullPath.startsWith('/')) { + when { + fullPath.startsWith(internalStoragePath) -> "primary" + else -> fullPath.substringAfter("/storage/", "").substringBefore('/') + } + } else { + fullPath.substringBefore(':', "").substringAfterLast('/') + } +} + +fun Context.createDocumentUriFromRootTree(fullPath: String): Uri { + val storageId = getSAFStorageId(fullPath) + + val relativePath = when { + fullPath.startsWith(internalStoragePath) -> fullPath.substring(internalStoragePath.length).trim('/') + else -> fullPath.substringAfter(storageId).trim('/') + } + + val treeUri = DocumentsContract.buildTreeDocumentUri(EXTERNAL_STORAGE_PROVIDER_AUTHORITY, "$storageId:") + val documentId = "${storageId}:$relativePath" + return DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) +} + +fun Context.createAndroidDataOrObbPath(fullPath: String): String { + return if (isAndroidDataDir(fullPath)) { + fullPath.getBasePath(this).trimEnd('/').plus(ANDROID_DATA_DIR) + } else { + fullPath.getBasePath(this).trimEnd('/').plus(ANDROID_OBB_DIR) + } +} + +fun Context.createAndroidDataOrObbUri(fullPath: String): Uri { + val path = createAndroidDataOrObbPath(fullPath) + return createDocumentUriFromRootTree(path) +} + +fun Context.getStorageRootIdForAndroidDir(path: String) = + getAndroidTreeUri(path).removeSuffix(if (isAndroidDataDir(path)) "%3AAndroid%2Fdata" else "%3AAndroid%2Fobb").substringAfterLast('/').trimEnd('/') + +fun Context.isAStorageRootFolder(path: String): Boolean { + val trimmed = path.trimEnd('/') + return trimmed.isEmpty() || trimmed.equals(internalStoragePath, true) || trimmed.equals(sdCardPath, true) || trimmed.equals(otgPath, true) +} + +fun Context.getMyFileUri(file: File): Uri { + return if (isNougatPlus()) { + FileProvider.getUriForFile(this, "$packageName.provider", file) + } else { + Uri.fromFile(file) + } +} + +fun Context.tryFastDocumentDelete(path: String, allowDeleteFolder: Boolean): Boolean { + val document = getFastDocumentFile(path) + return if (document?.isFile == true || allowDeleteFolder) { + try { + DocumentsContract.deleteDocument(contentResolver, document?.uri!!) + } catch (e: Exception) { + false + } + } else { + false + } +} + +fun Context.getFastDocumentFile(path: String): DocumentFile? { + if (isPathOnOTG(path)) { + return getOTGFastDocumentFile(path) + } + + if (baseConfig.sdCardPath.isEmpty()) { + return null + } + + val relativePath = Uri.encode(path.substring(baseConfig.sdCardPath.length).trim('/')) + val externalPathPart = baseConfig.sdCardPath.split("/").lastOrNull(String::isNotEmpty)?.trim('/') ?: return null + val fullUri = "${baseConfig.sdTreeUri}/document/$externalPathPart%3A$relativePath" + return DocumentFile.fromSingleUri(this, Uri.parse(fullUri)) +} + +fun Context.getOTGFastDocumentFile(path: String, otgPathToUse: String? = null): DocumentFile? { + if (baseConfig.OTGTreeUri.isEmpty()) { + return null + } + + val otgPath = otgPathToUse ?: baseConfig.OTGPath + if (baseConfig.OTGPartition.isEmpty()) { + baseConfig.OTGPartition = baseConfig.OTGTreeUri.removeSuffix("%3A").substringAfterLast('/').trimEnd('/') + updateOTGPathFromPartition() + } + + val relativePath = Uri.encode(path.substring(otgPath.length).trim('/')) + val fullUri = "${baseConfig.OTGTreeUri}/document/${baseConfig.OTGPartition}%3A$relativePath" + return DocumentFile.fromSingleUri(this, Uri.parse(fullUri)) +} + +fun Context.getDocumentFile(path: String): DocumentFile? { + val isOTG = isPathOnOTG(path) + var relativePath = path.substring(if (isOTG) otgPath.length else sdCardPath.length) + if (relativePath.startsWith(File.separator)) { + relativePath = relativePath.substring(1) + } + + return try { + val treeUri = Uri.parse(if (isOTG) baseConfig.OTGTreeUri else baseConfig.sdTreeUri) + var document = DocumentFile.fromTreeUri(applicationContext, treeUri) + val parts = relativePath.split("/").filter { it.isNotEmpty() } + for (part in parts) { + document = document?.findFile(part) + } + document + } catch (ignored: Exception) { + null + } +} + +fun Context.getSomeDocumentFile(path: String) = getFastDocumentFile(path) ?: getDocumentFile(path) + +fun Context.scanFileRecursively(file: File, callback: (() -> Unit)? = null) { + scanFilesRecursively(arrayListOf(file), callback) +} + +fun Context.scanPathRecursively(path: String, callback: (() -> Unit)? = null) { + scanPathsRecursively(arrayListOf(path), callback) +} + +fun Context.scanFilesRecursively(files: List, callback: (() -> Unit)? = null) { + val allPaths = ArrayList() + for (file in files) { + allPaths.addAll(getPaths(file)) + } + rescanPaths(allPaths, callback) +} + +fun Context.scanPathsRecursively(paths: List, callback: (() -> Unit)? = null) { + val allPaths = ArrayList() + for (path in paths) { + allPaths.addAll(getPaths(File(path))) + } + rescanPaths(allPaths, callback) +} + +fun Context.rescanPath(path: String, callback: (() -> Unit)? = null) { + rescanPaths(arrayListOf(path), callback) +} + +// avoid calling this multiple times in row, it can delete whole folder contents +fun Context.rescanPaths(paths: List, callback: (() -> Unit)? = null) { + if (paths.isEmpty()) { + callback?.invoke() + return + } + + for (path in paths) { + Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE).apply { + data = Uri.fromFile(File(path)) + sendBroadcast(this) + } + } + + var cnt = paths.size + MediaScannerConnection.scanFile(applicationContext, paths.toTypedArray(), null) { s, uri -> + if (--cnt == 0) { + callback?.invoke() + } + } +} + +fun getPaths(file: File): ArrayList { + val paths = arrayListOf(file.absolutePath) + if (file.isDirectory) { + val files = file.listFiles() ?: return paths + for (curFile in files) { + paths.addAll(getPaths(curFile)) + } + } + return paths +} + +fun Context.getFileUri(path: String) = when { + path.isImageSlow() -> Images.Media.EXTERNAL_CONTENT_URI + path.isVideoSlow() -> Video.Media.EXTERNAL_CONTENT_URI + path.isAudioSlow() -> Audio.Media.EXTERNAL_CONTENT_URI + else -> Files.getContentUri("external") +} + +// these functions update the mediastore instantly, MediaScannerConnection.scanFileRecursively takes some time to really get applied +fun Context.deleteFromMediaStore(path: String, callback: ((needsRescan: Boolean) -> Unit)? = null) { + if (getIsPathDirectory(path)) { + callback?.invoke(false) + return + } + + ensureBackgroundThread { + try { + val where = "${MediaColumns.DATA} = ?" + val args = arrayOf(path) + val needsRescan = contentResolver.delete(getFileUri(path), where, args) != 1 + callback?.invoke(needsRescan) + } catch (ignored: Exception) { + callback?.invoke(true) + } + } +} + +fun Context.rescanAndDeletePath(path: String, callback: () -> Unit) { + val SCAN_FILE_MAX_DURATION = 1000L + val scanFileHandler = Handler(Looper.getMainLooper()) + scanFileHandler.postDelayed({ + callback() + }, SCAN_FILE_MAX_DURATION) + + MediaScannerConnection.scanFile(applicationContext, arrayOf(path), null) { path, uri -> + scanFileHandler.removeCallbacksAndMessages(null) + try { + applicationContext.contentResolver.delete(uri, null, null) + } catch (e: Exception) { + } + callback() + } +} + +fun Context.updateInMediaStore(oldPath: String, newPath: String) { + ensureBackgroundThread { + val values = ContentValues().apply { + put(MediaColumns.DATA, newPath) + put(MediaColumns.DISPLAY_NAME, newPath.getFilenameFromPath()) + put(MediaColumns.TITLE, newPath.getFilenameFromPath()) + } + val uri = getFileUri(oldPath) + val selection = "${MediaColumns.DATA} = ?" + val selectionArgs = arrayOf(oldPath) + + try { + contentResolver.update(uri, values, selection, selectionArgs) + } catch (ignored: Exception) { + } + } +} + +fun Context.updateLastModified(path: String, lastModified: Long) { + val values = ContentValues().apply { + put(MediaColumns.DATE_MODIFIED, lastModified / 1000) + } + File(path).setLastModified(lastModified) + val uri = getFileUri(path) + val selection = "${MediaColumns.DATA} = ?" + val selectionArgs = arrayOf(path) + + try { + contentResolver.update(uri, values, selection, selectionArgs) + } catch (ignored: Exception) { + } +} + +fun Context.getOTGItems(path: String, shouldShowHidden: Boolean, getProperFileSize: Boolean, callback: (ArrayList) -> Unit) { + val items = ArrayList() + val OTGTreeUri = baseConfig.OTGTreeUri + var rootUri = try { + DocumentFile.fromTreeUri(applicationContext, Uri.parse(OTGTreeUri)) + } catch (e: Exception) { + showErrorToast(e) + baseConfig.OTGPath = "" + baseConfig.OTGTreeUri = "" + baseConfig.OTGPartition = "" + null + } + + if (rootUri == null) { + callback(items) + return + } + + val parts = path.split("/").dropLastWhile { it.isEmpty() } + for (part in parts) { + if (path == otgPath) { + break + } + + if (part == "otg:" || part == "") { + continue + } + + val file = rootUri!!.findFile(part) + if (file != null) { + rootUri = file + } + } + + val files = rootUri!!.listFiles().filter { it.exists() } + + val basePath = "${baseConfig.OTGTreeUri}/document/${baseConfig.OTGPartition}%3A" + for (file in files) { + val name = file.name ?: continue + if (!shouldShowHidden && name.startsWith(".")) { + continue + } + + val isDirectory = file.isDirectory + val filePath = file.uri.toString().substring(basePath.length) + val decodedPath = otgPath + "/" + URLDecoder.decode(filePath, "UTF-8") + val fileSize = when { + getProperFileSize -> file.getItemSize(shouldShowHidden) + isDirectory -> 0L + else -> file.length() + } + + val childrenCount = if (isDirectory) { + file.listFiles().size + } else { + 0 + } + + val lastModified = file.lastModified() + val fileDirItem = FileDirItem(decodedPath, name, isDirectory, childrenCount, fileSize, lastModified) + items.add(fileDirItem) + } + + callback(items) +} + +@RequiresApi(Build.VERSION_CODES.O) +fun Context.getAndroidSAFFileItems(path: String, shouldShowHidden: Boolean, getProperFileSize: Boolean = true, callback: (ArrayList) -> Unit) { + val items = ArrayList() + val rootDocId = getStorageRootIdForAndroidDir(path) + val treeUri = getAndroidTreeUri(path).toUri() + val documentId = createAndroidSAFDocumentId(path) + val childrenUri = try { + DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, documentId) + } catch (e: Exception) { + showErrorToast(e) + storeAndroidTreeUri(path, "") + null + } + + if (childrenUri == null) { + callback(items) + return + } + + val projection = arrayOf(Document.COLUMN_DOCUMENT_ID, Document.COLUMN_DISPLAY_NAME, Document.COLUMN_MIME_TYPE, Document.COLUMN_LAST_MODIFIED) + try { + val rawCursor = contentResolver.query(childrenUri, projection, null, null)!! + val cursor = ExternalStorageProviderHack.transformQueryResult(rootDocId, childrenUri, rawCursor) + cursor.use { + if (cursor.moveToFirst()) { + do { + val docId = cursor.getStringValue(Document.COLUMN_DOCUMENT_ID) + val name = cursor.getStringValue(Document.COLUMN_DISPLAY_NAME) + val mimeType = cursor.getStringValue(Document.COLUMN_MIME_TYPE) + val lastModified = cursor.getLongValue(Document.COLUMN_LAST_MODIFIED) + val isDirectory = mimeType == Document.MIME_TYPE_DIR + val filePath = docId.substring("${getStorageRootIdForAndroidDir(path)}:".length) + if (!shouldShowHidden && name.startsWith(".")) { + continue + } + + val decodedPath = path.getBasePath(this) + "/" + URLDecoder.decode(filePath, "UTF-8") + val fileSize = when { + getProperFileSize -> getFileSize(treeUri, docId) + isDirectory -> 0L + else -> getFileSize(treeUri, docId) + } + + val childrenCount = if (isDirectory) { + getDirectChildrenCount(rootDocId, treeUri, docId, shouldShowHidden) + } else { + 0 + } + + val fileDirItem = FileDirItem(decodedPath, name, isDirectory, childrenCount, fileSize, lastModified) + items.add(fileDirItem) + } while (cursor.moveToNext()) + } + } + } catch (e: Exception) { + showErrorToast(e) + } + callback(items) +} + +fun Context.getDirectChildrenCount(rootDocId: String, treeUri: Uri, documentId: String, shouldShowHidden: Boolean): Int { + return try { + val projection = arrayOf(Document.COLUMN_DOCUMENT_ID) + val childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, documentId) + val rawCursor = contentResolver.query(childrenUri, projection, null, null, null)!! + val cursor = ExternalStorageProviderHack.transformQueryResult(rootDocId, childrenUri, rawCursor) + if (shouldShowHidden) { + cursor.count + } else { + var count = 0 + cursor.use { + while (cursor.moveToNext()) { + val docId = cursor.getStringValue(Document.COLUMN_DOCUMENT_ID) + if (!docId.getFilenameFromPath().startsWith('.') || shouldShowHidden) { + count++ + } + } + } + count + } + } catch (e: Exception) { + 0 + } +} + +fun Context.getProperChildrenCount(rootDocId: String, treeUri: Uri, documentId: String, shouldShowHidden: Boolean): Int { + val projection = arrayOf(Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE) + val childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, documentId) + val rawCursor = contentResolver.query(childrenUri, projection, null, null, null)!! + val cursor = ExternalStorageProviderHack.transformQueryResult(rootDocId, childrenUri, rawCursor) + return if (cursor.count > 0) { + var count = 0 + cursor.use { + while (cursor.moveToNext()) { + val docId = cursor.getStringValue(Document.COLUMN_DOCUMENT_ID) + val mimeType = cursor.getStringValue(Document.COLUMN_MIME_TYPE) + if (mimeType == Document.MIME_TYPE_DIR) { + count++ + count += getProperChildrenCount(rootDocId, treeUri, docId, shouldShowHidden) + } else if (!docId.getFilenameFromPath().startsWith('.') || shouldShowHidden) { + count++ + } + } + } + count + } else { + 1 + } +} + +fun Context.getFileSize(treeUri: Uri, documentId: String): Long { + val projection = arrayOf(Document.COLUMN_SIZE) + val documentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + return contentResolver.query(documentUri, projection, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + cursor.getLongValue(Document.COLUMN_SIZE) + } else { + 0L + } + } ?: 0L +} + +fun Context.createAndroidSAFDocumentId(path: String): String { + val basePath = path.getBasePath(this) + val relativePath = path.substring(basePath.length).trim('/') + val storageId = getStorageRootIdForAndroidDir(path) + return "$storageId:$relativePath" +} + + +fun Context.getAndroidSAFUri(path: String): Uri { + val treeUri = getAndroidTreeUri(path).toUri() + val documentId = createAndroidSAFDocumentId(path) + return DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) +} + +fun Context.getAndroidSAFDocument(path: String): DocumentFile? { + val basePath = path.getBasePath(this) + val androidPath = File(basePath, "Android").path + var relativePath = path.substring(androidPath.length) + if (relativePath.startsWith(File.separator)) { + relativePath = relativePath.substring(1) + } + + return try { + val treeUri = getAndroidTreeUri(path).toUri() + var document = DocumentFile.fromTreeUri(applicationContext, treeUri) + val parts = relativePath.split("/").filter { it.isNotEmpty() } + for (part in parts) { + document = document?.findFile(part) + } + document + } catch (ignored: Exception) { + null + } +} + +fun Context.getSomeAndroidSAFDocument(path: String): DocumentFile? = getFastAndroidSAFDocument(path) ?: getAndroidSAFDocument(path) + +fun Context.getFastAndroidSAFDocument(path: String): DocumentFile? { + val treeUri = getAndroidTreeUri(path) + if (treeUri.isEmpty()) { + return null + } + + val uri = getAndroidSAFUri(path) + return DocumentFile.fromSingleUri(this, uri) +} + +fun Context.getAndroidSAFChildrenUri(path: String): Uri { + val treeUri = getAndroidTreeUri(path).toUri() + val documentId = createAndroidSAFDocumentId(path) + return DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, documentId) +} + +fun Context.createAndroidSAFDirectory(path: String): Boolean { + return try { + val treeUri = getAndroidTreeUri(path).toUri() + val parentPath = path.getParentPath() + if (!getDoesFilePathExist(parentPath)) { + createAndroidSAFDirectory(parentPath) + } + val documentId = createAndroidSAFDocumentId(parentPath) + val parentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + DocumentsContract.createDocument(contentResolver, parentUri, Document.MIME_TYPE_DIR, path.getFilenameFromPath()) != null + } catch (e: IllegalStateException) { + showErrorToast(e) + false + } +} + +fun Context.createAndroidSAFFile(path: String): Boolean { + return try { + val treeUri = getAndroidTreeUri(path).toUri() + val parentPath = path.getParentPath() + if (!getDoesFilePathExist(parentPath)) { + createAndroidSAFDirectory(parentPath) + } + + val documentId = createAndroidSAFDocumentId(path.getParentPath()) + val parentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + DocumentsContract.createDocument(contentResolver, parentUri, path.getMimeType(), path.getFilenameFromPath()) != null + } catch (e: IllegalStateException) { + showErrorToast(e) + false + } +} + +fun Context.renameAndroidSAFDocument(oldPath: String, newPath: String): Boolean { + return try { + val treeUri = getAndroidTreeUri(oldPath).toUri() + val documentId = createAndroidSAFDocumentId(oldPath) + val parentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + DocumentsContract.renameDocument(contentResolver, parentUri, newPath.getFilenameFromPath()) != null + } catch (e: IllegalStateException) { + showErrorToast(e) + false + } +} + +fun Context.getAndroidSAFFileSize(path: String): Long { + val treeUri = getAndroidTreeUri(path).toUri() + val documentId = createAndroidSAFDocumentId(path) + return getFileSize(treeUri, documentId) +} + +fun Context.getAndroidSAFFileCount(path: String, countHidden: Boolean): Int { + val treeUri = getAndroidTreeUri(path).toUri() + if (treeUri == Uri.EMPTY) { + return 0 + } + + val documentId = createAndroidSAFDocumentId(path) + val rootDocId = getStorageRootIdForAndroidDir(path) + return getProperChildrenCount(rootDocId, treeUri, documentId, countHidden) +} + +fun Context.getAndroidSAFDirectChildrenCount(path: String, countHidden: Boolean): Int { + val treeUri = getAndroidTreeUri(path).toUri() + if (treeUri == Uri.EMPTY) { + return 0 + } + + val documentId = createAndroidSAFDocumentId(path) + val rootDocId = getStorageRootIdForAndroidDir(path) + return getDirectChildrenCount(rootDocId, treeUri, documentId, countHidden) +} + +fun Context.getAndroidSAFLastModified(path: String): Long { + val treeUri = getAndroidTreeUri(path).toUri() + if (treeUri == Uri.EMPTY) { + return 0L + } + + val documentId = createAndroidSAFDocumentId(path) + val projection = arrayOf(Document.COLUMN_LAST_MODIFIED) + val documentUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + return contentResolver.query(documentUri, projection, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + cursor.getLongValue(Document.COLUMN_LAST_MODIFIED) + } else { + 0L + } + } ?: 0L +} + +fun Context.deleteAndroidSAFDirectory(path: String, allowDeleteFolder: Boolean = false, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + val treeUri = getAndroidTreeUri(path).toUri() + val documentId = createAndroidSAFDocumentId(path) + try { + val uri = DocumentsContract.buildDocumentUriUsingTree(treeUri, documentId) + val document = DocumentFile.fromSingleUri(this, uri) + val fileDeleted = (document!!.isFile || allowDeleteFolder) && DocumentsContract.deleteDocument(applicationContext.contentResolver, document.uri) + callback?.invoke(fileDeleted) + } catch (e: Exception) { + showErrorToast(e) + callback?.invoke(false) + storeAndroidTreeUri(path, "") + } +} + +fun Context.trySAFFileDelete(fileDirItem: FileDirItem, allowDeleteFolder: Boolean = false, callback: ((wasSuccess: Boolean) -> Unit)? = null) { + var fileDeleted = tryFastDocumentDelete(fileDirItem.path, allowDeleteFolder) + if (!fileDeleted) { + val document = getDocumentFile(fileDirItem.path) + if (document != null && (fileDirItem.isDirectory == document.isDirectory)) { + try { + fileDeleted = (document.isFile || allowDeleteFolder) && DocumentsContract.deleteDocument(applicationContext.contentResolver, document.uri) + } catch (ignored: Exception) { + baseConfig.sdTreeUri = "" + baseConfig.sdCardPath = "" + } + } + } + + if (fileDeleted) { + deleteFromMediaStore(fileDirItem.path) + callback?.invoke(true) + } +} + +fun Context.getFileInputStreamSync(path: String): InputStream? { + return when { + isRestrictedSAFOnlyRoot(path) -> { + val uri = getAndroidSAFUri(path) + applicationContext.contentResolver.openInputStream(uri) + } + isAccessibleWithSAFSdk30(path) -> { + try { + FileInputStream(File(path)) + } catch (e: Exception) { + val uri = createDocumentUriUsingFirstParentTreeUri(path) + applicationContext.contentResolver.openInputStream(uri) + } + } + isPathOnOTG(path) -> { + val fileDocument = getSomeDocumentFile(path) + applicationContext.contentResolver.openInputStream(fileDocument?.uri!!) + } + else -> FileInputStream(File(path)) + } +} + +fun Context.updateOTGPathFromPartition() { + val otgPath = "/storage/${baseConfig.OTGPartition}" + baseConfig.OTGPath = if (getOTGFastDocumentFile(otgPath, otgPath)?.exists() == true) { + "/storage/${baseConfig.OTGPartition}" + } else { + "/mnt/media_rw/${baseConfig.OTGPartition}" + } +} + +fun Context.getDoesFilePathExist(path: String, otgPathToUse: String? = null): Boolean { + val otgPath = otgPathToUse ?: baseConfig.OTGPath + return when { + isRestrictedSAFOnlyRoot(path) -> getFastAndroidSAFDocument(path)?.exists() ?: false + otgPath.isNotEmpty() && path.startsWith(otgPath) -> getOTGFastDocumentFile(path)?.exists() ?: false + else -> File(path).exists() + } +} + +fun Context.getIsPathDirectory(path: String): Boolean { + return when { + isRestrictedSAFOnlyRoot(path) -> getFastAndroidSAFDocument(path)?.isDirectory ?: false + isPathOnOTG(path) -> getOTGFastDocumentFile(path)?.isDirectory ?: false + else -> File(path).isDirectory + } +} + +fun Context.getFolderLastModifieds(folder: String): HashMap { + val lastModifieds = HashMap() + val projection = arrayOf( + Images.Media.DISPLAY_NAME, + Images.Media.DATE_MODIFIED + ) + + val uri = Files.getContentUri("external") + val selection = "${Images.Media.DATA} LIKE ? AND ${Images.Media.DATA} NOT LIKE ? AND ${Images.Media.MIME_TYPE} IS NOT NULL" // avoid selecting folders + val selectionArgs = arrayOf("$folder/%", "$folder/%/%") + + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + do { + try { + val lastModified = cursor.getLongValue(Images.Media.DATE_MODIFIED) * 1000 + if (lastModified != 0L) { + val name = cursor.getStringValue(Images.Media.DISPLAY_NAME) + lastModifieds["$folder/$name"] = lastModified + } + } catch (e: Exception) { + } + } while (cursor.moveToNext()) + } + } + } catch (e: Exception) { + } + + return lastModifieds +} + +// avoid these being set as SD card paths +private val physicalPaths = arrayListOf( + "/storage/sdcard1", // Motorola Xoom + "/storage/extsdcard", // Samsung SGS3 + "/storage/sdcard0/external_sdcard", // User request + "/mnt/extsdcard", "/mnt/sdcard/external_sd", // Samsung galaxy family + "/mnt/external_sd", "/mnt/media_rw/sdcard1", // 4.4.2 on CyanogenMod S3 + "/removable/microsd", // Asus transformer prime + "/mnt/emmc", "/storage/external_SD", // LG + "/storage/ext_sd", // HTC One Max + "/storage/removable/sdcard1", // Sony Xperia Z1 + "/data/sdext", "/data/sdext2", "/data/sdext3", "/data/sdext4", "/sdcard1", // Sony Xperia Z + "/sdcard2", // HTC One M8s + "/storage/usbdisk0", + "/storage/usbdisk1", + "/storage/usbdisk2" +) + +// Convert paths like /storage/emulated/0/Pictures/Screenshots/first.jpg to content://media/external/images/media/131799 +// so that we can refer to the file in the MediaStore. +// If we found no mediastore uri for a given file, do not return its path either to avoid some mismatching +fun Context.getUrisPathsFromFileDirItems(fileDirItems: List): Pair, ArrayList> { + val fileUris = ArrayList() + val successfulFilePaths = ArrayList() + val allIds = getMediaStoreIds(this) + val filePaths = fileDirItems.map { it.path } + filePaths.forEach { path -> + for ((filePath, mediaStoreId) in allIds) { + if (filePath.lowercase() == path.lowercase()) { + val baseUri = getFileUri(filePath) + val uri = ContentUris.withAppendedId(baseUri, mediaStoreId) + fileUris.add(uri) + successfulFilePaths.add(path) + } + } + } + + return Pair(successfulFilePaths, fileUris) +} + +fun getMediaStoreIds(context: Context): HashMap { + val ids = HashMap() + val projection = arrayOf( + Images.Media.DATA, + Images.Media._ID + ) + + val uri = Files.getContentUri("external") + + try { + context.queryCursor(uri, projection) { cursor -> + try { + val id = cursor.getLongValue(Images.Media._ID) + if (id != 0L) { + val path = cursor.getStringValue(Images.Media.DATA) + ids[path] = id + } + } catch (e: Exception) { + } + } + } catch (e: Exception) { + } + + return ids +} + +fun Context.getFileUrisFromFileDirItems(fileDirItems: List): List { + val fileUris = getUrisPathsFromFileDirItems(fileDirItems).second + if (fileUris.isEmpty()) { + fileDirItems.map { fileDirItem -> + fileUris.add(fileDirItem.assembleContentUri()) + } + } + + return fileUris +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-styling.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-styling.kt new file mode 100644 index 000000000..2478fcb05 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context-styling.kt @@ -0,0 +1,179 @@ +package com.simplemobiletools.commons.extensions + +import android.annotation.SuppressLint +import android.content.ComponentName +import android.content.Context +import android.content.pm.PackageManager +import android.content.res.Configuration +import android.graphics.Color +import android.view.ViewGroup +import androidx.loader.content.CursorLoader +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.SharedTheme +import com.simplemobiletools.commons.views.* + +// handle system default theme (Material You) specially as the color is taken from the system, not hardcoded by us +fun Context.getProperTextColor() = if (baseConfig.isUsingSystemTheme) { + resources.getColor(R.color.you_neutral_text_color, theme) +} else { + baseConfig.textColor +} + +fun Context.getProperBackgroundColor() = if (baseConfig.isUsingSystemTheme) { + resources.getColor(R.color.you_background_color, theme) +} else { + baseConfig.backgroundColor +} + +fun Context.getProperPrimaryColor() = when { + baseConfig.isUsingSystemTheme -> resources.getColor(R.color.you_primary_color, theme) + isWhiteTheme() || isBlackAndWhiteTheme() -> baseConfig.accentColor + else -> baseConfig.primaryColor +} + +fun Context.getProperStatusBarColor() = when { + baseConfig.isUsingSystemTheme -> resources.getColor(R.color.you_status_bar_color, theme) + else -> getProperBackgroundColor() +} + +// get the color of the statusbar with material activity, if the layout is scrolled down a bit +fun Context.getColoredMaterialStatusBarColor(): Int { + return if (baseConfig.isUsingSystemTheme) { + resources.getColor(R.color.you_status_bar_color, theme) + } else { + getProperPrimaryColor() + } +} + +fun Context.updateTextColors(viewGroup: ViewGroup) { + val textColor = when { + baseConfig.isUsingSystemTheme -> getProperTextColor() + else -> baseConfig.textColor + } + + val backgroundColor = baseConfig.backgroundColor + val accentColor = when { + isWhiteTheme() || isBlackAndWhiteTheme() -> baseConfig.accentColor + else -> getProperPrimaryColor() + } + + val cnt = viewGroup.childCount + (0 until cnt).map { viewGroup.getChildAt(it) }.forEach { + when (it) { + is MyTextView -> it.setColors(textColor, accentColor, backgroundColor) + is MyAppCompatSpinner -> it.setColors(textColor, accentColor, backgroundColor) + is MyCompatRadioButton -> it.setColors(textColor, accentColor, backgroundColor) + is MyAppCompatCheckbox -> it.setColors(textColor, accentColor, backgroundColor) + is MyEditText -> it.setColors(textColor, accentColor, backgroundColor) + is MyAutoCompleteTextView -> it.setColors(textColor, accentColor, backgroundColor) + is MyFloatingActionButton -> it.setColors(textColor, accentColor, backgroundColor) + is MySeekBar -> it.setColors(textColor, accentColor, backgroundColor) + is MyButton -> it.setColors(textColor, accentColor, backgroundColor) + is MyTextInputLayout -> it.setColors(textColor, accentColor, backgroundColor) + is ViewGroup -> updateTextColors(it) + } + } +} + +fun Context.isBlackAndWhiteTheme() = baseConfig.textColor == Color.WHITE && baseConfig.primaryColor == Color.BLACK && baseConfig.backgroundColor == Color.BLACK + +fun Context.isWhiteTheme() = baseConfig.textColor == DARK_GREY && baseConfig.primaryColor == Color.WHITE && baseConfig.backgroundColor == Color.WHITE + +fun Context.isUsingSystemDarkTheme() = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_YES != 0 + +fun Context.getTimePickerDialogTheme() = when { + baseConfig.isUsingSystemTheme -> if (isUsingSystemDarkTheme()) { + R.style.MyTimePickerMaterialTheme_Dark + } else { + R.style.MyDateTimePickerMaterialTheme + } + baseConfig.backgroundColor.getContrastColor() == Color.WHITE -> R.style.MyDialogTheme_Dark + else -> R.style.MyDialogTheme +} + +fun Context.getDatePickerDialogTheme() = when { + baseConfig.isUsingSystemTheme -> R.style.MyDateTimePickerMaterialTheme + baseConfig.backgroundColor.getContrastColor() == Color.WHITE -> R.style.MyDialogTheme_Dark + else -> R.style.MyDialogTheme +} + +fun Context.getPopupMenuTheme(): Int { + return if (isSPlus() && baseConfig.isUsingSystemTheme) { + R.style.AppTheme_YouPopupMenuStyle + } else if (isWhiteTheme()) { + R.style.AppTheme_PopupMenuLightStyle + } else { + R.style.AppTheme_PopupMenuDarkStyle + } +} + +fun Context.getSharedTheme(callback: (sharedTheme: SharedTheme?) -> Unit) { + if (!isThankYouInstalled()) { + callback(null) + } else { + val cursorLoader = getMyContentProviderCursorLoader() + ensureBackgroundThread { + callback(getSharedThemeSync(cursorLoader)) + } + } +} + +fun Context.getSharedThemeSync(cursorLoader: CursorLoader): SharedTheme? { + val cursor = cursorLoader.loadInBackground() + cursor?.use { + if (cursor.moveToFirst()) { + try { + val textColor = cursor.getIntValue(MyContentProvider.COL_TEXT_COLOR) + val backgroundColor = cursor.getIntValue(MyContentProvider.COL_BACKGROUND_COLOR) + val primaryColor = cursor.getIntValue(MyContentProvider.COL_PRIMARY_COLOR) + val accentColor = cursor.getIntValue(MyContentProvider.COL_ACCENT_COLOR) + val appIconColor = cursor.getIntValue(MyContentProvider.COL_APP_ICON_COLOR) + val lastUpdatedTS = cursor.getIntValue(MyContentProvider.COL_LAST_UPDATED_TS) + return SharedTheme(textColor, backgroundColor, primaryColor, appIconColor, lastUpdatedTS, accentColor) + } catch (e: Exception) { + } + } + } + return null +} + +fun Context.checkAppIconColor() { + val appId = baseConfig.appId + if (appId.isNotEmpty() && baseConfig.lastIconColor != baseConfig.appIconColor) { + getAppIconColors().forEachIndexed { index, color -> + toggleAppIconColor(appId, index, color, false) + } + + getAppIconColors().forEachIndexed { index, color -> + if (baseConfig.appIconColor == color) { + toggleAppIconColor(appId, index, color, true) + } + } + } +} + +fun Context.toggleAppIconColor(appId: String, colorIndex: Int, color: Int, enable: Boolean) { + val className = "${appId.removeSuffix(".debug")}.activities.SplashActivity${appIconColorStrings[colorIndex]}" + val state = if (enable) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED + try { + packageManager.setComponentEnabledSetting(ComponentName(appId, className), state, PackageManager.DONT_KILL_APP) + if (enable) { + baseConfig.lastIconColor = color + } + } catch (e: Exception) { + } +} + +fun Context.getAppIconColors() = resources.getIntArray(R.array.md_app_icon_colors).toCollection(ArrayList()) + +@SuppressLint("NewApi") +fun Context.getBottomNavigationBackgroundColor(): Int { + val baseColor = baseConfig.backgroundColor + val bottomColor = when { + baseConfig.isUsingSystemTheme -> resources.getColor(R.color.you_status_bar_color, theme) + baseColor == Color.WHITE -> resources.getColor(R.color.bottom_tabs_light_background) + else -> baseConfig.backgroundColor.lightenColor(4) + } + return bottomColor +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt new file mode 100644 index 000000000..dc82cc1c1 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Context.kt @@ -0,0 +1,1090 @@ +package com.simplemobiletools.commons.extensions + +import android.Manifest +import android.annotation.TargetApi +import android.app.Activity +import android.app.NotificationManager +import android.app.role.RoleManager +import android.content.* +import android.content.pm.PackageManager +import android.content.pm.ShortcutManager +import android.content.res.Configuration +import android.database.Cursor +import android.graphics.BitmapFactory +import android.graphics.Point +import android.media.MediaMetadataRetriever +import android.media.RingtoneManager +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.os.Handler +import android.os.Looper +import android.provider.BaseColumns +import android.provider.BlockedNumberContract.BlockedNumbers +import android.provider.ContactsContract.CommonDataKinds.BaseTypes +import android.provider.ContactsContract.CommonDataKinds.Phone +import android.provider.DocumentsContract +import android.provider.MediaStore.* +import android.provider.OpenableColumns +import android.provider.Settings +import android.telecom.TelecomManager +import android.telephony.PhoneNumberUtils +import android.view.View +import android.view.WindowManager +import android.widget.ImageView +import android.widget.TextView +import android.widget.Toast +import androidx.annotation.RequiresApi +import androidx.biometric.BiometricManager +import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider +import androidx.core.content.res.ResourcesCompat +import androidx.core.os.bundleOf +import androidx.exifinterface.media.ExifInterface +import androidx.loader.content.CursorLoader +import com.github.ajalt.reprint.core.Reprint +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.AlarmSound +import com.simplemobiletools.commons.models.BlockedNumber +import java.io.File +import java.text.SimpleDateFormat +import java.util.* + +fun Context.getSharedPrefs() = getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE) + +val Context.isRTLLayout: Boolean get() = resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL + +val Context.areSystemAnimationsEnabled: Boolean get() = Settings.Global.getFloat(contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 0f) > 0f + +fun Context.toast(id: Int, length: Int = Toast.LENGTH_SHORT) { + toast(getString(id), length) +} + +fun Context.toast(msg: String, length: Int = Toast.LENGTH_SHORT) { + try { + if (isOnMainThread()) { + doToast(this, msg, length) + } else { + Handler(Looper.getMainLooper()).post { + doToast(this, msg, length) + } + } + } catch (e: Exception) { + } +} + +private fun doToast(context: Context, message: String, length: Int) { + if (context is Activity) { + if (!context.isFinishing && !context.isDestroyed) { + Toast.makeText(context, message, length).show() + } + } else { + Toast.makeText(context, message, length).show() + } +} + +fun Context.showErrorToast(msg: String, length: Int = Toast.LENGTH_LONG) { + toast(String.format(getString(R.string.error), msg), length) +} + +fun Context.showErrorToast(exception: Exception, length: Int = Toast.LENGTH_LONG) { + showErrorToast(exception.toString(), length) +} + +val Context.baseConfig: BaseConfig get() = BaseConfig.newInstance(this) +val Context.sdCardPath: String get() = baseConfig.sdCardPath +val Context.internalStoragePath: String get() = baseConfig.internalStoragePath +val Context.otgPath: String get() = baseConfig.OTGPath + +fun Context.isFingerPrintSensorAvailable() = Reprint.isHardwarePresent() + +fun Context.isBiometricIdAvailable(): Boolean = when (BiometricManager.from(this).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)) { + BiometricManager.BIOMETRIC_SUCCESS, BiometricManager.BIOMETRIC_STATUS_UNKNOWN -> true + else -> false +} + +fun Context.getLatestMediaId(uri: Uri = Files.getContentUri("external")): Long { + val projection = arrayOf( + BaseColumns._ID + ) + try { + val cursor = queryCursorDesc(uri, projection, BaseColumns._ID, 1) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getLongValue(BaseColumns._ID) + } + } + } catch (ignored: Exception) { + } + return 0 +} + +private fun Context.queryCursorDesc( + uri: Uri, + projection: Array, + sortColumn: String, + limit: Int, +): Cursor? { + return if (isRPlus()) { + val queryArgs = bundleOf( + ContentResolver.QUERY_ARG_LIMIT to limit, + ContentResolver.QUERY_ARG_SORT_DIRECTION to ContentResolver.QUERY_SORT_DIRECTION_DESCENDING, + ContentResolver.QUERY_ARG_SORT_COLUMNS to arrayOf(sortColumn), + ) + contentResolver.query(uri, projection, queryArgs, null) + } else { + val sortOrder = "$sortColumn DESC LIMIT $limit" + contentResolver.query(uri, projection, null, null, sortOrder) + } +} + +fun Context.getLatestMediaByDateId(uri: Uri = Files.getContentUri("external")): Long { + val projection = arrayOf( + BaseColumns._ID + ) + try { + val cursor = queryCursorDesc(uri, projection, Images.ImageColumns.DATE_TAKEN, 1) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getLongValue(BaseColumns._ID) + } + } + } catch (ignored: Exception) { + } + return 0 +} + +// some helper functions were taken from https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java +fun Context.getRealPathFromURI(uri: Uri): String? { + if (uri.scheme == "file") { + return uri.path + } + + if (isDownloadsDocument(uri)) { + val id = DocumentsContract.getDocumentId(uri) + if (id.areDigitsOnly()) { + val newUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), id.toLong()) + val path = getDataColumn(newUri) + if (path != null) { + return path + } + } + } else if (isExternalStorageDocument(uri)) { + val documentId = DocumentsContract.getDocumentId(uri) + val parts = documentId.split(":") + if (parts[0].equals("primary", true)) { + return "${Environment.getExternalStorageDirectory().absolutePath}/${parts[1]}" + } + } else if (isMediaDocument(uri)) { + val documentId = DocumentsContract.getDocumentId(uri) + val split = documentId.split(":").dropLastWhile { it.isEmpty() }.toTypedArray() + val type = split[0] + + val contentUri = when (type) { + "video" -> Video.Media.EXTERNAL_CONTENT_URI + "audio" -> Audio.Media.EXTERNAL_CONTENT_URI + else -> Images.Media.EXTERNAL_CONTENT_URI + } + + val selection = "_id=?" + val selectionArgs = arrayOf(split[1]) + val path = getDataColumn(contentUri, selection, selectionArgs) + if (path != null) { + return path + } + } + + return getDataColumn(uri) +} + +fun Context.getDataColumn(uri: Uri, selection: String? = null, selectionArgs: Array? = null): String? { + try { + val projection = arrayOf(Files.FileColumns.DATA) + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + val data = cursor.getStringValue(Files.FileColumns.DATA) + if (data != "null") { + return data + } + } + } + } catch (e: Exception) { + } + return null +} + +private fun isMediaDocument(uri: Uri) = uri.authority == "com.android.providers.media.documents" + +private fun isDownloadsDocument(uri: Uri) = uri.authority == "com.android.providers.downloads.documents" + +private fun isExternalStorageDocument(uri: Uri) = uri.authority == "com.android.externalstorage.documents" + +fun Context.hasPermission(permId: Int) = ContextCompat.checkSelfPermission(this, getPermissionString(permId)) == PackageManager.PERMISSION_GRANTED + +fun Context.getPermissionString(id: Int) = when (id) { + PERMISSION_READ_STORAGE -> Manifest.permission.READ_EXTERNAL_STORAGE + PERMISSION_WRITE_STORAGE -> Manifest.permission.WRITE_EXTERNAL_STORAGE + PERMISSION_CAMERA -> Manifest.permission.CAMERA + PERMISSION_RECORD_AUDIO -> Manifest.permission.RECORD_AUDIO + PERMISSION_READ_CONTACTS -> Manifest.permission.READ_CONTACTS + PERMISSION_WRITE_CONTACTS -> Manifest.permission.WRITE_CONTACTS + PERMISSION_READ_CALENDAR -> Manifest.permission.READ_CALENDAR + PERMISSION_WRITE_CALENDAR -> Manifest.permission.WRITE_CALENDAR + PERMISSION_CALL_PHONE -> Manifest.permission.CALL_PHONE + PERMISSION_READ_CALL_LOG -> Manifest.permission.READ_CALL_LOG + PERMISSION_WRITE_CALL_LOG -> Manifest.permission.WRITE_CALL_LOG + PERMISSION_GET_ACCOUNTS -> Manifest.permission.GET_ACCOUNTS + PERMISSION_READ_SMS -> Manifest.permission.READ_SMS + PERMISSION_SEND_SMS -> Manifest.permission.SEND_SMS + PERMISSION_READ_PHONE_STATE -> Manifest.permission.READ_PHONE_STATE + PERMISSION_MEDIA_LOCATION -> if (isQPlus()) Manifest.permission.ACCESS_MEDIA_LOCATION else "" + PERMISSION_POST_NOTIFICATIONS -> Manifest.permission.POST_NOTIFICATIONS + PERMISSION_READ_MEDIA_IMAGES -> Manifest.permission.READ_MEDIA_IMAGES + PERMISSION_READ_MEDIA_VIDEO -> Manifest.permission.READ_MEDIA_VIDEO + PERMISSION_READ_MEDIA_AUDIO -> Manifest.permission.READ_MEDIA_AUDIO + else -> "" +} + +fun Context.launchActivityIntent(intent: Intent) { + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + toast(R.string.no_app_found) + } catch (e: Exception) { + showErrorToast(e) + } +} + +fun Context.getFilePublicUri(file: File, applicationId: String): Uri { + // for images/videos/gifs try getting a media content uri first, like content://media/external/images/media/438 + // if media content uri is null, get our custom uri like content://com.simplemobiletools.gallery.provider/external_files/emulated/0/DCIM/IMG_20171104_233915.jpg + var uri = if (file.isMediaFile()) { + getMediaContentUri(file.absolutePath) + } else { + getMediaContent(file.absolutePath, Files.getContentUri("external")) + } + + if (uri == null) { + uri = FileProvider.getUriForFile(this, "$applicationId.provider", file) + } + + return uri!! +} + +fun Context.getMediaContentUri(path: String): Uri? { + val uri = when { + path.isImageFast() -> Images.Media.EXTERNAL_CONTENT_URI + path.isVideoFast() -> Video.Media.EXTERNAL_CONTENT_URI + else -> Files.getContentUri("external") + } + + return getMediaContent(path, uri) +} + +fun Context.getMediaContent(path: String, uri: Uri): Uri? { + val projection = arrayOf(Images.Media._ID) + val selection = Images.Media.DATA + "= ?" + val selectionArgs = arrayOf(path) + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + val id = cursor.getIntValue(Images.Media._ID).toString() + return Uri.withAppendedPath(uri, id) + } + } + } catch (e: Exception) { + } + return null +} + +fun Context.queryCursor( + uri: Uri, + projection: Array, + selection: String? = null, + selectionArgs: Array? = null, + sortOrder: String? = null, + showErrors: Boolean = false, + callback: (cursor: Cursor) -> Unit +) { + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder) + cursor?.use { + if (cursor.moveToFirst()) { + do { + callback(cursor) + } while (cursor.moveToNext()) + } + } + } catch (e: Exception) { + if (showErrors) { + showErrorToast(e) + } + } +} + +fun Context.getFilenameFromUri(uri: Uri): String { + return if (uri.scheme == "file") { + File(uri.toString()).name + } else { + getFilenameFromContentUri(uri) ?: uri.lastPathSegment ?: "" + } +} + +fun Context.getMimeTypeFromUri(uri: Uri): String { + var mimetype = uri.path?.getMimeType() ?: "" + if (mimetype.isEmpty()) { + try { + mimetype = contentResolver.getType(uri) ?: "" + } catch (e: IllegalStateException) { + } + } + return mimetype +} + +fun Context.ensurePublicUri(path: String, applicationId: String): Uri? { + return when { + hasProperStoredAndroidTreeUri(path) && isRestrictedSAFOnlyRoot(path) -> { + getAndroidSAFUri(path) + } + hasProperStoredDocumentUriSdk30(path) && isAccessibleWithSAFSdk30(path) -> { + createDocumentUriUsingFirstParentTreeUri(path) + } + isPathOnOTG(path) -> { + getDocumentFile(path)?.uri + } + else -> { + val uri = Uri.parse(path) + if (uri.scheme == "content") { + uri + } else { + val newPath = if (uri.toString().startsWith("/")) uri.toString() else uri.path + val file = File(newPath) + getFilePublicUri(file, applicationId) + } + } + } +} + +fun Context.ensurePublicUri(uri: Uri, applicationId: String): Uri { + return if (uri.scheme == "content") { + uri + } else { + val file = File(uri.path) + getFilePublicUri(file, applicationId) + } +} + +fun Context.getFilenameFromContentUri(uri: Uri): String? { + val projection = arrayOf( + OpenableColumns.DISPLAY_NAME + ) + + try { + val cursor = contentResolver.query(uri, projection, null, null, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getStringValue(OpenableColumns.DISPLAY_NAME) + } + } + } catch (e: Exception) { + } + return null +} + +fun Context.getSizeFromContentUri(uri: Uri): Long { + val projection = arrayOf(OpenableColumns.SIZE) + try { + val cursor = contentResolver.query(uri, projection, null, null, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getLongValue(OpenableColumns.SIZE) + } + } + } catch (e: Exception) { + } + return 0L +} + +fun Context.getMyContentProviderCursorLoader() = CursorLoader(this, MyContentProvider.MY_CONTENT_URI, null, null, null, null) + +fun Context.getMyContactsCursor(favoritesOnly: Boolean, withPhoneNumbersOnly: Boolean) = try { + val getFavoritesOnly = if (favoritesOnly) "1" else "0" + val getWithPhoneNumbersOnly = if (withPhoneNumbersOnly) "1" else "0" + val args = arrayOf(getFavoritesOnly, getWithPhoneNumbersOnly) + CursorLoader(this, MyContactsContentProvider.CONTACTS_CONTENT_URI, null, null, args, null).loadInBackground() +} catch (e: Exception) { + null +} + +fun Context.getCurrentFormattedDateTime(): String { + val simpleDateFormat = SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.getDefault()) + return simpleDateFormat.format(Date(System.currentTimeMillis())) +} + +fun Context.updateSDCardPath() { + ensureBackgroundThread { + val oldPath = baseConfig.sdCardPath + baseConfig.sdCardPath = getSDCardPath() + if (oldPath != baseConfig.sdCardPath) { + baseConfig.sdTreeUri = "" + } + } +} + +fun Context.getUriMimeType(path: String, newUri: Uri): String { + var mimeType = path.getMimeType() + if (mimeType.isEmpty()) { + mimeType = getMimeTypeFromUri(newUri) + } + return mimeType +} + +fun Context.isThankYouInstalled() = isPackageInstalled("com.simplemobiletools.thankyou") + +fun Context.isOrWasThankYouInstalled(): Boolean { + return when { + resources.getBoolean(R.bool.pretend_thank_you_installed) -> true + baseConfig.hadThankYouInstalled -> true + isThankYouInstalled() -> { + baseConfig.hadThankYouInstalled = true + true + } + else -> false + } +} + +fun Context.isAProApp() = packageName.startsWith("com.simplemobiletools.") && packageName.removeSuffix(".debug").endsWith(".pro") + +fun Context.getCustomizeColorsString(): String { + val textId = if (isOrWasThankYouInstalled()) { + R.string.customize_colors + } else { + R.string.customize_colors_locked + } + + return getString(textId) +} + +fun Context.addLockedLabelIfNeeded(stringId: Int): String { + return if (isOrWasThankYouInstalled()) { + getString(stringId) + } else { + "${getString(stringId)} (${getString(R.string.feature_locked)})" + } +} + +fun Context.isPackageInstalled(pkgName: String): Boolean { + return try { + packageManager.getPackageInfo(pkgName, 0) + true + } catch (e: Exception) { + false + } +} + +// format day bits to strings like "Mon, Tue, Wed" +fun Context.getSelectedDaysString(bitMask: Int): String { + val dayBits = arrayListOf(MONDAY_BIT, TUESDAY_BIT, WEDNESDAY_BIT, THURSDAY_BIT, FRIDAY_BIT, SATURDAY_BIT, SUNDAY_BIT) + val weekDays = resources.getStringArray(R.array.week_days_short).toList() as ArrayList + + if (baseConfig.isSundayFirst) { + dayBits.moveLastItemToFront() + weekDays.moveLastItemToFront() + } + + var days = "" + dayBits.forEachIndexed { index, bit -> + if (bitMask and bit != 0) { + days += "${weekDays[index]}, " + } + } + return days.trim().trimEnd(',') +} + +fun Context.formatMinutesToTimeString(totalMinutes: Int) = formatSecondsToTimeString(totalMinutes * 60) + +fun Context.formatSecondsToTimeString(totalSeconds: Int): String { + val days = totalSeconds / DAY_SECONDS + val hours = (totalSeconds % DAY_SECONDS) / HOUR_SECONDS + val minutes = (totalSeconds % HOUR_SECONDS) / MINUTE_SECONDS + val seconds = totalSeconds % MINUTE_SECONDS + val timesString = StringBuilder() + if (days > 0) { + val daysString = String.format(resources.getQuantityString(R.plurals.days, days, days)) + timesString.append("$daysString, ") + } + + if (hours > 0) { + val hoursString = String.format(resources.getQuantityString(R.plurals.hours, hours, hours)) + timesString.append("$hoursString, ") + } + + if (minutes > 0) { + val minutesString = String.format(resources.getQuantityString(R.plurals.minutes, minutes, minutes)) + timesString.append("$minutesString, ") + } + + if (seconds > 0) { + val secondsString = String.format(resources.getQuantityString(R.plurals.seconds, seconds, seconds)) + timesString.append(secondsString) + } + + var result = timesString.toString().trim().trimEnd(',') + if (result.isEmpty()) { + result = String.format(resources.getQuantityString(R.plurals.minutes, 0, 0)) + } + return result +} + +fun Context.getFormattedMinutes(minutes: Int, showBefore: Boolean = true) = getFormattedSeconds(if (minutes == -1) minutes else minutes * 60, showBefore) + +fun Context.getFormattedSeconds(seconds: Int, showBefore: Boolean = true) = when (seconds) { + -1 -> getString(R.string.no_reminder) + 0 -> getString(R.string.at_start) + else -> { + when { + seconds < 0 && seconds > -60 * 60 * 24 -> { + val minutes = -seconds / 60 + getString(R.string.during_day_at).format(minutes / 60, minutes % 60) + } + seconds % YEAR_SECONDS == 0 -> { + val base = if (showBefore) R.plurals.years_before else R.plurals.by_years + resources.getQuantityString(base, seconds / YEAR_SECONDS, seconds / YEAR_SECONDS) + } + seconds % MONTH_SECONDS == 0 -> { + val base = if (showBefore) R.plurals.months_before else R.plurals.by_months + resources.getQuantityString(base, seconds / MONTH_SECONDS, seconds / MONTH_SECONDS) + } + seconds % WEEK_SECONDS == 0 -> { + val base = if (showBefore) R.plurals.weeks_before else R.plurals.by_weeks + resources.getQuantityString(base, seconds / WEEK_SECONDS, seconds / WEEK_SECONDS) + } + seconds % DAY_SECONDS == 0 -> { + val base = if (showBefore) R.plurals.days_before else R.plurals.by_days + resources.getQuantityString(base, seconds / DAY_SECONDS, seconds / DAY_SECONDS) + } + seconds % HOUR_SECONDS == 0 -> { + val base = if (showBefore) R.plurals.hours_before else R.plurals.by_hours + resources.getQuantityString(base, seconds / HOUR_SECONDS, seconds / HOUR_SECONDS) + } + seconds % MINUTE_SECONDS == 0 -> { + val base = if (showBefore) R.plurals.minutes_before else R.plurals.by_minutes + resources.getQuantityString(base, seconds / MINUTE_SECONDS, seconds / MINUTE_SECONDS) + } + else -> { + val base = if (showBefore) R.plurals.seconds_before else R.plurals.by_seconds + resources.getQuantityString(base, seconds, seconds) + } + } + } +} + +fun Context.getDefaultAlarmTitle(type: Int): String { + val alarmString = getString(R.string.alarm) + return try { + RingtoneManager.getRingtone(this, RingtoneManager.getDefaultUri(type))?.getTitle(this) ?: alarmString + } catch (e: Exception) { + alarmString + } +} + +fun Context.getDefaultAlarmSound(type: Int) = AlarmSound(0, getDefaultAlarmTitle(type), RingtoneManager.getDefaultUri(type).toString()) + +fun Context.grantReadUriPermission(uriString: String) { + try { + // ensure custom reminder sounds play well + grantUriPermission("com.android.systemui", Uri.parse(uriString), Intent.FLAG_GRANT_READ_URI_PERMISSION) + } catch (ignored: Exception) { + } +} + +fun Context.storeNewYourAlarmSound(resultData: Intent): AlarmSound { + val uri = resultData.data + var filename = getFilenameFromUri(uri!!) + if (filename.isEmpty()) { + filename = getString(R.string.alarm) + } + + val token = object : TypeToken>() {}.type + val yourAlarmSounds = Gson().fromJson>(baseConfig.yourAlarmSounds, token) + ?: ArrayList() + val newAlarmSoundId = (yourAlarmSounds.maxByOrNull { it.id }?.id ?: YOUR_ALARM_SOUNDS_MIN_ID) + 1 + val newAlarmSound = AlarmSound(newAlarmSoundId, filename, uri.toString()) + if (yourAlarmSounds.firstOrNull { it.uri == uri.toString() } == null) { + yourAlarmSounds.add(newAlarmSound) + } + + baseConfig.yourAlarmSounds = Gson().toJson(yourAlarmSounds) + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION + contentResolver.takePersistableUriPermission(uri, takeFlags) + + return newAlarmSound +} + +@RequiresApi(Build.VERSION_CODES.N) +fun Context.saveImageRotation(path: String, degrees: Int): Boolean { + if (!needsStupidWritePermissions(path)) { + saveExifRotation(ExifInterface(path), degrees) + return true + } else if (isNougatPlus()) { + val documentFile = getSomeDocumentFile(path) + if (documentFile != null) { + val parcelFileDescriptor = contentResolver.openFileDescriptor(documentFile.uri, "rw") + val fileDescriptor = parcelFileDescriptor!!.fileDescriptor + saveExifRotation(ExifInterface(fileDescriptor), degrees) + return true + } + } + return false +} + +fun Context.saveExifRotation(exif: ExifInterface, degrees: Int) { + val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) + val orientationDegrees = (orientation.degreesFromOrientation() + degrees) % 360 + exif.setAttribute(ExifInterface.TAG_ORIENTATION, orientationDegrees.orientationFromDegrees()) + exif.saveAttributes() +} + +fun Context.getLaunchIntent() = packageManager.getLaunchIntentForPackage(baseConfig.appId) + +fun Context.getCanAppBeUpgraded() = proPackages.contains(baseConfig.appId.removeSuffix(".debug").removePrefix("com.simplemobiletools.")) + +fun Context.getProUrl() = "https://play.google.com/store/apps/details?id=${baseConfig.appId.removeSuffix(".debug")}.pro" + +fun Context.getStoreUrl() = "https://play.google.com/store/apps/details?id=${packageName.removeSuffix(".debug")}" + +fun Context.getTimeFormat() = if (baseConfig.use24HourFormat) TIME_FORMAT_24 else TIME_FORMAT_12 + +fun Context.getResolution(path: String): Point? { + return if (path.isImageFast() || path.isImageSlow()) { + getImageResolution(path) + } else if (path.isVideoFast() || path.isVideoSlow()) { + getVideoResolution(path) + } else { + null + } +} + +fun Context.getImageResolution(path: String): Point? { + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + if (isRestrictedSAFOnlyRoot(path)) { + BitmapFactory.decodeStream(contentResolver.openInputStream(getAndroidSAFUri(path)), null, options) + } else { + BitmapFactory.decodeFile(path, options) + } + + val width = options.outWidth + val height = options.outHeight + return if (width > 0 && height > 0) { + Point(options.outWidth, options.outHeight) + } else { + null + } +} + +fun Context.getVideoResolution(path: String): Point? { + var point = try { + val retriever = MediaMetadataRetriever() + if (isRestrictedSAFOnlyRoot(path)) { + retriever.setDataSource(this, getAndroidSAFUri(path)) + } else { + retriever.setDataSource(path) + } + + val width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!.toInt() + val height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!.toInt() + Point(width, height) + } catch (ignored: Exception) { + null + } + + if (point == null && path.startsWith("content://", true)) { + try { + val fd = contentResolver.openFileDescriptor(Uri.parse(path), "r")?.fileDescriptor + val retriever = MediaMetadataRetriever() + retriever.setDataSource(fd) + val width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)!!.toInt() + val height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)!!.toInt() + point = Point(width, height) + } catch (ignored: Exception) { + } + } + + return point +} + +fun Context.getDuration(path: String): Int? { + val projection = arrayOf( + MediaColumns.DURATION + ) + + val uri = getFileUri(path) + val selection = if (path.startsWith("content://")) "${BaseColumns._ID} = ?" else "${MediaColumns.DATA} = ?" + val selectionArgs = if (path.startsWith("content://")) arrayOf(path.substringAfterLast("/")) else arrayOf(path) + + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return Math.round(cursor.getIntValue(MediaColumns.DURATION) / 1000.toDouble()).toInt() + } + } + } catch (ignored: Exception) { + } + + return try { + val retriever = MediaMetadataRetriever() + retriever.setDataSource(path) + Math.round(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)!!.toInt() / 1000f) + } catch (ignored: Exception) { + null + } +} + +fun Context.getTitle(path: String): String? { + val projection = arrayOf( + MediaColumns.TITLE + ) + + val uri = getFileUri(path) + val selection = if (path.startsWith("content://")) "${BaseColumns._ID} = ?" else "${MediaColumns.DATA} = ?" + val selectionArgs = if (path.startsWith("content://")) arrayOf(path.substringAfterLast("/")) else arrayOf(path) + + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getStringValue(MediaColumns.TITLE) + } + } + } catch (ignored: Exception) { + } + + return try { + val retriever = MediaMetadataRetriever() + retriever.setDataSource(path) + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) + } catch (ignored: Exception) { + null + } +} + +fun Context.getArtist(path: String): String? { + val projection = arrayOf( + Audio.Media.ARTIST + ) + + val uri = getFileUri(path) + val selection = if (path.startsWith("content://")) "${BaseColumns._ID} = ?" else "${MediaColumns.DATA} = ?" + val selectionArgs = if (path.startsWith("content://")) arrayOf(path.substringAfterLast("/")) else arrayOf(path) + + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getStringValue(Audio.Media.ARTIST) + } + } + } catch (ignored: Exception) { + } + + return try { + val retriever = MediaMetadataRetriever() + retriever.setDataSource(path) + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST) + } catch (ignored: Exception) { + null + } +} + +fun Context.getAlbum(path: String): String? { + val projection = arrayOf( + Audio.Media.ALBUM + ) + + val uri = getFileUri(path) + val selection = if (path.startsWith("content://")) "${BaseColumns._ID} = ?" else "${MediaColumns.DATA} = ?" + val selectionArgs = if (path.startsWith("content://")) arrayOf(path.substringAfterLast("/")) else arrayOf(path) + + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getStringValue(Audio.Media.ALBUM) + } + } + } catch (ignored: Exception) { + } + + return try { + val retriever = MediaMetadataRetriever() + retriever.setDataSource(path) + retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM) + } catch (ignored: Exception) { + null + } +} + +fun Context.getMediaStoreLastModified(path: String): Long { + val projection = arrayOf( + MediaColumns.DATE_MODIFIED + ) + + val uri = getFileUri(path) + val selection = "${BaseColumns._ID} = ?" + val selectionArgs = arrayOf(path.substringAfterLast("/")) + + try { + val cursor = contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getLongValue(MediaColumns.DATE_MODIFIED) * 1000 + } + } + } catch (ignored: Exception) { + } + return 0 +} + +fun Context.getStringsPackageName() = getString(R.string.package_name) + +fun Context.getFontSizeText() = getString( + when (baseConfig.fontSize) { + FONT_SIZE_SMALL -> R.string.small + FONT_SIZE_MEDIUM -> R.string.medium + FONT_SIZE_LARGE -> R.string.large + else -> R.string.extra_large + } +) + +fun Context.getTextSize() = when (baseConfig.fontSize) { + FONT_SIZE_SMALL -> resources.getDimension(R.dimen.smaller_text_size) + FONT_SIZE_MEDIUM -> resources.getDimension(R.dimen.bigger_text_size) + FONT_SIZE_LARGE -> resources.getDimension(R.dimen.big_text_size) + else -> resources.getDimension(R.dimen.extra_big_text_size) +} + +val Context.telecomManager: TelecomManager get() = getSystemService(Context.TELECOM_SERVICE) as TelecomManager +val Context.windowManager: WindowManager get() = getSystemService(Context.WINDOW_SERVICE) as WindowManager +val Context.notificationManager: NotificationManager get() = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager +val Context.shortcutManager: ShortcutManager get() = getSystemService(ShortcutManager::class.java) as ShortcutManager + +val Context.portrait get() = resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT +val Context.navigationBarOnSide: Boolean get() = usableScreenSize.x < realScreenSize.x && usableScreenSize.x > usableScreenSize.y +val Context.navigationBarOnBottom: Boolean get() = usableScreenSize.y < realScreenSize.y +val Context.navigationBarHeight: Int get() = if (navigationBarOnBottom && navigationBarSize.y != usableScreenSize.y) navigationBarSize.y else 0 +val Context.navigationBarWidth: Int get() = if (navigationBarOnSide) navigationBarSize.x else 0 + +val Context.navigationBarSize: Point + get() = when { + navigationBarOnSide -> Point(newNavigationBarHeight, usableScreenSize.y) + navigationBarOnBottom -> Point(usableScreenSize.x, newNavigationBarHeight) + else -> Point() + } + +val Context.newNavigationBarHeight: Int + get() { + var navigationBarHeight = 0 + val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android") + if (resourceId > 0) { + navigationBarHeight = resources.getDimensionPixelSize(resourceId) + } + return navigationBarHeight + } + +val Context.statusBarHeight: Int + get() { + var statusBarHeight = 0 + val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android") + if (resourceId > 0) { + statusBarHeight = resources.getDimensionPixelSize(resourceId) + } + return statusBarHeight + } + +val Context.actionBarHeight: Int + get() { + val styledAttributes = theme.obtainStyledAttributes(intArrayOf(android.R.attr.actionBarSize)) + val actionBarHeight = styledAttributes.getDimension(0, 0f) + styledAttributes.recycle() + return actionBarHeight.toInt() + } + +val Context.usableScreenSize: Point + get() { + val size = Point() + windowManager.defaultDisplay.getSize(size) + return size + } + +val Context.realScreenSize: Point + get() { + val size = Point() + windowManager.defaultDisplay.getRealSize(size) + return size + } + +fun Context.isUsingGestureNavigation(): Boolean { + return try { + val resourceId = resources.getIdentifier("config_navBarInteractionMode", "integer", "android") + if (resourceId > 0) { + resources.getInteger(resourceId) == 2 + } else { + false + } + } catch (e: Exception) { + false + } +} + +fun Context.getCornerRadius() = resources.getDimension(R.dimen.rounded_corner_radius_small) + +// we need the Default Dialer functionality only in Simple Dialer and in Simple Contacts for now +fun Context.isDefaultDialer(): Boolean { + return if (!packageName.startsWith("com.simplemobiletools.contacts") && !packageName.startsWith("com.simplemobiletools.dialer")) { + true + } else if ((packageName.startsWith("com.simplemobiletools.contacts") || packageName.startsWith("com.simplemobiletools.dialer")) && isQPlus()) { + val roleManager = getSystemService(RoleManager::class.java) + roleManager!!.isRoleAvailable(RoleManager.ROLE_DIALER) && roleManager.isRoleHeld(RoleManager.ROLE_DIALER) + } else { + telecomManager.defaultDialerPackage == packageName + } +} + +@TargetApi(Build.VERSION_CODES.N) +fun Context.getBlockedNumbers(): ArrayList { + val blockedNumbers = ArrayList() + if (!isNougatPlus() || !isDefaultDialer()) { + return blockedNumbers + } + + val uri = BlockedNumbers.CONTENT_URI + val projection = arrayOf( + BlockedNumbers.COLUMN_ID, + BlockedNumbers.COLUMN_ORIGINAL_NUMBER, + BlockedNumbers.COLUMN_E164_NUMBER + ) + + queryCursor(uri, projection) { cursor -> + val id = cursor.getLongValue(BlockedNumbers.COLUMN_ID) + val number = cursor.getStringValue(BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: "" + val normalizedNumber = cursor.getStringValue(BlockedNumbers.COLUMN_E164_NUMBER) ?: number + val comparableNumber = normalizedNumber.trimToComparableNumber() + val blockedNumber = BlockedNumber(id, number, normalizedNumber, comparableNumber) + blockedNumbers.add(blockedNumber) + } + + return blockedNumbers +} + +@TargetApi(Build.VERSION_CODES.N) +fun Context.addBlockedNumber(number: String) { + ContentValues().apply { + put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number) + if (number.isPhoneNumber()) { + put(BlockedNumbers.COLUMN_E164_NUMBER, PhoneNumberUtils.normalizeNumber(number)) + } + try { + contentResolver.insert(BlockedNumbers.CONTENT_URI, this) + } catch (e: Exception) { + showErrorToast(e) + } + } +} + +@TargetApi(Build.VERSION_CODES.N) +fun Context.deleteBlockedNumber(number: String) { + val selection = "${BlockedNumbers.COLUMN_ORIGINAL_NUMBER} = ?" + val selectionArgs = arrayOf(number) + contentResolver.delete(BlockedNumbers.CONTENT_URI, selection, selectionArgs) +} + +fun Context.isNumberBlocked(number: String, blockedNumbers: ArrayList = getBlockedNumbers()): Boolean { + if (!isNougatPlus()) { + return false + } + + val numberToCompare = number.trimToComparableNumber() + return blockedNumbers.any { numberToCompare == it.numberToCompare || numberToCompare == it.number } || isNumberBlockedByPattern(number, blockedNumbers) +} + +fun Context.isNumberBlockedByPattern(number: String, blockedNumbers: ArrayList = getBlockedNumbers()): Boolean { + for (blockedNumber in blockedNumbers) { + val num = blockedNumber.number + if (num.isBlockedNumberPattern()) { + val pattern = num.replace("+", "\\+").replace("*", ".*") + if (number.matches(pattern.toRegex())) { + return true + } + } + } + return false +} + +fun Context.copyToClipboard(text: String) { + val clip = ClipData.newPlainText(getString(R.string.simple_commons), text) + (getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager).setPrimaryClip(clip) + val toastText = String.format(getString(R.string.value_copied_to_clipboard_show), text) + toast(toastText) +} + +fun Context.getPhoneNumberTypeText(type: Int, label: String): String { + return if (type == BaseTypes.TYPE_CUSTOM) { + label + } else { + getString( + when (type) { + Phone.TYPE_MOBILE -> R.string.mobile + Phone.TYPE_HOME -> R.string.home + Phone.TYPE_WORK -> R.string.work + Phone.TYPE_MAIN -> R.string.main_number + Phone.TYPE_FAX_WORK -> R.string.work_fax + Phone.TYPE_FAX_HOME -> R.string.home_fax + Phone.TYPE_PAGER -> R.string.pager + else -> R.string.other + } + ) + } +} + +fun Context.updateBottomTabItemColors(view: View?, isActive: Boolean, drawableId: Int? = null) { + val color = if (isActive) { + getProperPrimaryColor() + } else { + getProperTextColor() + } + + if (drawableId != null) { + val drawable = ResourcesCompat.getDrawable(resources, drawableId, theme) + view?.findViewById(R.id.tab_item_icon)?.setImageDrawable(drawable) + } + + view?.findViewById(R.id.tab_item_icon)?.applyColorFilter(color) + view?.findViewById(R.id.tab_item_label)?.setTextColor(color) +} + +fun Context.sendEmailIntent(recipient: String) { + Intent(Intent.ACTION_SENDTO).apply { + data = Uri.fromParts(KEY_MAILTO, recipient, null) + launchActivityIntent(this) + } +} +fun Context.openNotificationSettings() { + if (isOreoPlus()) { + val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName) + startActivity(intent) + } else { + // For Android versions below Oreo, you can't directly open the app's notification settings. + // You can open the general notification settings instead. + val intent = Intent(Settings.ACTION_SETTINGS) + startActivity(intent) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Cursor.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Cursor.kt new file mode 100644 index 000000000..e6fff35dd --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Cursor.kt @@ -0,0 +1,17 @@ +package com.simplemobiletools.commons.extensions + +import android.database.Cursor + +fun Cursor.getStringValue(key: String) = getString(getColumnIndex(key)) + +fun Cursor.getStringValueOrNull(key: String) = if (isNull(getColumnIndex(key))) null else getString(getColumnIndex(key)) + +fun Cursor.getIntValue(key: String) = getInt(getColumnIndex(key)) + +fun Cursor.getIntValueOrNull(key: String) = if (isNull(getColumnIndex(key))) null else getInt(getColumnIndex(key)) + +fun Cursor.getLongValue(key: String) = getLong(getColumnIndex(key)) + +fun Cursor.getLongValueOrNull(key: String) = if (isNull(getColumnIndex(key))) null else getLong(getColumnIndex(key)) + +fun Cursor.getBlobValue(key: String) = getBlob(getColumnIndex(key)) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/DocumentFile.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/DocumentFile.kt new file mode 100644 index 000000000..e59d4e0c5 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/DocumentFile.kt @@ -0,0 +1,52 @@ +package com.simplemobiletools.commons.extensions + +import androidx.documentfile.provider.DocumentFile + +fun DocumentFile.getItemSize(countHiddenItems: Boolean): Long { + return if (isDirectory) { + getDirectorySize(this, countHiddenItems) + } else { + length() + } +} + +private fun getDirectorySize(dir: DocumentFile, countHiddenItems: Boolean): Long { + var size = 0L + if (dir.exists()) { + val files = dir.listFiles() + for (i in files.indices) { + val file = files[i] + if (file.isDirectory) { + size += getDirectorySize(file, countHiddenItems) + } else if (!file.name!!.startsWith(".") || countHiddenItems) { + size += file.length() + } + } + } + return size +} + +fun DocumentFile.getFileCount(countHiddenItems: Boolean): Int { + return if (isDirectory) { + getDirectoryFileCount(this, countHiddenItems) + } else { + 1 + } +} + +private fun getDirectoryFileCount(dir: DocumentFile, countHiddenItems: Boolean): Int { + var count = 0 + if (dir.exists()) { + val files = dir.listFiles() + for (i in files.indices) { + val file = files[i] + if (file.isDirectory) { + count++ + count += getDirectoryFileCount(file, countHiddenItems) + } else if (!file.name!!.startsWith(".") || countHiddenItems) { + count++ + } + } + } + return count +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Drawable.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Drawable.kt new file mode 100644 index 000000000..5336c9193 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Drawable.kt @@ -0,0 +1,28 @@ +package com.simplemobiletools.commons.extensions + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.PorterDuff +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable + +fun Drawable.applyColorFilter(color: Int) = mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN) + +fun Drawable.convertToBitmap(): Bitmap { + val bitmap = if (intrinsicWidth <= 0 || intrinsicHeight <= 0) { + Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) + } else { + Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888) + } + + if (this is BitmapDrawable) { + if (this.bitmap != null) { + return this.bitmap + } + } + + val canvas = Canvas(bitmap!!) + setBounds(0, 0, canvas.width, canvas.height) + draw(canvas) + return bitmap +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/EditText.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/EditText.kt new file mode 100644 index 000000000..7bc8c16ca --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/EditText.kt @@ -0,0 +1,44 @@ +package com.simplemobiletools.commons.extensions + +import android.text.Editable +import android.text.Spannable +import android.text.SpannableString +import android.text.TextWatcher +import android.text.style.BackgroundColorSpan +import android.widget.EditText +import android.widget.TextView +import androidx.core.graphics.ColorUtils + +val EditText.value: String get() = text.toString().trim() + +fun EditText.onTextChangeListener(onTextChangedAction: (newText: String) -> Unit) = addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) { + onTextChangedAction(s.toString()) + } + + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} +}) + +fun EditText.highlightText(highlightText: String, color: Int) { + val content = text.toString() + var indexOf = content.indexOf(highlightText, 0, true) + val wordToSpan = SpannableString(text) + var offset = 0 + + while (offset < content.length && indexOf != -1) { + indexOf = content.indexOf(highlightText, offset, true) + + if (indexOf == -1) { + break + } else { + val spanBgColor = BackgroundColorSpan(ColorUtils.setAlphaComponent(color, 128)) + val spanFlag = Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + wordToSpan.setSpan(spanBgColor, indexOf, indexOf + highlightText.length, spanFlag) + setText(wordToSpan, TextView.BufferType.SPANNABLE) + } + + offset = indexOf + 1 + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Editable.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Editable.kt new file mode 100644 index 000000000..80f2ae627 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Editable.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.commons.extensions + +import android.text.Editable +import android.text.style.BackgroundColorSpan + +fun Editable.clearBackgroundSpans() { + val spans = getSpans(0, length, Any::class.java) + for (span in spans) { + if (span is BackgroundColorSpan) { + removeSpan(span) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ExifInterface.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ExifInterface.kt new file mode 100644 index 000000000..8dd9fceb5 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ExifInterface.kt @@ -0,0 +1,148 @@ +package com.simplemobiletools.commons.extensions + +import android.annotation.TargetApi +import android.content.Context +import android.os.Build +import androidx.exifinterface.media.ExifInterface +import java.text.SimpleDateFormat +import java.util.* + +fun ExifInterface.copyTo(destination: ExifInterface, copyOrientation: Boolean = true) { + val attributes = arrayListOf( + ExifInterface.TAG_APERTURE_VALUE, + ExifInterface.TAG_DATETIME, + ExifInterface.TAG_DATETIME_DIGITIZED, + ExifInterface.TAG_DATETIME_ORIGINAL, + ExifInterface.TAG_EXPOSURE_TIME, + ExifInterface.TAG_FLASH, + ExifInterface.TAG_FOCAL_LENGTH, + ExifInterface.TAG_GPS_ALTITUDE, + ExifInterface.TAG_GPS_ALTITUDE_REF, + ExifInterface.TAG_GPS_DATESTAMP, + ExifInterface.TAG_GPS_LATITUDE, + ExifInterface.TAG_GPS_LATITUDE_REF, + ExifInterface.TAG_GPS_LONGITUDE, + ExifInterface.TAG_GPS_LONGITUDE_REF, + ExifInterface.TAG_GPS_PROCESSING_METHOD, + ExifInterface.TAG_GPS_TIMESTAMP, + ExifInterface.TAG_IMAGE_LENGTH, + ExifInterface.TAG_IMAGE_WIDTH, + ExifInterface.TAG_ISO_SPEED_RATINGS, + ExifInterface.TAG_MAKE, + ExifInterface.TAG_MODEL, + ExifInterface.TAG_WHITE_BALANCE + ) + + if (copyOrientation) { + attributes.add(ExifInterface.TAG_ORIENTATION) + } + + attributes.forEach { + val value = getAttribute(it) + if (value != null) { + destination.setAttribute(it, value) + } + } + + try { + destination.saveAttributes() + } catch (ignored: Exception) { + } +} + +fun ExifInterface.removeValues() { + val attributes = arrayListOf( + // ExifInterface.TAG_ORIENTATION, // do not remove the orientation, it could lead to unexpected behaviour at displaying the file + ExifInterface.TAG_APERTURE_VALUE, + ExifInterface.TAG_DATETIME, + ExifInterface.TAG_DATETIME_DIGITIZED, + ExifInterface.TAG_DATETIME_ORIGINAL, + ExifInterface.TAG_EXPOSURE_TIME, + ExifInterface.TAG_FLASH, + ExifInterface.TAG_F_NUMBER, + ExifInterface.TAG_FOCAL_LENGTH, + ExifInterface.TAG_GPS_ALTITUDE, + ExifInterface.TAG_GPS_ALTITUDE_REF, + ExifInterface.TAG_GPS_DATESTAMP, + ExifInterface.TAG_GPS_LATITUDE, + ExifInterface.TAG_GPS_LATITUDE_REF, + ExifInterface.TAG_GPS_LONGITUDE, + ExifInterface.TAG_GPS_LONGITUDE_REF, + ExifInterface.TAG_GPS_PROCESSING_METHOD, + ExifInterface.TAG_GPS_TIMESTAMP, + ExifInterface.TAG_IMAGE_LENGTH, + ExifInterface.TAG_IMAGE_WIDTH, + ExifInterface.TAG_ISO_SPEED_RATINGS, + ExifInterface.TAG_MAKE, + ExifInterface.TAG_MODEL, + ExifInterface.TAG_WHITE_BALANCE + ) + + attributes.forEach { + setAttribute(it, null) + } + + saveAttributes() +} + +fun ExifInterface.getExifProperties(): String { + var exifString = "" + getAttribute(ExifInterface.TAG_F_NUMBER).let { + if (it?.isNotEmpty() == true) { + val number = it.trimEnd('0').trimEnd('.') + exifString += "F/$number " + } + } + + getAttribute(ExifInterface.TAG_FOCAL_LENGTH).let { + if (it?.isNotEmpty() == true) { + val values = it.split('/') + val focalLength = "${values[0].toDouble() / values[1].toDouble()}mm" + exifString += "$focalLength " + } + } + + getAttribute(ExifInterface.TAG_EXPOSURE_TIME).let { + if (it?.isNotEmpty() == true) { + val exposureValue = it.toFloat() + exifString += if (exposureValue > 1f) { + "${exposureValue}s " + } else { + "1/${Math.round(1 / exposureValue)}s " + } + } + } + + getAttribute(ExifInterface.TAG_ISO_SPEED_RATINGS).let { + if (it?.isNotEmpty() == true) { + exifString += "ISO-$it" + } + } + + return exifString.trim() +} + +@TargetApi(Build.VERSION_CODES.N) +fun ExifInterface.getExifDateTaken(context: Context): String { + val dateTime = getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL) ?: getAttribute(ExifInterface.TAG_DATETIME) + dateTime.let { + if (it?.isNotEmpty() == true) { + try { + val simpleDateFormat = SimpleDateFormat("yyyy:MM:dd kk:mm:ss", Locale.ENGLISH) + return simpleDateFormat.parse(it).time.formatDate(context).trim() + } catch (ignored: Exception) { + } + } + } + return "" +} + +fun ExifInterface.getExifCameraModel(): String { + getAttribute(ExifInterface.TAG_MAKE).let { + if (it?.isNotEmpty() == true) { + val model = getAttribute(ExifInterface.TAG_MODEL) + return "$it $model".trim() + } + } + return "" +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/File.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/File.kt new file mode 100644 index 000000000..42e5402db --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/File.kt @@ -0,0 +1,156 @@ +package com.simplemobiletools.commons.extensions + +import android.content.Context +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.FileDirItem +import java.io.File +import java.util.* + +fun File.isMediaFile() = absolutePath.isMediaFile() +fun File.isGif() = absolutePath.endsWith(".gif", true) +fun File.isApng() = absolutePath.endsWith(".apng", true) +fun File.isVideoFast() = videoExtensions.any { absolutePath.endsWith(it, true) } +fun File.isImageFast() = photoExtensions.any { absolutePath.endsWith(it, true) } +fun File.isAudioFast() = audioExtensions.any { absolutePath.endsWith(it, true) } +fun File.isRawFast() = rawExtensions.any { absolutePath.endsWith(it, true) } +fun File.isSvg() = absolutePath.isSvg() +fun File.isPortrait() = absolutePath.isPortrait() + +fun File.isImageSlow() = absolutePath.isImageFast() || getMimeType().startsWith("image") +fun File.isVideoSlow() = absolutePath.isVideoFast() || getMimeType().startsWith("video") +fun File.isAudioSlow() = absolutePath.isAudioFast() || getMimeType().startsWith("audio") + +fun File.getMimeType() = absolutePath.getMimeType() + +fun File.getProperSize(countHiddenItems: Boolean): Long { + return if (isDirectory) { + getDirectorySize(this, countHiddenItems) + } else { + length() + } +} + +private fun getDirectorySize(dir: File, countHiddenItems: Boolean): Long { + var size = 0L + if (dir.exists()) { + val files = dir.listFiles() + if (files != null) { + for (i in files.indices) { + if (files[i].isDirectory) { + size += getDirectorySize(files[i], countHiddenItems) + } else if (!files[i].name.startsWith('.') && !dir.name.startsWith('.') || countHiddenItems) { + size += files[i].length() + } + } + } + } + return size +} + +fun File.getFileCount(countHiddenItems: Boolean): Int { + return if (isDirectory) { + getDirectoryFileCount(this, countHiddenItems) + } else { + 1 + } +} + +private fun getDirectoryFileCount(dir: File, countHiddenItems: Boolean): Int { + var count = -1 + if (dir.exists()) { + val files = dir.listFiles() + if (files != null) { + count++ + for (i in files.indices) { + val file = files[i] + if (file.isDirectory) { + count++ + count += getDirectoryFileCount(file, countHiddenItems) + } else if (!file.name.startsWith('.') || countHiddenItems) { + count++ + } + } + } + } + return count +} + +fun File.getDirectChildrenCount(context: Context, countHiddenItems: Boolean): Int { + val fileCount = if (context.isRestrictedSAFOnlyRoot(path)) { + context.getAndroidSAFDirectChildrenCount( + path, + countHiddenItems + ) + } else { + listFiles()?.filter { + if (countHiddenItems) { + true + } else { + !it.name.startsWith('.') + } + }?.size ?: 0 + } + + return fileCount +} + +fun File.toFileDirItem(context: Context) = FileDirItem(absolutePath, name, context.getIsPathDirectory(absolutePath), 0, length(), lastModified()) + +fun File.containsNoMedia(): Boolean { + return if (!isDirectory) { + false + } else { + File(this, NOMEDIA).exists() + } +} + +fun File.doesThisOrParentHaveNoMedia( + folderNoMediaStatuses: HashMap, + callback: ((path: String, hasNoMedia: Boolean) -> Unit)? +): Boolean { + var curFile = this + while (true) { + val noMediaPath = "${curFile.absolutePath}/$NOMEDIA" + val hasNoMedia = if (folderNoMediaStatuses.keys.contains(noMediaPath)) { + folderNoMediaStatuses[noMediaPath]!! + } else { + val contains = curFile.containsNoMedia() + callback?.invoke(curFile.absolutePath, contains) + contains + } + + if (hasNoMedia) { + return true + } + + curFile = curFile.parentFile ?: break + if (curFile.absolutePath == "/") { + break + } + } + return false +} + +fun File.doesParentHaveNoMedia(): Boolean { + var curFile = parentFile + while (true) { + if (curFile?.containsNoMedia() == true) { + return true + } + curFile = curFile?.parentFile ?: break + if (curFile.absolutePath == "/") { + break + } + } + return false +} + +fun File.getDigest(algorithm: String): String? { + return try { + inputStream().getDigest(algorithm) + } catch (e: Exception) { + null + } +} + +fun File.md5() = this.getDigest(MD5) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/FileDirItem.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/FileDirItem.kt new file mode 100644 index 000000000..8783fcd9b --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/FileDirItem.kt @@ -0,0 +1,8 @@ +package com.simplemobiletools.commons.extensions + +import android.content.Context +import com.simplemobiletools.commons.models.FileDirItem + +fun FileDirItem.isRecycleBinPath(context: Context): Boolean { + return path.startsWith(context.recycleBinPath) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ImageView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ImageView.kt new file mode 100644 index 000000000..8c76d3ae5 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ImageView.kt @@ -0,0 +1,30 @@ +package com.simplemobiletools.commons.extensions + +import android.graphics.PorterDuff +import android.graphics.drawable.GradientDrawable +import android.widget.ImageView +import androidx.annotation.DrawableRes + +fun ImageView.setFillWithStroke(fillColor: Int, backgroundColor: Int, drawRectangle: Boolean = false) { + GradientDrawable().apply { + shape = if (drawRectangle) GradientDrawable.RECTANGLE else GradientDrawable.OVAL + setColor(fillColor) + background = this + + if (backgroundColor == fillColor || fillColor == -2 && backgroundColor == -1) { + val strokeColor = backgroundColor.getContrastColor().adjustAlpha(0.5f) + setStroke(2, strokeColor) + } + } +} + +fun ImageView.applyColorFilter(color: Int) = setColorFilter(color, PorterDuff.Mode.SRC_IN) + +fun ImageView.setImageResourceOrBeGone(@DrawableRes imageRes: Int?) { + if (imageRes != null) { + beVisible() + setImageResource(imageRes) + } else { + beGone() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/InputStream.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/InputStream.kt new file mode 100644 index 000000000..630060a65 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/InputStream.kt @@ -0,0 +1,21 @@ +package com.simplemobiletools.commons.extensions + +import com.simplemobiletools.commons.helpers.MD5 +import java.io.InputStream +import java.security.MessageDigest + +fun InputStream.getDigest(algorithm: String): String { + return use { fis -> + val md = MessageDigest.getInstance(algorithm) + val buffer = ByteArray(8192) + generateSequence { + when (val bytesRead = fis.read(buffer)) { + -1 -> null + else -> bytesRead + } + }.forEach { bytesRead -> md.update(buffer, 0, bytesRead) } + md.digest().joinToString("") { "%02x".format(it) } + } +} + +fun InputStream.md5(): String = this.getDigest(MD5) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Int.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Int.kt new file mode 100644 index 000000000..b39936352 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Int.kt @@ -0,0 +1,195 @@ +package com.simplemobiletools.commons.extensions + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.media.ExifInterface +import android.text.format.DateFormat +import android.text.format.DateUtils +import android.text.format.Time +import com.simplemobiletools.commons.helpers.DARK_GREY +import java.text.DecimalFormat +import java.util.* + +fun Int.getContrastColor(): Int { + val y = (299 * Color.red(this) + 587 * Color.green(this) + 114 * Color.blue(this)) / 1000 + return if (y >= 149 && this != Color.BLACK) DARK_GREY else Color.WHITE +} + +fun Int.toHex() = String.format("#%06X", 0xFFFFFF and this).toUpperCase() + +fun Int.adjustAlpha(factor: Float): Int { + val alpha = Math.round(Color.alpha(this) * factor) + val red = Color.red(this) + val green = Color.green(this) + val blue = Color.blue(this) + return Color.argb(alpha, red, green, blue) +} + +fun Int.getFormattedDuration(forceShowHours: Boolean = false): String { + val sb = StringBuilder(8) + val hours = this / 3600 + val minutes = this % 3600 / 60 + val seconds = this % 60 + + if (this >= 3600) { + sb.append(String.format(Locale.getDefault(), "%02d", hours)).append(":") + } else if (forceShowHours) { + sb.append("0:") + } + + sb.append(String.format(Locale.getDefault(), "%02d", minutes)) + sb.append(":").append(String.format(Locale.getDefault(), "%02d", seconds)) + return sb.toString() +} + +fun Int.formatSize(): String { + if (this <= 0) { + return "0 B" + } + + val units = arrayOf("B", "kB", "MB", "GB", "TB") + val digitGroups = (Math.log10(toDouble()) / Math.log10(1024.0)).toInt() + return "${DecimalFormat("#,##0.#").format(this / Math.pow(1024.0, digitGroups.toDouble()))} ${units[digitGroups]}" +} + +fun Int.formatDate(context: Context, dateFormat: String? = null, timeFormat: String? = null): String { + val useDateFormat = dateFormat ?: context.baseConfig.dateFormat + val useTimeFormat = timeFormat ?: context.getTimeFormat() + val cal = Calendar.getInstance(Locale.ENGLISH) + cal.timeInMillis = this * 1000L + return DateFormat.format("$useDateFormat, $useTimeFormat", cal).toString() +} + +// if the given date is today, we show only the time. Else we show the date and optionally the time too +fun Int.formatDateOrTime(context: Context, hideTimeAtOtherDays: Boolean, showYearEvenIfCurrent: Boolean): String { + val cal = Calendar.getInstance(Locale.ENGLISH) + cal.timeInMillis = this * 1000L + + return if (DateUtils.isToday(this * 1000L)) { + DateFormat.format(context.getTimeFormat(), cal).toString() + } else { + var format = context.baseConfig.dateFormat + if (!showYearEvenIfCurrent && isThisYear()) { + format = format.replace("y", "").trim().trim('-').trim('.').trim('/') + } + + if (!hideTimeAtOtherDays) { + format += ", ${context.getTimeFormat()}" + } + + DateFormat.format(format, cal).toString() + } +} + +fun Int.isThisYear(): Boolean { + val time = Time() + time.set(this * 1000L) + + val thenYear = time.year + time.set(System.currentTimeMillis()) + + return (thenYear == time.year) +} + +fun Int.addBitIf(add: Boolean, bit: Int) = + if (add) { + addBit(bit) + } else { + removeBit(bit) + } + +// TODO: how to do "bits & ~bit" in kotlin? +fun Int.removeBit(bit: Int) = addBit(bit) - bit + +fun Int.addBit(bit: Int) = this or bit + +fun Int.flipBit(bit: Int) = if (this and bit == 0) addBit(bit) else removeBit(bit) + +fun ClosedRange.random() = Random().nextInt(endInclusive - start) + start + +// taken from https://stackoverflow.com/a/40964456/1967672 +fun Int.darkenColor(factor: Int = 8): Int { + if (this == Color.WHITE || this == Color.BLACK) { + return this + } + + val DARK_FACTOR = factor + var hsv = FloatArray(3) + Color.colorToHSV(this, hsv) + val hsl = hsv2hsl(hsv) + hsl[2] -= DARK_FACTOR / 100f + if (hsl[2] < 0) + hsl[2] = 0f + hsv = hsl2hsv(hsl) + return Color.HSVToColor(hsv) +} + +fun Int.lightenColor(factor: Int = 8): Int { + if (this == Color.WHITE || this == Color.BLACK) { + return this + } + + val LIGHT_FACTOR = factor + var hsv = FloatArray(3) + Color.colorToHSV(this, hsv) + val hsl = hsv2hsl(hsv) + hsl[2] += LIGHT_FACTOR / 100f + if (hsl[2] < 0) + hsl[2] = 0f + hsv = hsl2hsv(hsl) + return Color.HSVToColor(hsv) +} + +private fun hsl2hsv(hsl: FloatArray): FloatArray { + val hue = hsl[0] + var sat = hsl[1] + val light = hsl[2] + sat *= if (light < .5) light else 1 - light + return floatArrayOf(hue, 2f * sat / (light + sat), light + sat) +} + +private fun hsv2hsl(hsv: FloatArray): FloatArray { + val hue = hsv[0] + val sat = hsv[1] + val value = hsv[2] + + val newHue = (2f - sat) * value + var newSat = sat * value / if (newHue < 1f) newHue else 2f - newHue + if (newSat > 1f) + newSat = 1f + + return floatArrayOf(hue, newSat, newHue / 2f) +} + +fun Int.orientationFromDegrees() = when (this) { + 270 -> ExifInterface.ORIENTATION_ROTATE_270 + 180 -> ExifInterface.ORIENTATION_ROTATE_180 + 90 -> ExifInterface.ORIENTATION_ROTATE_90 + else -> ExifInterface.ORIENTATION_NORMAL +}.toString() + +fun Int.degreesFromOrientation() = when (this) { + ExifInterface.ORIENTATION_ROTATE_270 -> 270 + ExifInterface.ORIENTATION_ROTATE_180 -> 180 + ExifInterface.ORIENTATION_ROTATE_90 -> 90 + else -> 0 +} + +fun Int.ensureTwoDigits(): String { + return if (toString().length == 1) { + "0$this" + } else { + toString() + } +} + +fun Int.getColorStateList(): ColorStateList { + val states = arrayOf(intArrayOf(android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_pressed) + ) + val colors = intArrayOf(this, this, this, this) + return ColorStateList(states, colors) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/List.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/List.kt new file mode 100644 index 000000000..3e4d0f540 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/List.kt @@ -0,0 +1,23 @@ +package com.simplemobiletools.commons.extensions + +import java.util.* + +fun List.getMimeType(): String { + val mimeGroups = HashSet(size) + val subtypes = HashSet(size) + forEach { + val parts = it.getMimeType().split("/") + if (parts.size == 2) { + mimeGroups.add(parts.getOrElse(0) { "" }) + subtypes.add(parts.getOrElse(1) { "" }) + } else { + return "*/*" + } + } + + return when { + subtypes.size == 1 -> "${mimeGroups.first()}/${subtypes.first()}" + mimeGroups.size == 1 -> "${mimeGroups.first()}/*" + else -> "*/*" + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Long.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Long.kt new file mode 100644 index 000000000..2ba323cad --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Long.kt @@ -0,0 +1,24 @@ +package com.simplemobiletools.commons.extensions + +import android.content.Context +import android.text.format.DateFormat +import java.text.DecimalFormat +import java.util.* + +fun Long.formatSize(): String { + if (this <= 0) { + return "0 B" + } + + val units = arrayOf("B", "kB", "MB", "GB", "TB") + val digitGroups = (Math.log10(toDouble()) / Math.log10(1024.0)).toInt() + return "${DecimalFormat("#,##0.#").format(this / Math.pow(1024.0, digitGroups.toDouble()))} ${units[digitGroups]}" +} + +fun Long.formatDate(context: Context, dateFormat: String? = null, timeFormat: String? = null): String { + val useDateFormat = dateFormat ?: context.baseConfig.dateFormat + val useTimeFormat = timeFormat ?: context.getTimeFormat() + val cal = Calendar.getInstance(Locale.ENGLISH) + cal.timeInMillis = this + return DateFormat.format("$useDateFormat, $useTimeFormat", cal).toString() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Point.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Point.kt new file mode 100644 index 000000000..360dc480f --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Point.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.commons.extensions + +import android.graphics.Point + +fun Point.formatAsResolution() = "$x x $y ${getMPx()}" + +fun Point.getMPx(): String { + val px = x * y / 1000000f + val rounded = Math.round(px * 10) / 10f + return "(${rounded}MP)" +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/RemoteViews.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/RemoteViews.kt new file mode 100644 index 000000000..726b3548d --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/RemoteViews.kt @@ -0,0 +1,27 @@ +package com.simplemobiletools.commons.extensions + +import android.graphics.Color +import android.view.View +import android.widget.RemoteViews + +fun RemoteViews.setBackgroundColor(id: Int, color: Int) { + setInt(id, "setBackgroundColor", color) +} + +fun RemoteViews.setTextSize(id: Int, size: Float) { + setFloat(id, "setTextSize", size) +} + +fun RemoteViews.setText(id: Int, text: String) { + setTextViewText(id, text) +} + +fun RemoteViews.setVisibleIf(id: Int, beVisible: Boolean) { + val visibility = if (beVisible) View.VISIBLE else View.GONE + setViewVisibility(id, visibility) +} + +fun RemoteViews.applyColorFilter(id: Int, color: Int) { + setInt(id, "setColorFilter", color) + setInt(id, "setImageAlpha", Color.alpha(color)) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Resources.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Resources.kt new file mode 100644 index 000000000..e206139e4 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/Resources.kt @@ -0,0 +1,40 @@ +package com.simplemobiletools.commons.extensions + +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.drawable.Drawable + +fun Resources.getColoredBitmap(resourceId: Int, newColor: Int): Bitmap { + val drawable = getDrawable(resourceId) + val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bitmap) + drawable.setBounds(0, 0, canvas.width, canvas.height) + drawable.colorFilter = PorterDuffColorFilter(newColor, PorterDuff.Mode.SRC_IN) + drawable.draw(canvas) + return bitmap +} + +fun Resources.getColoredDrawable(drawableId: Int, colorId: Int, alpha: Int = 255) = getColoredDrawableWithColor(drawableId, getColor(colorId), alpha) + +fun Resources.getColoredDrawableWithColor(drawableId: Int, color: Int, alpha: Int = 255): Drawable { + val drawable = getDrawable(drawableId) + drawable.mutate().applyColorFilter(color) + drawable.mutate().alpha = alpha + return drawable +} + +fun Resources.hasNavBar(): Boolean { + val id = getIdentifier("config_showNavigationBar", "bool", "android") + return id > 0 && getBoolean(id) +} + +fun Resources.getNavBarHeight(): Int { + val id = getIdentifier("navigation_bar_height", "dimen", "android") + return if (id > 0 && hasNavBar()) { + getDimensionPixelSize(id) + } else + 0 +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/SeekBar.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/SeekBar.kt new file mode 100644 index 000000000..e60e57d42 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/SeekBar.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.commons.extensions + +import android.widget.SeekBar + +fun SeekBar.onSeekBarChangeListener(seekBarChangeListener: (progress: Int) -> Unit) = setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + seekBarChangeListener(progress) + } + + override fun onStartTrackingTouch(seekBar: SeekBar) {} + + override fun onStopTrackingTouch(seekBar: SeekBar) {} +}) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt new file mode 100644 index 000000000..47489a44e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/String.kt @@ -0,0 +1,930 @@ +package com.simplemobiletools.commons.extensions + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Point +import android.os.StatFs +import android.provider.MediaStore +import android.telephony.PhoneNumberUtils +import android.text.Spannable +import android.text.SpannableString +import android.text.TextUtils +import android.text.style.ForegroundColorSpan +import android.widget.TextView +import com.bumptech.glide.signature.ObjectKey +import com.simplemobiletools.commons.helpers.* +import org.joda.time.DateTime +import org.joda.time.Years +import org.joda.time.format.DateTimeFormat +import java.io.File +import java.text.DateFormat +import java.text.Normalizer +import java.text.SimpleDateFormat +import java.util.* +import java.util.regex.Pattern + +fun String.getFilenameFromPath() = substring(lastIndexOf("/") + 1) + +fun String.getFilenameExtension() = substring(lastIndexOf(".") + 1) + +fun String.getBasePath(context: Context): String { + return when { + startsWith(context.internalStoragePath) -> context.internalStoragePath + context.isPathOnSD(this) -> context.sdCardPath + context.isPathOnOTG(this) -> context.otgPath + else -> "/" + } +} + +fun String.getFirstParentDirName(context: Context, level: Int): String? { + val basePath = getBasePath(context) + val startIndex = basePath.length + 1 + return if (length > startIndex) { + val pathWithoutBasePath = substring(startIndex) + val pathSegments = pathWithoutBasePath.split("/") + if (level < pathSegments.size) { + pathSegments.slice(0..level).joinToString("/") + } else { + null + } + } else { + null + } +} + +fun String.getFirstParentPath(context: Context, level: Int): String { + val basePath = getBasePath(context) + val startIndex = basePath.length + 1 + return if (length > startIndex) { + val pathWithoutBasePath = substring(basePath.length + 1) + val pathSegments = pathWithoutBasePath.split("/") + val firstParentPath = if (level < pathSegments.size) { + pathSegments.slice(0..level).joinToString("/") + } else { + pathWithoutBasePath + } + "$basePath/$firstParentPath" + } else { + basePath + } +} + +fun String.isAValidFilename(): Boolean { + val ILLEGAL_CHARACTERS = charArrayOf('/', '\n', '\r', '\t', '\u0000', '`', '?', '*', '\\', '<', '>', '|', '\"', ':') + ILLEGAL_CHARACTERS.forEach { + if (contains(it)) + return false + } + return true +} + +fun String.getOTGPublicPath(context: Context) = + "${context.baseConfig.OTGTreeUri}/document/${context.baseConfig.OTGPartition}%3A${substring(context.baseConfig.OTGPath.length).replace("/", "%2F")}" + +fun String.isMediaFile() = isImageFast() || isVideoFast() || isGif() || isRawFast() || isSvg() || isPortrait() + +fun String.isWebP() = endsWith(".webp", true) + +fun String.isGif() = endsWith(".gif", true) + +fun String.isPng() = endsWith(".png", true) + +fun String.isApng() = endsWith(".apng", true) + +fun String.isJpg() = endsWith(".jpg", true) or endsWith(".jpeg", true) + +fun String.isSvg() = endsWith(".svg", true) + +fun String.isPortrait() = getFilenameFromPath().contains("portrait", true) && File(this).parentFile?.name?.startsWith("img_", true) == true + +// fast extension checks, not guaranteed to be accurate +fun String.isVideoFast() = videoExtensions.any { endsWith(it, true) } + +fun String.isImageFast() = photoExtensions.any { endsWith(it, true) } +fun String.isAudioFast() = audioExtensions.any { endsWith(it, true) } +fun String.isRawFast() = rawExtensions.any { endsWith(it, true) } + +fun String.isImageSlow() = isImageFast() || getMimeType().startsWith("image") || startsWith(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()) +fun String.isVideoSlow() = isVideoFast() || getMimeType().startsWith("video") || startsWith(MediaStore.Video.Media.EXTERNAL_CONTENT_URI.toString()) +fun String.isAudioSlow() = isAudioFast() || getMimeType().startsWith("audio") || startsWith(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.toString()) + +fun String.canModifyEXIF() = extensionsSupportingEXIF.any { endsWith(it, true) } + +fun String.getCompressionFormat() = when (getFilenameExtension().toLowerCase()) { + "png" -> Bitmap.CompressFormat.PNG + "webp" -> Bitmap.CompressFormat.WEBP + else -> Bitmap.CompressFormat.JPEG +} + +fun String.areDigitsOnly() = matches(Regex("[0-9]+")) + +fun String.areLettersOnly() = matches(Regex("[a-zA-Z]+")) + +fun String.getGenericMimeType(): String { + if (!contains("/")) + return this + + val type = substring(0, indexOf("/")) + return "$type/*" +} + +fun String.getParentPath() = removeSuffix("/${getFilenameFromPath()}") +fun String.relativizeWith(path: String) = this.substring(path.length) + +fun String.containsNoMedia() = File(this).containsNoMedia() + +fun String.doesThisOrParentHaveNoMedia(folderNoMediaStatuses: HashMap, callback: ((path: String, hasNoMedia: Boolean) -> Unit)?) = + File(this).doesThisOrParentHaveNoMedia(folderNoMediaStatuses, callback) + +fun String.getImageResolution(context: Context): Point? { + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + if (context.isRestrictedSAFOnlyRoot(this)) { + BitmapFactory.decodeStream(context.contentResolver.openInputStream(context.getAndroidSAFUri(this)), null, options) + } else { + BitmapFactory.decodeFile(this, options) + } + + val width = options.outWidth + val height = options.outHeight + return if (width > 0 && height > 0) { + Point(options.outWidth, options.outHeight) + } else { + null + } +} + +fun String.getPublicUri(context: Context) = context.getDocumentFile(this)?.uri ?: "" + +fun String.substringTo(cnt: Int): String { + return if (isEmpty()) { + "" + } else { + substring(0, Math.min(length, cnt)) + } +} + +fun String.highlightTextPart(textToHighlight: String, color: Int, highlightAll: Boolean = false, ignoreCharsBetweenDigits: Boolean = false): SpannableString { + val spannableString = SpannableString(this) + if (textToHighlight.isEmpty()) { + return spannableString + } + + var startIndex = normalizeString().indexOf(textToHighlight, 0, true) + val indexes = ArrayList() + while (startIndex >= 0) { + if (startIndex != -1) { + indexes.add(startIndex) + } + + startIndex = normalizeString().indexOf(textToHighlight, startIndex + textToHighlight.length, true) + if (!highlightAll) { + break + } + } + + // handle cases when we search for 643, but in reality the string contains it like 6-43 + if (ignoreCharsBetweenDigits && indexes.isEmpty()) { + try { + val regex = TextUtils.join("(\\D*)", textToHighlight.toCharArray().toTypedArray()) + val pattern = Pattern.compile(regex) + val result = pattern.matcher(normalizeString()) + if (result.find()) { + spannableString.setSpan(ForegroundColorSpan(color), result.start(), result.end(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE) + } + } catch (ignored: Exception) { + } + + return spannableString + } + + indexes.forEach { + val endIndex = Math.min(it + textToHighlight.length, length) + try { + spannableString.setSpan(ForegroundColorSpan(color), it, endIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE) + } catch (ignored: IndexOutOfBoundsException) { + } + } + + return spannableString +} + +fun String.searchMatches(textToHighlight: String): ArrayList { + val indexes = arrayListOf() + var indexOf = indexOf(textToHighlight, 0, true) + + var offset = 0 + while (offset < length && indexOf != -1) { + indexOf = indexOf(textToHighlight, offset, true) + + if (indexOf == -1) { + break + } else { + indexes.add(indexOf) + } + + offset = indexOf + 1 + } + + return indexes +} + +fun String.getFileSignature(lastModified: Long? = null) = ObjectKey(getFileKey(lastModified)) + +fun String.getFileKey(lastModified: Long? = null): String { + val file = File(this) + val modified = if (lastModified != null && lastModified > 0) { + lastModified + } else { + file.lastModified() + } + + return "${file.absolutePath}$modified" +} + +fun String.getAvailableStorageB(): Long { + return try { + val stat = StatFs(this) + val bytesAvailable = stat.blockSizeLong * stat.availableBlocksLong + bytesAvailable + } catch (e: Exception) { + -1L + } +} + +// remove diacritics, for example č -> c +fun String.normalizeString() = Normalizer.normalize(this, Normalizer.Form.NFD).replace(normalizeRegex, "") + +// checks if string is a phone number +fun String.isPhoneNumber(): Boolean { + return this.matches("^[0-9+\\-\\)\\( *#]+\$".toRegex()) +} + +// if we are comparing phone numbers, compare just the last 9 digits +fun String.trimToComparableNumber(): String { + // don't trim if it's not a phone number + if (!this.isPhoneNumber()) { + return this + } + val normalizedNumber = this.normalizeString() + val startIndex = Math.max(0, normalizedNumber.length - 9) + return normalizedNumber.substring(startIndex) +} + +// get the contact names first letter at showing the placeholder without image +fun String.getNameLetter() = normalizeString().toCharArray().getOrNull(0)?.toString()?.toUpperCase(Locale.getDefault()) ?: "A" + +fun String.normalizePhoneNumber() = PhoneNumberUtils.normalizeNumber(this) + +fun String.highlightTextFromNumbers(textToHighlight: String, primaryColor: Int): SpannableString { + val spannableString = SpannableString(this) + val digits = PhoneNumberUtils.convertKeypadLettersToDigits(this) + if (digits.contains(textToHighlight)) { + val startIndex = digits.indexOf(textToHighlight, 0, true) + val endIndex = Math.min(startIndex + textToHighlight.length, length) + try { + spannableString.setSpan(ForegroundColorSpan(primaryColor), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE) + } catch (ignored: IndexOutOfBoundsException) { + } + } + + return spannableString +} + +fun String.getDateTimeFromDateString(showYearsSince: Boolean, viewToUpdate: TextView? = null): DateTime { + val dateFormats = getDateFormats() + var date = DateTime() + for (format in dateFormats) { + try { + date = DateTime.parse(this, DateTimeFormat.forPattern(format)) + + val formatter = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault()) + var localPattern = (formatter as SimpleDateFormat).toLocalizedPattern() + + val hasYear = format.contains("y") + if (!hasYear) { + localPattern = localPattern.replace("y", "").replace(",", "").trim() + date = date.withYear(DateTime().year) + } + + var formattedString = date.toString(localPattern) + if (showYearsSince && hasYear) { + formattedString += " (${Years.yearsBetween(date, DateTime.now()).years})" + } + + viewToUpdate?.text = formattedString + break + } catch (ignored: Exception) { + } + } + return date +} + +fun String.getMimeType(): String { + val typesMap = HashMap().apply { + put("323", "text/h323") + put("3g2", "video/3gpp2") + put("3gp", "video/3gpp") + put("3gp2", "video/3gpp2") + put("3gpp", "video/3gpp") + put("7z", "application/x-7z-compressed") + put("aa", "audio/audible") + put("aac", "audio/aac") + put("aaf", "application/octet-stream") + put("aax", "audio/vnd.audible.aax") + put("ac3", "audio/ac3") + put("aca", "application/octet-stream") + put("accda", "application/msaccess.addin") + put("accdb", "application/msaccess") + put("accdc", "application/msaccess.cab") + put("accde", "application/msaccess") + put("accdr", "application/msaccess.runtime") + put("accdt", "application/msaccess") + put("accdw", "application/msaccess.webapplication") + put("accft", "application/msaccess.ftemplate") + put("acx", "application/internet-property-stream") + put("addin", "text/xml") + put("ade", "application/msaccess") + put("adobebridge", "application/x-bridge-url") + put("adp", "application/msaccess") + put("adt", "audio/vnd.dlna.adts") + put("adts", "audio/aac") + put("afm", "application/octet-stream") + put("ai", "application/postscript") + put("aif", "audio/aiff") + put("aifc", "audio/aiff") + put("aiff", "audio/aiff") + put("air", "application/vnd.adobe.air-application-installer-package+zip") + put("amc", "application/mpeg") + put("anx", "application/annodex") + put("apk", "application/vnd.android.package-archive") + put("application", "application/x-ms-application") + put("art", "image/x-jg") + put("asa", "application/xml") + put("asax", "application/xml") + put("ascx", "application/xml") + put("asd", "application/octet-stream") + put("asf", "video/x-ms-asf") + put("ashx", "application/xml") + put("asi", "application/octet-stream") + put("asm", "text/plain") + put("asmx", "application/xml") + put("aspx", "application/xml") + put("asr", "video/x-ms-asf") + put("asx", "video/x-ms-asf") + put("atom", "application/atom+xml") + put("au", "audio/basic") + put("avi", "video/x-msvideo") + put("axa", "audio/annodex") + put("axs", "application/olescript") + put("axv", "video/annodex") + put("bas", "text/plain") + put("bcpio", "application/x-bcpio") + put("bin", "application/octet-stream") + put("bmp", "image/bmp") + put("c", "text/plain") + put("cab", "application/octet-stream") + put("caf", "audio/x-caf") + put("calx", "application/vnd.ms-office.calx") + put("cat", "application/vnd.ms-pki.seccat") + put("cc", "text/plain") + put("cd", "text/plain") + put("cdda", "audio/aiff") + put("cdf", "application/x-cdf") + put("cer", "application/x-x509-ca-cert") + put("cfg", "text/plain") + put("chm", "application/octet-stream") + put("class", "application/x-java-applet") + put("clp", "application/x-msclip") + put("cmd", "text/plain") + put("cmx", "image/x-cmx") + put("cnf", "text/plain") + put("cod", "image/cis-cod") + put("config", "application/xml") + put("contact", "text/x-ms-contact") + put("coverage", "application/xml") + put("cpio", "application/x-cpio") + put("cpp", "text/plain") + put("crd", "application/x-mscardfile") + put("crl", "application/pkix-crl") + put("crt", "application/x-x509-ca-cert") + put("cs", "text/plain") + put("csdproj", "text/plain") + put("csh", "application/x-csh") + put("csproj", "text/plain") + put("css", "text/css") + put("csv", "text/csv") + put("cur", "application/octet-stream") + put("cxx", "text/plain") + put("dat", "application/octet-stream") + put("datasource", "application/xml") + put("dbproj", "text/plain") + put("dcr", "application/x-director") + put("def", "text/plain") + put("deploy", "application/octet-stream") + put("der", "application/x-x509-ca-cert") + put("dgml", "application/xml") + put("dib", "image/bmp") + put("dif", "video/x-dv") + put("dir", "application/x-director") + put("disco", "text/xml") + put("divx", "video/divx") + put("dll", "application/x-msdownload") + put("dll.config", "text/xml") + put("dlm", "text/dlm") + put("dng", "image/x-adobe-dng") + put("doc", "application/msword") + put("docm", "application/vnd.ms-word.document.macroEnabled.12") + put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document") + put("dot", "application/msword") + put("dotm", "application/vnd.ms-word.template.macroEnabled.12") + put("dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template") + put("dsp", "application/octet-stream") + put("dsw", "text/plain") + put("dtd", "text/xml") + put("dtsconfig", "text/xml") + put("dv", "video/x-dv") + put("dvi", "application/x-dvi") + put("dwf", "drawing/x-dwf") + put("dwp", "application/octet-stream") + put("dxr", "application/x-director") + put("eml", "message/rfc822") + put("emz", "application/octet-stream") + put("eot", "application/vnd.ms-fontobject") + put("eps", "application/postscript") + put("etl", "application/etl") + put("etx", "text/x-setext") + put("evy", "application/envoy") + put("exe", "application/octet-stream") + put("exe.config", "text/xml") + put("fdf", "application/vnd.fdf") + put("fif", "application/fractals") + put("filters", "application/xml") + put("fla", "application/octet-stream") + put("flac", "audio/flac") + put("flr", "x-world/x-vrml") + put("flv", "video/x-flv") + put("fsscript", "application/fsharp-script") + put("fsx", "application/fsharp-script") + put("generictest", "application/xml") + put("gif", "image/gif") + put("group", "text/x-ms-group") + put("gsm", "audio/x-gsm") + put("gtar", "application/x-gtar") + put("gz", "application/x-gzip") + put("h", "text/plain") + put("hdf", "application/x-hdf") + put("hdml", "text/x-hdml") + put("hhc", "application/x-oleobject") + put("hhk", "application/octet-stream") + put("hhp", "application/octet-stream") + put("hlp", "application/winhlp") + put("hpp", "text/plain") + put("hqx", "application/mac-binhex40") + put("hta", "application/hta") + put("htc", "text/x-component") + put("htm", "text/html") + put("html", "text/html") + put("htt", "text/webviewhtml") + put("hxa", "application/xml") + put("hxc", "application/xml") + put("hxd", "application/octet-stream") + put("hxe", "application/xml") + put("hxf", "application/xml") + put("hxh", "application/octet-stream") + put("hxi", "application/octet-stream") + put("hxk", "application/xml") + put("hxq", "application/octet-stream") + put("hxr", "application/octet-stream") + put("hxs", "application/octet-stream") + put("hxt", "text/html") + put("hxv", "application/xml") + put("hxw", "application/octet-stream") + put("hxx", "text/plain") + put("i", "text/plain") + put("ico", "image/x-icon") + put("ics", "text/calendar") + put("idl", "text/plain") + put("ief", "image/ief") + put("iii", "application/x-iphone") + put("inc", "text/plain") + put("inf", "application/octet-stream") + put("ini", "text/plain") + put("inl", "text/plain") + put("ins", "application/x-internet-signup") + put("ipa", "application/x-itunes-ipa") + put("ipg", "application/x-itunes-ipg") + put("ipproj", "text/plain") + put("ipsw", "application/x-itunes-ipsw") + put("iqy", "text/x-ms-iqy") + put("isp", "application/x-internet-signup") + put("ite", "application/x-itunes-ite") + put("itlp", "application/x-itunes-itlp") + put("itms", "application/x-itunes-itms") + put("itpc", "application/x-itunes-itpc") + put("ivf", "video/x-ivf") + put("jar", "application/java-archive") + put("java", "application/octet-stream") + put("jck", "application/liquidmotion") + put("jcz", "application/liquidmotion") + put("jfif", "image/pjpeg") + put("jnlp", "application/x-java-jnlp-file") + put("jpb", "application/octet-stream") + put("jpe", "image/jpeg") + put("jpeg", "image/jpeg") + put("jpg", "image/jpeg") + put("js", "application/javascript") + put("json", "application/json") + put("jsx", "text/jscript") + put("jsxbin", "text/plain") + put("latex", "application/x-latex") + put("library-ms", "application/windows-library+xml") + put("lit", "application/x-ms-reader") + put("loadtest", "application/xml") + put("lpk", "application/octet-stream") + put("lsf", "video/x-la-asf") + put("lst", "text/plain") + put("lsx", "video/x-la-asf") + put("lzh", "application/octet-stream") + put("m13", "application/x-msmediaview") + put("m14", "application/x-msmediaview") + put("m1v", "video/mpeg") + put("m2t", "video/vnd.dlna.mpeg-tts") + put("m2ts", "video/vnd.dlna.mpeg-tts") + put("m2v", "video/mpeg") + put("m3u", "audio/x-mpegurl") + put("m3u8", "audio/x-mpegurl") + put("m4a", "audio/m4a") + put("m4b", "audio/m4b") + put("m4p", "audio/m4p") + put("m4r", "audio/x-m4r") + put("m4v", "video/x-m4v") + put("mac", "image/x-macpaint") + put("mak", "text/plain") + put("man", "application/x-troff-man") + put("manifest", "application/x-ms-manifest") + put("map", "text/plain") + put("master", "application/xml") + put("mda", "application/msaccess") + put("mdb", "application/x-msaccess") + put("mde", "application/msaccess") + put("mdp", "application/octet-stream") + put("me", "application/x-troff-me") + put("mfp", "application/x-shockwave-flash") + put("mht", "message/rfc822") + put("mhtml", "message/rfc822") + put("mid", "audio/mid") + put("midi", "audio/mid") + put("mix", "application/octet-stream") + put("mk", "text/plain") + put("mkv", "video/x-matroska") + put("mmf", "application/x-smaf") + put("mno", "text/xml") + put("mny", "application/x-msmoney") + put("mod", "video/mpeg") + put("mov", "video/quicktime") + put("movie", "video/x-sgi-movie") + put("mp2", "video/mpeg") + put("mp2v", "video/mpeg") + put("mp3", "audio/mpeg") + put("mp4", "video/mp4") + put("mp4v", "video/mp4") + put("mpa", "video/mpeg") + put("mpe", "video/mpeg") + put("mpeg", "video/mpeg") + put("mpf", "application/vnd.ms-mediapackage") + put("mpg", "video/mpeg") + put("mpp", "application/vnd.ms-project") + put("mpv2", "video/mpeg") + put("mqv", "video/quicktime") + put("ms", "application/x-troff-ms") + put("msi", "application/octet-stream") + put("mso", "application/octet-stream") + put("mts", "video/vnd.dlna.mpeg-tts") + put("mtx", "application/xml") + put("mvb", "application/x-msmediaview") + put("mvc", "application/x-miva-compiled") + put("mxp", "application/x-mmxp") + put("nc", "application/x-netcdf") + put("nsc", "video/x-ms-asf") + put("nws", "message/rfc822") + put("ocx", "application/octet-stream") + put("oda", "application/oda") + put("odb", "application/vnd.oasis.opendocument.database") + put("odc", "application/vnd.oasis.opendocument.chart") + put("odf", "application/vnd.oasis.opendocument.formula") + put("odg", "application/vnd.oasis.opendocument.graphics") + put("odh", "text/plain") + put("odi", "application/vnd.oasis.opendocument.image") + put("odl", "text/plain") + put("odm", "application/vnd.oasis.opendocument.text-master") + put("odp", "application/vnd.oasis.opendocument.presentation") + put("ods", "application/vnd.oasis.opendocument.spreadsheet") + put("odt", "application/vnd.oasis.opendocument.text") + put("oga", "audio/ogg") + put("ogg", "audio/ogg") + put("ogv", "video/ogg") + put("ogx", "application/ogg") + put("one", "application/onenote") + put("onea", "application/onenote") + put("onepkg", "application/onenote") + put("onetmp", "application/onenote") + put("onetoc", "application/onenote") + put("onetoc2", "application/onenote") + put("opus", "audio/ogg") + put("orderedtest", "application/xml") + put("osdx", "application/opensearchdescription+xml") + put("otf", "application/font-sfnt") + put("otg", "application/vnd.oasis.opendocument.graphics-template") + put("oth", "application/vnd.oasis.opendocument.text-web") + put("otp", "application/vnd.oasis.opendocument.presentation-template") + put("ots", "application/vnd.oasis.opendocument.spreadsheet-template") + put("ott", "application/vnd.oasis.opendocument.text-template") + put("oxt", "application/vnd.openofficeorg.extension") + put("p10", "application/pkcs10") + put("p12", "application/x-pkcs12") + put("p7b", "application/x-pkcs7-certificates") + put("p7c", "application/pkcs7-mime") + put("p7m", "application/pkcs7-mime") + put("p7r", "application/x-pkcs7-certreqresp") + put("p7s", "application/pkcs7-signature") + put("pbm", "image/x-portable-bitmap") + put("pcast", "application/x-podcast") + put("pct", "image/pict") + put("pcx", "application/octet-stream") + put("pcz", "application/octet-stream") + put("pdf", "application/pdf") + put("pfb", "application/octet-stream") + put("pfm", "application/octet-stream") + put("pfx", "application/x-pkcs12") + put("pgm", "image/x-portable-graymap") + put("php", "text/plain") + put("pic", "image/pict") + put("pict", "image/pict") + put("pkgdef", "text/plain") + put("pkgundef", "text/plain") + put("pko", "application/vnd.ms-pki.pko") + put("pls", "audio/scpls") + put("pma", "application/x-perfmon") + put("pmc", "application/x-perfmon") + put("pml", "application/x-perfmon") + put("pmr", "application/x-perfmon") + put("pmw", "application/x-perfmon") + put("png", "image/png") + put("pnm", "image/x-portable-anymap") + put("pnt", "image/x-macpaint") + put("pntg", "image/x-macpaint") + put("pnz", "image/png") + put("pot", "application/vnd.ms-powerpoint") + put("potm", "application/vnd.ms-powerpoint.template.macroEnabled.12") + put("potx", "application/vnd.openxmlformats-officedocument.presentationml.template") + put("ppa", "application/vnd.ms-powerpoint") + put("ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12") + put("ppm", "image/x-portable-pixmap") + put("pps", "application/vnd.ms-powerpoint") + put("ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12") + put("ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow") + put("ppt", "application/vnd.ms-powerpoint") + put("pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12") + put("pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation") + put("prf", "application/pics-rules") + put("prm", "application/octet-stream") + put("prx", "application/octet-stream") + put("ps", "application/postscript") + put("psc1", "application/PowerShell") + put("psd", "application/octet-stream") + put("psess", "application/xml") + put("psm", "application/octet-stream") + put("psp", "application/octet-stream") + put("pub", "application/x-mspublisher") + put("pwz", "application/vnd.ms-powerpoint") + put("py", "text/plain") + put("qht", "text/x-html-insertion") + put("qhtm", "text/x-html-insertion") + put("qt", "video/quicktime") + put("qti", "image/x-quicktime") + put("qtif", "image/x-quicktime") + put("qtl", "application/x-quicktimeplayer") + put("qxd", "application/octet-stream") + put("ra", "audio/x-pn-realaudio") + put("ram", "audio/x-pn-realaudio") + put("rar", "application/x-rar-compressed") + put("ras", "image/x-cmu-raster") + put("rat", "application/rat-file") + put("rb", "text/plain") + put("rc", "text/plain") + put("rc2", "text/plain") + put("rct", "text/plain") + put("rdlc", "application/xml") + put("reg", "text/plain") + put("resx", "application/xml") + put("rf", "image/vnd.rn-realflash") + put("rgb", "image/x-rgb") + put("rgs", "text/plain") + put("rm", "application/vnd.rn-realmedia") + put("rmi", "audio/mid") + put("rmp", "application/vnd.rn-rn_music_package") + put("roff", "application/x-troff") + put("rpm", "audio/x-pn-realaudio-plugin") + put("rqy", "text/x-ms-rqy") + put("rtf", "application/rtf") + put("rtx", "text/richtext") + put("ruleset", "application/xml") + put("s", "text/plain") + put("safariextz", "application/x-safari-safariextz") + put("scd", "application/x-msschedule") + put("scr", "text/plain") + put("sct", "text/scriptlet") + put("sd2", "audio/x-sd2") + put("sdp", "application/sdp") + put("sea", "application/octet-stream") + put("searchConnector-ms", "application/windows-search-connector+xml") + put("setpay", "application/set-payment-initiation") + put("setreg", "application/set-registration-initiation") + put("settings", "application/xml") + put("sgimb", "application/x-sgimb") + put("sgml", "text/sgml") + put("sh", "application/x-sh") + put("shar", "application/x-shar") + put("shtml", "text/html") + put("sit", "application/x-stuffit") + put("sitemap", "application/xml") + put("skin", "application/xml") + put("sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12") + put("sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide") + put("slk", "application/vnd.ms-excel") + put("sln", "text/plain") + put("slupkg-ms", "application/x-ms-license") + put("smd", "audio/x-smd") + put("smi", "application/octet-stream") + put("smx", "audio/x-smd") + put("smz", "audio/x-smd") + put("snd", "audio/basic") + put("snippet", "application/xml") + put("snp", "application/octet-stream") + put("sol", "text/plain") + put("sor", "text/plain") + put("spc", "application/x-pkcs7-certificates") + put("spl", "application/futuresplash") + put("spx", "audio/ogg") + put("src", "application/x-wais-source") + put("srf", "text/plain") + put("ssisdeploymentmanifest", "text/xml") + put("ssm", "application/streamingmedia") + put("sst", "application/vnd.ms-pki.certstore") + put("stl", "application/vnd.ms-pki.stl") + put("sv4cpio", "application/x-sv4cpio") + put("sv4crc", "application/x-sv4crc") + put("svc", "application/xml") + put("svg", "image/svg+xml") + put("swf", "application/x-shockwave-flash") + put("t", "application/x-troff") + put("tar", "application/x-tar") + put("tcl", "application/x-tcl") + put("testrunconfig", "application/xml") + put("testsettings", "application/xml") + put("tex", "application/x-tex") + put("texi", "application/x-texinfo") + put("texinfo", "application/x-texinfo") + put("tgz", "application/x-compressed") + put("thmx", "application/vnd.ms-officetheme") + put("thn", "application/octet-stream") + put("tif", "image/tiff") + put("tiff", "image/tiff") + put("tlh", "text/plain") + put("tli", "text/plain") + put("toc", "application/octet-stream") + put("tr", "application/x-troff") + put("trm", "application/x-msterminal") + put("trx", "application/xml") + put("ts", "video/vnd.dlna.mpeg-tts") + put("tsv", "text/tab-separated-values") + put("ttf", "application/font-sfnt") + put("tts", "video/vnd.dlna.mpeg-tts") + put("txt", "text/plain") + put("u32", "application/octet-stream") + put("uls", "text/iuls") + put("user", "text/plain") + put("ustar", "application/x-ustar") + put("vb", "text/plain") + put("vbdproj", "text/plain") + put("vbk", "video/mpeg") + put("vbproj", "text/plain") + put("vbs", "text/vbscript") + put("vcf", "text/x-vcard") + put("vcproj", "application/xml") + put("vcs", "text/calendar") + put("vcxproj", "application/xml") + put("vddproj", "text/plain") + put("vdp", "text/plain") + put("vdproj", "text/plain") + put("vdx", "application/vnd.ms-visio.viewer") + put("vml", "text/xml") + put("vscontent", "application/xml") + put("vsct", "text/xml") + put("vsd", "application/vnd.visio") + put("vsi", "application/ms-vsi") + put("vsix", "application/vsix") + put("vsixlangpack", "text/xml") + put("vsixmanifest", "text/xml") + put("vsmdi", "application/xml") + put("vspscc", "text/plain") + put("vss", "application/vnd.visio") + put("vsscc", "text/plain") + put("vssettings", "text/xml") + put("vssscc", "text/plain") + put("vst", "application/vnd.visio") + put("vstemplate", "text/xml") + put("vsto", "application/x-ms-vsto") + put("vsw", "application/vnd.visio") + put("vsx", "application/vnd.visio") + put("vtx", "application/vnd.visio") + put("wav", "audio/wav") + put("wave", "audio/wav") + put("wax", "audio/x-ms-wax") + put("wbk", "application/msword") + put("wbmp", "image/vnd.wap.wbmp") + put("wcm", "application/vnd.ms-works") + put("wdb", "application/vnd.ms-works") + put("wdp", "image/vnd.ms-photo") + put("webarchive", "application/x-safari-webarchive") + put("webm", "video/webm") + put("webp", "image/webp") + put("webtest", "application/xml") + put("wiq", "application/xml") + put("wiz", "application/msword") + put("wks", "application/vnd.ms-works") + put("wlmp", "application/wlmoviemaker") + put("wlpginstall", "application/x-wlpg-detect") + put("wlpginstall3", "application/x-wlpg3-detect") + put("wm", "video/x-ms-wm") + put("wma", "audio/x-ms-wma") + put("wmd", "application/x-ms-wmd") + put("wmf", "application/x-msmetafile") + put("wml", "text/vnd.wap.wml") + put("wmlc", "application/vnd.wap.wmlc") + put("wmls", "text/vnd.wap.wmlscript") + put("wmlsc", "application/vnd.wap.wmlscriptc") + put("wmp", "video/x-ms-wmp") + put("wmv", "video/x-ms-wmv") + put("wmx", "video/x-ms-wmx") + put("wmz", "application/x-ms-wmz") + put("woff", "application/font-woff") + put("wpl", "application/vnd.ms-wpl") + put("wps", "application/vnd.ms-works") + put("wri", "application/x-mswrite") + put("wrl", "x-world/x-vrml") + put("wrz", "x-world/x-vrml") + put("wsc", "text/scriptlet") + put("wsdl", "text/xml") + put("wvx", "video/x-ms-wvx") + put("x", "application/directx") + put("xaf", "x-world/x-vrml") + put("xaml", "application/xaml+xml") + put("xap", "application/x-silverlight-app") + put("xbap", "application/x-ms-xbap") + put("xbm", "image/x-xbitmap") + put("xdr", "text/plain") + put("xht", "application/xhtml+xml") + put("xhtml", "application/xhtml+xml") + put("xla", "application/vnd.ms-excel") + put("xlam", "application/vnd.ms-excel.addin.macroEnabled.12") + put("xlc", "application/vnd.ms-excel") + put("xld", "application/vnd.ms-excel") + put("xlk", "application/vnd.ms-excel") + put("xll", "application/vnd.ms-excel") + put("xlm", "application/vnd.ms-excel") + put("xls", "application/vnd.ms-excel") + put("xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12") + put("xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12") + put("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + put("xlt", "application/vnd.ms-excel") + put("xltm", "application/vnd.ms-excel.template.macroEnabled.12") + put("xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template") + put("xlw", "application/vnd.ms-excel") + put("xml", "text/xml") + put("xmta", "application/xml") + put("xof", "x-world/x-vrml") + put("xoml", "text/plain") + put("xpm", "image/x-xpixmap") + put("xps", "application/vnd.ms-xpsdocument") + put("xrm-ms", "text/xml") + put("xsc", "application/xml") + put("xsd", "text/xml") + put("xsf", "text/xml") + put("xsl", "text/xml") + put("xslt", "text/xml") + put("xsn", "application/octet-stream") + put("xss", "application/xml") + put("xspf", "application/xspf+xml") + put("xtp", "application/octet-stream") + put("xwd", "image/x-xwindowdump") + put("z", "application/x-compress") + put("zip", "application/zip") + } + + return typesMap[getFilenameExtension().toLowerCase()] ?: "" +} + +fun String.isBlockedNumberPattern() = contains("*") diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TabLayout.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TabLayout.kt new file mode 100644 index 000000000..1ff2a84ed --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TabLayout.kt @@ -0,0 +1,20 @@ +package com.simplemobiletools.commons.extensions + +import com.google.android.material.tabs.TabLayout + +fun TabLayout.onTabSelectionChanged( + tabUnselectedAction: ((inactiveTab: TabLayout.Tab) -> Unit)? = null, + tabSelectedAction: ((activeTab: TabLayout.Tab) -> Unit)? = null +) = setOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + tabSelectedAction?.invoke(tab) + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + tabUnselectedAction?.invoke(tab) + } + + override fun onTabReselected(tab: TabLayout.Tab) { + tabSelectedAction?.invoke(tab) + } +}) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TextView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TextView.kt new file mode 100644 index 000000000..5156790fe --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/TextView.kt @@ -0,0 +1,36 @@ +package com.simplemobiletools.commons.extensions + +import android.graphics.Paint +import android.text.SpannableString +import android.text.TextPaint +import android.text.style.URLSpan +import android.widget.TextView +import androidx.annotation.StringRes + +val TextView.value: String get() = text.toString().trim() + +fun TextView.underlineText() { + paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG +} + +fun TextView.removeUnderlines() { + val spannable = SpannableString(text) + for (u in spannable.getSpans(0, spannable.length, URLSpan::class.java)) { + spannable.setSpan(object : URLSpan(u.url) { + override fun updateDrawState(textPaint: TextPaint) { + super.updateDrawState(textPaint) + textPaint.isUnderlineText = false + } + }, spannable.getSpanStart(u), spannable.getSpanEnd(u), 0) + } + text = spannable +} + +fun TextView.setTextOrBeGone(@StringRes textRes: Int?) { + if (textRes != null) { + beVisible() + this.text = context.getString(textRes) + } else { + beGone() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/View.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/View.kt new file mode 100644 index 000000000..fb7a20003 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/View.kt @@ -0,0 +1,51 @@ +package com.simplemobiletools.commons.extensions + +import android.view.HapticFeedbackConstants +import android.view.View +import android.view.ViewTreeObserver +import com.simplemobiletools.commons.helpers.SHORT_ANIMATION_DURATION + +fun View.beInvisibleIf(beInvisible: Boolean) = if (beInvisible) beInvisible() else beVisible() + +fun View.beVisibleIf(beVisible: Boolean) = if (beVisible) beVisible() else beGone() + +fun View.beGoneIf(beGone: Boolean) = beVisibleIf(!beGone) + +fun View.beInvisible() { + visibility = View.INVISIBLE +} + +fun View.beVisible() { + visibility = View.VISIBLE +} + +fun View.beGone() { + visibility = View.GONE +} + +fun View.onGlobalLayout(callback: () -> Unit) { + viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + if (viewTreeObserver != null) { + viewTreeObserver.removeOnGlobalLayoutListener(this) + callback() + } + } + }) +} + +fun View.isVisible() = visibility == View.VISIBLE + +fun View.isInvisible() = visibility == View.INVISIBLE + +fun View.isGone() = visibility == View.GONE + +fun View.performHapticFeedback() = performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) + +fun View.fadeIn() { + animate().alpha(1f).setDuration(SHORT_ANIMATION_DURATION).withStartAction { beVisible() }.start() +} + +fun View.fadeOut() { + animate().alpha(0f).setDuration(SHORT_ANIMATION_DURATION).withEndAction { beGone() }.start() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ViewPager.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ViewPager.kt new file mode 100644 index 000000000..80f11fd03 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/extensions/ViewPager.kt @@ -0,0 +1,14 @@ +package com.simplemobiletools.commons.extensions + +import androidx.viewpager.widget.ViewPager + +fun ViewPager.onPageChangeListener(pageChangedAction: (newPosition: Int) -> Unit) = + addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) {} + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} + + override fun onPageSelected(position: Int) { + pageChangedAction(position) + } + }) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/fragments/BaseBottomSheetDialogFragment.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/fragments/BaseBottomSheetDialogFragment.kt new file mode 100644 index 000000000..ea2bb840c --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/fragments/BaseBottomSheetDialogFragment.kt @@ -0,0 +1,50 @@ +package com.simplemobiletools.commons.fragments + +import android.graphics.drawable.LayerDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.res.ResourcesCompat +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import kotlinx.android.synthetic.main.dialog_bottom_sheet.view.* + +abstract class BaseBottomSheetDialogFragment : BottomSheetDialogFragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(R.layout.dialog_bottom_sheet, container, false) + val context = requireContext() + val config = context.baseConfig + + if (requireContext().isBlackAndWhiteTheme()) { + view.background = ResourcesCompat.getDrawable(context.resources, R.drawable.bottom_sheet_bg_black, context.theme) + } else if (!config.isUsingSystemTheme) { + view.background = ResourcesCompat.getDrawable(context.resources, R.drawable.bottom_sheet_bg, context.theme).apply { + (this as LayerDrawable).findDrawableByLayerId(R.id.bottom_sheet_background).applyColorFilter(context.getProperBackgroundColor()) + } + } + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val title = arguments?.getInt(BOTTOM_SHEET_TITLE).takeIf { it != 0 } + view.apply { + bottom_sheet_title.setTextColor(context.getProperTextColor()) + bottom_sheet_title.setTextOrBeGone(title) + setupContentView(bottom_sheet_content_holder) + } + } + + abstract fun setupContentView(parent: ViewGroup) + + companion object { + const val BOTTOM_SHEET_TITLE = "title_string" + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/AlphanumericComparator.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/AlphanumericComparator.kt new file mode 100644 index 000000000..9f65eec0e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/AlphanumericComparator.kt @@ -0,0 +1,75 @@ +package com.simplemobiletools.commons.helpers + +// taken from https://gist.github.com/MichaelRocks/1b94bb44c7804e999dbf31dac86955ec +// make IMG_5.jpg come before IMG_10.jpg +class AlphanumericComparator { + fun compare(string1: String, string2: String): Int { + var thisMarker = 0 + var thatMarker = 0 + val s1Length = string1.length + val s2Length = string2.length + + while (thisMarker < s1Length && thatMarker < s2Length) { + val thisChunk = getChunk(string1, s1Length, thisMarker) + thisMarker += thisChunk.length + + val thatChunk = getChunk(string2, s2Length, thatMarker) + thatMarker += thatChunk.length + + // If both chunks contain numeric characters, sort them numerically. + var result: Int + if (isDigit(thisChunk[0]) && isDigit(thatChunk[0])) { + // Simple chunk comparison by length. + val thisChunkLength = thisChunk.length + result = thisChunkLength - thatChunk.length + // If equal, the first different number counts. + if (result == 0) { + for (i in 0 until thisChunkLength) { + result = thisChunk[i] - thatChunk[i] + if (result != 0) { + return result + } + } + } + } else { + result = thisChunk.compareTo(thatChunk) + } + + if (result != 0) { + return result + } + } + + return s1Length - s2Length + } + + private fun getChunk(string: String, length: Int, marker: Int): String { + var current = marker + val chunk = StringBuilder() + var c = string[current] + chunk.append(c) + current++ + if (isDigit(c)) { + while (current < length) { + c = string[current] + if (!isDigit(c)) { + break + } + chunk.append(c) + current++ + } + } else { + while (current < length) { + c = string[current] + if (isDigit(c)) { + break + } + chunk.append(c) + current++ + } + } + return chunk.toString() + } + + private fun isDigit(ch: Char) = ch in '0'..'9' +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BaseConfig.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BaseConfig.kt new file mode 100644 index 000000000..6c51c1207 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BaseConfig.kt @@ -0,0 +1,544 @@ +package com.simplemobiletools.commons.helpers + +import android.content.Context +import android.text.format.DateFormat +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.getInternalStoragePath +import com.simplemobiletools.commons.extensions.getSDCardPath +import com.simplemobiletools.commons.extensions.getSharedPrefs +import java.text.SimpleDateFormat +import java.util.* + +open class BaseConfig(val context: Context) { + protected val prefs = context.getSharedPrefs() + + companion object { + fun newInstance(context: Context) = BaseConfig(context) + } + + var appRunCount: Int + get() = prefs.getInt(APP_RUN_COUNT, 0) + set(appRunCount) = prefs.edit().putInt(APP_RUN_COUNT, appRunCount).apply() + + var lastVersion: Int + get() = prefs.getInt(LAST_VERSION, 0) + set(lastVersion) = prefs.edit().putInt(LAST_VERSION, lastVersion).apply() + + var primaryAndroidDataTreeUri: String + get() = prefs.getString(PRIMARY_ANDROID_DATA_TREE_URI, "")!! + set(uri) = prefs.edit().putString(PRIMARY_ANDROID_DATA_TREE_URI, uri).apply() + + var sdAndroidDataTreeUri: String + get() = prefs.getString(SD_ANDROID_DATA_TREE_URI, "")!! + set(uri) = prefs.edit().putString(SD_ANDROID_DATA_TREE_URI, uri).apply() + + var otgAndroidDataTreeUri: String + get() = prefs.getString(OTG_ANDROID_DATA_TREE_URI, "")!! + set(uri) = prefs.edit().putString(OTG_ANDROID_DATA_TREE_URI, uri).apply() + + var primaryAndroidObbTreeUri: String + get() = prefs.getString(PRIMARY_ANDROID_OBB_TREE_URI, "")!! + set(uri) = prefs.edit().putString(PRIMARY_ANDROID_OBB_TREE_URI, uri).apply() + + var sdAndroidObbTreeUri: String + get() = prefs.getString(SD_ANDROID_OBB_TREE_URI, "")!! + set(uri) = prefs.edit().putString(SD_ANDROID_OBB_TREE_URI, uri).apply() + + var otgAndroidObbTreeUri: String + get() = prefs.getString(OTG_ANDROID_OBB_TREE_URI, "")!! + set(uri) = prefs.edit().putString(OTG_ANDROID_OBB_TREE_URI, uri).apply() + + var sdTreeUri: String + get() = prefs.getString(SD_TREE_URI, "")!! + set(uri) = prefs.edit().putString(SD_TREE_URI, uri).apply() + + var OTGTreeUri: String + get() = prefs.getString(OTG_TREE_URI, "")!! + set(OTGTreeUri) = prefs.edit().putString(OTG_TREE_URI, OTGTreeUri).apply() + + var OTGPartition: String + get() = prefs.getString(OTG_PARTITION, "")!! + set(OTGPartition) = prefs.edit().putString(OTG_PARTITION, OTGPartition).apply() + + var OTGPath: String + get() = prefs.getString(OTG_REAL_PATH, "")!! + set(OTGPath) = prefs.edit().putString(OTG_REAL_PATH, OTGPath).apply() + + var sdCardPath: String + get() = prefs.getString(SD_CARD_PATH, getDefaultSDCardPath())!! + set(sdCardPath) = prefs.edit().putString(SD_CARD_PATH, sdCardPath).apply() + + private fun getDefaultSDCardPath() = if (prefs.contains(SD_CARD_PATH)) "" else context.getSDCardPath() + + var internalStoragePath: String + get() = prefs.getString(INTERNAL_STORAGE_PATH, getDefaultInternalPath())!! + set(internalStoragePath) = prefs.edit().putString(INTERNAL_STORAGE_PATH, internalStoragePath).apply() + + private fun getDefaultInternalPath() = if (prefs.contains(INTERNAL_STORAGE_PATH)) "" else context.getInternalStoragePath() + + var textColor: Int + get() = prefs.getInt(TEXT_COLOR, context.resources.getColor(R.color.default_text_color)) + set(textColor) = prefs.edit().putInt(TEXT_COLOR, textColor).apply() + + var backgroundColor: Int + get() = prefs.getInt(BACKGROUND_COLOR, context.resources.getColor(R.color.default_background_color)) + set(backgroundColor) = prefs.edit().putInt(BACKGROUND_COLOR, backgroundColor).apply() + + var primaryColor: Int + get() = prefs.getInt(PRIMARY_COLOR, context.resources.getColor(R.color.default_primary_color)) + set(primaryColor) = prefs.edit().putInt(PRIMARY_COLOR, primaryColor).apply() + + var accentColor: Int + get() = prefs.getInt(ACCENT_COLOR, context.resources.getColor(R.color.default_accent_color)) + set(accentColor) = prefs.edit().putInt(ACCENT_COLOR, accentColor).apply() + + var lastHandledShortcutColor: Int + get() = prefs.getInt(LAST_HANDLED_SHORTCUT_COLOR, 1) + set(lastHandledShortcutColor) = prefs.edit().putInt(LAST_HANDLED_SHORTCUT_COLOR, lastHandledShortcutColor).apply() + + var appIconColor: Int + get() = prefs.getInt(APP_ICON_COLOR, context.resources.getColor(R.color.default_app_icon_color)) + set(appIconColor) { + isUsingModifiedAppIcon = appIconColor != context.resources.getColor(R.color.color_primary) + prefs.edit().putInt(APP_ICON_COLOR, appIconColor).apply() + } + + var lastIconColor: Int + get() = prefs.getInt(LAST_ICON_COLOR, context.resources.getColor(R.color.color_primary)) + set(lastIconColor) = prefs.edit().putInt(LAST_ICON_COLOR, lastIconColor).apply() + + var customTextColor: Int + get() = prefs.getInt(CUSTOM_TEXT_COLOR, textColor) + set(customTextColor) = prefs.edit().putInt(CUSTOM_TEXT_COLOR, customTextColor).apply() + + var customBackgroundColor: Int + get() = prefs.getInt(CUSTOM_BACKGROUND_COLOR, backgroundColor) + set(customBackgroundColor) = prefs.edit().putInt(CUSTOM_BACKGROUND_COLOR, customBackgroundColor).apply() + + var customPrimaryColor: Int + get() = prefs.getInt(CUSTOM_PRIMARY_COLOR, primaryColor) + set(customPrimaryColor) = prefs.edit().putInt(CUSTOM_PRIMARY_COLOR, customPrimaryColor).apply() + + var customAccentColor: Int + get() = prefs.getInt(CUSTOM_ACCENT_COLOR, accentColor) + set(customAccentColor) = prefs.edit().putInt(CUSTOM_ACCENT_COLOR, customAccentColor).apply() + + var customAppIconColor: Int + get() = prefs.getInt(CUSTOM_APP_ICON_COLOR, appIconColor) + set(customAppIconColor) = prefs.edit().putInt(CUSTOM_APP_ICON_COLOR, customAppIconColor).apply() + + var widgetBgColor: Int + get() = prefs.getInt(WIDGET_BG_COLOR, context.resources.getColor(R.color.default_widget_bg_color)) + set(widgetBgColor) = prefs.edit().putInt(WIDGET_BG_COLOR, widgetBgColor).apply() + + var widgetTextColor: Int + get() = prefs.getInt(WIDGET_TEXT_COLOR, context.resources.getColor(R.color.default_widget_text_color)) + set(widgetTextColor) = prefs.edit().putInt(WIDGET_TEXT_COLOR, widgetTextColor).apply() + + // hidden folder visibility protection + var isHiddenPasswordProtectionOn: Boolean + get() = prefs.getBoolean(PASSWORD_PROTECTION, false) + set(isHiddenPasswordProtectionOn) = prefs.edit().putBoolean(PASSWORD_PROTECTION, isHiddenPasswordProtectionOn).apply() + + var hiddenPasswordHash: String + get() = prefs.getString(PASSWORD_HASH, "")!! + set(hiddenPasswordHash) = prefs.edit().putString(PASSWORD_HASH, hiddenPasswordHash).apply() + + var hiddenProtectionType: Int + get() = prefs.getInt(PROTECTION_TYPE, PROTECTION_PATTERN) + set(hiddenProtectionType) = prefs.edit().putInt(PROTECTION_TYPE, hiddenProtectionType).apply() + + // whole app launch protection + var isAppPasswordProtectionOn: Boolean + get() = prefs.getBoolean(APP_PASSWORD_PROTECTION, false) + set(isAppPasswordProtectionOn) = prefs.edit().putBoolean(APP_PASSWORD_PROTECTION, isAppPasswordProtectionOn).apply() + + var appPasswordHash: String + get() = prefs.getString(APP_PASSWORD_HASH, "")!! + set(appPasswordHash) = prefs.edit().putString(APP_PASSWORD_HASH, appPasswordHash).apply() + + var appProtectionType: Int + get() = prefs.getInt(APP_PROTECTION_TYPE, PROTECTION_PATTERN) + set(appProtectionType) = prefs.edit().putInt(APP_PROTECTION_TYPE, appProtectionType).apply() + + // file delete and move protection + var isDeletePasswordProtectionOn: Boolean + get() = prefs.getBoolean(DELETE_PASSWORD_PROTECTION, false) + set(isDeletePasswordProtectionOn) = prefs.edit().putBoolean(DELETE_PASSWORD_PROTECTION, isDeletePasswordProtectionOn).apply() + + var deletePasswordHash: String + get() = prefs.getString(DELETE_PASSWORD_HASH, "")!! + set(deletePasswordHash) = prefs.edit().putString(DELETE_PASSWORD_HASH, deletePasswordHash).apply() + + var deleteProtectionType: Int + get() = prefs.getInt(DELETE_PROTECTION_TYPE, PROTECTION_PATTERN) + set(deleteProtectionType) = prefs.edit().putInt(DELETE_PROTECTION_TYPE, deleteProtectionType).apply() + + // folder locking + fun addFolderProtection(path: String, hash: String, type: Int) { + prefs.edit() + .putString("$PROTECTED_FOLDER_HASH$path", hash) + .putInt("$PROTECTED_FOLDER_TYPE$path", type) + .apply() + } + + fun removeFolderProtection(path: String) { + prefs.edit() + .remove("$PROTECTED_FOLDER_HASH$path") + .remove("$PROTECTED_FOLDER_TYPE$path") + .apply() + } + + fun isFolderProtected(path: String) = getFolderProtectionType(path) != PROTECTION_NONE + + fun getFolderProtectionHash(path: String) = prefs.getString("$PROTECTED_FOLDER_HASH$path", "") ?: "" + + fun getFolderProtectionType(path: String) = prefs.getInt("$PROTECTED_FOLDER_TYPE$path", PROTECTION_NONE) + + var keepLastModified: Boolean + get() = prefs.getBoolean(KEEP_LAST_MODIFIED, true) + set(keepLastModified) = prefs.edit().putBoolean(KEEP_LAST_MODIFIED, keepLastModified).apply() + + var useEnglish: Boolean + get() = prefs.getBoolean(USE_ENGLISH, false) + set(useEnglish) { + wasUseEnglishToggled = true + prefs.edit().putBoolean(USE_ENGLISH, useEnglish).commit() + } + + var wasUseEnglishToggled: Boolean + get() = prefs.getBoolean(WAS_USE_ENGLISH_TOGGLED, false) + set(wasUseEnglishToggled) = prefs.edit().putBoolean(WAS_USE_ENGLISH_TOGGLED, wasUseEnglishToggled).apply() + + var wasSharedThemeEverActivated: Boolean + get() = prefs.getBoolean(WAS_SHARED_THEME_EVER_ACTIVATED, false) + set(wasSharedThemeEverActivated) = prefs.edit().putBoolean(WAS_SHARED_THEME_EVER_ACTIVATED, wasSharedThemeEverActivated).apply() + + var isUsingSharedTheme: Boolean + get() = prefs.getBoolean(IS_USING_SHARED_THEME, false) + set(isUsingSharedTheme) = prefs.edit().putBoolean(IS_USING_SHARED_THEME, isUsingSharedTheme).apply() + + // used by Simple Thank You, stop using shared Shared Theme if it has been changed in it + var shouldUseSharedTheme: Boolean + get() = prefs.getBoolean(SHOULD_USE_SHARED_THEME, false) + set(shouldUseSharedTheme) = prefs.edit().putBoolean(SHOULD_USE_SHARED_THEME, shouldUseSharedTheme).apply() + + var isUsingAutoTheme: Boolean + get() = prefs.getBoolean(IS_USING_AUTO_THEME, false) + set(isUsingAutoTheme) = prefs.edit().putBoolean(IS_USING_AUTO_THEME, isUsingAutoTheme).apply() + + var isUsingSystemTheme: Boolean + get() = prefs.getBoolean(IS_USING_SYSTEM_THEME, isSPlus()) + set(isUsingSystemTheme) = prefs.edit().putBoolean(IS_USING_SYSTEM_THEME, isUsingSystemTheme).apply() + + var wasCustomThemeSwitchDescriptionShown: Boolean + get() = prefs.getBoolean(WAS_CUSTOM_THEME_SWITCH_DESCRIPTION_SHOWN, false) + set(wasCustomThemeSwitchDescriptionShown) = prefs.edit().putBoolean(WAS_CUSTOM_THEME_SWITCH_DESCRIPTION_SHOWN, wasCustomThemeSwitchDescriptionShown) + .apply() + + var wasSharedThemeForced: Boolean + get() = prefs.getBoolean(WAS_SHARED_THEME_FORCED, false) + set(wasSharedThemeForced) = prefs.edit().putBoolean(WAS_SHARED_THEME_FORCED, wasSharedThemeForced).apply() + + var showInfoBubble: Boolean + get() = prefs.getBoolean(SHOW_INFO_BUBBLE, true) + set(showInfoBubble) = prefs.edit().putBoolean(SHOW_INFO_BUBBLE, showInfoBubble).apply() + + var lastConflictApplyToAll: Boolean + get() = prefs.getBoolean(LAST_CONFLICT_APPLY_TO_ALL, true) + set(lastConflictApplyToAll) = prefs.edit().putBoolean(LAST_CONFLICT_APPLY_TO_ALL, lastConflictApplyToAll).apply() + + var lastConflictResolution: Int + get() = prefs.getInt(LAST_CONFLICT_RESOLUTION, CONFLICT_SKIP) + set(lastConflictResolution) = prefs.edit().putInt(LAST_CONFLICT_RESOLUTION, lastConflictResolution).apply() + + var sorting: Int + get() = prefs.getInt(SORT_ORDER, context.resources.getInteger(R.integer.default_sorting)) + set(sorting) = prefs.edit().putInt(SORT_ORDER, sorting).apply() + + fun saveCustomSorting(path: String, value: Int) { + if (path.isEmpty()) { + sorting = value + } else { + prefs.edit().putInt(SORT_FOLDER_PREFIX + path.toLowerCase(), value).apply() + } + } + + fun getFolderSorting(path: String) = prefs.getInt(SORT_FOLDER_PREFIX + path.toLowerCase(), sorting) + + fun removeCustomSorting(path: String) { + prefs.edit().remove(SORT_FOLDER_PREFIX + path.toLowerCase()).apply() + } + + fun hasCustomSorting(path: String) = prefs.contains(SORT_FOLDER_PREFIX + path.toLowerCase()) + + var hadThankYouInstalled: Boolean + get() = prefs.getBoolean(HAD_THANK_YOU_INSTALLED, false) + set(hadThankYouInstalled) = prefs.edit().putBoolean(HAD_THANK_YOU_INSTALLED, hadThankYouInstalled).apply() + + var skipDeleteConfirmation: Boolean + get() = prefs.getBoolean(SKIP_DELETE_CONFIRMATION, false) + set(skipDeleteConfirmation) = prefs.edit().putBoolean(SKIP_DELETE_CONFIRMATION, skipDeleteConfirmation).apply() + + var enablePullToRefresh: Boolean + get() = prefs.getBoolean(ENABLE_PULL_TO_REFRESH, true) + set(enablePullToRefresh) = prefs.edit().putBoolean(ENABLE_PULL_TO_REFRESH, enablePullToRefresh).apply() + + var scrollHorizontally: Boolean + get() = prefs.getBoolean(SCROLL_HORIZONTALLY, false) + set(scrollHorizontally) = prefs.edit().putBoolean(SCROLL_HORIZONTALLY, scrollHorizontally).apply() + + var preventPhoneFromSleeping: Boolean + get() = prefs.getBoolean(PREVENT_PHONE_FROM_SLEEPING, true) + set(preventPhoneFromSleeping) = prefs.edit().putBoolean(PREVENT_PHONE_FROM_SLEEPING, preventPhoneFromSleeping).apply() + + var lastUsedViewPagerPage: Int + get() = prefs.getInt(LAST_USED_VIEW_PAGER_PAGE, context.resources.getInteger(R.integer.default_viewpager_page)) + set(lastUsedViewPagerPage) = prefs.edit().putInt(LAST_USED_VIEW_PAGER_PAGE, lastUsedViewPagerPage).apply() + + var use24HourFormat: Boolean + get() = prefs.getBoolean(USE_24_HOUR_FORMAT, DateFormat.is24HourFormat(context)) + set(use24HourFormat) = prefs.edit().putBoolean(USE_24_HOUR_FORMAT, use24HourFormat).apply() + + var isSundayFirst: Boolean + get() { + val isSundayFirst = Calendar.getInstance(Locale.getDefault()).firstDayOfWeek == Calendar.SUNDAY + return prefs.getBoolean(SUNDAY_FIRST, isSundayFirst) + } + set(sundayFirst) = prefs.edit().putBoolean(SUNDAY_FIRST, sundayFirst).apply() + + var wasAlarmWarningShown: Boolean + get() = prefs.getBoolean(WAS_ALARM_WARNING_SHOWN, false) + set(wasAlarmWarningShown) = prefs.edit().putBoolean(WAS_ALARM_WARNING_SHOWN, wasAlarmWarningShown).apply() + + var wasReminderWarningShown: Boolean + get() = prefs.getBoolean(WAS_REMINDER_WARNING_SHOWN, false) + set(wasReminderWarningShown) = prefs.edit().putBoolean(WAS_REMINDER_WARNING_SHOWN, wasReminderWarningShown).apply() + + var useSameSnooze: Boolean + get() = prefs.getBoolean(USE_SAME_SNOOZE, true) + set(useSameSnooze) = prefs.edit().putBoolean(USE_SAME_SNOOZE, useSameSnooze).apply() + + var snoozeTime: Int + get() = prefs.getInt(SNOOZE_TIME, 10) + set(snoozeDelay) = prefs.edit().putInt(SNOOZE_TIME, snoozeDelay).apply() + + var vibrateOnButtonPress: Boolean + get() = prefs.getBoolean(VIBRATE_ON_BUTTON_PRESS, context.resources.getBoolean(R.bool.default_vibrate_on_press)) + set(vibrateOnButton) = prefs.edit().putBoolean(VIBRATE_ON_BUTTON_PRESS, vibrateOnButton).apply() + + var yourAlarmSounds: String + get() = prefs.getString(YOUR_ALARM_SOUNDS, "")!! + set(yourAlarmSounds) = prefs.edit().putString(YOUR_ALARM_SOUNDS, yourAlarmSounds).apply() + + var isUsingModifiedAppIcon: Boolean + get() = prefs.getBoolean(IS_USING_MODIFIED_APP_ICON, false) + set(isUsingModifiedAppIcon) = prefs.edit().putBoolean(IS_USING_MODIFIED_APP_ICON, isUsingModifiedAppIcon).apply() + + var appId: String + get() = prefs.getString(APP_ID, "")!! + set(appId) = prefs.edit().putString(APP_ID, appId).apply() + + var initialWidgetHeight: Int + get() = prefs.getInt(INITIAL_WIDGET_HEIGHT, 0) + set(initialWidgetHeight) = prefs.edit().putInt(INITIAL_WIDGET_HEIGHT, initialWidgetHeight).apply() + + var widgetIdToMeasure: Int + get() = prefs.getInt(WIDGET_ID_TO_MEASURE, 0) + set(widgetIdToMeasure) = prefs.edit().putInt(WIDGET_ID_TO_MEASURE, widgetIdToMeasure).apply() + + var wasOrangeIconChecked: Boolean + get() = prefs.getBoolean(WAS_ORANGE_ICON_CHECKED, false) + set(wasOrangeIconChecked) = prefs.edit().putBoolean(WAS_ORANGE_ICON_CHECKED, wasOrangeIconChecked).apply() + + var wasAppOnSDShown: Boolean + get() = prefs.getBoolean(WAS_APP_ON_SD_SHOWN, false) + set(wasAppOnSDShown) = prefs.edit().putBoolean(WAS_APP_ON_SD_SHOWN, wasAppOnSDShown).apply() + + var wasBeforeAskingShown: Boolean + get() = prefs.getBoolean(WAS_BEFORE_ASKING_SHOWN, false) + set(wasBeforeAskingShown) = prefs.edit().putBoolean(WAS_BEFORE_ASKING_SHOWN, wasBeforeAskingShown).apply() + + var wasBeforeRateShown: Boolean + get() = prefs.getBoolean(WAS_BEFORE_RATE_SHOWN, false) + set(wasBeforeRateShown) = prefs.edit().putBoolean(WAS_BEFORE_RATE_SHOWN, wasBeforeRateShown).apply() + + var wasInitialUpgradeToProShown: Boolean + get() = prefs.getBoolean(WAS_INITIAL_UPGRADE_TO_PRO_SHOWN, false) + set(wasInitialUpgradeToProShown) = prefs.edit().putBoolean(WAS_INITIAL_UPGRADE_TO_PRO_SHOWN, wasInitialUpgradeToProShown).apply() + + var wasAppIconCustomizationWarningShown: Boolean + get() = prefs.getBoolean(WAS_APP_ICON_CUSTOMIZATION_WARNING_SHOWN, false) + set(wasAppIconCustomizationWarningShown) = prefs.edit().putBoolean(WAS_APP_ICON_CUSTOMIZATION_WARNING_SHOWN, wasAppIconCustomizationWarningShown) + .apply() + + var appSideloadingStatus: Int + get() = prefs.getInt(APP_SIDELOADING_STATUS, SIDELOADING_UNCHECKED) + set(appSideloadingStatus) = prefs.edit().putInt(APP_SIDELOADING_STATUS, appSideloadingStatus).apply() + + var dateFormat: String + get() = prefs.getString(DATE_FORMAT, getDefaultDateFormat())!! + set(dateFormat) = prefs.edit().putString(DATE_FORMAT, dateFormat).apply() + + private fun getDefaultDateFormat(): String { + val format = DateFormat.getDateFormat(context) + val pattern = (format as SimpleDateFormat).toLocalizedPattern() + return when (pattern.toLowerCase().replace(" ", "")) { + "d.M.y" -> DATE_FORMAT_ONE + "dd/mm/y" -> DATE_FORMAT_TWO + "mm/dd/y" -> DATE_FORMAT_THREE + "y-mm-dd" -> DATE_FORMAT_FOUR + "dmmmmy" -> DATE_FORMAT_FIVE + "mmmmdy" -> DATE_FORMAT_SIX + "mm-dd-y" -> DATE_FORMAT_SEVEN + "dd-mm-y" -> DATE_FORMAT_EIGHT + else -> DATE_FORMAT_ONE + } + } + + var wasOTGHandled: Boolean + get() = prefs.getBoolean(WAS_OTG_HANDLED, false) + set(wasOTGHandled) = prefs.edit().putBoolean(WAS_OTG_HANDLED, wasOTGHandled).apply() + + var wasUpgradedFromFreeShown: Boolean + get() = prefs.getBoolean(WAS_UPGRADED_FROM_FREE_SHOWN, false) + set(wasUpgradedFromFreeShown) = prefs.edit().putBoolean(WAS_UPGRADED_FROM_FREE_SHOWN, wasUpgradedFromFreeShown).apply() + + var wasRateUsPromptShown: Boolean + get() = prefs.getBoolean(WAS_RATE_US_PROMPT_SHOWN, false) + set(wasRateUsPromptShown) = prefs.edit().putBoolean(WAS_RATE_US_PROMPT_SHOWN, wasRateUsPromptShown).apply() + + var wasAppRated: Boolean + get() = prefs.getBoolean(WAS_APP_RATED, false) + set(wasAppRated) = prefs.edit().putBoolean(WAS_APP_RATED, wasAppRated).apply() + + var wasSortingByNumericValueAdded: Boolean + get() = prefs.getBoolean(WAS_SORTING_BY_NUMERIC_VALUE_ADDED, false) + set(wasSortingByNumericValueAdded) = prefs.edit().putBoolean(WAS_SORTING_BY_NUMERIC_VALUE_ADDED, wasSortingByNumericValueAdded).apply() + + var wasFolderLockingNoticeShown: Boolean + get() = prefs.getBoolean(WAS_FOLDER_LOCKING_NOTICE_SHOWN, false) + set(wasFolderLockingNoticeShown) = prefs.edit().putBoolean(WAS_FOLDER_LOCKING_NOTICE_SHOWN, wasFolderLockingNoticeShown).apply() + + var lastRenameUsed: Int + get() = prefs.getInt(LAST_RENAME_USED, RENAME_SIMPLE) + set(lastRenameUsed) = prefs.edit().putInt(LAST_RENAME_USED, lastRenameUsed).apply() + + var lastRenamePatternUsed: String + get() = prefs.getString(LAST_RENAME_PATTERN_USED, "")!! + set(lastRenamePatternUsed) = prefs.edit().putString(LAST_RENAME_PATTERN_USED, lastRenamePatternUsed).apply() + + var lastExportedSettingsFolder: String + get() = prefs.getString(LAST_EXPORTED_SETTINGS_FOLDER, "")!! + set(lastExportedSettingsFolder) = prefs.edit().putString(LAST_EXPORTED_SETTINGS_FOLDER, lastExportedSettingsFolder).apply() + + var lastBlockedNumbersExportPath: String + get() = prefs.getString(LAST_BLOCKED_NUMBERS_EXPORT_PATH, "")!! + set(lastBlockedNumbersExportPath) = prefs.edit().putString(LAST_BLOCKED_NUMBERS_EXPORT_PATH, lastBlockedNumbersExportPath).apply() + + var blockUnknownNumbers: Boolean + get() = prefs.getBoolean(BLOCK_UNKNOWN_NUMBERS, false) + set(blockUnknownNumbers) = prefs.edit().putBoolean(BLOCK_UNKNOWN_NUMBERS, blockUnknownNumbers).apply() + + var fontSize: Int + get() = prefs.getInt(FONT_SIZE, context.resources.getInteger(R.integer.default_font_size)) + set(size) = prefs.edit().putInt(FONT_SIZE, size).apply() + + // notify the users about new SMS Messenger and Voice Recorder released + var wasMessengerRecorderShown: Boolean + get() = prefs.getBoolean(WAS_MESSENGER_RECORDER_SHOWN, false) + set(wasMessengerRecorderShown) = prefs.edit().putBoolean(WAS_MESSENGER_RECORDER_SHOWN, wasMessengerRecorderShown).apply() + + var defaultTab: Int + get() = prefs.getInt(DEFAULT_TAB, TAB_LAST_USED) + set(defaultTab) = prefs.edit().putInt(DEFAULT_TAB, defaultTab).apply() + + var startNameWithSurname: Boolean + get() = prefs.getBoolean(START_NAME_WITH_SURNAME, false) + set(startNameWithSurname) = prefs.edit().putBoolean(START_NAME_WITH_SURNAME, startNameWithSurname).apply() + + var favorites: MutableSet + get() = prefs.getStringSet(FAVORITES, HashSet())!! + set(favorites) = prefs.edit().remove(FAVORITES).putStringSet(FAVORITES, favorites).apply() + + var showCallConfirmation: Boolean + get() = prefs.getBoolean(SHOW_CALL_CONFIRMATION, false) + set(showCallConfirmation) = prefs.edit().putBoolean(SHOW_CALL_CONFIRMATION, showCallConfirmation).apply() + + // color picker last used colors + var colorPickerRecentColors: LinkedList + get(): LinkedList { + val defaultList = arrayListOf( + context.resources.getColor(R.color.md_red_700), + context.resources.getColor(R.color.md_blue_700), + context.resources.getColor(R.color.md_green_700), + context.resources.getColor(R.color.md_yellow_700), + context.resources.getColor(R.color.md_orange_700) + ) + return LinkedList(prefs.getString(COLOR_PICKER_RECENT_COLORS, null)?.lines()?.map { it.toInt() } ?: defaultList) + } + set(recentColors) = prefs.edit().putString(COLOR_PICKER_RECENT_COLORS, recentColors.joinToString(separator = "\n")).apply() + + var ignoredContactSources: HashSet + get() = prefs.getStringSet(IGNORED_CONTACT_SOURCES, hashSetOf(".")) as HashSet + set(ignoreContactSources) = prefs.edit().remove(IGNORED_CONTACT_SOURCES).putStringSet(IGNORED_CONTACT_SOURCES, ignoreContactSources).apply() + + var showContactThumbnails: Boolean + get() = prefs.getBoolean(SHOW_CONTACT_THUMBNAILS, true) + set(showContactThumbnails) = prefs.edit().putBoolean(SHOW_CONTACT_THUMBNAILS, showContactThumbnails).apply() + + var showPhoneNumbers: Boolean + get() = prefs.getBoolean(SHOW_PHONE_NUMBERS, false) + set(showPhoneNumbers) = prefs.edit().putBoolean(SHOW_PHONE_NUMBERS, showPhoneNumbers).apply() + + var showOnlyContactsWithNumbers: Boolean + get() = prefs.getBoolean(SHOW_ONLY_CONTACTS_WITH_NUMBERS, false) + set(showOnlyContactsWithNumbers) = prefs.edit().putBoolean(SHOW_ONLY_CONTACTS_WITH_NUMBERS, showOnlyContactsWithNumbers).apply() + + var lastUsedContactSource: String + get() = prefs.getString(LAST_USED_CONTACT_SOURCE, "")!! + set(lastUsedContactSource) = prefs.edit().putString(LAST_USED_CONTACT_SOURCE, lastUsedContactSource).apply() + + var onContactClick: Int + get() = prefs.getInt(ON_CONTACT_CLICK, ON_CLICK_VIEW_CONTACT) + set(onContactClick) = prefs.edit().putInt(ON_CONTACT_CLICK, onContactClick).apply() + + var showContactFields: Int + get() = prefs.getInt( + SHOW_CONTACT_FIELDS, + SHOW_FIRST_NAME_FIELD or SHOW_SURNAME_FIELD or SHOW_PHONE_NUMBERS_FIELD or SHOW_EMAILS_FIELD or + SHOW_ADDRESSES_FIELD or SHOW_EVENTS_FIELD or SHOW_NOTES_FIELD or SHOW_GROUPS_FIELD or SHOW_CONTACT_SOURCE_FIELD + ) + set(showContactFields) = prefs.edit().putInt(SHOW_CONTACT_FIELDS, showContactFields).apply() + var showDialpadButton: Boolean + get() = prefs.getBoolean(SHOW_DIALPAD_BUTTON, true) + set(showDialpadButton) = prefs.edit().putBoolean(SHOW_DIALPAD_BUTTON, showDialpadButton).apply() + + var wasLocalAccountInitialized: Boolean + get() = prefs.getBoolean(WAS_LOCAL_ACCOUNT_INITIALIZED, false) + set(wasLocalAccountInitialized) = prefs.edit().putBoolean(WAS_LOCAL_ACCOUNT_INITIALIZED, wasLocalAccountInitialized).apply() + + var lastExportPath: String + get() = prefs.getString(LAST_EXPORT_PATH, "")!! + set(lastExportPath) = prefs.edit().putString(LAST_EXPORT_PATH, lastExportPath).apply() + + var speedDial: String + get() = prefs.getString(SPEED_DIAL, "")!! + set(speedDial) = prefs.edit().putString(SPEED_DIAL, speedDial).apply() + + var showPrivateContacts: Boolean + get() = prefs.getBoolean(SHOW_PRIVATE_CONTACTS, true) + set(showPrivateContacts) = prefs.edit().putBoolean(SHOW_PRIVATE_CONTACTS, showPrivateContacts).apply() + + var mergeDuplicateContacts: Boolean + get() = prefs.getBoolean(MERGE_DUPLICATE_CONTACTS, true) + set(mergeDuplicateContacts) = prefs.edit().putBoolean(MERGE_DUPLICATE_CONTACTS, mergeDuplicateContacts).apply() + + var favoritesContactsOrder: String + get() = prefs.getString(FAVORITES_CONTACTS_ORDER, "")!! + set(order) = prefs.edit().putString(FAVORITES_CONTACTS_ORDER, order).apply() + + var isCustomOrderSelected: Boolean + get() = prefs.getBoolean(FAVORITES_CUSTOM_ORDER_SELECTED, false) + set(selected) = prefs.edit().putBoolean(FAVORITES_CUSTOM_ORDER_SELECTED, selected).apply() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersExporter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersExporter.kt new file mode 100644 index 000000000..aff78c5da --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersExporter.kt @@ -0,0 +1,33 @@ +package com.simplemobiletools.commons.helpers + +import com.simplemobiletools.commons.models.BlockedNumber +import java.io.OutputStream +import java.util.ArrayList + +class BlockedNumbersExporter { + enum class ExportResult { + EXPORT_FAIL, EXPORT_OK + } + + fun exportBlockedNumbers( + blockedNumbers: ArrayList, + outputStream: OutputStream?, + callback: (result: ExportResult) -> Unit, + ) { + if (outputStream == null) { + callback.invoke(ExportResult.EXPORT_FAIL) + return + } + + try { + outputStream.bufferedWriter().use { out -> + out.write(blockedNumbers.joinToString(BLOCKED_NUMBERS_EXPORT_DELIMITER) { + it.number + }) + } + callback.invoke(ExportResult.EXPORT_OK) + } catch (e: Exception) { + callback.invoke(ExportResult.EXPORT_FAIL) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersImporter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersImporter.kt new file mode 100644 index 000000000..d449deaae --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/BlockedNumbersImporter.kt @@ -0,0 +1,37 @@ +package com.simplemobiletools.commons.helpers + +import android.telephony.PhoneNumberUtils +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.addBlockedNumber +import com.simplemobiletools.commons.extensions.showErrorToast +import java.io.File + +class BlockedNumbersImporter( + private val activity: BaseSimpleActivity, +) { + enum class ImportResult { + IMPORT_FAIL, IMPORT_OK + } + + fun importBlockedNumbers(path: String): ImportResult { + return try { + val inputStream = File(path).inputStream() + val numbers = inputStream.bufferedReader().use { + val content = it.readText().trimEnd().split(BLOCKED_NUMBERS_EXPORT_DELIMITER) + content.filter { text -> PhoneNumberUtils.isGlobalPhoneNumber(text) } + } + if (numbers.isNotEmpty()) { + numbers.forEach { number -> + activity.addBlockedNumber(number) + } + ImportResult.IMPORT_OK + } else { + ImportResult.IMPORT_FAIL + } + + } catch (e: Exception) { + activity.showErrorToast(e) + ImportResult.IMPORT_FAIL + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Constants.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Constants.kt new file mode 100644 index 000000000..a540e4cc1 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Constants.kt @@ -0,0 +1,629 @@ +package com.simplemobiletools.commons.helpers + +import android.content.Context +import android.graphics.drawable.Drawable +import android.os.Build +import android.os.Looper +import android.provider.ContactsContract +import android.util.Log +import androidx.annotation.ChecksSdkIntAtLeast +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.normalizeString +import com.simplemobiletools.commons.models.contacts.LocalContact +import com.simplemobiletools.commons.overloads.times + +const val EXTERNAL_STORAGE_PROVIDER_AUTHORITY = "com.android.externalstorage.documents" +const val EXTRA_SHOW_ADVANCED = "android.content.extra.SHOW_ADVANCED" + +const val APP_NAME = "app_name" +const val APP_LICENSES = "app_licenses" +const val APP_FAQ = "app_faq" +const val APP_VERSION_NAME = "app_version_name" +const val APP_ICON_IDS = "app_icon_ids" +const val APP_ID = "app_id" +const val APP_LAUNCHER_NAME = "app_launcher_name" +const val REAL_FILE_PATH = "real_file_path_2" +const val IS_FROM_GALLERY = "is_from_gallery" +const val BROADCAST_REFRESH_MEDIA = "com.simplemobiletools.REFRESH_MEDIA" +const val REFRESH_PATH = "refresh_path" +const val IS_CUSTOMIZING_COLORS = "is_customizing_colors" +const val BLOCKED_NUMBERS_EXPORT_DELIMITER = "," +const val BLOCKED_NUMBERS_EXPORT_EXTENSION = ".txt" +const val NOMEDIA = ".nomedia" +const val YOUR_ALARM_SOUNDS_MIN_ID = 1000 +const val SHOW_FAQ_BEFORE_MAIL = "show_faq_before_mail" +const val CHOPPED_LIST_DEFAULT_SIZE = 50 +const val SAVE_DISCARD_PROMPT_INTERVAL = 1000L +const val SD_OTG_PATTERN = "^/storage/[A-Za-z0-9]{4}-[A-Za-z0-9]{4}$" +const val SD_OTG_SHORT = "^[A-Za-z0-9]{4}-[A-Za-z0-9]{4}$" +const val KEY_PHONE = "phone" +const val KEY_MAILTO = "mailto" +const val CONTACT_ID = "contact_id" +const val IS_PRIVATE = "is_private" +const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps +const val FIRST_GROUP_ID = 10000L +const val MD5 = "MD5" +const val SHORT_ANIMATION_DURATION = 150L +val DARK_GREY = 0xFF333333.toInt() + +const val LOWER_ALPHA = 0.25f +const val MEDIUM_ALPHA = 0.5f +const val HIGHER_ALPHA = 0.75f + +// alpha values on a scale 0 - 255 +const val LOWER_ALPHA_INT = 30 +const val MEDIUM_ALPHA_INT = 90 + +const val HOUR_MINUTES = 60 +const val DAY_MINUTES = 24 * HOUR_MINUTES +const val WEEK_MINUTES = DAY_MINUTES * 7 +const val MONTH_MINUTES = DAY_MINUTES * 30 +const val YEAR_MINUTES = DAY_MINUTES * 365 + +const val MINUTE_SECONDS = 60 +const val HOUR_SECONDS = HOUR_MINUTES * 60 +const val DAY_SECONDS = DAY_MINUTES * 60 +const val WEEK_SECONDS = WEEK_MINUTES * 60 +const val MONTH_SECONDS = MONTH_MINUTES * 60 +const val YEAR_SECONDS = YEAR_MINUTES * 60 + +// shared preferences +const val PREFS_KEY = "Prefs" +const val APP_RUN_COUNT = "app_run_count" +const val LAST_VERSION = "last_version" +const val SD_TREE_URI = "tree_uri_2" +const val PRIMARY_ANDROID_DATA_TREE_URI = "primary_android_data_tree_uri_2" +const val OTG_ANDROID_DATA_TREE_URI = "otg_android_data_tree__uri_2" +const val SD_ANDROID_DATA_TREE_URI = "sd_android_data_tree_uri_2" +const val PRIMARY_ANDROID_OBB_TREE_URI = "primary_android_obb_tree_uri_2" +const val OTG_ANDROID_OBB_TREE_URI = "otg_android_obb_tree_uri_2" +const val SD_ANDROID_OBB_TREE_URI = "sd_android_obb_tree_uri_2" +const val OTG_TREE_URI = "otg_tree_uri_2" +const val SD_CARD_PATH = "sd_card_path_2" +const val OTG_REAL_PATH = "otg_real_path_2" +const val INTERNAL_STORAGE_PATH = "internal_storage_path" +const val TEXT_COLOR = "text_color" +const val BACKGROUND_COLOR = "background_color" +const val PRIMARY_COLOR = "primary_color_2" +const val ACCENT_COLOR = "accent_color" +const val APP_ICON_COLOR = "app_icon_color" +const val LAST_HANDLED_SHORTCUT_COLOR = "last_handled_shortcut_color" +const val LAST_ICON_COLOR = "last_icon_color" +const val CUSTOM_TEXT_COLOR = "custom_text_color" +const val CUSTOM_BACKGROUND_COLOR = "custom_background_color" +const val CUSTOM_PRIMARY_COLOR = "custom_primary_color" +const val CUSTOM_ACCENT_COLOR = "custom_accent_color" +const val CUSTOM_APP_ICON_COLOR = "custom_app_icon_color" +const val WIDGET_BG_COLOR = "widget_bg_color" +const val WIDGET_TEXT_COLOR = "widget_text_color" +const val PASSWORD_PROTECTION = "password_protection" +const val PASSWORD_HASH = "password_hash" +const val PROTECTION_TYPE = "protection_type" +const val APP_PASSWORD_PROTECTION = "app_password_protection" +const val APP_PASSWORD_HASH = "app_password_hash" +const val APP_PROTECTION_TYPE = "app_protection_type" +const val DELETE_PASSWORD_PROTECTION = "delete_password_protection" +const val DELETE_PASSWORD_HASH = "delete_password_hash" +const val DELETE_PROTECTION_TYPE = "delete_protection_type" +const val PROTECTED_FOLDER_PATH = "protected_folder_path_" +const val PROTECTED_FOLDER_HASH = "protected_folder_hash_" +const val PROTECTED_FOLDER_TYPE = "protected_folder_type_" +const val KEEP_LAST_MODIFIED = "keep_last_modified" +const val USE_ENGLISH = "use_english" +const val WAS_USE_ENGLISH_TOGGLED = "was_use_english_toggled" +const val WAS_SHARED_THEME_EVER_ACTIVATED = "was_shared_theme_ever_activated" +const val IS_USING_SHARED_THEME = "is_using_shared_theme" +const val IS_USING_AUTO_THEME = "is_using_auto_theme" +const val IS_USING_SYSTEM_THEME = "is_using_system_theme" +const val SHOULD_USE_SHARED_THEME = "should_use_shared_theme" +const val WAS_SHARED_THEME_FORCED = "was_shared_theme_forced" +const val WAS_CUSTOM_THEME_SWITCH_DESCRIPTION_SHOWN = "was_custom_theme_switch_description_shown" +const val SHOW_INFO_BUBBLE = "show_info_bubble" +const val LAST_CONFLICT_RESOLUTION = "last_conflict_resolution" +const val LAST_CONFLICT_APPLY_TO_ALL = "last_conflict_apply_to_all" +const val HAD_THANK_YOU_INSTALLED = "had_thank_you_installed" +const val SKIP_DELETE_CONFIRMATION = "skip_delete_confirmation" +const val ENABLE_PULL_TO_REFRESH = "enable_pull_to_refresh" +const val SCROLL_HORIZONTALLY = "scroll_horizontally" +const val PREVENT_PHONE_FROM_SLEEPING = "prevent_phone_from_sleeping" +const val LAST_USED_VIEW_PAGER_PAGE = "last_used_view_pager_page" +const val USE_24_HOUR_FORMAT = "use_24_hour_format" +const val SUNDAY_FIRST = "sunday_first" +const val WAS_ALARM_WARNING_SHOWN = "was_alarm_warning_shown" +const val WAS_REMINDER_WARNING_SHOWN = "was_reminder_warning_shown" +const val USE_SAME_SNOOZE = "use_same_snooze" +const val SNOOZE_TIME = "snooze_delay" +const val VIBRATE_ON_BUTTON_PRESS = "vibrate_on_button_press" +const val YOUR_ALARM_SOUNDS = "your_alarm_sounds" +const val SILENT = "silent" +const val OTG_PARTITION = "otg_partition_2" +const val IS_USING_MODIFIED_APP_ICON = "is_using_modified_app_icon" +const val INITIAL_WIDGET_HEIGHT = "initial_widget_height" +const val WIDGET_ID_TO_MEASURE = "widget_id_to_measure" +const val WAS_ORANGE_ICON_CHECKED = "was_orange_icon_checked" +const val WAS_APP_ON_SD_SHOWN = "was_app_on_sd_shown" +const val WAS_BEFORE_ASKING_SHOWN = "was_before_asking_shown" +const val WAS_BEFORE_RATE_SHOWN = "was_before_rate_shown" +const val WAS_INITIAL_UPGRADE_TO_PRO_SHOWN = "was_initial_upgrade_to_pro_shown" +const val WAS_APP_ICON_CUSTOMIZATION_WARNING_SHOWN = "was_app_icon_customization_warning_shown" +const val APP_SIDELOADING_STATUS = "app_sideloading_status" +const val DATE_FORMAT = "date_format" +const val WAS_OTG_HANDLED = "was_otg_handled_2" +const val WAS_UPGRADED_FROM_FREE_SHOWN = "was_upgraded_from_free_shown" +const val WAS_RATE_US_PROMPT_SHOWN = "was_rate_us_prompt_shown" +const val WAS_APP_RATED = "was_app_rated" +const val WAS_SORTING_BY_NUMERIC_VALUE_ADDED = "was_sorting_by_numeric_value_added" +const val WAS_FOLDER_LOCKING_NOTICE_SHOWN = "was_folder_locking_notice_shown" +const val LAST_RENAME_USED = "last_rename_used" +const val LAST_RENAME_PATTERN_USED = "last_rename_pattern_used" +const val LAST_EXPORTED_SETTINGS_FOLDER = "last_exported_settings_folder" +const val LAST_EXPORTED_SETTINGS_FILE = "last_exported_settings_file" +const val LAST_BLOCKED_NUMBERS_EXPORT_PATH = "last_blocked_numbers_export_path" +const val BLOCK_UNKNOWN_NUMBERS = "block_unknown_numbers" +const val FONT_SIZE = "font_size" +const val WAS_MESSENGER_RECORDER_SHOWN = "was_messenger_recorder_shown" +const val DEFAULT_TAB = "default_tab" +const val START_NAME_WITH_SURNAME = "start_name_with_surname" +const val FAVORITES = "favorites" +const val SHOW_CALL_CONFIRMATION = "show_call_confirmation" +const val COLOR_PICKER_RECENT_COLORS = "color_picker_recent_colors" +const val SHOW_CONTACT_THUMBNAILS = "show_contact_thumbnails" +const val SHOW_PHONE_NUMBERS = "show_phone_numbers" +const val SHOW_ONLY_CONTACTS_WITH_NUMBERS = "show_only_contacts_with_numbers" +const val IGNORED_CONTACT_SOURCES = "ignored_contact_sources_2" +const val LAST_USED_CONTACT_SOURCE = "last_used_contact_source" +const val ON_CONTACT_CLICK = "on_contact_click" +const val SHOW_CONTACT_FIELDS = "show_contact_fields" +const val SHOW_TABS = "show_tabs" +const val SHOW_DIALPAD_BUTTON = "show_dialpad_button" +const val SPEED_DIAL = "speed_dial" +const val LAST_EXPORT_PATH = "last_export_path" +const val WAS_LOCAL_ACCOUNT_INITIALIZED = "was_local_account_initialized" +const val SHOW_PRIVATE_CONTACTS = "show_private_contacts" +const val MERGE_DUPLICATE_CONTACTS = "merge_duplicate_contacts" +const val FAVORITES_CONTACTS_ORDER = "favorites_contacts_order" +const val FAVORITES_CUSTOM_ORDER_SELECTED = "favorites_custom_order_selected" + +// phone number/email types +const val CELL = "CELL" +const val WORK = "WORK" +const val HOME = "HOME" +const val OTHER = "OTHER" +const val PREF = "PREF" +const val MAIN = "MAIN" +const val FAX = "FAX" +const val WORK_FAX = "WORK;FAX" +const val HOME_FAX = "HOME;FAX" +const val PAGER = "PAGER" +const val MOBILE = "MOBILE" + +// IMs not supported by Ez-vcard +const val HANGOUTS = "Hangouts" +const val QQ = "QQ" +const val JABBER = "Jabber" + +// licenses +internal const val LICENSE_KOTLIN = 1L +const val LICENSE_SUBSAMPLING = 2L +const val LICENSE_GLIDE = 4L +const val LICENSE_CROPPER = 8L +const val LICENSE_FILTERS = 16L +const val LICENSE_RTL = 32L +const val LICENSE_JODA = 64L +const val LICENSE_STETHO = 128L +const val LICENSE_OTTO = 256L +const val LICENSE_PHOTOVIEW = 512L +const val LICENSE_PICASSO = 1024L +const val LICENSE_PATTERN = 2048L +const val LICENSE_REPRINT = 4096L +const val LICENSE_GIF_DRAWABLE = 8192L +const val LICENSE_AUTOFITTEXTVIEW = 16384L +const val LICENSE_ROBOLECTRIC = 32768L +const val LICENSE_ESPRESSO = 65536L +const val LICENSE_GSON = 131072L +const val LICENSE_LEAK_CANARY = 262144L +const val LICENSE_NUMBER_PICKER = 524288L +const val LICENSE_EXOPLAYER = 1048576L +const val LICENSE_PANORAMA_VIEW = 2097152L +const val LICENSE_SANSELAN = 4194304L +const val LICENSE_GESTURE_VIEWS = 8388608L +const val LICENSE_INDICATOR_FAST_SCROLL = 16777216L +const val LICENSE_EVENT_BUS = 33554432L +const val LICENSE_AUDIO_RECORD_VIEW = 67108864L +const val LICENSE_SMS_MMS = 134217728L +const val LICENSE_APNG = 268435456L +const val LICENSE_PDF_VIEW_PAGER = 536870912L +const val LICENSE_M3U_PARSER = 1073741824L +const val LICENSE_ANDROID_LAME = 2147483648L + +// global intents +const val OPEN_DOCUMENT_TREE_FOR_ANDROID_DATA_OR_OBB = 1000 +const val OPEN_DOCUMENT_TREE_OTG = 1001 +const val OPEN_DOCUMENT_TREE_SD = 1002 +const val OPEN_DOCUMENT_TREE_FOR_SDK_30 = 1003 +const val REQUEST_SET_AS = 1004 +const val REQUEST_EDIT_IMAGE = 1005 +const val SELECT_EXPORT_SETTINGS_FILE_INTENT = 1006 +const val REQUEST_CODE_SET_DEFAULT_DIALER = 1007 +const val CREATE_DOCUMENT_SDK_30 = 1008 +const val REQUEST_CODE_SET_DEFAULT_CALLER_ID = 1010 + +// sorting +const val SORT_ORDER = "sort_order" +const val SORT_FOLDER_PREFIX = "sort_folder_" // storing folder specific values at using "Use for this folder only" +const val SORT_BY_NAME = 1 +const val SORT_BY_DATE_MODIFIED = 2 +const val SORT_BY_SIZE = 4 +const val SORT_BY_DATE_TAKEN = 8 +const val SORT_BY_EXTENSION = 16 +const val SORT_BY_PATH = 32 +const val SORT_BY_NUMBER = 64 +const val SORT_BY_FIRST_NAME = 128 +const val SORT_BY_MIDDLE_NAME = 256 +const val SORT_BY_SURNAME = 512 +const val SORT_DESCENDING = 1024 +const val SORT_BY_TITLE = 2048 +const val SORT_BY_ARTIST = 4096 +const val SORT_BY_DURATION = 8192 +const val SORT_BY_RANDOM = 16384 +const val SORT_USE_NUMERIC_VALUE = 32768 +const val SORT_BY_FULL_NAME = 65536 +const val SORT_BY_CUSTOM = 131072 +const val SORT_BY_DATE_CREATED = 262144 + +// security +const val WAS_PROTECTION_HANDLED = "was_protection_handled" +const val PROTECTION_NONE = -1 +const val PROTECTION_PATTERN = 0 +const val PROTECTION_PIN = 1 +const val PROTECTION_FINGERPRINT = 2 + +// renaming +const val RENAME_SIMPLE = 0 +const val RENAME_PATTERN = 1 + +const val SHOW_ALL_TABS = -1 +const val SHOW_PATTERN = 0 +const val SHOW_PIN = 1 +const val SHOW_FINGERPRINT = 2 + +// permissions +const val PERMISSION_READ_STORAGE = 1 +const val PERMISSION_WRITE_STORAGE = 2 +const val PERMISSION_CAMERA = 3 +const val PERMISSION_RECORD_AUDIO = 4 +const val PERMISSION_READ_CONTACTS = 5 +const val PERMISSION_WRITE_CONTACTS = 6 +const val PERMISSION_READ_CALENDAR = 7 +const val PERMISSION_WRITE_CALENDAR = 8 +const val PERMISSION_CALL_PHONE = 9 +const val PERMISSION_READ_CALL_LOG = 10 +const val PERMISSION_WRITE_CALL_LOG = 11 +const val PERMISSION_GET_ACCOUNTS = 12 +const val PERMISSION_READ_SMS = 13 +const val PERMISSION_SEND_SMS = 14 +const val PERMISSION_READ_PHONE_STATE = 15 +const val PERMISSION_MEDIA_LOCATION = 16 +const val PERMISSION_POST_NOTIFICATIONS = 17 +const val PERMISSION_READ_MEDIA_IMAGES = 18 +const val PERMISSION_READ_MEDIA_VIDEO = 19 +const val PERMISSION_READ_MEDIA_AUDIO = 20 + +// conflict resolving +const val CONFLICT_SKIP = 1 +const val CONFLICT_OVERWRITE = 2 +const val CONFLICT_MERGE = 3 +const val CONFLICT_KEEP_BOTH = 4 + +// font sizes +const val FONT_SIZE_SMALL = 0 +const val FONT_SIZE_MEDIUM = 1 +const val FONT_SIZE_LARGE = 2 +const val FONT_SIZE_EXTRA_LARGE = 3 + +const val MONDAY_BIT = 1 +const val TUESDAY_BIT = 2 +const val WEDNESDAY_BIT = 4 +const val THURSDAY_BIT = 8 +const val FRIDAY_BIT = 16 +const val SATURDAY_BIT = 32 +const val SUNDAY_BIT = 64 +const val EVERY_DAY_BIT = MONDAY_BIT or TUESDAY_BIT or WEDNESDAY_BIT or THURSDAY_BIT or FRIDAY_BIT or SATURDAY_BIT or SUNDAY_BIT +const val WEEK_DAYS_BIT = MONDAY_BIT or TUESDAY_BIT or WEDNESDAY_BIT or THURSDAY_BIT or FRIDAY_BIT +const val WEEKENDS_BIT = SATURDAY_BIT or SUNDAY_BIT + +const val SIDELOADING_UNCHECKED = 0 +const val SIDELOADING_TRUE = 1 +const val SIDELOADING_FALSE = 2 + +// default tabs +const val TAB_LAST_USED = 0 +const val TAB_CONTACTS = 1 +const val TAB_FAVORITES = 2 +const val TAB_CALL_HISTORY = 4 +const val TAB_GROUPS = 8 +const val TAB_FILES = 16 +const val TAB_RECENT_FILES = 32 +const val TAB_STORAGE_ANALYSIS = 64 + +val photoExtensions: Array get() = arrayOf(".jpg", ".png", ".jpeg", ".bmp", ".webp", ".heic", ".heif", ".apng", ".avif") +val videoExtensions: Array get() = arrayOf(".mp4", ".mkv", ".webm", ".avi", ".3gp", ".mov", ".m4v", ".3gpp") +val audioExtensions: Array get() = arrayOf(".mp3", ".wav", ".wma", ".ogg", ".m4a", ".opus", ".flac", ".aac") +val rawExtensions: Array get() = arrayOf(".dng", ".orf", ".nef", ".arw", ".rw2", ".cr2", ".cr3") + +val extensionsSupportingEXIF: Array get() = arrayOf(".jpg", ".jpeg", ".png", ".webp", ".dng") + +const val DATE_FORMAT_ONE = "dd.MM.yyyy" +const val DATE_FORMAT_TWO = "dd/MM/yyyy" +const val DATE_FORMAT_THREE = "MM/dd/yyyy" +const val DATE_FORMAT_FOUR = "yyyy-MM-dd" +const val DATE_FORMAT_FIVE = "d MMMM yyyy" +const val DATE_FORMAT_SIX = "MMMM d yyyy" +const val DATE_FORMAT_SEVEN = "MM-dd-yyyy" +const val DATE_FORMAT_EIGHT = "dd-MM-yyyy" +const val DATE_FORMAT_NINE = "yyyyMMdd" +const val DATE_FORMAT_TEN = "yyyy.MM.dd" +const val DATE_FORMAT_ELEVEN = "yy-MM-dd" +const val DATE_FORMAT_TWELVE = "yyMMdd" +const val DATE_FORMAT_THIRTEEN = "yy.MM.dd" +const val DATE_FORMAT_FOURTEEN = "yy/MM/dd" + +const val TIME_FORMAT_12 = "hh:mm a" +const val TIME_FORMAT_24 = "HH:mm" + +// possible icons at the top left corner +enum class NavigationIcon { + Cross, + Arrow, + None +} + +val appIconColorStrings = arrayListOf( + ".Red", + ".Pink", + ".Purple", + ".Deep_purple", + ".Indigo", + ".Blue", + ".Light_blue", + ".Cyan", + ".Teal", + ".Green", + ".Light_green", + ".Lime", + ".Yellow", + ".Amber", + ".Orange", + ".Deep_orange", + ".Brown", + ".Blue_grey", + ".Grey_black" +) + +// most app icon colors from md_app_icon_colors with reduced alpha +// used at showing contact placeholders without image +val letterBackgroundColors = arrayListOf( + 0xCCD32F2F, + 0xCCC2185B, + 0xCC1976D2, + 0xCC0288D1, + 0xCC0097A7, + 0xCC00796B, + 0xCC388E3C, + 0xCC689F38, + 0xCCF57C00, + 0xCCE64A19 +) + +// view types +const val VIEW_TYPE_GRID = 1 +const val VIEW_TYPE_LIST = 2 + +fun isOnMainThread() = Looper.myLooper() == Looper.getMainLooper() + +fun ensureBackgroundThread(callback: () -> Unit) { + if (isOnMainThread()) { + Thread { + callback() + }.start() + } else { + callback() + } +} + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N) +fun isNougatPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N_MR1) +fun isNougatMR1Plus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O) +fun isOreoPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O_MR1) +fun isOreoMr1Plus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.P) +fun isPiePlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.Q) +fun isQPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.R) +fun isRPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.S) +fun isSPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + +@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.TIRAMISU) +fun isTiramisuPlus() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + +fun getDateFormats() = arrayListOf( + "--MM-dd", + "yyyy-MM-dd", + "yyyyMMdd", + "yyyy.MM.dd", + "yy-MM-dd", + "yyMMdd", + "yy.MM.dd", + "yy/MM/dd", + "MM-dd", + "MMdd", + "MM/dd", + "MM.dd" +) + +fun getDateFormatsWithYear() = arrayListOf( + DATE_FORMAT_FOUR, + DATE_FORMAT_NINE, + DATE_FORMAT_TEN, + DATE_FORMAT_ELEVEN, + DATE_FORMAT_TWELVE, + DATE_FORMAT_THIRTEEN, + DATE_FORMAT_FOURTEEN, +) + +val normalizeRegex = "\\p{InCombiningDiacriticalMarks}+".toRegex() + +fun getConflictResolution(resolutions: LinkedHashMap, path: String): Int { + return if (resolutions.size == 1 && resolutions.containsKey("")) { + resolutions[""]!! + } else if (resolutions.containsKey(path)) { + resolutions[path]!! + } else { + CONFLICT_SKIP + } +} + +val proPackages = arrayListOf("draw", "gallery", "filemanager", "contacts", "notes", "calendar") + +fun mydebug(message: String) = Log.e("DEBUG", message) + +fun getQuestionMarks(size: Int) = ("?," * size).trimEnd(',') + +fun getFilePlaceholderDrawables(context: Context): HashMap { + val fileDrawables = HashMap() + hashMapOf().apply { + put("aep", R.drawable.ic_file_aep) + put("ai", R.drawable.ic_file_ai) + put("avi", R.drawable.ic_file_avi) + put("css", R.drawable.ic_file_css) + put("csv", R.drawable.ic_file_csv) + put("dbf", R.drawable.ic_file_dbf) + put("doc", R.drawable.ic_file_doc) + put("docx", R.drawable.ic_file_doc) + put("dwg", R.drawable.ic_file_dwg) + put("exe", R.drawable.ic_file_exe) + put("fla", R.drawable.ic_file_fla) + put("flv", R.drawable.ic_file_flv) + put("htm", R.drawable.ic_file_html) + put("html", R.drawable.ic_file_html) + put("ics", R.drawable.ic_file_ics) + put("indd", R.drawable.ic_file_indd) + put("iso", R.drawable.ic_file_iso) + put("jpg", R.drawable.ic_file_jpg) + put("jpeg", R.drawable.ic_file_jpg) + put("js", R.drawable.ic_file_js) + put("json", R.drawable.ic_file_json) + put("m4a", R.drawable.ic_file_m4a) + put("mp3", R.drawable.ic_file_mp3) + put("mp4", R.drawable.ic_file_mp4) + put("ogg", R.drawable.ic_file_ogg) + put("pdf", R.drawable.ic_file_pdf) + put("plproj", R.drawable.ic_file_plproj) + put("prproj", R.drawable.ic_file_prproj) + put("psd", R.drawable.ic_file_psd) + put("rtf", R.drawable.ic_file_rtf) + put("sesx", R.drawable.ic_file_sesx) + put("sql", R.drawable.ic_file_sql) + put("svg", R.drawable.ic_file_svg) + put("txt", R.drawable.ic_file_txt) + put("vcf", R.drawable.ic_file_vcf) + put("wav", R.drawable.ic_file_wav) + put("wmv", R.drawable.ic_file_wmv) + put("xls", R.drawable.ic_file_xls) + put("xml", R.drawable.ic_file_xml) + put("zip", R.drawable.ic_file_zip) + }.forEach { (key, value) -> + fileDrawables[key] = context.resources.getDrawable(value) + } + return fileDrawables +} + +const val FIRST_CONTACT_ID = 1000000 +const val DEFAULT_FILE_NAME = "contacts.vcf" + +// visible fields filtering +const val SHOW_PREFIX_FIELD = 1 +const val SHOW_FIRST_NAME_FIELD = 2 +const val SHOW_MIDDLE_NAME_FIELD = 4 +const val SHOW_SURNAME_FIELD = 8 +const val SHOW_SUFFIX_FIELD = 16 +const val SHOW_PHONE_NUMBERS_FIELD = 32 +const val SHOW_EMAILS_FIELD = 64 +const val SHOW_ADDRESSES_FIELD = 128 +const val SHOW_EVENTS_FIELD = 256 +const val SHOW_NOTES_FIELD = 512 +const val SHOW_ORGANIZATION_FIELD = 1024 +const val SHOW_GROUPS_FIELD = 2048 +const val SHOW_CONTACT_SOURCE_FIELD = 4096 +const val SHOW_WEBSITES_FIELD = 8192 +const val SHOW_NICKNAME_FIELD = 16384 +const val SHOW_IMS_FIELD = 32768 +const val SHOW_RINGTONE_FIELD = 65536 + +const val DEFAULT_EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE_HOME +const val DEFAULT_PHONE_NUMBER_TYPE = ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE +const val DEFAULT_ADDRESS_TYPE = ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME +const val DEFAULT_EVENT_TYPE = ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY +const val DEFAULT_ORGANIZATION_TYPE = ContactsContract.CommonDataKinds.Organization.TYPE_WORK +const val DEFAULT_WEBSITE_TYPE = ContactsContract.CommonDataKinds.Website.TYPE_HOMEPAGE +const val DEFAULT_IM_TYPE = ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE +const val DEFAULT_MIMETYPE = ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + +// contact photo changes +const val PHOTO_ADDED = 1 +const val PHOTO_REMOVED = 2 +const val PHOTO_CHANGED = 3 +const val PHOTO_UNCHANGED = 4 + +const val ON_CLICK_CALL_CONTACT = 1 +const val ON_CLICK_VIEW_CONTACT = 2 +const val ON_CLICK_EDIT_CONTACT = 3 + +// apps with special handling +const val TELEGRAM_PACKAGE = "org.telegram.messenger" +const val SIGNAL_PACKAGE = "org.thoughtcrime.securesms" +const val WHATSAPP_PACKAGE = "com.whatsapp" +const val VIBER_PACKAGE = "com.viber.voip" +const val THREEMA_PACKAGE = "ch.threema.app" + +const val SOCIAL_VOICE_CALL = 0 +const val SOCIAL_VIDEO_CALL = 1 +const val SOCIAL_MESSAGE = 2 + +fun getEmptyLocalContact() = LocalContact( + 0, + "", + "", + "", + "", + "", + "", + null, + "", + ArrayList(), + ArrayList(), + ArrayList(), + 0, + ArrayList(), + "", + ArrayList(), + "", + "", + ArrayList(), + ArrayList(), + null +) + +fun getProperText(text: String, shouldNormalize: Boolean) = if (shouldNormalize) text.normalizeString() else text diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ContactsHelper.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ContactsHelper.kt new file mode 100644 index 000000000..b686d8c50 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ContactsHelper.kt @@ -0,0 +1,1558 @@ +package com.simplemobiletools.commons.helpers + +import android.accounts.Account +import android.accounts.AccountManager +import android.content.* +import android.graphics.Bitmap +import android.net.Uri +import android.os.Handler +import android.os.Looper +import android.provider.ContactsContract +import android.provider.ContactsContract.* +import android.provider.MediaStore +import android.text.TextUtils +import android.util.SparseArray +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.models.PhoneNumber +import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.overloads.times +import java.util.Locale + +class ContactsHelper(val context: Context) { + private val BATCH_SIZE = 50 + private var displayContactSources = ArrayList() + + fun getContacts( + getAll: Boolean = false, + gettingDuplicates: Boolean = false, + ignoredContactSources: HashSet = HashSet(), + showOnlyContactsWithNumbers: Boolean = context.baseConfig.showOnlyContactsWithNumbers, + callback: (ArrayList) -> Unit + ) { + ensureBackgroundThread { + val contacts = SparseArray() + displayContactSources = context.getVisibleContactSources() + + if (getAll) { + displayContactSources = if (ignoredContactSources.isEmpty()) { + context.getAllContactSources().map { it.name }.toMutableList() as ArrayList + } else { + context.getAllContactSources().filter { + it.getFullIdentifier().isNotEmpty() && !ignoredContactSources.contains(it.getFullIdentifier()) + }.map { it.name }.toMutableList() as ArrayList + } + } + + getDeviceContacts(contacts, ignoredContactSources, gettingDuplicates) + + if (displayContactSources.contains(SMT_PRIVATE)) { + LocalContactsHelper(context).getAllContacts().forEach { + contacts.put(it.id, it) + } + } + + val contactsSize = contacts.size() + val tempContacts = ArrayList(contactsSize) + val resultContacts = ArrayList(contactsSize) + + (0 until contactsSize).filter { + if (ignoredContactSources.isEmpty() && showOnlyContactsWithNumbers) { + contacts.valueAt(it).phoneNumbers.isNotEmpty() + } else { + true + } + }.mapTo(tempContacts) { + contacts.valueAt(it) + } + + if (context.baseConfig.mergeDuplicateContacts && ignoredContactSources.isEmpty() && !getAll) { + tempContacts.filter { displayContactSources.contains(it.source) }.groupBy { it.getNameToDisplay().toLowerCase() }.values.forEach { it -> + if (it.size == 1) { + resultContacts.add(it.first()) + } else { + val sorted = it.sortedByDescending { it.getStringToCompare().length } + resultContacts.add(sorted.first()) + } + } + } else { + resultContacts.addAll(tempContacts) + } + + // groups are obtained with contactID, not rawID, so assign them to proper contacts like this + val groups = getContactGroups(getStoredGroupsSync()) + val size = groups.size() + for (i in 0 until size) { + val key = groups.keyAt(i) + resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i) + } + + Contact.sorting = context.baseConfig.sorting + Contact.startWithSurname = context.baseConfig.startNameWithSurname + resultContacts.sort() + + Handler(Looper.getMainLooper()).post { + callback(resultContacts) + } + } + } + + private fun getContentResolverAccounts(): HashSet { + val sources = HashSet() + arrayOf(Groups.CONTENT_URI, Settings.CONTENT_URI, RawContacts.CONTENT_URI).forEach { + fillSourcesFromUri(it, sources) + } + + return sources + } + + private fun fillSourcesFromUri(uri: Uri, sources: HashSet) { + val projection = arrayOf( + RawContacts.ACCOUNT_NAME, + RawContacts.ACCOUNT_TYPE + ) + + context.queryCursor(uri, projection) { cursor -> + val name = cursor.getStringValue(RawContacts.ACCOUNT_NAME) ?: "" + val type = cursor.getStringValue(RawContacts.ACCOUNT_TYPE) ?: "" + var publicName = name + if (type == TELEGRAM_PACKAGE) { + publicName = context.getString(R.string.telegram) + } + + val source = ContactSource(name, type, publicName) + sources.add(source) + } + } + + private fun getDeviceContacts(contacts: SparseArray, ignoredContactSources: HashSet?, gettingDuplicates: Boolean) { + if (!context.hasContactPermissions()) { + return + } + + val ignoredSources = ignoredContactSources ?: context.baseConfig.ignoredContactSources + val uri = Data.CONTENT_URI + val projection = getContactProjection() + + arrayOf(CommonDataKinds.Organization.CONTENT_ITEM_TYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).forEach { mimetype -> + val selection = "${Data.MIMETYPE} = ?" + val selectionArgs = arrayOf(mimetype) + val sortOrder = getSortString() + + context.queryCursor(uri, projection, selection, selectionArgs, sortOrder, true) { cursor -> + val accountName = cursor.getStringValue(RawContacts.ACCOUNT_NAME) ?: "" + val accountType = cursor.getStringValue(RawContacts.ACCOUNT_TYPE) ?: "" + + if (ignoredSources.contains("$accountName:$accountType")) { + return@queryCursor + } + + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + var prefix = "" + var firstName = "" + var middleName = "" + var surname = "" + var suffix = "" + + // ignore names at Organization type contacts + if (mimetype == CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) { + prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: "" + firstName = cursor.getStringValue(CommonDataKinds.StructuredName.GIVEN_NAME) ?: "" + middleName = cursor.getStringValue(CommonDataKinds.StructuredName.MIDDLE_NAME) ?: "" + surname = cursor.getStringValue(CommonDataKinds.StructuredName.FAMILY_NAME) ?: "" + suffix = cursor.getStringValue(CommonDataKinds.StructuredName.SUFFIX) ?: "" + } + + var photoUri = "" + var starred = 0 + var contactId = 0 + var thumbnailUri = "" + var ringtone: String? = null + + if (!gettingDuplicates) { + photoUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_URI) ?: "" + starred = cursor.getIntValue(CommonDataKinds.StructuredName.STARRED) + contactId = cursor.getIntValue(Data.CONTACT_ID) + thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: "" + ringtone = cursor.getStringValue(CommonDataKinds.StructuredName.CUSTOM_RINGTONE) + } + + val nickname = "" + val numbers = ArrayList() // proper value is obtained below + val emails = ArrayList() + val addresses = ArrayList
() + val events = ArrayList() + val notes = "" + val groups = ArrayList() + val organization = Organization("", "") + val websites = ArrayList() + val ims = ArrayList() + val contact = Contact( + id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses, + events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone + ) + + contacts.put(id, contact) + } + } + + val emails = getEmails() + var size = emails.size() + for (i in 0 until size) { + val key = emails.keyAt(i) + contacts[key]?.emails = emails.valueAt(i) + } + + val organizations = getOrganizations() + size = organizations.size() + for (i in 0 until size) { + val key = organizations.keyAt(i) + contacts[key]?.organization = organizations.valueAt(i) + } + + // no need to fetch some fields if we are only getting duplicates of the current contact + if (gettingDuplicates) { + return + } + + val phoneNumbers = getPhoneNumbers(null) + size = phoneNumbers.size() + for (i in 0 until size) { + val key = phoneNumbers.keyAt(i) + if (contacts[key] != null) { + val numbers = phoneNumbers.valueAt(i) + contacts[key].phoneNumbers = numbers + } + } + + val addresses = getAddresses() + size = addresses.size() + for (i in 0 until size) { + val key = addresses.keyAt(i) + contacts[key]?.addresses = addresses.valueAt(i) + } + + val IMs = getIMs() + size = IMs.size() + for (i in 0 until size) { + val key = IMs.keyAt(i) + contacts[key]?.IMs = IMs.valueAt(i) + } + + val events = getEvents() + size = events.size() + for (i in 0 until size) { + val key = events.keyAt(i) + contacts[key]?.events = events.valueAt(i) + } + + val notes = getNotes() + size = notes.size() + for (i in 0 until size) { + val key = notes.keyAt(i) + contacts[key]?.notes = notes.valueAt(i) + } + + val nicknames = getNicknames() + size = nicknames.size() + for (i in 0 until size) { + val key = nicknames.keyAt(i) + contacts[key]?.nickname = nicknames.valueAt(i) + } + + val websites = getWebsites() + size = websites.size() + for (i in 0 until size) { + val key = websites.keyAt(i) + contacts[key]?.websites = websites.valueAt(i) + } + } + + private fun getPhoneNumbers(contactId: Int? = null): SparseArray> { + val phoneNumbers = SparseArray>() + val uri = CommonDataKinds.Phone.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Phone.NUMBER, + CommonDataKinds.Phone.NORMALIZED_NUMBER, + CommonDataKinds.Phone.TYPE, + CommonDataKinds.Phone.LABEL, + CommonDataKinds.Phone.IS_PRIMARY + ) + + val selection = if (contactId == null) getSourcesSelection() else "${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = if (contactId == null) getSourcesSelectionArgs() else arrayOf(contactId.toString()) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val number = cursor.getStringValue(CommonDataKinds.Phone.NUMBER) ?: return@queryCursor + val normalizedNumber = cursor.getStringValue(CommonDataKinds.Phone.NORMALIZED_NUMBER) ?: number.normalizePhoneNumber() + val type = cursor.getIntValue(CommonDataKinds.Phone.TYPE) + val label = cursor.getStringValue(CommonDataKinds.Phone.LABEL) ?: "" + val isPrimary = cursor.getIntValue(CommonDataKinds.Phone.IS_PRIMARY) != 0 + + if (phoneNumbers[id] == null) { + phoneNumbers.put(id, ArrayList()) + } + + val phoneNumber = PhoneNumber(number, type, label, normalizedNumber, isPrimary) + phoneNumbers[id].add(phoneNumber) + } + + return phoneNumbers + } + + private fun getNicknames(contactId: Int? = null): SparseArray { + val nicknames = SparseArray() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Nickname.NAME + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Nickname.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val nickname = cursor.getStringValue(CommonDataKinds.Nickname.NAME) ?: return@queryCursor + nicknames.put(id, nickname) + } + + return nicknames + } + + private fun getEmails(contactId: Int? = null): SparseArray> { + val emails = SparseArray>() + val uri = CommonDataKinds.Email.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Email.DATA, + CommonDataKinds.Email.TYPE, + CommonDataKinds.Email.LABEL + ) + + val selection = if (contactId == null) getSourcesSelection() else "${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = if (contactId == null) getSourcesSelectionArgs() else arrayOf(contactId.toString()) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val email = cursor.getStringValue(CommonDataKinds.Email.DATA) ?: return@queryCursor + val type = cursor.getIntValue(CommonDataKinds.Email.TYPE) + val label = cursor.getStringValue(CommonDataKinds.Email.LABEL) ?: "" + + if (emails[id] == null) { + emails.put(id, ArrayList()) + } + + emails[id]!!.add(Email(email, type, label)) + } + + return emails + } + + private fun getAddresses(contactId: Int? = null): SparseArray> { + val addresses = SparseArray>() + val uri = CommonDataKinds.StructuredPostal.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, + CommonDataKinds.StructuredPostal.TYPE, + CommonDataKinds.StructuredPostal.LABEL + ) + + val selection = if (contactId == null) getSourcesSelection() else "${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = if (contactId == null) getSourcesSelectionArgs() else arrayOf(contactId.toString()) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val address = cursor.getStringValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS) ?: return@queryCursor + val type = cursor.getIntValue(CommonDataKinds.StructuredPostal.TYPE) + val label = cursor.getStringValue(CommonDataKinds.StructuredPostal.LABEL) ?: "" + + if (addresses[id] == null) { + addresses.put(id, ArrayList()) + } + + addresses[id]!!.add(Address(address, type, label)) + } + + return addresses + } + + private fun getIMs(contactId: Int? = null): SparseArray> { + val IMs = SparseArray>() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Im.DATA, + CommonDataKinds.Im.PROTOCOL, + CommonDataKinds.Im.CUSTOM_PROTOCOL + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Im.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val IM = cursor.getStringValue(CommonDataKinds.Im.DATA) ?: return@queryCursor + val type = cursor.getIntValue(CommonDataKinds.Im.PROTOCOL) + val label = cursor.getStringValue(CommonDataKinds.Im.CUSTOM_PROTOCOL) ?: "" + + if (IMs[id] == null) { + IMs.put(id, ArrayList()) + } + + IMs[id]!!.add(IM(IM, type, label)) + } + + return IMs + } + + private fun getEvents(contactId: Int? = null): SparseArray> { + val events = SparseArray>() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Event.START_DATE, + CommonDataKinds.Event.TYPE + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Event.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val startDate = cursor.getStringValue(CommonDataKinds.Event.START_DATE) ?: return@queryCursor + val type = cursor.getIntValue(CommonDataKinds.Event.TYPE) + + if (events[id] == null) { + events.put(id, ArrayList()) + } + + events[id]!!.add(Event(startDate, type)) + } + + return events + } + + private fun getNotes(contactId: Int? = null): SparseArray { + val notes = SparseArray() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Note.NOTE + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Note.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val note = cursor.getStringValue(CommonDataKinds.Note.NOTE) ?: return@queryCursor + notes.put(id, note) + } + + return notes + } + + private fun getOrganizations(contactId: Int? = null): SparseArray { + val organizations = SparseArray() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Organization.COMPANY, + CommonDataKinds.Organization.TITLE + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Organization.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val company = cursor.getStringValue(CommonDataKinds.Organization.COMPANY) ?: "" + val title = cursor.getStringValue(CommonDataKinds.Organization.TITLE) ?: "" + if (company.isEmpty() && title.isEmpty()) { + return@queryCursor + } + + val organization = Organization(company, title) + organizations.put(id, organization) + } + + return organizations + } + + private fun getWebsites(contactId: Int? = null): SparseArray> { + val websites = SparseArray>() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + CommonDataKinds.Website.URL + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Website.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val url = cursor.getStringValue(CommonDataKinds.Website.URL) ?: return@queryCursor + + if (websites[id] == null) { + websites.put(id, ArrayList()) + } + + websites[id]!!.add(url) + } + + return websites + } + + private fun getContactGroups(storedGroups: ArrayList, contactId: Int? = null): SparseArray> { + val groups = SparseArray>() + if (!context.hasContactPermissions()) { + return groups + } + + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.CONTACT_ID, + Data.DATA1 + ) + + val selection = getSourcesSelection(true, contactId != null, false) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, contactId) + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getIntValue(Data.CONTACT_ID) + val newRowId = cursor.getLongValue(Data.DATA1) + + val groupTitle = storedGroups.firstOrNull { it.id == newRowId }?.title ?: return@queryCursor + val group = Group(newRowId, groupTitle) + if (groups[id] == null) { + groups.put(id, ArrayList()) + } + groups[id]!!.add(group) + } + + return groups + } + + private fun getQuestionMarks() = ("?," * displayContactSources.filter { it.isNotEmpty() }.size).trimEnd(',') + + private fun getSourcesSelection(addMimeType: Boolean = false, addContactId: Boolean = false, useRawContactId: Boolean = true): String { + val strings = ArrayList() + if (addMimeType) { + strings.add("${Data.MIMETYPE} = ?") + } + + if (addContactId) { + strings.add("${if (useRawContactId) Data.RAW_CONTACT_ID else Data.CONTACT_ID} = ?") + } else { + // sometimes local device storage has null account_name, handle it properly + val accountnameString = StringBuilder() + if (displayContactSources.contains("")) { + accountnameString.append("(") + } + accountnameString.append("${RawContacts.ACCOUNT_NAME} IN (${getQuestionMarks()})") + if (displayContactSources.contains("")) { + accountnameString.append(" OR ${RawContacts.ACCOUNT_NAME} IS NULL)") + } + strings.add(accountnameString.toString()) + } + + return TextUtils.join(" AND ", strings) + } + + private fun getSourcesSelectionArgs(mimetype: String? = null, contactId: Int? = null): Array { + val args = ArrayList() + + if (mimetype != null) { + args.add(mimetype) + } + + if (contactId != null) { + args.add(contactId.toString()) + } else { + args.addAll(displayContactSources.filter { it.isNotEmpty() }) + } + + return args.toTypedArray() + } + + fun getStoredGroups(callback: (ArrayList) -> Unit) { + ensureBackgroundThread { + val groups = getStoredGroupsSync() + Handler(Looper.getMainLooper()).post { + callback(groups) + } + } + } + + fun getStoredGroupsSync(): ArrayList { + val groups = getDeviceStoredGroups() + groups.addAll(context.groupsDB.getGroups()) + return groups + } + + private fun getDeviceStoredGroups(): ArrayList { + val groups = ArrayList() + if (!context.hasContactPermissions()) { + return groups + } + + val uri = Groups.CONTENT_URI + val projection = arrayOf( + Groups._ID, + Groups.TITLE, + Groups.SYSTEM_ID + ) + + val selection = "${Groups.AUTO_ADD} = ? AND ${Groups.FAVORITES} = ?" + val selectionArgs = arrayOf("0", "0") + + context.queryCursor(uri, projection, selection, selectionArgs, showErrors = true) { cursor -> + val id = cursor.getLongValue(Groups._ID) + val title = cursor.getStringValue(Groups.TITLE) ?: return@queryCursor + + val systemId = cursor.getStringValue(Groups.SYSTEM_ID) + if (groups.map { it.title }.contains(title) && systemId != null) { + return@queryCursor + } + + groups.add(Group(id, title)) + } + return groups + } + + fun createNewGroup(title: String, accountName: String, accountType: String): Group? { + if (accountType == SMT_PRIVATE) { + val newGroup = Group(null, title) + val id = context.groupsDB.insertOrUpdate(newGroup) + newGroup.id = id + return newGroup + } + + val operations = ArrayList() + ContentProviderOperation.newInsert(Groups.CONTENT_URI).apply { + withValue(Groups.TITLE, title) + withValue(Groups.GROUP_VISIBLE, 1) + withValue(Groups.ACCOUNT_NAME, accountName) + withValue(Groups.ACCOUNT_TYPE, accountType) + operations.add(build()) + } + + try { + val results = context.contentResolver.applyBatch(AUTHORITY, operations) + val rawId = ContentUris.parseId(results[0].uri!!) + return Group(rawId, title) + } catch (e: Exception) { + context.showErrorToast(e) + } + return null + } + + fun renameGroup(group: Group) { + val operations = ArrayList() + ContentProviderOperation.newUpdate(Groups.CONTENT_URI).apply { + val selection = "${Groups._ID} = ?" + val selectionArgs = arrayOf(group.id.toString()) + withSelection(selection, selectionArgs) + withValue(Groups.TITLE, group.title) + operations.add(build()) + } + + try { + context.contentResolver.applyBatch(AUTHORITY, operations) + } catch (e: Exception) { + context.showErrorToast(e) + } + } + + fun deleteGroup(id: Long) { + val operations = ArrayList() + val uri = ContentUris.withAppendedId(Groups.CONTENT_URI, id).buildUpon() + .appendQueryParameter(CALLER_IS_SYNCADAPTER, "true") + .build() + + operations.add(ContentProviderOperation.newDelete(uri).build()) + + try { + context.contentResolver.applyBatch(AUTHORITY, operations) + } catch (e: Exception) { + context.showErrorToast(e) + } + } + + fun getContactWithId(id: Int, isLocalPrivate: Boolean): Contact? { + if (id == 0) { + return null + } else if (isLocalPrivate) { + return LocalContactsHelper(context).getContactWithId(id) + } + + val selection = "(${Data.MIMETYPE} = ? OR ${Data.MIMETYPE} = ?) AND ${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE, id.toString()) + return parseContactCursor(selection, selectionArgs) + } + + fun getContactFromUri(uri: Uri): Contact? { + val key = getLookupKeyFromUri(uri) ?: return null + return getContactWithLookupKey(key) + } + + private fun getLookupKeyFromUri(lookupUri: Uri): String? { + val projection = arrayOf(ContactsContract.Contacts.LOOKUP_KEY) + val cursor = context.contentResolver.query(lookupUri, projection, null, null, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getStringValue(ContactsContract.Contacts.LOOKUP_KEY) + } + } + return null + } + + fun getContactWithLookupKey(key: String): Contact? { + val selection = "(${Data.MIMETYPE} = ? OR ${Data.MIMETYPE} = ?) AND ${Data.LOOKUP_KEY} = ?" + val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE, key) + return parseContactCursor(selection, selectionArgs) + } + + private fun parseContactCursor(selection: String, selectionArgs: Array): Contact? { + val storedGroups = getStoredGroupsSync() + val uri = Data.CONTENT_URI + val projection = getContactProjection() + + val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + + var prefix = "" + var firstName = "" + var middleName = "" + var surname = "" + var suffix = "" + var mimetype = cursor.getStringValue(Data.MIMETYPE) + + // if first line is an Organization type contact, go to next line if available + if (mimetype != CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) { + if (!cursor.isLast() && cursor.moveToNext()) { + mimetype = cursor.getStringValue(Data.MIMETYPE) + } + } + // ignore names at Organization type contacts + if (mimetype == CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) { + prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: "" + firstName = cursor.getStringValue(CommonDataKinds.StructuredName.GIVEN_NAME) ?: "" + middleName = cursor.getStringValue(CommonDataKinds.StructuredName.MIDDLE_NAME) ?: "" + surname = cursor.getStringValue(CommonDataKinds.StructuredName.FAMILY_NAME) ?: "" + suffix = cursor.getStringValue(CommonDataKinds.StructuredName.SUFFIX) ?: "" + } + + val nickname = getNicknames(id)[id] ?: "" + val photoUri = cursor.getStringValueOrNull(CommonDataKinds.Phone.PHOTO_URI) ?: "" + val number = getPhoneNumbers(id)[id] ?: ArrayList() + val emails = getEmails(id)[id] ?: ArrayList() + val addresses = getAddresses(id)[id] ?: ArrayList() + val events = getEvents(id)[id] ?: ArrayList() + val notes = getNotes(id)[id] ?: "" + val accountName = cursor.getStringValue(RawContacts.ACCOUNT_NAME) ?: "" + val starred = cursor.getIntValue(CommonDataKinds.StructuredName.STARRED) + val ringtone = cursor.getStringValue(CommonDataKinds.StructuredName.CUSTOM_RINGTONE) + val contactId = cursor.getIntValue(Data.CONTACT_ID) + val groups = getContactGroups(storedGroups, contactId)[contactId] ?: ArrayList() + val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: "" + val organization = getOrganizations(id)[id] ?: Organization("", "") + val websites = getWebsites(id)[id] ?: ArrayList() + val ims = getIMs(id)[id] ?: ArrayList() + return Contact( + id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events, + accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone + ) + } + } + + return null + } + + fun getContactSources(callback: (ArrayList) -> Unit) { + ensureBackgroundThread { + callback(getContactSourcesSync()) + } + } + + private fun getContactSourcesSync(): ArrayList { + val sources = getDeviceContactSources() + sources.add(context.getPrivateContactSource()) + return ArrayList(sources) + } + + fun getSaveableContactSources(callback: (ArrayList) -> Unit) { + ensureBackgroundThread { + val ignoredTypes = arrayListOf( + SIGNAL_PACKAGE, + TELEGRAM_PACKAGE, + WHATSAPP_PACKAGE, + THREEMA_PACKAGE + ) + + val contactSources = getContactSourcesSync() + val filteredSources = contactSources.filter { !ignoredTypes.contains(it.type) }.toMutableList() as ArrayList + callback(filteredSources) + } + } + + fun getDeviceContactSources(): LinkedHashSet { + val sources = LinkedHashSet() + if (!context.hasContactPermissions()) { + return sources + } + + if (!context.baseConfig.wasLocalAccountInitialized) { + initializeLocalPhoneAccount() + context.baseConfig.wasLocalAccountInitialized = true + } + + val accounts = AccountManager.get(context).accounts + accounts.forEach { + if (ContentResolver.getIsSyncable(it, AUTHORITY) == 1) { + var publicName = it.name + if (it.type == TELEGRAM_PACKAGE) { + publicName = context.getString(R.string.telegram) + } else if (it.type == VIBER_PACKAGE) { + publicName = context.getString(R.string.viber) + } + val contactSource = ContactSource(it.name, it.type, publicName) + sources.add(contactSource) + } + } + + var hadEmptyAccount = false + val allAccounts = getContentResolverAccounts() + val contentResolverAccounts = allAccounts.filter { + if (it.name.isEmpty() && it.type.isEmpty() && allAccounts.none { it.name.lowercase(Locale.getDefault()) == "phone" }) { + hadEmptyAccount = true + } + + it.name.isNotEmpty() && it.type.isNotEmpty() && !accounts.contains(Account(it.name, it.type)) + } + sources.addAll(contentResolverAccounts) + + if (hadEmptyAccount) { + sources.add(ContactSource("", "", context.getString(R.string.phone_storage))) + } + + return sources + } + + // make sure the local Phone contact source is initialized and available + // https://stackoverflow.com/a/6096508/1967672 + private fun initializeLocalPhoneAccount() { + try { + val operations = ArrayList() + ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).apply { + withValue(RawContacts.ACCOUNT_NAME, null) + withValue(RawContacts.ACCOUNT_TYPE, null) + operations.add(build()) + } + + val results = context.contentResolver.applyBatch(AUTHORITY, operations) + val rawContactUri = results.firstOrNull()?.uri ?: return + context.contentResolver.delete(rawContactUri, null, null) + } catch (ignored: Exception) { + } + } + + private fun getContactSourceType(accountName: String) = getDeviceContactSources().firstOrNull { it.name == accountName }?.type ?: "" + + private fun getContactProjection() = arrayOf( + Data.MIMETYPE, + Data.CONTACT_ID, + Data.RAW_CONTACT_ID, + CommonDataKinds.StructuredName.PREFIX, + CommonDataKinds.StructuredName.GIVEN_NAME, + CommonDataKinds.StructuredName.MIDDLE_NAME, + CommonDataKinds.StructuredName.FAMILY_NAME, + CommonDataKinds.StructuredName.SUFFIX, + CommonDataKinds.StructuredName.PHOTO_URI, + CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI, + CommonDataKinds.StructuredName.STARRED, + CommonDataKinds.StructuredName.CUSTOM_RINGTONE, + RawContacts.ACCOUNT_NAME, + RawContacts.ACCOUNT_TYPE + ) + + private fun getSortString(): String { + val sorting = context.baseConfig.sorting + return when { + sorting and SORT_BY_FIRST_NAME != 0 -> "${CommonDataKinds.StructuredName.GIVEN_NAME} COLLATE NOCASE" + sorting and SORT_BY_MIDDLE_NAME != 0 -> "${CommonDataKinds.StructuredName.MIDDLE_NAME} COLLATE NOCASE" + sorting and SORT_BY_SURNAME != 0 -> "${CommonDataKinds.StructuredName.FAMILY_NAME} COLLATE NOCASE" + sorting and SORT_BY_FULL_NAME != 0 -> CommonDataKinds.StructuredName.DISPLAY_NAME + else -> Data.RAW_CONTACT_ID + } + } + + private fun getRealContactId(id: Long): Int { + val uri = Data.CONTENT_URI + val projection = getContactProjection() + val selection = "(${Data.MIMETYPE} = ? OR ${Data.MIMETYPE} = ?) AND ${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE, id.toString()) + + val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getIntValue(Data.CONTACT_ID) + } + } + + return 0 + } + + fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean { + context.toast(R.string.updating) + if (contact.isPrivate()) { + return LocalContactsHelper(context).insertOrUpdateContact(contact) + } + + try { + val operations = ArrayList() + ContentProviderOperation.newUpdate(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ?" + val selectionArgs = arrayOf(contact.id.toString(), contact.mimetype) + withSelection(selection, selectionArgs) + withValue(CommonDataKinds.StructuredName.PREFIX, contact.prefix) + withValue(CommonDataKinds.StructuredName.GIVEN_NAME, contact.firstName) + withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, contact.middleName) + withValue(CommonDataKinds.StructuredName.FAMILY_NAME, contact.surname) + withValue(CommonDataKinds.StructuredName.SUFFIX, contact.suffix) + operations.add(build()) + } + + // delete nickname + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add nickname + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Nickname.NAME, contact.nickname) + operations.add(build()) + } + + // delete phone numbers + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add phone numbers + contact.phoneNumbers.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Phone.NUMBER, it.value) + withValue(CommonDataKinds.Phone.NORMALIZED_NUMBER, it.normalizedNumber) + withValue(CommonDataKinds.Phone.TYPE, it.type) + withValue(CommonDataKinds.Phone.LABEL, it.label) + withValue(CommonDataKinds.Phone.IS_PRIMARY, it.isPrimary) + operations.add(build()) + } + } + + // delete emails + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Email.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add emails + contact.emails.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Email.DATA, it.value) + withValue(CommonDataKinds.Email.TYPE, it.type) + withValue(CommonDataKinds.Email.LABEL, it.label) + operations.add(build()) + } + } + + // delete addresses + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add addresses + contact.addresses.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, it.value) + withValue(CommonDataKinds.StructuredPostal.TYPE, it.type) + withValue(CommonDataKinds.StructuredPostal.LABEL, it.label) + operations.add(build()) + } + } + + // delete IMs + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Im.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add IMs + contact.IMs.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Im.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Im.DATA, it.value) + withValue(CommonDataKinds.Im.PROTOCOL, it.type) + withValue(CommonDataKinds.Im.CUSTOM_PROTOCOL, it.label) + operations.add(build()) + } + } + + // delete events + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Event.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add events + contact.events.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Event.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Event.START_DATE, it.value) + withValue(CommonDataKinds.Event.TYPE, it.type) + operations.add(build()) + } + } + + // delete notes + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Note.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add notes + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Note.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Note.NOTE, contact.notes) + operations.add(build()) + } + + // delete organization + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add organization + if (contact.organization.isNotEmpty()) { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Organization.COMPANY, contact.organization.company) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) + withValue(CommonDataKinds.Organization.TITLE, contact.organization.jobPosition) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) + operations.add(build()) + } + } + + // delete websites + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Website.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add websites + contact.websites.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Website.URL, it) + withValue(CommonDataKinds.Website.TYPE, DEFAULT_WEBSITE_TYPE) + operations.add(build()) + } + } + + // delete groups + val relevantGroupIDs = getStoredGroupsSync().map { it.id } + if (relevantGroupIDs.isNotEmpty()) { + val IDsString = TextUtils.join(",", relevantGroupIDs) + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? AND ${Data.DATA1} IN ($IDsString)" + val selectionArgs = arrayOf(contact.contactId.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + } + + // add groups + contact.groups.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.GroupMembership.GROUP_ROW_ID, it.id) + operations.add(build()) + } + } + + // favorite, ringtone + try { + val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, contact.contactId.toString()) + val contentValues = ContentValues(2) + contentValues.put(Contacts.STARRED, contact.starred) + contentValues.put(Contacts.CUSTOM_RINGTONE, contact.ringtone) + context.contentResolver.update(uri, contentValues, null, null) + } catch (e: Exception) { + context.showErrorToast(e) + } + + // photo + when (photoUpdateStatus) { + PHOTO_ADDED, PHOTO_CHANGED -> addPhoto(contact, operations) + PHOTO_REMOVED -> removePhoto(contact, operations) + } + + context.contentResolver.applyBatch(AUTHORITY, operations) + return true + } catch (e: Exception) { + context.showErrorToast(e) + return false + } + } + + private fun addPhoto(contact: Contact, operations: ArrayList): ArrayList { + if (contact.photoUri.isNotEmpty()) { + val photoUri = Uri.parse(contact.photoUri) + val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri) + + val thumbnailSize = context.getPhotoThumbnailSize() + val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false) + val scaledSizePhotoData = scaledPhoto.getByteArray() + scaledPhoto.recycle() + + val fullSizePhotoData = bitmap.getByteArray() + bitmap.recycle() + + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, contact.id) + withValue(Data.MIMETYPE, CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Photo.PHOTO, scaledSizePhotoData) + operations.add(build()) + } + + addFullSizePhoto(contact.id.toLong(), fullSizePhotoData) + } + return operations + } + + private fun removePhoto(contact: Contact, operations: ArrayList): ArrayList { + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.RAW_CONTACT_ID} = ? AND ${Data.MIMETYPE} = ?" + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + return operations + } + + fun addContactsToGroup(contacts: ArrayList, groupId: Long) { + try { + val operations = ArrayList() + contacts.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValue(Data.RAW_CONTACT_ID, it.id) + withValue(Data.MIMETYPE, CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.GroupMembership.GROUP_ROW_ID, groupId) + operations.add(build()) + } + + if (operations.size % BATCH_SIZE == 0) { + context.contentResolver.applyBatch(AUTHORITY, operations) + operations.clear() + } + } + + context.contentResolver.applyBatch(AUTHORITY, operations) + } catch (e: Exception) { + context.showErrorToast(e) + } + } + + fun removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + try { + val operations = ArrayList() + contacts.forEach { + ContentProviderOperation.newDelete(Data.CONTENT_URI).apply { + val selection = "${Data.CONTACT_ID} = ? AND ${Data.MIMETYPE} = ? AND ${Data.DATA1} = ?" + val selectionArgs = arrayOf(it.contactId.toString(), CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, groupId.toString()) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + if (operations.size % BATCH_SIZE == 0) { + context.contentResolver.applyBatch(AUTHORITY, operations) + operations.clear() + } + } + context.contentResolver.applyBatch(AUTHORITY, operations) + } catch (e: Exception) { + context.showErrorToast(e) + } + } + + fun insertContact(contact: Contact): Boolean { + if (contact.isPrivate()) { + return LocalContactsHelper(context).insertOrUpdateContact(contact) + } + + try { + val operations = ArrayList() + ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).apply { + withValue(RawContacts.ACCOUNT_NAME, contact.source) + withValue(RawContacts.ACCOUNT_TYPE, getContactSourceType(contact.source)) + operations.add(build()) + } + + // names + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.StructuredName.PREFIX, contact.prefix) + withValue(CommonDataKinds.StructuredName.GIVEN_NAME, contact.firstName) + withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, contact.middleName) + withValue(CommonDataKinds.StructuredName.FAMILY_NAME, contact.surname) + withValue(CommonDataKinds.StructuredName.SUFFIX, contact.suffix) + operations.add(build()) + } + + // nickname + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Nickname.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Nickname.NAME, contact.nickname) + operations.add(build()) + } + + // phone numbers + contact.phoneNumbers.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Phone.NUMBER, it.value) + withValue(CommonDataKinds.Phone.NORMALIZED_NUMBER, it.normalizedNumber) + withValue(CommonDataKinds.Phone.TYPE, it.type) + withValue(CommonDataKinds.Phone.LABEL, it.label) + withValue(CommonDataKinds.Phone.IS_PRIMARY, it.isPrimary) + operations.add(build()) + } + } + + // emails + contact.emails.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Email.DATA, it.value) + withValue(CommonDataKinds.Email.TYPE, it.type) + withValue(CommonDataKinds.Email.LABEL, it.label) + operations.add(build()) + } + } + + // addresses + contact.addresses.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, it.value) + withValue(CommonDataKinds.StructuredPostal.TYPE, it.type) + withValue(CommonDataKinds.StructuredPostal.LABEL, it.label) + operations.add(build()) + } + } + + // IMs + contact.IMs.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Im.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Im.DATA, it.value) + withValue(CommonDataKinds.Im.PROTOCOL, it.type) + withValue(CommonDataKinds.Im.CUSTOM_PROTOCOL, it.label) + operations.add(build()) + } + } + + // events + contact.events.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Event.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Event.START_DATE, it.value) + withValue(CommonDataKinds.Event.TYPE, it.type) + operations.add(build()) + } + } + + // notes + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Note.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Note.NOTE, contact.notes) + operations.add(build()) + } + + // organization + if (contact.organization.isNotEmpty()) { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Organization.COMPANY, contact.organization.company) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) + withValue(CommonDataKinds.Organization.TITLE, contact.organization.jobPosition) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) + operations.add(build()) + } + } + + // websites + contact.websites.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Website.URL, it) + withValue(CommonDataKinds.Website.TYPE, DEFAULT_WEBSITE_TYPE) + operations.add(build()) + } + } + + // groups + contact.groups.forEach { + ContentProviderOperation.newInsert(Data.CONTENT_URI).apply { + withValueBackReference(Data.RAW_CONTACT_ID, 0) + withValue(Data.MIMETYPE, CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.GroupMembership.GROUP_ROW_ID, it.id) + operations.add(build()) + } + } + + // photo (inspired by https://gist.github.com/slightfoot/5985900) + var fullSizePhotoData: ByteArray? = null + if (contact.photoUri.isNotEmpty()) { + val photoUri = Uri.parse(contact.photoUri) + fullSizePhotoData = context.contentResolver.openInputStream(photoUri)?.readBytes() + } + + val results = context.contentResolver.applyBatch(AUTHORITY, operations) + + // storing contacts on some devices seems to be messed up and they move on Phone instead, or disappear completely + // try storing a lighter contact version with this oldschool version too just so it wont disappear, future edits work well + if (getContactSourceType(contact.source).contains(".sim")) { + val simUri = Uri.parse("content://icc/adn") + ContentValues().apply { + put("number", contact.phoneNumbers.firstOrNull()?.value ?: "") + put("tag", contact.getNameToDisplay()) + context.contentResolver.insert(simUri, this) + } + } + + // fullsize photo + val rawId = ContentUris.parseId(results[0].uri!!) + if (contact.photoUri.isNotEmpty() && fullSizePhotoData != null) { + addFullSizePhoto(rawId, fullSizePhotoData) + } + + // favorite, ringtone + val userId = getRealContactId(rawId) + if (userId != 0) { + val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, userId.toString()) + val contentValues = ContentValues(2) + contentValues.put(Contacts.STARRED, contact.starred) + contentValues.put(Contacts.CUSTOM_RINGTONE, contact.ringtone) + context.contentResolver.update(uri, contentValues, null, null) + } + + return true + } catch (e: Exception) { + context.showErrorToast(e) + return false + } + } + + private fun addFullSizePhoto(contactId: Long, fullSizePhotoData: ByteArray) { + val baseUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, contactId) + val displayPhotoUri = Uri.withAppendedPath(baseUri, RawContacts.DisplayPhoto.CONTENT_DIRECTORY) + val fileDescriptor = context.contentResolver.openAssetFileDescriptor(displayPhotoUri, "rw") + val photoStream = fileDescriptor!!.createOutputStream() + photoStream.write(fullSizePhotoData) + photoStream.close() + fileDescriptor.close() + } + + fun getContactMimeTypeId(contactId: String, mimeType: String): String { + val uri = Data.CONTENT_URI + val projection = arrayOf(Data._ID, Data.RAW_CONTACT_ID, Data.MIMETYPE) + val selection = "${Data.MIMETYPE} = ? AND ${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(mimeType, contactId) + + + val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + return cursor.getStringValue(Data._ID) + } + } + return "" + } + + fun addFavorites(contacts: ArrayList) { + ensureBackgroundThread { + toggleLocalFavorites(contacts, true) + if (context.hasContactPermissions()) { + toggleFavorites(contacts, true) + } + } + } + + fun removeFavorites(contacts: ArrayList) { + ensureBackgroundThread { + toggleLocalFavorites(contacts, false) + if (context.hasContactPermissions()) { + toggleFavorites(contacts, false) + } + } + } + + private fun toggleFavorites(contacts: ArrayList, addToFavorites: Boolean) { + try { + val operations = ArrayList() + contacts.filter { !it.isPrivate() }.map { it.contactId.toString() }.forEach { + val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, it) + ContentProviderOperation.newUpdate(uri).apply { + withValue(Contacts.STARRED, if (addToFavorites) 1 else 0) + operations.add(build()) + } + + if (operations.size % BATCH_SIZE == 0) { + context.contentResolver.applyBatch(AUTHORITY, operations) + operations.clear() + } + } + context.contentResolver.applyBatch(AUTHORITY, operations) + } catch (e: Exception) { + context.showErrorToast(e) + } + } + + private fun toggleLocalFavorites(contacts: ArrayList, addToFavorites: Boolean) { + val localContacts = contacts.filter { it.isPrivate() }.map { it.id }.toTypedArray() + LocalContactsHelper(context).toggleFavorites(localContacts, addToFavorites) + } + + fun updateRingtone(contactId: String, newUri: String) { + try { + val operations = ArrayList() + val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, contactId) + ContentProviderOperation.newUpdate(uri).apply { + withValue(Contacts.CUSTOM_RINGTONE, newUri) + operations.add(build()) + } + + context.contentResolver.applyBatch(AUTHORITY, operations) + } catch (e: Exception) { + context.showErrorToast(e) + } + } + + fun deleteContact(originalContact: Contact, deleteClones: Boolean = false, callback: (success: Boolean) -> Unit) { + ensureBackgroundThread { + if (deleteClones) { + getDuplicatesOfContact(originalContact, true) { contacts -> + ensureBackgroundThread { + if (deleteContacts(contacts)) { + callback(true) + } + } + } + } else { + if (deleteContacts(arrayListOf(originalContact))) { + callback(true) + } + } + } + } + + fun deleteContacts(contacts: ArrayList): Boolean { + val localContacts = contacts.filter { it.isPrivate() }.map { it.id.toLong() }.toMutableList() + LocalContactsHelper(context).deleteContactIds(localContacts) + + return try { + val operations = ArrayList() + val selection = "${RawContacts._ID} = ?" + contacts.filter { !it.isPrivate() }.forEach { + ContentProviderOperation.newDelete(RawContacts.CONTENT_URI).apply { + val selectionArgs = arrayOf(it.id.toString()) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + if (operations.size % BATCH_SIZE == 0) { + context.contentResolver.applyBatch(AUTHORITY, operations) + operations.clear() + } + } + + if (context.hasPermission(PERMISSION_WRITE_CONTACTS)) { + context.contentResolver.applyBatch(AUTHORITY, operations) + } + true + } catch (e: Exception) { + context.showErrorToast(e) + false + } + } + + fun getDuplicatesOfContact(contact: Contact, addOriginal: Boolean, callback: (ArrayList) -> Unit) { + ensureBackgroundThread { + getContacts(true, true) { contacts -> + val duplicates = + contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList + if (addOriginal) { + duplicates.add(contact) + } + callback(duplicates) + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Converters.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Converters.kt new file mode 100644 index 000000000..f2e93d89b --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Converters.kt @@ -0,0 +1,76 @@ +package com.simplemobiletools.commons.helpers + +import androidx.room.TypeConverter +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.models.PhoneNumber +import com.simplemobiletools.commons.models.contacts.* + +class Converters { + private val gson = Gson() + private val longType = object : TypeToken>() {}.type + private val stringType = object : TypeToken>() {}.type + private val numberType = object : TypeToken>() {}.type + private val numberConverterType = object : TypeToken>() {}.type + private val emailType = object : TypeToken>() {}.type + private val addressType = object : TypeToken>() {}.type + private val eventType = object : TypeToken>() {}.type + private val imType = object : TypeToken>() {}.type + + @TypeConverter + fun jsonToStringList(value: String) = gson.fromJson>(value, stringType) + + @TypeConverter + fun stringListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToLongList(value: String) = gson.fromJson>(value, longType) + + @TypeConverter + fun longListToJson(list: ArrayList) = gson.toJson(list) + + // some hacky converting is needed since PhoneNumber model has been added to proguard rules, but obfuscated json was stored in database + // convert [{"a":"678910","b":2,"c":"","d":"678910","e":false}] to PhoneNumber(value=678910, type=2, label=, normalizedNumber=678910, isPrimary=false) + @TypeConverter + fun jsonToPhoneNumberList(value: String): ArrayList { + val numbers = gson.fromJson>(value, numberType) + return if (numbers.any { it.value == null }) { + val phoneNumbers = ArrayList() + val numberConverters = gson.fromJson>(value, numberConverterType) + numberConverters.forEach { converter -> + val phoneNumber = PhoneNumber(converter.a, converter.b, converter.c, converter.d, converter.e) + phoneNumbers.add(phoneNumber) + } + phoneNumbers + } else { + numbers + } + } + + @TypeConverter + fun phoneNumberListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToEmailList(value: String) = gson.fromJson>(value, emailType) + + @TypeConverter + fun emailListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToAddressList(value: String) = gson.fromJson>(value, addressType) + + @TypeConverter + fun addressListToJson(list: ArrayList
) = gson.toJson(list) + + @TypeConverter + fun jsonToEventList(value: String) = gson.fromJson>(value, eventType) + + @TypeConverter + fun eventListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToIMsList(value: String) = gson.fromJson>(value, imType) + + @TypeConverter + fun IMsListToJson(list: ArrayList) = gson.toJson(list) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ExternalStorageProviderHack.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ExternalStorageProviderHack.kt new file mode 100644 index 000000000..501b6d34a --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/ExternalStorageProviderHack.kt @@ -0,0 +1,115 @@ +package com.simplemobiletools.commons.helpers + +import android.database.Cursor +import android.database.MatrixCursor +import android.database.MergeCursor +import android.net.Uri +import android.provider.DocumentsContract +import com.simplemobiletools.commons.extensions.getStringValue + +// On Android 11, ExternalStorageProvider no longer returns Android/data and Android/obb as children +// of the Android directory on primary storage. However, the two child directories are actually +// still accessible. +// Inspired by: https://github.com/zhanghai/MaterialFiles/blob/master/app/src/main/java/me/zhanghai/android/files/provider/document/resolver/ExternalStorageProviderPrimaryAndroidDataHack.kt +object ExternalStorageProviderHack { + private const val ANDROID_DATA_DISPLAY_NAME = "data" + private const val ANDROID_OBB_DISPLAY_NAME = "obb" + + private val CHILD_DOCUMENTS_CURSOR_COLUMN_NAMES = arrayOf( + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + DocumentsContract.Document.COLUMN_MIME_TYPE, + DocumentsContract.Document.COLUMN_LAST_MODIFIED, + DocumentsContract.Document.COLUMN_SIZE, + ) + + private fun getAndroidDocumentId(rootDocId: String): String { + return "$rootDocId:Android" + } + + private fun getAndroidDataDocumentId(rootDocId: String): String { + return "${getAndroidDocumentId(rootDocId)}/data" + } + + private fun getAndroidObbDocumentId(rootDocId: String): String { + return "${getAndroidDocumentId(rootDocId)}/obb" + } + + fun transformQueryResult(rootDocId: String, uri: Uri, cursor: Cursor): Cursor { + val documentId = DocumentsContract.getDocumentId(uri) + if (uri.authority == EXTERNAL_STORAGE_PROVIDER_AUTHORITY && documentId == getAndroidDocumentId(rootDocId)) { + var hasDataRow = false + var hasObbRow = false + try { + while (cursor.moveToNext()) { + when (cursor.getStringValue(DocumentsContract.Document.COLUMN_DOCUMENT_ID)) { + getAndroidDataDocumentId(rootDocId) -> + hasDataRow = true + getAndroidObbDocumentId(rootDocId) -> + hasObbRow = true + } + if (hasDataRow && hasObbRow) { + break + } + } + } finally { + cursor.moveToPosition(-1) + } + + if (hasDataRow && hasObbRow) { + return cursor + } + + val extraCursor = MatrixCursor(CHILD_DOCUMENTS_CURSOR_COLUMN_NAMES) + if (!hasDataRow) { + extraCursor.newRow() + .add( + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + getAndroidDataDocumentId(rootDocId) + ) + .add( + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + ANDROID_DATA_DISPLAY_NAME + ) + .add( + DocumentsContract.Document.COLUMN_MIME_TYPE, + DocumentsContract.Document.MIME_TYPE_DIR + ) + .add( + DocumentsContract.Document.COLUMN_LAST_MODIFIED, + System.currentTimeMillis() + ) + .add( + DocumentsContract.Document.COLUMN_SIZE, + 0L + ) + } + + if (!hasObbRow) { + extraCursor.newRow() + .add( + DocumentsContract.Document.COLUMN_DOCUMENT_ID, + getAndroidObbDocumentId(rootDocId) + ) + .add( + DocumentsContract.Document.COLUMN_DISPLAY_NAME, + ANDROID_OBB_DISPLAY_NAME + ) + .add( + DocumentsContract.Document.COLUMN_MIME_TYPE, + DocumentsContract.Document.MIME_TYPE_DIR + ) + .add( + DocumentsContract.Document.COLUMN_LAST_MODIFIED, + System.currentTimeMillis() + ) + .add( + DocumentsContract.Document.COLUMN_SIZE, + 0L + ) + } + return MergeCursor(arrayOf(cursor, extraCursor)) + } + return cursor + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Inlines.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Inlines.kt new file mode 100644 index 000000000..2c117b3be --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/Inlines.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.commons.helpers + +inline fun Iterable.sumByLong(selector: (T) -> Long) = this.map { selector(it) }.sum() + +inline fun Iterable.sumByInt(selector: (T) -> Int) = this.map { selector(it) }.sum() diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/LocalContactsHelper.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/LocalContactsHelper.kt new file mode 100644 index 000000000..41ba0dc85 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/LocalContactsHelper.kt @@ -0,0 +1,172 @@ +package com.simplemobiletools.commons.helpers + +import android.content.Context +import android.graphics.BitmapFactory +import android.net.Uri +import android.provider.ContactsContract.CommonDataKinds.Event +import android.provider.MediaStore +import com.simplemobiletools.commons.extensions.contactsDB +import com.simplemobiletools.commons.extensions.getByteArray +import com.simplemobiletools.commons.extensions.getEmptyContact +import com.simplemobiletools.commons.models.SimpleContact +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.models.contacts.LocalContact + +class LocalContactsHelper(val context: Context) { + fun getAllContacts(favoritesOnly: Boolean = false): ArrayList { + val contacts = if (favoritesOnly) context.contactsDB.getFavoriteContacts() else context.contactsDB.getContacts() + val storedGroups = ContactsHelper(context).getStoredGroupsSync() + return (contacts.map { convertLocalContactToContact(it, storedGroups) }.toMutableList() as? ArrayList) ?: arrayListOf() + } + + fun getContactWithId(id: Int): Contact? { + val storedGroups = ContactsHelper(context).getStoredGroupsSync() + return convertLocalContactToContact(context.contactsDB.getContactWithId(id), storedGroups) + } + + fun insertOrUpdateContact(contact: Contact): Boolean { + val localContact = convertContactToLocalContact(contact) + return context.contactsDB.insertOrUpdate(localContact) > 0 + } + + fun addContactsToGroup(contacts: ArrayList, groupId: Long) { + contacts.forEach { + val localContact = convertContactToLocalContact(it) + val newGroups = localContact.groups + newGroups.add(groupId) + newGroups.distinct() + localContact.groups = newGroups + context.contactsDB.insertOrUpdate(localContact) + } + } + + fun removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + contacts.forEach { + val localContact = convertContactToLocalContact(it) + val newGroups = localContact.groups + newGroups.remove(groupId) + localContact.groups = newGroups + context.contactsDB.insertOrUpdate(localContact) + } + } + + fun deleteContactIds(ids: MutableList) { + ids.chunked(30).forEach { + context.contactsDB.deleteContactIds(it) + } + } + + fun toggleFavorites(ids: Array, addToFavorites: Boolean) { + val isStarred = if (addToFavorites) 1 else 0 + ids.forEach { + context.contactsDB.updateStarred(isStarred, it) + } + } + + fun updateRingtone(id: Int, ringtone: String) { + context.contactsDB.updateRingtone(ringtone, id) + } + + private fun getPhotoByteArray(uri: String): ByteArray { + if (uri.isEmpty()) { + return ByteArray(0) + } + + val photoUri = Uri.parse(uri) + val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri) + + val fullSizePhotoData = bitmap.getByteArray() + bitmap.recycle() + + return fullSizePhotoData + } + + private fun convertLocalContactToContact(localContact: LocalContact?, storedGroups: ArrayList): Contact? { + if (localContact == null) { + return null + } + + val contactPhoto = if (localContact.photo == null) { + null + } else { + try { + BitmapFactory.decodeByteArray(localContact.photo, 0, localContact.photo!!.size) + } catch (e: OutOfMemoryError) { + null + } + } + + return context.getEmptyContact().apply { + id = localContact.id!! + prefix = localContact.prefix + firstName = localContact.firstName + middleName = localContact.middleName + surname = localContact.surname + suffix = localContact.suffix + nickname = localContact.nickname + phoneNumbers = localContact.phoneNumbers + emails = localContact.emails + addresses = localContact.addresses + events = localContact.events + source = SMT_PRIVATE + starred = localContact.starred + contactId = localContact.id!! + thumbnailUri = "" + photo = contactPhoto + photoUri = localContact.photoUri + notes = localContact.notes + groups = storedGroups.filter { localContact.groups.contains(it.id) } as ArrayList + organization = Organization(localContact.company, localContact.jobPosition) + websites = localContact.websites + IMs = localContact.IMs + ringtone = localContact.ringtone + } + } + + private fun convertContactToLocalContact(contact: Contact): LocalContact { + val photoByteArray = if (contact.photoUri.isNotEmpty()) { + getPhotoByteArray(contact.photoUri) + } else { + contact.photo?.getByteArray() + } + + return getEmptyLocalContact().apply { + id = if (contact.id <= FIRST_CONTACT_ID) null else contact.id + prefix = contact.prefix + firstName = contact.firstName + middleName = contact.middleName + surname = contact.surname + suffix = contact.suffix + nickname = contact.nickname + photo = photoByteArray + phoneNumbers = contact.phoneNumbers + emails = contact.emails + events = contact.events + starred = contact.starred + addresses = contact.addresses + notes = contact.notes + groups = contact.groups.map { it.id }.toMutableList() as ArrayList + company = contact.organization.company + jobPosition = contact.organization.jobPosition + websites = contact.websites + IMs = contact.IMs + ringtone = contact.ringtone + } + } + + fun getPrivateSimpleContactsSync(favoritesOnly: Boolean, withPhoneNumbersOnly: Boolean) = getAllContacts(favoritesOnly).mapNotNull { + convertContactToSimpleContact(it, withPhoneNumbersOnly) + } + companion object{ + fun convertContactToSimpleContact(contact: Contact?, withPhoneNumbersOnly: Boolean): SimpleContact?{ + return if (contact == null || (withPhoneNumbersOnly && contact.phoneNumbers.isEmpty())) { + null + } else { + val birthdays = contact.events.filter { it.type == Event.TYPE_BIRTHDAY }.map { it.value }.toMutableList() as ArrayList + val anniversaries = contact.events.filter { it.type == Event.TYPE_ANNIVERSARY }.map { it.value }.toMutableList() as ArrayList + SimpleContact(contact.id, contact.id, contact.getNameToDisplay(), contact.photoUri, contact.phoneNumbers, birthdays, anniversaries) + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContactsContentProvider.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContactsContentProvider.kt new file mode 100644 index 000000000..d5b936627 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContactsContentProvider.kt @@ -0,0 +1,133 @@ +package com.simplemobiletools.commons.helpers + +import android.content.Context +import android.database.Cursor +import android.net.Uri +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.extensions.getIntValue +import com.simplemobiletools.commons.extensions.getStringValue +import com.simplemobiletools.commons.models.PhoneNumber +import com.simplemobiletools.commons.models.SimpleContact +import com.simplemobiletools.commons.models.contacts.Contact + +// used for sharing privately stored contacts in Simple Contacts with Simple Dialer, Simple SMS Messenger and Simple Calendar Pro +class MyContactsContentProvider { + companion object { + private const val AUTHORITY = "com.simplemobiletools.commons.contactsprovider" + val CONTACTS_CONTENT_URI = Uri.parse("content://$AUTHORITY/contacts") + + const val FAVORITES_ONLY = "favorites_only" + const val COL_RAW_ID = "raw_id" + const val COL_CONTACT_ID = "contact_id" + const val COL_NAME = "name" + const val COL_PHOTO_URI = "photo_uri" + const val COL_PHONE_NUMBERS = "phone_numbers" + const val COL_BIRTHDAYS = "birthdays" + const val COL_ANNIVERSARIES = "anniversaries" + + fun getSimpleContacts(context: Context, cursor: Cursor?): ArrayList { + val contacts = ArrayList() + val packageName = context.packageName.removeSuffix(".debug") + if (packageName != "com.simplemobiletools.dialer" && packageName != "com.simplemobiletools.smsmessenger" && packageName != "com.simplemobiletools.calendar.pro") { + return contacts + } + + try { + cursor?.use { + if (cursor.moveToFirst()) { + do { + val rawId = cursor.getIntValue(COL_RAW_ID) + val contactId = cursor.getIntValue(COL_CONTACT_ID) + val name = cursor.getStringValue(COL_NAME) + val photoUri = cursor.getStringValue(COL_PHOTO_URI) + val phoneNumbersJson = cursor.getStringValue(COL_PHONE_NUMBERS) + val birthdaysJson = cursor.getStringValue(COL_BIRTHDAYS) + val anniversariesJson = cursor.getStringValue(COL_ANNIVERSARIES) + + val phoneNumbersToken = object : TypeToken>() {}.type + val phoneNumbers = Gson().fromJson>(phoneNumbersJson, phoneNumbersToken) ?: ArrayList() + + val stringsToken = object : TypeToken>() {}.type + val birthdays = Gson().fromJson>(birthdaysJson, stringsToken) ?: ArrayList() + val anniversaries = Gson().fromJson>(anniversariesJson, stringsToken) ?: ArrayList() + + val contact = SimpleContact(rawId, contactId, name, photoUri, phoneNumbers, birthdays, anniversaries) + contacts.add(contact) + } while (cursor.moveToNext()) + } + } + } catch (ignored: Exception) { + } + return contacts + } + + fun getContacts(context: Context, cursor: Cursor?): ArrayList { + val contacts = ArrayList() + val packageName = context.packageName.removeSuffix(".debug") + if (packageName != "com.simplemobiletools.dialer" && packageName != "com.simplemobiletools.smsmessenger" && packageName != "com.simplemobiletools.calendar.pro") { + return contacts + } + + try { + cursor?.use { + if (cursor.moveToFirst()) { + do { + val rawId = cursor.getIntValue(COL_RAW_ID) + val contactId = cursor.getIntValue(COL_CONTACT_ID) + val name = cursor.getStringValue(COL_NAME) + val photoUri = cursor.getStringValue(COL_PHOTO_URI) + val phoneNumbersJson = cursor.getStringValue(COL_PHONE_NUMBERS) + val birthdaysJson = cursor.getStringValue(COL_BIRTHDAYS) + val anniversariesJson = cursor.getStringValue(COL_ANNIVERSARIES) + + val phoneNumbersToken = object : TypeToken>() {}.type + val phoneNumbers = Gson().fromJson>(phoneNumbersJson, phoneNumbersToken) ?: ArrayList() + + val stringsToken = object : TypeToken>() {}.type + val birthdays = Gson().fromJson>(birthdaysJson, stringsToken) ?: ArrayList() + val anniversaries = Gson().fromJson>(anniversariesJson, stringsToken) ?: ArrayList() + + val names = if (name.contains(",")) { + name.split(",") + } else { + name.split(" ") + } + + var firstName = names.firstOrNull() ?: "" + if (name.contains(",")) { + firstName += ", " + } + + val middleName = if (names.size >= 3) { + names.subList(1, names.size - 1).joinToString(" ") + } else { + "" + } + + val surname = names.lastOrNull()?.takeIf { names.size > 1 } ?: "" + + val contact = Contact( + id = rawId, + contactId = contactId, + firstName = firstName, + middleName = middleName, + surname = surname, + photoUri = photoUri, + phoneNumbers = phoneNumbers, + source = SMT_PRIVATE + ).also { + it.birthdays = birthdays + it.anniversaries = anniversaries + } + + contacts.add(contact) + } while (cursor.moveToNext()) + } + } + } catch (ignored: Exception) { + } + return contacts + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContentProvider.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContentProvider.kt new file mode 100644 index 000000000..e1eb0c578 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContentProvider.kt @@ -0,0 +1,31 @@ +package com.simplemobiletools.commons.helpers + +import android.content.ContentValues +import android.net.Uri +import com.simplemobiletools.commons.models.SharedTheme + +class MyContentProvider { + companion object { + private const val AUTHORITY = "com.simplemobiletools.commons.provider" + const val SHARED_THEME_ACTIVATED = "com.simplemobiletools.commons.SHARED_THEME_ACTIVATED" + const val SHARED_THEME_UPDATED = "com.simplemobiletools.commons.SHARED_THEME_UPDATED" + val MY_CONTENT_URI = Uri.parse("content://$AUTHORITY/themes") + + const val COL_ID = "_id" // used in Simple Thank You + const val COL_TEXT_COLOR = "text_color" + const val COL_BACKGROUND_COLOR = "background_color" + const val COL_PRIMARY_COLOR = "primary_color" + const val COL_ACCENT_COLOR = "accent_color" + const val COL_APP_ICON_COLOR = "app_icon_color" + const val COL_LAST_UPDATED_TS = "last_updated_ts" + + fun fillThemeContentValues(sharedTheme: SharedTheme) = ContentValues().apply { + put(COL_TEXT_COLOR, sharedTheme.textColor) + put(COL_BACKGROUND_COLOR, sharedTheme.backgroundColor) + put(COL_PRIMARY_COLOR, sharedTheme.primaryColor) + put(COL_ACCENT_COLOR, sharedTheme.accentColor) + put(COL_APP_ICON_COLOR, sharedTheme.appIconColor) + put(COL_LAST_UPDATED_TS, System.currentTimeMillis() / 1000) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContextWrapper.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContextWrapper.kt new file mode 100644 index 000000000..104f28dbc --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/MyContextWrapper.kt @@ -0,0 +1,51 @@ +package com.simplemobiletools.commons.helpers + +import android.annotation.TargetApi +import android.content.Context +import android.content.ContextWrapper +import android.content.res.Configuration +import android.os.Build +import java.util.* + +// language forcing used at "Use english language", taken from https://stackoverflow.com/a/40704077/1967672 +class MyContextWrapper(context: Context) : ContextWrapper(context) { + + fun wrap(context: Context, language: String): ContextWrapper { + var newContext = context + val config = newContext.resources.configuration + val sysLocale: Locale? + + sysLocale = if (isNougatPlus()) { + getSystemLocale(config) + } else { + getSystemLocaleLegacy(config) + } + + if (language != "" && sysLocale!!.language != language) { + val locale = Locale(language) + Locale.setDefault(locale) + if (isNougatPlus()) { + setSystemLocale(config, locale) + } else { + setSystemLocaleLegacy(config, locale) + } + } + + newContext = newContext.createConfigurationContext(config) + return MyContextWrapper(newContext) + } + + private fun getSystemLocaleLegacy(config: Configuration) = config.locale + + @TargetApi(Build.VERSION_CODES.N) + private fun getSystemLocale(config: Configuration) = config.locales.get(0) + + private fun setSystemLocaleLegacy(config: Configuration, locale: Locale) { + config.locale = locale + } + + @TargetApi(Build.VERSION_CODES.N) + private fun setSystemLocale(config: Configuration, locale: Locale) { + config.setLocale(locale) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/SimpleContactsHelper.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/SimpleContactsHelper.kt new file mode 100644 index 000000000..decf7f5c2 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/SimpleContactsHelper.kt @@ -0,0 +1,399 @@ +package com.simplemobiletools.commons.helpers + +import android.content.Context +import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.LayerDrawable +import android.net.Uri +import android.provider.ContactsContract.CommonDataKinds.Event +import android.provider.ContactsContract.CommonDataKinds.Organization +import android.provider.ContactsContract.CommonDataKinds.Phone +import android.provider.ContactsContract.CommonDataKinds.StructuredName +import android.provider.ContactsContract.Data +import android.provider.ContactsContract.PhoneLookup +import android.text.TextUtils +import android.util.SparseArray +import android.widget.ImageView +import android.widget.TextView +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DecodeFormat +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestOptions +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.models.PhoneNumber +import com.simplemobiletools.commons.models.SimpleContact + +class SimpleContactsHelper(val context: Context) { + fun getAvailableContacts(favoritesOnly: Boolean, callback: (ArrayList) -> Unit) { + ensureBackgroundThread { + val names = getContactNames(favoritesOnly) + var allContacts = getContactPhoneNumbers(favoritesOnly) + allContacts.forEach { + val contactId = it.rawId + val contact = names.firstOrNull { it.rawId == contactId } + val name = contact?.name + if (name != null) { + it.name = name + } + + val photoUri = contact?.photoUri + if (photoUri != null) { + it.photoUri = photoUri + } + } + + allContacts = allContacts.filter { it.name.isNotEmpty() }.distinctBy { + val startIndex = Math.max(0, it.phoneNumbers.first().normalizedNumber.length - 9) + it.phoneNumbers.first().normalizedNumber.substring(startIndex) + }.distinctBy { it.rawId }.toMutableList() as ArrayList + + // if there are duplicate contacts with the same name, while the first one has phone numbers 1234 and 4567, second one has only 4567, + // use just the first contact + val contactsToRemove = ArrayList() + allContacts.groupBy { it.name }.forEach { + val contacts = it.value.toMutableList() as ArrayList + if (contacts.size > 1) { + contacts.sortByDescending { it.phoneNumbers.size } + if (contacts.any { it.phoneNumbers.size == 1 } && contacts.any { it.phoneNumbers.size > 1 }) { + val multipleNumbersContact = contacts.first() + contacts.subList(1, contacts.size).forEach { contact -> + if (contact.phoneNumbers.all { multipleNumbersContact.doesContainPhoneNumber(it.normalizedNumber) }) { + val contactToRemove = allContacts.firstOrNull { it.rawId == contact.rawId } + if (contactToRemove != null) { + contactsToRemove.add(contactToRemove) + } + } + } + } + } + } + + contactsToRemove.forEach { + allContacts.remove(it) + } + + val birthdays = getContactEvents(true) + var size = birthdays.size() + for (i in 0 until size) { + val key = birthdays.keyAt(i) + allContacts.firstOrNull { it.rawId == key }?.birthdays = birthdays.valueAt(i) + } + + val anniversaries = getContactEvents(false) + size = anniversaries.size() + for (i in 0 until size) { + val key = anniversaries.keyAt(i) + allContacts.firstOrNull { it.rawId == key }?.anniversaries = anniversaries.valueAt(i) + } + + allContacts.sort() + callback(allContacts) + } + } + + private fun getContactNames(favoritesOnly: Boolean): List { + val contacts = ArrayList() + val startNameWithSurname = context.baseConfig.startNameWithSurname + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Data.CONTACT_ID, + StructuredName.PREFIX, + StructuredName.GIVEN_NAME, + StructuredName.MIDDLE_NAME, + StructuredName.FAMILY_NAME, + StructuredName.SUFFIX, + StructuredName.PHOTO_THUMBNAIL_URI, + Organization.COMPANY, + Organization.TITLE, + Data.MIMETYPE + ) + + var selection = "(${Data.MIMETYPE} = ? OR ${Data.MIMETYPE} = ?)" + + if (favoritesOnly) { + selection += " AND ${Data.STARRED} = 1" + } + + val selectionArgs = arrayOf( + StructuredName.CONTENT_ITEM_TYPE, + Organization.CONTENT_ITEM_TYPE + ) + + context.queryCursor(uri, projection, selection, selectionArgs) { cursor -> + val rawId = cursor.getIntValue(Data.RAW_CONTACT_ID) + val contactId = cursor.getIntValue(Data.CONTACT_ID) + val mimetype = cursor.getStringValue(Data.MIMETYPE) + val photoUri = cursor.getStringValue(StructuredName.PHOTO_THUMBNAIL_URI) ?: "" + val isPerson = mimetype == StructuredName.CONTENT_ITEM_TYPE + if (isPerson) { + val prefix = cursor.getStringValue(StructuredName.PREFIX) ?: "" + val firstName = cursor.getStringValue(StructuredName.GIVEN_NAME) ?: "" + val middleName = cursor.getStringValue(StructuredName.MIDDLE_NAME) ?: "" + val familyName = cursor.getStringValue(StructuredName.FAMILY_NAME) ?: "" + val suffix = cursor.getStringValue(StructuredName.SUFFIX) ?: "" + if (firstName.isNotEmpty() || middleName.isNotEmpty() || familyName.isNotEmpty()) { + val names = if (startNameWithSurname) { + arrayOf(prefix, familyName, middleName, firstName, suffix).filter { it.isNotEmpty() } + } else { + arrayOf(prefix, firstName, middleName, familyName, suffix).filter { it.isNotEmpty() } + } + + val fullName = TextUtils.join(" ", names) + val contact = SimpleContact(rawId, contactId, fullName, photoUri, ArrayList(), ArrayList(), ArrayList()) + contacts.add(contact) + } + } + + val isOrganization = mimetype == Organization.CONTENT_ITEM_TYPE + if (isOrganization) { + val company = cursor.getStringValue(Organization.COMPANY) ?: "" + val jobTitle = cursor.getStringValue(Organization.TITLE) ?: "" + if (company.isNotEmpty() || jobTitle.isNotEmpty()) { + val fullName = "$company $jobTitle".trim() + val contact = SimpleContact(rawId, contactId, fullName, photoUri, ArrayList(), ArrayList(), ArrayList()) + contacts.add(contact) + } + } + } + return contacts + } + + private fun getContactPhoneNumbers(favoritesOnly: Boolean): ArrayList { + val contacts = ArrayList() + val uri = Phone.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Data.CONTACT_ID, + Phone.NORMALIZED_NUMBER, + Phone.NUMBER, + Phone.TYPE, + Phone.LABEL, + Phone.IS_PRIMARY + ) + + val selection = if (favoritesOnly) "${Data.STARRED} = 1" else null + + context.queryCursor(uri, projection, selection) { cursor -> + val normalizedNumber = cursor.getStringValue(Phone.NORMALIZED_NUMBER) + ?: cursor.getStringValue(Phone.NUMBER)?.normalizePhoneNumber() ?: return@queryCursor + + val rawId = cursor.getIntValue(Data.RAW_CONTACT_ID) + val contactId = cursor.getIntValue(Data.CONTACT_ID) + val type = cursor.getIntValue(Phone.TYPE) + val label = cursor.getStringValue(Phone.LABEL) ?: "" + val isPrimary = cursor.getIntValue(Phone.IS_PRIMARY) != 0 + + if (contacts.firstOrNull { it.rawId == rawId } == null) { + val contact = SimpleContact(rawId, contactId, "", "", ArrayList(), ArrayList(), ArrayList()) + contacts.add(contact) + } + + val phoneNumber = PhoneNumber(normalizedNumber, type, label, normalizedNumber, isPrimary) + contacts.firstOrNull { it.rawId == rawId }?.phoneNumbers?.add(phoneNumber) + } + return contacts + } + + private fun getContactEvents(getBirthdays: Boolean): SparseArray> { + val eventDates = SparseArray>() + val uri = Data.CONTENT_URI + val projection = arrayOf( + Data.RAW_CONTACT_ID, + Event.START_DATE + ) + + val selection = "${Event.MIMETYPE} = ? AND ${Event.TYPE} = ?" + val requiredType = if (getBirthdays) Event.TYPE_BIRTHDAY.toString() else Event.TYPE_ANNIVERSARY.toString() + val selectionArgs = arrayOf(Event.CONTENT_ITEM_TYPE, requiredType) + + context.queryCursor(uri, projection, selection, selectionArgs) { cursor -> + val id = cursor.getIntValue(Data.RAW_CONTACT_ID) + val startDate = cursor.getStringValue(Event.START_DATE) ?: return@queryCursor + + if (eventDates[id] == null) { + eventDates.put(id, ArrayList()) + } + + eventDates[id]!!.add(startDate) + } + + return eventDates + } + + fun getNameFromPhoneNumber(number: String): String { + if (!context.hasPermission(PERMISSION_READ_CONTACTS)) { + return number + } + + val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)) + val projection = arrayOf( + PhoneLookup.DISPLAY_NAME + ) + + try { + val cursor = context.contentResolver.query(uri, projection, null, null, null) + cursor.use { + if (cursor?.moveToFirst() == true) { + return cursor.getStringValue(PhoneLookup.DISPLAY_NAME) + } + } + } catch (ignored: Exception) { + } + + return number + } + + fun getPhotoUriFromPhoneNumber(number: String): String { + if (!context.hasPermission(PERMISSION_READ_CONTACTS)) { + return "" + } + + val uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)) + val projection = arrayOf( + PhoneLookup.PHOTO_URI + ) + + try { + val cursor = context.contentResolver.query(uri, projection, null, null, null) + cursor.use { + if (cursor?.moveToFirst() == true) { + return cursor.getStringValue(PhoneLookup.PHOTO_URI) ?: "" + } + } + } catch (ignored: Exception) { + } + + return "" + } + + fun loadContactImage(path: String, imageView: ImageView, placeholderName: String, placeholderImage: Drawable? = null) { + val placeholder = placeholderImage ?: BitmapDrawable(context.resources, getContactLetterIcon(placeholderName)) + + val options = RequestOptions() + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .error(placeholder) + .centerCrop() + + Glide.with(context) + .load(path) + .transition(DrawableTransitionOptions.withCrossFade()) + .placeholder(placeholder) + .apply(options) + .apply(RequestOptions.circleCropTransform()) + .into(imageView) + } + + fun getContactLetterIcon(name: String): Bitmap { + val letter = name.getNameLetter() + val size = context.resources.getDimension(R.dimen.normal_icon_size).toInt() + val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bitmap) + val view = TextView(context) + view.layout(0, 0, size, size) + + val circlePaint = Paint().apply { + color = letterBackgroundColors[Math.abs(name.hashCode()) % letterBackgroundColors.size].toInt() + isAntiAlias = true + } + + val wantedTextSize = size / 2f + val textPaint = Paint().apply { + color = circlePaint.color.getContrastColor() + isAntiAlias = true + textAlign = Paint.Align.CENTER + textSize = wantedTextSize + style = Paint.Style.FILL + } + + canvas.drawCircle(size / 2f, size / 2f, size / 2f, circlePaint) + + val xPos = canvas.width / 2f + val yPos = canvas.height / 2 - (textPaint.descent() + textPaint.ascent()) / 2 + canvas.drawText(letter, xPos, yPos, textPaint) + view.draw(canvas) + return bitmap + } + + fun getColoredGroupIcon(title: String): Drawable { + val icon = context.resources.getDrawable(R.drawable.ic_group_circle_bg) + val bgColor = letterBackgroundColors[Math.abs(title.hashCode()) % letterBackgroundColors.size].toInt() + (icon as LayerDrawable).findDrawableByLayerId(R.id.attendee_circular_background).applyColorFilter(bgColor) + return icon + } + + fun getContactLookupKey(contactId: String): String { + val uri = Data.CONTENT_URI + val projection = arrayOf(Data.CONTACT_ID, Data.LOOKUP_KEY) + val selection = "${Data.MIMETYPE} = ? AND ${Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(StructuredName.CONTENT_ITEM_TYPE, contactId) + + val cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor?.use { + if (cursor.moveToFirst()) { + val id = cursor.getIntValue(Data.CONTACT_ID) + val lookupKey = cursor.getStringValue(Data.LOOKUP_KEY) + return "$lookupKey/$id" + } + } + + return "" + } + + fun deleteContactRawIDs(ids: ArrayList, callback: () -> Unit) { + ensureBackgroundThread { + val uri = Data.CONTENT_URI + ids.chunked(30).forEach { chunk -> + val selection = "${Data.RAW_CONTACT_ID} IN (${getQuestionMarks(chunk.size)})" + val selectionArgs = chunk.map { it.toString() }.toTypedArray() + context.contentResolver.delete(uri, selection, selectionArgs) + } + callback() + } + } + + fun getShortcutImage(path: String, placeholderName: String, callback: (image: Bitmap) -> Unit) { + ensureBackgroundThread { + val placeholder = BitmapDrawable(context.resources, getContactLetterIcon(placeholderName)) + try { + val options = RequestOptions() + .format(DecodeFormat.PREFER_ARGB_8888) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .error(placeholder) + .centerCrop() + + val size = context.resources.getDimension(R.dimen.shortcut_size).toInt() + val bitmap = Glide.with(context).asBitmap() + .load(path) + .placeholder(placeholder) + .apply(options) + .apply(RequestOptions.circleCropTransform()) + .into(size, size) + .get() + + callback(bitmap) + } catch (ignored: Exception) { + callback(placeholder.bitmap) + } + } + } + + fun exists(number: String, privateCursor: Cursor?, callback: (Boolean) -> Unit) { + SimpleContactsHelper(context).getAvailableContacts(false) { contacts -> + val contact = contacts.firstOrNull { it.doesHavePhoneNumber(number) } + if (contact != null) { + callback.invoke(true) + } else { + val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor) + val privateContact = privateContacts.firstOrNull { it.doesHavePhoneNumber(number) } + callback.invoke(privateContact != null) + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/VcfExporter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/VcfExporter.kt new file mode 100644 index 000000000..65a9a42d8 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/helpers/VcfExporter.kt @@ -0,0 +1,203 @@ +package com.simplemobiletools.commons.helpers + +import android.net.Uri +import android.provider.ContactsContract.CommonDataKinds +import android.provider.ContactsContract.CommonDataKinds.Event +import android.provider.ContactsContract.CommonDataKinds.Im +import android.provider.ContactsContract.CommonDataKinds.Phone +import android.provider.ContactsContract.CommonDataKinds.StructuredPostal +import android.provider.MediaStore +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.getByteArray +import com.simplemobiletools.commons.extensions.getDateTimeFromDateString +import com.simplemobiletools.commons.extensions.showErrorToast +import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.models.contacts.Contact +import ezvcard.Ezvcard +import ezvcard.VCard +import ezvcard.VCardVersion +import ezvcard.parameter.ImageType +import ezvcard.property.* +import java.io.OutputStream +import java.util.* + +class VcfExporter { + enum class ExportResult { + EXPORT_FAIL, EXPORT_OK, EXPORT_PARTIAL + } + + private var contactsExported = 0 + private var contactsFailed = 0 + + fun exportContacts( + activity: BaseSimpleActivity, + outputStream: OutputStream?, + contacts: ArrayList, + showExportingToast: Boolean, + callback: (result: ExportResult) -> Unit + ) { + try { + if (outputStream == null) { + callback(ExportResult.EXPORT_FAIL) + return + } + + if (showExportingToast) { + activity.toast(R.string.exporting) + } + + val cards = ArrayList() + for (contact in contacts) { + val card = VCard() + + val formattedName = arrayOf(contact.prefix, contact.firstName, contact.middleName, contact.surname, contact.suffix) + .filter { it.isNotEmpty() } + .joinToString(separator = " ") + card.formattedName = FormattedName(formattedName) + + StructuredName().apply { + prefixes.add(contact.prefix) + given = contact.firstName + additionalNames.add(contact.middleName) + family = contact.surname + suffixes.add(contact.suffix) + card.structuredName = this + } + + if (contact.nickname.isNotEmpty()) { + card.setNickname(contact.nickname) + } + + contact.phoneNumbers.forEach { + val phoneNumber = Telephone(it.value) + phoneNumber.parameters.addType(getPhoneNumberTypeLabel(it.type, it.label)) + card.addTelephoneNumber(phoneNumber) + } + + contact.emails.forEach { + val email = Email(it.value) + email.parameters.addType(getEmailTypeLabel(it.type, it.label)) + card.addEmail(email) + } + + contact.events.forEach { event -> + if (event.type == Event.TYPE_ANNIVERSARY || event.type == Event.TYPE_BIRTHDAY) { + val dateTime = event.value.getDateTimeFromDateString(false) + Calendar.getInstance().apply { + clear() + if (event.value.startsWith("--")) { + set(Calendar.YEAR, 1900) + } else { + set(Calendar.YEAR, dateTime.year) + + } + set(Calendar.MONTH, dateTime.monthOfYear - 1) + set(Calendar.DAY_OF_MONTH, dateTime.dayOfMonth) + if (event.type == Event.TYPE_BIRTHDAY) { + card.birthdays.add(Birthday(time)) + } else { + card.anniversaries.add(Anniversary(time)) + } + } + } + } + + contact.addresses.forEach { + val address = Address() + address.streetAddress = it.value + address.parameters.addType(getAddressTypeLabel(it.type, it.label)) + card.addAddress(address) + } + + contact.IMs.forEach { + val impp = when (it.type) { + Im.PROTOCOL_AIM -> Impp.aim(it.value) + Im.PROTOCOL_YAHOO -> Impp.yahoo(it.value) + Im.PROTOCOL_MSN -> Impp.msn(it.value) + Im.PROTOCOL_ICQ -> Impp.icq(it.value) + Im.PROTOCOL_SKYPE -> Impp.skype(it.value) + Im.PROTOCOL_GOOGLE_TALK -> Impp(HANGOUTS, it.value) + Im.PROTOCOL_QQ -> Impp(QQ, it.value) + Im.PROTOCOL_JABBER -> Impp(JABBER, it.value) + else -> Impp(it.label, it.value) + } + + card.addImpp(impp) + } + + if (contact.notes.isNotEmpty()) { + card.addNote(contact.notes) + } + + if (contact.organization.isNotEmpty()) { + val organization = Organization() + organization.values.add(contact.organization.company) + card.organization = organization + card.titles.add(Title(contact.organization.jobPosition)) + } + + contact.websites.forEach { + card.addUrl(it) + } + + if (contact.thumbnailUri.isNotEmpty()) { + val photoByteArray = MediaStore.Images.Media.getBitmap(activity.contentResolver, Uri.parse(contact.thumbnailUri)).getByteArray() + val photo = Photo(photoByteArray, ImageType.JPEG) + card.addPhoto(photo) + } + + if (contact.groups.isNotEmpty()) { + val groupList = Categories() + contact.groups.forEach { + groupList.values.add(it.title) + } + + card.categories = groupList + } + + cards.add(card) + contactsExported++ + } + + Ezvcard.write(cards).version(VCardVersion.V4_0).go(outputStream) + } catch (e: Exception) { + activity.showErrorToast(e) + } + + callback( + when { + contactsExported == 0 -> ExportResult.EXPORT_FAIL + contactsFailed > 0 -> ExportResult.EXPORT_PARTIAL + else -> ExportResult.EXPORT_OK + } + ) + } + + private fun getPhoneNumberTypeLabel(type: Int, label: String) = when (type) { + Phone.TYPE_MOBILE -> CELL + Phone.TYPE_HOME -> HOME + Phone.TYPE_WORK -> WORK + Phone.TYPE_MAIN -> PREF + Phone.TYPE_FAX_WORK -> WORK_FAX + Phone.TYPE_FAX_HOME -> HOME_FAX + Phone.TYPE_PAGER -> PAGER + Phone.TYPE_OTHER -> OTHER + else -> label + } + + private fun getEmailTypeLabel(type: Int, label: String) = when (type) { + CommonDataKinds.Email.TYPE_HOME -> HOME + CommonDataKinds.Email.TYPE_WORK -> WORK + CommonDataKinds.Email.TYPE_MOBILE -> MOBILE + CommonDataKinds.Email.TYPE_OTHER -> OTHER + else -> label + } + + private fun getAddressTypeLabel(type: Int, label: String) = when (type) { + StructuredPostal.TYPE_HOME -> HOME + StructuredPostal.TYPE_WORK -> WORK + StructuredPostal.TYPE_OTHER -> OTHER + else -> label + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ContactsDao.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ContactsDao.kt new file mode 100644 index 000000000..2e63e601e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ContactsDao.kt @@ -0,0 +1,37 @@ +package com.simplemobiletools.commons.interfaces + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.simplemobiletools.commons.models.contacts.LocalContact + +@Dao +interface ContactsDao { + @Query("SELECT * FROM contacts") + fun getContacts(): List + + @Query("SELECT * FROM contacts WHERE starred = 1") + fun getFavoriteContacts(): List + + @Query("SELECT * FROM contacts WHERE id = :id") + fun getContactWithId(id: Int): LocalContact? + + @Query("SELECT * FROM contacts WHERE phone_numbers LIKE :number") + fun getContactWithNumber(number: String): LocalContact? + + @Query("UPDATE contacts SET starred = :isStarred WHERE id = :id") + fun updateStarred(isStarred: Int, id: Int) + + @Query("UPDATE contacts SET ringtone = :ringtone WHERE id = :id") + fun updateRingtone(ringtone: String, id: Int) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertOrUpdate(contact: LocalContact): Long + + @Query("DELETE FROM contacts WHERE id = :id") + fun deleteContactId(id: Int) + + @Query("DELETE FROM contacts WHERE id IN (:ids)") + fun deleteContactIds(ids: List) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/CopyMoveListener.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/CopyMoveListener.kt new file mode 100644 index 000000000..a15289727 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/CopyMoveListener.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.commons.interfaces + +interface CopyMoveListener { + fun copySucceeded(copyOnly: Boolean, copiedAll: Boolean, destinationPath: String, wasCopyingOneFileOnly: Boolean) + + fun copyFailed() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/GroupsDao.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/GroupsDao.kt new file mode 100644 index 000000000..5bf295960 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/GroupsDao.kt @@ -0,0 +1,19 @@ +package com.simplemobiletools.commons.interfaces + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.simplemobiletools.commons.models.contacts.Group + +@Dao +interface GroupsDao { + @Query("SELECT * FROM groups") + fun getGroups(): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertOrUpdate(group: Group): Long + + @Query("DELETE FROM groups WHERE id = :id") + fun deleteGroupId(id: Long) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/HashListener.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/HashListener.kt new file mode 100644 index 000000000..652f2b52e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/HashListener.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.commons.interfaces + +interface HashListener { + fun receivedHash(hash: String, type: Int) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemMoveCallback.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemMoveCallback.kt new file mode 100644 index 000000000..4df864e30 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemMoveCallback.kt @@ -0,0 +1,42 @@ +package com.simplemobiletools.commons.interfaces + +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter + +open class ItemMoveCallback(private val mAdapter: ItemTouchHelperContract, private val allowHorizontalDrag: Boolean = false) : ItemTouchHelper.Callback() { + override fun isLongPressDragEnabled() = false + + override fun isItemViewSwipeEnabled() = false + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) {} + + override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { + var dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN + if (allowHorizontalDrag) { + dragFlags = dragFlags or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT + } + return makeMovementFlags(dragFlags, 0) + } + + override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { + mAdapter.onRowMoved(viewHolder.adapterPosition, target.adapterPosition) + return true + } + + override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { + if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { + if (viewHolder is MyRecyclerViewAdapter.ViewHolder) { + mAdapter.onRowSelected(viewHolder) + } + } + super.onSelectedChanged(viewHolder, actionState) + } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + if (viewHolder is MyRecyclerViewAdapter.ViewHolder) { + mAdapter.onRowClear(viewHolder) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemTouchHelperContract.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemTouchHelperContract.kt new file mode 100644 index 000000000..52c1ec0fe --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/ItemTouchHelperContract.kt @@ -0,0 +1,11 @@ +package com.simplemobiletools.commons.interfaces + +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter + +interface ItemTouchHelperContract { + fun onRowMoved(fromPosition: Int, toPosition: Int) + + fun onRowSelected(myViewHolder: MyRecyclerViewAdapter.ViewHolder?) + + fun onRowClear(myViewHolder: MyRecyclerViewAdapter.ViewHolder?) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/LineColorPickerListener.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/LineColorPickerListener.kt new file mode 100644 index 000000000..dee0ea7d6 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/LineColorPickerListener.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.commons.interfaces + +interface LineColorPickerListener { + fun colorChanged(index: Int, color: Int) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/MyActionModeCallback.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/MyActionModeCallback.kt new file mode 100644 index 000000000..52439db0a --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/MyActionModeCallback.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.commons.interfaces + +import android.view.ActionMode + +abstract class MyActionModeCallback : ActionMode.Callback { + var isSelectable = false +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RecyclerScrollCallback.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RecyclerScrollCallback.kt new file mode 100644 index 000000000..d1ab3a53a --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RecyclerScrollCallback.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.commons.interfaces + +interface RecyclerScrollCallback { + fun onScrolled(scrollY: Int) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RefreshRecyclerViewListener.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RefreshRecyclerViewListener.kt new file mode 100644 index 000000000..3ba64a282 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RefreshRecyclerViewListener.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.commons.interfaces + +interface RefreshRecyclerViewListener { + fun refreshItems() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RenameTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RenameTab.kt new file mode 100644 index 000000000..b9777a220 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/RenameTab.kt @@ -0,0 +1,9 @@ +package com.simplemobiletools.commons.interfaces + +import com.simplemobiletools.commons.activities.BaseSimpleActivity + +interface RenameTab { + fun initTab(activity: BaseSimpleActivity, paths: ArrayList) + + fun dialogConfirmed(useMediaFileExtension: Boolean, callback: (success: Boolean) -> Unit) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/SecurityTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/SecurityTab.kt new file mode 100644 index 000000000..abe216d2b --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/SecurityTab.kt @@ -0,0 +1,16 @@ +package com.simplemobiletools.commons.interfaces + +import androidx.biometric.auth.AuthPromptHost +import com.simplemobiletools.commons.views.MyScrollView + +interface SecurityTab { + fun initTab( + requiredHash: String, + listener: HashListener, + scrollView: MyScrollView, + biometricPromptHost: AuthPromptHost, + showBiometricAuthentication: Boolean + ) + + fun visibilityChanged(isVisible: Boolean) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/StartReorderDragListener.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/StartReorderDragListener.kt new file mode 100644 index 000000000..bc5b068a3 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/interfaces/StartReorderDragListener.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.commons.interfaces + +import androidx.recyclerview.widget.RecyclerView + +interface StartReorderDragListener { + fun requestDrag(viewHolder: RecyclerView.ViewHolder) +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/AlarmSound.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/AlarmSound.kt new file mode 100644 index 000000000..6760631bf --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/AlarmSound.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class AlarmSound(val id: Int, var title: String, var uri: String) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/Android30RenameFormat.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/Android30RenameFormat.kt new file mode 100644 index 000000000..eea02c17b --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/Android30RenameFormat.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.commons.models + +enum class Android30RenameFormat { + SAF, + CONTENT_RESOLVER, + NONE +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/BlockedNumber.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/BlockedNumber.kt new file mode 100644 index 000000000..ae089868f --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/BlockedNumber.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class BlockedNumber(val id: Long, val number: String, val normalizedNumber: String, val numberToCompare: String) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/FAQItem.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/FAQItem.kt new file mode 100644 index 000000000..b0462e1b8 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/FAQItem.kt @@ -0,0 +1,9 @@ +package com.simplemobiletools.commons.models + +import java.io.Serializable + +data class FAQItem(val title: Any, val text: Any) : Serializable { + companion object { + private const val serialVersionUID = -6553345863512345L + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/FileDirItem.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/FileDirItem.kt new file mode 100644 index 000000000..cc2c2fb53 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/FileDirItem.kt @@ -0,0 +1,158 @@ +package com.simplemobiletools.commons.models + +import android.content.Context +import android.net.Uri +import android.provider.MediaStore +import com.bumptech.glide.signature.ObjectKey +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.* +import java.io.File + +open class FileDirItem( + val path: String, + val name: String = "", + var isDirectory: Boolean = false, + var children: Int = 0, + var size: Long = 0L, + var modified: Long = 0L, + var mediaStoreId: Long = 0L +) : + Comparable { + companion object { + var sorting = 0 + } + + override fun toString() = + "FileDirItem(path=$path, name=$name, isDirectory=$isDirectory, children=$children, size=$size, modified=$modified, mediaStoreId=$mediaStoreId)" + + override fun compareTo(other: FileDirItem): Int { + return if (isDirectory && !other.isDirectory) { + -1 + } else if (!isDirectory && other.isDirectory) { + 1 + } else { + var result: Int + when { + sorting and SORT_BY_NAME != 0 -> { + result = if (sorting and SORT_USE_NUMERIC_VALUE != 0) { + AlphanumericComparator().compare(name.normalizeString().toLowerCase(), other.name.normalizeString().toLowerCase()) + } else { + name.normalizeString().toLowerCase().compareTo(other.name.normalizeString().toLowerCase()) + } + } + sorting and SORT_BY_SIZE != 0 -> result = when { + size == other.size -> 0 + size > other.size -> 1 + else -> -1 + } + sorting and SORT_BY_DATE_MODIFIED != 0 -> { + result = when { + modified == other.modified -> 0 + modified > other.modified -> 1 + else -> -1 + } + } + else -> { + result = getExtension().toLowerCase().compareTo(other.getExtension().toLowerCase()) + } + } + + if (sorting and SORT_DESCENDING != 0) { + result *= -1 + } + result + } + } + + fun getExtension() = if (isDirectory) name else path.substringAfterLast('.', "") + + fun getBubbleText(context: Context, dateFormat: String? = null, timeFormat: String? = null) = when { + sorting and SORT_BY_SIZE != 0 -> size.formatSize() + sorting and SORT_BY_DATE_MODIFIED != 0 -> modified.formatDate(context, dateFormat, timeFormat) + sorting and SORT_BY_EXTENSION != 0 -> getExtension().toLowerCase() + else -> name + } + + fun getProperSize(context: Context, countHidden: Boolean): Long { + return when { + context.isRestrictedSAFOnlyRoot(path) -> context.getAndroidSAFFileSize(path) + context.isPathOnOTG(path) -> context.getDocumentFile(path)?.getItemSize(countHidden) ?: 0 + isNougatPlus() && path.startsWith("content://") -> { + try { + context.contentResolver.openInputStream(Uri.parse(path))?.available()?.toLong() ?: 0L + } catch (e: Exception) { + context.getSizeFromContentUri(Uri.parse(path)) + } + } + else -> File(path).getProperSize(countHidden) + } + } + + fun getProperFileCount(context: Context, countHidden: Boolean): Int { + return when { + context.isRestrictedSAFOnlyRoot(path) -> context.getAndroidSAFFileCount(path, countHidden) + context.isPathOnOTG(path) -> context.getDocumentFile(path)?.getFileCount(countHidden) ?: 0 + else -> File(path).getFileCount(countHidden) + } + } + + fun getDirectChildrenCount(context: Context, countHiddenItems: Boolean): Int { + return when { + context.isRestrictedSAFOnlyRoot(path) -> context.getAndroidSAFDirectChildrenCount(path, countHiddenItems) + context.isPathOnOTG(path) -> context.getDocumentFile(path)?.listFiles()?.filter { if (countHiddenItems) true else !it.name!!.startsWith(".") }?.size + ?: 0 + else -> File(path).getDirectChildrenCount(context, countHiddenItems) + } + } + + fun getLastModified(context: Context): Long { + return when { + context.isRestrictedSAFOnlyRoot(path) -> context.getAndroidSAFLastModified(path) + context.isPathOnOTG(path) -> context.getFastDocumentFile(path)?.lastModified() ?: 0L + isNougatPlus() && path.startsWith("content://") -> context.getMediaStoreLastModified(path) + else -> File(path).lastModified() + } + } + + fun getParentPath() = path.getParentPath() + + fun getDuration(context: Context) = context.getDuration(path)?.getFormattedDuration() + + fun getFileDurationSeconds(context: Context) = context.getDuration(path) + + fun getArtist(context: Context) = context.getArtist(path) + + fun getAlbum(context: Context) = context.getAlbum(path) + + fun getTitle(context: Context) = context.getTitle(path) + + fun getResolution(context: Context) = context.getResolution(path) + + fun getVideoResolution(context: Context) = context.getVideoResolution(path) + + fun getImageResolution(context: Context) = context.getImageResolution(path) + + fun getPublicUri(context: Context) = context.getDocumentFile(path)?.uri ?: "" + + fun getSignature(): String { + val lastModified = if (modified > 1) { + modified + } else { + File(path).lastModified() + } + + return "$path-$lastModified-$size" + } + + fun getKey() = ObjectKey(getSignature()) + + fun assembleContentUri(): Uri { + val uri = when { + path.isImageFast() -> MediaStore.Images.Media.EXTERNAL_CONTENT_URI + path.isVideoFast() -> MediaStore.Video.Media.EXTERNAL_CONTENT_URI + else -> MediaStore.Files.getContentUri("external") + } + + return Uri.withAppendedPath(uri, mediaStoreId.toString()) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/LanguageContributor.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/LanguageContributor.kt new file mode 100644 index 000000000..b4c6ee00d --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/LanguageContributor.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class LanguageContributor(val iconId: Int, val labelId: Int, val contributorsId: Int) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/License.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/License.kt new file mode 100644 index 000000000..95abe78c6 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/License.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class License(val id: Long, val titleId: Int, val textId: Int, val urlId: Int) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/MyTheme.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/MyTheme.kt new file mode 100644 index 000000000..ad022aed0 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/MyTheme.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class MyTheme(val label: String, val textColorId: Int, val backgroundColorId: Int, val primaryColorId: Int, val appIconColorId: Int) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/PhoneNumber.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/PhoneNumber.kt new file mode 100644 index 000000000..f2b6eb046 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/PhoneNumber.kt @@ -0,0 +1,4 @@ +package com.simplemobiletools.commons.models + +data class PhoneNumber(var value: String, var type: Int, var label: String, var normalizedNumber: String, var isPrimary: Boolean = false) + diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/RadioItem.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/RadioItem.kt new file mode 100644 index 000000000..9a5a64811 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/RadioItem.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class RadioItem(val id: Int, val title: String, val value: Any = id) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/RecyclerViewPayloads.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/RecyclerViewPayloads.kt new file mode 100644 index 000000000..08dd297e7 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/RecyclerViewPayloads.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class RecyclerSelectionPayload(val selected: Boolean) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/Release.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/Release.kt new file mode 100644 index 000000000..d3ad1269c --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/Release.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models + +data class Release(val id: Int, val textId: Int) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/SharedTheme.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/SharedTheme.kt new file mode 100644 index 000000000..a3f9639af --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/SharedTheme.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.commons.models + +data class SharedTheme( + val textColor: Int, val backgroundColor: Int, val primaryColor: Int, val appIconColor: Int, val lastUpdatedTS: Int = 0, val accentColor: Int +) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleContact.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleContact.kt new file mode 100644 index 000000000..75b2b6df9 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleContact.kt @@ -0,0 +1,98 @@ +package com.simplemobiletools.commons.models + +import android.telephony.PhoneNumberUtils +import com.simplemobiletools.commons.extensions.normalizePhoneNumber +import com.simplemobiletools.commons.extensions.normalizeString +import com.simplemobiletools.commons.helpers.SORT_BY_FULL_NAME +import com.simplemobiletools.commons.helpers.SORT_DESCENDING + +data class SimpleContact( + val rawId: Int, + val contactId: Int, + var name: String, + var photoUri: String, + var phoneNumbers: ArrayList, + var birthdays: ArrayList, + var anniversaries: ArrayList +) : Comparable { + + companion object { + var sorting = -1 + } + + override fun compareTo(other: SimpleContact): Int { + if (sorting == -1) { + return compareByFullName(other) + } + + var result = when { + sorting and SORT_BY_FULL_NAME != 0 -> compareByFullName(other) + else -> rawId.compareTo(other.rawId) + } + + if (sorting and SORT_DESCENDING != 0) { + result *= -1 + } + + return result + } + + private fun compareByFullName(other: SimpleContact): Int { + val firstString = name.normalizeString() + val secondString = other.name.normalizeString() + + return if (firstString.firstOrNull()?.isLetter() == true && secondString.firstOrNull()?.isLetter() == false) { + -1 + } else if (firstString.firstOrNull()?.isLetter() == false && secondString.firstOrNull()?.isLetter() == true) { + 1 + } else { + if (firstString.isEmpty() && secondString.isNotEmpty()) { + 1 + } else if (firstString.isNotEmpty() && secondString.isEmpty()) { + -1 + } else { + firstString.compareTo(secondString, true) + } + } + } + + fun doesContainPhoneNumber(text: String): Boolean { + return if (text.isNotEmpty()) { + val normalizedText = text.normalizePhoneNumber() + if (normalizedText.isEmpty()) { + phoneNumbers.map { it.normalizedNumber }.any { phoneNumber -> + phoneNumber.contains(text) + } + } else { + phoneNumbers.map { it.normalizedNumber }.any { phoneNumber -> + PhoneNumberUtils.compare(phoneNumber.normalizePhoneNumber(), normalizedText) || + phoneNumber.contains(text) || + phoneNumber.normalizePhoneNumber().contains(normalizedText) || + phoneNumber.contains(normalizedText) + } + } + } else { + false + } + } + + fun doesHavePhoneNumber(text: String): Boolean { + return if (text.isNotEmpty()) { + val normalizedText = text.normalizePhoneNumber() + if (normalizedText.isEmpty()) { + phoneNumbers.map { it.normalizedNumber }.any { phoneNumber -> + phoneNumber == text + } + } else { + phoneNumbers.map { it.normalizedNumber }.any { phoneNumber -> + PhoneNumberUtils.compare(phoneNumber.normalizePhoneNumber(), normalizedText) || + phoneNumber == text || + phoneNumber.normalizePhoneNumber() == normalizedText || + phoneNumber == normalizedText + } + } + } else { + false + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleListItem.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleListItem.kt new file mode 100644 index 000000000..2a932ac1b --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/SimpleListItem.kt @@ -0,0 +1,18 @@ +package com.simplemobiletools.commons.models + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class SimpleListItem(val id: Int, val textRes: Int, val imageRes: Int? = null, val selected: Boolean = false) : Parcelable { + + companion object { + fun areItemsTheSame(old: SimpleListItem, new: SimpleListItem): Boolean { + return old.id == new.id + } + + fun areContentsTheSame(old: SimpleListItem, new: SimpleListItem): Boolean { + return old.imageRes == new.imageRes && old.textRes == new.textRes && old.selected == new.selected + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Address.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Address.kt new file mode 100644 index 000000000..17b42faf3 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Address.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models.contacts + +data class Address(var value: String, var type: Int, var label: String) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Contact.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Contact.kt new file mode 100644 index 000000000..04cce29dc --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Contact.kt @@ -0,0 +1,247 @@ +package com.simplemobiletools.commons.models.contacts + +import android.graphics.Bitmap +import android.provider.ContactsContract +import android.telephony.PhoneNumberUtils +import com.simplemobiletools.commons.extensions.normalizePhoneNumber +import com.simplemobiletools.commons.extensions.normalizeString +import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.PhoneNumber + +data class Contact( + var id: Int, + var prefix: String= "", + var firstName: String= "", + var middleName: String= "", + var surname: String= "", + var suffix: String= "", + var nickname: String= "", + var photoUri: String= "", + var phoneNumbers: ArrayList = arrayListOf(), + var emails: ArrayList = arrayListOf(), + var addresses: ArrayList
= arrayListOf(), + var events: ArrayList = arrayListOf(), + var source: String= "", + var starred: Int = 0, + var contactId: Int, + var thumbnailUri: String= "", + var photo: Bitmap? = null, + var notes: String= "", + var groups: ArrayList = arrayListOf(), + var organization: Organization = Organization("",""), + var websites: ArrayList = arrayListOf(), + var IMs: ArrayList = arrayListOf(), + var mimetype: String = "", + var ringtone: String? = "" +) : Comparable { + val rawId = id + val name = getNameToDisplay() + var birthdays = events.filter { it.type == ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY }.map { it.value }.toMutableList() as ArrayList + var anniversaries = events.filter { it.type == ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY }.map { it.value }.toMutableList() as ArrayList + + companion object { + var sorting = 0 + var startWithSurname = false + } + + override fun compareTo(other: Contact): Int { + var result = when { + sorting and SORT_BY_FIRST_NAME != 0 -> { + val firstString = firstName.normalizeString() + val secondString = other.firstName.normalizeString() + compareUsingStrings(firstString, secondString, other) + } + sorting and SORT_BY_MIDDLE_NAME != 0 -> { + val firstString = middleName.normalizeString() + val secondString = other.middleName.normalizeString() + compareUsingStrings(firstString, secondString, other) + } + sorting and SORT_BY_SURNAME != 0 -> { + val firstString = surname.normalizeString() + val secondString = other.surname.normalizeString() + compareUsingStrings(firstString, secondString, other) + } + sorting and SORT_BY_FULL_NAME != 0 -> { + val firstString = getNameToDisplay().normalizeString() + val secondString = other.getNameToDisplay().normalizeString() + compareUsingStrings(firstString, secondString, other) + } + else -> compareUsingIds(other) + } + + if (sorting and SORT_DESCENDING != 0) { + result *= -1 + } + + return result + } + + private fun compareUsingStrings(firstString: String, secondString: String, other: Contact): Int { + var firstValue = firstString + var secondValue = secondString + + if (firstValue.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty()) { + val fullCompany = getFullCompany() + if (fullCompany.isNotEmpty()) { + firstValue = fullCompany.normalizeString() + } else if (emails.isNotEmpty()) { + firstValue = emails.first().value + } + } + + if (secondValue.isEmpty() && other.firstName.isEmpty() && other.middleName.isEmpty() && other.surname.isEmpty()) { + val otherFullCompany = other.getFullCompany() + if (otherFullCompany.isNotEmpty()) { + secondValue = otherFullCompany.normalizeString() + } else if (other.emails.isNotEmpty()) { + secondValue = other.emails.first().value + } + } + + return if (firstValue.firstOrNull()?.isLetter() == true && secondValue.firstOrNull()?.isLetter() == false) { + -1 + } else if (firstValue.firstOrNull()?.isLetter() == false && secondValue.firstOrNull()?.isLetter() == true) { + 1 + } else { + if (firstValue.isEmpty() && secondValue.isNotEmpty()) { + 1 + } else if (firstValue.isNotEmpty() && secondValue.isEmpty()) { + -1 + } else { + if (firstValue.equals(secondValue, ignoreCase = true)) { + getNameToDisplay().compareTo(other.getNameToDisplay(), true) + } else { + firstValue.compareTo(secondValue, true) + } + } + } + } + + private fun compareUsingIds(other: Contact): Int { + val firstId = id + val secondId = other.id + return firstId.compareTo(secondId) + } + + fun getBubbleText() = when { + sorting and SORT_BY_FIRST_NAME != 0 -> firstName + sorting and SORT_BY_MIDDLE_NAME != 0 -> middleName + else -> surname + } + + fun getNameToDisplay(): String { + val firstMiddle = "$firstName $middleName".trim() + val firstPart = if (startWithSurname) { + if (surname.isNotEmpty() && firstMiddle.isNotEmpty()) { + "$surname," + } else { + surname + } + } else { + firstMiddle + } + val lastPart = if (startWithSurname) firstMiddle else surname + val suffixComma = if (suffix.isEmpty()) "" else ", $suffix" + val fullName = "$prefix $firstPart $lastPart$suffixComma".trim() + val organization = getFullCompany() + val email = emails.firstOrNull()?.value?.trim() + val phoneNumber = phoneNumbers.firstOrNull()?.normalizedNumber + + return when { + fullName.isNotBlank() -> fullName + organization.isNotBlank() -> organization + !email.isNullOrBlank() -> email + !phoneNumber.isNullOrBlank() -> phoneNumber + else -> return "" + } + } + + // photos stored locally always have different hashcodes. Avoid constantly refreshing the contact lists as the app thinks something changed. + fun getHashWithoutPrivatePhoto(): Int { + val photoToUse = if (isPrivate()) null else photo + return copy(photo = photoToUse).hashCode() + } + + fun getStringToCompare(): String { + val photoToUse = if (isPrivate()) null else photo + return copy( + id = 0, + prefix = "", + firstName = getNameToDisplay().toLowerCase(), + middleName = "", + surname = "", + suffix = "", + nickname = "", + photoUri = "", + phoneNumbers = ArrayList(), + emails = ArrayList(), + events = ArrayList(), + source = "", + addresses = ArrayList(), + starred = 0, + contactId = 0, + thumbnailUri = "", + photo = photoToUse, + notes = "", + groups = ArrayList(), + websites = ArrayList(), + organization = Organization("", ""), + IMs = ArrayList(), + ringtone = "" + ).toString() + } + + fun getHashToCompare() = getStringToCompare().hashCode() + + fun getFullCompany(): String { + var fullOrganization = if (organization.company.isEmpty()) "" else "${organization.company}, " + fullOrganization += organization.jobPosition + return fullOrganization.trim().trimEnd(',') + } + + fun isABusinessContact() = + prefix.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty() && suffix.isEmpty() && organization.isNotEmpty() + + fun doesContainPhoneNumber(text: String, convertLetters: Boolean = false): Boolean { + return if (text.isNotEmpty()) { + val normalizedText = if (convertLetters) text.normalizePhoneNumber() else text + phoneNumbers.any { + PhoneNumberUtils.compare(it.normalizedNumber, normalizedText) || + it.value.contains(text) || + it.normalizedNumber.contains(normalizedText) || + it.value.normalizePhoneNumber().contains(normalizedText) + } + } else { + false + } + } + + fun doesHavePhoneNumber(text: String): Boolean { + return if (text.isNotEmpty()) { + val normalizedText = text.normalizePhoneNumber() + if (normalizedText.isEmpty()) { + phoneNumbers.map { it.normalizedNumber }.any { phoneNumber -> + phoneNumber == text + } + } else { + phoneNumbers.map { it.normalizedNumber }.any { phoneNumber -> + PhoneNumberUtils.compare(phoneNumber.normalizePhoneNumber(), normalizedText) || + phoneNumber == text || + phoneNumber.normalizePhoneNumber() == normalizedText || + phoneNumber == normalizedText + } + } + } else { + false + } + } + + fun isPrivate() = source == SMT_PRIVATE + + fun getSignatureKey() = if (photoUri.isNotEmpty()) photoUri else hashCode() + + fun getPrimaryNumber(): String? { + val primaryNumber = phoneNumbers.firstOrNull { it.isPrimary } + return primaryNumber?.normalizedNumber ?: phoneNumbers.firstOrNull()?.normalizedNumber + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/ContactSource.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/ContactSource.kt new file mode 100644 index 000000000..c0e6238e4 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/ContactSource.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.commons.models.contacts + +import com.simplemobiletools.commons.helpers.SMT_PRIVATE + +data class ContactSource(var name: String, var type: String, var publicName: String, var count: Int = 0) { + fun getFullIdentifier(): String { + return if (type == SMT_PRIVATE) { + type + } else { + "$name:$type" + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Email.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Email.kt new file mode 100644 index 000000000..f3a163706 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Email.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models.contacts + +data class Email(var value: String, var type: Int, var label: String) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Event.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Event.kt new file mode 100644 index 000000000..b0c9ec9e2 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Event.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models.contacts + +data class Event(var value: String, var type: Int) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Group.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Group.kt new file mode 100644 index 000000000..4bd797d6e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Group.kt @@ -0,0 +1,22 @@ +package com.simplemobiletools.commons.models.contacts + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey +import com.simplemobiletools.commons.helpers.FIRST_GROUP_ID +import java.io.Serializable + +@Entity(tableName = "groups", indices = [(Index(value = ["id"], unique = true))]) +data class Group( + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "title") var title: String, + @ColumnInfo(name = "contacts_count") var contactsCount: Int = 0 +) : Serializable { + + fun addContact() = contactsCount++ + + fun getBubbleText() = title + + fun isPrivateSecretGroup() = id ?: 0 >= FIRST_GROUP_ID +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/IM.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/IM.kt new file mode 100644 index 000000000..317500498 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/IM.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models.contacts + +data class IM(var value: String, var type: Int, var label: String) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/LocalContact.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/LocalContact.kt new file mode 100644 index 000000000..7d077b68f --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/LocalContact.kt @@ -0,0 +1,36 @@ +package com.simplemobiletools.commons.models.contacts + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey +import com.simplemobiletools.commons.models.PhoneNumber + +@Entity(tableName = "contacts", indices = [(Index(value = ["id"], unique = true))]) +data class LocalContact( + @PrimaryKey(autoGenerate = true) var id: Int?, + @ColumnInfo(name = "prefix") var prefix: String, + @ColumnInfo(name = "first_name") var firstName: String, + @ColumnInfo(name = "middle_name") var middleName: String, + @ColumnInfo(name = "surname") var surname: String, + @ColumnInfo(name = "suffix") var suffix: String, + @ColumnInfo(name = "nickname") var nickname: String, + @ColumnInfo(name = "photo", typeAffinity = ColumnInfo.BLOB) var photo: ByteArray?, + @ColumnInfo(name = "photo_uri") var photoUri: String, + @ColumnInfo(name = "phone_numbers") var phoneNumbers: ArrayList, + @ColumnInfo(name = "emails") var emails: ArrayList, + @ColumnInfo(name = "events") var events: ArrayList, + @ColumnInfo(name = "starred") var starred: Int, + @ColumnInfo(name = "addresses") var addresses: ArrayList
, + @ColumnInfo(name = "notes") var notes: String, + @ColumnInfo(name = "groups") var groups: ArrayList, + @ColumnInfo(name = "company") var company: String, + @ColumnInfo(name = "job_position") var jobPosition: String, + @ColumnInfo(name = "websites") var websites: ArrayList, + @ColumnInfo(name = "ims") var IMs: ArrayList, + @ColumnInfo(name = "ringtone") var ringtone: String? +) { + override fun equals(other: Any?) = id == (other as? LocalContact?)?.id + + override fun hashCode() = id ?: 0 +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Organization.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Organization.kt new file mode 100644 index 000000000..a60a7c06d --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/Organization.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.commons.models.contacts + +data class Organization(var company: String, var jobPosition: String) { + fun isEmpty() = company.isEmpty() && jobPosition.isEmpty() + + fun isNotEmpty() = !isEmpty() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/PhoneNumberConverter.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/PhoneNumberConverter.kt new file mode 100644 index 000000000..11b28f6ff --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/PhoneNumberConverter.kt @@ -0,0 +1,4 @@ +package com.simplemobiletools.commons.models.contacts + +// need for hacky parsing of no longer minified PhoneNumber model in Converters.kt +data class PhoneNumberConverter(var a: String, var b: Int, var c: String, var d: String, var e: Boolean = false) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/SocialAction.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/SocialAction.kt new file mode 100644 index 000000000..a5691fb2f --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/models/contacts/SocialAction.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.commons.models.contacts + +data class SocialAction(var actionId: Int, var type: Int, var label: String, var mimetype: String, val dataId: Long, val packageName: String) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/overloads/String.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/overloads/String.kt new file mode 100644 index 000000000..cf02c2975 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/overloads/String.kt @@ -0,0 +1,9 @@ +package com.simplemobiletools.commons.overloads + +operator fun String.times(x: Int): String { + val stringBuilder = StringBuilder() + for (i in 1..x) { + stringBuilder.append(this) + } + return stringBuilder.toString() +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/receivers/SharedThemeReceiver.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/receivers/SharedThemeReceiver.kt new file mode 100644 index 000000000..f8b7e13be --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/receivers/SharedThemeReceiver.kt @@ -0,0 +1,54 @@ +package com.simplemobiletools.commons.receivers + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.simplemobiletools.commons.extensions.baseConfig +import com.simplemobiletools.commons.extensions.checkAppIconColor +import com.simplemobiletools.commons.extensions.getSharedTheme +import com.simplemobiletools.commons.helpers.MyContentProvider + +class SharedThemeReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + context.baseConfig.apply { + val oldColor = appIconColor + if (intent.action == MyContentProvider.SHARED_THEME_ACTIVATED) { + if (!wasSharedThemeForced) { + wasSharedThemeForced = true + isUsingSharedTheme = true + wasSharedThemeEverActivated = true + + context.getSharedTheme { + if (it != null) { + textColor = it.textColor + backgroundColor = it.backgroundColor + primaryColor = it.primaryColor + accentColor = it.accentColor + appIconColor = it.appIconColor + checkAppIconColorChanged(oldColor, appIconColor, context) + } + } + } + } else if (intent.action == MyContentProvider.SHARED_THEME_UPDATED) { + if (isUsingSharedTheme) { + context.getSharedTheme { + if (it != null) { + textColor = it.textColor + backgroundColor = it.backgroundColor + primaryColor = it.primaryColor + accentColor = it.accentColor + appIconColor = it.appIconColor + checkAppIconColorChanged(oldColor, appIconColor, context) + } + } + } + } + } + } + + private fun checkAppIconColorChanged(oldColor: Int, newColor: Int, context: Context) { + if (oldColor != newColor) { + context.checkAppIconColor() + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/BiometricIdTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/BiometricIdTab.kt new file mode 100644 index 000000000..9aa8ae7d0 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/BiometricIdTab.kt @@ -0,0 +1,47 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import androidx.biometric.auth.AuthPromptHost +import androidx.constraintlayout.widget.ConstraintLayout +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.DARK_GREY +import com.simplemobiletools.commons.interfaces.HashListener +import com.simplemobiletools.commons.interfaces.SecurityTab +import kotlinx.android.synthetic.main.tab_biometric_id.view.* + +class BiometricIdTab(context: Context, attrs: AttributeSet) : ConstraintLayout(context, attrs), SecurityTab { + private lateinit var hashListener: HashListener + private lateinit var biometricPromptHost: AuthPromptHost + + override fun onFinishInflate() { + super.onFinishInflate() + context.updateTextColors(biometric_lock_holder) + val textColor = if (context.isWhiteTheme()) { + DARK_GREY + } else { + context.getProperPrimaryColor().getContrastColor() + } + + open_biometric_dialog.setTextColor(textColor) + open_biometric_dialog.setOnClickListener { + biometricPromptHost.activity?.showBiometricPrompt(successCallback = hashListener::receivedHash) + } + } + + override fun initTab( + requiredHash: String, + listener: HashListener, + scrollView: MyScrollView, + biometricPromptHost: AuthPromptHost, + showBiometricAuthentication: Boolean + ) { + this.biometricPromptHost = biometricPromptHost + hashListener = listener + if (showBiometricAuthentication) { + open_biometric_dialog.performClick() + } + } + + override fun visibilityChanged(isVisible: Boolean) {} +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/Breadcrumbs.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/Breadcrumbs.kt new file mode 100644 index 000000000..627d53c55 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/Breadcrumbs.kt @@ -0,0 +1,268 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.drawable.ColorDrawable +import android.util.AttributeSet +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.widget.HorizontalScrollView +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.models.FileDirItem +import kotlinx.android.synthetic.main.item_breadcrumb.view.* + +class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView(context, attrs) { + private val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + private val itemsLayout: LinearLayout + private var textColor = context.getProperTextColor() + private var fontSize = resources.getDimension(R.dimen.bigger_text_size) + private var lastPath = "" + private var isLayoutDirty = true + private var isScrollToSelectedItemPending = false + private var isFirstScroll = true + private var stickyRootInitialLeft = 0 + private var rootStartPadding = 0 + + private val textColorStateList: ColorStateList + get() = ColorStateList( + arrayOf(intArrayOf(android.R.attr.state_activated), intArrayOf()), + intArrayOf( + textColor, + textColor.adjustAlpha(0.6f) + ) + ) + + var listener: BreadcrumbsListener? = null + var isShownInDialog = false + + init { + isHorizontalScrollBarEnabled = false + itemsLayout = LinearLayout(context) + itemsLayout.orientation = LinearLayout.HORIZONTAL + rootStartPadding = paddingStart + itemsLayout.setPaddingRelative(0, paddingTop, paddingEnd, paddingBottom) + setPaddingRelative(0, 0, 0, 0) + addView(itemsLayout, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)) + onGlobalLayout { + stickyRootInitialLeft = if (itemsLayout.childCount > 0) { + itemsLayout.getChildAt(0).left + } else { + 0 + } + } + } + + private fun recomputeStickyRootLocation(left: Int) { + stickyRootInitialLeft = left + handleRootStickiness(scrollX) + } + + private fun handleRootStickiness(scrollX: Int) { + if (scrollX > stickyRootInitialLeft) { + stickRoot(scrollX - stickyRootInitialLeft) + } else { + freeRoot() + } + } + + private fun freeRoot() { + if (itemsLayout.childCount > 0) { + itemsLayout.getChildAt(0).translationX = 0f + } + } + + private fun stickRoot(translationX: Int) { + if (itemsLayout.childCount > 0) { + val root = itemsLayout.getChildAt(0) + root.translationX = translationX.toFloat() + ViewCompat.setTranslationZ(root, translationZ) + } + } + + override fun onScrollChanged(scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) { + super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY) + handleRootStickiness(scrollX) + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + + isLayoutDirty = false + if (isScrollToSelectedItemPending) { + scrollToSelectedItem() + isScrollToSelectedItemPending = false + } + + recomputeStickyRootLocation(left) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val heightMode = MeasureSpec.getMode(heightMeasureSpec) + var heightMeasureSpec = heightMeasureSpec + if (heightMode == MeasureSpec.UNSPECIFIED || heightMode == MeasureSpec.AT_MOST) { + var height = context.resources.getDimensionPixelSize(R.dimen.breadcrumbs_layout_height) + if (heightMode == MeasureSpec.AT_MOST) { + height = height.coerceAtMost(MeasureSpec.getSize(heightMeasureSpec)) + } + heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY) + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + } + + private fun scrollToSelectedItem() { + if (isLayoutDirty) { + isScrollToSelectedItemPending = true + return + } + + var selectedIndex = itemsLayout.childCount - 1 + val cnt = itemsLayout.childCount + for (i in 0 until cnt) { + val child = itemsLayout.getChildAt(i) + if ((child.tag as? FileDirItem)?.path?.trimEnd('/') == lastPath.trimEnd('/')) { + selectedIndex = i + break + } + } + + val selectedItemView = itemsLayout.getChildAt(selectedIndex) + val scrollX = if (layoutDirection == View.LAYOUT_DIRECTION_LTR) { + selectedItemView.left - itemsLayout.paddingStart + } else { + selectedItemView.right - width + itemsLayout.paddingStart + } + + if (!isFirstScroll && isShown) { + smoothScrollTo(scrollX, 0) + } else { + scrollTo(scrollX, 0) + } + + isFirstScroll = false + } + + override fun requestLayout() { + isLayoutDirty = true + super.requestLayout() + } + + fun setBreadcrumb(fullPath: String) { + lastPath = fullPath + val basePath = fullPath.getBasePath(context) + var currPath = basePath + val tempPath = context.humanizePath(fullPath) + + itemsLayout.removeAllViews() + val dirs = tempPath.split("/").dropLastWhile(String::isEmpty) + for (i in dirs.indices) { + val dir = dirs[i] + if (i > 0) { + currPath += dir + "/" + } + + if (dir.isEmpty()) { + continue + } + + currPath = "${currPath.trimEnd('/')}/" + val item = FileDirItem(currPath, dir, true, 0, 0, 0) + addBreadcrumb(item, i, i > 0) + scrollToSelectedItem() + } + } + + private fun addBreadcrumb(item: FileDirItem, index: Int, addPrefix: Boolean) { + if (itemsLayout.childCount == 0) { + val firstItemBgColor = if (isShownInDialog && context.baseConfig.isUsingSystemTheme) { + resources.getColor(R.color.you_dialog_background_color, context.theme) + } else { + context.getProperBackgroundColor() + } + + inflater.inflate(R.layout.item_breadcrumb_first, itemsLayout, false).apply { + resources.apply { + breadcrumb_text.background = ContextCompat.getDrawable(context, R.drawable.button_background) + breadcrumb_text.background.applyColorFilter(textColor) + elevation = 1f + background = ColorDrawable(firstItemBgColor) + val medium = getDimension(R.dimen.medium_margin).toInt() + breadcrumb_text.setPadding(medium, medium, medium, medium) + setPadding(rootStartPadding, 0, 0, 0) + } + + isActivated = item.path.trimEnd('/') == lastPath.trimEnd('/') + breadcrumb_text.text = item.name + breadcrumb_text.setTextColor(textColorStateList) + breadcrumb_text.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + + itemsLayout.addView(this) + + breadcrumb_text.setOnClickListener { + if (itemsLayout.getChildAt(index) != null) { + listener?.breadcrumbClicked(index) + } + } + + tag = item + } + } else { + inflater.inflate(R.layout.item_breadcrumb, itemsLayout, false).apply { + var textToAdd = item.name + if (addPrefix) { + textToAdd = "> $textToAdd" + } + + isActivated = item.path.trimEnd('/') == lastPath.trimEnd('/') + + breadcrumb_text.text = textToAdd + breadcrumb_text.setTextColor(textColorStateList) + breadcrumb_text.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + + itemsLayout.addView(this) + + setOnClickListener { v -> + if (itemsLayout.getChildAt(index) != null && itemsLayout.getChildAt(index) == v) { + if ((v.tag as? FileDirItem)?.path?.trimEnd('/') == lastPath.trimEnd('/')) { + scrollToSelectedItem() + } else { + listener?.breadcrumbClicked(index) + } + } + } + + tag = item + } + } + } + + fun updateColor(color: Int) { + textColor = color + setBreadcrumb(lastPath) + } + + fun updateFontSize(size: Float, updateTexts: Boolean) { + fontSize = size + if (updateTexts) { + setBreadcrumb(lastPath) + } + } + + fun removeBreadcrumb() { + itemsLayout.removeView(itemsLayout.getChildAt(itemsLayout.childCount - 1)) + } + + fun getItem(index: Int) = itemsLayout.getChildAt(index).tag as FileDirItem + + fun getLastItem() = itemsLayout.getChildAt(itemsLayout.childCount - 1).tag as FileDirItem + + fun getItemCount() = itemsLayout.childCount + + interface BreadcrumbsListener { + fun breadcrumbClicked(id: Int) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/ColorPickerSquare.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/ColorPickerSquare.kt new file mode 100644 index 000000000..f3ce4eb89 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/ColorPickerSquare.kt @@ -0,0 +1,33 @@ +package com.simplemobiletools.commons.views + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.* +import android.graphics.Shader.TileMode +import android.util.AttributeSet +import android.view.View + +class ColorPickerSquare(context: Context, attrs: AttributeSet) : View(context, attrs) { + var paint: Paint? = null + var luar: Shader = LinearGradient(0f, 0f, 0f, measuredHeight.toFloat(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP) + val color = floatArrayOf(1f, 1f, 1f) + + @SuppressLint("DrawAllocation") + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + if (paint == null) { + paint = Paint() + luar = LinearGradient(0f, 0f, 0f, measuredHeight.toFloat(), Color.WHITE, Color.BLACK, TileMode.CLAMP) + } + val rgb = Color.HSVToColor(color) + val dalam = LinearGradient(0f, 0f, measuredWidth.toFloat(), 0f, Color.WHITE, rgb, TileMode.CLAMP) + val shader = ComposeShader(luar, dalam, PorterDuff.Mode.MULTIPLY) + paint!!.shader = shader + canvas.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), paint!!) + } + + fun setHue(hue: Float) { + color[0] = hue + invalidate() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/FingerprintTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/FingerprintTab.kt new file mode 100644 index 000000000..36809790e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/FingerprintTab.kt @@ -0,0 +1,84 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.content.Intent +import android.os.Handler +import android.provider.Settings +import android.util.AttributeSet +import android.widget.RelativeLayout +import androidx.biometric.auth.AuthPromptHost +import com.github.ajalt.reprint.core.AuthenticationFailureReason +import com.github.ajalt.reprint.core.AuthenticationListener +import com.github.ajalt.reprint.core.Reprint +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT +import com.simplemobiletools.commons.interfaces.HashListener +import com.simplemobiletools.commons.interfaces.SecurityTab +import kotlinx.android.synthetic.main.tab_fingerprint.view.* + +class FingerprintTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), SecurityTab { + private val RECHECK_PERIOD = 3000L + private val registerHandler = Handler() + + lateinit var hashListener: HashListener + + override fun onFinishInflate() { + super.onFinishInflate() + val textColor = context.getProperTextColor() + context.updateTextColors(fingerprint_lock_holder) + fingerprint_image.applyColorFilter(textColor) + + fingerprint_settings.setOnClickListener { + context.startActivity(Intent(Settings.ACTION_SETTINGS)) + } + } + + override fun initTab( + requiredHash: String, + listener: HashListener, + scrollView: MyScrollView, + biometricPromptHost: AuthPromptHost, + showBiometricAuthentication: Boolean + ) { + hashListener = listener + } + + override fun visibilityChanged(isVisible: Boolean) { + if (isVisible) { + checkRegisteredFingerprints() + } else { + Reprint.cancelAuthentication() + } + } + + private fun checkRegisteredFingerprints() { + val hasFingerprints = Reprint.hasFingerprintRegistered() + fingerprint_settings.beGoneIf(hasFingerprints) + fingerprint_label.text = context.getString(if (hasFingerprints) R.string.place_finger else R.string.no_fingerprints_registered) + + Reprint.authenticate(object : AuthenticationListener { + override fun onSuccess(moduleTag: Int) { + hashListener.receivedHash("", PROTECTION_FINGERPRINT) + } + + override fun onFailure(failureReason: AuthenticationFailureReason?, fatal: Boolean, errorMessage: CharSequence?, moduleTag: Int, errorCode: Int) { + when (failureReason) { + AuthenticationFailureReason.AUTHENTICATION_FAILED -> context.toast(R.string.authentication_failed) + AuthenticationFailureReason.LOCKED_OUT -> context.toast(R.string.authentication_blocked) + else -> {} + } + } + }) + + registerHandler.postDelayed({ + checkRegisteredFingerprints() + }, RECHECK_PERIOD) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + registerHandler.removeCallbacksAndMessages(null) + Reprint.cancelAuthentication() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/LineColorPicker.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/LineColorPicker.kt new file mode 100644 index 000000000..1283914b0 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/LineColorPicker.kt @@ -0,0 +1,107 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.widget.LinearLayout +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.isRTLLayout +import com.simplemobiletools.commons.extensions.onGlobalLayout +import com.simplemobiletools.commons.interfaces.LineColorPickerListener +import java.util.* + +class LineColorPicker(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) { + private var colorsCount = 0 + private var pickerWidth = 0 + private var stripeWidth = 0 + private var unselectedMargin = 0 + private var lastColorIndex = -1 + private var wasInit = false + private var colors = ArrayList() + + var listener: LineColorPickerListener? = null + + init { + unselectedMargin = context.resources.getDimension(R.dimen.line_color_picker_margin).toInt() + onGlobalLayout { + if (pickerWidth == 0) { + pickerWidth = width + + if (colorsCount != 0) + stripeWidth = width / colorsCount + } + + if (!wasInit) { + wasInit = true + initColorPicker() + updateItemMargin(lastColorIndex, false) + } + } + orientation = LinearLayout.HORIZONTAL + + setOnTouchListener { view, motionEvent -> + when (motionEvent.action) { + MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP -> { + if (pickerWidth != 0 && stripeWidth != 0) { + touchAt(motionEvent.x.toInt()) + } + } + } + true + } + } + + fun updateColors(colors: ArrayList, selectColorIndex: Int = -1) { + this.colors = colors + colorsCount = colors.size + if (pickerWidth != 0) { + stripeWidth = pickerWidth / colorsCount + } + + if (selectColorIndex != -1) { + lastColorIndex = selectColorIndex + } + + initColorPicker() + updateItemMargin(lastColorIndex, false) + } + + // do not remove ": Int", it causes "NoSuchMethodError" for some reason + fun getCurrentColor(): Int = colors[lastColorIndex] + + private fun initColorPicker() { + removeAllViews() + val inflater = LayoutInflater.from(context) + colors.forEach { + inflater.inflate(R.layout.empty_image_view, this, false).apply { + setBackgroundColor(it) + addView(this) + } + } + } + + private fun touchAt(touchX: Int) { + var colorIndex = touchX / stripeWidth + if (context.isRTLLayout) { + colorIndex = colors.size - colorIndex - 1 + } + val index = Math.max(0, Math.min(colorIndex, colorsCount - 1)) + if (lastColorIndex != index) { + updateItemMargin(lastColorIndex, true) + lastColorIndex = index + updateItemMargin(index, false) + listener?.colorChanged(index, colors[index]) + } + } + + private fun updateItemMargin(index: Int, addMargin: Boolean) { + getChildAt(index)?.apply { + (layoutParams as LinearLayout.LayoutParams).apply { + topMargin = if (addMargin) unselectedMargin else 0 + bottomMargin = if (addMargin) unselectedMargin else 0 + } + requestLayout() + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatCheckbox.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatCheckbox.kt new file mode 100644 index 000000000..d636a53d4 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatCheckbox.kt @@ -0,0 +1,27 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatCheckBox +import com.simplemobiletools.commons.extensions.adjustAlpha + +class MyAppCompatCheckbox : AppCompatCheckBox { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + setTextColor(textColor) + val colorStateList = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_checked) + ), + intArrayOf(textColor.adjustAlpha(0.6f), accentColor) + ) + supportButtonTintList = colorStateList + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatSpinner.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatSpinner.kt new file mode 100644 index 000000000..8a9632b83 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAppCompatSpinner.kt @@ -0,0 +1,48 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.widget.AdapterView +import android.widget.TextView +import androidx.appcompat.widget.AppCompatSpinner +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.adapters.MyArrayAdapter +import com.simplemobiletools.commons.extensions.applyColorFilter + +class MyAppCompatSpinner : AppCompatSpinner { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + if (adapter == null) + return + + val cnt = adapter.count + val items = kotlin.arrayOfNulls(cnt) + for (i in 0 until cnt) + items[i] = adapter.getItem(i) + + val position = selectedItemPosition + val padding = resources.getDimension(R.dimen.activity_margin).toInt() + adapter = MyArrayAdapter(context, android.R.layout.simple_spinner_item, items, textColor, backgroundColor, padding) + setSelection(position) + + val superListener = onItemSelectedListener + onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + if (view != null) { + (view as TextView).setTextColor(textColor) + } + superListener?.onItemSelected(parent, view, position, id) + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + } + background.applyColorFilter(textColor) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAutoCompleteTextView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAutoCompleteTextView.kt new file mode 100644 index 000000000..7aa070e57 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyAutoCompleteTextView.kt @@ -0,0 +1,24 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.widget.AutoCompleteTextView +import com.simplemobiletools.commons.extensions.adjustAlpha +import com.simplemobiletools.commons.extensions.applyColorFilter + +class MyAutoCompleteTextView : AutoCompleteTextView { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + background?.mutate()?.applyColorFilter(accentColor) + + // requires android:textCursorDrawable="@null" in xml to color the cursor too + setTextColor(textColor) + setHintTextColor(textColor.adjustAlpha(0.5f)) + setLinkTextColor(accentColor) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyButton.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyButton.kt new file mode 100644 index 000000000..070092aa1 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyButton.kt @@ -0,0 +1,17 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.widget.Button + +class MyButton : Button { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + setTextColor(textColor) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyCompatRadioButton.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyCompatRadioButton.kt new file mode 100644 index 000000000..1541797ee --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyCompatRadioButton.kt @@ -0,0 +1,27 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatRadioButton +import com.simplemobiletools.commons.extensions.adjustAlpha + +class MyCompatRadioButton : AppCompatRadioButton { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + setTextColor(textColor) + val colorStateList = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_checked) + ), + intArrayOf(textColor.adjustAlpha(0.6f), accentColor) + ) + supportButtonTintList = colorStateList + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyDialogViewPager.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyDialogViewPager.kt new file mode 100644 index 000000000..0c1354789 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyDialogViewPager.kt @@ -0,0 +1,44 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import androidx.viewpager.widget.ViewPager + +class MyDialogViewPager : ViewPager { + var allowSwiping = true + + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + // disable manual swiping of viewpager at the dialog by swiping over the pattern + override fun onInterceptTouchEvent(ev: MotionEvent) = false + + override fun onTouchEvent(ev: MotionEvent): Boolean { + if (!allowSwiping) + return false + + try { + return super.onTouchEvent(ev) + } catch (ignored: Exception) { + } + + return false + } + + // https://stackoverflow.com/a/20784791/1967672 + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + var height = 0 + for (i in 0 until childCount) { + val child = getChildAt(i) + child.measure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)) + val h = child.measuredHeight + if (h > height) height = h + } + + val newHeightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY) + super.onMeasure(widthMeasureSpec, newHeightMeasureSpec) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyEditText.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyEditText.kt new file mode 100644 index 000000000..8ca3238e9 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyEditText.kt @@ -0,0 +1,25 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatEditText +import com.simplemobiletools.commons.extensions.adjustAlpha +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA + +class MyEditText : AppCompatEditText { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + background?.mutate()?.applyColorFilter(accentColor) + + // requires android:textCursorDrawable="@null" in xml to color the cursor too + setTextColor(textColor) + setHintTextColor(textColor.adjustAlpha(MEDIUM_ALPHA)) + setLinkTextColor(accentColor) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyFloatingActionButton.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyFloatingActionButton.kt new file mode 100644 index 000000000..b2cd7b129 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyFloatingActionButton.kt @@ -0,0 +1,21 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.getContrastColor + +class MyFloatingActionButton : FloatingActionButton { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + backgroundTintList = ColorStateList.valueOf(accentColor) + applyColorFilter(accentColor.getContrastColor()) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyGridLayoutManager.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyGridLayoutManager.kt new file mode 100644 index 000000000..f47d7954c --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyGridLayoutManager.kt @@ -0,0 +1,17 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import androidx.recyclerview.widget.GridLayoutManager + +class MyGridLayoutManager : GridLayoutManager { + constructor(context: Context, spanCount: Int) : super(context, spanCount) + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + + constructor(context: Context, spanCount: Int, orientation: Int, reverseLayout: Boolean) : super(context, spanCount, orientation, reverseLayout) + + // fixes crash java.lang.IndexOutOfBoundsException: Inconsistency detected... + // taken from https://stackoverflow.com/a/33985508/1967672 + override fun supportsPredictiveItemAnimations() = false +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyLinearLayoutManager.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyLinearLayoutManager.kt new file mode 100644 index 000000000..6e07703cf --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyLinearLayoutManager.kt @@ -0,0 +1,17 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import androidx.recyclerview.widget.LinearLayoutManager + +class MyLinearLayoutManager : LinearLayoutManager { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + + constructor(context: Context, orientation: Int, reverseLayout: Boolean) : super(context, orientation, reverseLayout) + + // fixes crash java.lang.IndexOutOfBoundsException: Inconsistency detected... + // taken from https://stackoverflow.com/a/33985508/1967672 + override fun supportsPredictiveItemAnimations() = false +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyRecyclerView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyRecyclerView.kt new file mode 100644 index 000000000..2ff00d66b --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyRecyclerView.kt @@ -0,0 +1,333 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.os.Handler +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.ScaleGestureDetector +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.interfaces.RecyclerScrollCallback + +// drag selection is based on https://github.com/afollestad/drag-select-recyclerview +open class MyRecyclerView : RecyclerView { + private val AUTO_SCROLL_DELAY = 25L + private var isZoomEnabled = false + private var isDragSelectionEnabled = false + private var zoomListener: MyZoomListener? = null + private var dragListener: MyDragListener? = null + private var autoScrollHandler = Handler() + + private var scaleDetector: ScaleGestureDetector + + private var dragSelectActive = false + private var lastDraggedIndex = -1 + private var minReached = 0 + private var maxReached = 0 + private var initialSelection = 0 + + private var hotspotHeight = 0 + private var hotspotOffsetTop = 0 + private var hotspotOffsetBottom = 0 + + private var hotspotTopBoundStart = 0 + private var hotspotTopBoundEnd = 0 + private var hotspotBottomBoundStart = 0 + private var hotspotBottomBoundEnd = 0 + private var autoScrollVelocity = 0 + + private var inTopHotspot = false + private var inBottomHotspot = false + + private var currScaleFactor = 1.0f + private var lastUp = 0L // allow only pinch zoom, not double tap + + // things related to parallax scrolling (for now only in the music player) + // cut from https://github.com/ksoichiro/Android-ObservableScrollView + var recyclerScrollCallback: RecyclerScrollCallback? = null + private var mPrevFirstVisiblePosition = 0 + private var mPrevScrolledChildrenHeight = 0 + private var mPrevFirstVisibleChildHeight = -1 + private var mScrollY = 0 + + // variables used for fetching additional items at scrolling to the bottom/top + var endlessScrollListener: EndlessScrollListener? = null + private var totalItemCount = 0 + private var lastMaxItemIndex = 0 + private var linearLayoutManager: LinearLayoutManager? = null + + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + init { + hotspotHeight = context.resources.getDimensionPixelSize(R.dimen.dragselect_hotspot_height) + + if (layoutManager is LinearLayoutManager) { + linearLayoutManager = layoutManager as LinearLayoutManager + } + + val gestureListener = object : MyGestureListener { + override fun getLastUp() = lastUp + + override fun getScaleFactor() = currScaleFactor + + override fun setScaleFactor(value: Float) { + currScaleFactor = value + } + + override fun getZoomListener() = zoomListener + } + + scaleDetector = ScaleGestureDetector(context, GestureListener(gestureListener)) + } + + override fun onMeasure(widthSpec: Int, heightSpec: Int) { + super.onMeasure(widthSpec, heightSpec) + if (hotspotHeight > -1) { + hotspotTopBoundStart = hotspotOffsetTop + hotspotTopBoundEnd = hotspotOffsetTop + hotspotHeight + hotspotBottomBoundStart = measuredHeight - hotspotHeight - hotspotOffsetBottom + hotspotBottomBoundEnd = measuredHeight - hotspotOffsetBottom + } + } + + private val autoScrollRunnable = object : Runnable { + override fun run() { + if (inTopHotspot) { + scrollBy(0, -autoScrollVelocity) + autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY) + } else if (inBottomHotspot) { + scrollBy(0, autoScrollVelocity) + autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY) + } + } + } + + fun resetItemCount() { + totalItemCount = 0 + } + + override fun dispatchTouchEvent(ev: MotionEvent): Boolean { + if (!dragSelectActive) { + try { + super.dispatchTouchEvent(ev) + } catch (ignored: Exception) { + } + } + + when (ev.action) { + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + dragSelectActive = false + inTopHotspot = false + inBottomHotspot = false + autoScrollHandler.removeCallbacks(autoScrollRunnable) + currScaleFactor = 1.0f + lastUp = System.currentTimeMillis() + return true + } + + MotionEvent.ACTION_MOVE -> { + if (dragSelectActive) { + val itemPosition = getItemPosition(ev) + if (hotspotHeight > -1) { + if (ev.y in hotspotTopBoundStart.toFloat()..hotspotTopBoundEnd.toFloat()) { + inBottomHotspot = false + if (!inTopHotspot) { + inTopHotspot = true + autoScrollHandler.removeCallbacks(autoScrollRunnable) + autoScrollHandler.postDelayed(autoScrollRunnable, AUTO_SCROLL_DELAY) + } + + val simulatedFactor = (hotspotTopBoundEnd - hotspotTopBoundStart).toFloat() + val simulatedY = ev.y - hotspotTopBoundStart + autoScrollVelocity = (simulatedFactor - simulatedY).toInt() / 2 + } else if (ev.y in hotspotBottomBoundStart.toFloat()..hotspotBottomBoundEnd.toFloat()) { + inTopHotspot = false + if (!inBottomHotspot) { + inBottomHotspot = true + autoScrollHandler.removeCallbacks(autoScrollRunnable) + autoScrollHandler.postDelayed(autoScrollRunnable, AUTO_SCROLL_DELAY) + } + + val simulatedY = ev.y + hotspotBottomBoundEnd + val simulatedFactor = (hotspotBottomBoundStart + hotspotBottomBoundEnd).toFloat() + autoScrollVelocity = (simulatedY - simulatedFactor).toInt() / 2 + } else if (inTopHotspot || inBottomHotspot) { + autoScrollHandler.removeCallbacks(autoScrollRunnable) + inTopHotspot = false + inBottomHotspot = false + } + } + + if (itemPosition != RecyclerView.NO_POSITION && lastDraggedIndex != itemPosition) { + lastDraggedIndex = itemPosition + if (minReached == -1) { + minReached = lastDraggedIndex + } + + if (maxReached == -1) { + maxReached = lastDraggedIndex + } + + if (lastDraggedIndex > maxReached) { + maxReached = lastDraggedIndex + } + + if (lastDraggedIndex < minReached) { + minReached = lastDraggedIndex + } + + dragListener?.selectRange(initialSelection, lastDraggedIndex, minReached, maxReached) + + if (initialSelection == lastDraggedIndex) { + minReached = lastDraggedIndex + maxReached = lastDraggedIndex + } + } + + return true + } + } + } + + return if (isZoomEnabled) { + scaleDetector.onTouchEvent(ev) + } else { + true + } + } + + fun setupDragListener(dragListener: MyDragListener?) { + isDragSelectionEnabled = dragListener != null + this.dragListener = dragListener + } + + fun setupZoomListener(zoomListener: MyZoomListener?) { + isZoomEnabled = zoomListener != null + this.zoomListener = zoomListener + } + + fun setDragSelectActive(initialSelection: Int) { + if (dragSelectActive || !isDragSelectionEnabled) + return + + lastDraggedIndex = -1 + minReached = -1 + maxReached = -1 + this.initialSelection = initialSelection + dragSelectActive = true + dragListener?.selectItem(initialSelection) + } + + private fun getItemPosition(e: MotionEvent): Int { + val v = findChildViewUnder(e.x, e.y) ?: return RecyclerView.NO_POSITION + + if (v.tag == null || v.tag !is RecyclerView.ViewHolder) { + throw IllegalStateException("Make sure your adapter makes a call to super.onBindViewHolder(), and doesn't override itemView tags.") + } + + val holder = v.tag as RecyclerView.ViewHolder + return holder.adapterPosition + } + + override fun onScrollStateChanged(state: Int) { + super.onScrollStateChanged(state) + if (endlessScrollListener != null) { + if (totalItemCount == 0) { + totalItemCount = adapter?.itemCount ?: return + } + + if (state == SCROLL_STATE_IDLE) { + val lastVisiblePosition = linearLayoutManager?.findLastVisibleItemPosition() ?: 0 + if (lastVisiblePosition != lastMaxItemIndex && lastVisiblePosition == totalItemCount - 1) { + lastMaxItemIndex = lastVisiblePosition + endlessScrollListener!!.updateBottom() + } + + val firstVisiblePosition = linearLayoutManager?.findFirstVisibleItemPosition() ?: -1 + if (firstVisiblePosition == 0) { + endlessScrollListener!!.updateTop() + } + } + } + } + + override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) { + super.onScrollChanged(l, t, oldl, oldt) + if (recyclerScrollCallback != null) { + if (childCount > 0) { + val firstVisiblePosition = getChildAdapterPosition(getChildAt(0)) + val firstVisibleChild = getChildAt(0) + if (firstVisibleChild != null) { + if (mPrevFirstVisiblePosition < firstVisiblePosition) { + mPrevScrolledChildrenHeight += mPrevFirstVisibleChildHeight + } + + if (firstVisiblePosition == 0) { + mPrevFirstVisibleChildHeight = firstVisibleChild.height + mPrevScrolledChildrenHeight = 0 + } + + if (mPrevFirstVisibleChildHeight < 0) { + mPrevFirstVisibleChildHeight = 0 + } + + mScrollY = mPrevScrolledChildrenHeight - firstVisibleChild.top + recyclerScrollCallback?.onScrolled(mScrollY) + } + } + } + } + + class GestureListener(val gestureListener: MyGestureListener) : ScaleGestureDetector.SimpleOnScaleGestureListener() { + private val ZOOM_IN_THRESHOLD = -0.4f + private val ZOOM_OUT_THRESHOLD = 0.15f + + override fun onScale(detector: ScaleGestureDetector): Boolean { + gestureListener.apply { + if (System.currentTimeMillis() - getLastUp() < 1000) + return false + + val diff = getScaleFactor() - detector.scaleFactor + if (diff < ZOOM_IN_THRESHOLD && getScaleFactor() == 1.0f) { + getZoomListener()?.zoomIn() + setScaleFactor(detector.scaleFactor) + } else if (diff > ZOOM_OUT_THRESHOLD && getScaleFactor() == 1.0f) { + getZoomListener()?.zoomOut() + setScaleFactor(detector.scaleFactor) + } + } + return false + } + } + + interface MyZoomListener { + fun zoomOut() + + fun zoomIn() + } + + interface MyDragListener { + fun selectItem(position: Int) + + fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int) + } + + interface MyGestureListener { + fun getLastUp(): Long + + fun getScaleFactor(): Float + + fun setScaleFactor(value: Float) + + fun getZoomListener(): MyZoomListener? + } + + interface EndlessScrollListener { + fun updateTop() + + fun updateBottom() + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyScrollView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyScrollView.kt new file mode 100644 index 000000000..c36a6c6d2 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyScrollView.kt @@ -0,0 +1,37 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import android.widget.ScrollView + +class MyScrollView : ScrollView { + var isScrollable = true + + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + override fun onTouchEvent(ev: MotionEvent): Boolean { + return when (ev.action) { + MotionEvent.ACTION_DOWN -> { + if (isScrollable) { + super.onTouchEvent(ev) + } else { + isScrollable + } + } + else -> super.onTouchEvent(ev) + } + } + + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + return if (!isScrollable) { + false + } else { + super.onInterceptTouchEvent(ev) + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySearchMenu.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySearchMenu.kt new file mode 100644 index 000000000..9e26c53fe --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySearchMenu.kt @@ -0,0 +1,111 @@ +package com.simplemobiletools.commons.views + +import android.app.Activity +import android.content.Context +import android.util.AttributeSet +import com.google.android.material.appbar.AppBarLayout +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.LOWER_ALPHA +import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA +import kotlinx.android.synthetic.main.menu_search.view.* + +class MySearchMenu(context: Context, attrs: AttributeSet) : AppBarLayout(context, attrs) { + var isSearchOpen = false + var useArrowIcon = false + var onSearchOpenListener: (() -> Unit)? = null + var onSearchClosedListener: (() -> Unit)? = null + var onSearchTextChangedListener: ((text: String) -> Unit)? = null + var onNavigateBackClickListener: (() -> Unit)? = null + + init { + inflate(context, R.layout.menu_search, this) + } + + fun getToolbar() = top_toolbar + + fun setupMenu() { + top_toolbar_search_icon.setOnClickListener { + if (isSearchOpen) { + closeSearch() + } else if (useArrowIcon && onNavigateBackClickListener != null) { + onNavigateBackClickListener!!() + } else { + top_toolbar_search.requestFocus() + (context as? Activity)?.showKeyboard(top_toolbar_search) + } + } + + post { + top_toolbar_search.setOnFocusChangeListener { v, hasFocus -> + if (hasFocus) { + openSearch() + } + } + } + + top_toolbar_search.onTextChangeListener { text -> + onSearchTextChangedListener?.invoke(text) + } + } + + fun focusView() { + top_toolbar_search.requestFocus() + } + + private fun openSearch() { + isSearchOpen = true + onSearchOpenListener?.invoke() + top_toolbar_search_icon.setImageResource(R.drawable.ic_arrow_left_vector) + } + + fun closeSearch() { + isSearchOpen = false + onSearchClosedListener?.invoke() + top_toolbar_search.setText("") + if (!useArrowIcon) { + top_toolbar_search_icon.setImageResource(R.drawable.ic_search_vector) + } + (context as? Activity)?.hideKeyboard() + } + + fun getCurrentQuery() = top_toolbar_search.text.toString() + + fun updateHintText(text: String) { + top_toolbar_search.hint = text + } + + fun toggleHideOnScroll(hideOnScroll: Boolean) { + val params = top_app_bar_layout.layoutParams as LayoutParams + if (hideOnScroll) { + params.scrollFlags = LayoutParams.SCROLL_FLAG_SCROLL or LayoutParams.SCROLL_FLAG_ENTER_ALWAYS + } else { + params.scrollFlags = params.scrollFlags.removeBit(LayoutParams.SCROLL_FLAG_SCROLL or LayoutParams.SCROLL_FLAG_ENTER_ALWAYS) + } + } + + fun toggleForceArrowBackIcon(useArrowBack: Boolean) { + this.useArrowIcon = useArrowBack + val icon = if (useArrowBack) { + R.drawable.ic_arrow_left_vector + } else { + R.drawable.ic_search_vector + } + + top_toolbar_search_icon.setImageResource(icon) + } + + fun updateColors() { + val backgroundColor = context.getProperBackgroundColor() + val contrastColor = backgroundColor.getContrastColor() + + setBackgroundColor(backgroundColor) + top_app_bar_layout.setBackgroundColor(backgroundColor) + top_toolbar_search_icon.applyColorFilter(contrastColor) + top_toolbar_holder.background?.applyColorFilter(context.getProperPrimaryColor().adjustAlpha(LOWER_ALPHA)) + top_toolbar_search.setTextColor(contrastColor) + top_toolbar_search.setHintTextColor(contrastColor.adjustAlpha(MEDIUM_ALPHA)) + (context as? BaseSimpleActivity)?.updateTopBarColors(top_toolbar, backgroundColor) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySeekBar.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySeekBar.kt new file mode 100644 index 000000000..ba3fef9de --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySeekBar.kt @@ -0,0 +1,19 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.widget.SeekBar +import com.simplemobiletools.commons.extensions.applyColorFilter + +class MySeekBar : SeekBar { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + progressDrawable.applyColorFilter(accentColor) + thumb?.applyColorFilter(accentColor) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySquareImageView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySquareImageView.kt new file mode 100644 index 000000000..0a5fba770 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MySquareImageView.kt @@ -0,0 +1,20 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView + +class MySquareImageView : AppCompatImageView { + var isHorizontalScrolling = false + + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val spec = if (isHorizontalScrolling) heightMeasureSpec else widthMeasureSpec + super.onMeasure(spec, spec) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextInputLayout.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextInputLayout.kt new file mode 100644 index 000000000..2efa475a9 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextInputLayout.kt @@ -0,0 +1,52 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import com.google.android.material.textfield.TextInputLayout +import com.simplemobiletools.commons.extensions.adjustAlpha +import com.simplemobiletools.commons.extensions.value +import com.simplemobiletools.commons.helpers.HIGHER_ALPHA +import com.simplemobiletools.commons.helpers.MEDIUM_ALPHA + +class MyTextInputLayout : TextInputLayout { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + // we need to use reflection to make some colors work well + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + try { + editText!!.setTextColor(textColor) + editText!!.backgroundTintList = ColorStateList.valueOf(accentColor) + + val hintColor = if (editText!!.value.isEmpty()) textColor.adjustAlpha(HIGHER_ALPHA) else textColor + val defaultTextColor = TextInputLayout::class.java.getDeclaredField("defaultHintTextColor") + defaultTextColor.isAccessible = true + defaultTextColor.set(this, ColorStateList(arrayOf(intArrayOf(0)), intArrayOf(hintColor))) + + val focusedTextColor = TextInputLayout::class.java.getDeclaredField("focusedTextColor") + focusedTextColor.isAccessible = true + focusedTextColor.set(this, ColorStateList(arrayOf(intArrayOf(0)), intArrayOf(accentColor))) + + val defaultHintTextColor = textColor.adjustAlpha(MEDIUM_ALPHA) + val boxColorState = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_active), + intArrayOf(android.R.attr.state_focused) + ), + intArrayOf( + defaultHintTextColor, + accentColor + ) + ) + + setBoxStrokeColorStateList(boxColorState) + defaultTextColor.set(this, ColorStateList(arrayOf(intArrayOf(0)), intArrayOf(defaultHintTextColor))) + setHelperTextColor(ColorStateList.valueOf(textColor)) + } catch (e: Exception) { + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextView.kt new file mode 100644 index 000000000..47fa43a96 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyTextView.kt @@ -0,0 +1,18 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.widget.TextView + +class MyTextView : TextView { + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + fun setColors(textColor: Int, accentColor: Int, backgroundColor: Int) { + setTextColor(textColor) + setLinkTextColor(accentColor) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyViewPager.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyViewPager.kt new file mode 100644 index 000000000..68a281ee9 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/MyViewPager.kt @@ -0,0 +1,29 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.view.MotionEvent +import com.duolingo.open.rtlviewpager.RtlViewPager + +class MyViewPager : RtlViewPager { + + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + return try { + super.onInterceptTouchEvent(ev) + } catch (ignored: Exception) { + false + } + } + + override fun onTouchEvent(ev: MotionEvent): Boolean { + return try { + super.onTouchEvent(ev) + } catch (ignored: Exception) { + false + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/PatternTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/PatternTab.kt new file mode 100644 index 000000000..46b0b7222 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/PatternTab.kt @@ -0,0 +1,94 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.os.Handler +import android.util.AttributeSet +import android.view.MotionEvent +import android.widget.RelativeLayout +import androidx.biometric.auth.AuthPromptHost +import com.andrognito.patternlockview.PatternLockView +import com.andrognito.patternlockview.listener.PatternLockViewListener +import com.andrognito.patternlockview.utils.PatternLockUtils +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.PROTECTION_PATTERN +import com.simplemobiletools.commons.interfaces.HashListener +import com.simplemobiletools.commons.interfaces.SecurityTab +import kotlinx.android.synthetic.main.tab_pattern.view.* + +class PatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), SecurityTab { + private var hash = "" + private var requiredHash = "" + private var scrollView: MyScrollView? = null + lateinit var hashListener: HashListener + + override fun onFinishInflate() { + super.onFinishInflate() + val textColor = context.getProperTextColor() + context.updateTextColors(pattern_lock_holder) + + pattern_lock_view.setOnTouchListener { v, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> scrollView?.isScrollable = false + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> scrollView?.isScrollable = true + } + false + } + + pattern_lock_view.correctStateColor = context.getProperPrimaryColor() + pattern_lock_view.normalStateColor = textColor + pattern_lock_view.addPatternLockListener(object : PatternLockViewListener { + override fun onComplete(pattern: MutableList?) { + receivedHash(PatternLockUtils.patternToSha1(pattern_lock_view, pattern)) + } + + override fun onCleared() {} + + override fun onStarted() {} + + override fun onProgress(progressPattern: MutableList?) {} + }) + } + + override fun initTab( + requiredHash: String, + listener: HashListener, + scrollView: MyScrollView, + biometricPromptHost: AuthPromptHost, + showBiometricAuthentication: Boolean + ) { + this.requiredHash = requiredHash + this.scrollView = scrollView + hash = requiredHash + hashListener = listener + } + + private fun receivedHash(newHash: String) { + when { + hash.isEmpty() -> { + hash = newHash + pattern_lock_view.clearPattern() + pattern_lock_title.setText(R.string.repeat_pattern) + } + hash == newHash -> { + pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.CORRECT) + Handler().postDelayed({ + hashListener.receivedHash(hash, PROTECTION_PATTERN) + }, 300) + } + else -> { + pattern_lock_view.setViewMode(PatternLockView.PatternViewMode.WRONG) + context.toast(R.string.wrong_pattern) + Handler().postDelayed({ + pattern_lock_view.clearPattern() + if (requiredHash.isEmpty()) { + hash = "" + pattern_lock_title.setText(R.string.insert_pattern) + } + }, 1000) + } + } + } + + override fun visibilityChanged(isVisible: Boolean) {} +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/PinTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/PinTab.kt new file mode 100644 index 000000000..24c417daa --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/PinTab.kt @@ -0,0 +1,112 @@ +package com.simplemobiletools.commons.views + +import android.content.Context +import android.util.AttributeSet +import android.widget.RelativeLayout +import androidx.biometric.auth.AuthPromptHost +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.PROTECTION_PIN +import com.simplemobiletools.commons.interfaces.HashListener +import com.simplemobiletools.commons.interfaces.SecurityTab +import kotlinx.android.synthetic.main.tab_pin.view.* +import java.math.BigInteger +import java.security.MessageDigest +import java.util.* + +class PinTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), SecurityTab { + private var hash = "" + private var requiredHash = "" + private var pin = "" + lateinit var hashListener: HashListener + + override fun onFinishInflate() { + super.onFinishInflate() + context.updateTextColors(pin_lock_holder) + + pin_0.setOnClickListener { addNumber("0") } + pin_1.setOnClickListener { addNumber("1") } + pin_2.setOnClickListener { addNumber("2") } + pin_3.setOnClickListener { addNumber("3") } + pin_4.setOnClickListener { addNumber("4") } + pin_5.setOnClickListener { addNumber("5") } + pin_6.setOnClickListener { addNumber("6") } + pin_7.setOnClickListener { addNumber("7") } + pin_8.setOnClickListener { addNumber("8") } + pin_9.setOnClickListener { addNumber("9") } + pin_c.setOnClickListener { clear() } + pin_ok.setOnClickListener { confirmPIN() } + pin_ok.applyColorFilter(context.getProperTextColor()) + } + + override fun initTab( + requiredHash: String, + listener: HashListener, + scrollView: MyScrollView, + biometricPromptHost: AuthPromptHost, + showBiometricAuthentication: Boolean + ) { + this.requiredHash = requiredHash + hash = requiredHash + hashListener = listener + } + + private fun addNumber(number: String) { + if (pin.length < 10) { + pin += number + updatePinCode() + } + performHapticFeedback() + } + + private fun clear() { + if (pin.isNotEmpty()) { + pin = pin.substring(0, pin.length - 1) + updatePinCode() + } + performHapticFeedback() + } + + private fun confirmPIN() { + val newHash = getHashedPin() + if (pin.isEmpty()) { + context.toast(R.string.please_enter_pin) + } else if (hash.isEmpty()) { + hash = newHash + resetPin() + pin_lock_title.setText(R.string.repeat_pin) + } else if (hash == newHash) { + hashListener.receivedHash(hash, PROTECTION_PIN) + } else { + resetPin() + context.toast(R.string.wrong_pin) + if (requiredHash.isEmpty()) { + hash = "" + pin_lock_title.setText(R.string.enter_pin) + } + } + performHapticFeedback() + } + + private fun resetPin() { + pin = "" + pin_lock_current_pin.text = "" + } + + private fun updatePinCode() { + pin_lock_current_pin.text = "*".repeat(pin.length) + if (hash.isNotEmpty() && hash == getHashedPin()) { + hashListener.receivedHash(hash, PROTECTION_PIN) + } + } + + private fun getHashedPin(): String { + val messageDigest = MessageDigest.getInstance("SHA-1") + messageDigest.update(pin.toByteArray(charset("UTF-8"))) + val digest = messageDigest.digest() + val bigInteger = BigInteger(1, digest) + return String.format(Locale.getDefault(), "%0${digest.size * 2}x", bigInteger).lowercase(Locale.getDefault()) + } + + override fun visibilityChanged(isVisible: Boolean) {} +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/RenamePatternTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/RenamePatternTab.kt new file mode 100644 index 000000000..ea074dea3 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/RenamePatternTab.kt @@ -0,0 +1,240 @@ +package com.simplemobiletools.commons.views + +import android.content.ContentValues +import android.content.Context +import android.provider.MediaStore +import android.text.format.DateFormat +import android.util.AttributeSet +import android.widget.RelativeLayout +import androidx.exifinterface.media.ExifInterface +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.isNougatPlus +import com.simplemobiletools.commons.interfaces.RenameTab +import com.simplemobiletools.commons.models.Android30RenameFormat +import com.simplemobiletools.commons.models.FileDirItem +import kotlinx.android.synthetic.main.dialog_rename_items_pattern.view.* +import java.io.File +import java.text.SimpleDateFormat +import java.util.* +import kotlin.collections.ArrayList + +class RenamePatternTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), RenameTab { + var ignoreClicks = false + var stopLooping = false // we should request the permission on Android 30+ for all uris at once, not one by one + var currentIncrementalNumber = 1 + var numbersCnt = 0 + var activity: BaseSimpleActivity? = null + var paths = ArrayList() + + override fun onFinishInflate() { + super.onFinishInflate() + context.updateTextColors(rename_items_holder) + } + + override fun initTab(activity: BaseSimpleActivity, paths: ArrayList) { + this.activity = activity + this.paths = paths + rename_items_value.setText(activity.baseConfig.lastRenamePatternUsed) + } + + override fun dialogConfirmed(useMediaFileExtension: Boolean, callback: (success: Boolean) -> Unit) { + stopLooping = false + if (ignoreClicks) { + return + } + + val newNameRaw = rename_items_value.value + if (newNameRaw.isEmpty()) { + callback(false) + return + } + + val validPaths = paths.filter { activity?.getDoesFilePathExist(it) == true } + val firstPath = validPaths.firstOrNull() + val sdFilePath = validPaths.firstOrNull { activity?.isPathOnSD(it) == true } ?: firstPath + if (firstPath == null || sdFilePath == null) { + activity?.toast(R.string.unknown_error_occurred) + return + } + + activity?.baseConfig?.lastRenamePatternUsed = rename_items_value.value + activity?.handleSAFDialog(sdFilePath) { + if (!it) { + return@handleSAFDialog + } + + activity?.checkManageMediaOrHandleSAFDialogSdk30(firstPath) { + if (!it) { + return@checkManageMediaOrHandleSAFDialogSdk30 + } + + ignoreClicks = true + var pathsCnt = validPaths.size + numbersCnt = pathsCnt.toString().length + for (path in validPaths) { + if (stopLooping) { + return@checkManageMediaOrHandleSAFDialogSdk30 + } + + try { + val newPath = getNewPath(path, useMediaFileExtension) ?: continue + activity?.renameFile(path, newPath, true) { success, android30Format -> + if (success) { + pathsCnt-- + if (pathsCnt == 0) { + callback(true) + } + } else { + ignoreClicks = false + if (android30Format != Android30RenameFormat.NONE) { + currentIncrementalNumber = 1 + stopLooping = true + renameAllFiles(validPaths, useMediaFileExtension, android30Format, callback) + } + } + } + } catch (e: Exception) { + activity?.showErrorToast(e) + } + } + stopLooping = false + } + } + } + + private fun getNewPath(path: String, useMediaFileExtension: Boolean): String? { + try { + val exif = ExifInterface(path) + var dateTime = if (isNougatPlus()) { + exif.getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL) ?: exif.getAttribute(ExifInterface.TAG_DATETIME) + } else { + exif.getAttribute(ExifInterface.TAG_DATETIME) + } + + if (dateTime == null) { + val calendar = Calendar.getInstance(Locale.ENGLISH) + calendar.timeInMillis = File(path).lastModified() + dateTime = DateFormat.format("yyyy:MM:dd kk:mm:ss", calendar).toString() + } + + val pattern = if (dateTime.substring(4, 5) == "-") "yyyy-MM-dd kk:mm:ss" else "yyyy:MM:dd kk:mm:ss" + val simpleDateFormat = SimpleDateFormat(pattern, Locale.ENGLISH) + + val dt = simpleDateFormat.parse(dateTime.replace("T", " ")) + val cal = Calendar.getInstance() + cal.time = dt + val year = cal.get(Calendar.YEAR).toString() + val month = (cal.get(Calendar.MONTH) + 1).ensureTwoDigits() + val day = (cal.get(Calendar.DAY_OF_MONTH)).ensureTwoDigits() + val hours = (cal.get(Calendar.HOUR_OF_DAY)).ensureTwoDigits() + val minutes = (cal.get(Calendar.MINUTE)).ensureTwoDigits() + val seconds = (cal.get(Calendar.SECOND)).ensureTwoDigits() + + var newName = rename_items_value.value + .replace("%Y", year, false) + .replace("%M", month, false) + .replace("%D", day, false) + .replace("%h", hours, false) + .replace("%m", minutes, false) + .replace("%s", seconds, false) + .replace("%i", String.format("%0${numbersCnt}d", currentIncrementalNumber)) + + if (newName.isEmpty()) { + return null + } + + currentIncrementalNumber++ + if ((!newName.contains(".") && path.contains(".")) || (useMediaFileExtension && !".${newName.substringAfterLast(".")}".isMediaFile())) { + val extension = path.substringAfterLast(".") + newName += ".$extension" + } + + var newPath = "${path.getParentPath()}/$newName" + + var currentIndex = 0 + while (activity?.getDoesFilePathExist(newPath) == true) { + currentIndex++ + var extension = "" + val name = if (newName.contains(".")) { + extension = ".${newName.substringAfterLast(".")}" + newName.substringBeforeLast(".") + } else { + newName + } + + newPath = "${path.getParentPath()}/$name~$currentIndex$extension" + } + + return newPath + } catch (e: Exception) { + return null + } + } + + private fun renameAllFiles( + paths: List, + useMediaFileExtension: Boolean, + android30Format: Android30RenameFormat, + callback: (success: Boolean) -> Unit + ) { + val fileDirItems = paths.map { File(it).toFileDirItem(context) } + val uriPairs = context.getUrisPathsFromFileDirItems(fileDirItems) + val validPaths = uriPairs.first + val uris = uriPairs.second + val activity = activity + activity?.updateSDK30Uris(uris) { success -> + if (success) { + try { + uris.forEachIndexed { index, uri -> + val path = validPaths[index] + val newFileName = getNewPath(path, useMediaFileExtension)?.getFilenameFromPath() ?: return@forEachIndexed + when (android30Format) { + Android30RenameFormat.SAF -> { + val sourceFile = File(path).toFileDirItem(context) + val newPath = "${path.getParentPath()}/$newFileName" + val destinationFile = FileDirItem( + newPath, + newFileName, + sourceFile.isDirectory, + sourceFile.children, + sourceFile.size, + sourceFile.modified + ) + if (activity.copySingleFileSdk30(sourceFile, destinationFile)) { + if (!activity.baseConfig.keepLastModified) { + File(newPath).setLastModified(System.currentTimeMillis()) + } + activity.contentResolver.delete(uri, null) + activity.updateInMediaStore(path, newPath) + activity.scanPathsRecursively(arrayListOf(newPath)) + } + } + Android30RenameFormat.CONTENT_RESOLVER -> { + val values = ContentValues().apply { + put(MediaStore.Images.Media.DISPLAY_NAME, newFileName) + } + context.contentResolver.update(uri, values, null, null) + } + Android30RenameFormat.NONE -> { + activity.runOnUiThread { + callback(true) + } + return@forEachIndexed + } + } + } + activity.runOnUiThread { + callback(true) + } + } catch (e: Exception) { + activity.runOnUiThread { + activity.showErrorToast(e) + callback(false) + } + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/RenameSimpleTab.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/RenameSimpleTab.kt new file mode 100644 index 000000000..4eeca2e24 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/RenameSimpleTab.kt @@ -0,0 +1,194 @@ +package com.simplemobiletools.commons.views + +import android.content.ContentValues +import android.content.Context +import android.provider.MediaStore +import android.util.AttributeSet +import android.widget.RelativeLayout +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.interfaces.RenameTab +import com.simplemobiletools.commons.models.Android30RenameFormat +import com.simplemobiletools.commons.models.FileDirItem +import kotlinx.android.synthetic.main.tab_rename_simple.view.* +import java.io.File + +class RenameSimpleTab(context: Context, attrs: AttributeSet) : RelativeLayout(context, attrs), RenameTab { + var ignoreClicks = false + var stopLooping = false // we should request the permission on Android 30+ for all uris at once, not one by one + var activity: BaseSimpleActivity? = null + var paths = ArrayList() + + override fun onFinishInflate() { + super.onFinishInflate() + context.updateTextColors(rename_simple_holder) + } + + override fun initTab(activity: BaseSimpleActivity, paths: ArrayList) { + this.activity = activity + this.paths = paths + } + + override fun dialogConfirmed(useMediaFileExtension: Boolean, callback: (success: Boolean) -> Unit) { + stopLooping = false + val valueToAdd = rename_simple_value.text.toString() + val append = rename_simple_radio_group.checkedRadioButtonId == rename_simple_radio_append.id + + if (valueToAdd.isEmpty()) { + callback(false) + return + } + + if (!valueToAdd.isAValidFilename()) { + activity?.toast(R.string.invalid_name) + return + } + + val validPaths = paths.filter { activity?.getDoesFilePathExist(it) == true } + val firstPath = validPaths.firstOrNull() + val sdFilePath = validPaths.firstOrNull { activity?.isPathOnSD(it) == true } ?: firstPath + if (firstPath == null || sdFilePath == null) { + activity?.toast(R.string.unknown_error_occurred) + return + } + + activity?.handleSAFDialog(sdFilePath) { + if (!it) { + return@handleSAFDialog + } + + activity?.checkManageMediaOrHandleSAFDialogSdk30(firstPath) { + if (!it) { + return@checkManageMediaOrHandleSAFDialogSdk30 + } + + ignoreClicks = true + var pathsCnt = validPaths.size + for (path in validPaths) { + if (stopLooping) { + return@checkManageMediaOrHandleSAFDialogSdk30 + } + + val fullName = path.getFilenameFromPath() + var dotAt = fullName.lastIndexOf(".") + if (dotAt == -1) { + dotAt = fullName.length + } + + val name = fullName.substring(0, dotAt) + val extension = if (fullName.contains(".")) ".${fullName.getFilenameExtension()}" else "" + + val newName = if (append) { + "$name$valueToAdd$extension" + } else { + "$valueToAdd$fullName" + } + + val newPath = "${path.getParentPath()}/$newName" + + if (activity?.getDoesFilePathExist(newPath) == true) { + continue + } + + activity?.renameFile(path, newPath, true) { success, android30Format -> + if (success) { + pathsCnt-- + if (pathsCnt == 0) { + callback(true) + } + } else { + ignoreClicks = false + if (android30Format != Android30RenameFormat.NONE) { + stopLooping = true + renameAllFiles(validPaths, append, valueToAdd, android30Format, callback) + } + } + } + } + stopLooping = false + } + } + } + + private fun renameAllFiles( + paths: List, + appendString: Boolean, + stringToAdd: String, + android30Format: Android30RenameFormat, + callback: (success: Boolean) -> Unit + ) { + val fileDirItems = paths.map { File(it).toFileDirItem(context) } + val uriPairs = context.getUrisPathsFromFileDirItems(fileDirItems) + val validPaths = uriPairs.first + val uris = uriPairs.second + val activity = activity + activity?.updateSDK30Uris(uris) { success -> + if (success) { + try { + uris.forEachIndexed { index, uri -> + val path = validPaths[index] + + val fullName = path.getFilenameFromPath() + var dotAt = fullName.lastIndexOf(".") + if (dotAt == -1) { + dotAt = fullName.length + } + + val name = fullName.substring(0, dotAt) + val extension = if (fullName.contains(".")) ".${fullName.getFilenameExtension()}" else "" + + val newName = if (appendString) { + "$name$stringToAdd$extension" + } else { + "$stringToAdd$fullName" + } + + when (android30Format) { + Android30RenameFormat.SAF -> { + val sourceFile = File(path).toFileDirItem(activity) + val newPath = "${path.getParentPath()}/$newName" + val destinationFile = FileDirItem( + newPath, + newName, + sourceFile.isDirectory, + sourceFile.children, + sourceFile.size, + sourceFile.modified + ) + if (activity.copySingleFileSdk30(sourceFile, destinationFile)) { + if (!activity.baseConfig.keepLastModified) { + File(newPath).setLastModified(System.currentTimeMillis()) + } + activity.contentResolver.delete(uri, null) + activity.updateInMediaStore(path, newPath) + activity.scanPathsRecursively(arrayListOf(newPath)) + } + } + Android30RenameFormat.CONTENT_RESOLVER -> { + val values = ContentValues().apply { + put(MediaStore.Images.Media.DISPLAY_NAME, newName) + } + context.contentResolver.update(uri, values, null, null) + } + Android30RenameFormat.NONE -> { + activity.runOnUiThread { + callback(true) + } + return@forEachIndexed + } + } + } + activity.runOnUiThread { + callback(true) + } + } catch (e: Exception) { + activity.runOnUiThread { + activity.showErrorToast(e) + callback(false) + } + } + } + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuCallback.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuCallback.kt new file mode 100644 index 000000000..633793116 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuCallback.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.commons.views.bottomactionmenu + +interface BottomActionMenuCallback { + fun onItemClicked(item: BottomActionMenuItem) {} + fun onViewCreated(view: BottomActionMenuView) {} + fun onViewDestroyed() {} +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItem.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItem.kt new file mode 100644 index 000000000..49076407e --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItem.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.commons.views.bottomactionmenu + +import android.view.View +import androidx.annotation.DrawableRes +import androidx.annotation.IdRes + +data class BottomActionMenuItem( + @IdRes val id: Int, + val title: String, + @DrawableRes val icon: Int = View.NO_ID, + val showAsAction: Boolean, + val isVisible: Boolean = true, +) diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItemPopup.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItemPopup.kt new file mode 100644 index 000000000..b0dc9c224 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuItemPopup.kt @@ -0,0 +1,277 @@ +package com.simplemobiletools.commons.views.bottomactionmenu + +import android.content.Context +import android.graphics.Color +import android.graphics.Rect +import android.view.* +import android.view.View.MeasureSpec +import android.widget.ArrayAdapter +import android.widget.FrameLayout +import android.widget.ListView +import android.widget.PopupWindow +import androidx.core.content.ContextCompat +import androidx.core.widget.PopupWindowCompat +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.windowManager +import com.simplemobiletools.commons.helpers.isRPlus +import kotlinx.android.synthetic.main.item_action_mode_popup.view.cab_item + +class BottomActionMenuItemPopup( + private val context: Context, + private val items: List, + private val onSelect: (BottomActionMenuItem) -> Unit, +) { + private val popup = PopupWindow(context, null, android.R.attr.popupMenuStyle) + private var anchorView: View? = null + private var dropDownWidth = ViewGroup.LayoutParams.WRAP_CONTENT + private var dropDownHeight = ViewGroup.LayoutParams.WRAP_CONTENT + private val tempRect = Rect() + private val popupMinWidth: Int + private val popupPaddingBottom: Int + private val popupPaddingStart: Int + private val popupPaddingEnd: Int + private val popupPaddingTop: Int + + val isShowing: Boolean + get() = popup.isShowing + + private val popupListAdapter = object : ArrayAdapter(context, R.layout.item_action_mode_popup, items) { + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + var view = convertView + if (view == null) { + view = LayoutInflater.from(context).inflate(R.layout.item_action_mode_popup, parent, false) + } + + val item = items[position] + view!!.cab_item.text = item.title + if (item.icon != View.NO_ID) { + val icon = ContextCompat.getDrawable(context, item.icon) + icon?.applyColorFilter(Color.WHITE) + view.cab_item.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null) + } + + view.setOnClickListener { + onSelect.invoke(item) + popup.dismiss() + } + + return view + } + } + + init { + popup.isFocusable = true + popupMinWidth = context.resources.getDimensionPixelSize(R.dimen.cab_popup_menu_min_width) + popupPaddingStart = context.resources.getDimensionPixelSize(R.dimen.smaller_margin) + popupPaddingEnd = context.resources.getDimensionPixelSize(R.dimen.smaller_margin) + popupPaddingTop = context.resources.getDimensionPixelSize(R.dimen.smaller_margin) + popupPaddingBottom = context.resources.getDimensionPixelSize(R.dimen.smaller_margin) + } + + fun show(anchorView: View) { + this.anchorView = anchorView + buildDropDown() + PopupWindowCompat.setWindowLayoutType(popup, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL) + popup.isOutsideTouchable = true + popup.width = dropDownWidth + popup.height = dropDownHeight + var x = 0 + var y = 0 + val contentView: View = popup.contentView + val windowRect = Rect() + contentView.getWindowVisibleDisplayFrame(windowRect) + val windowW = windowRect.width() + val windowH = windowRect.height() + contentView.measure( + makeDropDownMeasureSpec(dropDownWidth, windowW), + makeDropDownMeasureSpec(dropDownHeight, windowH) + ) + + val anchorLocation = IntArray(2) + anchorView.getLocationInWindow(anchorLocation) + x += anchorLocation[0] + + y += anchorView.height * 2 + x -= dropDownWidth - anchorView.width + + popup.showAtLocation(contentView, Gravity.BOTTOM, x, y) + } + + internal fun dismiss() { + popup.dismiss() + popup.contentView = null + } + + private fun buildDropDown() { + var otherHeights = 0 + val dropDownList = ListView(context).apply { + adapter = popupListAdapter + isFocusable = true + divider = null + isFocusableInTouchMode = true + clipToPadding = false + isVerticalScrollBarEnabled = true + isHorizontalScrollBarEnabled = false + clipToOutline = true + elevation = 3f + setPaddingRelative(popupPaddingStart, popupPaddingTop, popupPaddingEnd, popupPaddingBottom) + } + + val screenWidth = if (isRPlus()) { + context.windowManager.currentWindowMetrics.bounds.width() + } else { + context.windowManager.defaultDisplay.width + } + + val width = measureMenuSizeAndGetWidth((0.8 * screenWidth).toInt()) + updateContentWidth(width) + popup.contentView = dropDownList + + // getMaxAvailableHeight() subtracts the padding, so we put it back + // to get the available height for the whole window. + val padding: Int + val popupBackground = popup.background + padding = if (popupBackground != null) { + popupBackground.getPadding(tempRect) + tempRect.top + tempRect.bottom + } else { + tempRect.setEmpty() + 0 + } + + val maxHeight = popup.getMaxAvailableHeight(anchorView!!, 0) + val listContent = measureHeightOfChildrenCompat(maxHeight - otherHeights) + if (listContent > 0) { + val listPadding = dropDownList.paddingTop + dropDownList.paddingBottom + otherHeights += padding + listPadding + } + + dropDownHeight = listContent + otherHeights + dropDownList.layoutParams = ViewGroup.LayoutParams(dropDownWidth, dropDownHeight) + } + + private fun updateContentWidth(width: Int) { + val popupBackground = popup.background + dropDownWidth = if (popupBackground != null) { + popupBackground.getPadding(tempRect) + tempRect.left + tempRect.right + width + } else { + width + } + } + + /** + * @see androidx.appcompat.widget.DropDownListView.measureHeightOfChildrenCompat + */ + private fun measureHeightOfChildrenCompat(maxHeight: Int): Int { + val parent = FrameLayout(context) + val widthMeasureSpec = MeasureSpec.makeMeasureSpec(dropDownWidth, MeasureSpec.EXACTLY) + + // Include the padding of the list + var returnedHeight = 0 + + val count = popupListAdapter.count + + var child: View? = null + var viewType = 0 + for (i in 0 until count) { + val positionType = popupListAdapter.getItemViewType(i) + if (positionType != viewType) { + child = null + viewType = positionType + } + child = popupListAdapter.getView(i, child, parent) + + // Compute child height spec + val heightMeasureSpec: Int + var childLayoutParams: ViewGroup.LayoutParams? = child.layoutParams + + if (childLayoutParams == null) { + childLayoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + child.layoutParams = childLayoutParams + } + + heightMeasureSpec = if (childLayoutParams.height > 0) { + MeasureSpec.makeMeasureSpec( + childLayoutParams.height, + MeasureSpec.EXACTLY + ) + } else { + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED) + } + child.measure(widthMeasureSpec, heightMeasureSpec) + // Since this view was measured directly against the parent measure + // spec, we must measure it again before reuse. + child.forceLayout() + + val marginLayoutParams = childLayoutParams as? ViewGroup.MarginLayoutParams + val topMargin = marginLayoutParams?.topMargin ?: 0 + val bottomMargin = marginLayoutParams?.bottomMargin ?: 0 + val verticalMargin = topMargin + bottomMargin + + returnedHeight += child.measuredHeight + verticalMargin + + if (returnedHeight >= maxHeight) { + // We went over, figure out which height to return. If returnedHeight > + // maxHeight, then the i'th position did not fit completely. + return maxHeight + } + } + + // At this point, we went through the range of children, and they each + // completely fit, so return the returnedHeight + return returnedHeight + } + + + /** + * @see androidx.appcompat.view.menu.MenuPopup.measureIndividualMenuWidth + */ + private fun measureMenuSizeAndGetWidth(maxAllowedWidth: Int): Int { + val parent = FrameLayout(context) + var maxWidth = popupMinWidth + var itemView: View? = null + var itemType = 0 + + val widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED) + val heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED) + for (i in 0 until popupListAdapter.count) { + val positionType: Int = popupListAdapter.getItemViewType(i) + if (positionType != itemType) { + itemType = positionType + itemView = null + } + itemView = popupListAdapter.getView(i, itemView, parent) + itemView.measure(widthMeasureSpec, heightMeasureSpec) + val itemWidth = itemView.measuredWidth + if (itemWidth >= maxAllowedWidth) { + return maxAllowedWidth + } else if (itemWidth > maxWidth) { + maxWidth = itemWidth + } + } + return maxWidth + } + + private fun makeDropDownMeasureSpec(measureSpec: Int, maxSize: Int): Int { + return MeasureSpec.makeMeasureSpec( + getDropDownMeasureSpecSize(measureSpec, maxSize), + getDropDownMeasureSpecMode(measureSpec) + ) + } + + private fun getDropDownMeasureSpecSize(measureSpec: Int, maxSize: Int): Int { + return when (measureSpec) { + ViewGroup.LayoutParams.MATCH_PARENT -> maxSize + else -> MeasureSpec.getSize(measureSpec) + } + } + + private fun getDropDownMeasureSpecMode(measureSpec: Int): Int { + return when (measureSpec) { + ViewGroup.LayoutParams.WRAP_CONTENT -> MeasureSpec.UNSPECIFIED + else -> MeasureSpec.EXACTLY + } + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuParser.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuParser.kt new file mode 100644 index 000000000..0a8655946 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuParser.kt @@ -0,0 +1,85 @@ +package com.simplemobiletools.commons.views.bottomactionmenu + +import android.content.Context +import android.util.AttributeSet +import android.util.Xml +import android.view.MenuItem +import android.view.View +import com.simplemobiletools.commons.R +import org.xmlpull.v1.XmlPullParser + +internal class BottomActionMenuParser(private val context: Context) { + companion object { + private const val NO_TEXT = "" + private const val MENU_TAG = "menu" + private const val MENU_ITEM_TAG = "item" + } + + fun inflate(menuId: Int): List { + val parser = context.resources.getLayout(menuId) + parser.use { + val attrs = Xml.asAttributeSet(parser) + return readContextItems(parser, attrs) + } + } + + private fun readContextItems(parser: XmlPullParser, attrs: AttributeSet): List { + val items = mutableListOf() + var eventType = parser.eventType + var tagName: String + + // This loop will skip to the menu start tag + do { + if (eventType == XmlPullParser.START_TAG) { + tagName = parser.name + + if (tagName == MENU_TAG) { + // Go to next tag + eventType = parser.next() + break + } + throw RuntimeException("Expecting menu, got $tagName") + } + eventType = parser.next() + } while (eventType != XmlPullParser.END_DOCUMENT) + + var reachedEndOfMenu = false + while (!reachedEndOfMenu) { + tagName = parser.name + + if (eventType == XmlPullParser.END_TAG) { + if (tagName == MENU_TAG) { + reachedEndOfMenu = true + } + } + + if (eventType == XmlPullParser.START_TAG) { + when (tagName) { + MENU_ITEM_TAG -> items.add(readBottomActionMenuItem(parser, attrs)) + } + } + + eventType = parser.next() + } + + return items + } + + private fun readBottomActionMenuItem(parser: XmlPullParser, attrs: AttributeSet): BottomActionMenuItem { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BottomActionMenuItem) + val id = typedArray.getResourceId(R.styleable.BottomActionMenuItem_android_id, View.NO_ID) + val text = typedArray.getString(R.styleable.BottomActionMenuItem_android_title) ?: NO_TEXT + val iconId = typedArray.getResourceId(R.styleable.BottomActionMenuItem_android_icon, View.NO_ID) + val showAsAction = typedArray.getInt(R.styleable.BottomActionMenuItem_showAsAction, -1) + val visible = typedArray.getBoolean(R.styleable.BottomActionMenuItem_android_visible, true) + typedArray.recycle() + parser.require(XmlPullParser.START_TAG, null, MENU_ITEM_TAG) + return BottomActionMenuItem( + id, + text, + iconId, + showAsAction == MenuItem.SHOW_AS_ACTION_ALWAYS || showAsAction == MenuItem.SHOW_AS_ACTION_IF_ROOM, + visible + ) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuPopup.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuPopup.kt new file mode 100644 index 000000000..3ffbdc7d3 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuPopup.kt @@ -0,0 +1,103 @@ +package com.simplemobiletools.commons.views.bottomactionmenu + +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.view.accessibility.AccessibilityEvent +import android.widget.PopupWindow +import androidx.annotation.MenuRes +import androidx.core.view.doOnLayout +import androidx.core.view.updateLayoutParams +import androidx.core.widget.PopupWindowCompat +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.simplemobiletools.commons.activities.BaseSimpleActivity + +class BottomActionMenuPopup(private val activity: BaseSimpleActivity, items: List) { + private val bottomActionMenuView = BottomActionMenuView(activity) + private val popup = PopupWindow(activity, null, android.R.attr.popupMenuStyle) + private var floatingActionButton: FloatingActionButton? = null + private var underlayView: View? = null + private var callback: BottomActionMenuCallback? = null + + constructor(activity: BaseSimpleActivity, @MenuRes menuResId: Int) : this(activity, BottomActionMenuParser(activity).inflate(menuResId)) + + init { + popup.contentView = bottomActionMenuView + popup.width = ViewGroup.LayoutParams.MATCH_PARENT + popup.height = ViewGroup.LayoutParams.WRAP_CONTENT + popup.isOutsideTouchable = false + popup.setOnDismissListener { + callback?.onViewDestroyed() + floatingActionButton?.show() + } + PopupWindowCompat.setWindowLayoutType(popup, WindowManager.LayoutParams.TYPE_APPLICATION) + bottomActionMenuView.setup(items) + } + + fun show(callback: BottomActionMenuCallback? = null, underlayView: View? = null, hideFab: Boolean = true) { + this.callback = callback + callback?.onViewCreated(bottomActionMenuView) + if (hideFab) { + floatingActionButton?.hide() ?: findFABAndHide() + } + + bottomActionMenuView.setCallback(callback) + bottomActionMenuView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) + popup.showAtLocation(bottomActionMenuView, Gravity.BOTTOM or Gravity.FILL_HORIZONTAL, 0, 0) + bottomActionMenuView.show() + + underlayView?.let { + this.underlayView = it + adjustUnderlayViewBottomMargin(it, true) + } + } + + fun dismiss() { + popup.dismiss() + underlayView?.let { + adjustUnderlayViewBottomMargin(it, false) + } + } + + private fun findFABAndHide() { + val parent = activity.findViewById(android.R.id.content) + findFab(parent) + floatingActionButton?.hide() + } + + private fun findFab(parent: ViewGroup) { + val count = parent.childCount + for (i in 0 until count) { + val child = parent.getChildAt(i) + if (child is FloatingActionButton) { + floatingActionButton = child + break + } else if (child is ViewGroup) { + findFab(child) + } + } + } + + private fun adjustUnderlayViewBottomMargin(view: View, showing: Boolean) { + bottomActionMenuView.doOnLayout { + view.updateLayoutParams { + if (this is ViewGroup.MarginLayoutParams) { + val newMargin = if (showing) { + bottomMargin + bottomActionMenuView.height + } else { + bottomMargin - bottomActionMenuView.height + } + + if (newMargin >= 0) { + bottomMargin = newMargin + } + } + } + } + } + + fun invalidate() { + callback?.onViewCreated(bottomActionMenuView) + } +} diff --git a/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuView.kt b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuView.kt new file mode 100644 index 000000000..994eab401 --- /dev/null +++ b/commons/src/main/kotlin/com/simplemobiletools/commons/views/bottomactionmenu/BottomActionMenuView.kt @@ -0,0 +1,209 @@ +package com.simplemobiletools.commons.views.bottomactionmenu + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.TimeInterpolator +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.ViewPropertyAnimator +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.annotation.IdRes +import com.google.android.material.animation.AnimationUtils +import com.simplemobiletools.commons.R +import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.beVisibleIf +import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.windowManager +import com.simplemobiletools.commons.helpers.isRPlus + +class BottomActionMenuView : LinearLayout { + companion object { + private const val ENTER_ANIMATION_DURATION = 225 + private const val EXIT_ANIMATION_DURATION = 175 + } + + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) + + private val inflater = LayoutInflater.from(context) + private val itemsLookup = LinkedHashMap() + private val items: List + get() = itemsLookup.values.toList().sortedWith(compareByDescending { + it.showAsAction + }.thenBy { + it.icon != View.NO_ID + }).filter { it.isVisible } + + private var currentAnimator: ViewPropertyAnimator? = null + private var callback: BottomActionMenuCallback? = null + private var itemPopup: BottomActionMenuItemPopup? = null + + init { + orientation = HORIZONTAL + elevation = 2f + } + + fun setCallback(listener: BottomActionMenuCallback?) { + this.callback = listener + } + + fun hide() { + slideDownToGone() + } + + fun show() { + slideUpToVisible() + } + + private fun slideUpToVisible() { + currentAnimator?.also { + it.cancel() + clearAnimation() + } + animateChildTo(0, ENTER_ANIMATION_DURATION.toLong(), AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR, true) + } + + private fun slideDownToGone() { + currentAnimator?.also { + currentAnimator?.cancel() + clearAnimation() + } + animateChildTo( + height + (layoutParams as MarginLayoutParams).bottomMargin, + EXIT_ANIMATION_DURATION.toLong(), + AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR + ) + } + + private fun animateChildTo(targetY: Int, duration: Long, interpolator: TimeInterpolator, visible: Boolean = false) { + currentAnimator = animate() + .translationY(targetY.toFloat()) + .setInterpolator(interpolator) + .setDuration(duration) + .setListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + currentAnimator = null + beVisibleIf(visible) + } + }) + } + + fun setup(items: List) { + items.forEach { itemsLookup[it.id] = it } + init() + } + + fun add(item: BottomActionMenuItem) { + setItem(item) + } + + private fun setItem(item: BottomActionMenuItem?) { + item?.let { + val oldItem = itemsLookup[item.id] + itemsLookup[item.id] = item + if (oldItem != item) { + init() + } + } + } + + fun toggleItemVisibility(@IdRes itemId: Int, show: Boolean) { + val item = itemsLookup[itemId] + setItem(item?.copy(isVisible = show)) + } + + private fun init() { + removeAllViews() + val maxItemsBeforeOverflow = computeMaxItemsBeforeOverflow() + val allItems = items + for (i in allItems.indices) { + if (i <= maxItemsBeforeOverflow) { + drawNormalItem(allItems[i]) + } else { + drawOverflowItem(allItems.slice(i until allItems.size)) + break + } + } + } + + private fun computeMaxItemsBeforeOverflow(): Int { + val itemsToShowAsAction = items.filter { it.showAsAction && it.icon != View.NO_ID } + val itemMinWidth = context.resources.getDimensionPixelSize(R.dimen.cab_item_min_width) + val totalActionWidth = (itemsToShowAsAction.size + 1) * itemMinWidth + val screenWidth = if (isRPlus()) { + context.windowManager.currentWindowMetrics.bounds.width() + } else { + context.windowManager.defaultDisplay.width + } + val result = if (screenWidth > totalActionWidth) { + itemsToShowAsAction.size + } else { + screenWidth / itemMinWidth + } + return result - 1 + } + + private fun drawNormalItem(item: BottomActionMenuItem) { + (inflater.inflate(R.layout.item_action_mode, this, false) as ImageView).apply { + setupItem(item) + setOnClickListener { + if (itemPopup?.isShowing == true) { + itemPopup?.dismiss() + } else { + callback?.onItemClicked(item) + } + } + setOnLongClickListener { + context.toast(item.title) + true + } + addView(this) + } + } + + private fun drawOverflowItem(overFlowItems: List) { + (inflater.inflate(R.layout.item_action_mode, this, false) as ImageView).apply { + setImageResource(R.drawable.ic_three_dots_vector) + val contentDesc = context.getString(R.string.more_info) + contentDescription = contentDesc + applyColorFilter(Color.WHITE) + itemPopup = getOverflowPopup(overFlowItems) + setOnClickListener { + if (itemPopup?.isShowing == true) { + itemPopup?.dismiss() + } else { + itemPopup?.show(it) + } + } + setOnLongClickListener { + context.toast(contentDesc) + true + } + addView(this) + } + } + + private fun ImageView.setupItem(item: BottomActionMenuItem) { + id = item.id + contentDescription = item.title + if (item.icon != View.NO_ID) { + setImageResource(item.icon) + } + beVisibleIf(item.isVisible) + applyColorFilter(Color.WHITE) + } + + private fun getOverflowPopup(overFlowItems: List): BottomActionMenuItemPopup { + return BottomActionMenuItemPopup(context, overFlowItems) { + callback?.onItemClicked(it) + } + } +} diff --git a/commons/src/main/res/anim/item_animation_fall_down.xml b/commons/src/main/res/anim/item_animation_fall_down.xml new file mode 100644 index 000000000..8fe046e10 --- /dev/null +++ b/commons/src/main/res/anim/item_animation_fall_down.xml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/commons/src/main/res/anim/layout_animation.xml b/commons/src/main/res/anim/layout_animation.xml new file mode 100644 index 000000000..2fc110016 --- /dev/null +++ b/commons/src/main/res/anim/layout_animation.xml @@ -0,0 +1,5 @@ + + diff --git a/commons/src/main/res/anim/pulsing_animation.xml b/commons/src/main/res/anim/pulsing_animation.xml new file mode 100644 index 000000000..5986f9631 --- /dev/null +++ b/commons/src/main/res/anim/pulsing_animation.xml @@ -0,0 +1,13 @@ + + diff --git a/commons/src/main/res/anim/shake_pulse_animation.xml b/commons/src/main/res/anim/shake_pulse_animation.xml new file mode 100644 index 000000000..df22fab1d --- /dev/null +++ b/commons/src/main/res/anim/shake_pulse_animation.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/commons/src/main/res/anim/slide_down.xml b/commons/src/main/res/anim/slide_down.xml new file mode 100644 index 000000000..e79e2df91 --- /dev/null +++ b/commons/src/main/res/anim/slide_down.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/commons/src/main/res/drawable-hdpi/img_write_storage.webp b/commons/src/main/res/drawable-hdpi/img_write_storage.webp new file mode 100644 index 0000000000000000000000000000000000000000..42cf7248e9ed1d978238349777f27365b0899ca8 GIT binary patch literal 10228 zcmVjT-AG+FwN_UDMV91Y?xmvmpBFCIX{+9kx;1LBKF$Tnw?r5nKPlWuL@RQtr{XDYCV zHZK5yE92_oCf(@?BjGu5=<>D{k?w#Qmlho%eLmtXAT)nTajdZr&zQCQ`v(rBSaxAs zmNe8@mM}-iWZCi(pt>Ow`u#nDEy;7iE|oUp1%MgQC5_ikPSI@1rCi}xSqicqSB8c+ zj3I&O+_aBU#9@mpd5Kr-jmkA2;s6OYEIodcYKoq6Ejnjrh1l64kJlcmBzmz`3FS=?hc1L<*JcvE9#5_Bp~3;PR758{U#@) z015q{0Fa9$gVD@=nId>0a7F+!%~^y9aTZq*dbJ<`fU~Xy0B6x5Q*6XRgkCwz>Pi5x z69fP&ft;p;JA4BEqFG^wzaS8LUkYfw-Fau)^1N8~2?`FcBxM05E^y=fl%(~JLVkeo z>UHLzoOPBG7r63IdX5jkwB>W%*Q&48gjesAE4*f(L`bNts$hl6lnxR?bDmY9A8Du> zk)dHU7J^v~P_i16kxsf50}9px_wG;co_XuoW(V-&J~_78u}`*bcI=aD-dX)ni2^0Y z3+rBeVki!V0h5La|G&MVU=N5025uWEYM1vQi;qCJo~ZW$1~76`kiY^Dpa?O1FE)SA zvjkWTU@T*#X_`oqstF)eA;Lb=GRbQ@MZ>WR&@@!oYFzjKL{FK+h6kq6kuR0L7(%tn z>1exw5aeW|+k1pHU~T!oiWjWq)eT4eLm+$=_#u}+1fTZxBexd|DRa0LkebKYiY1X3 zcejMyCJ(rv-iKTzAsm$8S-oUj)b=lKBk5ly$uh`nhnb1L7jtE=p+Rq2#C>;8KQ4e78p_o$bJGVjKdm{1mT6p zX?r^-gqBu#oVI)6p-Q;4tL<(GL2DF{;rUkF4*ie%8FhU0S-ZNHcUdd4Y|2=Bd3G1^ z&+kb;W}ew+QO6Fs;d=PX$4|H5gO@^%)!|NZ#!Lf;XB&-l*DSsb!0Ue^6x&y0>{87^ zITu+=gzC;&#R-N)$_GyTx>^hIB-7I-Th{j7*!=^6hVi`vp7HDtJtw#L{U^?U{oBO- zK8aPIX_({j^ZxD)p9T>2IEA?p07S&3qB-A>4?gClAAab1?j5*iNW>aZ$0dLK)$bg| zCE+cvxZ%8+mC5H$v0S(Q8ol6+hcCQ2fREYtaXQXRtg4E zw5cc>)stqBy|35q*N2yRB}p{7K#mI4jYV=ywCsK{WDtMy3yI)Og9rc*GJ>SyIc*X- zF5FWKn;h!cCMfDtS6(q`+<1u_amnw5M;`lzTkD%ybMR(Y<^rTR$8GI@84O_2Tq@G0 zQiw0gk3YM-*~L44op<;;uYYClB&61pAkQSPIegA?>4Ho&n}H$3dK}U*HkgF#se_oT zFJEXNj)|AO!&l@HiGZI_R}J&wnE(zCKl6&I9&o4oqR%&e9{;;->umT)ze{F2xXpBr zriS;LH4|q3@K-C{;>?q>{(Ot)rAX6p|M%c20m4>UE&H+s&=OApENkB60^ zoL3$8O;l9{sUQMWugVM~e9z-mLDYypqSjDFGcGZ3-my8Nr;4b8VH{9c^+zHqpsJ)H zOi=Acbu~uLkc(Ij9BPnVI3|NyxdNb-ci>=-^GS(v6{$FZgl~o8#lNKUDQ)qA5S2P< z$J)8a9xkO)C5M-n4Ykj7mLXJWGves|Z)Y8b!q?fQT6!@`fgF?y|4{Jc4mAHlvnJQn z{+{OxMdd9|-u3Vf%e!uP^9g@o;tUg;DPqRtXvdHrBQ?|`866DG(w;0Mke;%8NRSc9 zvtEqzoUH6pIoBf4BoVWNouQ0q+&Rcwq7fPbc zjohcG*MdYD(9yzzAgi0WD#A7ePFrB&-zfdCvF`i`q@hFp9~>L&z{ z+i8F)9IR{roVE^P&FR{yDRRE$h_X+3-fL#;d8_5>kH{u(zd7v{b6)1op_{-Ny*Tf_ zdHaKvoF}9jV9N&c?#)fD=KYqdM4K4tAqSUZ$<WZ9@$`)WN5Nysoem4KfyUh z1FRyKECuGg&C|z(gk&%;TXL}_*+g^JnP=iyJR%2|=wse8i^pOTE4Kh}yCpr%)v}cQ z?$88F$on>B@Iv9M58N|t&jRvcOY1WPLbW-R9A4sOa}r$mob}GM=BxUNR~Cf&C&r#y zn6bf6pdQVf-947f(jM8M>HY*=4FH`ga4JnJ1Q9c#Vp7=G@Fa%QDVDt_&ygcaQ(30> ze?9=G@n(yi69@pH8xYsS83HPZ9gL-q-0r^HjhwaRTYGuT2CV1vLN-zbO}}X1h`iXo z_#`X~G}VizZXp2RNIj@OY=SaS$ks6G7Z4Dg^pOXwE;qpEeICvX40;#_2%V>XZ~h{i>Q$(;G*?awJS zX=apXX2TUY^u%M!iQ|$u&j0M|v3M@nJfb#6!t%i=6U8i`CC=iWP(5uPCl*->QnBoU zb>jilQ)2BIqk%1F-vL-_1!&46&ZJU-`$D-&FWd%jF9d_OSyc*s|@4A zm99F}nB?{T40AvLUnpD)MSuViZgAwDxnx54^zyRfOjdJX1EL6k8vw15Z7wEkH+B+m z2$Oij_W%{90;rxockhgu^K_|5$nwNG4N{A#9`bx5uK*x$jb#8o7fneGmB6HV^cTA< zheMa8B%IQNH9Z;S3)W;Z_O%}q!k0X|XG{{C$yKNe`2orh!=>`WY8MvFdKDKgw&KCeD4Lx zCR7lWpwi}!O^*oAEAOy~o&awy(NLtd#)X&G2(5+p*r+OKz4@@_>|iC_i?Dx(BJ>mI zZ4e3k?z^3%a>li6y02iuj%k=GL6wSvdELuX3A9FyAo?g^d23q z=YL3%+WubHdWnoORBswp2?KU$?pS$5d8EX-6==xUf^zLQY}xdLV-0E$pKxEdjyaM;IWz%_+3DvqN%VWNZz3d00LahWsV9pC5EKoo;aB(YEw^>cDsD;NC?e`e==a$I(SfhO{2a8sll%(ipcIL z42wNP3nYBoKMjzWkil0CU;KcFKjOXKZpE$tQh0-Tx3IzmrfD_&O`2Pw4_Pq^0Fem5 zTzrU@he-5w?pC!ZI;;A%{z~9n|mfS+Ejl0KQ;fZd5ov5`Y~h2z8Al*%Ue!V zFwB?Vki!*b6$WGg%m6b0Rsb-F+zZ272N?(e3kD{T{Zr7p9d&G)=Z2Yzz4E1aZuhw& z-?iu0Uj6z96?@fuN&UXI^Pk>+U+1P!FuVJWxilj%OTUlKx;>CMbJdC|P_vZsPRr=U?<+egI}Z_GR*m{O$#+^k^>vka~Z) zyI)B7^y)xjXMR}AZqL3kuE}lUB5$;G`eUj}H5T>-0K%Z#v&JR%3Nm4QUfycXB-A@t#$kSa$Dx?l&j$K~-%<`+d z!1exjMgFx4;Ee+OIu zahU=@&1cxV^GRX3v{vXoiW3ZVs-}WxI zi8n(~fQ0LAcgKCtGYJX~J@LAMQa!@$U}ddRMR$>XZZ;L8Fs>PHFS0}c3$h>+3o_s* zq!(ooGQfGlMwUrr8A8V(6PPp%fJL2Iik9&o4;5?-K$P-BU=RVKy9C-=H-@J=iY+Eo zK405vPq9`MsR;Axy}8^b#CIRwJpv*wY|RCL8{SkShb1m~{*Q94mwQj|fHO9%41mj& z84GZk-dDRT+$Ay?1xf_RZ;A>&6}p5wwZ%xK9aU$lnRwx(6~Pg5UWPl*4ao*$gwecx zK%k<(W6)<7&&2JZD2ItH^1Al`07~!G%jEG*$(L(atknmw{nSEDvaN2Ss^p}BJ!(X+)YF{@!Z$p< zd;?hH_6XG)a!lb1-eXi_P~+la7{i@s{9S5HYJ;UQ0PS@I&=_DE>mHEs?_}0Ru$lt1 zxz|X(KyiitQkvZ+>W>A`t{uClC|!cRtzmwG_a(_zI9&4Jvx!cQL0}aHaPANtlo%DI zOHswU?ySBrcd?~P86oIQa7kdWN0*31X73Q|?gN2|0Z`)y>qHeNJ*k6$`sdwvT=KWi z?RuDBqy3*zrtL*auvZ^=Br6L)?fO?Ff&iF%9dStP35}h{#tjb@`})V8F8QzezYjc@ zEA4;K3%+KoeZ)a6Vs-~u5CITK8bZnzM^)DWz3R^#l|s#3!cRG@Yv=L}Cb>X&{Niux zyum$gId{bykDB?lSx+72=@-^a0U&JVi|DbBlVw}iItaOIxAaM;olx`tvK(3Whc}z{ z_YG6^dgs}{nfFf4hY&!}0DvT*NzvjeCrGrbsi<+oJ=MkIUwyDuYxm(kNi$dM7ZGrA zJdNj7K0+V1yb$A&Le)~ONyeWm6`5j>=MFBhUmXW&vUlxRaf^g$Ds&4C@sRq2d0g#$ zLcjk zK1&e${|xwy2K%*{l~OVQHdfY-JCNvnjiwycH6+?bPBzI#P%FE_kfL3L3Hw!O-Oq^u z1^`1sWYH)A44~(=hqUZENQa(U$0=7Qj4}P1Kv+$=wk~*&`OYssdD-YvlV&pnHJTOe z>O!K7iXnj=cOkXZY(Q<(!8ERZs*_gQ?}Bede@}m~okkE~k1KoC4?ASm4w?}_gIl)1 zk%nexl-Vco)c9D%+e!Ie{fiomrEU7FA5+2Xtk_A4S@dS7$_*!G?35k%_71AxYVHrlfiSF zyGNd(R~lSpcR=&j`Q0^D0)xS35W)qEYKzcfCT_-9RNr{fGr6? zG=TyD@MjhfOf?vGPiWwQP3{Uch~0lW_Gda1qX;w0f`6rx%{B>OMRbK(g;|9Qh{H-K z?koZ=m6C2>Jls;{Ya27*eZcAf40FsU0FJp$2|fDZ51|a8#1VT{bSJ&yB{p$K&i9($Nf4Pz< z7pbdxjvwd8c(q#EUsNsn216h#@vR289^hZW72EXj)}78RT@t+Pk(c%!31~ZR9L|sI z7ZVdaNyHFE_Y1o?>YU0&>U{qmj{H(SwFEi>(a9`}i+SDMwxBo@zyLmTuu`VAzK#e$ zG#acxs&uDk_^a~>-&rK6SbY;tnLMh+*|(wH9Yr7riqyXhMF30@&2*da)$~bTj`wj&2tUfB}hgW^(Y@ zAptEJ(`b-d>TVo0&$`UUuXd=taWuDQVN(rX}N z^J1Ztvw2^GsS@YPb~C*pvk##C3`4O=f?$(bBn4X9<0qhyHTMu546s8)5z4q9L~lRS z9a}8r1v)ts35Qn$K)x|$+YS|M@}=N;2eGus3t$L>{&cc@;|~_)z~J zad7)h06Ch9+Y*yuv;*kZj}iynV+*S#gB<4>rW9{4+u_JLRtMx)@nFCf)abz8U3@x7 z5oQq-pa)xJ0QUVAK9MAU#j~y%0SW+|ZKK|G^{8~r*2zhd;%De&lq7DjfY`~W8o&m$ z76O?4OsoyIx@6YIwJK)Ix@jFhpHRQrEdwBCGxnzZIo4IcN!=P9+?G56BVYtf$Zs@Y zGXa!T8N27)-gH=PW5#4^eW75j7Gz~v5BtGLRTjPx!@|c(RJlW0au9cvZ{~#j2h?Lg z(l&~GsU`@9I&HN%N*&8dtzxn#OOP@K0RRCc0R%u|CcwLUwMZ@iYZ(PFjq7q)WCjQT z3uX~ufmsw-MHIM*f?y8HQ!0Zgpw6-a^pQv|kqKb9t&+{hivb%25?NWR_hP^%yByu+ zb7Z-O&yitR@K48`mlL{gt`X>mbfW^_Gdq*HzWO4fK6l=;Pi0KC6e zT~|cGm?4@b?3Y_S-ODN10Qj`C?a{^zkP>tb;A;kYYWHX}yv4C$9q*0=z*I^pS(Jn8 zz-3eWW3lS>8w4M4X5&oXh+L8YP=zJ}P%cPD5kODn5T!D94j9VkZw(g?w> zMBnZNs_oJe8m6Yny+TC8np*=HVp45Eq6GTbMFn81!4;*3b3(5xjI3ciMDCfX&>-6h z3_z;aS5mQglA21CZkx)U191Fu5m&_cZhu{@F*Hqo2(y29DqfHak3IL-zvBeVC?sSL zxJr7cdR}q08n|`4ZN7VPGpFk=uN@NGFoP?Q?z(TO${GiNWj~1RK5~KJE+%C2c00+Z ztJZRRvljoTcja%J9A1YajWAg-eVre{mRiy{lxGs*_5ptdzyM4~%v-hV#RzD!w{+T# zke#Q&_>pNekv)F(typn=b}}=+awF8s%#7X202uD-u-|_pigA6_fJ^(?1}2^v%z%{> zprh@Ca7NX*j_z^cWt_r1^5tP^%?+zFKlW){9tk}+f9r&-j`?Gj?Z98OLxl(>#42(^BZH*bGjB zKp~ka=@QkMXR;p|IH0b<(!V6?g&^GKo1~JO>O_%h5M8SOH4)yZWJVD&WN(%`wxRqa zFXs`xzV=DVw$)aDpmSv9bR5e}VjJ0VI6R}Ay zv+h%9n0Rf)I;0nopwBgxq3 z0QSj=+%-VQT9mG+j)dDL@de#1AxiUW$>aEj6c;v1VGWK z`rYQxcy+O5{+kneFK(?`n&9^B)&Iem=#_^#X2quG1n>$;x5)s;gF$`-s50LkH**A! zs3qyVt|Vr3c14)^5z}J)i0ug-3TE)cmw1Xs(!*6|t@TdVMrb;^h5JNn*=CfZQ$n4> zVe-#T-qQCb)-0SUy8?)gp3SLTQXMb8dI2Zf3Hw%dR+Z75Y8iJQVKe!Y2e&Ukk4`FQ z%I+AinG4KOFr>b^d}r*z0I49yCoQ3GEv@0`ocj=%Szr-rm(KcY@72wQ#z)ZmG7@{lh_%yOuIf29;txa5f_jE3uX@abY{P1&Bf4t zC>U_8lYPihl!oK^xT5Q^QNsiBYB(kPNHEL=(WbjJaAb8rw~4jG^;oWS38bosgiE3( zd;x&R31Zy{CjOc(uZdrYpmAzk2Y0HB zf9*XCCbj8$4PD=euEPuHfOjKL73a~|#|6*!ttXo2!R{OYCzfC+`|gQ)Nmf}V)d^5|D1_*b zh%=?+?A+uWp=UK@FWm@t|L~f{J|iV0LJf@?JJ_>7Ljj~>HL!A)VVP^fV9Ab)=#$$hvD^r8?)k{T`MoT~YR=ahk%lwBz;%R3f% z5cCb9vMKUazNg@cjQeCfr^w`mXgx6{Z^05sAhV3Tr% z;qG3A^D}5hQ4PT30dNcNW9@k@gvDjx8QuUf4g3G(l+q@b=rJ?wVwJHbSywm*Kt+hk zc&%r09<%KK^m@iv?B`^hh?9~@Kjut$2T9_cq1W_uMl(^8Z2HZk`esZsejf{S*3B%v zKS|E)%0`3U_tayz~M|qF+ zL8fO`KU7^4EN_a*td7s*umdENprIy#oKHhzp%{(`{h8EFp_%_QlMW^Vj))U+sVEto z(ep`q!LOH-jGlBNI%rE;N|@qnei<{t3$DiyOwXUhFSa>C!A5;iB;kJS`IviN%LFFr z=W8?*uFBlAO+u9MDrT+cvG!zZZzhhziEHqBaXoXh;N-~8`j9m2ye!MuVR)(99L3|2 zJ!Zxd&Ux~2rC`#tNq5-71eVQlW(FMDRLg4k7LnNGuq5;2HA8xzxhDWG<1ljE^ROPV zq#1Kr=s89TVaLgkCUf{+f&77B(71X?W^qy>cEUKk`HguwyLXJ@3WQ;3V@Sk_KHRK( zJPJ*`^t>>g6wHWA@-?>2+V_dSPeP)j%31#&%YEXna2o(zGAhYm*4=sFggn0EtM+(D zSeS`^ex%*-1n`aS!*bKs`vY4KjO43U^^_+&9{zzNR;J_hzQq9U8_TnIyOOqyfxe_U z$IP5FBTQ<(jT}ePp(Wo30N?3(pD-(|5ySQLHUQo*>KII$35tnVm@yjEY}3)1{tPWLWLfUZ|9brYi)H}1PnrDX*TSCMzY$X$C!yCv&9?7@ zqkRBZP^%7bJHYjTFyOrra6PaMpu=rv$oMgzo)}Yd#qyO`>Q`}`UpgA&KT;3_hjTb_ z969VFKmOT(HO;S&IdH4o2^ym9| zgc-TOElxp7nE|4iHmkV{8n}kIe*xL3IfGKpgIR)isU%thi-(6o-Wx$v#DdX1!Q0&h z4ZW*b<`Ip@$8_;K1d4_tABr!9eyhh>S& zzRi1wDhvT&ErGk;M4D3&ndiTfF)s-W!Vc9}dCGI|`fjus=?zB51E+o{7s3f3Vea=M z{BTYs(_*=T!WN%sC4g8zsB_U>@A#s?MLZZ-Jz`1}y3@53q^^*2_%|G^;wVPP#zXEn zx})CM@h0Z^Aa@g7l z){Q_sG0IP7|K?P`r@8z&d;Ih-J%7tZzVhn2Jp%mWT;%O6y8y6SF8oH6vke2zCs^^! zCBBY$ju7TIqs+8W@kk}{nv=;x`Nji7496XA^=vb-W?ml|o9Ej30Kd0u7&-x1s7}5O zfY|sZUWs>LDn-pD%h)SJO@1>YCqF#H$JmqE#2&^QaqxR$EIrIxCeHLTdpD&UA9%<3 z2#j}7yKX%B`0!^eY7CuWjiuPavJyw)K*&s%PqQ>Uz!S47ng8H;Fh4Q;BO|YLwjCwk z%s9)J(RtKnZ>9`R`!lqx~h(5A2XlRLbP`knG zW$wb2xGP6*P811z-Pbk=JT-ksc&z5rxn%y%BH&LDo1_9Z9!zQy4UoF2D8&S&=3ve> zM-Y#V&YWd>PtR-OmL)d>gK*^o_`#AejX<27i$}{+nD#h`nfatons0s^sYCC{R5E=t zdoyLuiM<-GftWnrGXtFko18i2o`36a#EbFIN6Z0kDh}gcBP780q@CIKQ+$AB;D-s5 zELksu&A`Xp1;NqK&Tl+30G$z5fRSfVa|936HL48j=&S({?7M@@T+HxtM>v2+n)1i+ zbwipo)J~eB=Z0$7m=qGZdzI$4PEo->+!ZoFNJ2Et-8*1_vZ#SH0-%xeU5e_(a#o5H unfb)C!E>77!Elp%!~h5&k^&C@24%y>p|yjez{lzUh6+k8!T}}& literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-hdpi/img_write_storage_create_doc_sdk_30.webp b/commons/src/main/res/drawable-hdpi/img_write_storage_create_doc_sdk_30.webp new file mode 100644 index 0000000000000000000000000000000000000000..716acabcbd2e4c2cfa6ad10b2e7ec5f213c0cbf9 GIT binary patch literal 2174 zcmV-^2!Z!fNk&F?2mkDv$wS0X~sPolK>qBPbx2384TI z32AQefW-F#%vXU<03Kic2l?VO+Wi15lqz!=zo@;H84tI(YJJ3^${LGH0n%#qElr|ZiS^&8=)(d8V!2I&BWQjnK5K zTgUudH#b7ksg2KcQw40if<%|hlKGNf7_S0JfzwK+H$u{>jnI_#*2GfDpe`!pV5Gf4 zo=)?bA_%hm7=|;T4Zc<@5^}R~65!JSVAtD-b4nY)Cnxi><%kWrq0>SgQdx$fq`phusH*`&d~)rtRQlcI@nQBIX^|(KJtG zLcT>(UW_I}jzHtiSk}Y^OcvhlmtSahUr|?UJ@DY1^F=TknUXsq=0x(3fYjtIDeB({ zp_hRq2+u{JX%$p+2Mwv+*B7h25oWW6sTy20|9hus1S7VvvV%0vm<7kRr(s>^2(sfT zeE3Ui!0-V6{ghpYkOerGNhV-$fR4CWodwH0s_X$x*$tt3S_X;W7~_CSNVBH%UZMp~G(k{2kHdLSZK4&z{GhE#D77__NEE zY?jb*;9(j~PqFll`LhKpdCIXqf@FtIyTg$QJI z0H9amjSuRJMS$9fiy9W)QbBoSwyeSefLAFU#XsxCYCi~mfnMb=H}J;S_(W#uUC=Z0 z*X)R2Fb|LvCQ`}Dv0h-9OaKCV(Vp$|EYuKq_(OR3Lv}EFX;(i^<9LBw4Im)_nEB1z zftHQc-V~rlp(fSRi|mJl+A2QYej3#m_c6d{s}K{U*_Vx`8Oh$`NIIplj+lwXCHZgx z9yPkeYPk947G3j%fqzMDz1jYZ$_X`u(cSugMW!c3);N;JR8`=v`!P!Cb+MII#X@wZ z#oW;MQB2e`!jiGC5?(bv@YQx4QJHwboq)>>r8p#I9(m2Ll#vS}RCf*I;SBSzP4@tJ zi}Abk0IECf$KWhV#wu5z1u9MixsH3_;kk+^=nzSc|)XOdVQYV}J9Q`#Doodaw0^BS9Uliv-p5kjln6Qj<6{%Az ziyfCB?8=hwCvB0?cF5&Lii_d%KO7x<8cE%9wYWy%kRGgJ;96fmzh>tlYXc_nTH>$S zR}2`?O=GW2X!PISFYed^Z!oETr{#h-gdIY)KOfD@>CcyT!W|O8p^v<4)VJ@XtVixA zz{`%j`rJ8OVPIhS*|3<-Ft6nu$GtsI?{wLs3g(;>($TP~+9aU&7&3o*(T|#{_A+fk zH?DG_!D_mQ>qK*0SmHK0$wjtD3yfIyHwh(%6*6C#4mqqZ9!a3=C@$7y?=PLRfK!!v8R$3u{uRY74)4XhdQM5O)x-Hp#HIc4N8o(Xb6G zW3)m$erpMAap&g#Ykpmm-6NSP* z@RdA5#;q8Bd##tylNl%gLm+eYPxBrqBr>kTMIT739nw-dCoN2nf>| zUNm~ow-^)HyZlIB`5O;=NCBU5eBG6ufDIe~1C77|1Atd;0G1An4en+;RM-IuNB|T> zj6?FvMP-(WXF!Ut-|$KCKU(by*pM8lHR=F`fC>K`Y_y3O77kedh8Hyfn1lcT08FGQ A9RL6T literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-hdpi/img_write_storage_otg.webp b/commons/src/main/res/drawable-hdpi/img_write_storage_otg.webp new file mode 100644 index 0000000000000000000000000000000000000000..9fe908214fbf24cc6b87cff197f8e067924a5ffe GIT binary patch literal 17438 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 h@>w_pGnAOXe4?-YT^?Pw{s%(@<|%W<9Ogf=7> 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 S@wj^I>jqWm@%K1!kI4juUq>|n literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-hdpi/img_write_storage_sdk_30.webp b/commons/src/main/res/drawable-hdpi/img_write_storage_sdk_30.webp new file mode 100644 index 0000000000000000000000000000000000000000..886257e250afa52996e729450690558f1f874bf4 GIT binary patch literal 5032 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 aBPL>-IjoAw;qFlTW%+j)VdVcuMi2m^&()Iv literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xhdpi/img_write_storage_create_doc_sdk_30.webp b/commons/src/main/res/drawable-xhdpi/img_write_storage_create_doc_sdk_30.webp new file mode 100644 index 0000000000000000000000000000000000000000..7b91b41bf31748cf16ad741db9d21bf38fda1125 GIT binary patch literal 3414 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xhdpi/img_write_storage_otg.webp b/commons/src/main/res/drawable-xhdpi/img_write_storage_otg.webp new file mode 100644 index 0000000000000000000000000000000000000000..4cc86e3acf6e5c482a238a66f09850eefb66f115 GIT binary patch literal 25726 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

sJ~Co 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xhdpi/img_write_storage_sd.webp b/commons/src/main/res/drawable-xhdpi/img_write_storage_sd.webp new file mode 100644 index 0000000000000000000000000000000000000000..daf91fdc76636d08d7a9f5b3da80023429bb1a6d GIT binary patch literal 20680 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xhdpi/img_write_storage_sdk_30.webp b/commons/src/main/res/drawable-xhdpi/img_write_storage_sdk_30.webp new file mode 100644 index 0000000000000000000000000000000000000000..009c86091777cb99db7f414bc260a8167d4c3a91 GIT binary patch literal 7780 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xxhdpi/img_write_storage.webp b/commons/src/main/res/drawable-xxhdpi/img_write_storage.webp new file mode 100644 index 0000000000000000000000000000000000000000..c228f8ea660ccbd861594f618ad7e14f1c95a158 GIT binary patch literal 19694 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 BS*-v7 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xxhdpi/img_write_storage_create_doc_sdk_30.webp b/commons/src/main/res/drawable-xxhdpi/img_write_storage_create_doc_sdk_30.webp new file mode 100644 index 0000000000000000000000000000000000000000..372d3936806a5bcec7ea9ef3c9caf928290c5b43 GIT binary patch literal 4760 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xxhdpi/img_write_storage_sd.webp b/commons/src/main/res/drawable-xxhdpi/img_write_storage_sd.webp new file mode 100644 index 0000000000000000000000000000000000000000..83bf4b6bc8ba55b8ea24f94ad73df0dcd6bc02b9 GIT binary patch literal 26880 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%0ALLT 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xxxhdpi/img_write_storage.webp b/commons/src/main/res/drawable-xxxhdpi/img_write_storage.webp new file mode 100644 index 0000000000000000000000000000000000000000..59840629aef1dd7e145d57d2e64004b6669ecfb6 GIT binary patch literal 25238 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 L|EvAKnw|jw=!_Bk literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xxxhdpi/img_write_storage_create_doc_sdk_30.webp b/commons/src/main/res/drawable-xxxhdpi/img_write_storage_create_doc_sdk_30.webp new file mode 100644 index 0000000000000000000000000000000000000000..b20dc679becdc956003654bbb668ef4236a98d76 GIT binary patch literal 8422 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xxxhdpi/img_write_storage_otg.webp b/commons/src/main/res/drawable-xxxhdpi/img_write_storage_otg.webp new file mode 100644 index 0000000000000000000000000000000000000000..dceb5a389feb0a66653195a3deacd954c2096ae6 GIT binary patch literal 42512 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∾fQc;i=I6b5L21ud__ejX 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 C@Jty1 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable-xxxhdpi/img_write_storage_sdk_30.webp b/commons/src/main/res/drawable-xxxhdpi/img_write_storage_sdk_30.webp new file mode 100644 index 0000000000000000000000000000000000000000..0b3ac2644ce77b13852fb27fe28df73cbde01738 GIT binary patch literal 15278 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 D_`|Zo literal 0 HcmV?d00001 diff --git a/commons/src/main/res/drawable/actionmenu_background.xml b/commons/src/main/res/drawable/actionmenu_background.xml new file mode 100644 index 000000000..170a05d39 --- /dev/null +++ b/commons/src/main/res/drawable/actionmenu_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/black_dialog_background.xml b/commons/src/main/res/drawable/black_dialog_background.xml new file mode 100644 index 000000000..49be2b588 --- /dev/null +++ b/commons/src/main/res/drawable/black_dialog_background.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/commons/src/main/res/drawable/bottom_sheet_bg.xml b/commons/src/main/res/drawable/bottom_sheet_bg.xml new file mode 100644 index 000000000..190f5b829 --- /dev/null +++ b/commons/src/main/res/drawable/bottom_sheet_bg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/bottom_sheet_bg_black.xml b/commons/src/main/res/drawable/bottom_sheet_bg_black.xml new file mode 100644 index 000000000..a89b9e5f8 --- /dev/null +++ b/commons/src/main/res/drawable/bottom_sheet_bg_black.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/commons/src/main/res/drawable/button_background.9.png b/commons/src/main/res/drawable/button_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f2381614a285d4c0583d35960fbf385e5d8c8c8c GIT binary patch literal 233 zcmV2~; z`{0&?;sofTAO<=BP?Un~gIWF`!~w+(JuC;=Giv$ZuzbK0+<;~^ + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/button_background_stroke.xml b/commons/src/main/res/drawable/button_background_stroke.xml new file mode 100644 index 000000000..b5901a461 --- /dev/null +++ b/commons/src/main/res/drawable/button_background_stroke.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/circle_background.xml b/commons/src/main/res/drawable/circle_background.xml new file mode 100644 index 000000000..3d6307508 --- /dev/null +++ b/commons/src/main/res/drawable/circle_background.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/color_picker_circle.xml b/commons/src/main/res/drawable/color_picker_circle.xml new file mode 100644 index 000000000..20e701b72 --- /dev/null +++ b/commons/src/main/res/drawable/color_picker_circle.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/dialog_bg.xml b/commons/src/main/res/drawable/dialog_bg.xml new file mode 100644 index 000000000..d4a490704 --- /dev/null +++ b/commons/src/main/res/drawable/dialog_bg.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/dialog_you_background.xml b/commons/src/main/res/drawable/dialog_you_background.xml new file mode 100644 index 000000000..deb0bfe2d --- /dev/null +++ b/commons/src/main/res/drawable/dialog_you_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/divider.xml b/commons/src/main/res/drawable/divider.xml new file mode 100644 index 000000000..f38bf81fe --- /dev/null +++ b/commons/src/main/res/drawable/divider.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/commons/src/main/res/drawable/gradient_background.xml b/commons/src/main/res/drawable/gradient_background.xml new file mode 100644 index 000000000..d1dce9c0b --- /dev/null +++ b/commons/src/main/res/drawable/gradient_background.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/gradient_background_flipped.xml b/commons/src/main/res/drawable/gradient_background_flipped.xml new file mode 100644 index 000000000..9b725d80c --- /dev/null +++ b/commons/src/main/res/drawable/gradient_background_flipped.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_add_person_vector.xml b/commons/src/main/res/drawable/ic_add_person_vector.xml new file mode 100644 index 000000000..d5aa8f95a --- /dev/null +++ b/commons/src/main/res/drawable/ic_add_person_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_arrow_left_vector.xml b/commons/src/main/res/drawable/ic_arrow_left_vector.xml new file mode 100644 index 000000000..8a6b78843 --- /dev/null +++ b/commons/src/main/res/drawable/ic_arrow_left_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_arrow_right_vector.xml b/commons/src/main/res/drawable/ic_arrow_right_vector.xml new file mode 100644 index 000000000..ed05ec242 --- /dev/null +++ b/commons/src/main/res/drawable/ic_arrow_right_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_article_vector.xml b/commons/src/main/res/drawable/ic_article_vector.xml new file mode 100644 index 000000000..fb9bf1bcc --- /dev/null +++ b/commons/src/main/res/drawable/ic_article_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_attach_file_vector.xml b/commons/src/main/res/drawable/ic_attach_file_vector.xml new file mode 100644 index 000000000..96a2954c1 --- /dev/null +++ b/commons/src/main/res/drawable/ic_attach_file_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_bell_vector.xml b/commons/src/main/res/drawable/ic_bell_vector.xml new file mode 100644 index 000000000..34edb3cd4 --- /dev/null +++ b/commons/src/main/res/drawable/ic_bell_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_block_vector.xml b/commons/src/main/res/drawable/ic_block_vector.xml new file mode 100644 index 000000000..cd8487531 --- /dev/null +++ b/commons/src/main/res/drawable/ic_block_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_business_vector.xml b/commons/src/main/res/drawable/ic_business_vector.xml new file mode 100644 index 000000000..688df3bdd --- /dev/null +++ b/commons/src/main/res/drawable/ic_business_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_camera_vector.xml b/commons/src/main/res/drawable/ic_camera_vector.xml new file mode 100644 index 000000000..4f7dd8814 --- /dev/null +++ b/commons/src/main/res/drawable/ic_camera_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_change_view_vector.xml b/commons/src/main/res/drawable/ic_change_view_vector.xml new file mode 100644 index 000000000..f366299db --- /dev/null +++ b/commons/src/main/res/drawable/ic_change_view_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_check_circle_vector.xml b/commons/src/main/res/drawable/ic_check_circle_vector.xml new file mode 100644 index 000000000..a1c599dda --- /dev/null +++ b/commons/src/main/res/drawable/ic_check_circle_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_check_vector.xml b/commons/src/main/res/drawable/ic_check_vector.xml new file mode 100644 index 000000000..34399d406 --- /dev/null +++ b/commons/src/main/res/drawable/ic_check_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_chevron_left_vector.xml b/commons/src/main/res/drawable/ic_chevron_left_vector.xml new file mode 100644 index 000000000..1c04ab7d0 --- /dev/null +++ b/commons/src/main/res/drawable/ic_chevron_left_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_chevron_right_unpadded_vector.xml b/commons/src/main/res/drawable/ic_chevron_right_unpadded_vector.xml new file mode 100644 index 000000000..aeda28584 --- /dev/null +++ b/commons/src/main/res/drawable/ic_chevron_right_unpadded_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_chevron_right_vector.xml b/commons/src/main/res/drawable/ic_chevron_right_vector.xml new file mode 100644 index 000000000..c5f6ec8ce --- /dev/null +++ b/commons/src/main/res/drawable/ic_chevron_right_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_clear_vector.xml b/commons/src/main/res/drawable/ic_clear_vector.xml new file mode 100644 index 000000000..27a88337b --- /dev/null +++ b/commons/src/main/res/drawable/ic_clear_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_clock_filled_vector.xml b/commons/src/main/res/drawable/ic_clock_filled_vector.xml new file mode 100644 index 000000000..c591ef833 --- /dev/null +++ b/commons/src/main/res/drawable/ic_clock_filled_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_clock_vector.xml b/commons/src/main/res/drawable/ic_clock_vector.xml new file mode 100644 index 000000000..4c1aa412b --- /dev/null +++ b/commons/src/main/res/drawable/ic_clock_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_code_vector.xml b/commons/src/main/res/drawable/ic_code_vector.xml new file mode 100644 index 000000000..5ced99251 --- /dev/null +++ b/commons/src/main/res/drawable/ic_code_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_column_count_vector.xml b/commons/src/main/res/drawable/ic_column_count_vector.xml new file mode 100644 index 000000000..65aab3ad9 --- /dev/null +++ b/commons/src/main/res/drawable/ic_column_count_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_copy_vector.xml b/commons/src/main/res/drawable/ic_copy_vector.xml new file mode 100644 index 000000000..8651aeeb8 --- /dev/null +++ b/commons/src/main/res/drawable/ic_copy_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_cross_vector.xml b/commons/src/main/res/drawable/ic_cross_vector.xml new file mode 100644 index 000000000..a84ff5d37 --- /dev/null +++ b/commons/src/main/res/drawable/ic_cross_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_delete_vector.xml b/commons/src/main/res/drawable/ic_delete_vector.xml new file mode 100644 index 000000000..9986e46c7 --- /dev/null +++ b/commons/src/main/res/drawable/ic_delete_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_dialpad_vector.xml b/commons/src/main/res/drawable/ic_dialpad_vector.xml new file mode 100644 index 000000000..3345dda40 --- /dev/null +++ b/commons/src/main/res/drawable/ic_dialpad_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_dollar_vector.xml b/commons/src/main/res/drawable/ic_dollar_vector.xml new file mode 100644 index 000000000..925dc51ad --- /dev/null +++ b/commons/src/main/res/drawable/ic_dollar_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_drag_handle_vector.xml b/commons/src/main/res/drawable/ic_drag_handle_vector.xml new file mode 100644 index 000000000..cb015fadf --- /dev/null +++ b/commons/src/main/res/drawable/ic_drag_handle_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_edit_vector.xml b/commons/src/main/res/drawable/ic_edit_vector.xml new file mode 100644 index 000000000..01259e8da --- /dev/null +++ b/commons/src/main/res/drawable/ic_edit_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_face_vector.xml b/commons/src/main/res/drawable/ic_face_vector.xml new file mode 100644 index 000000000..beb5766fc --- /dev/null +++ b/commons/src/main/res/drawable/ic_face_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_facebook_vector.xml b/commons/src/main/res/drawable/ic_facebook_vector.xml new file mode 100644 index 000000000..08c430a5d --- /dev/null +++ b/commons/src/main/res/drawable/ic_facebook_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_file_aep.xml b/commons/src/main/res/drawable/ic_file_aep.xml new file mode 100644 index 000000000..b677e468c --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_aep.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_ai.xml b/commons/src/main/res/drawable/ic_file_ai.xml new file mode 100644 index 000000000..239acfc16 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_ai.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_avi.xml b/commons/src/main/res/drawable/ic_file_avi.xml new file mode 100644 index 000000000..c81644ddd --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_avi.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_css.xml b/commons/src/main/res/drawable/ic_file_css.xml new file mode 100644 index 000000000..d1dd696d2 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_css.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_csv.xml b/commons/src/main/res/drawable/ic_file_csv.xml new file mode 100644 index 000000000..baceb9a40 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_csv.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_dbf.xml b/commons/src/main/res/drawable/ic_file_dbf.xml new file mode 100644 index 000000000..e26d7a81f --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_dbf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_doc.xml b/commons/src/main/res/drawable/ic_file_doc.xml new file mode 100644 index 000000000..b225e7bb5 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_doc.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_dwg.xml b/commons/src/main/res/drawable/ic_file_dwg.xml new file mode 100644 index 000000000..bbe5196e4 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_dwg.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_exe.xml b/commons/src/main/res/drawable/ic_file_exe.xml new file mode 100644 index 000000000..7e3a990e1 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_exe.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_fla.xml b/commons/src/main/res/drawable/ic_file_fla.xml new file mode 100644 index 000000000..014dcb592 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_fla.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_flv.xml b/commons/src/main/res/drawable/ic_file_flv.xml new file mode 100644 index 000000000..a76507e3b --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_flv.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_generic.xml b/commons/src/main/res/drawable/ic_file_generic.xml new file mode 100644 index 000000000..76ca71ec5 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_generic.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_html.xml b/commons/src/main/res/drawable/ic_file_html.xml new file mode 100644 index 000000000..d80ce24c3 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_html.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_ics.xml b/commons/src/main/res/drawable/ic_file_ics.xml new file mode 100644 index 000000000..e7a665145 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_ics.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_indd.xml b/commons/src/main/res/drawable/ic_file_indd.xml new file mode 100644 index 000000000..8b7f003ff --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_indd.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_iso.xml b/commons/src/main/res/drawable/ic_file_iso.xml new file mode 100644 index 000000000..e9a88ff66 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_iso.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_jpg.xml b/commons/src/main/res/drawable/ic_file_jpg.xml new file mode 100644 index 000000000..e9b6e0e2e --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_jpg.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_js.xml b/commons/src/main/res/drawable/ic_file_js.xml new file mode 100644 index 000000000..0095d4579 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_js.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_json.xml b/commons/src/main/res/drawable/ic_file_json.xml new file mode 100644 index 000000000..15ca7a2f2 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_json.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_m4a.xml b/commons/src/main/res/drawable/ic_file_m4a.xml new file mode 100644 index 000000000..780f9f909 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_m4a.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_mp3.xml b/commons/src/main/res/drawable/ic_file_mp3.xml new file mode 100644 index 000000000..b95a5ba03 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_mp3.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_mp4.xml b/commons/src/main/res/drawable/ic_file_mp4.xml new file mode 100644 index 000000000..dd1c5e71d --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_mp4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_ogg.xml b/commons/src/main/res/drawable/ic_file_ogg.xml new file mode 100644 index 000000000..fd857c275 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_ogg.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_pdf.xml b/commons/src/main/res/drawable/ic_file_pdf.xml new file mode 100644 index 000000000..5e8e24951 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_pdf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_plproj.xml b/commons/src/main/res/drawable/ic_file_plproj.xml new file mode 100644 index 000000000..a534f6304 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_plproj.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_png.xml b/commons/src/main/res/drawable/ic_file_png.xml new file mode 100644 index 000000000..4489ec567 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_png.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_ppt.xml b/commons/src/main/res/drawable/ic_file_ppt.xml new file mode 100644 index 000000000..803fe8248 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_ppt.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_prproj.xml b/commons/src/main/res/drawable/ic_file_prproj.xml new file mode 100644 index 000000000..71f66dd21 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_prproj.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_psd.xml b/commons/src/main/res/drawable/ic_file_psd.xml new file mode 100644 index 000000000..72645da54 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_psd.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_rtf.xml b/commons/src/main/res/drawable/ic_file_rtf.xml new file mode 100644 index 000000000..751f6d591 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_rtf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_sesx.xml b/commons/src/main/res/drawable/ic_file_sesx.xml new file mode 100644 index 000000000..83b72fd71 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_sesx.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_sql.xml b/commons/src/main/res/drawable/ic_file_sql.xml new file mode 100644 index 000000000..29f699ab7 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_sql.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_svg.xml b/commons/src/main/res/drawable/ic_file_svg.xml new file mode 100644 index 000000000..a8cc065b1 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_svg.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_txt.xml b/commons/src/main/res/drawable/ic_file_txt.xml new file mode 100644 index 000000000..1af8bf3f2 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_txt.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_vcf.xml b/commons/src/main/res/drawable/ic_file_vcf.xml new file mode 100644 index 000000000..d453b9a45 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_vcf.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_wav.xml b/commons/src/main/res/drawable/ic_file_wav.xml new file mode 100644 index 000000000..557661199 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_wav.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_wmv.xml b/commons/src/main/res/drawable/ic_file_wmv.xml new file mode 100644 index 000000000..f2818eb05 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_wmv.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_xls.xml b/commons/src/main/res/drawable/ic_file_xls.xml new file mode 100644 index 000000000..636b907d5 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_xls.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_xml.xml b/commons/src/main/res/drawable/ic_file_xml.xml new file mode 100644 index 000000000..ff1bf6421 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_xml.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_file_zip.xml b/commons/src/main/res/drawable/ic_file_zip.xml new file mode 100644 index 000000000..0ada15d04 --- /dev/null +++ b/commons/src/main/res/drawable/ic_file_zip.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_filter_vector.xml b/commons/src/main/res/drawable/ic_filter_vector.xml new file mode 100644 index 000000000..c352195b8 --- /dev/null +++ b/commons/src/main/res/drawable/ic_filter_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_fingerprint_vector.xml b/commons/src/main/res/drawable/ic_fingerprint_vector.xml new file mode 100644 index 000000000..b65c5e585 --- /dev/null +++ b/commons/src/main/res/drawable/ic_fingerprint_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_flag_arabic_vector.xml b/commons/src/main/res/drawable/ic_flag_arabic_vector.xml new file mode 100644 index 000000000..e15e2129c --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_arabic_vector.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_azerbaijani_vector.xml b/commons/src/main/res/drawable/ic_flag_azerbaijani_vector.xml new file mode 100644 index 000000000..e2200eb85 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_azerbaijani_vector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_basque_vector.xml b/commons/src/main/res/drawable/ic_flag_basque_vector.xml new file mode 100644 index 000000000..17521491c --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_basque_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_bengali_vector.xml b/commons/src/main/res/drawable/ic_flag_bengali_vector.xml new file mode 100644 index 000000000..5ad5ffc94 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_bengali_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_catalan_vector.xml b/commons/src/main/res/drawable/ic_flag_catalan_vector.xml new file mode 100644 index 000000000..e70897563 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_catalan_vector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_chinese_cn_vector.xml b/commons/src/main/res/drawable/ic_flag_chinese_cn_vector.xml new file mode 100644 index 000000000..699edca4d --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_chinese_cn_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_chinese_hk_vector.xml b/commons/src/main/res/drawable/ic_flag_chinese_hk_vector.xml new file mode 100644 index 000000000..b7839ef24 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_chinese_hk_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_chinese_tw_vector.xml b/commons/src/main/res/drawable/ic_flag_chinese_tw_vector.xml new file mode 100644 index 000000000..64e1a9f7e --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_chinese_tw_vector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_croatian_vector.xml b/commons/src/main/res/drawable/ic_flag_croatian_vector.xml new file mode 100644 index 000000000..22d4228a3 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_croatian_vector.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_czech_vector.xml b/commons/src/main/res/drawable/ic_flag_czech_vector.xml new file mode 100644 index 000000000..e2726028f --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_czech_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_danish_vector.xml b/commons/src/main/res/drawable/ic_flag_danish_vector.xml new file mode 100644 index 000000000..91a6dedd2 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_danish_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_dutch_vector.xml b/commons/src/main/res/drawable/ic_flag_dutch_vector.xml new file mode 100644 index 000000000..f64c196cb --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_dutch_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_finnish_vector.xml b/commons/src/main/res/drawable/ic_flag_finnish_vector.xml new file mode 100644 index 000000000..7250ae969 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_finnish_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_french_vector.xml b/commons/src/main/res/drawable/ic_flag_french_vector.xml new file mode 100644 index 000000000..32857cb24 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_french_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_galician_vector.xml b/commons/src/main/res/drawable/ic_flag_galician_vector.xml new file mode 100644 index 000000000..4feb493b0 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_galician_vector.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_german_vector.xml b/commons/src/main/res/drawable/ic_flag_german_vector.xml new file mode 100644 index 000000000..301ae0509 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_german_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_greek_vector.xml b/commons/src/main/res/drawable/ic_flag_greek_vector.xml new file mode 100644 index 000000000..f8da477f4 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_greek_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_hebrew_vector.xml b/commons/src/main/res/drawable/ic_flag_hebrew_vector.xml new file mode 100644 index 000000000..4776028db --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_hebrew_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_hindi_vector.xml b/commons/src/main/res/drawable/ic_flag_hindi_vector.xml new file mode 100644 index 000000000..dbeb9ae20 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_hindi_vector.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_hungarian_vector.xml b/commons/src/main/res/drawable/ic_flag_hungarian_vector.xml new file mode 100644 index 000000000..d4cc31ebc --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_hungarian_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_indonesian_vector.xml b/commons/src/main/res/drawable/ic_flag_indonesian_vector.xml new file mode 100644 index 000000000..36c7aa95a --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_indonesian_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_italian_vector.xml b/commons/src/main/res/drawable/ic_flag_italian_vector.xml new file mode 100644 index 000000000..a09e51f01 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_italian_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_japanese_vector.xml b/commons/src/main/res/drawable/ic_flag_japanese_vector.xml new file mode 100644 index 000000000..6d01bda81 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_japanese_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_korean_vector.xml b/commons/src/main/res/drawable/ic_flag_korean_vector.xml new file mode 100644 index 000000000..29c52993e --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_korean_vector.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_lithuanian_vector.xml b/commons/src/main/res/drawable/ic_flag_lithuanian_vector.xml new file mode 100644 index 000000000..8a79fae1d --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_lithuanian_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_nepali_vector.xml b/commons/src/main/res/drawable/ic_flag_nepali_vector.xml new file mode 100644 index 000000000..10d164577 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_nepali_vector.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_norwegian_vector.xml b/commons/src/main/res/drawable/ic_flag_norwegian_vector.xml new file mode 100644 index 000000000..7aa6a1015 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_norwegian_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_persian_vector.xml b/commons/src/main/res/drawable/ic_flag_persian_vector.xml new file mode 100644 index 000000000..4ba3c228d --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_persian_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_polish_vector.xml b/commons/src/main/res/drawable/ic_flag_polish_vector.xml new file mode 100644 index 000000000..545f61d40 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_polish_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_portuguese_vector.xml b/commons/src/main/res/drawable/ic_flag_portuguese_vector.xml new file mode 100644 index 000000000..32e63f445 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_portuguese_vector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_romanian_vector.xml b/commons/src/main/res/drawable/ic_flag_romanian_vector.xml new file mode 100644 index 000000000..6a2c8e3a4 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_romanian_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_russian_vector.xml b/commons/src/main/res/drawable/ic_flag_russian_vector.xml new file mode 100644 index 000000000..a1fb4a2b6 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_russian_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_slovak_vector.xml b/commons/src/main/res/drawable/ic_flag_slovak_vector.xml new file mode 100644 index 000000000..b7c94a2b1 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_slovak_vector.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_slovenian_vector.xml b/commons/src/main/res/drawable/ic_flag_slovenian_vector.xml new file mode 100644 index 000000000..69d039e56 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_slovenian_vector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_spanish_vector.xml b/commons/src/main/res/drawable/ic_flag_spanish_vector.xml new file mode 100644 index 000000000..12fe5ee01 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_spanish_vector.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_swedish_vector.xml b/commons/src/main/res/drawable/ic_flag_swedish_vector.xml new file mode 100644 index 000000000..1bae26e2f --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_swedish_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_tamil_vector.xml b/commons/src/main/res/drawable/ic_flag_tamil_vector.xml new file mode 100644 index 000000000..4c95eb320 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_tamil_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_turkish_vector.xml b/commons/src/main/res/drawable/ic_flag_turkish_vector.xml new file mode 100644 index 000000000..1d1d07a5f --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_turkish_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_ukrainian_vector.xml b/commons/src/main/res/drawable/ic_flag_ukrainian_vector.xml new file mode 100644 index 000000000..38a1e9367 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_ukrainian_vector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commons/src/main/res/drawable/ic_flag_welsh_vector.xml b/commons/src/main/res/drawable/ic_flag_welsh_vector.xml new file mode 100644 index 000000000..16364a7e8 --- /dev/null +++ b/commons/src/main/res/drawable/ic_flag_welsh_vector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_folder_open_vector.xml b/commons/src/main/res/drawable/ic_folder_open_vector.xml new file mode 100644 index 000000000..3ee5ba98f --- /dev/null +++ b/commons/src/main/res/drawable/ic_folder_open_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_folder_outline_vector.xml b/commons/src/main/res/drawable/ic_folder_outline_vector.xml new file mode 100644 index 000000000..f3f7605b3 --- /dev/null +++ b/commons/src/main/res/drawable/ic_folder_outline_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_folder_vector.xml b/commons/src/main/res/drawable/ic_folder_vector.xml new file mode 100644 index 000000000..cc2caf459 --- /dev/null +++ b/commons/src/main/res/drawable/ic_folder_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_github_vector.xml b/commons/src/main/res/drawable/ic_github_vector.xml new file mode 100644 index 000000000..641ce4637 --- /dev/null +++ b/commons/src/main/res/drawable/ic_github_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_google_play_vector.xml b/commons/src/main/res/drawable/ic_google_play_vector.xml new file mode 100644 index 000000000..a6f96c328 --- /dev/null +++ b/commons/src/main/res/drawable/ic_google_play_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_group_circle_bg.xml b/commons/src/main/res/drawable/ic_group_circle_bg.xml new file mode 100644 index 000000000..2947b56fe --- /dev/null +++ b/commons/src/main/res/drawable/ic_group_circle_bg.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ic_heart_vector.xml b/commons/src/main/res/drawable/ic_heart_vector.xml new file mode 100644 index 000000000..b1f0bf824 --- /dev/null +++ b/commons/src/main/res/drawable/ic_heart_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_hide_vector.xml b/commons/src/main/res/drawable/ic_hide_vector.xml new file mode 100644 index 000000000..0ec88c6fe --- /dev/null +++ b/commons/src/main/res/drawable/ic_hide_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_info_vector.xml b/commons/src/main/res/drawable/ic_info_vector.xml new file mode 100644 index 000000000..8f84d9fc5 --- /dev/null +++ b/commons/src/main/res/drawable/ic_info_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_label_vector.xml b/commons/src/main/res/drawable/ic_label_vector.xml new file mode 100644 index 000000000..7142bd2d8 --- /dev/null +++ b/commons/src/main/res/drawable/ic_label_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_link_vector.xml b/commons/src/main/res/drawable/ic_link_vector.xml new file mode 100644 index 000000000..51aa75ebe --- /dev/null +++ b/commons/src/main/res/drawable/ic_link_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_lock_vector.xml b/commons/src/main/res/drawable/ic_lock_vector.xml new file mode 100644 index 000000000..a206dc365 --- /dev/null +++ b/commons/src/main/res/drawable/ic_lock_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_mail_vector.xml b/commons/src/main/res/drawable/ic_mail_vector.xml new file mode 100644 index 000000000..3610d7432 --- /dev/null +++ b/commons/src/main/res/drawable/ic_mail_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_microphone_vector.xml b/commons/src/main/res/drawable/ic_microphone_vector.xml new file mode 100644 index 000000000..ed32dc44c --- /dev/null +++ b/commons/src/main/res/drawable/ic_microphone_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_minus_circle_vector.xml b/commons/src/main/res/drawable/ic_minus_circle_vector.xml new file mode 100644 index 000000000..6453b7fb7 --- /dev/null +++ b/commons/src/main/res/drawable/ic_minus_circle_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_minus_vector.xml b/commons/src/main/res/drawable/ic_minus_vector.xml new file mode 100644 index 000000000..c61fc2050 --- /dev/null +++ b/commons/src/main/res/drawable/ic_minus_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_move_to_bottom_vector.xml b/commons/src/main/res/drawable/ic_move_to_bottom_vector.xml new file mode 100644 index 000000000..f57fe08f5 --- /dev/null +++ b/commons/src/main/res/drawable/ic_move_to_bottom_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_move_to_top_vector.xml b/commons/src/main/res/drawable/ic_move_to_top_vector.xml new file mode 100644 index 000000000..6a852402d --- /dev/null +++ b/commons/src/main/res/drawable/ic_move_to_top_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_move_vector.xml b/commons/src/main/res/drawable/ic_move_vector.xml new file mode 100644 index 000000000..87b2455cb --- /dev/null +++ b/commons/src/main/res/drawable/ic_move_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_next_outline_vector.xml b/commons/src/main/res/drawable/ic_next_outline_vector.xml new file mode 100644 index 000000000..9478a4f90 --- /dev/null +++ b/commons/src/main/res/drawable/ic_next_outline_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_next_vector.xml b/commons/src/main/res/drawable/ic_next_vector.xml new file mode 100644 index 000000000..f60dfbce8 --- /dev/null +++ b/commons/src/main/res/drawable/ic_next_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_orientation_auto_vector.xml b/commons/src/main/res/drawable/ic_orientation_auto_vector.xml new file mode 100644 index 000000000..c972c539c --- /dev/null +++ b/commons/src/main/res/drawable/ic_orientation_auto_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_orientation_landscape_vector.xml b/commons/src/main/res/drawable/ic_orientation_landscape_vector.xml new file mode 100644 index 000000000..a4a44e05e --- /dev/null +++ b/commons/src/main/res/drawable/ic_orientation_landscape_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_orientation_portrait_vector.xml b/commons/src/main/res/drawable/ic_orientation_portrait_vector.xml new file mode 100644 index 000000000..44e1fbfd2 --- /dev/null +++ b/commons/src/main/res/drawable/ic_orientation_portrait_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_pause_crossed_vector.xml b/commons/src/main/res/drawable/ic_pause_crossed_vector.xml new file mode 100644 index 000000000..56c8707d5 --- /dev/null +++ b/commons/src/main/res/drawable/ic_pause_crossed_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_pause_outline_vector.xml b/commons/src/main/res/drawable/ic_pause_outline_vector.xml new file mode 100644 index 000000000..1922c8a1a --- /dev/null +++ b/commons/src/main/res/drawable/ic_pause_outline_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_pause_vector.xml b/commons/src/main/res/drawable/ic_pause_vector.xml new file mode 100644 index 000000000..5ffd81e5c --- /dev/null +++ b/commons/src/main/res/drawable/ic_pause_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_people_outline_vector.xml b/commons/src/main/res/drawable/ic_people_outline_vector.xml new file mode 100644 index 000000000..03a4a0164 --- /dev/null +++ b/commons/src/main/res/drawable/ic_people_outline_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_people_vector.xml b/commons/src/main/res/drawable/ic_people_vector.xml new file mode 100644 index 000000000..6139f4ead --- /dev/null +++ b/commons/src/main/res/drawable/ic_people_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_person_outline_vector.xml b/commons/src/main/res/drawable/ic_person_outline_vector.xml new file mode 100644 index 000000000..3e0b748b0 --- /dev/null +++ b/commons/src/main/res/drawable/ic_person_outline_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_person_vector.xml b/commons/src/main/res/drawable/ic_person_vector.xml new file mode 100644 index 000000000..27e102f6c --- /dev/null +++ b/commons/src/main/res/drawable/ic_person_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_phone_one_vector.xml b/commons/src/main/res/drawable/ic_phone_one_vector.xml new file mode 100644 index 000000000..875d1089a --- /dev/null +++ b/commons/src/main/res/drawable/ic_phone_one_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_phone_two_vector.xml b/commons/src/main/res/drawable/ic_phone_two_vector.xml new file mode 100644 index 000000000..1de66fb49 --- /dev/null +++ b/commons/src/main/res/drawable/ic_phone_two_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_phone_vector.xml b/commons/src/main/res/drawable/ic_phone_vector.xml new file mode 100644 index 000000000..f360a6b74 --- /dev/null +++ b/commons/src/main/res/drawable/ic_phone_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_pin_filled_vector.xml b/commons/src/main/res/drawable/ic_pin_filled_vector.xml new file mode 100644 index 000000000..d941529bf --- /dev/null +++ b/commons/src/main/res/drawable/ic_pin_filled_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_pin_vector.xml b/commons/src/main/res/drawable/ic_pin_vector.xml new file mode 100644 index 000000000..1efaaafbb --- /dev/null +++ b/commons/src/main/res/drawable/ic_pin_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_place_vector.xml b/commons/src/main/res/drawable/ic_place_vector.xml new file mode 100644 index 000000000..bef264570 --- /dev/null +++ b/commons/src/main/res/drawable/ic_place_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_play_outline_vector.xml b/commons/src/main/res/drawable/ic_play_outline_vector.xml new file mode 100644 index 000000000..9ccd70b5a --- /dev/null +++ b/commons/src/main/res/drawable/ic_play_outline_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_play_vector.xml b/commons/src/main/res/drawable/ic_play_vector.xml new file mode 100644 index 000000000..dffe46c9c --- /dev/null +++ b/commons/src/main/res/drawable/ic_play_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_plus_vector.xml b/commons/src/main/res/drawable/ic_plus_vector.xml new file mode 100644 index 000000000..953b35aad --- /dev/null +++ b/commons/src/main/res/drawable/ic_plus_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_prev_outline_vector.xml b/commons/src/main/res/drawable/ic_prev_outline_vector.xml new file mode 100644 index 000000000..196c0f195 --- /dev/null +++ b/commons/src/main/res/drawable/ic_prev_outline_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_previous_vector.xml b/commons/src/main/res/drawable/ic_previous_vector.xml new file mode 100644 index 000000000..21e91c5fc --- /dev/null +++ b/commons/src/main/res/drawable/ic_previous_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_print_vector.xml b/commons/src/main/res/drawable/ic_print_vector.xml new file mode 100644 index 000000000..9d629c44c --- /dev/null +++ b/commons/src/main/res/drawable/ic_print_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_question_mark_vector.xml b/commons/src/main/res/drawable/ic_question_mark_vector.xml new file mode 100644 index 000000000..614957011 --- /dev/null +++ b/commons/src/main/res/drawable/ic_question_mark_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_reddit_vector.xml b/commons/src/main/res/drawable/ic_reddit_vector.xml new file mode 100644 index 000000000..6a0e2fb9d --- /dev/null +++ b/commons/src/main/res/drawable/ic_reddit_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_redo_vector.xml b/commons/src/main/res/drawable/ic_redo_vector.xml new file mode 100644 index 000000000..64766ce12 --- /dev/null +++ b/commons/src/main/res/drawable/ic_redo_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_rename_vector.xml b/commons/src/main/res/drawable/ic_rename_vector.xml new file mode 100644 index 000000000..03115856f --- /dev/null +++ b/commons/src/main/res/drawable/ic_rename_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_reset_vector.xml b/commons/src/main/res/drawable/ic_reset_vector.xml new file mode 100644 index 000000000..32e643a5f --- /dev/null +++ b/commons/src/main/res/drawable/ic_reset_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_save_vector.xml b/commons/src/main/res/drawable/ic_save_vector.xml new file mode 100644 index 000000000..538150741 --- /dev/null +++ b/commons/src/main/res/drawable/ic_save_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_sd_card_vector.xml b/commons/src/main/res/drawable/ic_sd_card_vector.xml new file mode 100644 index 000000000..2dd23735b --- /dev/null +++ b/commons/src/main/res/drawable/ic_sd_card_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_search_vector.xml b/commons/src/main/res/drawable/ic_search_vector.xml new file mode 100644 index 000000000..85b31d351 --- /dev/null +++ b/commons/src/main/res/drawable/ic_search_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_select_all_vector.xml b/commons/src/main/res/drawable/ic_select_all_vector.xml new file mode 100644 index 000000000..08be9f111 --- /dev/null +++ b/commons/src/main/res/drawable/ic_select_all_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_send_vector.xml b/commons/src/main/res/drawable/ic_send_vector.xml new file mode 100644 index 000000000..13286fb8b --- /dev/null +++ b/commons/src/main/res/drawable/ic_send_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_set_as_vector.xml b/commons/src/main/res/drawable/ic_set_as_vector.xml new file mode 100644 index 000000000..5f00129cc --- /dev/null +++ b/commons/src/main/res/drawable/ic_set_as_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_settings_cog_vector.xml b/commons/src/main/res/drawable/ic_settings_cog_vector.xml new file mode 100644 index 000000000..a9711b287 --- /dev/null +++ b/commons/src/main/res/drawable/ic_settings_cog_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_share_vector.xml b/commons/src/main/res/drawable/ic_share_vector.xml new file mode 100644 index 000000000..67d525ca6 --- /dev/null +++ b/commons/src/main/res/drawable/ic_share_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_sim_vector.xml b/commons/src/main/res/drawable/ic_sim_vector.xml new file mode 100644 index 000000000..b8cf21c91 --- /dev/null +++ b/commons/src/main/res/drawable/ic_sim_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_simple_phone_vector.xml b/commons/src/main/res/drawable/ic_simple_phone_vector.xml new file mode 100644 index 000000000..834e64997 --- /dev/null +++ b/commons/src/main/res/drawable/ic_simple_phone_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_sms_vector.xml b/commons/src/main/res/drawable/ic_sms_vector.xml new file mode 100644 index 000000000..bedf62996 --- /dev/null +++ b/commons/src/main/res/drawable/ic_sms_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_snooze_vector.xml b/commons/src/main/res/drawable/ic_snooze_vector.xml new file mode 100644 index 000000000..9b342d611 --- /dev/null +++ b/commons/src/main/res/drawable/ic_snooze_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_sort_vector.xml b/commons/src/main/res/drawable/ic_sort_vector.xml new file mode 100644 index 000000000..a310b58b1 --- /dev/null +++ b/commons/src/main/res/drawable/ic_sort_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_star_outline_vector.xml b/commons/src/main/res/drawable/ic_star_outline_vector.xml new file mode 100644 index 000000000..4f37a3b6b --- /dev/null +++ b/commons/src/main/res/drawable/ic_star_outline_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_star_vector.xml b/commons/src/main/res/drawable/ic_star_vector.xml new file mode 100644 index 000000000..2054fd06c --- /dev/null +++ b/commons/src/main/res/drawable/ic_star_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_stop_vector.xml b/commons/src/main/res/drawable/ic_stop_vector.xml new file mode 100644 index 000000000..2d77b9652 --- /dev/null +++ b/commons/src/main/res/drawable/ic_stop_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_telegram_vector.xml b/commons/src/main/res/drawable/ic_telegram_vector.xml new file mode 100644 index 000000000..c350dc8f6 --- /dev/null +++ b/commons/src/main/res/drawable/ic_telegram_vector.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/ic_three_dots_vector.xml b/commons/src/main/res/drawable/ic_three_dots_vector.xml new file mode 100644 index 000000000..3d01e3a08 --- /dev/null +++ b/commons/src/main/res/drawable/ic_three_dots_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_undo_vector.xml b/commons/src/main/res/drawable/ic_undo_vector.xml new file mode 100644 index 000000000..9eebb0763 --- /dev/null +++ b/commons/src/main/res/drawable/ic_undo_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_unhide_vector.xml b/commons/src/main/res/drawable/ic_unhide_vector.xml new file mode 100644 index 000000000..4ad95f897 --- /dev/null +++ b/commons/src/main/res/drawable/ic_unhide_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_usb_vector.xml b/commons/src/main/res/drawable/ic_usb_vector.xml new file mode 100644 index 000000000..529c5bf3f --- /dev/null +++ b/commons/src/main/res/drawable/ic_usb_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_vibrate_vector.xml b/commons/src/main/res/drawable/ic_vibrate_vector.xml new file mode 100644 index 000000000..045e4aa03 --- /dev/null +++ b/commons/src/main/res/drawable/ic_vibrate_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/ic_view_contact_details_vector.xml b/commons/src/main/res/drawable/ic_view_contact_details_vector.xml new file mode 100644 index 000000000..637253311 --- /dev/null +++ b/commons/src/main/res/drawable/ic_view_contact_details_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/commons/src/main/res/drawable/pill_background.xml b/commons/src/main/res/drawable/pill_background.xml new file mode 100644 index 000000000..57cd572e1 --- /dev/null +++ b/commons/src/main/res/drawable/pill_background.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/popup_menu_bg_you.xml b/commons/src/main/res/drawable/popup_menu_bg_you.xml new file mode 100644 index 000000000..deb0bfe2d --- /dev/null +++ b/commons/src/main/res/drawable/popup_menu_bg_you.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ripple_all_corners.xml b/commons/src/main/res/drawable/ripple_all_corners.xml new file mode 100644 index 000000000..182ff2ee7 --- /dev/null +++ b/commons/src/main/res/drawable/ripple_all_corners.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ripple_background.xml b/commons/src/main/res/drawable/ripple_background.xml new file mode 100644 index 000000000..a8e82a68c --- /dev/null +++ b/commons/src/main/res/drawable/ripple_background.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/drawable/ripple_bottom_corners.xml b/commons/src/main/res/drawable/ripple_bottom_corners.xml new file mode 100644 index 000000000..20674c57d --- /dev/null +++ b/commons/src/main/res/drawable/ripple_bottom_corners.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/ripple_top_corners.xml b/commons/src/main/res/drawable/ripple_top_corners.xml new file mode 100644 index 000000000..4f62b6731 --- /dev/null +++ b/commons/src/main/res/drawable/ripple_top_corners.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/search_menu_background.xml b/commons/src/main/res/drawable/search_menu_background.xml new file mode 100644 index 000000000..f803f7089 --- /dev/null +++ b/commons/src/main/res/drawable/search_menu_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/section_holder_stroke.xml b/commons/src/main/res/drawable/section_holder_stroke.xml new file mode 100644 index 000000000..f055a18d9 --- /dev/null +++ b/commons/src/main/res/drawable/section_holder_stroke.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/commons/src/main/res/drawable/selector.xml b/commons/src/main/res/drawable/selector.xml new file mode 100644 index 000000000..b72235606 --- /dev/null +++ b/commons/src/main/res/drawable/selector.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/drawable/shortcut_plus.xml b/commons/src/main/res/drawable/shortcut_plus.xml new file mode 100644 index 000000000..3330bbb71 --- /dev/null +++ b/commons/src/main/res/drawable/shortcut_plus.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/top_popup_menu_bg_dark.xml b/commons/src/main/res/drawable/top_popup_menu_bg_dark.xml new file mode 100644 index 000000000..1ef0cb390 --- /dev/null +++ b/commons/src/main/res/drawable/top_popup_menu_bg_dark.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/top_popup_menu_bg_light.xml b/commons/src/main/res/drawable/top_popup_menu_bg_light.xml new file mode 100644 index 000000000..8ade38717 --- /dev/null +++ b/commons/src/main/res/drawable/top_popup_menu_bg_light.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/transparent_button.xml b/commons/src/main/res/drawable/transparent_button.xml new file mode 100644 index 000000000..e39713046 --- /dev/null +++ b/commons/src/main/res/drawable/transparent_button.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/transparent_button_pressed.xml b/commons/src/main/res/drawable/transparent_button_pressed.xml new file mode 100644 index 000000000..afdcde1b5 --- /dev/null +++ b/commons/src/main/res/drawable/transparent_button_pressed.xml @@ -0,0 +1,4 @@ + + + + diff --git a/commons/src/main/res/drawable/widget_config_seekbar_background.xml b/commons/src/main/res/drawable/widget_config_seekbar_background.xml new file mode 100644 index 000000000..dbbddade6 --- /dev/null +++ b/commons/src/main/res/drawable/widget_config_seekbar_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/commons/src/main/res/drawable/widget_round_background.xml b/commons/src/main/res/drawable/widget_round_background.xml new file mode 100644 index 000000000..7dca8d736 --- /dev/null +++ b/commons/src/main/res/drawable/widget_round_background.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/commons/src/main/res/layout/actionbar_title.xml b/commons/src/main/res/layout/actionbar_title.xml new file mode 100644 index 000000000..42bff3b40 --- /dev/null +++ b/commons/src/main/res/layout/actionbar_title.xml @@ -0,0 +1,10 @@ + + diff --git a/commons/src/main/res/layout/activity_about.xml b/commons/src/main/res/layout/activity_about.xml new file mode 100644 index 000000000..6a927f9f1 --- /dev/null +++ b/commons/src/main/res/layout/activity_about.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/activity_contributors.xml b/commons/src/main/res/layout/activity_contributors.xml new file mode 100644 index 000000000..a5fee0558 --- /dev/null +++ b/commons/src/main/res/layout/activity_contributors.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/activity_customization.xml b/commons/src/main/res/layout/activity_customization.xml new file mode 100644 index 000000000..4c1be9d9e --- /dev/null +++ b/commons/src/main/res/layout/activity_customization.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/activity_faq.xml b/commons/src/main/res/layout/activity_faq.xml new file mode 100644 index 000000000..65fff8739 --- /dev/null +++ b/commons/src/main/res/layout/activity_faq.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/commons/src/main/res/layout/activity_license.xml b/commons/src/main/res/layout/activity_license.xml new file mode 100644 index 000000000..a6ed4b378 --- /dev/null +++ b/commons/src/main/res/layout/activity_license.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/commons/src/main/res/layout/activity_manage_blocked_numbers.xml b/commons/src/main/res/layout/activity_manage_blocked_numbers.xml new file mode 100644 index 000000000..35265081a --- /dev/null +++ b/commons/src/main/res/layout/activity_manage_blocked_numbers.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/bottom_tablayout_item.xml b/commons/src/main/res/layout/bottom_tablayout_item.xml new file mode 100644 index 000000000..4c2344233 --- /dev/null +++ b/commons/src/main/res/layout/bottom_tablayout_item.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_add_blocked_number.xml b/commons/src/main/res/layout/dialog_add_blocked_number.xml new file mode 100644 index 000000000..34fe2ca91 --- /dev/null +++ b/commons/src/main/res/layout/dialog_add_blocked_number.xml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_bottom_sheet.xml b/commons/src/main/res/layout/dialog_bottom_sheet.xml new file mode 100644 index 000000000..6c4b7bfaf --- /dev/null +++ b/commons/src/main/res/layout/dialog_bottom_sheet.xml @@ -0,0 +1,37 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_call_confirmation.xml b/commons/src/main/res/layout/dialog_call_confirmation.xml new file mode 100644 index 000000000..f00568662 --- /dev/null +++ b/commons/src/main/res/layout/dialog_call_confirmation.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/commons/src/main/res/layout/dialog_change_date_time_format.xml b/commons/src/main/res/layout/dialog_change_date_time_format.xml new file mode 100644 index 000000000..6d70b5b17 --- /dev/null +++ b/commons/src/main/res/layout/dialog_change_date_time_format.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_color_picker.xml b/commons/src/main/res/layout/dialog_color_picker.xml new file mode 100644 index 000000000..1b5c7043e --- /dev/null +++ b/commons/src/main/res/layout/dialog_color_picker.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_create_new_folder.xml b/commons/src/main/res/layout/dialog_create_new_folder.xml new file mode 100644 index 000000000..d8920387a --- /dev/null +++ b/commons/src/main/res/layout/dialog_create_new_folder.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_custom_interval_picker.xml b/commons/src/main/res/layout/dialog_custom_interval_picker.xml new file mode 100644 index 000000000..dbec38e6d --- /dev/null +++ b/commons/src/main/res/layout/dialog_custom_interval_picker.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_donate.xml b/commons/src/main/res/layout/dialog_donate.xml new file mode 100644 index 000000000..d764101a7 --- /dev/null +++ b/commons/src/main/res/layout/dialog_donate.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_export_blocked_numbers.xml b/commons/src/main/res/layout/dialog_export_blocked_numbers.xml new file mode 100644 index 000000000..ad2f8f650 --- /dev/null +++ b/commons/src/main/res/layout/dialog_export_blocked_numbers.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_export_settings.xml b/commons/src/main/res/layout/dialog_export_settings.xml new file mode 100644 index 000000000..a25e3a651 --- /dev/null +++ b/commons/src/main/res/layout/dialog_export_settings.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_feature_locked.xml b/commons/src/main/res/layout/dialog_feature_locked.xml new file mode 100644 index 000000000..bebc08a8f --- /dev/null +++ b/commons/src/main/res/layout/dialog_feature_locked.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_file_conflict.xml b/commons/src/main/res/layout/dialog_file_conflict.xml new file mode 100644 index 000000000..e25f9387b --- /dev/null +++ b/commons/src/main/res/layout/dialog_file_conflict.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_filepicker.xml b/commons/src/main/res/layout/dialog_filepicker.xml new file mode 100644 index 000000000..bb226e0f0 --- /dev/null +++ b/commons/src/main/res/layout/dialog_filepicker.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_line_color_picker.xml b/commons/src/main/res/layout/dialog_line_color_picker.xml new file mode 100644 index 000000000..6e179054e --- /dev/null +++ b/commons/src/main/res/layout/dialog_line_color_picker.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_message.xml b/commons/src/main/res/layout/dialog_message.xml new file mode 100644 index 000000000..086b2fe82 --- /dev/null +++ b/commons/src/main/res/layout/dialog_message.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/commons/src/main/res/layout/dialog_new_apps_icons.xml b/commons/src/main/res/layout/dialog_new_apps_icons.xml new file mode 100644 index 000000000..699eb9e44 --- /dev/null +++ b/commons/src/main/res/layout/dialog_new_apps_icons.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_properties.xml b/commons/src/main/res/layout/dialog_properties.xml new file mode 100644 index 000000000..04675379e --- /dev/null +++ b/commons/src/main/res/layout/dialog_properties.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/commons/src/main/res/layout/dialog_purchase_thank_you.xml b/commons/src/main/res/layout/dialog_purchase_thank_you.xml new file mode 100644 index 000000000..6318edbda --- /dev/null +++ b/commons/src/main/res/layout/dialog_purchase_thank_you.xml @@ -0,0 +1,13 @@ + + diff --git a/commons/src/main/res/layout/dialog_radio_group.xml b/commons/src/main/res/layout/dialog_radio_group.xml new file mode 100644 index 000000000..d081a64e5 --- /dev/null +++ b/commons/src/main/res/layout/dialog_radio_group.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/commons/src/main/res/layout/dialog_rate_stars.xml b/commons/src/main/res/layout/dialog_rate_stars.xml new file mode 100644 index 000000000..9c0d2b1bc --- /dev/null +++ b/commons/src/main/res/layout/dialog_rate_stars.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_rename.xml b/commons/src/main/res/layout/dialog_rename.xml new file mode 100644 index 000000000..07d5dc49c --- /dev/null +++ b/commons/src/main/res/layout/dialog_rename.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_rename_item.xml b/commons/src/main/res/layout/dialog_rename_item.xml new file mode 100644 index 000000000..275e531ca --- /dev/null +++ b/commons/src/main/res/layout/dialog_rename_item.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_rename_items.xml b/commons/src/main/res/layout/dialog_rename_items.xml new file mode 100644 index 000000000..805bda577 --- /dev/null +++ b/commons/src/main/res/layout/dialog_rename_items.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_rename_items_pattern.xml b/commons/src/main/res/layout/dialog_rename_items_pattern.xml new file mode 100644 index 000000000..6b9ddfc08 --- /dev/null +++ b/commons/src/main/res/layout/dialog_rename_items_pattern.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_security.xml b/commons/src/main/res/layout/dialog_security.xml new file mode 100644 index 000000000..be77e5dfc --- /dev/null +++ b/commons/src/main/res/layout/dialog_security.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_select_alarm_sound.xml b/commons/src/main/res/layout/dialog_select_alarm_sound.xml new file mode 100644 index 000000000..90baa7c43 --- /dev/null +++ b/commons/src/main/res/layout/dialog_select_alarm_sound.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_textview.xml b/commons/src/main/res/layout/dialog_textview.xml new file mode 100644 index 000000000..174347f46 --- /dev/null +++ b/commons/src/main/res/layout/dialog_textview.xml @@ -0,0 +1,11 @@ + + diff --git a/commons/src/main/res/layout/dialog_title.xml b/commons/src/main/res/layout/dialog_title.xml new file mode 100644 index 000000000..c748b99ab --- /dev/null +++ b/commons/src/main/res/layout/dialog_title.xml @@ -0,0 +1,11 @@ + + diff --git a/commons/src/main/res/layout/dialog_upgrade_to_pro.xml b/commons/src/main/res/layout/dialog_upgrade_to_pro.xml new file mode 100644 index 000000000..415e8b19b --- /dev/null +++ b/commons/src/main/res/layout/dialog_upgrade_to_pro.xml @@ -0,0 +1,13 @@ + + diff --git a/commons/src/main/res/layout/dialog_whats_new.xml b/commons/src/main/res/layout/dialog_whats_new.xml new file mode 100644 index 000000000..964aeb56d --- /dev/null +++ b/commons/src/main/res/layout/dialog_whats_new.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_write_permission.xml b/commons/src/main/res/layout/dialog_write_permission.xml new file mode 100644 index 000000000..0a5e1d2e9 --- /dev/null +++ b/commons/src/main/res/layout/dialog_write_permission.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/dialog_write_permission_otg.xml b/commons/src/main/res/layout/dialog_write_permission_otg.xml new file mode 100644 index 000000000..0cc6d8861 --- /dev/null +++ b/commons/src/main/res/layout/dialog_write_permission_otg.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/divider.xml b/commons/src/main/res/layout/divider.xml new file mode 100644 index 000000000..03b6525af --- /dev/null +++ b/commons/src/main/res/layout/divider.xml @@ -0,0 +1,5 @@ + + diff --git a/commons/src/main/res/layout/empty_image_view.xml b/commons/src/main/res/layout/empty_image_view.xml new file mode 100644 index 000000000..baf0890fd --- /dev/null +++ b/commons/src/main/res/layout/empty_image_view.xml @@ -0,0 +1,9 @@ + + diff --git a/commons/src/main/res/layout/filepicker_favorite.xml b/commons/src/main/res/layout/filepicker_favorite.xml new file mode 100644 index 000000000..16e247f61 --- /dev/null +++ b/commons/src/main/res/layout/filepicker_favorite.xml @@ -0,0 +1,13 @@ + + diff --git a/commons/src/main/res/layout/item_about.xml b/commons/src/main/res/layout/item_about.xml new file mode 100644 index 000000000..9d201a994 --- /dev/null +++ b/commons/src/main/res/layout/item_about.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/item_action_mode.xml b/commons/src/main/res/layout/item_action_mode.xml new file mode 100644 index 000000000..c8ac1a83f --- /dev/null +++ b/commons/src/main/res/layout/item_action_mode.xml @@ -0,0 +1,13 @@ + + diff --git a/commons/src/main/res/layout/item_action_mode_popup.xml b/commons/src/main/res/layout/item_action_mode_popup.xml new file mode 100644 index 000000000..3f4e9a29f --- /dev/null +++ b/commons/src/main/res/layout/item_action_mode_popup.xml @@ -0,0 +1,15 @@ + + diff --git a/commons/src/main/res/layout/item_breadcrumb.xml b/commons/src/main/res/layout/item_breadcrumb.xml new file mode 100644 index 000000000..4be0c8701 --- /dev/null +++ b/commons/src/main/res/layout/item_breadcrumb.xml @@ -0,0 +1,10 @@ + + diff --git a/commons/src/main/res/layout/item_breadcrumb_first.xml b/commons/src/main/res/layout/item_breadcrumb_first.xml new file mode 100644 index 000000000..73dba2833 --- /dev/null +++ b/commons/src/main/res/layout/item_breadcrumb_first.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/commons/src/main/res/layout/item_contact_with_number.xml b/commons/src/main/res/layout/item_contact_with_number.xml new file mode 100644 index 000000000..079f6ed03 --- /dev/null +++ b/commons/src/main/res/layout/item_contact_with_number.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_contact_without_number.xml b/commons/src/main/res/layout/item_contact_without_number.xml new file mode 100644 index 000000000..141573908 --- /dev/null +++ b/commons/src/main/res/layout/item_contact_without_number.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_faq.xml b/commons/src/main/res/layout/item_faq.xml new file mode 100644 index 000000000..dcc87eed1 --- /dev/null +++ b/commons/src/main/res/layout/item_faq.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_filepicker_list.xml b/commons/src/main/res/layout/item_filepicker_list.xml new file mode 100644 index 000000000..295a70fe0 --- /dev/null +++ b/commons/src/main/res/layout/item_filepicker_list.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_language_contributor.xml b/commons/src/main/res/layout/item_language_contributor.xml new file mode 100644 index 000000000..a43cc226a --- /dev/null +++ b/commons/src/main/res/layout/item_language_contributor.xml @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_license.xml b/commons/src/main/res/layout/item_license.xml new file mode 100644 index 000000000..31b31a298 --- /dev/null +++ b/commons/src/main/res/layout/item_license.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_manage_blocked_number.xml b/commons/src/main/res/layout/item_manage_blocked_number.xml new file mode 100644 index 000000000..3c12bd8c7 --- /dev/null +++ b/commons/src/main/res/layout/item_manage_blocked_number.xml @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/commons/src/main/res/layout/item_property.xml b/commons/src/main/res/layout/item_property.xml new file mode 100644 index 000000000..4d76038b1 --- /dev/null +++ b/commons/src/main/res/layout/item_property.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/item_select_alarm_sound.xml b/commons/src/main/res/layout/item_select_alarm_sound.xml new file mode 100644 index 000000000..fc82cba2e --- /dev/null +++ b/commons/src/main/res/layout/item_select_alarm_sound.xml @@ -0,0 +1,8 @@ + + diff --git a/commons/src/main/res/layout/item_simple_list.xml b/commons/src/main/res/layout/item_simple_list.xml new file mode 100644 index 000000000..39fadb38a --- /dev/null +++ b/commons/src/main/res/layout/item_simple_list.xml @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/commons/src/main/res/layout/menu_search.xml b/commons/src/main/res/layout/menu_search.xml new file mode 100644 index 000000000..aa2908d43 --- /dev/null +++ b/commons/src/main/res/layout/menu_search.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/radio_button.xml b/commons/src/main/res/layout/radio_button.xml new file mode 100644 index 000000000..238d52319 --- /dev/null +++ b/commons/src/main/res/layout/radio_button.xml @@ -0,0 +1,5 @@ + + diff --git a/commons/src/main/res/layout/search_bar.xml b/commons/src/main/res/layout/search_bar.xml new file mode 100644 index 000000000..a959c72fe --- /dev/null +++ b/commons/src/main/res/layout/search_bar.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/tab_biometric_id.xml b/commons/src/main/res/layout/tab_biometric_id.xml new file mode 100644 index 000000000..6ec34d4d0 --- /dev/null +++ b/commons/src/main/res/layout/tab_biometric_id.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/commons/src/main/res/layout/tab_fingerprint.xml b/commons/src/main/res/layout/tab_fingerprint.xml new file mode 100644 index 000000000..31b20b891 --- /dev/null +++ b/commons/src/main/res/layout/tab_fingerprint.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/tab_pattern.xml b/commons/src/main/res/layout/tab_pattern.xml new file mode 100644 index 000000000..b1ab9ba52 --- /dev/null +++ b/commons/src/main/res/layout/tab_pattern.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/commons/src/main/res/layout/tab_pin.xml b/commons/src/main/res/layout/tab_pin.xml new file mode 100644 index 000000000..37adb75a3 --- /dev/null +++ b/commons/src/main/res/layout/tab_pin.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/tab_rename_pattern.xml b/commons/src/main/res/layout/tab_rename_pattern.xml new file mode 100644 index 000000000..bb0d4f63b --- /dev/null +++ b/commons/src/main/res/layout/tab_rename_pattern.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/commons/src/main/res/layout/tab_rename_simple.xml b/commons/src/main/res/layout/tab_rename_simple.xml new file mode 100644 index 000000000..6a7a5b704 --- /dev/null +++ b/commons/src/main/res/layout/tab_rename_simple.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/menu/cab_blocked_numbers.xml b/commons/src/main/res/menu/cab_blocked_numbers.xml new file mode 100644 index 000000000..a7a36d0e6 --- /dev/null +++ b/commons/src/main/res/menu/cab_blocked_numbers.xml @@ -0,0 +1,14 @@ + +

+ + + diff --git a/commons/src/main/res/menu/cab_delete_only.xml b/commons/src/main/res/menu/cab_delete_only.xml new file mode 100644 index 000000000..abf9dbfae --- /dev/null +++ b/commons/src/main/res/menu/cab_delete_only.xml @@ -0,0 +1,9 @@ + + + + diff --git a/commons/src/main/res/menu/cab_remove_only.xml b/commons/src/main/res/menu/cab_remove_only.xml new file mode 100644 index 000000000..982e13131 --- /dev/null +++ b/commons/src/main/res/menu/cab_remove_only.xml @@ -0,0 +1,9 @@ + + + + diff --git a/commons/src/main/res/menu/menu_add_blocked_number.xml b/commons/src/main/res/menu/menu_add_blocked_number.xml new file mode 100644 index 000000000..477787bac --- /dev/null +++ b/commons/src/main/res/menu/menu_add_blocked_number.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/commons/src/main/res/menu/menu_customization.xml b/commons/src/main/res/menu/menu_customization.xml new file mode 100644 index 000000000..094f0f745 --- /dev/null +++ b/commons/src/main/res/menu/menu_customization.xml @@ -0,0 +1,9 @@ + + + + diff --git a/commons/src/main/res/mipmap-hdpi/ic_app_launcher.png b/commons/src/main/res/mipmap-hdpi/ic_app_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ce6aea66f09f249b789f47325bef05821e3e62 GIT binary patch literal 4115 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 R3yJ^$002ovPDHLkV1jzj=iLAR literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-hdpi/ic_calculator.png b/commons/src/main/res/mipmap-hdpi/ic_calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..4c951ca466141d93c4ab8ccf4d3f7a6515e4ae18 GIT binary patch literal 2327 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-hdpi/ic_camera.png b/commons/src/main/res/mipmap-hdpi/ic_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..63732e1c93fa1ce6030acbe0dc07b11a1f7f8689 GIT binary patch literal 3932 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 WlGU1p|HXg+0000fC3Q=CW;X>1cRhd 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-hdpi/ic_flashlight.png b/commons/src/main/res/mipmap-hdpi/ic_flashlight.png new file mode 100644 index 0000000000000000000000000000000000000000..690396aa56941be465092cef6db898d2aee1ed68 GIT binary patch literal 3006 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 FV1k>q;D7)C literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-hdpi/ic_sms_messenger.png b/commons/src/main/res/mipmap-hdpi/ic_sms_messenger.png new file mode 100644 index 0000000000000000000000000000000000000000..1faa36d0bf4a41c6ab0a595786a6d24af3e89e20 GIT binary patch literal 2384 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 QH~;_u07*qoM6N<$f|nAjasU7T literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_app_launcher.png b/commons/src/main/res/mipmap-xhdpi/ic_app_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6548663ee5a0d0753b51a1afac4e9a582c6ca428 GIT binary patch literal 5309 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 XkH>U)Zq4==00000NkvXXu0mjf$iho7 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_calendar.png b/commons/src/main/res/mipmap-xhdpi/ic_calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..7b92a5cfd1a360534ef899dfd4870d343384bbf8 GIT binary patch literal 4115 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 RfW!a*002ovPDHLkV1g2g$_xMi literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_camera.png b/commons/src/main/res/mipmap-xhdpi/ic_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..d26657fc1f9daee43a21faa1e94b919d06aad2a7 GIT binary patch literal 5011 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_clock.png b/commons/src/main/res/mipmap-xhdpi/ic_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..6e55f1d90e7b559ad5f59aec9d7bb269aa67db58 GIT binary patch literal 4808 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 i9KsI*3+K94N;3+4{nqet+1XPY|2221= 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 JPDHLkV1kr8`ELLK literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_file_manager.png b/commons/src/main/res/mipmap-xhdpi/ic_file_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..0af01b3ff9cb2a8b9fdbeaa0e4f5d8e31708dd1a GIT binary patch literal 2968 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 UA*w=0h5!Hn07*qoM6N<$g4PN@L;wH) literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_gallery.png b/commons/src/main/res/mipmap-xhdpi/ic_gallery.png new file mode 100644 index 0000000000000000000000000000000000000000..f645b6dae9956cdbfd0c5c64c57d3b85a0880031 GIT binary patch literal 3211 zcmV;640Q8}P)O@3xya{A^}7N z6-tyu!AG>r2U8g1qgZqTtO^p)7#}gI6p~bFG?;`cc_g9AU=a07G!;>{j7l_-2&EwG z&hAc6pM03Xz)sIh_e}T9?y|osimL6~_uM`Iz3+2xLmz$g(MKOgD^l+QltWV(>?giI zPD8?CsH2>$a4gVhLVtiP90c|V?6ZV-(+;}_cF@j1IwXZ#-`}7#-A({ak?e37;ld0T z&NN`ODkmZ|2Fr*&BE089ivfQ#U_;#ELrKvVQPC@+TL^G4#ZV)|B!%e+6M=CNnR*Ll zyTB$l#soeH4P@)>eW=$TmS`0H!)jb zF)#+OYh8vebOP@PEKMw9oq*QTcufUpTf|(2dlAOg(ynim9Rf>|&HScTCTk)<+hQiD zvJ99~3wt5(XAzo`OL;A7Ly-!gcXM3Y;vR+XQ~#zWD4hb2Bpe=)2l*^2BasP^Uc?0| zJf(0-R5ogXz)n$aPBgPMiu{eRGgL(mHgT5<8+*F*0TfPAVdKFj?oti^4>r^cbs>qi zemntO7k1v=00q`2Te($MlMXA>(43?x2B#g?D@+V4&+dr8_JqYuNwGJi{HiCth>5l>nco7;I$NCP$g`51~qn z8)MRdDw?B;M?t!fgz2#UXmvh-2%}Ah^}3KmrFoc@yp&2|jJNnXaA~E6dl4ftHpA`7 ztbggH;Oj^g)qp!P+(~Yz*+-7+@;(Vn;65Nf!`-Nmti)h%MW9WTi-XRX0|}5{+u44! z3^#)!uruK>G056cpe877aSt55ovsf?=Y8ZG-!&k=q`Z}$x2l=rQ1=-90!gO`7x-Pu zw*2OrU(fGZ&d&n<24M^ti}Y(mvmNNCyU;yv=N?8QhMo7-xBMjbRfM)h%vIsps)|)> z%p|c3n=sE>fFuVaW(-u(Oe^l5opf$ki0*nhvKk@E)qZx?%9>Y@wnhA-+ioLz(Qq6M z^EY7(A73-e_AGT+iL@sosN1$1-#@`a?9joya7LRU3ZN;5<|Ed64t75$(aS|3!qB`gJtvsy`rvz^U;x$ z*04n=KG(=Y}!qE3eFp0{xi>_&XA1OFe(0K1}H zbP#wgv6P7-N3IPO2=L)T636%B17JvHrn(oZ(4H;X8U>;X5kC2}m9LKI64qGI1PzbV zKreAVfCx00;VouW(HsrQ`}PP51n9K7$>hth!3t;JUj!Pg-2Y)vsR&-aEf7HAq{@mF zA`13pj}e=*7OeiEWGMo16O1~F;N{zbuE5-1Nc{TExtdVI!PbTMVvM`0?jm^k zwm^W7I%o$z38x4paKSutKIWLqs>;S1elGF(o6zKtLI=BGedBIoQ+`Bz&eIsDUyGKx zl;)5KVb7QaKFRy`2nrYDR?#l-emLffBgcLPd)oboQQ`XTVOS%^6Tfyn+V8NX78k7Z zZo{6k3;`t8K>YG2G0(oyS52_PuLEnW8lpxCB7yb+RJPt4P=#u|5J z==oYFoJGTpTQJU;k3H*Wxrpd4h-nj_^#tbl@A>N!tZ+ndU2mUy3gEzo5NvvL%n0m@ zS4Eb+Ib1{54JzFEVMiv(hh7i7H|0~bp=__%oEI)w=iZ8WlCOg!H9-s$ zd+PmI7u-X+n`jO#WmnQMtFryeMXt*%D!ss_;HHWrgGUpavLw8rMM#KYVozCub>V&f z=LrFAm`NX≦UVUD${i#3$c}Idw(Z(NP6!N4wp2UMcpl zcnwJ9?$z{drWgv=IX7UA?*5^s@e6*4HGL&oCT1nbWKETgjSus2vFD{vZy2nR+`XC= zBZE#RHf3owS=1DJ((PE&SAvuda~B_df1&AUC4zuvvMjsmc}nh+MRQD5L57T@;nvrYSkJ!Gqw~#Y$h>ep;&zlw=MjOoWAO42 zj;RW$z!JX&2Ea_@mI8XX^8xJBuOT+)S7oCzJZgfkmc#d8s;icZE3;!w9<9WS`e}yy-w`FuCl{VRp@ZoGHAI!Uqy3S zheFncj<65B)e!|ufq3~jK%mPye21kZm-3pxBfdIh0n^MCHn$kx^Z$wDb~f9c;!$<^ z=K7H!mwpF|3raXV0JQi`ZyLF=a&JN@DMCx$N4^OpfIP@&qTDR_{|-xU6``Yx2$H+9 z?B<|1tp|>bOEk09RhAN9ZqOS=$Z~`T>MBbsxnaGc(8QH7Rsd^*ywlr65b}LOZtTA{ z?~{u1sfhed>01bRS$D4+9VxFiW|&;*jp`K#=gMl*S&Nyf{ySypbv2s?8{r^8txwb|oy% z7lQ30_e2p?d39eK=ZE2Z2=Rc1q}ZEi~hdsn!qR2e5Gh&Hmwk8}V z3Ot0*edTV}9CZRK+dG*UmGdFO8gMv4KV?|=nxJgSLetO{yc)Hsnnp#Dv*_p|*Z0Jg!uP6YaI{Wp(?+2YD6k)e28xhttCiv@7 z^Fe1X%6-y2L=kqNyy9fpY-QP2Dq^ixbPE9vM^hv_97eb>!-X>q7_G{QS*6jp2ns6f z5#@bgrz^aXb=bf${Hs`$a=qww0(3=F80;s$KTbn7!?1Q?lqC$rV6c(Dd%=Z+xa?J7 xpJsX2aoG)|hp(nXLY_GF(MKPB^wCFH{0~Q#I$}k|2mt^9002ovPDHLkV1mB2?x_F( literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_keyboard.png b/commons/src/main/res/mipmap-xhdpi/ic_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..aa81b4d045f05f9fc8a9633e8f8e0a191256080e GIT binary patch literal 2880 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 eQl(0jvf%$H3kX%@QSNd80000Q2w{$Y|+G)9a7 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 FV1n6pj5GiM literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_simple_launcher.png b/commons/src/main/res/mipmap-xhdpi/ic_simple_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..19d68b8e0eae048e6acb51be6716799a4dd1eae6 GIT binary patch literal 3407 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_sms_messenger.png b/commons/src/main/res/mipmap-xhdpi/ic_sms_messenger.png new file mode 100644 index 0000000000000000000000000000000000000000..fddd88b8990ca0d3ec4a747886b204001403fc97 GIT binary patch literal 2967 zcmV;I3uyF-P)gsU&u>>Rt#XH^9+_w3;#IDEKz;d7v?3k^R6n zffpQ`H6!n1XTM~;dX+>Em*`*OXyM{QHzV* z0I53}Yu0g(C~gp_k6K@l=@0=WWH$BLQ5zC5>-gf536w3w1M=2*ldK_Uvb0@2# z5)g?2b|tAl$6}dM+#+B^A!E2uphbB6K%6@!L@<{qx&hL6alXV^DKM?rWtS2Ko0Y}< zhWpuD+oAJYT^sXGj$ESPtJA`ExcGvCQI-TFh((e*n%bR+(kW5rONPma?`O zg%!mBeeHY`#Y!qNaiVrCn#x>AOi#X>-Js zedrH%Ap152s;nLS{Du3k~=%YQPpO}v7 z4KT_S)-}eN?Pq7rS4W!Fv;|VWK6jFICpzuJlI1jwYAnboxUD&J2cJ+O!C z9|7}{s{>^zXX-Bg201aY1MC$0)mdHxq!!U8FvY*<0aVkNpjpZm6>or8Jvj#)pGFXv zl3J9%734L5p|~|%^g^X{xWUN!HG)DZgWK{Y8`1zr7t*Q}Gkn+XG{LVC47lp(LR#~r z@g^Q)j;1t0Q{_(9A#b0c;f#2UIYXuKoQO%1SlZ^AaMc?ctNTqd|9l4QG-ctc%mj(c zuBWc`szBLtgCnEZ(2o2XNwVB47S+=LS(^z0mj`I zCnzpTTZ{(YKQ+B;AD|Tz3w<-CEJima;?zDtAf^=)-O{>u!b0V*qLr9W%o99x>iU!` zhMv6@O6DKWkbdi7u*+mLWW-2J{yvS>ZL3X->qZ-eS ztYZy|47{QL3B3A%Lquc%5l!Ep?;yMNS&%4?YfzXipQHJPRTvGWkDeDe>~`IKF;3`> z%8%=V-DI{r1-WC<2sjDr-Pg#y^CIv4d6W8t! zwW|Rd;v7WijVfV3-9CW+kY5ACTqh_Nee zvsK{o(4r$lJSK9%o>DpC*N^-7!GE=l?)`xD-ybEj=~2*D_?ima&TIDWPdyEwlGy!= zSw$EF$cev#XLWMe`?lhIxC5v6eWd>|SZTz`f|EnEgJ?YvQzQaL!D7NWax=yv!*V_-Jv3+L+C%({U-hE zeulkkBjPv%@AM6&fGB5+#VI?LgEd1X7;-;gwTT6jdkw}QVV}dX0c&!Go zcE3ex&5yC)--@czO;N4s@RQEh&rcYvM_3oA1};-~o#`d@(oZ@17>)vJ6oue`C_ z-$d4z3RDuU3_27(&&^bzKYHiHf5oxLY!`YW$Tz)&w;k{(HzkqY#-_`rXpM(}xobv!bEc#&`5b(Gf0mp%? z4l1Q`QHq{ahG`f6iVyte3G_@hJ;;X$3lu(%cUNG>AW`6329<&W?bs{`qI?JunAO;mCPqnoKB^+@y^TH}03JlI|?4(QJI^XjH zs>%o%%i+6YA1dr5^@2y{O-orT!hB9IBV-)m+H;rj*Fp;_%G78?Coc-j<#cdI!V%l% znz0Y?r(zUW@((yvRL3m5=V;~?>UK`1EIwgU5k?TYtUl(Cd$hQL%SB(EX}F)g`(s>* z@M~W)X3E%;41Nm zI~si}0|Y4fH4|`Bur%g|x@^2O~$P00;#oKrq& z-i9#w_$SQ^GJ@a;bPK$#H0yJk4d*q}UHhbY9tO{?8*L~i+QKBQX-(UV2hLZDX5g&j zum2Ce1btY+QGq=O`w(^_Y|rJ`VIAXt6P_;qhd680s8ORvjT#lq{{hE^I7Whby)OU& N002ovPDHLkV1laXi=F@g literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_thank_you.png b/commons/src/main/res/mipmap-xhdpi/ic_thank_you.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f223ff7ae6b75deea8718cc29826a38e9da8c9 GIT binary patch literal 3590 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 M07*qoM6N<$f_F32j{pDw literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xhdpi/ic_voice_recorder.png b/commons/src/main/res/mipmap-xhdpi/ic_voice_recorder.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b4d0d1023b15bd105f0f07aea5285c7f2bff8f GIT binary patch literal 4463 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 BXlwug literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_app_launcher.png b/commons/src/main/res/mipmap-xxhdpi/ic_app_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a06b3b5df4f42c4cd11ee92a9697b814deb38ed9 GIT binary patch literal 10527 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_calculator.png b/commons/src/main/res/mipmap-xxhdpi/ic_calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..280670e47d07cd5af762a8677391a1b50892864f GIT binary patch literal 5843 zcmV;^7A)zBP)MoTLuYN$zNg2_}SVMa4aaHf=~Af`Iv zxW$-VqZ5*uskkI#%BYE3sfm_*R5WU26OpwWXnLXhZTH^q%pb2?f$+ND>v#M0yN`P; zsZ!|2yZ8HjXZy}MA4C#KB#}fCNhFa(5=kVHL{d4CL-C=t6$`L7ZNix`1E()XgJaPs z;J8BEf~4mWkAVf?f^i&j1~M@vr{H;po`yJmo4}i~9iOTA(u#=ysx??ZXeB|0x|}fC zwV7@!Q&ea{X%V5$D3iqEaAT+w7=zFx(4b08@^8sCkP@W}=tan&Y_Wu$Dx^``jL_~V z+r?*dCc(}|NYP4GKqG*{2+mR((g~W4GFL3l1x{3@NrXnAL7)z$P9=bMprjE}K%Xi- zB6JJ9Vhj&h!kW4)d*mkiB7mycBy~Y!y~h*}=2*(nYH_kE3xJ8E{PlK=@SGT)H^N^X zSetU#F%Eia!Q_P=p!DTTH!)6B;WSG*NtJ0p3qq{QY^jUTCa?wJMGQ}g$IEp$usH%~ z6#Sa(70mQ)&Jy8M3MYy(ULlE8|1$}s6*>i8QRN{!#-oW=-VUR`6e@u9GRCGHW@EEl zlv98Ss>H$o%^(Yq13FZA7N2YDJ=V*O?2P~l5}XT(r6zJF!Z`>FQCbk}8VeVFgfnwa4W z7oc1OOyd$?Oh zAxf+GqV=DWFIM3yfeBj0>4Z=ql$Q=sR@P-%Rq0dziY{DdE92rGm!NzT7#I0F!M-xs+ZH0it!7S zg;AtcL1m<<=2!RLdY7-t4RnW21GO!sAr<3Nf%6a~f~SI7NXY-AoS%wusV=1R>RC_&8kk0w3VwfS1_w80qQTw z_?88yS0ciTq-0AY7M$+ed@IQCJ}`hRn?(r!5SG@Oq7{D)H7573&F3teMOEbkWmYi9 zhkFToG1vesmIZbK?0EivdKoY-{n?eUQ=|xMY*-jXWnK0Dgb4cag>3J2y5S#5B4$V;~e)zBvy||@d{K#u*S3yTd)K(ZZ;a; zAuW!9i!#eNs-ghtg~Zh65+tM@qY5PIapwOU(lBXweuQP=9R3lUWB(C17vgANnCx3z zsuvD#9L}%+%1+`8&G)K@lOF{+;#90j9|9S^>n3)B_z7RcuWuyhg3)kB`XZc@ox~Xx z0Z1=ntbubhKjp=J}o3*BP{G++mQoEK_td9Ri+STv1}yK7|>@~ zSc#_hl$&e7^+RaRlopAxtkiT&NdRS6a3snp2)2g#u+(^Hx`RMmU*luadj@tgkk>?E zGG_{cV5@R!PitwF6eR)VD`%^Y`qa}v05YBLf+>HM)yrUdw(V;U-h(J~=1iI3xSTa2 z0HrTyx(J_=u+Qs}{FXCYUqG{Ejv`dW-?It7?ahO}NzXtoMCPo2ZOJyZGI{LQBushybn>en=yrH7R(6@AOpt`_S{b) zh%$TdU$}+L!VkaSH0?D-!*V4Y(Vgz}xm3>h|TeP8s^x z7KqvX)$UT2o9lu4G>e9sH#B5Oo=(tA{??n?70H)DliGp%)_vqQJdTwZ1F?EAKAP)8 zbG?vDgXG&A$`xM$AL4e^ZmI?81kF$eKnl{Q%oVADlBL4 zVpdgZp@~MBtFU#j`HO?^r5_RRzpU+$5fMl@U|ahDBf-P7UvyTb$wsj_mmd)yz7xHj zdVv!-#6^AMlLeYM1jUlPe_~YtA_d$kOg5@AE}3Q0 zumN&yrt2XJ(0k^r0-9*xw){4|W@xCox0G*m2! zGw0Jdr+*u*Zwc0462_%X;YhsT3VI%K$(#BB9f!lPW}b<}$CNY;Ba$N4*|KqtI0b*= z9Q*)tNCNd@3J+c=2v7_x)!|KSC}h5*VFFh3tSYUbssV@^CSpyPjqB!906{RMN-W0k zGSN{2D2x#07ai9pP)$@aKrR>rH^?W`z7EWu4Ye`tvDLQ1W|io_Zu zzR#cm-@WPQ@L&1`xubwq^ zGwgg5ZHX~VZ$Aqq0tB8|qyu+X1ju$_{(Kv`H-3vYOvZ{OBN~PYkV)-9_qL-$9A)eW zkrW>w^)uj=43KB&u`IR#^8=3*1n|>1y<5n2Z^4ax>atTL#e~gD-kinApHmg3iIgp# zp{HaYs3A_DYI$Suhk|I}WIIY11fbPRc!{20e4a>^-3{@=y)4K8GC=dD z;@e7_QaFSQ)SOxU<}8A!Vpea!Cn^-;E2M3uZQj&j03@v#U)Ui-^hO75&f-?2i7IZ+ z3iw07>7vw6_<8tgYS33h6Q0ope@ ziy*4392lL6(3MHBbJzeiHq)oDdNdwpz??-s(I}WR^WJ~2ZfqXhg&Djg@M3amcwp4j zt3aaCK9LUb?;!+{8Xn-{!p9ge#C#wDO$lohc0=W71WA9kG!A6_5nexi|EVQ02I6Co zcpVsn=6cawUw**Ufa6g65OriTtQ|ANYaen#SzVSrsXCq;%@KE&m4_%dk_A!#D_mi^5n1K96lckUAmj@B)8^4GB4bQ_wKX#A>}m)k${_a`Oj%L^PQpoY*E)1 z7~!u#8za?dSgbiCADsmSkt#^t1d=B$rv799fi<>eP_JF;n@Jq^d7R0|(D%p++;xxS zum7$wh*W9MC~p;I9f|@7)(UK?hKI8xKT|LW$6Ble$>SGM|M5$ZA>euMXY4r6)Z=J4 zdnL~F`P8BqVcV`A)&~ZV=dc6eMXA8CM$sXDnRz1hAwKsk>d#z(jG0tgn~_-9Q%|7b ztZT5Ej;ys3?~E!hd?3!IzyKNtJs6$>I;+A)ms<*=Aa;`E$CqL?95$>TH4(u%;#A_t zo)3Oa0o3U#Pks5J;*>>E07)xGV!RBzQcX`fT!>V`nfiA)EgvqcJ641BC#E;<|Du=e@whMNvy^X)Jpu`@lH2S zlw<`;`NNH^ye+~rX!TkBlA<%q!K!a2koeoOvFe&@LHqc=;rRR!y4xvq| z(CQbhiHwhCdIEA93?|zhYIXz^p>2B)H@?Z>XJ2Ij1W<2ShjOo0VeGMAbT$}7#>LQz=l1nEqT+Hyht~)*B1UD`OI`x%6p|C1=T3{?Qfx8xoIuM zq&x9j)y+~f9x4?fB+IZd0dqTtNEqagB9uvxSO8A-}zQ)S6v>6kC!F) z>K$lbPpIpbJfDZZ|5$0xb6Eh%?YOq#d+5OjFIG)-W*xjJO$0QXBJ

X@3*&~qwyP2sgn6(cDp>NG{+7T5}?QTJK@MqDlh`tA4_KJ z1>E34wkaj*oB^^dc`$xh`rjR|0x=zL`EiM>I={xwT1<`i4!YDtCaidBEwBVXeRtf% z$CUNB)$Qf{{zaJYuc>CxGZ~EUO&)2!37hGJXWV@8_yfH%2B~EV->sOUI!ZU8L%Rue zfs_x!Yu4{j-=2^!4~WG{XjLS~U-UA6|Ng^z^!Mru^rd;tl_>uEf|xanLTVfS`PuvZT|d`h6wD|2st%#>edCYul7!MrrdG=78R8hkj3$7M}O$M@NFzymke?`^-0J$xm@tBD(edkI@bOZ^HM*R>u|{`#FBi)$^PaOsWlW=cNkTX^NMm zpudkYBF=Q@-hNGvtRkuFKmKx#sUU>HucdGQg%VdMzbD)#`f?3quqd>050~A+J_{M0 zR%)H`bnOx3Bi3j85zxiO(0MW&+HT}v1e^RMGa8Bc{_9g?-ioTOY$X!=8l%HHu-=w- zR#6G~gZH}CMg?i_d;aRMF_)*ZBch(^$xhIGb5ce#&VKphH!j*79xM8qj7C01mC zL>z2Ds0z-=9xk>B)X}Cc1h9kb0z9q9i1-EKik6iwi7ecl&ZQ2uI^jijqzZ|p*zaf! z2~N46cBM`xxE4D$qkFs6>!QdTUk1FlrM(LUTl^F_{u3hWlDQx1KbWivfB+VQ4`&+O zcH!MDZv9cAm@MgTn1DB`iO=`NSDPiuOoJ5h+E+;Cw*Uvk1|HR{!>s~8Bl!Hus*RVs z`>KtZ6phI^KT)zX{HtsDvVhE>aa!-sZh5G5MLW^eOK9-8hjV}>AtvRBRqv|5TmIxN zQY;f=iFVZURv75vr_YpAI*YIY^*)*Q1y)XjR7~(GDlh!Uk(U;}gI5@>$rFR?`6Jp` zb|5KWbDC+8@;xOX*;ntbu#WVtD8c#RcIF?gET2INDC}O0W?w6WuCw_oKMYG`#^xPE zy6A7x0%NcqH*ajG-ofL(l>HX>;M=t6pOK_0Qk!|6REE z?eN2Q&JxWfx7EiH1wfoA$GG3T7mf9EzWZW@b`AluAJ7chH4U~-=~-T*CQ3^(XLX^Z zwa*AUJSJW(C_*ZE6^Z|wAS5^BNod!m?0y&SV)4i~`8;A)`_{ZlDVnTB^?w<}q|EEP z@WAIZ=V(Cs$WejE)t97|pmM61Sb{GmcGs4OuzBZ>D6vv~;mXGW=Izb;N=9!7X2Oc{ zJ=R7(+vb`1W^l42WPya;aZ{5K(ZU0n};F6{N4^?6Ctc*q0 zh%>#)^&vl<5w9f?WE2Me)K$TWuXk;7Z?=x*sVUGzqyM>%ymHT4Qz$Y({rl4`f6rzz z$SV&4fQB8Ai=C zf=94jld1e;Znnem-<;n~^#z)d3&n>7fa1x7p%qyxpJ}rlPV7sU3U#d*dFtUuv+xb) z$)m~jU*D=Dg^?XdX+~N+CbjnySM7reK9-oLau0Me$Dk&5iZic>+d+z2!5>dM#CIAy zunrQi;VPKVwxBA~FUKpdc3GApD>yz2hOpwo^lo+aIAC zTIDEmzIzHc@618xQCd**KyrVJbI{?jP$2IH(|5WhFRWGAjx7DdDI2S+7g^_HRrHjo z|Bv|67>%wsz6er06g;asp*kvk+kMbCLRhp4ho8}RX8I~h@&cq-mTmr_vzq#>3*I6m zbcNJNW_?Hvbh2MOz3d(%2Xi+?#&DkDhWE}eyPN{O9$s{^TzO`CjK3Mqp}h}Cjju7n z69yI6gg*%$2++&@c^yDn!RSG1HoVIaMHuxY$};u|jW!Og0#+6OwhyH;&?g$zLr2O~ zZYSJ1-!N*>{ORfUlMwVwZ;E*xuk5{3`dNf0A6-{to6+duA;*{W(vFfex|M;(OduUu zmH~JAD_vwi13SI?T&vDs%pUI#BOb;i#;=9^clX~A*M6S3*#9H*lK&`p@CjZX3693x QlV}_rO+$@(HK*wR0*KS&5&!@I literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_flashlight.png b/commons/src/main/res/mipmap-xxhdpi/ic_flashlight.png new file mode 100644 index 0000000000000000000000000000000000000000..320ccb1ec82168378b1995f9a130e553198892d8 GIT binary patch literal 7534 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 Bv%~-Z literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_simple_launcher.png b/commons/src/main/res/mipmap-xxhdpi/ic_simple_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..85b7bdf75292834283de1a0d05f9b9e6bfd10326 GIT binary patch literal 6710 zcmV-68p-8}P)6(PKt4NTc`58cE0+2{1@ti~uKqA8`N?8y0&FF0GB7 zB80M~rBWHqu1$$@oKSI@WC?h)CRVZ#v@Y)&NCM%xCTkFq&;t?4NC+_kjb3PGdb<1e zJ-_{BPf&+qp;=XZVwYSgGvqehJyHEPtTQKLrbka9Pm z)F=pD$lhaktqnw6L&!BW65xo77q?9G49-y3`j$YH6P}WYE7mdeB`t~G0iyGo@##hd zwAA0JoQ!z^=^DJ=Db%$lsE<1|TV;_7?Fj9vOcSLEn1bM`(qM#H3gMydB@jc|ufhP} zqZ~r$LpX@iBTA1EcKI=m4>k}zyo<#7kC7PCyF6YP^A2G~?0cICLs3RalHN z1*KJ?QG|LF2g&m{P!u6hWl)5Epcmngz)pc}CSa@Yakv4F(TzXWMyN3%AYFsk*TT54 z%d~{06Je==;_)5%C?YUYb?pZrlXvc2l30)u7Xk30@5zR{QSi2=LgOKT}^0UJ{`tz ztqQA976Ow<`7Y%eZL-AzG2jTo8)|tD<%tH5-O^os{!-NlNI_V~gjk49Yxxea45b|i zRn$n6D@t619)&Fye$tp^3mZ65ExuA!{P4OOC%S-ZQGOrcYLqEdnu*GXv?C7mpge=H zDe@*y%3}oOZrVsxbO&e`p{QkvD7PwHpB{0{m=VsIC@O+g=n>eY!XpvG_DVKw71t38 z(%VHtgJnLJZy?-+(lTa6lZn)*bQIxH;Gu|N58Vt@nrW-JPKm8!Uf}Y(s@y2B0->(l zZ7L@MajU$n@VFQ7RCoh>%iX5asTcui7bY6#0&)2xtE@6Ys}^FSZww%i)YN>^vzp}o zNFAG{8(Z#nK?Mj%!Nk@v3x}HnxK&_2KutJjpefU(u*ZQ%2-q0jzyc+C+$qlW(?!ZpA+q$Zv$ z5R`}rpGX=y{D60_U&z4+HVw1fzcio^Oa9FT63#eQtj zJ5jrE2NPU`!yO9O1NEhN?m3DAg94ifc%VMSE5#O3(W9Oi%)sFe;7e#tJVi!;2=FBw z?ud~NP>TG(qA_p}Q$)B=g&R=nYi6rNq}I^}1s+$++Q_}US1iZ6XioIN_h=WFyA*Ci z2-n0@LQ=oA3v`HJ{8j9{_j&q?@u;GhFzq6u9ycp|9SBh~TjfB2I)$%mlAE=QNHHE# zZ~?u#2Cv`ec7(O(WEw`Lk?MoBgGp|Cbq!vjZ(q>P)hq+@yU`=R20KvhhULQygtdN*BMRFK zwTfS`ZXR669CcWaaHDD!JI(Gm%-k>IUU(~}y#sMPY+o+3i0Rw3?LkSI*MFiE(>!Y!m$)vHiE0`=2z7JZG-6@Q4Cx(HL>goMIKWCG^A zxe#tg`;J5O5LGE6#YJcrA^QC*d8zyP{6qVKIMLBK7X)ytNEJKHjUBib-;KBGPNZ!v z;)Xy{Uqy_;G)%->{w2Jt{sftR9aWjOlSBFZ>qnC$B*! zPD3P@cS(@(lkqNEjhQqX|HTK;L(f2PqG&BHGy<&xH$*M}7ub@=eMX0N5sD`H3*dID zDLun$MP^)sxBOO|j?2IcXEa$OqKc};9@;~4%P$Gu_!*phgEHs2XGc2y1H;1+!(F4@ zyf|u4Flt$Xa1%mZ^@wLO=KOEqedaElj!O|QJgmtY5fQ{Vn91|-R^EcU@;}4G4KYQ`E9#w6__R52UMck}Z4}WmR>EN1%QV&a!V3y6kpL+Z@EL8@+JOyt@$y zH{!I;MjED}CwgJvAXVWPDfI%e@1MuNbnnXDna0?q>J_)gTx6cc{CDe zL`is;@{t0xjbZy81RSd#a{VvOZf6e9EoL)s;O(?p6zeo83Qux$>k8r>p2lbP{I1ulH z*!zsUd?4VCM_Mn(yYvp6`IkWbxFVRW>`+w*eC+#g;lK1S_N`w+^erlM86*k(GUD)+ zTq3fZMxcTDbOT#YmD zQ-~KXi*QaMBH)H_rp$-S*N|+UPO$ywaQqc2&M#6N5ta@3bO5hsds)^(&@RG*0oSV1 zUR38fGzs_oTW~-1Wn{v6fZ!xAM#i_|KYbMaV8_r8cUp0le+Reoip@SpnuoOrd|t@=2Er2F z9>jFq2BDU6H|tD7Vz{C|V0N|_WF;V7gC|NS%EDrY?ovMqX>9&@v?P);M-6Qx)Wa$% z5lI*`_j+Ql!&wO^>@qE>bduo=iIQR>Nb6O&7ySo9pZp!9 zVPaZ0)ghi!h!`X?0dM7h#7tdA@;85n-TNr`y_9(^Ev(A2u*)T-UcacMp#PM z$bQg>BhbJsn$riD6mjk+3&h~f=uC^ILLKFNFa~Lvj<@nw%*;>WKl?-UonL`pmK-A& zSUv#FzO#EBzm>`{s-IVmX0%#|&K;|VpZ6P9K)q9_Q&>9E z=L*W$99(injDt*^hIiT5@V@u}GX3+Z^}*6%6qdFv8eTxd`ZcWy>Z2};3)`+?kT4Qy zNiCqB>qy#Xa6H_O&tMu`NdD##g5CcB{;+OI!BALSKR^UBm&_YhKyioW^vO8I$DM>s zy&Cs|8<6^@l033n5I2OGu@rAy8$?E2NI?dbML=tD z&5DCGUx>5htGJz?Lt3hQTYZrbRAs|E^*@svebwQ3;!5*`R^kWr>30d zns~A&y{c~}&nI-nHwmV7l6dw9aOB@W3%DSwIKZ^l1|sAtAlDEQrKzwJhz?9#jC;`^ z;$5&h!2sjP8E|f&$eUPo;M>xh8WcKb(LXgF;4N(tw%v zS=^OtaOPhQp-64iDFh;j>*35>fsAV-`Tyn-Z2KAb?^2MoSz$^L&;-0c)PHAoq5~Y9 zLL|-`Xqb<);1BRFza43wmKxNC5|1jHOn~F2qK+CLL;V;S7je$+HZcz7y!nK#xrb!i z5|Uf~4n6z=1bG){_3DPn!pJBfaq-mBkoO=_*NU_Ft9X~(f;3Oh7-gvquzkny-`z!M z_A;ctq_eJ7f&b19Fdkm}Cx+ZGkc!e8a63N-k%{;(S$OZsyq+magD;s)SVm>VEfb9} zE3c;mGGP(U!mE+y_KePy20p?2za{$o!^F1yZ`7}d%)E*t=-tP_lYdHl=kwU;2Orie zI*V{4&fE);xz}RzO<@;isW2hae`g$lJcDC3{|rPKHybnIydhIgRTYg75a0P6u~&YM zf8bZRbG|~wZF#8_ti|8|1i`Vlse9+k)L-%kI4#r8`fX3m7ir5(654>L3Ct)nU=+fh z$-INP=s7+bJB-HqQMDhd!J}%i9~>sW;~573?QaN z!3}sbKY6xE3w$*C0m&eSDukSrxhZtqQuG*Fk8US;>o*XO^3i@AB{=#HgD*Tp^!a-U zdVgILPfi4A>;Ul{KV{&bzE6DTGpPM&T}*92^60zxzkL?$Ab~HWZ~vQyn}&@XDVN-~9^$CxY$k!A9RH$)nE+f)9wk^k0eZ z_@794Jofm0>|oDX#Xqe=!a~Rt&YYDj&slU3=Y#D80oW?209SPcg9Jynjr=j2+I?2% z6ef2sqYva;0wK3rF(VA}TL|g}5C)I#Xf5 z)69FWGtWdT7Vz_F;BeH;S!G~tDmoj+ocU=j3`s@-Ifg!zLj`E#kkrgsynlPLSMQdb3fX4iH5+h!nrP=!fRaqy$x? zJlHd%Ga*1Y*gHTp(={0dG_M&SrAL*bmlpldoH^ju1XNbeh|UI4dge7}_JuPWj&4+x z9+AwO$_kB9cFN8bQOl zu6~T;Nbw@E8kLQ;9Ew_w5BHg21vJ<|RA6Uen^mKV*lD7f9cUO~G4=2+5=|X!)6}-d zu^VWsrt)d*5F_=F4w-=Cl=k?9(qmD!9qt{z^5?JuI{z^e@q5^64ZXm51#MoXpo$$l ziNEhP?8*02`AHwE>V7HD@ z0cqe9fBm0{KG%hfpGZxBoRugeAN#i$m(ZN+huVHJ)Ds>HCYQtx{0AYAwo~Flgw(A0YwFRM0sL%mZud$j>{7b9=jE`lp@Kj zIv7LmQ7UArj>?6M`-Yja;t-oOcjO$t3ZUt6P6>2Z`z<2Pj9K$wY~1tg%6H+fQE)46TN z#>iJ!)GC`M?dQpCW}eSvR0%Ee7=a3pAS0itIkp)CA`*@|4v)xVqYI2ioe>o=Y)5!h zG8CXbC#Zf$Iu1N~Vt^f^y}_sjB;6!{hph6l6#dwkN~L<$Bal?(Wl8eT{2z~g5XdVh zGh*1I@VKV3*Q)o|JO@$eRpD`B?8)ao`6cysGvEb0CGc!s_o-286y;gR@Koyq`Bh-a zOF#k|-oRc>a=$`h4m-DT2>dEp=`NiUq-s-@>hnZWeYD51+~2l=y`zb|PNyK-3Ln*l(a{;FIj# zOLE`8V*7TJSHP?M3x@ALa39;d3zVK*(AP%0FatiT#PCyKMqc+qNYaR}A+%U;cX9wU z-{K<#;7=ga9{E` z4@`Y<_VZ;i6C7~+8< z_KAW-?_shS?o+q{h~#xY1>b^SGiO<$5EXdbBv{*eKkrebpRH)+B?PqLUJi-FdVx&> z{rSuhNxGtI-Py;E)i|4e5jNE&Sl@a-hbZDZSM>TMVK_j*1Hdm32Fc^gh=5~KhlSKc zG$g7JMfe2)4~!qrfnqK*vVLMI7fG? zDI75HL;nOnEmo*L9A$GwUtNROF^S6&)*9h5Rl@n0v_K)AJV!$O)DZ+Rl$SK%zJvX| zQ0N)vY$7X=er z$1EIf4&YXS`T2}QV>~)jV2=ooSYhK|ZD4<)R@FyK*#&e8?ZQOkTp%ugq_9e$RTU=} zF@3mpcIqItF(M*?WIFHsS;umJOCy`hIqIBF#R%vWv31Pz9j+0$L0|=v`<&4jTg8v7 z^0Eq#JBFv)Hn6wc4LY5Q6Oe+?MMKmwANU5!O{1AJs(KNn9Oa|HqmtwyV(e*sfPs8- zmR{`zh;2%|dbe0-zf^@-(XPi@e)knGAxRg|dfFNz!)-j>qWto9*3oKKm z9SDsiq)Ikts>B6)5Vol0Ct;T@<2P`k(o9t*szyMkqg{jsd^!-W6T=lK3rVHVhRHCG z^xdK$nRfM(C9%{p`{ELB*H zGKJIxWn-Y!Cz3ce-`^nZ00VM2Z(rKCR$~Y3hfB(ai3|4fC;Kh5y4X-BFaq3Jb4)tWj`>Wf{$_t=o7<1php9G zjA2(`Ic}mv5BHK7>AbCKXUq%eOwuEi>^+9p+CU@`P#2HWWWpHh6RIR M07*qoM6N<$g1sG>MF0Q* literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_sms_messenger.png b/commons/src/main/res/mipmap-xxhdpi/ic_sms_messenger.png new file mode 100644 index 0000000000000000000000000000000000000000..a0765d159de731eb63d2da488f8b78c0fac3dcec GIT binary patch literal 5500 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 FV1mL!#e4t& literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_voice_recorder.png b/commons/src/main/res/mipmap-xxhdpi/ic_voice_recorder.png new file mode 100644 index 0000000000000000000000000000000000000000..fe66d90ff0fc626d424de2a82a748748c820cc5a GIT binary patch literal 8505 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_app_launcher.png b/commons/src/main/res/mipmap-xxxhdpi/ic_app_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5677bb656a020869e4668086cdcfdc79083ba7 GIT binary patch literal 13088 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 Fe*l$>O{D+; literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_calculator.png b/commons/src/main/res/mipmap-xxxhdpi/ic_calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..38b1aadaf2605adb072bd022b146ffa7db4c5ded GIT binary patch literal 7031 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_camera.png b/commons/src/main/res/mipmap-xxxhdpi/ic_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe2ef756e6c610d01d35781bd84d60101030dec GIT binary patch literal 13090 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_clock.png b/commons/src/main/res/mipmap-xxxhdpi/ic_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..172690ffec3382a48a6f9002a1de26063ba5ee1c GIT binary patch literal 10712 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_contacts.png b/commons/src/main/res/mipmap-xxxhdpi/ic_contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1e3fa0598d61ba09d1efe978aaf98dcfbd887f GIT binary patch literal 8667 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_file_manager.png b/commons/src/main/res/mipmap-xxxhdpi/ic_file_manager.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3c215e0f4478735e87c2f5de06b6368fec3d63 GIT binary patch literal 6666 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 O0Q8|o+O?XF@&5-fGnRG$ literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_flashlight.png b/commons/src/main/res/mipmap-xxxhdpi/ic_flashlight.png new file mode 100644 index 0000000000000000000000000000000000000000..2111dbbad4217c131f6574a82c9470e413865e3f GIT binary patch literal 10228 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 Z{{hQcfqImdY=r;-002ovPDHLkV1glQWKIA8 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_keyboard.png b/commons/src/main/res/mipmap-xxxhdpi/ic_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..30a40c74b7b093a8417dc99509a292012de17dc4 GIT binary patch literal 5602 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_notes.png b/commons/src/main/res/mipmap-xxxhdpi/ic_notes.png new file mode 100644 index 0000000000000000000000000000000000000000..1109ea954fe45c468891575217c56e4c772e044d GIT binary patch literal 6402 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 hStmXrw(%5;QKEU!* zjXn5NpCFx3DJAmyP|-J*jyLYCDCBnuDYcTHZP0nDe~+WmSPJ9DZ+YKXOL$YmTz?Jf z{g>=7Mrz~mg<@Z;#ZOXHA;zFp?@#Z*ksduU;CDOhg zP`Co8+4H>A{YcFyOK*rF8TuD<+p{-caGvNZEx<}7XYX<842AB3QVTqzIA(*EAW(U* zh4pv)D)7VN@=0s!Bk1}cLeY;l1)qo>?*gt3I-Y2z(Uz=?tzk|dUQ`IZydU;{i$Ck#T!?)%t^5H1QkwsDAfTX# z@h(Xeprxlqv`RusDh$%5hF{&Km;%%+15~{|Jzcy40IGg2jsY%DID_2+P@EcCdWIGl z3I+gxc|;4TY#K7N^Ey1lbmjGc(w^*7zHD95*bFkDN*hzJ8VJrEov=P}`K~3TDyg>C zeR96#Phh8QWAmkiSz(JoYv9(V^-h`SGc}vJiSb=QZgXFP6>e=La+k^r*vpfj??0_H znruw>if3)OC_nV`*u#U8oyVh>*WI7DF2j}oU*n?W`h9Pm?n}24YzqcyJKY z!P|=SBT0`EQW|)QTWe5Eui)>bCbugO-**azHGx za&Ej*pgKSy`WiumD}$6mGDQFBERQNupa6WDr!K69Mfa4-Y)G6$_ND6WZX(>9;zXOj zX#Oax}5-LQ|_mj<3t6{c%` zvvgFbXSAfKNo>J=gcw?ON07;Iv}tB_v%`hzHGU9#R<&zpb9Jow*?v8Osd*fF(@14E;Fl;u3p!7;z^ujlwNFU__ z{0h%_u_B1Z0AJdTUks}JIM7`7SpL1t_;Sj{)!j9)eV$@BcjQ7`J$ncsgmFEgCBqm5 z<@-nOK;(xf&3>%O2)CqoPTsmAmtn;% zQnH+mUp-+EJXn*c7?LdFpER{XOT_%C#uS$bcAQ63;LY*>N(ct5v4i$$v!f-0#rE%W z+~w>)Hv9)DR=FX>hvC)d8ruYaW!wAsjPWT!<*7X#yQs1DS+{$>LY*r~LZPXuZMjRu zgvtaIj!p({=ing_KOO*KD|VJ>-o z6P-d#fp?9kN7}3lFaig;C*|=k-+LI8mVwXs>cv>TKFB0EAjO-`fwa1;qX_2Ck%wry ze6PYmbuuyf)-L5t`$gy`FF*5v95m1Nb@1C67FxwbH>_>ey>os5(@qrS_&8IJJd(;+ zcE3y4^#zh}D2irZbxwzmge8pFX`dIRYM@H1=1Z}Soj;Ht?Qtm)4U;9iddMVanq5^z z)#z*BM|af|Xe39_wUN9|Gpbhoo^S-K738=l&vKX=H^ssMt}e^qFf#R9vBggpwE_+R zm+8KB)Pi%)DJmMK#RjN;y>;@ZoZ8ih%Rz9UvBFfRv}5-_iHQOt&VP1X$((WF$G?KF z6;XAUx;NZ-Z_L=@e686loHnlidH%laLNDqS2LADk^q})X45uyh;~7iI6PeNZh>R)Y zdVOv&h~}JB;mcji&4t0B&$cB(zL$z5!C|T>nTs#?VFi*LwPBEirDZk=wpwm=)WsT3 z@Pk&DDW>t#%EvhFY&nTH*c_a`oI}c!Y@3blL?4no80QK=o(reA9g6FBvBGM%|2X@2 z)OfmUb%iLM5G7;h%oDhM&`QADgz%c5hh!LgdIwG~m%ZU=p3mZp;%ARl9(rR@MFi>` z`d||BuH7e1-@WdgZ^E~mlYQju2?m7Udm{Z%?DgbR3}=i8eK$qbiyKwa5g82Q;>^x5=mh?d7Q6MjHTwvM=dXVYnj@d6Sqvb(cd zSk6gPNxpQ@y%6p%_ot$3=KLfc$<4|uu_50CR25rzKM=Mjux@9gX%Jkr{M!cm5o-+y zmHqnF@ASSv5u%me^EY{{>l|9#k>agK#?$3nI6?~d&7Ere9@S!xOguHNk(gvnuujh5 zk7uLX;ZKqfPoSXh{YrQS{Zrsq8XUh}y7-F9QI9j{^3oCIA4DA!Mr!8)(nVx7iE;F# zvPaPpN_h!weKXKCAe;eul^*_3$MNhEyjoHm2JZjjj}s({$;0$^;HXy27->dTOn*Cc z+og8h_=>eM^r{vM%bu9r*Gsn8H6Y$6+|}C(9lhpm>Urr<6#DSum0N=5^uNQ)$R2IS zy#@WvG(JZ+um?xEkf7Z>UETt5G21WTa8;`bW@=PN5OGm9r1sAhH* z7E^;CveGmc)$|D|f)JpD=0}17&|rATB#@pGqx=Jj{vNYkhn`?9Stxh1*aNy;Kc$-D0V&=~om zpSQ>=16XB0kkFwe44RiJoZPi6xaMr5I3+xh|5T)pcp`r>NGj&~I92hvu@b2b6YiOr zg4)`=%7-wCiEj&w+YzwsPwsUSJZoK+#z7%Pw~Fida8x9gl&Sk0&6c!EPLuQ z*s1#=o%{J|kM?1JEs7_s&y3OJzFKu*0$gkzB|B~Dud<>;L(9f(wa>N-aq$Mo95O^~GAz@$2`JuFkZE~oA`|}d z^{ak0a<9Cn{buW`EHE|Rc8*C>a-+v-=CG(V*lle)WbZVv+@s($; z$Rmht3CDQ!Z>^MEaU&b}0f!?b>zDCl&x6bDW+fk(5Wil~Molo_o~cK}M$0ViIJE`E zm|dy5mxG!TTchprC_fKpuonI1c=*#o_a30H78$}hga0uwGzvYM($pPhSifHDa}$?g=y?6#@*de0-Or%QaXhe&(*Hb?Cyn3#@moBs#Ly`10wtwtS$a#|)9D(tpF%jKUB)xwQXD3?k@iCsVLN?Ual%Gq`1rT=2P={W37D4pw_ zEU*~ho0KRg<{w|sISviU&0(x>pa}EGfg#H8Rj=(?B;p3Ak_8GR7$WfXSL6Yg7qQya zP(4LTBfGfv|0u$*y|KdrFkOQFuZ7c8o?4%0CTB&&xUXwx=DtP73Mg)E#cmejw12xu z49siji0Kz#q)PHkSA1&5DSH;_+7EWzd8O}VMCz5ag5E>;@P|m*v0&+YDn@-wCGm7a zzY<8BdYqwSHD79&QrovDWp|7Yh=-4y`?`>RjF1n6Du1qWIbJFUhieN~olfzpj)jcV4n3Hcjz@H#GuHJv*x(X3^}G+xV!1rsb*Z)8;qX)c}Fbb!Qs z>SRc;+36+Z-HZ|6)>c?YnO6v1+y#1h8Tq3K#Y^b@SG1EO^0IA$+Ci4{;&W;RUi+wss%B#R2id@Q`Wzvjb$bvxD5y{OEUk3TavI!-r85b@o| zHsNary2?uDghxXRC6m9`CKGEP$5)h*v#PJ>BvXN(HRM@1dtWP9UjBESTJSS)@)sR~ ze7fL*kL*i{zqtPEbVV-;Yc+CI2e&Q$iVKrKfknx))p`J`=p?5+(^dRTq`LLumbV@2 zAYw@#!Y?dWJ7P}V z3VtP2?)s89U%LaVn9#E2YS^VRY2~W~3tSHh~ zz}h#C`^gK(-RTtiT4XYX=J#g09~j2U$ItN!=lL# zVUf`a7RcECjsShSI!hq4wToxiaxm+5U$|CHD5mc=f?=qI!NYF1o0)aB|3w`sAOqJclMvo)OOlGy-?$CAEUmFaw-Crzk5ttw#KT)pf zih6rF&Sn`dWh{TltkT!d(fGo7fYNDiHp!XoO9R&;A~Q1-_GAIXGutp9#vHL8asg(f zr0I2bZ%V*|isI-M)lfYYltCEi6QrnhU_}!#DlPUxy1n&3OTN|lk$}$!@I*7Efrbv+ z9zS&=BF!DkFQsupaM`U(WQARVxzwPZ!xzf7iRVN2>mOM}%70ew9j@Vp>T(TFHzzD- z*ZnY202}>5|7qs%-+EAU)jm?bADc0yK6yKTr+>mJnT=G4XS0ICCoVFpl?*)|MAS?v z#2`sF^M}EU+h+=iBD*n$gJ75pU)3KS%^ka}NEt^}YUoo01jDlbmUI&G>_cN|iQ{xe z6V{JJ7od@humBh3LZ8zschK78k;7sGc|p9|M8KUoIqPao2Y=S5&AcMGL|HXPLV5` z@@J~mFFG`_uu-}d7XvcmKP#t4<&vR7e}YgfQ-UK&%p)~aPhggLBj$_m2ohTGfE}#d zaRMDEEf5i|=N?x1KJ3?HoEn0}iG*Z8nWal}`cxf2{ByWg5dH+l!fWwM#XAkjPG|@0 zFlzl;Ni@*Ak+{Uu;alWv`Q+cClH$MMQl;3=sWSmUwB1w`puupt13E59*JjiYD=!{{;pZQ{8zVn4HHMt z0A0-hz@;xGGaOiyaI5e-KqNHdOMyM!@}FXNGUvJey{TZB>rGE?ySne4$-A@B!Eb$JMGOR1OAo5W+^*I-m+_aF=!n)0e&=os0a+~q`+H- zD}>(f^e0WrH>5m1n-XZBUMd8<6|wv|7G|QbM>7Cm@6InE4|4iMT(gyWyTCvS@KQU| z`?=j}zOM-&8BjI$^Ku<>FykkLLR(rv{fRJ!MhE7lh}Ns!1Zgv%6$yDSLRi1LNX}tG1Rqo zamaT~hj>(ay?Z!Ykec3L20>UZOcbd5hB_SZ7Y+z}tYt6N<69Kf1w|3^T zl+P8Dbt(n_ivL!(2Fh5A<4_%k&_0OQ$2VBI-v$#J5T zUSSCnK~vzL9vxT~M60y4tyJB0yWFP}S#0z%gCtrZDB?}e&V??)GzhSr>#Ch|Icy2wEM7NM|{t4HbsF#vr2`g(eO zj6QSo%lzkiA#B-pyEAEQZ3}BWoed|Rr-%1Cc!S^UAF4j5Lo~%f>H%jDLs+_^5|#;T zTE0%b4v$u)p6%V9+L&M2AebIjo%#pH%$%Fd&iBkUPt+M`YK;mfH2>W~iY<7Dw>t}T zdKHe?Imj8tO$N`%5+_t5gyR2u7RwG=gaSr!@67NC9*GLc-d__P;y z`g{wr-{f%|b%gC7TMErSJjO6_$Z&X9z*;{@k7&5-ee<)|2Fu2*V2>Nj=SP;~pIM!i z?rBS-8jC+rZ0zcA@z-1VaWAcDJrD(0@z{VRmYgTw1A4U~?P!XjI7vHJ-(dn$pK`^0 z9-r#xfbQ#kZrq5blO^BV*)BB_KZgtd*l*t^madxl$+!6t#xH5XTpRz`0%Ya|(Ikf3IU{z3twj|7nr z(~A~rZOAkt{^*J_F5pkWow?Lh72pHt^aqcts6ikHn>G7p)2A~aU)PmhP|WB|+uu_2ko zkI;g7=h13@JLZtwD@+T3qmfV*vj>z07=7*zRw%y(=TdSk9!xNcXRv493^~7JT%ZC1B~z;v zo}xC4HiUZ+<7G#JhjU2)4}H?D()#*_^Qe0&d;4FHw?i%0*Ki+nv4b%LR$vdX9cUHI zuxLbZuGv6l>LC0B^XT2V7IOJW=$l{iYw%9zT;14 zOuJ{7U6EuT%s~6$3&lT^SS z%%=c0(S^RrZe^IwZa&b#dnXT2IQrCg05(tLG14DPc!#{9%0y1s^ERe3!V{hB5Xb~)aL-MXjBqY==!yi#ek;; zmAGvm=%qmb literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_sms_messenger.png b/commons/src/main/res/mipmap-xxxhdpi/ic_sms_messenger.png new file mode 100644 index 0000000000000000000000000000000000000000..a6774319251df4bb471f7f804df156f987dc0812 GIT binary patch literal 8614 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_thank_you.png b/commons/src/main/res/mipmap-xxxhdpi/ic_thank_you.png new file mode 100644 index 0000000000000000000000000000000000000000..e4300655d503e28885a98641a2fa7857ccf64a4c GIT binary patch literal 8254 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxxhdpi/ic_voice_recorder.png b/commons/src/main/res/mipmap-xxxhdpi/ic_voice_recorder.png new file mode 100644 index 0000000000000000000000000000000000000000..819aabab3900a0a4393d4b736b54ad78710e7561 GIT binary patch literal 9561 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 cq7jcM{$sK_!XWxfWXTi&qO7G + + موافق + إلغاء + العودة + لا شيء + لاحقًا + حفظ كـ + تم حفظ الملف بنجاح + تنسيق الملف غير صالح + خطأ في نفاد الذاكرة + حدث خطأ: %s + خطأ: %s + فتح باستخدام + تعديل باستخدام + تعديل + لم يتم العثور على تطبيق صالح + لم يتم العثور على متصفح + لم يتم العثور على عميل بريد إلكتروني + تعيين كـ + نسخ إلى الحافظة + نسخ الرقم إلى الحافظة + تم نسخ القيمة إلى الحافظة + تم نسخ القيمة إلى الحافظة:\n%s + رقم الطلب + غير معروف + دائماً + أبداً + التفاصيل + ملاحظات + جارٍ حذف المجلد \'%s\' + لا شيء + التسمية + شفاف + لون شفاف + تحديد لون مختلف + تنزيل + الإشعارات + الإشعارات + البريد الإلكتروني + السابق + تشغيل / إيقاف مؤقت + التالى + رقم + لم يتم العثور على جهات اتصال + طلب الأذونات المطلوبة + يتعذر على التطبيق الوصول إلى جهات الاتصال الخاصة بك + التطبيق ليس لديه إذن لبدء المكالمات الهاتفية، يرجى منحه في إعدادات الجهاز + إدراج النص هنا + اتصال بـ%s + تأكيد الاتصال بـ %s + Zero + One + اثنان + ثلاثة + أربعة + خمسة + ستة + سبعة + ثمانية + تسعة + القيمة + لا يمكن أن تكون القيمة فارغة + إنشاء جهة إتصال + إضافة إلى جهة موجودة + التطبيق تالف + اخلاء المسؤوليه + التقاط صورة + اختيار صورة + اختر الفيديو + اختر جهة اتصال + اختر الملف + تسجيل الصوت + تسجيل الفيديو + تحديث… + ذاكرة الهاتف + ذاكرة الهاتف (غير مرئية من قبل التطبيقات الأخرى) + Audio + + تاريخ الميلاد + مناسبة + + المنزل + العمل + + جوال + رئيسي + فاكس العمل + فاكس المنزل + بايجر + لم يتم العثور على رقم هاتف + + تغيير نوع العرض + الشبكة + الشبكة (Pro) + شبكة غير مستوية + القائمة + زيادة عدد الأعمدة + تقليل عدد الأعمدة + عدد الأعمدة + عدد الأعمدة الرأسية + عدد الأعمدة الأفقية + تغيير صورة الغلاف + تحديد صورة + + %d عمود + %d عمود + %d عمودان + %d أعمدة + %d أعمدة + %d أعمدة + + + إدارة الأرقام المحظورة + لم تحظر أي شخص. + إضافة رقم محظور + حظر رقم + حظر أرقام + أرقام محظورة + تصدير الأرقام المحظورة + استيراد الأرقام المحظورة + عليك أن تجعل هذا التطبيق المتصل الافتراضي للاستفادة من الأرقام المحظورة. + ضبط الى الافتراضي + هل تريد بالتأكيد حظر \"%s\"؟ + حظر المكالمات من جهات الاتصال غير المخزنة + حظر الرسائل من جهات الاتصال غير المخزنة + أدخل رقما أو نمطا (على سبيل المثال، *12345*، +1*8888) لحظر جميع المكالمات والرسائل من الأرقام المطابقة للنمط. + لا يمكن حظر الأرقام غير المعروفة دون إذن معرف المتصل. + + المفضلة + إضافة مفضلة + إضافة إلى المفضلة + إزالة من المفضلة + + بحث + البحث في %s + أكتب ما لا يقل عن حرفين لبدء البحث. + بحث في جهات الاتصال + بحث في المفضلة + البحث في التطبيقات + البحث في الأحداث + البحث في المجموعات + سجل البحث + البحث في المكالمات + البحث في الملفات + البحث في المجلدات + البحث في الملفات والمجلدات + البحث في قوائم التشغيل + البحث عن فنانين + البحث في الألبومات + البحث في المسارات + نص البحث + البحث في المحادثات + البحث في التسجيلات + + فلتر + فلتر (Pro) + لا توجد عناصر. + تغيير الفلتر + + مطلوب إذن التخزين + مطلوب إذن جهات الإتصال + مطلوب إذن الكاميرا + مطلوب إذن الصوت + لاتوجد صلاحيات + يجب أن تسمح للتطبيقات لعرض الإخطارات ، أو أنها لن تكون قادرة على عرض تذكير . + يجب أن تسمح للتطبيق بعرض الإشعارات ، وإلا فلن يتمكن من إظهار شريط التقدم. + يجب أن تسمح للتطبيق بعرض الإخطارات ، أو أنه لن يكون قادرا على تشغيل الموسيقى. + يجب أن تسمح للتطبيق بعرض الإشعارات ، وإلا فلن يتمكن من تسجيل الصوت. + يجب أن تسمح للتطبيق بعرض الإشعارات ، وإلا فلن يتمكن من إظهار المكالمات الواردة. + يجب أن تسمح للتطبيق بعرض الإشعارات ، وإلا فلن يتمكن من إظهار الرسائل الواردة. + منح الإذن + الإذن مطلوب + + إعادة تسمية الملف + إعادة تسمية المجلد + يتعذر إعادة تسمية الملف + يتعذر إعادة تسمية المجلد + يجب ألا يكون إسم المجلد فارغاً + يوجد بالفعل مجلد بهذا الإسم + يتعذر إعادة تسمية المجلد الرئيسي للتخزين + تمت إعادة تسمية المجلد بنجاح + جارٍ إعادة تسمية المجلد + يجب ألا يكون إسم الملف فارغاً + إسم الملف يحتوي على أحرف غير صالحة + إسم الملف \'%s\' يحتوي علي أحرف غير صالحة + لا يمكن أن يكون الامتداد فارغاً + الملف الأصل %s غير موجود + إسباق أسماء الملفات + إلحاق أسماء الملفات + إعادة تسمية بسيطة + النمط + السلسلة التي تريد إضافتها + %Y - سنة\n%M - شهر\n%D - يوم\n%h - ساعة\n%m - دقيقة\n%s - ثانية\n%i - الرقم يزداد من 1 + اسم الملف (بدون .txt) + اسم الملف (بدون .json) + اسم الملف (بدون .zip) + بدءا من Android 11 ، لا يمكنك إخفاء الملفات والمجلدات من هذا القبيل بعد الآن + + نسخ + نقل + نسخ / نقل + نسخ إلى + نقل إلى + المصدر + الوجهة + حدد الوجهة + أنقر هنا لتحديد الوجهة + يتعذر الكتابة إلى الوجهة المحددة + يرجى تحديد الوجهة + لا يمكن أن يكون المصدر والواجهة متماثلين + يتعذر نسخ الملفات + جارٍ النسخ … + تم نسخ الملفات بنجاح + تم نسخ الملف بنجاح + حدث خطأ + جارٍ النقل … + تم نقل الملفات بنجاح + تم نقل الملفات بنجاح + يتعذر نقل بعض الملفات + يتعذر نسخ بعض الملفات + لا توجد ملفات محددة + جارٍ الحفظ… + يتعذر إنشاء المجلد %s + يتعذر إنشاء الملف %s + لا توجد عناصر جديدة + لا تحتوي الوجهة على مساحة كافية متوفرة .\n مطلوب %1$s، المتوفر %2$s + خدمة النظام لتحديد الملفات والمجلدات غير متوفرة + + إنشاء جديد + مجلد + ملف + إنشاء مجلد جديد + يوجد بالفعل ملف أو مجلد بهذا الإسم + يحتوي الإسم علي أحرف غير صالحة + يرجى إدخال إسم + حدث خطأ غير معروف + + الملف \"%s\" موجود بالفعل + الملف \"%s\" موجود بالفعل. هل تريد إستبداله ؟ + المجلد \"%s\" موجود بالفعل + دمج + الإحتفاظ بكليهما + إستبدال + تخطى + إلحاق بـ \'_1\' + تطبيق علي الكل + لا يسمح النظام بالعملية في هذا المجلد ، يرجى اختيار مجلد آخر + لا يسمح النظام بالنسخ في هذا المجلد ، يرجى اختيار مجلد آخر + لا يسمح النظام بإعادة التسمية في هذا المجلد + لا يمكن إعادة تسمية المجلدات مباشرة على وحدة التخزين الداخلية ، فقط المجلدات الفرعية + لا يمكن إعادة تسمية هذا المجلد + + تحديد مجلد + تحديد ملف + تأكيد الوصول إلى وحدة التخزين الخارجية + تأكيد الوصول إلى المجلد + يرجى إختيار المجلد العلوي من بطاقة الذاكرة (SD) على الشاشة التالية ، لمنح صلاحيات الوصول للكتابة + إذا كنت لا ترى بطاقة الذاكرة (SD) ، فجرب هذا + يرجى السماح للتطبيق بالوصول إلى التخزين المحدد على الشاشة التالية بالضغط على \"استخدام هذا المجلد\" في الأسفل. + يرجى السماح بالوصول إلى \" %s \" على الشاشة التالية بالضغط على \" استخدم هذا المجلد \" في الأسفل. + يرجى الضغط على \" حفظ \" في الجزء السفلي من الشاشة التالية لإنشاء المجلد الجديد. + تأكيد التحديد + تحميل… + يرجى منح التطبيق صلاحية الوصول إلى جميع الملفات الخاصة بك، فإنه قد لا يعمل بشكل جيد دون ذلك. + + %d عنصر + %d عنصر + %d عنصر + %d عنصر + %d عناصر + %d عنصر + + + + %d مادة + %d مادة + %d مادتان + %d مواد + %d مواد + %d مواد + + + حذف %d المادة + حذف %d المادة + حذف %d المادتان + حذف %d المواد + حذف %d المواد + حذف %d المواد + + + + %d جهة الاتصال + %d جهة الاتصال + %d جهة الاتصال + %d جهات الاتصال + %d جهة الاتصال + %d جهة الاتصال + + + حدد وحدة التخزين + التخزين + وحدة التخزين الداخلية + بطاقة الذاكرة (SD) + الروت + تم تحديد مجلد خاطئ ، يرجى تحديد المجلد الأصلي لبطاقة الذاكرة (SD) + لا يمكن أن تكون مسارات بطاقة الذاكرة (SD) و جهاز الـ (USB) متماثلة + يبدو أن التطبيق مثبت على بطاقة الذاكرة (SD) ، مما يجعل تطبيقات (الويدجت) غير متاحة. ولن تراها حتى على قائمة (الويدجت) المتاحة. إنها أحد قيود النظام ، لذلك إذا كنت تريد استخدام (تطبيقات الويدجت) ، فيجب عليك نقل التطبيق مرة أخرى إلى وحدة التخزين الداخلية. + تم تحديد مجلد خاطئ ، يرجى تحديد المسار \"%s\" + + الخصائص + المسار + العناصر المحددة + عدد الملفات والمجلدات الموجودة مباشرة داخل المجلد + إجمالي عدد الملفات + الدقة + المدة + الفنان + الألبوم + البعد البؤري + زمن التعرض للضوء + سرعة الـ (ISO) + فتحة العدسة + الكاميرا + بيانات الصورة (EXIF ) + عنوان الأغنية + إحداثيات الـ GPS + الإرتفاع + إزالة EXIF + هل أنت متأكد من أنك تريد إزالة قيم EXIF مثل إحداثيات GPS وطراز الكاميرا وما إلى ذلك؟ + تمت إزالة قيم EXIF بنجاح + + لون الخلفية + لون النص + اللون الأساسي + لون تمييز للنسق الأبيض + لون مميز للنسق أبيض وأسود + لون المقدمة + لون أيقونة التطبيق + لون شريط التنقل السفلي + إستعادة الإعدادات الإفتراضية + استخدام كافتراضي + الإفتراضي + تغيير اللون + السمة + تغيير اللون سيجعله يتحول إلى سمة مخصصة + حفظ + تجاهل + التراجع عن التغييرات + هل تريد بالتاكيد التراجع عن التغييرات التي أجريتها ؟ + لا يمكن التراجع عن هذا الإجراء. + لديك تغييرات غير محفوظة. هل تريد الحفظ قبل الخروج ؟ + تطبيق الألوان على جميع التطبيقات المشتركة + تحذير: بعض المشغّلات لا تتعامل مع تخصيص أيقونة التطبيق بشكل صحيح. في حال اختفاء الأيقونة، حاول تشغيل التطبيق من خلال Google Play أو ويدجت، إذا توفر. بمجرد تشغيله، قم فقط بتعيين الأيقونة البرتقالية الافتراضية #F57C00. قد تضطر إلى إعادة تثبيت التطبيق في أسوأ الأحوال. + تم تحديث الألوان بنجاح. تمت إضافة سمة جديدة تسمى \'المشتركة\'، يرجى إستخدام ذلك لتحديث جميع ألوان التطبيق في المستقبل. + لاحظ أنه على الرغم من أنك تستخدم إصدار تطبيق Pro ، إلا أنك لا تزال بحاجة إلى Simple Thank You لأسباب فنية. يعتني بمزامنة الألوان. + + Thank You لفتح هذه الوظيفة ودعم التطوير. شكراً! + ]]> + + + فاتح + داكن + Auto + ضوء تلقائي / داكن + شمسي + أحمر داكن + White + أبيض وأسود + مخصص + المشتركة + System default + + ما الجديد + * التحديثات الأكبر حجماً هي المدرجة هنا، دائماً توجد بعض التحسينات الأصغر أيضا + + حذف + إزالة + إعادة تسمية + مشاركة + مشاركة عبر + تغيير الحجم + تحديد الكل + تحديد نص + إخفاء + إظهار + إخفاء المجلد + إظهار المجلد + إظهار المخفي مؤقتاً + إيقاف عرض الوسائط المخفية + لا يمكنك مشاركة هذا المحتوى الكبير مرة واحدة + إفراغ "سلة المحذوفات" وتعطيلها + تراجع + إعادة + طباعة + طباعة (Pro) + اختصار + إنشاء أختصار + إنشاء أختصار (Pro) + Add number to contact + View contact details + الاتصال من بطاقة SIM 1 + الاتصال من بطاقة SIM 2 + تبديل رؤية إسم الملف + الانتقال إلى الأعلى + الانتقال إلى الأسفل + Pin item + إزالة تثبيت العنصر + Send SMS + Send email + اتصال + Contact details + Add contact + خلفيات + + فرز حسب + الإسم + الحجم + آخر تعديل + تاريخ الإنشاء + تاريخ الإلتقاط + العنوان + إسم الملف + الإمتداد + عشوائي + فرز عشوائي + تصاعدي + تنازلي + استخدام لهذا المجلد فقط + فرز أسماء الملفات حسب القيمة الفعلية + الاسم + اسم الأب + الشهرة + Full name + استخدم الفرز المخصص + تغيير الترتيب + + هل تريد بالتأكيد متابعة عملية الحذف ؟ + هل تريد بالتأكيد حذف%s ؟ + Delete %s? + + هل تريد بالتأكيد نقل %s إلى "سلة المحذوفات" ؟ + + هل تريد بالتأكيد حذف هذا العنصر ؟ + هل تريد بالتأكيد نقل هذا العنصر إلى "سلة المحذوفات" ؟ + لا تسأل مره أخرى في هذه الدورة + عدم الإظهار مجددًا + نعم + لا + أحياناً + + تحذير: أنت تحذف %d مجلد + تحذير: أنت تحذف %d مجلد + تحذير: أنت تحذف %d مجلدان + تحذير: أنت تحذف %d مجلدات + تحذير: أنت تحذف %d مجلد + تحذير: أنت تحذف %d مجلد + + + رمز الـ PIN + ادخل رمز الـ PIN + يرجى إدخال رمز الـ PIN + رمز الـ PIN غير صحيح + تكرار رمز الـ PIN + النمط + إدراج النمط + النمط غير صحيح + تكرار النمط + المقاييس الحيوية + البصمة + إضافة بصمة + يرجى وضع إصبعك على مستشعر البصمة + فتح مربع حوار التحقق من الهوية البيومترية + مصادقه + فشلت المسابقة + تم حظر المصادقة، يرجى المحاولة مرة أخرى بعد قليل + ليس لديك بصمات مسجلة ، يرجى إضافة بعضها في إعدادات جهازك + الإنتقال إلى الاعدادات + تم إعداد كلمة المرور بنجاح. يرجى إعادة تثبيت التطبيق في حاله نسيانه. + تم إعداد الحماية بنجاح. يرجى إعادة تثبيت التطبيق في حالة وجود مشاكل في إعادة تعيينه. + قفل المجلد + قفل المجلد (Pro) + فتح المجلد + تعمل هذه الحماية فقط في هذا التطبيق، ومن المفترض ألا تحل محل تشفير المجلد الحقيقي علي مستوي النظام. + + أمس + اليوم + غداً + كل يوم + إخفاء السنة + ثوانى + دقائق + ساعات + أيام + s + m + h + wk. + + %d ثانية + %d ثانية + %d ثانيتان + %d ثواني + %d ثانية + %d ثانية + + + %d دقيقة + %d دقيقة + %d دقيقتان + %d دقائق + %d دقيقة + %d دقيقة + + + %d ساعة + %d ساعة + %d ساعتان + %d ساعات + %d ساعة + %d ساعة + + + %d يوم + %d يوم + %d يومان + %d أيام + %d يوم + %d يوم + + + %d أسبوع + %d أسبوع + %d أسبوع + %d أسابيع + %d أسابيع + %d أسبوع + + + %d شهر + %d شهر + %d شهر + %d أشهر + %d أشهر + %d شهر + + + %d سنة + %d سنة + %d سنة + %d سنوات + %d سنوات + %d سنة + + + + %d ثانية + %d ثانية + %d ثانية + %d ثوان + %d ثوان + %d ثانية + + + %d دقيقة + %d دقيقة + %d دقيقة + %d دقائق + %d دقائق + %d دقيقة + + + %d ساعة + %d ساعة + %d ساعة + %d ساعات + %d ساعات + %d ساعة + + + %d يوم + %d يوم + %d يوم + %dايام + %d ايام + %d يوم + + + %d أسبوع + %d أسبوع + %d أسبوع + %d أسابيع + %d أسابيع + %d أسبوع + + + %d شهر + %d شهر + %d شهر + %d أشهر + %d شهر + %d شهر + + + %d سنة + %d سنة + %d سنة + %d سنوات + %d سنين + %d سنة + + + + %d ثانية قبل + %d ثانية قبل + %d ثانية قبل + %d ثوان قبل + %d ثوان قبل + %d ثانية قبل + + + %d دقيقة قبل + %d دقيقة قبل + %d دقيقة قبل + %d دقائق قبل + %d دقيقة قبل + %d دقيقة قبل + + + %d ساعة قبل + %d ساعة قبل + %d ساعة قبل + %d ساعانت قبل + %d ساعة قبل + %d ساعة قبل + + + %d قبل يوم + %d قبل يوم + %d قبل يوم + %d قبل ايام + %d قبل ايام + %d قبل يوم + + + %d قبل أسبوع + %d قبل أسبوع + %d قبل أسبوع + %d قبل أسابيع + %d قبل أسابيع + %d قبل أسبوع + + + %d قبل شهر + %d قبل شهر + %d قبل شهر + %d قبل أشهر + %d قبل شهر + %d قبل شهر + + + %d قبل سنة + %d قبل سنة + %d قبل سنتان + %d قبل سنين + %d قبل سنوات + %d قبل اعوام + + + + %d ثانية + %d ثانية + %d ثانية + %d ثوان + %d ثوان + %d ثانية + + + %d دقيقة + %d دقيقة + %d دقيقة + %d دقائق + %d دقائق + %d دقيقة + + + %d ساعة + %d ساعة + %d ساعة + %d ساعات + %d ساعات + %d ساعة + + + %d يوم + %d يوم + %d يوم + %d ايام + %d ايام + %d ايام + + + %d أسبوع + %d أسبوع + %d أسبوع + %d أسابيع + %d أسابيع + %d أسبوع + + + %d شهر + %d شهر + %d شهر + %d أشهر + %d أشهر + %d شهر + + + %d سنة + %d سنة + %d سنة + %d سنوات + %d سنة + %d سنة + + + الوقت المتبقي حتي ينطفئ المنبه:\n%s + الوقت المتبقي حتي يتم تشغيل التذكير:\n%s + الوقت المتبقي: +\n%s + يرجى التأكد من أن المنبه يعمل بشكل صحيح قبل الإعتماد عليه. قد يسيء التصرف بسبب قيود النظام المتعلقة بتوفير البطارية. + يرجى التأكد من أن التذكيرات تعمل بشكل صحيح قبل الإعتماد عليها قد يسيء التصرف بسبب قيود النظام المتعلقة بتوفير البطارية. + تم تعطيل إشعارات هذا التطبيق. يرجى الإنتقال إلى إعدادات جهازك لتمكينها. + + المنبه + الغفوة + رفض + لا يوجد تذكير + في البداية + أصوات النظام + الأصوات الخاصة بك + إضافة صوت جديد + لا يوجد صوت + خلال النهار في hh: mm + خلال النهار في %02d: %02d + + الإعدادات + شراء تطبيق (Simple Thank You) + عام + تخصيص الألوان + تحسين تكييف الألوان + تخصيص الألوان + تخصيص الألوان (مقفل) + مقفل + تخصيص ألوان الويدجت + تخصيص اﻹشعارات + Notification sound + استخدام اللغة الإنجليزية + اللغة + إظهار العناصر المخفية + حجم الخط + صغير + متوسط + كبير + كبير جداً + حماية رؤية العناصر المخفية بكلمة مرور + حماية التطبيق بأكمله بكلمة مرور + حماية حذف الملفات ونقلها بكلمة مرور + الإحتفاظ بالقيمة القديمة التي تم تعديلها مؤخراً في عمليات الملفات + إظهار فقاعة معلومات عند تمرير العناصر عن طريق سحب شريط التمرير + منع الهاتف من السكون أثناء وجود التطبيق في المقدمة + تخطي مربع حوار تأكيد الحذف دائماً + تمكين السحب للتحديث من أعلي + استخدام تنسيق الوقت 24 ساعة + تغيير تنسيق التاريخ والوقت + بداية الأسبوع يوم الأحد + الويدجت + استخدام نفس مدة الغفوة دائماً + مدة الغفوة + الإهتزاز عند الضغط على الأزرار + نقل العناصر إلى "سلة المحذوفات" بدلاً من حذفها + الفاصل الزمني لتنظيف "سلة المحذوفات" + إفراغ "سلة المحذوفات" + فرض الوضع العمودي + إعدادات التصدير + إعدادات الإستيراد + تم تصدير الإعدادات بنجاح + تم إستيراد الإعدادات بنجاح + الاسم يبدأ بالشهرة + مسح ذاكرة التخزين المؤقت + إظهار مربع حوار تأكيد الاتصال قبل بدء مكالمة + + الرؤية + الأمان + التمرير + عمليات الملفات + سلة المحذوفات + جارٍ الحفظ + بدء التشغيل + النص + إعدادات التصدير / الإستيراد + الجودة + الصفحة الرئيسيّة + الصور المصغّرة + List view + + استبعاد + استبعد المجلد + المجلدات المستبعدة + (مستبعد) + إدارة المجلدات المستبعدة + إزالة الكل + هل تريد إزالة كافة المجلدات من قائمة المجلدات المستبعدة؟ لن يؤدي هذا إلى حذف المجلدات. + إظهار الملفات المستبعدة مؤقتًا + إيقاف عرض الملفات المستبعدة + + إدارة التابات المعروضة + اختر ما يُفتح عند بدء التطبيق + جهات الاتصال + المفضّلات + سجل المكالمات + المجموعات + آخر استخدام + Files + Recent files + + إستعادة هذا الملف + إستعادة الملفات المحددة + إستعادة كل الملفات + تم إفراغ "سلة المحذوفات" بنجاح + تم إستعادة الملفات بنجاح + هل تريد بالتأكيد إفراغ "سلة المحذوفات" ؟ سيتم فقدان الملفات نهائياً. + سلة المحذوفات فارغة + تم تعطيل نقل عناصر سلة المحذوفات، يرجى استخدام استعادة + إظهار سلة المحذوفات + إخفاء سلة المحذوفات + فتح سلة المحذوفات + تخطي سلة المحذوفات ، وحذف الملفات مباشرة + + نقل عنصر %d إلى سلة المحذوفات + نقل عنصر %d إلى سلة المحذوفات + نقل عنصر %d إلى سلة المحذوفات + نقل عناصر %d إلى سلة المحذوفات + نقل عناصر %d إلى سلة المحذوفات + نقل عنصر %d إلى سلة المحذوفات + + + جارٍ الإستيراد… + جارٍ التصدير… + تم الإستيراد بنجاح + تم التصدير بنجاح + فشل الإستيراد + فشل التصدير + فشل إستيراد بعض الإدخالات + فشل تصدير بعض الإدخالات + لا يوجد إدخالات للإستيراد + لم يتم العثور على إدخالات جديدة للاستيراد + لا توجد إدخالات للتصدير + النسخ الاحتياطية + تمكين النسخ الاحتياطي التلقائي + إدارة النسخ الاحتياطية التلقائية + يمكنك استخدام الأنماط التالية لتسمية الملف تلقائيا: +\n +\n%Y - السنة +\n%M - الشهر +\n%D - اليوم +\n%h - ساعة +\n%m - دقيقة +\n%s - الثانية + + الـ USB + يبدو أن لديك جهاز USB متصل بجهازك. للتأكد من ظهور ملفاته بشكل صحيح ، تحتاج إلى منح أذونات إضافية. + يرجى إختيار المجلد العلوي لجهاز الـ USB على الشاشة التالية ، لمنح صلاحيات الوصول + تم تحديد مجلد خاطئ، يرجى تحديد المجلد الأصلي لجهاز الـ USB الخاص بك + + يناير + فبراير + مارس + أبريل + مايو + يونيه + يوليه + أغسطس + سبتمبر + أكتوبر + نوفمبر + ديسمبر + + Jan + Feb + Mar + Apr + May + June + July + Aug + سبتمبر + Oct + Nov + Dec + + في يناير + في فبراير + في مارس + في أبريل + في مايو + فى يونيه + في يوليه + في أغسطس + في سبتمبر + في أكتوبر + في نوفمبر + في ديسمبر + الإثنين + الثلاثاء + الأربعاء + الخميس + الجمعة + السبت + الأحد + ن + ث + ر + خ + ج + س + ح + إثنين + ثلاث + أربع + خميس + جمعة + سبت + حد + + لن يتم تحديث إصدار التطبيق الخاص بك بعد الآن. يرجى الترقية إلى الإصدار (Pro) لتلقي الإصلاحات الجديدة وغيرها من التحسينات. + لن يتم تحديث إصدار التطبيق الخاص بك بعد الآن. يرجى الترقية إلى الإصدار (Pro) لتلقي الإصلاحات الجديدة وغيرها من التحسينات من خلال النقر هنا. + إنه مجاني حتى: %s. إذا قمت بتنزيله حتى ذلك الحين، سوف تتمكن من استخدامه مجاناً إلى الأبد. + المزيد من المعلومات + ترقية + يجب عليك ترحيل الأحداث المخزنة محلياً يدوياً عن طريق التصدير في ملف .ics ، ثم الإستيراد. يمكنك العثور على أزرار التصدير / الإستيراد في قائمة الشاشة الرئيسية. + مرحبًا +\n +\nيبدو أنك قمت بالترقية للتو من الإصدار المجاني. بمجرد أن تكون راضيا عن هذا وربما تقوم بترحيل إعداداتك ومفضلاتك ، يمكنك إلغاء تثبيت الإعداد المجاني القديم لتجنب تشغيله عن طريق الخطأ لأنك لن تحتاج إليه بعد الآن. +\n +\nشكرا! + مرحبًا، +\n +\nيبدو أن لديك بالفعل إصدار تطبيق Pro أيضًا. بمجرد أن تكون سعيدًا به وربما تقوم بترحيل الإعدادات والمفضلات الخاصة بك ، يمكنك إلغاء تثبيت هذا لتجنب تشغيله عن طريق الخطأ لأنك لن تحتاج إليه بعد الآن. +\n +\nشكرًا! + مرحبًا +\n +\nيبدو أنك قمت بالترقية للتو من الإصدار المجاني. بمجرد أن تكون راضيا عن هذا وربما تقوم بترحيل بياناتك ، يمكنك إلغاء تثبيت الإصدار المجاني القديم لتجنب تشغيله عن طريق الخطأ لأنك لن تحتاج إليه بعد الآن. +\n +\nشكرا! + مرحبًا +\n +\nيبدو أن لديك بالفعل إصدار تطبيق Pro أيضا. بمجرد أن تكون راضيا عنها وربما تقوم بترحيل بياناتك ، يمكنك إلغاء تثبيت هذا الجهاز لتجنب تشغيله عن طريق الخطأ لأنك لن تحتاج إليه بعد الآن. +\n +\nشكرا! + مرحبًا +\n +\nيبدو أنك قمت بالترقية للتو من الإصدار المجاني. إذا كنت ترغب في ترحيل الأحداث المخزنة محليا ، فيجب عليك القيام بذلك يدويا عن طريق تصديرها إلى ملف .ics في إصدار التطبيق المجاني واستيرادها هنا من خلال القائمة العلوية. +\n +\nبمجرد أن تشعر بالرضا عن الإعداد الخاص بك في الإصدار Pro ، يمكنك إلغاء تثبيت الإصدار المجاني القديم حيث لن تحتاج إليه بعد الآن. +\n +\nشكرا! + مرحبًا +\n +\nيبدو أنك قمت بالترقية للتو من الإصدار المجاني. إذا كان لديك أي جهات اتصال مخزنة ضمن \"%s\" ، فيجب عليك ترحيلها يدويا عن طريق التصدير في ملف .vcf من إصدار التطبيق المجاني والاستيراد هنا من خلال القائمة العلوية. +\n +\nبمجرد أن تشعر بالرضا عن الإعداد الخاص بك في الإصدار Pro ، يمكنك إلغاء تثبيت الإصدار المجاني القديم حيث لن تحتاج إليه بعد الآن. +\n +\nشكرا! + مرحبًا +\n +\nيبدو أنك قمت بالترقية للتو من الإصدار المجاني. إذا كنت ترغب في ترحيل ملاحظاتك ، فعليك القيام بذلك يدويا عن طريق تصديرها إلى ملف في إصدار التطبيق المجاني والاستيراد هنا من خلال القائمة العلوية. +\n +\nبمجرد أن تشعر بالرضا عن الإعداد الخاص بك في الإصدار Pro ، يمكنك إلغاء تثبيت الإصدار المجاني القديم حيث لن تحتاج إليه بعد الآن. +\n +\nشكرا! + + حول + Website + للحصول علي أكواد المصدر، تفضل بزيارة + أرسل ملاحظاتك أو اقتراحاتك إلى + االترقية إلى الإصدار البرو (Pro) + المزيد من التطبيقات + المزيد من تطبيقاتنا + دعوة الأصدقاء + مهلاً, تعال تحقق من %1$s فى %2$s + دعوة عبر + قيمنا + تقييم + تبرع + تابعنا + v %1$s\nحقوق النشر © Simple Mobile Tools %2$d + Support + Help us + Social + Other + سياسة الخصوصية + Version %s + مرحبًا :) + صنع بـ ❤️ في سلوفاكيا + معلومات إضافية + إصدار التطبيق: %s + نظام تشغيل الجهاز: %s + +
    + أتمني أن مستمتعاً بالتطبيق. الذي لا يحتوي على إعلانات ، يرجى دعم تطويره من خلال شراء تطبيق Simple Thank Youسيمنع هذا مربع الحوار من الظهور مرة أخرى.

    + شكرا! + ]]> +
    + مرحبا ، <br><br>آمل أن تستمتع بالتطبيق. لا يحتوي على إعلانات ولا نجمع بياناتك أيضا ، يرجى دعم تطويره عن طريق شراء <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple شكرا لك.</a> سيكون لديك أيضا جميع ميزات التطبيق بما في ذلك تخصيص الألوان غير مقفلة. <br><br>شكرًا لك! + ادعمنا عن طريق شراء <a href = https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple شكرا لك</a> من فضلك ، كما أنه سيفتح جميع ميزات التطبيق بما في ذلك تخصيص الألوان. + شراء + احصل على هاتف بسيط + يرجى تحديث تطبيق (Simple Thank You) إلى أحدث إصدار + قبل ان تسأل سؤالاً ، يرجى التحقق من إعدادات التطبيق وقراءة الأسئلة المتداولة أولاً. ربما يكون الحل موجوداً. + قبل أن تقيمنا ، يرجى التحقق من إعدادات التطبيق وقراءة الأسئلة الشائعة أولاً. إذا كان لديك أي مشاكل ، فربما يكون الحل موجوداً. + تأكد أيضاً من أنك تستخدم أحدث إصدار من التطبيق. + لاحظ أيضًا أن إصدار التطبيق هذا لم يعد قيد التطوير ، احصل على الإصدار الاحترافي للعديد من التحسينات. + اقرأها + إقرأ الأسئلة المتداولة + مرحباً,\n\nيبدو أنك تستخدم هذا التطبيق لفترة طويلة بالفعل, ونحن نقدر ذلك حقاً.\n\nإذا استطعنا أن نطلب منك خدمة, فيرجى تقييمنا على Google Play. هذا سيساعدنا كثيراً \n\nوبغض النظر عن قرارك, لن تري هذه الرسالة مره أخري.\n\nشكراً! + قيم تطبيقنا من فضلك :) + شكراً جزيلاً + الأداة مقفلة. +\nيرجى الترقية إلى إصدار Pro لإلغاء قفله. + هذه الميزة مقفلة ، يرجى شراء <a href = https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple شكرا لك</a> على إلغاء قفل التطبيق الكامل ، <br><br>إنها دفعة لمرة واحدة فقط وإذا لم تكن راضيا ، فيمكننا رد الأموال إليك. + + +
    + فقط لإخبارك أنه تم إصدار تطبيق جديد مؤخراً:

    + %2$s

    + %4$s

    + %6$s

    + يمكنك تنزيله بالضغط على العنوان.

    + شكراً + ]]> +
    + درج التطبيقات البسيط + الحاسبة البسيطة + التقويم البسيط + الكاميرا البسيطة + الساعة البسيطة + Simple Contacts + الهاتف البسيط + الرسام البسيط + Simple File Manager + مصباح يدوي بسيط + الاستديو البسيط + لوحة مفاتيح بسيطة + مشغل التطبيق البسيط + مشغل موسيقى بسيط + Simple Notes + الرسائل البسيطة + البسيط (شكراً لكم) + مسجل صوت البسيط + مشغل التطبيق + الحاسبة + التقويم + الكاميرا + الساعة + جهات الإتصال + الهاتف + الرسام + مدير الملفات + المصباح + الاستديو + لوحة المفاتيح + المشغل + مشغل الموسيقى + الملاحظات + الرسائل القصيرة + شكرًا لك + مسجل الصوت + + من هنا. + ]]> + + + الأسئلة المتداولة + قبل أن تسأل سؤالاً ، يرجى قراءة أولاً + كيف لا أرى هذه التطبيقات في قائمة التطبيقات المصغّرة (الويدجت)؟ + وهو على الأرجح لأنك قمت بنقل التطبيق على بطاقة الذاكرة (SD) هناك حد لنظام أندرويد يقوم باخفاء (الويدجت) للتطبيق المحدد في هذه الحالة يتمثل الحل الوحيد في نقل التطبيق مرة أخرى إلى وحدة التخزين الداخلية من خلال إعدادات جهازك. + أريد ان أدعمكم لكن لا يمكنني التبرع بالمال هل هناك أي شيء آخر يمكنني فعله ؟ + نعم بالطبع. يمكنك نشر الكلمة حول التطبيقات أو تقديم ملاحظات وتقييمات جيدة. يمكنك أيضا المساعدة عن طريق ترجمة التطبيقات بلغة جديدة ، أو مجرد تحديث بعض الترجمات الموجودة. دليل الترجمة موجود على <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file> هذا الموقع</a>، أو فقط اتصل بنا على <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> إذا كان لديك أي أسئلة. + قمت بحذف بعض الملفات عن طريق الخطأ، كيف يمكنني إسترجاعها؟ + للأسف، لا يمكنك. يتم حذف الملفات فوراً بعد مربع حوار التأكيد، لا توجد سلة محذوفات متاحة. + أنا لا أحب ألوان (الويدجت)، هل يمكنني تغييرها؟ + نعم، عند سحب الويدجت على شاشتك الرئيسية ستظهر شاشة إعدادات الويدجت. سترى المربعات الملونة في الزاوية اليسرى السفلى، فقط اضغط عليها لاختيار لون جديد. يمكنك استخدام شريط التمرير لضبط الشفافية أيضاً. + هل يمكنني بطريقة ما إسترجاع الملفات المحذوفة؟ + إذا تم حذفها بالفعل ، لا يمكنك ذلك. ومع ذلك ، يتم تمكين "سلة المحذوفات" إفتراضياً ، مما يؤدي إلى نقل الملفات في "سلة المحذوفات" بدلاً من حذفها. + أختفت أيقونة مشغل التطبيق. ماذا يمكنني أن أفعل؟ + سبب ذلك عدم دعم المشغّل لتخصيص الأيقونة بشكل صحيح. حاول تشغيل التطبيق من خلال Google Play أو بعض التطبيقات المصغرة (الويدجت)، إذا كان متوفراً. بمجرد تشغيله، قم فقط بإرجاع الأيقونة البرتقالية الإفتراضية #F57C00. قد تضطر إلى إعادة تثبيت التطبيق في أسوأ الحالات. + تم خصم المال من حسابي البنكي ، لكن لا يمكنني تنزيل التطبيق. ماذا يمكنني أن أفعل؟ + تتم معالجة المدفوعات بالكامل بواسطة Google ، حيث يتسبب نظامها في خلل من وقت لآخر. فقط قم بمسح ذاكرة التخزين المؤقت للتطبيق في Google Play وإعد تشغيل جهازك ، ثم أعد محاولة تنزيله. + لماذا يجب عليا الترقية إلى الإصدار البرو (Pro)? + نظراً لأن إصدار التطبيق الخاص بك لم يعد محدثاً ، فلن يتم إصلاح الأخطاء التي إكتشافها. كما لن تتم إضافة وظائف جديدة . يمكنك شراء الإصدار الـ Pro على Google Play مقابل مبلغ صغير من المال. إنها دفعة لمرة واحدة،مما يعني أنه بمجرد شرائه ، لن تضطر إلى الدفع مرة أخرى. ليس حتى بعد الحصول على جهاز جديد. إذا كنت لا تحب إصدار Pro ، يمكنك إلغاء تثبيته في غضون ساعات قليلة وستحصل على أموالك تلقائياً.إذا كنت تريد إسترداد الأموال في أي وقت لاحق ، فأتصل بنا على hello@simplemobiletools.com وستحصل عليه. + كيف يمكنني تحديد عناصر متعددة في وقت واحد؟ + هناك طرق متعددة للقيام بذلك. الأول هو بدء وضع التحديد عن طريق الضغط لفترة طويلة على عنصر واحد ، ثم النقر باختصار على العناصر الأخرى لتحديدها. الطريقة الثانية مشابهة لاختيار العناصر على أجهزة الكمبيوتر باستخدام الماوس ، فقط ابدأ وضع التحديد بالضغط مطولاً على عنصر واحد ، ثم مع استمرار إصبعك في السحب لأسفل عبر العناصر الأخرى للاختيار. الطريقة الثالثة لاختيار عدة عناصر هي الضغط لفترة طويلة على عنصر واحد ، ثم الضغط لفترة طويلة على عنصر آخر ويتم تحديد كل شيء بينهما. إذا كنت ترغب في تحديد جميع العناصر ، فما عليك سوى الضغط لفترة طويلة على عنصر واحد ، ثم النقر فوق عداد العناصر المحدد في الزاوية اليسرى العليا. سيؤدي ذلك إلى تحديد أو إلغاء تحديد كل شيء. + لقد اشتريت التطبيق ، لكن لا يمكنني تنزيله على جهاز آخر. + جرب محو ذاكرة التخزين المؤقت لتطبيق Google Play وإعادة تشغيل جهازك. إنه خلل في Google Play ، لا يرتبط حقا بالتطبيق نفسه. + + المساهمون + الترجمة + التطوير + Other help + تحتوي هذه القائمة على كل شخص ساعد بشكل ملحوظ أي تطبيق داخل مجموعة Simple Mobile Tools ، وليس هذا التطبيق فقط. يتم التعامل مع الترجمات من قبل متطوعين ، أخبرنا إذا كنت تريد المساعدة أيضا. دليل الترجمة موجود على <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file> هذا الموقع</a>، أو فقط اتصل بنا على <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> إذا كان لديك أي أسئلة. شكرا لجميع المساهمين والداعمين الآخرين! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + احصل على الإصدار المحترف الآن! + أساسي + Pro + لا إعلانات + لا يوجد اتصال بالإنترنت + ضمان استرداد الأموال بنسبة 100٪ + دفعة لمرة واحدة + تصميم مطور + + محرر متقدم للصور + محرر صور وفيديو متقدم + دعم ملف HEIC / HEIF + إعادة تسمية ملف الدفعة المتقدمة + تأمين المجلد الفردي + دعم الطباعة + + دعم المنطقة الزمنية + الحضور وتذكيرات البريد الإلكتروني + استيراد سهل للأحداث + عناصر واجهة مستخدم جديدة + + تحسين دمج جهات الاتصال المكررة + تخصيص حجم الخط + مشاركة جهات الاتصال الخاصة الاختيارية داخل تطبيقاتنا + نغمات رنين جهات اتصال قابلة للتخصيص + تصفية جهات الاتصال + جهات الاتصال المخزنة بشكل خاص + + القوائم + ملاحظة وألوان مختلفة لكل عنصر واجهة مستخدم + قفل الملاحظات + + تخصيص تنسيق التاريخ والوقت + اختصارات الشاشة الرئيسية + File compression support + Tab with recent files + + تخصيص لون الخلفية + دعم استيراد الملفات + التكبير + + يستخدم هذا التطبيق مكتبات الجهات الخارجية التالية لتسهيل حياتي.شكراً. + تراخيص الجهات الخارجية + كوتلن(لغة البرمجة) + الصور القابلة للتكبير + تحميل الصور وتخزينها المؤقت) + بيكاسو (تحميل الصور وذاكرة التخزين المؤقت) + إقتصاص الصورة وتدويرها + السحب من اليمين إلى اليسار + جودا تايم (إستبدال تاريخ الجافا) + ستيثو (تصحيح قواعد البيانات) + أوتو (ناقل الأحداث) + عرض الصورة (الصور المتحركة "GIF" القابلة للتكبير) + نمط الحماية + بصمة الحماية + تحميل الصور المتحركة (GIF) + تغيير حجم النص + إطار الإختبار + إسبرسو (مساعد الإختبار) + محلل جسون + كاشف تسرب الذاكرة + إختيار الأرقام القابل للتخصيص + مشغل الفيديو (Exo) + عرض بانوراما VR (عرض البانورامات) + أباتشي سانسيلان (قراءة البيانات الوصفية للصور) + فلاتر الصور + الصور القابلة للتكبير + التمرير السريع للمؤشر (الحروف على شريط التمرير) + ناقل الحدث (التواصل داخل التطبيق) + عرض سجل الصوت (التصور الصوتي) + SMS MMS (معالجة الرسائل القصيرة ورسائل الوسائط المتعددة) + APNG Android (دعم WebP المتحرك) + برنامج PDFViewPager (عارض PDF) + محلل M3U (معالجة ملف قائمة التشغيل m3u) + AndroidLame (برنامج ترميز mp3) + + انتهت صلاحية الإصدار التجريبي + بدء الإصدار التجريبي المجاني + تنتهي صلاحية الإصدار التجريبي قريبا. + افتح التطبيق ليوم أخير + مرحبا بكم في %s! + شكراً لك على استخدام تطبيقنا يمكنك استخدام هذه النسخة غير المقفلة لأيام %d . وحالما تنتهي التجربة، يرجى النظر في الترقية إلى النسخة الكاملة. ولها كمية كبيرة من الملامح الجديدة، والتصميم الحديث، ولا يحتوي اعلانات، وغير ذلك من التحسينات. +\n +\nعليك فقط أن تدفع ثمنها مرة واحدة في العمر وإذا لم تكن راضياً، يمكنك أن تلغي التثبيت وتحصل على أموالك +\n +\nأتمنى أن تعجبك + يرجى الترقية إلى الإصدار الاحترافي للاستمتاع بالتطبيق على أكمل وجه. +\n +\nعليك فقط أن تدفع ثمنها مرة واحدة في العمر وإذا لم تكن راضيًا ، يمكنك إلغاء تثبيتها واسترداد أموالك. +\n +\nاراك هناك :) + + تنتهي صلاحية الإصدار التجريبي في اليوم %d. + تنتهي صلاحية الإصدار التجريبي في اليوم %d. + تنتهي صلاحية الإصدار التجريبي في اليوم %d. + تنتهي صلاحية الإصدار التجريبي في %d ايام. + تنتهي صلاحية الإصدار التجريبي في %d ايام. + تنتهي صلاحية الإصدار التجريبي في اليوم %d. + + + لم يعد يجري العمل عليه: لم يعد هذا الإصدار من التطبيق يجري العمل عليه، قم بالحصول على الإصدار الـ Pro على https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + لا تنسى أنه إذا قمت بإلغاء تثبيت أي تطبيق مدفوع في غضون ساعتين ، فسيتم إسترداد أموالك تلقائياً. إذا كنت تريد إسترداد الأموال في أي وقت لاحق ، فأتصل بنا على hello@simplemobiletools.com وستحصل عليه. هذا يجعل من السهل تجربته :) + + مجموعة بسيطة، من تطبيقات أندرويد المفتوحة المصدر ذات الودجات القابلة للتخصيص، بدون إعلانات أو أذونات غير ضرورية. + \ No newline at end of file diff --git a/commons/src/main/res/values-az/strings.xml b/commons/src/main/res/values-az/strings.xml new file mode 100644 index 000000000..23526390f --- /dev/null +++ b/commons/src/main/res/values-az/strings.xml @@ -0,0 +1,1157 @@ + + + Oldu + Ləğv Et + Back + Nothing + Later + Saxla + Fayl uğurla saxlandı + Keçərsiz fayl formatı + Yaddaş doludur xətası + Xəta baş verdi: %s + Error: %s + Bununla aç + Edit with + Edit + Etibarlı tətbiq tapılmadı + No browser found + No email client found + Təyin et + Copy to clipboard + Copy number to clipboard + Miqdar panelə kopyalandı + Miqdar panelə kopyalandı:\n%s + Dial number + Bilinməyən + Həmişə + Heç vaxt + Detallar + Qeydlər + \'%s\' qovluğu silinir + Heçnə + Etiket + Transparent + Transparent color + Select a different color + Download + Notification + Notifications + Email + Əvvəlki + Oynat / Dayan + Sonrakı + Nömrə + No contacts found + Lazım olan icazələri istə + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + %s şəxsinə zng et + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Şəkil çək + Şəkil seç + Choose video + Choose contact + Choose file + Record audio + Record video + Yenilənir… + Telefon yaddaşı + Telefon yaddaşı (digər tətbiqlərə görünmür) + Audio + + + Ad günü + İl dönümü + + + Ev + İş + + + Mobil + Əsas + İş Faksı + Ev Faksı + Zəng cihazı + Heçbir telefon nömrəsi tapılmadı + + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + + Sevimlilər + Sevimlilər əlavə et + Sevimlilərə əlavə et + Sevimlilərdən sil + + + Axtar + Search in %s + Axtarışa başlamaq üçün ən az 2 simvol yazın. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + + Filtr + Filtr (Pro) + Heçnə tapılmadı. + Filtri dəyiş + + + Yaddaş icazəsi tələb olunur + Kontakt icazəsi tələb olunur + Kamera icazəsi tələb olunur + Səs icazəsi tələb olunur + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + + Faylı yenidən adlandır + Qovluğu yenidən adlandır + Faylı adlandırmaq olmur + Qovluğu adlandırmaq olmur + Qovluq adı boş ola bilməz + Bu adda qovluq artıq mövcuddur + Yaddaşın root qovluğunu adlandırmaq olmur + Qovluq uğurla adlandırıldı + Qovluq adlandırma + Fayl adı boş ola bilməz + Faylın adında etibarsız simvollar var + Fayl adı \'%s\' etibarsız simvollar ehtiva edir + Uzantı boş ola bilməz + Kök faylı %s yoxdur + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + + Kopyala + Yerini dəyiş + Kopyala / Yerini dəyiş + Bura kopyala + Yerini bura dəyiş + Kök + Hədəf + Hədəf seç + Hədəf seçmək üçün bura bas + Seçilmiş hədəfə yazmaq olmur + Xahiş olunur hədəf seçin + Kök və hədəf eyni ola bilməz + Faylları kopyalamaq olmur + Kopyalanır… + Fayl uğurla kopyalandı + File copied successfully + Xəta baş verdi + Yerini dəyişir… + Faylın yeri uğurla dəyişdirildi + File moved successfully + Bəzi faylların yeri dəyişdirilmir + Bəzi faylları kopyalamaq olmur + Fayl seçilməyib + Saxlanılır… + %s qovluğunu yaratmaq olmur + %s faylını yaratmaq olmur + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + + Yeni yarat + Qovluq + Fayl + Yeni qovluq yarat + Eyni adda fayl və ya qovluq artıq mövcuddur + Ad etibarsız simvollar ehtiva edir + Zəhmət olmasa adı daxil edin + Bilinməyən xəta baş verdi + + + \"%s\" faylı artıq mövcuddur + \"%s\" faylı artıq mövcuddur. Üzərinə yazılsın? + \"%s\" qovluğu artıq mövcuddur + Birləşdir + Keep both + Üzərinə yaz + Keç + \'_1\' ilə əlavə et + Hamsına şamil et + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + + Qovluq seç + Fayl seç + Xarici yaddaş icazəsini təsdiqlə + Confirm folder access + Xahiş olunur icazəni təsdiqləmək üçün gələcək ekranda SD kartın root qovluğunu seçin. + Əgər SD kart görünmürsə, bunu yoxlayın + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Seçimi təsdiqlə + Loading… + Please grant our app access to all your files, it might not work well without it. + + + %d fayl + %d fayl + + + + + %d fayl + %d fayl + + + + %d silinir + %d silinir + + + + + %d contact + %d contacts + + + + Yaddaş seç + Storage + Daxili + SD Kart + Root + Seçilən qovluq yanlışdır, xahiş olunur SD kartın root qovluğunu seçin + SD kart və USB cihaz yolu eyni ola bilməz + Görünür tətbiqi SD karta yükləmisiniz, bu widgetlərin işləməsinin qarşısını alır. Siz widgetləri əlçatan widgetlər siyahısında belə görə bilməyəcəksiniz. + Bu sistem məhdudiyyətidir, əgər vidjetlərin işləməsini istəyirsinizsə, tətbiqi daxili yaddaşa köçürməlisiniz. + Wrong folder selected, please select path \'%s\' + + + Xüsusiyyətlər + Yol + Fayl seçildi + Alt qovluq sayı + Bütün faylların sayı + Görüntü imkanı + Uzunluq + Müğənni + Albom + Fokus məsafəsi + Poza vaxtı + ISO sürəti + Diyafram + Kamera + EXIF + Musiqi başlığı + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + + Arxaplan rəngi + Yazı rəngi + Birinci rəng + Accent color of white theme + Accent color of Black & White theme + Önplan rəngi + Tətbiq ikonu rəngi + Bottom navigation bar color + Standarta qaytar + Use default + Default + Rəngi dəyiş + Mövzu + Rəngi dəyişmək onu Özəl mövzuya çevirəcək + Saxla + Yoxsay + Dəyişiklikləri geri al + Dəyişiklikləri geri almaq istədiyinizə əminsiniz? + This action cannot be undone. + Yadda saxlamadığınız dəyişikliklər var. Çıxmazdan əvvəl saxlanılsın? + Rəngləri bütün Simple Apps tətbiqlərinə şamil et + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Rənglər uğurla yeniləndi. \'Paylanmış\' adlı yeni tema əlavə edildi, xahiş olunur gələcəkdə bütün tətbiqlərin yeniləmələri üçün bundan istifadə edin. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Bu funksiyanı açdığınız və təkmilləşdirməni dəstəklədiyiniz üçün Sadə Təşəkkür. Çox Sağolun! + ]]> + + + + İşıqlı + Qaranlıq + Auto + Auto light / dark + Közərmiş + Qaraqırmızı + White + Ağ və Qara + Özəl + Paylanmış + System default + + + Yeni nə var + * burada yalnız böyük təzələmələr sıralanıb, həmişə əlavə yeniliklər də olur + + + Sil + Sil + Yenidən adlandır + Paylaş + Paylaş + Resize + Hamsını seç + Select text + Gizlət + Gizlətmə + Qovluğu gizlət + Qovluğu gizlətmə + Gizlənmişi müvəqqəti göstər + Gizlənmiş mediyanı göstərmə + Bu qədər faylı bir dəfəyə paylaşa bilməzsiniz + Zibil qutusunu boşalt və qapat + Geri al + Təkrar et + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + + Sırala + Ad + Ölçü + Son dəyişdirilən + Date created + Götürülmə tarixi + Başlıq + Fayl adı + Fayl çıxışı + Random + Sort randomly + Artan + Azalan + Yalnız bu qovluq üçün işlət + Sort numeric parts by actual value + Ad + Orta Ad + Soyad + Full name + Use custom sorting + Change order + + + Silmə prosesini təsdiqləyirsiniz? + %s faylı silmək istdəyinizə əminsiniz? + Delete %s? + %s\'i zibil qutusuna atmaq istədiyinizə əminsiniz? + Faylı silmək istədiyinizə əminsiniz? + Bu faylı zibil qutusuna atmaq istədiyinizə əminsiniz? + Bu oturumda birdə soruşma + Do not show again + Bəli + Xeyr + Maybe + + + WARNING: You are deleting %d folder + XƏBƏRDARLIQ: %d sayda qovluğu silirsiniz + + + + PIN + PIN\'i daxil edin + Xahiş olunur PIN\'i daxil edin + PIN yanlışdır + PIN\'i təkrarlayın + Model + Model daxil edin + Yanlış model + Modeli təkrarlayın + Biometrics + Barmaq izi + Barmaq izi əlavə et + Xahiş olunur barmağınızı barmaq izi sensoru üzərinə yerləşdirin + Open biometric ID verification dialog + Authenticate + Uyğunlaşdırma uğursuzdur + Uyğunlaşdırma bloklanıb, biraz sonra yoxlayın + Qeydiyyata alınmış heçbir barmaq izi yoxdur, xahiş olunur cihazınızın Parametrlərindən əlavə edəsiniz + Parametrlərə get + Şifrə təyini uğurludur. Əgər şifrəni unutsanız, tətbiqi yenidən yükləyin. + Qoruma təyini uğurludur. Əgər təzələmə problemi yaşasanız, tətbiqi yenidən yükləyin. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + + Dünən + Bugün + Sabah + Every day + Hide year + saniyələr + dəqiqələr + saatlar + günlər + s + m + h + wk. + + + %d saniyə + %d saniyə + + + %d dəqiqə + %d dəqiqə + + + %d saat + %d saat + + + %d gün + %d gün + + + %d həftə + %d həftə + + + %d ay + %d ay + + + %d il + %d il + + + + + %d saniyə + %d saniyə + + + %d dəqiqə + %d dəqiqə + + + %d saat + %d saat + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d saniyə əvvəl + %d saniyə əvvəl + + + %d dəqiqə əvvəl + %d dəqiqə əvvəl + + + %d saat əvvəl + %d saat əvvəl + + + %d gün əvvəl + %d gün əvvəl + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + + %d saniyə + %d saniyə + + + %d dəqiqə + %d dəqiqə + + + %d saat + %d saat + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + Zəng dayanana qədər qalan vaxt:\n%s + Xatırladıcının işləməsinə qalan vaxt:\n%s + Time remaining:\n%s + Xahiş olunur zəngə istinad etməzdən əvvəl işləyib işləmədiyini yoxlayın. Güc qoruma parametrləri onun işləməsində problem yarada bilər. + Xahiş olunur xatırladıcılara istinad etməzdən əvvəl işləyib işləmədiyini yoxlayın. Güc qoruma parametrləri onların işləməsində problem yarada bilər. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + + Zəng + Yuxu + Burax + Xatırladıcı yoxdur + Başlanğıcda + Sistem səsləri + Sizin səsləriniz + Yeni səs əlavə et + Səs yoxdur + During the day at hh:mm + During the day at %02d:%02d + + + Parametrlər + Sadə Təşəkkür\'ü Alın + General + Color customization + Improved color customization + Rəngləri dəyiş + Rəngləri dəyiş (Locked) + Locked + Widget rənglərini dəyiş + Customize notifications + Notification sound + İngilis dilində işlət + Language + Gizli faylları göstər + Yazı ölçüsü + Kiçik + Orta + Böyük + Çox böyük + Şifrə gizlənmiş tətbiqin görünürlüyünü qoruyur + Şifrə bütün tətbiqi qoruyur + Password protect file deletion and moving + Keep old last-modified value at file operations + Sürüşdürmə çubuğu ilə hərəkət zamanı məlumat ekranını göstər + Tətbiq aktiv halda olduqda telefonun yuxuya getməsinin qarşısını al + Silmə təsdiq dialoqunu göstərmə + Yuxarıdan çək-təzələ\'ni aç + 24 saat formatından istifadə et + Change date and time format + Həftəyə Bazar Ertəsindən başla + Widgetlər + Həmişə eyni yuxu intervalından istifadə et + Yuxu intervalı + Düyməyə toxunduqda titrə + Faylları silməkdənsə Zibil qutusuna at + Zibil qutusu təmizlik intervalı + Zibil qutusunu boşalt + Portret moduna zorla + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Ada soyaddan başla + Clear cache + Zəngə başlamazdan əvvəl zəng təsdiq pəncərəsi göstər + + + Görünürlük + Qoruma + Sürüşdürmə + Fayl əməliyyatları + Zibil Qutusu + Saxlama + Başlanğıc + Mətn + Migrating + Quality + Main screen + Thumbnails + List view + + + Exclude + Exclude folder + Excluded folders + (xaric edilmiş) + Manage excluded folders + Remove all + Remove all folders from the list of excluded\? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + + Göstərilən nişanları idarə et + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + + Bu faylı geri qaytar + Bu faylları geri qaytar + Bütün faylları geri qaytar + Zibil qutusu uğurla boşaldıldı + Fayllar uğurla geri qaytarıldı + Zibil qutusunu boşaltmaq istədiyinizə əminsiniz? Fayllar tamamilə itiriləcək. + Zibil qutusu boşdur + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + + Daxil edilir… + Çıxarılır… + Daxiletmə uğurludur + Çıxarış uğurludur + Daxiletmə uğursuzdur + Çıxarış uğursuzdur + Bəzi girişləri daxil etmək olmur + Bəzi girişləri çıxarmaq olmur + No entries for importing have been found + No new entries for importing have been found + Çıxarış üçün heçbir giriş tapılmadı + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Xahiş edirik icazə vermək üçün sonrakı ekranda çıxan USB cihazın root qovluğunu seçin + Yanlış qovluq seçilib, xahiş olunur USB cihazın root qovluğunu seçin + + + Yanvar + Fevral + Mart + Aprel + May + İyun + İyul + Avqust + Sentyabr + Oktyabr + Noyabr + Dekabr + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + + Yanvarda + Fevralda + Martda + Apreldə + Mayda + İyunda + İyulda + Avqustda + Sentyabrda + Oktyabrda + Noyabrda + Dekabrda + + Bazar Ertəsi + Çərşənbə Axşamı + Çərşənbə + Cümə Axşamı + Cümə + Şənbə + Bazar + + B.E + Ç.A + Ç + C.A + C + Ş + B + + Bzr.E + Çrş.A + Çrş + Cü.A + + Şnb + Bzr + + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hey,\n\nseems like you already have the Pro app version too. You will not need this one anymore, you can uninstall it. + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + + Haqqında + Website + Kök koda keçiş üçün + Geri dönüş və tövsiyələrinizi göndərin + Upgrade to Pro + Daha çox tətbiq + More apps from us + Dostları dəvət et + Ey! gəl sən də %2$s\'də %1$s\'ə nəzər yetir! + Dəvət et + Dəyərləndir + Rate + İanə et + İzlə + v %1$s\nMüəllif Hüquqları © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Əlavə məlumat + Tətbiq versiyası: %s + Cihaz ƏS: %s + +
    + arzu edirəm tətbiqdən zövq alırsan. Reklam ehtiva etmir, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Ödəniş Et + Get Simple Phone + Xahiş olunur Sadə Təşəkkür tətbiqini ən son versiyaya yeniləyin + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + + App Launcher + Kalkulyator + Təqvim + Kamera + Saat + Kontaktlar + Dialer + Çək + Fayl Meneceri + Fənər + Qalereya + Keyboard + Launcher + Musiqi Çalar + Qeydlər + SMS Messenger + Təşəkkürlər + Voice Recorder + + + here. + ]]> + + + + Tez-tez Soruşulan Suallar + Xahiş olunur sual verməmişdən qabaq aşağıdakı bölməni oxuyun + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + + Checklists + Different note and colors per widget + Note locking + + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + + Background color customization + File importing support + Zooming + + + Bu tətbiq həyatımı asanlaşdırmaq üçün aşağıdakı üçüncü partiya tətbiq kitabxanalarından istifadə edir. Təşəkkürlər. + Üçüncü partiya lisenziyaları + Kotlin (proqramlaşdırma dili) + Subsampling Scale Image View (yaxınlaşdırılan şəkillər) + Glide (şəkil açma və keşləmə) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-be/strings.xml b/commons/src/main/res/values-be/strings.xml new file mode 100644 index 000000000..110a17d19 --- /dev/null +++ b/commons/src/main/res/values-be/strings.xml @@ -0,0 +1,1167 @@ + + + Добра + Скасаваць + Назад + нічога + Пазней + Захаваць як + Файл паспяхова захаваны + Няправільны фармат файла + Памылка недахопу памяці + Адбылася памылка: %s + Памылка: %s + Адкрыць у… + Рэдагаваць у… + Рэдагаваць + Не знойдзена сапраўднае прыкладанне + Браўзер не знойдзены + Паштовы кліент не знойдзены + Ўсталяваць у якасці + Капіяваць у буфер абмену + Капіяваць нумар у буфер абмену + Значэнне скапіявана ў буфер абмену + Значэнне скапіявана ў буфер абмену:\n%s + Набраць нумар + Невядомы + Заўжды + Ніколі + Звесткі + Нататкі + Выдаленне папкі \'%s\' + Няма + Метка + Празрысты + Празрысты колер + Выберыце іншы колер + Спампаваць + Апавяшчэнне + Апавяшчэння + Электронная пошта + Папярэдняя + Прайграванне / Паўза + Наступная + Нумар + Кантакты не знойдзены + Запытайце неабходныя дазволы + Праграма не можа атрымаць доступ да вашых кантактаў + Прыкладанне не мае дазволу ініцыяваць тэлефонныя званкі, дайце яго ў наладах прылады + Устаўце сюды тэкст + Выклік %s + Пацвердзіце выклік %s + Нуль + Адзін + Два + Тры + Чатыры + Пяць + Шесць + Сем + Восем + Дзевяць + Значэнне + Значэнне не можа быць пустым + Стварыць новы кантакт + Дадаць да існуючага кантакту + Прыкладанне пашкоджана + Адмова ад адказнасці + Зрабіць фота + Выбраць фота + Выберыце відэа + Выберыце кантакт + Выберыце файл + Запіс аўдыё + Запісаць відэа + Абнаўленне… + Сховішча тэлефона + Сховішча тэлефона (не бачна іншым праграмам) + Audio + + Дзень нараджэння + Гадавіна + + Хатні + Працоўны + + Мабільны + Галоўны + Працоўны факс + Хатні факс + Пейджар + Нумар тэлефона не знойдзены + + Выгляд + Табліца + Табліца (Pro) + Няроўная сетка + Спіс + Павялічыць колькасць слупкоў + Паменьшіць колькасць слупкоў + Колькасць слупкоў + Колькасць слупкоў у партрэтным рэжыме + Колькасць слупкоў у ландшафтным рэжыме + Змяніць вокладку + Выбраць фота + + %d слупок + %d слупкі + %d слупкоў + %d слупкоў + + + Кіраванне заблакаванымі нумарамі + Заблакаваныя нумары не знойдзены. + Дадаць заблакаваны нумар + Блакаваць нумар + Блакаваць нумары + Заблакаваныя нумары + Экспартаваць заблакаваныя нумары + Імпартаваць заблакаваныя нумары + Вы павінны зрабіць гэта дадатак стандартным дадаткам дазвону, каб выкарыстоўваць заблакіраваныя нумары. + Ўсталяваць па змаўчанні + Заблакаваць \"%s\"\? + Блакаваць выклікі ад невядомых кантактаў + Блакаваць паведамленні ад невядомых кантактаў + Увядзіце нумар або шаблон (напрыклад, *12345*, +1*8888), каб заблакіраваць усе выклікі і паведамленні з нумароў, якія адпавядаюць шаблону. + Немагчыма заблакіраваць невядомыя нумары без дазволу ідэнтыфікатара абанента. + + Абраныя + Дадаць абранае + Дадаць у абранае + Выдаліць з абранага + + Пошук + Пошук у %s + Каб пачаць пошук, увядзіце мінімум 2 сімвалы. + Пошук кантактаў + Пошук абраных + Пошук праграм + Пошук падзей + Пошук груп + Гісторыя пошуку + Пошук званкоў + Пошук файлаў + Пошук тэчак + Пошук файлаў і тэчак + Пошук па плэйлістах + Пошук выканаўцаў + Пошук альбомаў + Пошук трэкаў + Пошук тэксту + Пошук размоў + Пошук запісаў + + Фільтр + Фільтр (Pro) + Нічога не знойдзена. + Змяніць фільтр + + Патрабуецца дазвол на доступ да сховішча + Патрабуецца дазвол на доступ да кантактаў + Патрабуецца дазвол на доступ да камеры + Патрабуецца дазвол на доступ да мікрафону + Няма дазволу + Вы павінны дазволіць праграме паказваць апавяшчэнні, інакш яна не можа паказваць напаміны. + Вы павінны дазволіць праграме паказваць апавяшчэнні, у адваротным выпадку яна не можа паказваць панэль прагрэсу. + Вы павінны дазволіць праграме паказ апавяшчэнняў, інакш яна не можа прайграваць песні. + Вы павінны дазволіць праграме паказ апавяшчэнняў, у адваротным выпадку яна не можа запісваць аўдыя. + Вы павінны дазволіць праграме паказваць апавяшчэнні, інакш яна не зможа паказваць ўваходныя выклікі. + Вы павінны дазволіць праграме паказваць апавяшчэнні, у адваротным выпадку яна не можа паказваць ўваходныя паведамленні. + Даць дазвол + Патрабуецца дазвол + + Перайменаваць файл + Перайменаваць папку + Не атрымалася перайменаваць файл + Не атрымалася перайменаваць папку + Назва папкі не можа быць пустой + Папка з такой назвай ужо існуе + Немагчыма перайменаваць каранёвую папку + Папка паспяхова перайменавана + Перайменаванне папкі + Назва файла не можа быць пустой + Імя файла змяшчае недапушчальныя сімвалы + Імя файла\'%s\' змяшчае недапушчальныя сімвалы + Пашырэнне не можа быць пустым + Зыходны файл %s не існуе + Перад назвай файла + Пасля назвы файла + Простае перайменаванне + Шаблон + Радок для дадання + %Y - год +\n%M - месяц +\n%D - дзень +\n%h - гадзіна +\n%m - хвіліна +\n%s - секунда +\n%i - парадкавы нумар з 1 + Назва файла (без .txt) + Назва файла (без .json) + Назва файла (без .zip) + Пачынаючы з Android 11 вы больш не можаце такім чынам хаваць файлы і тэчкі + + Капіяваць + Перамясціць + Капіяваць/перамясціць + Капіяваць у… + Перамясціць у… + Крыніца + Мэта + Выберыце пункт прызначэння + Націсніце тут, каб выбраць пункт прызначэння + Немагчыма запісаць у выбраны пункт прызначэння + Выберыце пункт прызначэння + Крыніца і пункт прызначэння не могуць быць аднолькавымі + Не атрымалася скапіяваць файлы + Капіяванне… + Капіяванне файлаў паспяхова выканана + Капіяванне файла паспяхова выканана + Адбылася памылка + Перамяшчэнне… + Перамяшчэнне файлаў паспяхова выканана + Перамяшчэнне файла паспяхова выканана + Не атрымалася перамясціць некаторыя файлы + Не атрымалася скапіяваць некаторыя файлы + Файлы не выбраны + Захаванне… + Не атрымалася стварыць папку %s + Не атрымалася стварыць файл %s + Новых элементаў не знойдзена + У пункце прызначэння недастаткова месца.\nабавязковы%1$s, даступны%2$s + Сістэмная служба выбару файлаў і тэчак недаступная + + Стварыць + Папка + Файл + Стварыць новую папку + Папка альбо файл з такой назвай ужо існуе + Імя змяшчае недапушчальныя сімвалы + Увядзіце назву + Адбылася невядомая памылка + + Файл \"%s\" ужо існуе + Файл \"%s\" ужо існуе. Перазапісаць\? + Папка \"%s\" ужо існуе + Аб\'яднаць + Захаваць абодва + Перазапісаць + Прамінуць + Далучыць \'_1\' да назвы + Ужыць да ўсіх + Сістэма не дазваляе аперацыю ў гэтай папцы, абярыце іншую папку + Сістэма не дазваляе капіяванне ў гэту папку, абярыце іншую папку + Сістэма не дазваляе перайменаванне ў гэтай папцы + Немагчыма перайменаваць папкі непасрэдна ва ўнутранай памяці, толькі падпапкі + Немагчыма перайменаваць гэту тэчку + + Выбраць папку + Выбраць файл + Пацвердзіце доступ да вонкавага сховішча + Пацвердзіце доступ да папкі + Выберыце верхнюю папку SD-карты на наступным экране, каб даць доступ для запісу + Калі вы не бачыце SD-карту, паспрабуйце гэта + Калі ласка, дазвольце праграме доступ да выбранага сховішча на наступным экране, націснуўшы \"Выкарыстоўваць гэту тэчку\" ўнізе. + Калі ласка, дазвольце доступ \'%s\' на наступным экране, націснуўшы \'Выкарыстоўвайце гэтую тэчку\' на дне. + Калі ласка, націсніце \'Захаваць\' унізе наступнага экрана, каб стварыць новую тэчку. + Пацвердзіце выбар + Загрузка… + Дайце нашаму прылажэнню доступ да ўсіх вашых файлаў, без гэтага яно можа працаваць дрэнна. + + %d элемент + %d элемента + %d элементаў + %d элементаў + + + + %d элемент + %d элемента + %d элементаў + %d элементаў + + + Выдаленне %d элемента + Выдаленне %d элементаў + Выдаленне %d элементаў + Выдаленне %d элементаў + + + + %d кантакт + %d кантакта + %d кантактаў + %d кантактаў + + + Выбраць сховішча + Сховішча + Унутраны + SD-карта + Корань + Выбрана няправільная папка, абярыце галоўную папку вашай SD-карты + Шляхі SD-карты і USB-прылад не могуць супадаць + Здаецца, у вас усталявана праграма на SD-карце, што робіць віджэты праграмы недаступнымі. Вы нават не ўбачыце іх у спісе даступных віджэтаў. Гэта сістэмнае абмежаванне, таму, калі вы хочаце выкарыстоўваць віджэты, вам трэба перанесці праграму назад ва ўнутраную памяць. + Выбрана няправільная папка, выберыце шлях \'%s\' + + Уласцівасці + шлях + Элементы выбраны + Прамы падлік дзяцей + Агульная колькасць файлаў + Разрозненне + Працягласць + Выканаўца + Альбом + Фокусная адлегласць + Вытрымка + Святлоадчувальнасць + Адносная адтуліна + Камера + EXIF + Назва кампазіцыі + Каардынаты GPS + Вышыня над узроўнем мора + Выдаліць EXIF + Вы ўпэўнены, што жадаеце выдаліць значэнні EXIF, такія як каардынаты GPS, мадэль камеры і г.д.\? + Даныя EXIF паспяхова выдалены + + Колер фону + Колер тэксту + Асноўны колер + Акцэнтны колер белай тэмы + Чорны акцэнтны колер + Колер пярэдняга плана + Колер значка праграмы + Колер ніжняй панэлі навігацыі + Аднавіць значэнні па змаўчанні + Выкарыстоўваць па змаўчанні + Па змаўчанні + Змяніць колер + Тэма + Пры змене колеру ён пераключыцца на карыстальніцкую тэму + Захаваць + Адкідаць + Адмяніць змены + Вы ўпэўнены, што хочаце адмяніць зробленыя змены\? + Гэта дзеянне нельга адмяніць. + У вас ёсць незахаваныя змены. Захаваць перад выхадам\? + Прымяніць колеры да ўсіх простых праграм + Папярэджаньне: некаторыя пускавыя ўстаноўкі няправільна апрацоўваюць наладу значкоў прыкладанняў. У выпадку, калі значок знікне, паспрабуйце запусціць прыкладанне праз Google Play або якой-небудзь віджэт, калі ён даступны. Пасля запуску проста вярніце аранжавы значок па змаўчанні #F57C00. У горшым выпадку вам, магчыма, прыйдзецца пераўсталяваць дадатак. + Колеры паспяхова абноўлены. Была дададзена новая тэма пад назвай \"Агульны доступ\", выкарыстоўвайце яе для абнаўлення ўсіх колераў праграм у будучыні. + Звярніце ўвагу, што нават калі вы карыстаецеся версіяй праграмы Pro, вам усё роўна патрэбны Simple Thank You па тэхнічных прычынах. Ён клапоціцца аб сінхранізацыі колеру. + Купіце <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>, каб разблакіраваць гэту функцыю і падтрымаць распрацоўку. Дзякуй! + + Светлая + Цёмная + Аўто + Аўтаматычны свет / цёмны + Сонечная + Цёмна-чырвоная + Белая + Чорна-белая + Карыстальніцкая + Агульная + Сістэма па змаўчанні + + Што новага + * Тут пералічаны толькі больш буйныя абнаўленні, заўсёды ёсць некаторыя меншыя паляпшэнні + + Выдаліць + Зняць + Перайменаваць + Абагуліць + Абагуліць праз… + Змяніць памер + Выбраць усё + Выбраць тэкст + Схаваць + Паказаць + Схаваць папку + Паказаць папку + Часова паказаць схаванае + Спыніць паказ схаваных мультымедыя + Вы не можаце абагуліць столькі змесціва адначасова + Ачысціце і адключыце кошык + Адрабіць + Узнавіць + Друкаваць + Друкаваць (Pro) + Ярлык + Стварыць ярлык + Стварыць ярлык (Pro) + Дадаць нумар да кантакту + Паказаць звесткі аб кантакце + Выклік з SIM 1 + Выклік з SIM 2 + Пераключыць бачнасць імя файла + Перамясціць уверх + Перамясціць уніз + Замацаваць элемент + Адмацаваць элемент + Даслаць SMS + Даслаць ліст + Выклік + Contact details + Add contact + Шпалеры + + Сартаваць па… + Назва + Памер + Апошні раз зменена + Дата стварэння + Дата ўзяцця + Назва + Назва файла + Пашырэнне + Выпадкова + Сартаваць выпадковым чынам + Па ўзрастанні + Па змяншэнні + Выкарыстоўвайце толькі для гэтай папкі + Сартаванне лікавых частак па фактычным значэнні + Імя + Імя па бацьку + Прозвішча + Поўнае імя + Выкарыстоўвайце карыстацкую сартаванне + Змяніць парадак + + Вы ўпэўнены, што хочаце працягнуць выдаленне\? + Выдаліць %s\? + Delete %s? + Перамясціць %s у сметніцу\? + Выдаліць гэты элемент\? + Перамясціць гэты элемент у сметніцу\? + Больш не пытацца ў гэтым сеансе + Больш не паказваць + Так + Не + Магчыма + + ПАПЯРЭДЖАННЕ: Вы выдаляеце %d папку + ПАПЯРЭДЖАННЕ: Вы выдаляеце %d папкі + ПАПЯРЭДЖАННЕ: Вы выдаляеце %d папак + ПАПЯРЭДЖАННЕ: Вы выдаляеце %d папак + + + PIN-код + Увядзіце PIN-код + Увядзіце PIN-код + Няправільны PIN-код + Паўтарыце PIN-код + Графічны ключ + Намалюйце графічны ключ + Няправільны графічны ключ + Паўтарыце графічны ключ + Біяметрыя + Адбітак пальца + Дадаць адбітак пальца + Пакладзіце палец на датчык адбіткаў пальцаў + Адкрыць дыялогавае акно праверкі біяметрычнай асобы + Аўтэнтыфікаваць + Памылка аўтэнтыфікацыі + Аўтэнтыфікацыя заблакіравана, паўтарыце спробу праз хвіліну + У вас няма зарэгістраваных адбіткаў пальцаў, дадайце іх у наладах вашай прылады + Перайдзіце ў Налады + Ўстаноўка пароля прайшла паспяхова. Калі ласка, пераўсталюеце прыкладанне на выпадак, калі вы яго забудзецеся. + Налада абароны выканана паспяхова. Калі ласка, пераўсталюеце прыкладанне ў выпадку ўзнікнення праблем з яго скідам. + Заблакіраваць тэчку + Заблакіраваць тэчку (Pro) + Разблакіраваць тэчку + Гэтая абарона працуе толькі ў гэтым дадатку, яна не павінна замяняць сапраўднае агульнасістэмнае шыфраванне папак. + + Учора + Сёння + Заўтра + Кожны дзень + Схаваць год + секунд + хвілін + гадзін + дзён + с + х + г + wk. + + %d секунда + %d секунды + %d секунд + %d секунд + + + %d хвіліна + %d хвіліны + %d хвілін + %d хвілін + + + %d гадзіна + %d гадзіны + %d гадзін + %d гадзін + + + %d дзень + %d дні + %d дзён + %d дзён + + + %d тыдзень + %d тыдні + %d тыдняў + %d тыдняў + + + %d месяц + %d месяцы + %d месяцаў + %d месяцаў + + + %d год + %d гады + %d гадоў + %d гадоў + + + + %d секунду + %d секунды + %d секунд + %d секунд + + + %d хвіліну + %d хвіліны + %d хвілін + %d хвілін + + + %d гадзіну + %d гадзіны + %d гадзін + %d гадзін + + + %d дзень + %d дні + %d дзён + %d дзён + + + %d тыдзень + %d тыдні + %d тыдняў + %d тыдняў + + + %d месяц + %d месяцы + %d месяцаў + %d месяцаў + + + %d год + %d гады + %d гадоў + %d гадоў + + + + %d секунда да падзеі + %d секунды да падзеі + %d секунд да падзеі + %d секунд да падзеі + + + %d хвіліна да падзеі + %d хвіліны да падзеі + %d хвілін да падзеі + %d хвілін да падзеі + + + %d гадзіна да падзеі + %d гадзіны да падзеі + %d гадзін да падзеі + %d гадзін да падзеі + + + %d дзень да падзеі + %d дні да падзеі + %d дзён да падзеі + %d дзён да падзеі + + + %d тыдзень да падзеі + %d тыдні да падзеі + %d тыдняў да падзеі + %d тыдняў да падзеі + + + %d месяц да падзеі + %d месяца да падзеі + %d месяцаў да падзеі + %d месяцаў да падзеі + + + %d год да падзеі + %d гады да падзеі + %d гадоў да падзеі + %d гадоў да падзеі + + + + %d секунду + %d секунды + %d секунду + %d секунду + + + %d хвіліну + %d хвіліны + %d хвілін + %d хвілін + + + %d гадзіну + %d гадзіны + %d гадзін + %d гадзін + + + %d дзень + %d дні + %d дзён + %d дзён + + + %d тыдзень + %d тыдні + %d тыдняў + %d тыдняў + + + %d месяц + %d месяца + %d месяцаў + %d месяцаў + + + %d год + %d гады + %d гадоў + %d гадоў + + + Час, застаўшыйся да спрацоўвання будзільніка:\n%s + Час, застаўшыйся да спрацоўвання напаміна:\n%s + Пакінуты час:\n%s + Пераканайцеся, што будзільнік працуе правільна, перш чым спадзявацца на яго. Ён можа не працаваць належным чынам з-за сістэмных абмежаванняў, звязаных з эканоміяй батарэі. + Калі ласка, пераканайцеся, што напамінкі працуюць належным чынам, перш чым спадзявацца на іх. Праверце зарад батарэі вашага прылады і налады апавяшчэнняў, калі нішто не блакуе нагадванні ці не адключае прыкладанне ў фонавым рэжыме. + Апавяшчэння гэтага прыкладання адключаныя. Калі ласка, зайдзіце ў Налады вашага прылады, каб уключыць іх. + + Будзільнік + Адкласці + Адхіліць + Без напаміна + На пачатку + Сістэмныя гукі + Твае гукі + Дадаць новы гук + Без гуку + На працягу дня ў гг:хх + На працягу дня ў %02d:%02d + + Налады + Purchase Simple Дзякуй + Генерал + Налады колераў + Палепшаная налада колеру + Наладзіць колеры + Наладзіць колеры (заблакавана) + Заблакавана + Наладзіць колеры віджэтаў + Наладзіць апавяшчэнні + Notification sound + Выкарыстоўваць англійскую мову + Мова + Паказваць схаваныя элементы + Памер шрыфта + Малы + Сярэдні + Вялікі + Вялізарны + Абарона паролем бачнасці схаваных элементаў + Абарона паролем усяго прыкладання + Абарона паролем выдалення і перамяшчэння файлаў + Захоўваць старое апошняе мадыфікаванае значэнне пры аперацыях з файламі + Паказваць інфармацыйную бурбалку пры пракрутцы элементаў шляхам перацягвання паласы пракруткі + Забараніць тэлефону пераходзіць у рэжым сну, калі праграма працуе на пярэднім плане + Заўсёды прапускаць дыялогавае акно пацверджання выдалення + Уключыце пацягніце для абнаўлення зверху + Выкарыстоўвайце 24-гадзінны фармат часу + Змяніць фармат даты і часу + Пачатак тыдня ў нядзелю + Віджэты + Заўсёды выкарыстоўвайце аднолькавы час адкладання + Час адкладання + Вібраваць пры націску на кнопкі + Перамяшчайце элементы ў кошык замест выдалення + Інтэрвал ачысткі кошыка + Ачысціць сметніцу + Прымусовы партрэтны рэжым + Экспартаваць налады + Імпартаваць налады + Налады паспяхова экспартаваны + Налады паспяхова імпартаваны + Імя пачынаць з прозвішча + Ачысціць кэш + Паказаць дыялогавае акно пацверджання выкліку перад пачаткам выкліку + + Бачнасць + Бяспека + Пракрутка + Файлавыя аперацыі + Сметніца + Захаванне + Запуск + Тэкст + Міграцыя + Якасць + Галоўны экран + Эскізы + Спіс + + Выключыць + Выключыць тэчку + Выключаныя тэчкі + (выключана) + Кіраванне выключанымі папкамі + Выдаліць усе + Выдаліць усе тэчкі з спісу выключаных\? Гэта не прывядзе да выдалення тэчак. + Паказ часова выключаны + Спыніць паказ выключаны + + Кіраванне ўкладкамі, якія адлюстроўваюцца + Укладка, якая адкрываецца пры запуску + Кантакты + Абраныя + Журнал выклікаў + Групы + Апошні выкарыстоўваны + Файлы + Апошнія файлы + + Аднавіць гэты файл + Аднавіць выбраныя файлы + Аднавіць усе файлы + Сметніца паспяхова ачышчана + Файлы паспяхова адноўлены + Вы ўпэўненыя, што жадаеце ачысціць сметнік\? Файлы будуць незваротна страчаныя. + Сметніца пустая + Перамяшчэнне элементаў кошыка адключана, скарыстайцеся аднаўленнем + Паказаць сметніцу + Схаваць сметніцу + Адкрыць кошык + Прапусціце кошык, выдаліце файлы непасрэдна + + %d элемент перамяшчаецца ў сметніцу + %d элемента перамяшчаюцца ў сметніцу + %d элементаў перамяшчаюцца ў сметніцу + %d элементаў перамяшчаюцца ў сметніцу + + + Імпартаванне… + Экспартаванне… + Імпартаванне паспяхова выканана + Экспартаванне паспяхова выканана + Не атрымалася выканаць імпартаванне + Не атрымалася выканаць экспартаванне + Не атрымалася імпартаваць некаторыя элементы + Не атрымалася экспартаваць некаторыя элементы + Элементы для імпартавання не знойдзены + Новыя элементы для імпартавання не знойдзены + Элементы для экспартавання не знойдзены + Рэзервовыя копіі + Уключыць аўтаматычнае рэзервовае капіраванне + Кіраванне аўтаматычным рэзервовым капіраваннем + Вы можаце выкарыстоўваць наступныя шаблоны, каб аўтаматычна назваць файл: +\n +\n%Y - год +\n%M - месяц +\n%D - дзень +\n%h - гадзіна +\n%m - хвіліна +\n%s - другі + + USB + Падобна на тое, да вашага прылады падлучанае USB-прылада. Каб пераканацца, што яго файлы адлюстроўваюцца правільна, вам неабходна прадаставіць дадатковыя дазволу. + Калі ласка, абярыце верхнюю тэчку USB-прылады на наступным экране, каб даць доступ + Выбрана няправільная папка, выберыце асноўную папку вашай USB-прылады + + Студзень + Люты + Сакавік + Красавік + Травень + Чэрвень + Ліпень + Жнівень + Верасень + Кастрычнік + Лістапад + Снежань + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + у студні + у лютым + у сакавіку + у красавіку + у траўні + у чэрвені + у ліпені + у жніўні + у верасні + у кастрычніку + у лістападзе + у снежні + Панядзелак + Аўторак + Серада + Чацвер + Пятніца + Субота + Нядзеля + Пн + Аў + Ср + Чц + Пт + Сб + Нд + Пан + Аўт + Срд + Чцв + Пят + Суб + Няд + + Версія вашага прыкладання больш не будзе абнаўляцца. Калі ласка, абнавіць да версіі Pro, каб атрымаць новыя выпраўлення і іншыя паляпшэння. + Версія вашага прыкладання больш не будзе абнаўляцца. Калі ласка, абнавіць да версіі Pro, каб атрымаць новыя выпраўлення і іншыя паляпшэння, націснуўшы тут. + Гэта бясплатна да %s. Калі вы спампуеце яго да таго часу, вы зможаце выкарыстоўваць яго бясплатна назаўжды. + Дадатковая інфармацыя + Абнаўленне + Вы павінны перанесці лакальна захаваныя падзеі ўручную шляхам экспарту ў файл .ics, а затым імпарту. Вы можаце знайсці абедзве кнопкі экспарту/імпарту ў галоўным меню экрана. + Добры дзень, +\n +\nздаецца, вы толькі што перайшлі з бясплатнай версіі. Калі вы задаволены гэтым і, магчыма, перанясеце свае налады і абранае, вы можаце выдаліць старую бясплатную праграму, каб пазбегнуць яе выпадковага запуску, бо яна вам больш не спатрэбіцца. +\n +\nДзякуй! + Добры дзень, +\n +\nздаецца, у вас ужо ёсць версія праграмы Pro. Калі вы задаволены ім і, магчыма, перанясеце свае налады і абранае, вы можаце выдаліць яго, каб пазбегнуць яго выпадковага запуску, бо ён вам больш не спатрэбіцца. +\n +\nДзякуй! + Добры дзень, +\n +\nздаецца, вы толькі што перайшлі з бясплатнай версіі. Калі вы будзеце задаволены гэтым і, магчыма, перанясеце свае даныя, вы можаце выдаліць старую бясплатную праграму, каб пазбегнуць яе выпадковага запуску, бо яна вам больш не спатрэбіцца. +\n +\nДзякуй! + Добры дзень, +\n +\nздаецца, у вас ужо ёсць версія праграмы Pro. Калі вы задаволеныя ім і, магчыма, перанеслі свае даныя, вы можаце выдаліць яго, каб пазбегнуць выпадковага запуску, бо ён вам больш не спатрэбіцца. +\n +\nДзякуй! + Добры дзень, +\n +\nздаецца, вы толькі што перайшлі з бясплатнай версіі. Калі вы хочаце перанесці свае лакальна захаваныя падзеі, вам трэба зрабіць гэта ўручную, экспартаваўшы іх у файл .ics у бясплатнай версіі праграмы і імпартаваўшы сюды праз верхняе меню. +\n +\nКалі вы будзеце задаволены сваімі наладамі ў версіі Pro, вы можаце выдаліць старую бясплатную версію, бо яна вам больш не спатрэбіцца. +\n +\nДзякуй! + Добры дзень, +\n +\nздаецца, вы толькі што перайшлі з бясплатнай версіі. Калі ў вас былі якія-небудзь кантакты, захаваныя ў \"%s\", вы павінны перанесці іх уручную, экспартаваўшы ў файл .vcf з бясплатнай версіі праграмы і імпартаваўшы сюды праз верхняе меню. +\n +\nКалі вы будзеце задаволены сваімі наладамі ў версіі Pro, вы можаце выдаліць старую бясплатную версію, бо яна вам больш не спатрэбіцца. +\n +\nДзякуй! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Аб + Сайт + Для атрымання зыходных кодаў наведайце + Дасылайце свае водгукі або прапановы на + Абнаўленне да Pro + Больш прыкладанняў + Больш праграм ад нас + Запрашайце сяброў + Гэй, выпісвайся %1$s у%2$s + Запрасіць праз + Ацаніце нас + Стаўка + Ахвяраваць + Сачыце за намі + Версія %1$s +\nАўтарскае права © Simple Mobile Tools %2$d + Падтрымка + Дапамажы нам + Сацыяльны + Іншае + Палітыка прыватнасці + Версія %s + Прывітанне :) + Зроблена з ❤️ у Славакіі + Дадатковая інфармацыя + Версія праграмы: %s + АС прылады: %s + Прывітанне,<br> < br> спадзяюся, вам спадабаецца прыкладанне. Ён не ўтрымлівае рэкламы, калі ласка, падтрымайце яго распрацоўку, купіўшы <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.дзякуй> простае прыкладанне Дзякуй</a>, яно таксама прадухіліць паўторнае адлюстраванне гэтага дыялогавага акна.<br> < br> Дзякуй! + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Купіць + Атрымаць Simple Phone + Калі ласка, абнавіце Simple Thank You да апошняй версіі + Перш чым задаць пытанне, праверце налады праграмы і спачатку прачытайце раздзел \"Часта задаюць пытанні\". Магчыма, рашэнне ёсць. + Перш чым ацэньваць нас, праверце налады праграмы і спачатку прачытайце раздзел \"Часта задаюць пытанні\". Калі ў вас ёсць якія-небудзь праблемы, магчыма, рашэнне ёсць. + Таксама пераканайцеся, што вы выкарыстоўваеце апошнюю версію праграмы. + Таксама звярніце ўвагу, што гэтая версія праграмы больш не распрацоўваецца, купіце версію Pro для многіх паляпшэнняў. + Прачытаць + Прачытаць FAQ + Квітнець, +\n +\nпадобна на тое, вы карыстаецеся гэтым дадаткам ўжо даволі даўно, і мы вельмі цэнім гэта. +\n +\nКалі мы можам папрасіць вас аб ласцы, калі ласка, ацаніце нас у Google Play. Гэта сапраўды вельмі дапамагло б нам. +\n +\nНезалежна ад таго, як вы вырашыце, вы больш не ўбачыце гэта паведамленне. +\n +\nДзякуй! + Калі ласка, ацаніце наша дадатак :) + Дзякуй + Віджэт заблакіраваны.\nАбнавіце яго да версіі Pro, каб разблакіраваць яго. + Гэта функцыя заблакіравана, купіце <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Просты дзякуй</a> за разблакіроўку поўнай праграмы. <br><br>Гэта аднаразовая аплата, і калі вы не будзеце задаволены, мы можам вярнуць вам грошы. + + Гэй,<br><br>проста паведамляю вам, што нядаўна былі выпушчаны некаторыя новыя праграмы:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Вы можаце загрузіць іх, націснуўшы іх загалоўкі або значкі.<br><br> дзякуй + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + Працоўны стол + Калькулятар + Каляндар + Камера + Гадзіннік + Кантакты + Тэлефон + Малюнкі + Файлавы менеджар + Ліхтарык + Галерэя + Клавіятура + Launcher + Музычны прайгравальнік + Нататкі + Паведамленні + Падзяка + Дыктафон + Падобна на тое, што версія вашага прыкладання пашкоджана. Калі ласка, запампуйце арыгінальную версію <a href=%s>тут</a>. + + Часта задаюць пытанні + Перш чым задаць пытанне, прачытайце + Чаму я не бачу гэты віджэт праграм у спісе віджэтаў\? + Хутчэй за ўсё, гэта звязана з тым, што вы перамясцілі прыкладанне на SD-карту. У гэтым выпадку існуе сістэмнае абмежаванне Android, якое хавае дадзеныя фішкі прыкладання. Адзінае рашэнне-перамясціць прыкладанне назад ва ўнутранае сховішча праз налады вашага прылады. + Я хачу падтрымаць вас, але я не магу ахвяраваць грошы. Ці магу я яшчэ што-небудзь зрабіць\? + Ды, вядома. Вы можаце распавесці аб прыкладаннях ці даць добрыя водгукі і ацэнкі. Вы таксама можаце дапамагчы, перавядучы прыкладання на новую мову ці проста абнавіўшы некаторыя існуючыя пераклады. Кіраўніцтва па перакладзе знаходзіцца на <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>гэты сайт </a>, або проста звяжыцеся з намі па адрасе <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> калі ў вас ёсць якія-небудзь пытанні. + Я памылкова выдаліў некаторыя файлы, як я магу іх аднавіць\? + На жаль, вы не можаце гэтага зрабіць. Файлы выдаляюцца імгненна пасля дыялогавага акна пацверджання, кошык для смецця недаступная. + Мне не падабаюцца колеры віджэтаў, ці магу я іх змяніць\? + Так, калі вы перацягнуць віджэт на галоўны экран, з\'яўляецца экран налады фішкі. Вы ўбачыце каляровыя квадраты ў левым ніжнім куце, проста націсніце на іх, каб выбраць новы колер. Вы таксама можаце выкарыстоўваць паўзунок для налады альфа-сігналу. + Ці магу я неяк аднавіць выдаленыя файлы\? + Калі яны сапраўды былі выдалены, вы не можаце. Тым не менш, кошык уключаны па змаўчанні, гэта прывядзе да таго, што файлы проста перамяшчаюцца ў кошык, а не выдаляюцца. + Значок запуску прыкладання знік. Што я магу зрабіць\? + Гэта выклікана тым, што ваш запуску не падтрымлівае правільную наладу значкоў. Паспрабуйце запусціць прыкладанне праз Google Play або які-небудзь віджэт, калі такі маецца. Пасля запуску проста вярніце аранжавы значок па змаўчанні #F57C00. У горшым выпадку вам, магчыма, прыйдзецца пераўсталяваць дадатак. + Грошы былі зняты з майго банкаўскага рахунку, але я не магу спампаваць праграму. Што я магу зрабіць\? + Плацяжы цалкам апрацоўваюцца Google, у іх сістэме час ад часу даюцца збоі. Проста ачысціце кэш праграмы Google Play і перазапусціце прыладу, а затым паўтарыце спробу загрузкі. + Чаму я павінен перайсці на версію Pro\? + Паколькі версія вашага прыкладання больш не абнаўляецца, памылкі, якія вы, магчыма, заўважылі, ніколі не будуць выпраўленыя. Таксама не будзе дададзена ніякіх новых функцый. Вы можаце набыць Pro-версію ў Google Play за невялікую суму грошай. Гэта аднаразовы плацёж, а гэта значыць, што як толькі вы яго купіце, вам больш ніколі не прыйдзецца плаціць. Нават пасля атрымання новага прылады. Калі вам не падабаецца Pro-версія, вы можаце проста выдаліць яе на працягу некалькіх гадзін, і вы аўтаматычна атрымаеце свае грошы назад. Калі вы хочаце вярнуць грошы ў любы час пазней, проста звяжыцеся з намі па адрасе hello@simplemobiletools.com і вы гэта атрымаеце. + Як я магу выбраць некалькі элементаў адначасова\? + Ёсць некалькі спосабаў зрабіць гэта. Першы з іх заключаецца ў запуску рэжыму выбару шляхам працяглага націску на адзін элемент, а затым кароткага націску на іншыя, каб выбраць іх. Другі спосаб аналагічны выбару элементаў на ПК з дапамогай мышы, проста запусціце рэжым выбару, доўга націскаючы на адзін элемент, затым, усё яшчэ утрымліваючы палец націснутым, правядзіце ім па іншых элементах для выбару. Трэці спосаб выбару некалькіх элементаў-доўгі націск на адзін элемент, затым доўгі націск на іншы, і выбіраецца ўсё, што знаходзіцца паміж імі. Калі вы хочаце выбраць усе тавары, проста доўга націсніце на адзін тавар, а затым пстрыкніце на лічыльніку выбраных тавараў у левым верхнім куце. Гэта дазволіць выбраць або адмяніць выбар усяго. + Я набыў праграму, але не магу загрузіць яе на іншую прыладу. + Паспрабуйце ачысціць кэш праграмы Google Play і перазагрузіць прыладу. Гэта нейкі збой Google Play, які насамрэч не звязаны з самім дадаткам. + + Укладальнікі + Пераклад + Распрацоўка + Іншая дапамога + У гэтым спісе ёсць усе, хто прыкметна дапамог любому дадатку ў наборы Simple Mobile Tools, не толькі гэтаму. Tперакладам займаюцца валанцёры, дайце нам ведаць, калі вы таксама хочаце дапамагчы. Кіраўніцтва па перакладзе знаходзіцца на <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file> гэты сайт</a>, або проста звяжыцеся з намі па адрасе <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> калі ў вас ёсць якія-небудзь пытанні. Дзякуй усім удзельнікам і іншым прыхільнікам! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Атрымайце версію Pro зараз! + Базавы + Pro + Без рэкламы + Няма доступу ў інтэрнэт + 100% Гарантыя Вяртання Грошай + Аднаразовая аплата + Палепшаны дызайн + + Пашыраны рэдактар фатаграфій + Advanced photo & video editor + Падтрымка файлаў HEIC/HEIF + Пашыранае перайменаванне пакетнага файла + Індывідуальнае блакаванне папак + Падтрымка друку + + Падтрымка гадзінных паясоў + Удзельнікі і напаміны па электроннай пошце + Лёгкі імпарт падзей + Новыя віджэты + + Палепшана аб\'яднанне дублікатаў кантактаў + Настройка памеру шрыфта + Неабавязковы прыватны абмен кантактамі ў нашых праграмах + Наладжвальныя рынгтоны для кантактаў + Фільтраванне кантактаў + Кантакты, якія захоўваюцца ў прыватным парадку + + Кантрольныя спісы + Розныя нататкі і колеры для кожнага віджэта + Блакаванне нататак + + Настройка фармату даты і часу + Ярлыкі на галоўным экране + File compression support + Укладка з апошнімі файламі + + Настройка колеру фону + Падтрымка імпарту файлаў + Zooming + + Гэта дадатак выкарыстоўвае наступныя іншыя бібліятэкі, каб палегчыць мне жыццё. Дзякуй. + Ліцэнзіі трэціх асоб + Kotlin (мова праграмавання) + Шкала падвыбаркі. Прагляд выявы (прагляды малюнкаў з магчымасцю маштабавання) + Glide (загрузка малюнкаў і кэшаванне) + Пікаса (загрузка і кэшаванне малюнкаў) + Android Image Cropper (абрэзка і паварот выявы) + RtlViewPager (правядзенне справа налева) + Joda-Time (Замена даты Java) + Stetho (адладка баз дадзеных) + Otto (аўтобус мерапрыемства) + PhotoView(GIF-файлы з магчымасцю маштабавання) + PatternLockView (абарона шаблону) + Reprint (абарона адбіткаў пальцаў) + Gif Drawable (загрузка GIF-файлаў) + AutoFitTextView (змена памеру тэксту) + Robolectric (тэставая структура) + Espresso (памочнік тэсціравання) + Gson (парсер JSON) + Leak Canary (дэтэктар уцечкі памяці) + Number Picker (наладжвальны выбар нумара) + ExoPlayer (відэаплэер) + VR Panorama View(паказ панарам) + Apache Sanselan (чытанне метаданых выявы) + Android Photo Filters (фільтры малюнкаў) + Gesture Views(маштабаваныя малюнкі) + Indicator Fast Scroll (літары на паласе пракруткі) + Event Bus(сувязь у дадатку) + Audio Record View(аўдыявізуалізацыя) + SMS MMS (Апрацоўка SMS і MMS) + APNG Android (аніміраваная падтрымка WebP) + PDFViewPager (Прагляд PDF) + M3U Parser (апрацоўка файла спісу прайгравання m3u) + AndroidLame (кадавальнік mp3) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + САСТАРЕЛА: гэтая версія праграмы больш не падтрымліваецца, атрымайце версію Pro па адрасе https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Не забывайце, што калі вы выдаліце любую платную праграму на працягу 2 гадзін, вам аўтаматычна вернуць грошы. Калі вы хочаце вярнуць грошы ў любы час пазней, проста звяжыцеся з намі па адрасе hello@simplemobiletools.com, і вы атрымаеце іх. Гэта дазваляе лёгка паспрабаваць :) + + Група простых праграм для Android з адкрытым зыходным кодам і віджэтамі, якія можна наладзіць, без рэкламы і непатрэбных дазволаў. + \ No newline at end of file diff --git a/commons/src/main/res/values-bg/strings.xml b/commons/src/main/res/values-bg/strings.xml new file mode 100644 index 000000000..6607710c4 --- /dev/null +++ b/commons/src/main/res/values-bg/strings.xml @@ -0,0 +1,1093 @@ + + + Добре + Отказ + Back + Нищо + По-късно + Запазване като + Файлът е запазен успешно + Невалиден файлов формат + Грешка от липса на памет + Възникна грешка: %s + Грешка: %s + Отваряне с + Редакция с + Редакция + Не е намерено валидно приложение + Не е намерен браузър + Не е намерен имейл клиент + Задаване като + Копиране в клипборда + Копиране на номера в клипборда + Стойността е копирана в клипборда + Стойност, копирана в клипборда: +\n%s + Набиране на номер + Неизвестно + Винаги + Никога + Подробности + Бележки + Изтриване на папка \'%s\' + Нищо + Етикет + Прозрачно + Прозрачен цвят + Избор на различен цвят + Изтегляне + Известие + Известия + Имейл + Предишно + Пускане / Пауза + Следващо + Номер + Няма намерени контакти + Поискване на необходимите разрешения + Приложението няма достъп до контактите ви + Приложението няма разрешение за иницииране на телефонни обаждания, моля, дайте го в настройките на устройството + Вмъкване на текст тук + Повикване %s + Confirm calling %s + Нула + Едно + Две + Три + Четири + Пет + Шест + Седем + Осем + Девет + Стойност + Стойността не може да бъде празна + Създаване на контакт + Добавяне към съществуващ контакт + Развалено приложение + Внимание + Снимане + Избор на снимка + Choose video + Choose contact + Choose file + Record audio + Record video + Обновяване… + Памет на устройството + Памет на устройството (без достъп от други приложения) + Audio + + Рожден ден + Годишнина + + Начало + Работа + + Мобилен + Основен + Работен факс + Домашен факс + Пейджър + Не е намерен телефонен номер + + Промяна на изгледа + Решетка + Решетка (Про) + Неравномерна решетка + Списък + Увеличаване на броя на колоните + Намаляване на броя на колоните + Column count + Portrait column count + Landscape column count + Промяна на корицата + Избор на снимка + + %d column + %d columns + + + Управление на блокирани номера + Не блокирате никого. + Добавяне на блокиран номер + Блокиране на номер + Блокиране на номера + Блокирани номера + Експортиране на блокирани номера + Внасяне на блокирани номера + За да използвате блокираните номера, трябва да настроите това приложение като приложение за набиране по подразбиране. + Задаване по подразбиране + Сигурни ли сте, че искате да блокирате \"%s\"\? + Блокиране на повиквания от незапазени контакти + Блокиране на съобщения от незапазени контакти + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Любими + Добави любими + Добави към любимите + Премахни от любимите + + Търсене + Search in %s + Въведете поне 2 символа, за да започнете търсенето. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Филтър + Филтър (Про) + Няма намерени елементи. + Промяна на филтър + + Необходимо е разрешение за съхранение + Необходимо е разрешение за контакти + Необходимо е разрешение за камера + Необходимо е разрешение за аудио + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Преименуване на файл + Преименуване на папка + Файлът не може да бъде преименуван + Папката не може да бъде преименувана + Името на папката не трябва да е празно + Вече съществува папка с това име + Не може да се преименува главната папка на хранилище + Папката е преименувана + Преименуване на папка + Името на файла не може да бъде празно + Името на файла съдържа непозволени знаци + Името на файла \'%s\' съдържа непозволени знаци + Разширението не може да бъде празно + Изходния файл %s не съществува + Представка на файлови имена + Прибавяне на файлови имена + Обикновено преименуване + Шаблон + Текст за добавяне + %Y - година +\n%M - месец +\n%D - ден +\n%h - час +\n%m - минута +\n%s - секунда +\n%i - число, нарастващо от 1 + Име на файл (без .txt) + Име на файл (без .json) + Име на файл (без .zip) + От Android 11 нататък вече не можете да скривате файлове и папки по този начин + + Копиране + Преместване + Копиране / Преместване + Копиране към + Преместване към + Източник + Дестинация + Избор на дестинация + Кликнете тук, за избор на дестинация + Не можа да се пише на избраното местоназначение + Моля, изберете дестинация + Източникът и дестинацията не могат да бъдат еднакви + Неуспешно копиране на файловете + Копира се… + Файловете са копирани успешно + Файлът е копиран успешно + Възникна грешка + Премества се… + Файловете са преместени успешно + Файлът е преместен успешно + Някои файлове не можаха да бъдат преместени + Някои файлове не можаха да бъдат копирани + Няма избрани файлове + Запазва се… + Неуспешно създаване на папка %s + Неуспешно създаване на файл %s + Не са намерени нови елементи + Дестинацията няма достатъчно свободно място. +\nНеобходимо %1$s, налично %2$s + Системната услуга за избор на файлове и папки не е налична + + Създаване на нов + Папка + Файл + Създаване на нова папка + Вече съществува файл или папка с това име + Името съдържа непозволени знаци + Моля, въведете име + Възникна неизвестна грешка + + Файл \"%s\" вече съществува + Файл \"%s\" вече съществува. Презаписване\? + Папка \"%s\" вече съществува + Сливане + Запазване на двете + Презаписване + Пропускане + Прибавяне с \'_1\' + Приложи към всички + Системата не позволява операцията в тази папка, моля, изберете друга + Системата не позволява копиране в тази папка, моля, изберете друга + Системата не позволява преименуване в тази папка + Не може да се преименуват папки директно на вътрешно хранилище, само подпапки + Папката не може да бъде преименувана + + Избор на папка + Избор на файл + Потвърдете достъпа до външно хранилище + Потвърдете достъпа до папка + Моля, изберете горната папка на SD картата на следващия екран, за да предоставите достъп за запис + Ако не виждате SD картата, опитайте това + Моля, позволете на приложението да има достъп до избраното хранилище на следващия екран, като натиснете \'Използвайте тази папка\' в долната част. + Моля, разрешете достъп до \'%s\' на следващия екран, като натиснете \'Използвайте тази папка\' в долната част на екрана. + Моля, натиснете \'Запазване\' в долната част на следващия екран, за да създадете новата папка. + Потвърди избора + Зареждане… + Моля, предоставете достъп на нашето приложение до всички ваши файлове, то може да не работи добре без него. + + %d елемент + %d елемента + + + + %d елемент + %d елемента + + + Изтриване %d елемент + Изтриване %d елемента + + + + %d контакт + %d контакта + + + Изберете хранилище + Хранилище + Вътрешно + SD Карта + Ядро + Избрана грешна папка, моля, изберете началната папка на вашата SD карта + Пътищата до SD картата и USB устройството не могат да бъдат еднакви + Изглежда, че приложението е инсталирано на SD карта, което прави приспособленията за приложението недостъпни. Даже няма да ги видите в списъка на наличните приспособления. Това е ограничение на системата, така че ако искате да използвате приспособленията, трябва да преместите приложението обратно във вътрешното хранилище. + Избрана грешна папка, моля, изберете път \'%s\' + + Свойства + Път + Избрани елементи + Брой на непосредствените деца + Общ брой файлове + Резолюция + Продължителност + Артист + Албум + Фокусно разстояние + Ереме на експозиция + ISO скорост + F-число + Камера + EXIF + Заглавие на песен + Координати на GPS + Надморска височина + Премахване на EXIF + Сигурни ли сте, че искате да премахнете EXIF стойностите като GPS координати, модел на камерата и т.н.\? + EXIF стойностите са остранени успешно + + Фонов цвят + Цвят на текст + Основен цвят + Цвят на акцент на бялата тема + Цвят на акцент на Черно-Бялата тема + Цвят на преден план + Цвят на иконата на приложението + Цвят на долната навигационна лента + Възстанови настройките по подразбиране + Използвай настройките по подразбиране + По подразбиране + Промени цвета + Тема + Промяната на цвят ще го накара да премине към Персонализирана тема + Запази + Откажи + Отмени промените + Сигурни ли сте, че искате да отмените промените\? + This action cannot be undone. + Има незапазени промени. Запазване преди изход\? + Прилагане на цветове за всички Обикновени Приложения + ВНИМАНИЕ: Някои лаунчъри не се справят правилно с персонализирането на иконата на приложението. В случай, че иконата изчезне, опитайте да стартирате приложението чрез Google Play или някакво приспособление, ако има такова. След като е стартирано, поставете го обратно в оранжевия цвят по подразбиране на иконата #F57C00. Може да се наложи да преинсталирате приложението в най -лошия случай. + Цветовете се актуализираха успешно. Добавена е нова тема, наречена \'Споделена\', моля, използвайте нея за актуализиране на всички цветове на приложението в бъдеще. + Обърнете внимание, че въпреки че използвате Про версията на приложението, все още се нуждаете от Обикновено Благодаря за технически причини. То се грижи за синхронизацията на цвета. + Моля, закупете <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Обикновено Благодаря</a> За да отключите тази функция и да подкрепите разработката. Благодаря! + + Светло + Тъмно + Автоматичен + Автоматично светло / тъмно + Соларизирано + Тъмно червено + Бяло + Черно & Бяло + Персонализиран + Споделен + По подразбиране на Системата + + Какво ново + * Тук са изброени само по-големите актуализации, винаги има и някои по -малки подобрения + + Изтрий + Премахни + Преименувай + Сподели + Сподели чрез + Преоразмеряване + Избери всички + Избери текст + Скрий + Покажи + Скрий папка + Покажи папка + Временно покажи скритото + Спри показвато на скритата медия + Не може да се сподели това много съдържание наведнъж + Изпразни и деактивирай кошчето + Отмени + Върни + Печат + Печат (Про) + Shortcut + Създай пряк път + Създай пряк път (Про) + Добави номера към контакт + Подробности за контакта + Обади се от SIM 1 + Обади се от SIM 2 + Превключи видимостта на името на файла + Премести най-отгоре + Премести най-отдолу + Закачи елемент + Откачи елемент + Изпрати SMS + Изпрати емейл + Повикване + Contact details + Add contact + Wallpapers + + Сортиране по + Име + Размер + Последно променен + Дата на създаване + Дата на заснемане + Заглавие + Име на файла + Разширение + Случайно + Случайно сортиране + Възходящ + Низходящ + Използвай само за тази папка + Сортирай числовите части по реалната стойност + Собствено име + Бащино име + Фамилия + Цяло име + Използвай персонализирано сортиране + Промяна на подредбата + + Сигурни ли си, че искаш да продължиш с изтриването\? + Сигурен ли си, че искаш да изтриеш %s\? + Delete %s? + + Сигурен ли си, че искаш да преместиш %s в кошчето\? + + Сигурен ли си, че искаш да изтриеш този елемент\? + Сигурен ли си, че искаш да преместиш този елемент в кошчето\? + Не питай отново в тази сесия + Не показвай отново + Да + Не + Може би + + ВНИМАНИЕ: Изтриване на %d папка + ВНИМАНИЕ: Изтриване на %d папки + + + ПИН + Въведи ПИН + Моля, въведете ПИН + Грешен ПИН + Повтори ПИН + Шаблон + Въведи шаблон + Грешен шаблон + Повтори шаблон + Биометрични данни + Пръстов отпечатък + Добави пръстов отпечатък + Моля, постави пръста си върху сензора за пръстови отпечатъци + Отвори диалога за проверка на биометричото ID + Удостоверяване + Неуспешно удостоверяване + Удостоверяването е блокирано, моля, опитайте отново след малко + Няма регистрирани пръстови отпечатъци, моля, добави от настройките на устройство + Отиди в Настройки + Успешна настройка на паролата. Моля, инсталирай отново приложението, в случай на забравена парола. + Успешна настройка на защитата. Моля, инсталирай отново приложението в случай на проблеми с нулирането му. + Заключи папка + Заключи папка (Про) + Отключи папка + Тази защита работи само в това приложение, не е предвидена да замества реално систено криптиране на папките в цялата система. + + Вчера + Днес + Утре + Всеки ден + Скрий годината + секунди + минути + часове + дни + с + м + ч + wk. + + %d секунда + %d секунди + + + %d минута + %d минути + + + %d час + %d часове + + + %d ден + %d дена + + + %d седмица + %d седмици + + + %d месец + %d месеци + + + %d година + %d години + + + + %d секунда + %d секунди + + + %d минута + %d минути + + + %d час + %d часове + + + %d ден + %d дена + + + %d седмица + %d седмици + + + %d месец + %d месеци + + + %d година + %d години + + + + %d секунда преди + %d секунди преди + + + %d минута преди + %d минути преди + + + %d час преди + %d часове преди + + + %d ден преди + %d дена преди + + + %d седмица преди + %d седмици преди + + + %d месец преди + %d месеци преди + + + %d година преди + %d години преди + + + + %d секунда + %d секунди + + + %d минута + %d минути + + + %d час + %d часове + + + %d ден + %d дена + + + %d седмица + %d седмици + + + %d месец + %d месеца + + + %d година + %d години + + + Останалото време, докато алармата спре: +\n%s + Време остава до задействане на напомнянето: +\n%s + Оставащо време: +\n%s + Моля, уверете се, че алармата работи правилно, преди да разчитате на нея. Тя може да се държи неправилно поради системните ограничения, свързани с спестяването на батерията. + Моля, уверете се, че напомнянията работят правилно, преди да разчитате на тях. Проверете настройките на батерията и известието на вашето устройство, ако няма нищо блокиращо напомнянията или убиване на приложението на заден план. + Известията на това приложение са деактивирани. Моля, влезте в настройките на вашето устройство, за да ги активирате. + + Аларма + Отлагане + Отхвърляне + Без напомняне + В началото + Системни звуци + Моите звуци + Добавяне на нов звук + Без звук + През деня в чч:мм + През деня в %02d:%02d + + Настройки + Закупуване на Обикновено Благодаря + Общ + Персонализиране на цвета + Improved color customization + Персонализирай цветовете + Персонализирай цветовете (Заключено) + Заключено + Персонализирайте цветовете на приспособлението + Персонализирай известията + Notification sound + Използвай английски език + Език + Покажи скритите елементи + Размер на шрифта + Малък + Среден + Голям + Много голям + Защити с Парола елементите със скрита видимост + Защити с Парола цялото приложение + Защити с Парола изтриването и преместването на файлове + Запази стара стойност на последната модификация при операции с файлове + Покажи информационен балон при превъртане на елементи при плъзгане на лентата за превъртане + Предотврати заспиването на телефона, докато приложението е на преден план + Винаги пропускай диалога за потвърждение на изтриването + Активирай издърпване за актуализация от горния ръб на екрана + Използвай 24-часов времеви формат + Промяна на формата на датата и времето + Започни седмицата от Неделя + Приспособления + Винаги използвай същото време за отлагане + Време за отлагане + Вибриране при натискане на бутоните + Премести елементите в Кошчето, вместо изтриване + Интервал за почистване на кошчето + Изпразни Кошчето + Подсигури портретен режим + Експортиране на настройки + Внасяне на настройки + Настройките се експортираха успешно + Настройките се импортираха успешно + Започнете името с фамилията + Изтрий кеш-памет + Показване на диалогов прозорец за потвърждение на повикване преди започване на повикване + + Видимост + Сигурност + Превъртане + Действия с файлове + Кошче + Запазване + Стартиране + Текст + Мигриране + Качество + Начален екран + Миниатюри + Изглед на списък + + Изключение + Exclude folder + Изключени папки + (изключено) + Управление на изключените папки + Премахване на всички + Премахване на всички папки от списъка с изключените\? Това няма да изтрие папките. + Временно показване на изключени + Стоп показване на изключени + + Управление на показаните раздели + Раздел за отваряне при стартиране на приложението + Контакти + Любими + Дневник на Обажданията + Групи + Последно използван + Файлове + Последни файлове + + Възстанови този файл + Възстанови избраните файлове + Възстанови всички файлове + Кошчето е изпразнено успешно + Файловете са възстановени успешно + Наистина ли искате да изпразните кошчето\? Файловете ще бъдат изтрити завинаги. + Кошчето е празно + Преместването на елементи от кошчето е деактивирано, моля, използвайте Възстановяване + Покажете Кошчето + Скрийте Кошчето + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Преместване на %d елемент в Kошчето + Преместване на %d елементa в Kошчето + + + Импортиране… + Експортиране… + Успешно импортиране + Успешно експортиране + Импортирането неуспешно + Експортирането неуспешно + Импортирането на някои елементи неуспешно + Експортирането на някои елементи неуспешно + Не са намерени записи за импортиране + Не са намерени нови записи за експортиране + Не са намерени записи за експортиране + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Изглежда имате USB устройство, прикачено към вашето устройство. За да сте сигурни, че неговите файлове се появяват правилно, трябва да предоставите допълнителни разрешения. + Моля, изберете най-горната папка от USB устройството на следващия екран, за да предоставите достъп + Избрана грешна папка, моля, изберете началната папка на вашето USB устройство + + Януари + Февруари + Март + Април + Май + Юни + Юли + Август + Септември + Октомври + Ноември + Декември + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + през Януари + през Февруари + през Март + през Април + през Май + през Юни + през Юли + през Август + през Септември + през Октомври + през Ноември + през Декември + Понеделник + Вторник + Сряда + Четвъртък + Петък + Събота + Неделя + П + Т + С + Ч + П + С + Н + Пн + Вт + Ср + Чт + Пт + Сб + Нд + + Версията на приложението ви вече няма да се актуализира. Моля, надстройте до Pro версията, за да получите нови поправки и други подобрения. + Версията на приложението ви вече няма да се актуализира. Моля, надстройте до Pro версията, за да получите нови корекции и други подобрения, като кликнете тук. + Той е безплатен до: %s. Ако го изтеглите дотогава, ще можете да го използвате безплатно завинаги. + Подробности + Обновяване + Трябва да мигрирате локално съхранените събития ръчно чрез експортиране в .ics файл, след което да импортирате. Можете да намерите и двата бутона за експортиране/импортиране в главното меню. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Относно + Уеб Страница + За програмения код посетете + Изпратете вашите отзиви или предложения на + Обновяване до Про + Още приложения + Още приложения от нас + Покани приятели + Хей, ела да видиш %1$s при %2$s + Покана чрез + Оцени ни + Оцени + Дарения + Последвайте ни + версия %1$s +\nАвторско право © Обикновени Мобилни Инструменти %2$d + Поддръжка + Помогнете ни + Социални + Други + Политика за поверителност + Version %s + Здравейте :) + Направено с ❤️ в Словакия + Допълнителна информация + Версия на приложението: %s + ОС на устройството: %s + Здравей,<br><br> надявам се, че се наслаждаваш на приложението. То не съдържа реклами, моля, подкрепете разработката му, като закупите приложението <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Обикновено Благодаря</a>. То ще предотврати този диалог да се покаже отново.<br><br> Благодаря! + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Купи + Поръчване на Обикновен Смартфон + Моля, обноврте Обикновено Благодаря до последното издание + Преди да зададете въпрос, моля, проверете настройките на приложението и първо прочетете често задаваните въпроси. Може би решението може да бъде намерено там. + Преди да ни оцените, моля, проверете настройките на приложението и първо прочетете често задаваните въпроси. Ако имате някакви проблеми, може би решението може да бъде намерено там. + Също така се уверете, че използвате най-новата версия на приложението. + Също така имайте предвид, че тази версия на приложението вече не се разработва, взементе Про версията за още много нови подобрения. + Прочети го + Прочетете често задавани въпроси + Здравейте, +\n +\nИзглежда, че вече използвате приложението доста време и наистина го оценяваме. +\n +\nАко можем да ви помолим услуга, моля, оценете ни в Google Play. Това наистина би ни помогнало много. +\n +\nКаквото и да решите, няма да видите това съобщение отново. +\n +\nБлагодаря! + Оценете нашето приложение, моля :) + Благодаря Ви + Приспособлението е заключено. +\nМоля, надстройте до Про версията, за да я отключите. + Тази функция е заключена, за да я отключите поръчайте <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> за пълен достъп до функциите на приложението.<br><br>Плащането е еднократно, а ако не останете доволни ще ви върнем парите. + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + Обикновен Начален Екран + Обикновен Калкулатор + Обикновен Календар + Обикновена Камера + Обикновен Часовник + Обикновени Контакти + Обикновен Телефон + Обикновено Рисуване + Обикновен Файлов Мениджър + Обикновено Фенерче + Обикновена Галерия + Обикновена Клавиатура + Simple Launcher + Обикновен Музикален Плейър + Обикновени Бележки + Обикновени SMS Съобщения + Обикновено Благодаря + Обикновен Диктофон + Начален Екран + Калкулатор + Календар + Камера + Часовник + Контакти + Телефон + Рисуване + Файлов Мениджър + Фенерче + Галерия + Клавиатура + Launcher + Музикален Плейър + Бележки + SMS Съобщения + Благодаря + Диктофон + Изглежда, че версията на приложението ви е повредена. Моля, изтеглете оригиналната версия <a href=%s>тук</a>. + + Често задавани въпроси + Преди да зададете въпрос, моля, първо прочетете + Как така не виждам това приспособление за приложения в списъка с приспособления\? + Най -вероятно е, защото сте преместили приложението на SD картата. В този случай има ограничение на Android системата, което крие дадените приспособления за приложенията. Единственото решение е да преместите приложението обратно във вътрешното хранилище чрез настройките на вашето устройство. + Искам да Ви подкрепя, но не мога да даря пари. Има ли нещо друго, което мога да направя\? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + Изтрих някои файлове по погрешка, как мога да ги възстановя\? + За съжаление не можете. Файловете се изтриват незабавно след диалоговия прозорец за потвърждение, няма наличено копие в кошчето. + Не харесвам цветовете на приспособленията, мога ли да ги променя\? + Да, докато плъзнете приспособлението на началния си екран, се появява екран за конфигурация на приспособлението. Ще видите цветни квадратчета в долния ляв ъгъл, просто ги натиснете, за да изберете нов цвят. Можете да използвате плъзгача и за регулиране на алфа-та. + Мога ли по някакъв начин да възстановя изтритите файлове\? + Ако те наистина са изтрити, не можете. Въпреки това, по подразбиране има активирано кошче, то ще доведе до това, че файловете просто се преместват в кошчето, вместо да бъдат изтрити. + Иконата за стартиране на приложението изчезна. Какво мога да направя\? + Това е причинено от вашия лаунчър, който не поддържа правилно персонализиране на иконата. Опитайте да стартирате приложението чрез Google Play или някакво приспособление, ако има такова. След като е стартирано, поставете го обратно в оранжевия цвят по подразбиране на иконата #F57C00. Може да се наложи да преинсталирате приложението в най -лошия случай. + Парите са приспаднати от банковата ми сметка, но не мога да изтегля приложението. Какво мога да направя\? + Плащанията се обработват изцяло от Google, системната им има гличове от време на време. Просто изчистете кеша на приложението Google Play и рестартирайте устройството си, след което отново го изтегляте. + Защо трябва да обновя до Про версията\? + Тъй като версията на приложението ви вече не се актуализира, грешките, които сте забелязали, никога няма да бъдат поправени. Няма да се добавят и нови функции. Можете да закупите Pro версията в Google Play за малка сума пари. Това е еднократно плащане, което означава, че след като го закупите, никога няма да се налага да плащате отново. Дори и след получаване на ново устройство. Ако няма да ви хареса Pro версията, можете просто да я деинсталирате в рамките на няколко часа и автоматично ще си върнете парите. Ако искате възстановяване на сумата по -късно, просто се свържете с нас на hello@simplemobiletools.com и ще го получите. + Как мога да избера няколко елемента наведнъж\? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + Закупих приложението, но не мога да го изтегля на друго устройство. + Опитай да изчистиш кеша на Google Play приложението и да рестартираш устройството. Това е някакъв проблем с Google Play, който всъщност не е свързан със самото приложение. + + Доброволци + Превод + Разработка + Друга помощ + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Арабски + Азербайджански + Бенгалски + Бретански + Bulgarian + Каталонски + Чешки + Уелски + Датски + Английски + Немски + Гръцки + Испански + Баски + Персийски + Финландски + Френски + Галицийски + Хинди + Хърватски + Унгарски + Индонезийски + Италиански + Иврит + Японски + Корейски + Литовски + Непалски + Норвежки + Холандски + Полски + Португалски + Румънски + Руски + Словашки + Словенски + Сръбски + Шведски + Тамил + Турски + Украински + Виетнамски + Китайски (Хонконг) + Китайски (Опростен) + Китайски (Традиционен) + + Вземете Про версията сега! + Основен + Про + Без реклами + Без достъп до интернет + 100% гаранция за връщане на парите + Еднократно плащане + Подобрен дизайн + + Редактор на снимки за напреднали + Advanced photo & video editor + Поддръжка на HEIC/HEIF файлове + Групово преименуване на файлове за напреднали + Индивидуално заключване на папките + Поддръжка за печат + + Поддръжка на часовати зони + Участници и напомняния по имейл + Лесно импортиране на събития + Нови приспособления + + Подобрено сливане на дублирани контакти + Персонализиране на размера на шрифта + Optional private contact sharing within our apps + Персонализирани мелодии за контакт + Филтриране на контактите + Privately stored contacts + + Checklists + Различна бележка и цветове за всяко приспособление + Note locking + + Date and time format customization + Home screen shortcuts + Поддръжка за компресиране на файлове + Раздел със скорошни файлове + + Background color customization + Поддръжка за импортиране на файлове + Мащабиране + + Това приложение използва следните библиотеки от трети страни, за да улесни живота ми. Благодаря. + Лицензи на трети страни + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Не забравяйте, че ако деинсталирате всяко платено приложение в рамките на 2 часа, автоматично ще бъде възстановена сумата. Ако искате възстановяване на сумата по всяко време по -късно, просто се свържете с нас на hello@simplemobiletools.com и ще го получите. Това улеснява изпробването :) + + Група обикновени приложения с отворен код за Android с гъвкави приспособления, без реклами и ненужни разрешения. +
    diff --git a/commons/src/main/res/values-bn/strings.xml b/commons/src/main/res/values-bn/strings.xml new file mode 100644 index 000000000..80f3bd3b6 --- /dev/null +++ b/commons/src/main/res/values-bn/strings.xml @@ -0,0 +1,1156 @@ + + + OK + Cancel + Back + Nothing + Later + Save as + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Open with + Edit with + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Unknown + Always + Never + Details + Notes + Deleting folder \'%s\' + None + Label + Transparent + Transparent color + Select a different color + Download + Notification + Notifications + Email + Previous + Play / Pause + Next + Number + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + + Birthday + Anniversary + + + Home + Work + + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + + Favorites + Add favorites + Add to favorites + Remove from favorites + + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + + Filter + Filter (Pro) + No items found. + Change filter + + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + + %d item + %d items + + + + + %d item + %d items + + + + Deleting %d item + Deleting %d items + + + + + %d contact + %d contacts + + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + + Delete + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + Are you sure you want to move %s into the Recycle Bin? + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Yes + No + Maybe + + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + minutes + hours + days + s + m + h + wk. + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + + Alarm + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + Vibrate on button press + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + + বাদ দিন + Exclude folder + বাদ দেওয়া ফোল্ডারসমূহ + (বাদ) + বাদ দেওয়া ফোল্ডারগুলোর ব্যবস্থাপনা + সবগুলো সরান + বাদ দেওয়া তালিকা থেকে সমস্ত ফোল্ডার সরাবেন\? এটি ফোল্ডারগুলি মুছবে না। + Temporarily show excluded + Stop showing excluded + + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + + January + February + March + April + May + June + July + August + September + October + November + December + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + M + T + W + T + F + S + S + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + + About + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + Rate us + Rate + Donate + Follow us + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + here. + ]]> + + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + + Checklists + Different note and colors per widget + Note locking + + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + + Background color customization + File importing support + Zooming + + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-br/strings.xml b/commons/src/main/res/values-br/strings.xml new file mode 100644 index 000000000..a7e38455a --- /dev/null +++ b/commons/src/main/res/values-br/strings.xml @@ -0,0 +1,1156 @@ + + OK + Cancel + Back + Nothing + Later + Save as + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Open with + Edit with + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Unknown + Always + Norse + Details + Notes + Deleting folder \'%s\' + None + Label + Transparent + Transparent color + Select a different color + Download + Notification + Notifications + Email + Previous + Play / Pause + Next + Number + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + + Birthday + Anniversary + + + Home + Work + + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + + Favorites + Add favorites + Add to favorites + Remove from favorites + + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + + Filter + Filter (Pro) + No items found. + Change filter + + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + + %d item + %d items + + + + + %d item + %d items + + + + Deleting %d item + Deleting %d items + + + + + %d contact + %d contacts + + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Personelaet + Shared + System default + + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + + Delete + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + Are you sure you want to move %s into the Recycle Bin? + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Yes + No + Maybe + + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + a vunutennoù + eur + a zevezhioù + s + m + h + wk. + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %ddevezh + %da zevezhioù + + + %dsizhun + %dsizhun + + + %dmiz + %da vizioù + + + %da vloavezhioù + %da vloavezhioù + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second before + %d seconds before + + + %dvunutenn a-raok + %da vunutennoù a-raok + + + %deur a-raok + %deur a-raok + + + %da zevezhioù a-raok + %da zevezhioù a-raok + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + + %d second + %d seconds + + + %dvunutenn + %da vunutennoù + + + %deur + %da eurioù + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. They could misbehave due to system restrictions related to battery saving. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + + Alarm + Daleañ + Dismiss + Adc\'halv ebet + D\'an deroù + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + Vibrate on button press + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + + Exclude + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + + Genver + C\'hwevrer + Meurzh + Ebrel + Mae + Mezheven + Gouere + Eost + Gwengolo + Here + Du + Kerzu + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + + Lun + Meurzh + Merc\'her + Yaou + Gwener + Sadorn + Sul + + L + M + M + Y + G + S + S + + Lun + Meu + Mer + Yao + Gwe + Sad + Sul + + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + + About + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + Rate us + Rate + Donate + Follow us + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + + here. + ]]> + + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + + Checklists + Different note and colors per widget + Note locking + + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + + Background color customization + File importing support + Zooming + + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-ca/strings.xml b/commons/src/main/res/values-ca/strings.xml new file mode 100644 index 000000000..065e74294 --- /dev/null +++ b/commons/src/main/res/values-ca/strings.xml @@ -0,0 +1,1112 @@ + + + D\'acord + Cancel·la + Enrere + Res + Més tard + Desa com a + El fitxer s\'ha desat correctament + El format del fitxer no és vàlid + Error de memòria exhaurida + S\'ha produït un error: %s + Error: %s + Obre amb + Edita amb + Edita + No s\'ha trobat cap aplicació vàlida + No s\'ha trobat cap navegador + No s\'ha trobat cap client de correu electrònic + Estableix com a + Copia al porta-retalls + Copia el número al porta-retalls + Valor copiat al porta-retalls + Valor copiat al porta-retalls:\n%s + Marca el número + Desconegut + Sempre + Mai + Detalls + Notes + S\'està suprimint la carpeta «%s» + Cap + Etiqueta + Transparent + Color transparent + Seleccioneu un color diferent + Baixa + Notificació + Notificacions + Correu electrònic + Anterior + Reprodueix / Posa en pausa + Següent + Número + No s\'ha trobat cap contacte + Sol·licita els permisos necessaris + L\'aplicació no ha pogut accedir als vostres contactes + L\'aplicació no té permís per iniciar trucades telefòniques, concediu-lo a la configuració del dispositiu + Introdueix el text aquí + Truca a %s + Confirmeu la trucada a %s + Zero + U + Dos + Tres + Quatre + Cinc + Sis + Set + Vuit + Nou + Valor + El valor no pot estar buit + Crea un contacte nou + Afegeix a un contacte existent + Aplicació malmesa + Exempció de responsabilitat + Fes una foto + Tria una foto + Tria un vídeo + Tria un contacte + Tria un fitxer + Grava àudio + Grava vídeo + S\'està actualitzant… + Emmagatzematge del telèfon + Emmagatzematge del telèfon (no visible per altres aplicacions) + Audio + + Data de naixement + Aniversari + + Llar + Feina + + Mòbil + Principal + Fax de la feina + Fax de la llar + Cercapersones + No s\'ha trobat cap número de telèfon + + Canvia el tipus de vista + Quadrícula + Quadrícula (Pro) + Quadrícula desigual + Llista + Augmenta el nombre de columnes + Redueix el nombre de columnes + Comptador de columnes + Nombre de columnes verticals + Nombre de columnes horitzontals + Canvia la imatge de la portada + Selecciona una foto + + %d columna + %d columnes + + + Gestió dels números bloquejats + No esteu bloquejant a ningú. + Afegeix un número bloquejat + Bloqueja el número + Bloqueja números + Números bloquejats + Exporta els números bloquejats + Importa els números bloquejats + Cal fer que aquesta aplicació sigui l\'aplicació predeterminada de marcatge per utilitzar els números bloquejats. + Estableix com a predeterminada + Segur que voleu bloquejar «%s»\? + Bloqueja les trucades de contactes no emmagatzemats + Bloqueja els missatges dels contactes no emmagatzemats + Introduïu un número o un patró (per exemple, *12345*, +1*8888) per bloquejar totes les trucades i missatges dels números que coincideixin amb el patró. + No es poden bloquejar números desconeguts sense el permís d\'identificació de trucades. + + Preferits + Afegeix preferits + Afegeix als preferits + Elimina dels preferits + + Cerca + Cerca a %s + Escriviu com a mínim 2 caràcters per iniciar la cerca. + Cerca contactes + Cerca als preferits + Cerca aplicacions + Cerca esdeveniments + Cerca grups + Historial de cerques + Cerca trucades + Cerca fitxers + Cerca carpetes + Cerca fitxers i carpetes + Cerca llistes de reproducció + Cerca artistes + Cerca àlbums + Cerca pistes + Cerca text + Cerca converses + Cerca enregistraments + + Filtre + Filtre (Pro) + No s\'ha trobat cap element. + Canvia el filtre + + Es requereix permís d\'accés a l\'emmagatzematge + Es requereix permís d\'accés als contactes + Es requereix permís d\'accés a la càmera + Es requereix permís d\'accés a l\'àudio + Sense permís + Heu de permetre que l\'aplicació mostri notificacions, en cas contrari no podrà mostrar els recordatoris. + Heu de permetre que l\'aplicació mostri notificacions, en cas contrari no podrà mostrar la barra de progrés. + Heu de permetre que l\'aplicació mostri notificacions, en cas contrari no podrà reproduir cançons. + Heu de permetre que l\'aplicació mostri notificacions, en cas contrari no podrà enregistrar àudio. + Heu de permetre que l\'aplicació mostri notificacions, en cas contrari no podrà mostrar les trucades entrants. + Heu de permetre que l\'aplicació mostri notificacions, en cas contrari no podrà mostrar els missatges entrants. + Atorga el permís + Es requereix permís + + Canvia el nom del fitxer + Canvia el nom de la carpeta + No s\'ha pogut canviar el nom del fitxer + No s\'ha pogut canviar el nom de la carpeta + El nom de la carpeta no pot estar buit + Ja existeix una carpeta amb aquest nom + No es pot canviar el nom de la carpeta arrel d\'un emmagatzematge + La carpeta s\'ha canviat de nom correctament + S\'està canviant el nom de la carpeta + El nom del fitxer no pot estar buit + El nom del fitxer conté caràcters no vàlids + El nom de fitxer «%s» conté caràcters no vàlids + L\'extensió no pot estar buida + El fitxer d\'origen %s no existeix + Preposa als noms de fitxer + Afegeix els noms de fitxer + Canvi de nom senzill + Patró + Cadena a afegir + %Y - any +\n%M - mes +\n%D - dia +\n%h - hora +\n%m - minut +\n%s - segon +\n%i - nombre augmentant des d\'1 + Nom del fitxer (sense .txt) + Nom del fitxer (sense .json) + Nom del fitxer (sense .zip) + A partir d\'Android 11 ja no podeu ocultar fitxers ni carpetes com aquests + + Copia + Mou + Copia / Mou + Copia a + Mou a + Origen + Destinació + Selecció de la destinació + Feu clic aquí per seleccionar la destinació + No s\'ha pogut escriure a la destinació seleccionada + Seleccioneu una destinació + L\'origen i la destinació no poden ser el mateix + No s\'han pogut copiar els fitxers + S\'està copiant… + Els fitxers s\'han copiat correctament + El fitxer s\'ha copiat correctament + S\'ha produït un error + S\'està movent… + Els fitxers s\'han mogut correctament + El fitxer s\'ha mogut correctament + Alguns fitxers no s\'han pogut moure + Alguns fitxers no s\'han pogut copiar + No s\'ha seleccionat cap fitxer + S\'està desant… + No s\'ha pogut crear la carpeta %s + No s\'ha pogut crear el fitxer %s + No s\'ha trobat cap element nou + La destinació no té prou espai disponible.\nNecessari %1$s, disponible %2$s + El servei del sistema per seleccionar fitxers i carpetes no està disponible + + Crea nou + Carpeta + Fitxer + Crea una carpeta nova + Ja existeix un fitxer o carpeta amb aquest nom + El nom conté caràcters no vàlids + Introduïu un nom + S\'ha produït un error desconegut + + El fitxer «%s» ja existeix + El fitxer «%s» ja existeix. Cal sobreescriure\'l\? + La carpeta «%s» ja existeix + Fusiona + Mantén els dos + Sobreescriu + Omet + Afegeix amb «_1» + Aplica-ho a tots + El sistema no permet l\'operació en aquesta carpeta, trieu-ne una altra + El sistema no permet copiar en aquesta carpeta. Trieu-ne una altra + El sistema no permet canviar el nom en aquesta carpeta + No es poden canviar els noms de les carpetes directament a l\'emmagatzematge intern, només les subcarpetes + No s\'ha pogut canviar el nom d\'aquesta carpeta + + Selecciona una carpeta + Seleccioneu un fitxer + Confirmació d\'accés a l\'emmagatzematge extern + Confirmació d\'accés a les carpetes + Trieu la carpeta superior de la targeta SD a la pantalla següent, per atorgar accés d\'escriptura + Si no veieu la targeta SD, proveu això + Permeteu que l\'aplicació accedeixi a l\'emmagatzematge seleccionat prement «Utilitza aquesta carpeta» a la part inferior de la pantalla següent. + Permeteu l\'accés a «<b>%s</b>» prement «<b>Utilitza aquesta carpeta</b>» a la part inferior de la pantalla següent. + Premeu «<b>Desa</b>» a la part inferior de la pantalla següent per crear la carpeta nova. + Confirmeu la selecció + S\'està carregant… + Si us plau, concediu accés de la nostra aplicació a tots els vostres fitxers, és possible que no funcioni bé sense això. + + %d element + %d elements + + + + %d element + %d elements + + + S\'està suprimint %d element + S\'estan suprimint %d elements + + + + %d contacte + %d contactes + + + Seleccioneu l\'emmagatzematge + Emmagatzematge + Intern + Targeta SD + Arrel + S\'ha seleccionat una carpeta incorrecta, seleccioneu la carpeta principal de la targeta SD + Els camins de la targeta SD i del dispositiu USB no poden ser els mateixos + Sembla que l\'aplicació està instal·lada en una targeta SD, això fa que els ginys de l\'aplicació no estiguin disponibles. No els veureu a la llista de ginys disponibles. És una limitació del sistema, de manera que si voleu utilitzar els ginys, cal tornar a moure l\'aplicació a l\'emmagatzematge intern. + S\'ha seleccionat una carpeta incorrecta, seleccioneu el camí «%s» + + Propietats + Camí + Elements seleccionats + Recompte de fills directes + Comptador total de fitxers + Resolució + Durada + Artista + Àlbum + Distància focal + Temps d\'exposició + Velocitat ISO + Nombre f + Càmera + EXIF + Títol de la cançó + Coordenades GPS + Altitud + Elimina l\'EXIF + Segur que voleu eliminar els valors de l\'EXIF com les coordenades GPS, el model de càmera, etc.\? + Els valors de l\'EXIF s\'han eliminat correctament + + Color de fons + Color del text + Color primari + Color d\'accent del tema blanc + Color d\'accent del tema blanc i negre + Color de primer pla + Color de la icona d\'aplicació + Color de la barra inferior de navegació + Restaura els valors predeterminats + Utilitza el valor predeterminat + Predeterminat + Canvia el color + Tema + Si canvieu un color, canviarà al tema personalitzat + Desa + Descarta + Desfés els canvis + Segur que voleu desfer els canvis\? + Aquesta acció no es pot desfer. + Hi ha canvis no desats. Els voleu desar abans de sortir\? + Aplica els colors a totes les aplicacions Simple + ADVERTÈNCIA: Alguns llançadors no gestionen correctament la personalització de la icona d\'aplicació. En cas que la icona desaparegui, proveu de llançar l\'aplicació mitjançant Google Play o algun giny, si està disponible. Un cop llançat, configureu la icona de color taronja predeterminat #F57C00. És possible que calgui tornar a instal·lar l\'aplicació en el pitjor dels casos. + Colors actualitzats correctament. S\'ha afegit un tema nou anomenat «Compartit». Feu-lo servir per actualitzar tots els colors de l\'aplicació en el futur. + Tingueu en compte que tot i que utilitzeu la versió Pro de l\'aplicació, encara cal tenir Simple Thank You per motius tècnics. S\'ocupa de la sincronització del color. + Si us plau, compreu l\'aplicació <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> per desbloquejar aquesta funció i ajudar al desenvolupament. Gràcies! + + Clar + Fosc + Automàtic + Clar / fosc automàtic + Solaritzat + Vermell fosc + Blanc + Blanc i negre + Personalitzat + Compartit + Predeterminat del sistema + + Què hi ha de nou + * Aquí només s\'enumeren les actualitzacions més importants. Sempre hi ha també millores petites + + Suprimeix + Elimina + Canvia el nom + Comparteix + Comparteix a través + Redimensiona + Selecciona-ho tot + Selecciona el text + Oculta + Mostra + Oculta la carpeta + Mostra la carpeta + Mostra temporalment el que està ocult + Deixa de mostrar contingut multimèdia ocult + No podeu compartir tot aquest contingut alhora + Buida i desactiva la paperera de reciclatge + Desfés + Refés + Imprimeix + Imprimeix (Pro) + Drecera + Crea una drecera + Crea una drecera (Pro) + Afegeix un número al contacte + Veure els detalls de contacte + Truca des de la SIM 1 + Truca des de la SIM 2 + Commuta la visibilitat del nom de fitxer + Mou a la part superior + Mou a la part inferior + Fixa l\'element + Desfixa l\'element + Envia un SMS + Envia un correu electrònic + Truca + Detalls del contacte + Afegeix un contacte + Fons de pantalla + + Ordena per + Nom + Mida + Última modificació + Data de creació + Data de realització + Títol + Nom de fitxer + Extensió + Aleatori + Ordena aleatòriament + Ascendent + Descendent + Utilitza només per a aquesta carpeta + Ordena les parts numèriques pel valor real + Nom + Nom del mig + Cognom + Nom complet + Utilitza l\'ordenació personalitzada + Canvia l\'ordre + + Segur que voleu continuar amb la supressió\? + Segur que voleu suprimir %s\? + Delete %s? + + Segur que voleu moure %s a la paperera\? + + Segur que voleu suprimir aquest element\? + Segur que voleu moure aquest element a la paperera\? + No tornis a preguntar-ho en aquesta sessió + No ho tornis a mostrar + + No + Potser + + ADVERTÈNCIA: Se suprimirà %d carpeta + ADVERTÈNCIA: Se suprimiran %d carpetes + + + PIN + Introduïu el PIN + Introduïu un PIN + PIN incorrecte + Repetiu el PIN + Patró + Introduïu el patró + Patró incorrecte + Repetiu el patró + Biometria + Empremta digital + Afegeix una empremta digital + Poseu el dit al sensor d\'empremtes dactilars + Obre el diàleg de verificació d\'identificació biomètrica + Autentica + L\'autenticació ha fallat + S\'ha bloquejat l\'autenticació, torneu a provar-ho d\'aquí a un moment + No hi ha cap empremta digital registrada. Afegiu-ne alguna a la configuració del dispositiu + Aneu a la configuració + Configuració correcta de la contrasenya. Torneu a instal·lar l\'aplicació en cas que l\'oblideu. + Configuració correcta de la protecció. Torneu a instal·lar l\'aplicació en cas de problemes per restablir-la. + Bloqueja la carpeta + Bloqueja la carpeta (Pro) + Desbloqueja la carpeta + Aquesta protecció només funciona en aquesta aplicació. No substituirà un xifratge real de carpetes de tot el sistema. + + Ahir + Avui + Demà + Cada dia + Oculta l\'any + segons + minuts + hores + dies + s + m + h + wk. + + %d segon + %d segons + + + %d minut + %d minuts + + + %d hora + %d hores + + + %d dia + %d dies + + + %d setmana + %d setmanes + + + %d mes + %d mesos + + + %d any + %d anys + + + + %d segon + %d segons + + + %d minut + %d minuts + + + %d hora + %d hores + + + %d dia + %d dies + + + %d setmana + %d setmanes + + + %d mes + %d mesos + + + %d any + %d anys + + + + %d segon abans + %d segons abans + + + %d minut abans + %d minuts abans + + + %d hora abans + %d hores abans + + + %d dia abans + %d dies abans + + + %d setmana abans + %d setmanes abans + + + %d mes abans + %d mesos abans + + + %d any abans + %d anys abans + + + + %d segon + %d segons + + + %d minut + %d minuts + + + %d hora + %d hores + + + %d dia + %d dies + + + %d setmana + %d setmanes + + + %d mes + %d mesos + + + %d any + %d anys + + + Temps restant fins que soni l\'alarma: \n%s + Temps restant fins que s\'activi el recordatori:\n%s + Temps restant:\n%s + Assegureu-vos que l\'alarma funcioni correctament abans de confiar-hi. Pot comportar-se malament per les restriccions del sistema relacionades amb l\'estalvi de bateria. + Assegureu-vos que els recordatoris funcionin correctament abans de confiar-hi. Comproveu la configuració de la bateria i de les notificacions, que no hi hagi res que bloquegi els recordatoris o que mati l\'aplicació en el segon pla. + Les notificacions d\'aquesta aplicació estan desactivades. Aneu a la configuració del dispositiu per activar-les. + + Alarma + Ajorna + Descarta + Cap recordatori + A l\'inici + Sons del sistema + Els meus sons + Afegeix un so nou + Sense so + Durant el dia a les hh:mm + Durant el dia a les %02d:%02d + + Configuració + Compra Simple Thank You + General + Personalització del color + Personalització del color millorada + Personalitza els colors + Personalitza els colors (bloquejat) + Bloquejat + Personalitza els colors dels ginys + Personalitza les notificacions + Notification sound + Utilitza l\'idioma anglès + Idioma + Mostra els elements ocults + Mida de la lletra + Petita + Mitjana + Gran + Extragran + Protegeix amb contrasenya la visibilitat dels elements ocults + Protegeix amb contrasenya tota l\'aplicació + Protegeix amb contrasenya la supressió i el moviment dels fitxers + Conserva el valor de darrera modificació anterior a les operacions de fitxer + Mostra una bombolla d\'informació en desplaçar elements arrossegant la barra de desplaçament + Evita que el telèfon s\'adormi mentre l\'aplicació està en primer pla + Omet sempre el diàleg de confirmació de supressió + Activa el lliscament des de la part superior per actualitzar + Utilitza el format horari de 24 hores + Canvia el format de data i hora + Comença la setmana el diumenge + Ginys + Utilitza sempre el mateix temps d\'ajornament + Temps d\'ajornament + Vibra en prémer els botons + Mou elements a la paperera de reciclatge en lloc de suprimir-los + Interval de neteja de la paperera de reciclatge + Buida la paperera de reciclatge + Força el mode de retrat + Exporta la configuració + Importa una configuració + La configuració s\'ha exportat correctament + La configuració s\'ha importat correctament + Comença el nom amb el cognom + Neteja la memòria cau + Mostra un diàleg de confirmació de trucada abans d\'iniciar una trucada + + Visibilitat + Seguretat + Desplaçament + Operacions amb fitxers + Paperera de reciclatge + Desament + Inici + Text + Migració + Qualitat + Pantalla principal + Miniatures + Vista de llista + + Exclou + Exclou la carpeta + Carpetes excloses + (exclòs) + Gestiona les carpetes excloses + Elimina-ho tot + Elimino totes les carpetes de la llista d\'excloses\? Això no eliminarà les carpetes. + Mostra temporalment les excloses + Deixa de mostrar les excloses + + Gestiona les pestanyes mostrades + Pestanya a obrir en iniciar l\'aplicació + Contactes + Preferits + Historial de trucades + Grups + Darrer utilitzat + Fitxers + Fitxers recents + + Restaura aquest fitxer + Restaura els fitxers seleccionats + Restaura tots els fitxers + La paperera de reciclatge s\'ha buidat correctament + Els fitxers s\'han restaurat correctament + Segur que voleu buidar la paperera de reciclatge\? Els fitxers es perdran per sempre. + La paperera de reciclatge és buida + Moure els elements de la paperera està de reciclatge desactivat, utilitzeu la restauració + Mostra la paperera de reciclatge + Oculta la paperera de reciclatge + Obre la paperera de reciclatge + Omet la paperera de reciclatge, suprimeix directament els fitxers + + S\'està movent %d element a la paperera de reciclatge + S\'estan movent %d elements a la paperera de reciclatge + + + S\'està important… + S\'està exportant… + Importació correcta + Exportació correcta + Ha fallat la importació + Ha fallat l\'exportació + Ha fallat la importació d\'algunes entrades + Ha fallat l\'exportació d\'algunes entrades + No s\'ha trobat cap entrada per importar + No s\'ha trobat cap entrada nova per importar + No s\'ha trobat cap entrada per exportar + Còpies de seguretat + Activa les còpies de seguretat automàtiques + Gestió de les còpies de seguretat automàtiques + Podeu emprar els patrons següents per a donar nom automàticament als fitxers: +\n +\n%Y - any +\n%M - mes +\n%D - dia +\n%h - hora +\n%m - minut +\n%s - segon + + USB + Sembla que hi ha un dispositiu USB connectat al vostre dispositiu. Per assegurar que els fitxers apareguin adequadament, cal atorgar permisos addicionals. + Seleccioneu la carpeta arrel del dispositiu USB a la pantalla següent per atorgar l\'accés + S\'ha seleccionat una carpeta incorrecta, seleccioneu la carpeta principal del dispositiu USB + + Gener + Febrer + Març + Abril + Maig + Juny + Juliol + Agost + Setembre + Octubre + Novembre + Desembre + + gen. + febr. + març + abr. + maig + juny + jul. + ag. + set. + oct. + nov. + des. + + de gener + de febrer + de març + d\'abril + de maig + de juny + de juliol + d\'agost + de setembre + d\'octubre + de novembre + de desembre + Dilluns + Dimarts + Dimecres + Dijous + Divendres + Dissabte + Diumenge + DL + DT + DC + DJ + DV + DS + DG + dl. + dt. + dc. + dj. + dv. + ds. + dg. + + La versió de l\'aplicació ja no s\'actualitzarà més. Actualitzeu a la versió Pro per rebre correccions noves i altres millores. + La versió de l\'aplicació ja no s\'actualitzarà més. Actualitzeu a la versió Pro per rebre solucions noves i altres millores fent clic aquí. + És gratuïta fins a: %s. Si la baixeu fins aleshores, podreu utilitzar-la de franc per sempre. + Més informació + Actualitza + Cal migrar els esdeveniments emmagatzemats localment de manera manual mitjançant l\'exportació en un fitxer .ics, i després importar-los. Podeu trobar els dos botons d\'exportació/importació al menú de la pantalla principal. + Hola, +\n +\nsembla que acabeu d\'actualitzar a partir de la versió gratuïta. Un cop estigueu satisfet amb aquesta i potser hàgiu migrat la vostra configuració i els favorits, podeu desinstal·lar l\'antiga gratuïta per evitar que l\'inicieu accidentalment, ja que no la necessitareu. +\n +\nGràcies! + Hola, +\n +\nsembla que ja teniu la versió Pro de l\'aplicació. Un cop estigueu satisfet amb ella i potser hàgiu migrat la vostra configuració i els favorits, podeu desinstal·lar-la per evitar que la inicieu accidentalment, ja que no la necessitareu. +\n +\nGràcies! + Hola +\n +\nsembla que acabeu d\'actualitzar a partir de la versió gratuïta. Un cop estigueu satisfet amb aquesta i potser hàgiu migrat les vostres dades, podeu desinstal·lar l\'antiga gratuïta per evitar llançar-la accidentalment, ja que ja no la necessitareu més. +\n +\nGràcies! + Hola, +\n +\nsembla que ja teniu també la versió Pro de l\'aplicació. Un cop estigueu satisfet amb ella i potser hàgiu migrat les dades, podeu desinstal·lar-la per evitar que l\'inicieu accidentalment, ja que ja no la necessitareu. +\n +\nGràcies! + Hola, +\n +\nsembla que acabeu d\'actualitzar a partir de la versió gratuïta. Si voleu migrar els esdeveniments emmagatzemats localment, heu de fer-ho manualment exportant-los a un fitxer .ics en la versió gratuïta de l\'aplicació i important-los aquí a través del menú superior. +\n +\nQuan estigueu satisfet amb la vostra configuració de la versió Pro, podeu desinstal·lar l\'antiga gratuïta perquè ja no la necessitareu. +\n +\nGràcies! + Hola, +\n +\nsembla que acabeu d\'actualitzar a partir de la versió gratuïta. Si teníeu contactes emmagatzemats a «%s», cal migrar-los manualment exportant-los en un fitxer .vcf des de la versió gratuïta de l\'aplicació i important-los aquí a través del menú superior. +\n +\nQuan estigueu satisfet amb la vostra configuració de la versió Pro, podeu desinstal·lar l\'antiga gratuïta perquè ja no la necessitareu. +\n +\nGràcies! + Hola, +\n +\nsembla que acabeu d\'actualitzar a partir de la versió gratuïta. Si voleu migrar les notes, cal fer-ho manualment exportant-les a un fitxer en la versió gratuïta de l\'aplicació i important-les aquí a través del menú superior. +\n +\nQuan estigueu satisfet amb la vostra configuració de la versió Pro, podeu desinstal·lar l\'antiga gratuïta perquè ja no la necessitareu. +\n +\nGràcies! + + Quant a + Lloc web + Per al codi font visiteu + Envieu els vostres comentaris o suggeriments a + Actualitzeu a Pro + Més aplicacions + Més aplicacions nostres + Convideu amistats + Hola, vine a veure %1$s a %2$s + Convideu a través de + Valoreu-nos + Valora + Donació + Seguiu-nos + v %1$s\nCopyright © Simple Mobile Tools %2$d + Assistència + Ajudeu-nos + Social + Altres + Política de privadesa + Versió %s + Hola :) + Fet amb ❤️ a Eslovàquia + Informació addicional + Versió de l\'aplicació: %s + SO del dispositiu: %s + Hola,<br><br> esperem que gaudiu de l\'aplicació. No conté cap anunci, així que si us plau, ajudeu el seu desenvolupament comprant l\'aplicació <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>, també evitarà que aquest diàleg es torni a mostrar.<br><br> Gràcies! + Hola,<br><br>espero que gaudiu de l\'aplicació. No conté anuncis i tampoc es recopilen les vostres dades. Si us plau, doneu suport al seu desenvolupament comprant <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank Tou</a>. També disposareu de totes les funcions de l\'aplicació incloent-hi la personalització del color desbloquejada.<br><br>Gràcies! + Ajudeu-nos comprant la <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>, també desbloquejarà totes les funcions de l\'aplicació incloent-hi la personalització del color. + Compra + Encarregueu un Simple Phone + Si us plau, actualitzeu Simple Thank You a la darrera versió + Abans de fer una pregunta, reviseu la configuració de l\'aplicació i llegiu les preguntes més freqüents. Potser hi és la solució. + Abans de fer una valoració, reviseu la configuració de l\'aplicació i llegiu les preguntes més freqüents. Si teniu problemes, potser hi és la solució. + Assegureu-vos també que utilitzeu la versió més recent de l\'aplicació. + Tingueu en compte que aquesta versió de l\'aplicació ja no s\'està desenvolupant, aconseguiu la versió Pro amb moltes millores. + Llegiu-ho + Llegiu les preguntes més freqüents + Hola, +\n +\nsembla que esteu utilitzant aquesta aplicació des de fa força temps, i ho agraïm sincerament. +\n +\nSi us podem demanar un favor, valoreu-nos a Google Play, si us plau. Això ens ajudarà molt. +\n +\nNo importa què decidiu, no tornareu a veure aquest missatge. +\n +\nGràcies! + Valoreu la nostra aplicació, si us plau :) + Gràcies + El giny està bloquejat. +\nActualitzeu a la versió Pro per desbloquejar-lo. + Aquesta funció està bloquejada, compreu <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> per desbloquejar l\'aplicació completa.<br><br>És un pagament únic i si no us satisfà, podem reembossar-ho. + + Hola,<br><br> només informar-vos que recentment s\'ha publicat una aplicació nova:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Podeu baixar-la prement el títol.<br><br> Gràcies + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + Llançador d\'aplicacions + Calculadora + Calendari + Càmera + Rellotge + Contactes + Marcador + Dibuix + Gestor de fitxers + Llanterna + Galeria + Teclat + Llançador + Reproductor de música + Notes + Missatges SMS + Gràcies + Enregistrador de veu + Sembla que aquesta versió de l\'aplicació està malmesa. Baixeu la versió original <a href=%s>aquí</a>. + + Preguntes més freqüents + Abans de fer una pregunta, primer llegiu les + Com és que no veig aquest giny a la llista de ginys\? + Probablement, perquè heu mogut l\'aplicació a una targeta SD. Hi ha una limitació del sistema d\'Android que oculta els ginys de l\'aplicació en aquest cas. L\'única solució és moure l\'aplicació a l\'emmagatzematge intern a través de la configuració del dispositiu. + Vull ajudar-vos, però no puc donar diners. Hi ha quelcom més que pugui fer\? + Sí, és clar. Podeu difondre les aplicacions o fer bones valoracions i comentaris. També podeu ajudar traduint les aplicacions a un idioma nou o simplement actualitzant algunes traduccions existents. La guia per traduir es troba en <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>aquest lloc web</a>, o senzillament poseu-vos en contacte amb nosaltres a <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> si teniu cap pregunta. + He suprimit alguns fitxers per error, com els puc recuperar\? + Malauradament, no podeu fer-ho. Els fitxers se suprimeixen a l\'instant després del diàleg de confirmació, no hi ha cap paperera disponible. + No m\'agraden els colors del giny, puc canviar-los\? + Sí, mentre arrossegueu un giny a la pantalla d\'inici apareixerà una pantalla de configuració de ginys. Veureu quadrats de color a l\'extrem inferior esquerre, només cal prémer-los per seleccionar un color nou. També podeu utilitzar el control lliscant per ajustar l\'alfa. + Puc restaurar d\'alguna manera els fitxers suprimits\? + Si es van suprimir totalment, no ho podeu fer. Tanmateix, hi ha una paperera de reciclatge activada de manera predeterminada que farà que els fitxers es moguin allà en lloc de suprimir-los. + Ha desaparegut la icona del menú d\'aplicacions. Què puc fer? + El vostre llançador no és compatible amb la personalització correcta d\'icones. Intenteu iniciar l\'aplicació mitjançant Google Play o algun giny, si està disponible. Un cop llançada, configureu la icona de taronja #F57C00 predeterminat. És possible que hàgiu de tornar a instal·lar l\'aplicació en el pitjor dels casos. + Els diners s\'han descomptat del meu compte bancari, però no puc baixar l\'aplicació. Què puc fer\? + Google gestiona completament els pagaments, i alguns cops això genera problemes en el seu sistema. Només cal que netegeu la memòria cau de l\'aplicació Google Play i reinicieu el dispositiu, després torneu a intentar baixar-la. + Per què he d\'actualitzar a la versió Pro? + Com que la versió de l\'aplicació ja no s\'actualitza, els errors que potser heu vist no es corregiran. Tampoc s\'afegiran funcions noves. Podeu comprar la versió Pro a Google Play per una petita quantitat de diners. Es tracta d\'un pagament únic, cosa que significa que un cop que l\'adquiriu, no caldrà tornar a pagar mai més. Ni tan sols després de canviar de dispositiu. Si no us agrada la versió Pro, podeu desinstal·lar-la en poques hores i automàticament es retornaran els diners. Si voleu un reemborsament més endavant, poseu-vos en contacte amb nosaltres a l\'adreça hello@simplemobiletools.com i ho aconseguireu. + Com puc seleccionar diversos elements alhora? + Hi ha diverses maneres de fer-ho. La primera és iniciar el mode de selecció prement prolongadament un element i, a continuació, fer clic breu sobre els altres per seleccionar-los. La segona forma és similar a la selecció d\'elements en els ordinadors amb un ratolí, només cal que inicieu el mode de selecció prement prolongadament un element i, tot seguit, arrossegueu-lo amb el dit cap a altres elements per seleccionar-los. La tercera manera de seleccionar diversos elements consisteix a prémer prolongadament un element, després prémer prolongadament un altre i se seleccionarà tot el que hi ha entre els dos. Si voleu seleccionar tots els elements; només cal que premeu prolongadament un element i, a continuació, feu clic al comptador d\'elements seleccionats a l\'extrem superior esquerre. Això seleccionarà o anul·larà la selecció de tot. + He comprat l\'aplicació, però no la puc baixar en cap altre dispositiu. + Proveu de netejar la memòria cau de l\'aplicació Google Play i reinicieu el dispositiu. Es tracta d\'un problema de Google Play, que no està realment relacionat amb l\'aplicació en si. + + Col·laboradors + Traducció + Desenvolupament + Altra ajuda + Aquesta llista conté tots els que van ajudar notablement a qualsevol aplicació de la suite Simple Mobile Tools, no només aquesta. Les traduccions són gestionades per voluntaris, fes-nos saber si vós també voleu ajudar. La guia per traduir es troba a <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>aquest lloc web</a>, o simplement poseu-vos en contacte amb nosaltres a <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> si teniu qualsevol pregunta. Gràcies a tots els col·laboradors i altres patrocinadors! + Àrab + Àzeri + Bengalí + Bretó + Búlgar + Català + Txec + Gal·lès + Danès + Anglès + Alemany + Grec + Espanyol + Basc + Persa + Finès + Francès + Gallec + Hindi + Croat + Hongarès + Indonesi + Italià + Hebreu + Japonès + Coreà + Lituà + Nepalès + Noruec + Holandès + Polonès + Portuguès + Romanès + Rus + Eslovac + Eslovè + Serbi + Suec + Tàmil + Turc + Ucraïnès + Vietnamita + Xinès (Hong Kong) + Xinès (simplificat) + Xinès (tradicional) + + Aconseguiu ara la versió Pro! + Bàsica + Pro + Sense anuncis + Sense accés a Internet + Garantia de devolució de diners 100% + Pagament únic + Disseny millorat + + Editor de fotos avançat + Editor avançat de fotos i vídeos + Implementació de fitxers HEIC/HEIF + Canvi de nom de fitxers per lots avançat + Bloqueig de carpetes individuals + Implementació de la impressió + + Implementació de zones horàries + Assistents i recordatoris per correu electrònic + Importació fàcil d\'esdeveniments + Ginys nous + + S\'ha millorat la combinació de contactes duplicats + Personalització de la mida de la lletra + Compartició opcional de contactes privats a les nostres aplicacions + Tons de contacte personalitzables + Filtratge de contactes + Contactes desats de forma privada + + Llistes de comprovació + Notes i colors diferents per giny + Bloqueig de notes + + Personalització del format de data i hora + Dreceres de pantalla inicial + Implementació de compressió de fitxers + Pestanya amb els fitxers recents + + Personalització del color de fons + Implementació de la importació de fitxers + Zoom + + Aquesta aplicació fa servir les biblioteques següents de tercers que ens faciliten la feina. Gràcies. + Llicències de tercers + Kotlin (llenguatge de programació) + Subsampling Scale Image View (visualització d\'imatges amb zoom) + Glide (càrrega i memòria cau d\'imatges) + Picasso (càrrega i memòria cau d\'imatges) + Android Image Cropper (escapça i gira les imatges) + RtlViewPager (lliscament de dreta a esquerra) + Joda-Time (substitució de les dates de Java) + Stetho (depuració de bases de dades) + Otto (bus d\'esdeveniments) + PhotoView (GIF amb zoom) + PatternLockView (protecció amb patró) + Reprint (protecció d\'empremtes digitals) + Gif Drawable (càrrega de GIF) + AutoFitTextView (canvi de mida de text) + Robolectric (entorn de treball de proves) + Espresso (ajudant de proves) + Gson (analitzador JSON) + Leak Canary (detector de fuites de memòria) + Number Picker (selector personalitzable de números) + ExoPlayer (reproductor de vídeo) + VR Panorama View (visualització de panorames) + Apache Sanselan (lectura de metadades d\'imatges) + Android Photo Filters (filtres d\'imatge) + Gesture Views (imatges amb zoom) + Indicator Fast Scroll (lletres a la barra de desplaçament) + Event Bus (comunicació dins de l\'aplicació) + Audio Record View (visualització d\'àudio) + SMS MMS (gestió d\'SMS i MMS) + APNG Android (implementa WebP animades) + PDFViewPager (visualitzador de PDF) + Analitzador M3U (gestió de fitxers «m3u» de llistes de reproducció) + AndroidLame (codificador «mp3») + + La prova ha caducat + Comença la prova gratuïta + Aquesta versió de prova caduca aviat. + Desbloqueja l\'aplicació durant un últim dia + Us donem la benvinguda a %s! + Gràcies per utilitzar la nostra aplicació. Podeu utilitzar aquesta versió desbloquejada durant %d dies. Un cop finalitzi la prova, considereu l\'actualització a la versió Pro. Té una gran quantitat de funcions noves, un disseny modern, sense anuncis i moltes altres millores. +\n +\nNomés l\'heu de pagar una vegada a la vida i si no esteu satisfet, podeu desinstal·lar-la i obtenir un reemborsament. +\n +\nEspero que us agradi :) + Si us plau, actualitzeu a la versió Pro per gaudir de l\'aplicació al màxim. +\n +\nNomés l\'heu de pagar una vegada a la vida i si no esteu satisfet, podeu desinstal·lar-la i obtenir un reemborsament. +\n +\nEns veiem allà :) + + Aquesta versió de prova caduca d\'aquí a %d dia. + Aquesta versió de prova caduca d\'aquí a %d dies. + + + OBSOLETA: Aquesta versió de l\'aplicació ja no es manté, obteniu la versió Pro a https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + No oblideu que si desinstal·leu qualsevol aplicació de pagament en un termini de 2 hores, el càrrec es retornarà automàticament. Si voleu un reemborsament més tard, poseu-vos en contacte amb nosaltres a hello@simplemobiletools.com i el rebreu. Això fa que sigui fàcil provar-ho :) + + Un grup d\'aplicacions Android simples i de codi obert amb ginys personalitzables, sense anuncis ni permisos innecessaris. + \ No newline at end of file diff --git a/commons/src/main/res/values-cs/strings.xml b/commons/src/main/res/values-cs/strings.xml new file mode 100644 index 000000000..5525bc162 --- /dev/null +++ b/commons/src/main/res/values-cs/strings.xml @@ -0,0 +1,1161 @@ + + + OK + Zrušit + Zpět + Nic + Později + Uložit jako + Soubor byl úspěšně uložen + Neplatný formát souboru + Zařízení nemá dostatek paměti + Vyskytla se chyba: %s + Chyba: %s + Otevřít pomocí + Upravit v + Upravit + Nenalezena žádná vhodná aplikace + Nenalezen žádný prohlížeč + Nenalezen žádný poštovní klient + Nastavit jako + Zkopírovat do schránky + Zkopírovat číslo do schránky + Hodnota byla zkopírována do schránky + Hodnota byla zkopírována do schránky: +\n%s + Vytočit číslo + Neznámé + Vždy + Nikdy + Detaily + Poznámky + Odstraňuje se složka „%s“ + Žádné + Štítek + Průhledné + Průhledná barva + Zvolit jinou barvu + Stáhnout + Oznámení + Oznámení + E-mail + Předchozí + Hrát / Pauza + Následující + Číslo + Nenalezeny žádné kontakty + Vyžádat potřebná oprávnění + Aplikace nemohla získat přístup k vašim kontaktům + Aplikace nemá oprávnění pro zahájení telefonních hovorů. Prosím, poskytněte jej v nastavení zařízení + Sem vložte text + Zavolat %s + Potvrďte volání %s + Nula + Jedna + Dvě + Tři + Čtyři + Pět + Šest + Sedm + Osm + Devět + Hodnota + Hodnota nesmí být prázdná + Vytvořit nový kontakt + Přidat k existujícímu kontaktu + Aplikace je poškozená + Vyloučení odpovědnosti + Pořídit fotku + Vybrat fotku + Vybrat video + Vyberte kontakt + Vybrat soubor + Nahrát zvuk + Nahrát video + Upravuje se… + Úložiště telefonu + Úložiště telefonu (neviditelné pro ostatní aplikace) + Audio + + Narozeniny + Výročí + + Domov + Práce + + Mobil + Hlavní + Pracovní fax + Domácí fax + Pager + Nenalezeno žádné telefonní číslo + + Změnit typ zobrazení + Mřížka + Mřížka (Pro) + Nerovnoměrná mřížka + Seznam + Zvýšit počet sloupců + Snížit počet sloupců + Počet sloupců + Počet sloupců na výšku + Počet sloupců na šířku + Změnit obrázek složky + Vybrat obrázek + + %d sloupec + %d sloupce + %d sloupců + + + Spravovat blokovaná čísla + Nikoho neblokujete. + Přidat blokované číslo + Blokovat číslo + Blokovat čísla + Blokovaná čísla + Exportovat blokovaná čísla + Importovat blokovaná čísla + Pro použití blokování čísel musíte nastavit tuto aplikaci jako výchozí pro správu hovorů. + Nastavit jako výchozí + Jste si jistí, že chcete zablokovat „%s“\? + Blokovat volání z neznámých čísel + Blokovat zprávy z neznámých čísel + Zadáním čísla nebo vzoru (např. *12345*, +1*8888) zablokujete všechny hovory a zprávy z čísel odpovídajících vzoru. + Nelze blokovat neznámá čísla bez povolení ID volajícího. + + Oblíbené + Přidat oblíbené + Přidat do oblíbených + Odebrat z oblíbených + + Hledat + Hledat ve složce %s + Zadejte alespoň 2 znaky pro zahájení hledání. + Hledat kontakty + Hledat oblíbené + Hledat aplikace + Hledat události + Hledat skupiny + Hledat historii + Hledat hovory + Hledat soubory + Hledat složky + Hledat soubory a složky + Hledat playlisty + Hledat umělce + Hledat alba + Hledat stopy + Hledat text + Hledat konverzace + Hledat nahrávky + + Filtr + Filtr (Pro) + Nenalezeny žádné položky. + Změnit filtr + + Je vyžadováno oprávnění pro přístup k úložišti + Je vyžadováno oprávnění pro přístup ke kontaktům + Je vyžadováno oprávnění pro přístup k fotoaparátu + Je vyžadováno oprávnění pro přístup ke zvuku + Žádné oprávnění + Musíte aplikaci povolit zobrazování upozornění, jinak nebude moct zobrazovat upomínky. + Musíte aplikaci povolit zobrazování upozornění, jinak nebude moct zobrazovat stav postupu. + Musíte aplikaci povolit zobrazování upozornění, jinak nebude moct přehrávat hudbu. + Musíte aplikaci povolit zobrazování upozornění, jinak nebude moct nahrávat zvuk. + Musíte aplikaci povolit zobrazování upozornění, jinak nebude moct zobrazovat příchozí hovory. + Musíte aplikaci povolit zobrazování upozornění, jinak nebude moct zobrazovat příchozí zprávy. + Povolit oprávnění + Vyžadováno oprávnění + + Přejmenovat soubor + Přejmenovat složku + Nepodařilo se přejmenovat soubor + Nepodařilo se přejmenovat složku + Název složky nesmí být prázdný + Složka s tímto názvem již existuje + Nelze přejmenovat kořenovou složku úložiště + Složka byla úspěšně přejmenována + Přejmenování složky + Název souboru nemůže být prázdný + Název souboru obsahuje neplatné znaky + Název souboru „%s“ obsahuje neplatné znaky + Přípona nemůže být prázdná + Zdrojový soubor %s neexistuje + Přidat před názvy souborů + Přidat za názvy souborů + Jednoduché přejmenování + Vzor + Přidat řetězec + %Y – rok +\n%M – měsíc +\n%D – den +\n%h – hodina +\n%m – minuta +\n%s – sekunda +\n%i – číslo narůstající od 1 + Název souboru (bez „.txt“) + Název souboru (bez „.json“) + Název souboru (bez „.zip“) + Počínaje Androidem 11 už není možné skrýt takové soubory a složky + + Kopírovat + Přesunout + Kopírovat / Přesunout + Kopírovat do + Přesunout do + Zdroj + Cíl + Zvolit cílovou složku + Klikněte zde pro volbu cílové složky + Nelze zapisovat do zvolené cílové složky + Prosím, zvolte cílovou složku + Zdrojová a cílová složka nemohou být stejné + Soubory se nepodařilo zkopírovat + Kopírování… + Soubory byly úspěšně zkopírovány + Soubor byl úspěšně zkopírován + Vyskytla se chyba + Přesouvání… + Soubory byly úspěšně přesunuty + Soubor byl úspěšně přesunut + Některé soubory se nepodařilo přesunout + Některé soubory se nepodařilo zkopírovat + Nejsou vybrány žádné soubory + Ukládání… + Nepodařilo se vytvořit složku %s + Nepodařilo se vytvořit soubor %s + Nenalezeny žádné nové položky + V cílové složce není dostatek místa. +\nJe potřeba %1$s, k dispozici %2$s + Systémová služba pro výběr souborů a složek není k dispozici + + Vytvořit nový + Složka + Soubor + Vytvořit novou složku + Soubor nebo složka s tímto názvem již existuje + Název obsahuje neplatné znaky + Zadejte prosím název + Vyskytla se neznámá chyba + + Soubor „%s“ již existuje + Soubor „%s“ již existuje. Přepsat\? + Složka „%s“ již existuje + Sloučit + Zachovat oba + Přepsat + Přeskočit + Ponechat s „_1“ + Použít pro všechny + Systém neumožňuje operaci v této složce, vyberte prosím jinou + Systém neumožňuje kopírování do této složky, vyberte prosím jinou + Systém neumožňuje přejmenování v této složce + Nelze přejmenovat složky přímo na interním úložišti, pouze v podsložkách + Nelze přejmenovat tuto složku + + Zvolte složku + Zvolte soubor + Potvrďte přístup k externímu úložišti + Potvrďte přístup ke složce + Pro poskytnutí oprávnění k zápisu na následující obrazovce zvolte kořenový adresář SD karty + Pokud SD kartu nevidíte, vyzkoušejte následující + Povolte aplikaci přístup k vybranému úložišti stisknutím „Použít tuto složku“ na další obrazovce dole. + Povolte prosím přístup k \'%s\' stisknutím \'Použít tuto složku\' na další obrazovce dole. + Pro vytvoření nové složky stiskněte \'Uložit\' na další obrazovce dole. + Potvrdit výběr + Načítání… + Prosím, poskytněte aplikaci přístup ke všem vašim souborům. Bez toho nemusí fungovat dobře. + + %d položka + %d položky + %d položek + + + + %d položku + %d položky + %d položek + + + Odstraňuje se %d položka + Odstraňují se %d položky + Odstraňuje se %d položek + + + + %d kontakt + %d kontakty + %d kontaktů + + + Zvolit úložiště + Úložiště + Interní + SD karta + Root + Zvolena nesprávná složka. Prosím, vyberte kořenový adresář SD karty + Cesta k SD kartě a USB zařízení se nemohou shodovat + Zdá se, že máte aplikaci nainstalovanou na SD kartě, widgety proto nebudou dostupné. Neuvidíte je ani v seznamu dostupných widgetů. Jedná se o systémové omezení. Proto, pokud chcete widgety používat, musíte aplikaci přesunout zpět do interního úložiště. + Vybrána nesprávná složka. Prosím, vyberte cestu „%s“ + + Vlastnosti + Cesta + Vybráno položek + Počet přímo podřízených položek + Celkový počet souborů + Rozlišení + Trvání + Umělec + Album + Ohnisková vzdálenost + Čas expozice + Citlivost ISO + Clonové číslo + Fotoaparát + EXIF + Název skladby + GPS souřadnice + Nadmořská výška + Odstranit EXIF + Jste si jisti, že chcete odstranit hodnoty EXIF, jako jsou souřadnice GPS, model fotoaparátu atd.\? + EXIF hodnoty úspěšně odstraněny + + Barva pozadí + Barva písma + Primární barva + Akcentovaná barva bílého motivu + Akcentovaná barva černobílého motivu + Barva popředí + Barva ikony aplikace + Barva spodní navigační lišty + Obnovit výchozí + Použít výchozí + Výchozí + Změnit barvu + Motiv + Změna barvy změní motiv na Vlastní + Uložit + Zahodit + Vrátit změny + Opravdu chcete vrátit změny? + Tuto akci nelze vrátit zpět. + Máte neuložené změny. Chcete je před ukončením uložit\? + Použít barvy ve všech Jednoduchých aplikacích + UPOZORNĚNÍ: Některé spouštěče nepodporují změnu ikony. V případě, že ikona aplikace zmizí, zkuste ji spustit skrze obchod Google Play, nebo některý widget, pokud je dostupný. Po spuštění aplikace zkuste nastavit původní oranžovou barvu ikony #F57C00. V nejhorším případě budete muset aplikaci přeinstalovat. + Barvy úspěšně aktualizovány. Byl přidán nový motiv „Sdílený“, v budoucnu jej prosím použijte pro úpravu barev u všech Jednoduchých aplikací zároveň. + Všimněte si, že i když používáte „Pro“ verzi aplikace, z technických důvodů stále potřebujete Jednoduché děkuji. Postará se o synchronizaci barev. + Prosím, zakupte si <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Jednoduché děkuji</a> pro odemknutí této funkce a pro podporu vývoje. Děkuji! + + Světlý + Tmavý + Automaticky + Automaticky světlý / tmavý + Solarizovaný + Tmavě červený + Bílý + Černobílý + Vlastní + Sdílený + Výchozí systémový + + Co je nového + * najdete zde pouze výraznější změny, vždy jsou však doprovázeny i drobnými opravami + + Smazat + Odstranit + Přejmenovat + Sdílet + Sdílet pomocí + Změnit velikost + Označit vše + Vybrat text + Skrýt + Odkrýt + Skrýt složku + Odkrýt složku + Dočasně zobrazit skryté + Přestat zobrazovat skryté + Nemůžete sdílet tolik obsahu najednou + Vyprázdnit a deaktivovat koš + Zpět + Znovu + Tisk + Tisk (Pro) + Zkratka + Vytvořit zkratku + Vytvořit zkratku (Pro) + Přidat číslo kontaktu + Zobrazit údaje kontaktu + Volání ze SIM 1 + Volání ze SIM 2 + Přepnout viditelnost názvů souborů + Přesunout na vrchol + Přesunout dospodu + Připnout položku + Odepnout položku + Poslat SMS + Poslat email + Zavolat + Detaily kontaktu + Přidat kontakt + Tapety + + Seřadit podle + Název + Velikost + Datum poslední úpravy + Datum vytvoření + Datum pořízení + Název + Název souboru + Přípona + Náhodně + Seřadit náhodně + Vzestupně + Sestupně + Použít pouze pro tuto složku + Řadit číselné sekvence dle hodnoty + Jméno + Prostřední jméno + Příjmení + Celé jméno + Použít vlastní třídění + Změnit pořadí + + Opravdu chcete pokračovat v mazání\? + Opravdu chcete smazat %s? + Delete %s? + + Opravdu chcete přesunout %s do koše? + + Opravdu chcete smazat tuto položku\? + Opravdu chcete přesunout tuto položku do koše? + V této relaci se již znovu neptat + Neukazovat znovu + Ano + Ne + Možná + + UPOZORNĚNÍ: Chystáte se smazat %d složku + UPOZORNĚNÍ: Chystáte se smazat %d složky + UPOZORNĚNÍ: Chystáte se smazat %d složek + + + PIN + Zadejte PIN + Prosím, zadejte PIN + Nesprávný PIN + Opakujte PIN + Vzor + Zadejte vzor + Nesprávný vzor + Opakovat vzor + Biometrie + Otisk + Přidat otisk prstu + Prosím, přiložte prst na senzor otisku prstu + Otevřít okno ověření biometrickým ID + Ověřit + Ověření selhalo + Ověření je blokováno, zkuste to prosím později + Nejsou registrovány žádné otisky prstu, prosím, přidejte nějaké v nastavení svého zařízení + Přejít do nastavení + Heslo bylo úspěšně nastaveno. Pokud jej zapomenete, přeinstalujte prosím aplikaci. + Ochrana byla úspěšně nastavena. V případě problémů s její změnou, prosím, přeinstalujte aplikaci. + Uzamknout složku + Uzamknout složku (Pro) + Odemknout složku + Tato ochrana funguje pouze v této aplikaci, nemá za cíl nahradit šifrování složky fungující napříč systémem. + + Včera + Dnes + Zítra + Každý den + Skrýt rok + sekundy + minuty + hodiny + dny + s + m + h + wk. + + %d sekunda + %d sekundy + %d sekund + + + %d minuta + %d minuty + %d minut + + + %d hodina + %d hodiny + %d hodin + + + %d den + %d dny + %d dní + + + %d týden + %d týdny + %d týdnů + + + %d měsíc + %d měsíce + %d měsíců + + + %d rok + %d roky + %d let + + + + %d sekundu + %d sekundy + %d sekund + + + %d minutu + %d minuty + %d minut + + + %d hodinu + %d hodiny + %d hodin + + + %d den + %d dny + %d dní + + + %d týden + %d týdny + %d týdnů + + + %d měsíc + %d měsíce + %d měsíců + + + %d rok + %d roky + %d let + + + + %d sekundu před + %d sekundy před + %d sekund před + + + %d minutu před + %d minuty před + %d minut před + + + %d hodinu před + %d hodiny před + %d hodin před + + + %d den před + %d dny před + %d dnů před + + + %d týden před + %d týdny před + %d týdnů před + + + %d měsíc před + %d měsíce před + %d měsíců před + + + %d rok před + %d roky před + %d let před + + + + %d sekundu + %d sekundy + %d sekund + + + %d minutu + %d minuty + %d minut + + + %d hodinu + %d hodiny + %d hodin + + + %d den + %d dny + %d dnů + + + %d týden + %d týdny + %d týdnů + + + %d měsíc + %d měsíce + %d měsíců + + + %d rok + %d roky + %d let + + + Zbývající čas do zvonění budíku:\n%s + Zbývající čas do zobrazení připomínky:\n%s + Zbývající čas: +\n%s + Před spoléháním se na budík se prosím ujistěte, že funguje správně. Některá systémová omezení spojená se zvýšením výdrže baterie mohou způsobovat problémy. + Před spoléháním se na připomínky se prosím ujistěte, že fungují správně. Zkontrolujte na svém zařízení nastavení baterie a oznamování, zda tam není nic blokujícího připomínky nebo ukončujícího aplikace běžící na pozadí. + Oznámení této aplikace jsou vypnuta. Pro jejich povolení prosím přejděte do nastavení svého zařízení. + + Budík + Odložit + Zrušit + Žádná připomínka + Na začátku + Systémové zvuky + Vaše zvuky + Přidat nový zvuk + Žádný zvuk + Během dne ve hh:mm + Během dne ve %02d:%02d + + Nastavení + Zakoupit Jednoduché děkuji + Obecné + Přizpůsobení barev + Vylepšené přizpůsobení barev + Přizpůsobit barvy + Přizpůsobit barvy (Uzamčeno) + Uzamčeno + Přizpůsobit barvy widgetů + Přizpůsobit oznámení + Notification sound + Použít angličtinu + Jazyk + Zobrazit skryté položky + Velikost písma + Malé + Střední + Velké + Extra velké + Chránit heslem viditelnost skrytých položek + Chránit heslem celou aplikaci + Chránit heslem mazání a přesouvání souborů + Zachovat původní čas poslední úpravy při souborových operacích + Zobrazit informační bublinu při prohlížení položek tažením posuvníku + Zabránit uspání zařízení dokud je aplikace v popředí + Vždy přeskočit potvrzení mazání souborů + Povolit obnovení seznamu tažením shora + Použít 24-hodinový formát času + Změnit formát data a času + Začátek týdne v neděli + Widgety + Vždy použít stejný čas odložení + Čas odložení + Vibrovat při stisku tlačítka + Přesunout položky do koše namísto jejich vymazání + Interval vyprázdnění koše + Vyprázdnit koš + Vynutit zobrazení na výšku + Export nastavení + Import nastavení + Nastavení bylo úspěšně exportováno + Nastavení bylo úspěšně importováno + Nejprve příjmení + Vyčistit mezipaměť + Před zahájením hovoru zobrazit potvrzovací dialog + + Viditelnost + Zabezpečení + Posouvání + Souborové operace + Koš + Ukládání + Po spuštění + Text + Přenosy + Kvalita + Hlavní obrazovka + Miniatury + Seznam + + Vyloučit + Vyloučit složku + Vyloučené složky + (vyloučené) + Spravovat vyloučené složky + Odstranit všechny + Odstranit všechny složky ze seznamu vyloučených\? Tato operace neodstraní obsah složek. + Dočasně zobrazit vyloučené + Přestat zobrazovat vyloučené + + Spravovat zobrazené karty + Kartu otevřete při spuštění aplikace + Kontakty + Oblíbené + Historie volání + Skupiny + Naposledy použité + Soubory + Nejnovější soubory + + Obnovit tento soubor + Obnovit vybrané soubory + Obnovit všechny soubory + Koš byl úspěšně vyprázdněn + Soubory byly úspěšně obnoveny + Opravdu chcete vyprázdnit koš? Soubory budou navždy ztraceny. + Koš je prázdný + Přesouvání položek z koše je zakázáno, použijte obnovení + Zobrazit koš + Skrýt koš + Otevřít koš + Nepoužívat koš, odstranit soubory přímo + + %d položka se přesouvá do koše + %d položky se přesouvají do koše + %d položek se přesouvá do koše + + + Importování… + Exportování… + Importování bylo úspěšné + Exportování bylo úspěšné + Importování selhalo + Exportování selhalo + Importování některých položek selhalo + Exportování některých položek selhalo + Nebyly nalezeny žádné položky pro import + Nebyly nalezeny žádné nové položky pro import + Nebyly nalezeny žádné položky pro export + Zálohy + Povolit automatické zálohování + Spravovat automatické zálohování + K automatickému pojmenování souboru můžete použít následující vzory: +\n +\n%Y – rok +\n%M – měsíc +\n%D – den +\n%h – hodiny +\n%m – minuta +\n%s – sekunda + + USB + Zdá se, že ke svému zařízení máte připojeno USB zařízení. Pro správné zobrazení jeho souborů jsou potřeba další oprávnění. + Pro povolení přístupu prosím na následující obrazovce zvolte kořenový adresář USB zařízení + Zvolena nesprávná složka, vyberte prosím kořenový adresář USB zařízení + + leden + únor + březen + duben + květen + červen + červenec + srpen + září + říjen + listopad + prosinec + + led + úno + bře + dub + kvě + čvn + čvc + srp + zář + říj + lis + pro + + v lednu + v únoru + v březnu + v dubnu + v květnu + v červnu + v červenci + v srpnu + v září + v říjnu + v listopadu + v prosinci + pondělí + úterý + středa + čtvrtek + pátek + sobota + neděle + P + Ú + S + Č + P + S + N + po + út + st + čt + + so + ne + + Tato verze aplikace již není podporována. Pro nové opravy a jiná vylepšení prosím přejděte na verzi Pro. + Tato verze aplikace již nebude dále aktualizována. Pro nové opravy a jiná vylepšení prosím přejděte na verzi Pro kliknutím sem. + Bude bezplatná do: %s. Pokud si ji do té doby stáhnete, budete ji moci používat bezplatně navždy. + Více informací + Stáhnout + Lokálně uložené události musíte přenést ručně, exportováním do .ics souboru a následně je naimportovat. Tlačítka pro export/import najdete v nabídce na hlavní obrazovce. + Zdravím, +\n +\nzdá se, že jste právě upgradovali z bezplatné verze. Jakmile budete s touto verzí spokojeni a případně přenesete svá data, můžete starou bezplatnou verzi odinstalovat, protože ji již nebudete potřebovat a vyhnete se jejímu náhodnému spuštění. +\n +\nDěkuji! + Zdravím, +\n +\nzdá se, že již máte nainstalovanou také verzi Pro. Jakmile s ní budete spokojeni a případně přenesete svá data, můžete tuto bezplatnou verzi odinstalovat, protože ji již nebudete potřebovat a vyhnete se jejímu náhodnému spuštění. +\n +\nDěkuji! + Zdravím, +\n +\nzdá se, že jste právě upgradovali z bezplatné verze. Jakmile budete s touto verzí spokojeni a případně přenesete svá data, můžete starou bezplatnou verzi odinstalovat, protože ji již nebudete potřebovat a vyhnete se jejímu náhodnému spuštění. +\n +\nDěkuji! + Zdravím, +\n +\nzdá se, že již máte nainstalovanou také verzi Pro. Jakmile s ní budete spokojeni a případně přenesete svá data, můžete tuto bezplatnou verzi odinstalovat, protože ji již nebudete potřebovat a vyhnete se jejímu náhodnému spuštění. +\n +\nDěkuji! + Zdravím, +\n +\nzdá se, že jste právě upgradovali z bezplatné verze. Pokud chcete přenést své lokálně uložené události, musíte to udělat ručně tak, že je exportujete do souboru .ics v bezplatné verzi aplikace a importujete je sem přes horní nabídku. +\n +\nJakmile budete spokojeni se svým nastavením ve verzi Pro, můžete starou bezplatnou verzi odinstalovat, protože ji již nebudete potřebovat. +\n +\nDěkuji! + Zdravím, +\n +\nzdá se, že jste právě upgradovali z bezplatné verze. Pokud jste měli nějaké kontakty uložené pod „%s“, musíte je přenést ručně tak, že je exportujete do souboru .vcf v bezplatné verzi aplikace a imporujete je sem přes horní nabídku. +\n +\nJakmile budete spokojeni se svým nastavením ve verzi Pro, můžete starou bezplatnou verzi odinstalovat, protože ji již nebudete potřebovat. +\n +\nDěkuji! + Zdravím, +\n +\nzdá se, že jste právě upgradovali z bezplatné verze. Chcete-li přenést své poznámky, musíte to udělat ručně tak, že je exportujete do souboru v bezplatné verzi aplikace a importujete je sem přes horní nabídku. +\n +\nJakmile budete spokojeni se svým nastavením ve verzi Pro, můžete starou bezplatnou verzi odinstalovat, protože ji již nebudete potřebovat. +\n +\nDěkuji! + + O aplikaci + Website + Pro zdrojové kódy navštivte + Zpětnou vazbu či návrhy zasílejte na + Stáhnout verzi Pro + Více aplikací + Více aplikací od nás + Pozvat přátele + Ahoj, podívej se na aplikaci %1$s na %2$s + Pozvat skrze + Ohodnotit aplikaci + Ohodnotit + Podpořit + Sledujte nás + v %1$s\nCopyright © Simple Mobile Tools %2$d + Podpora + Pomozte nám + Sociální sítě + Ostatní + Zásady ochrany osobních údajů + Verze %s + Ahoj :) + Vyrobeno s ❤️ na Slovensku + Dodatečné informace + Verze aplikace: %s + Operační systém zařízení: %s + Dobrý den,<br><br> doufáme, že se vám aplikace líbí. Neobsahuje žádné reklamy, podpořte prosím její vývoj zakoupením aplikace <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>, čímž také zabráníte opětovnému zobrazení tohoto dialogu.<br><br> Děkujeme Vám! + Dobrý den,<br><br>doufáme, že se vám aplikace líbí. Neobsahuje žádné reklamy a neshromažďuje vaše data, podpořte prosím její vývoj zakoupením aplikace <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. Budete mít také odemčené všechny funkce aplikace včetně přizpůsobení barev.<br><br>Děkujeme Vám! + Podpořte nás prosím zakoupením aplikace <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>, odemkne to také všechny funkce aplikace včetně přizpůsobení barev. + Koupit + Získat Jednoduchý telefon + Aktualizujte prosím Jednoduché děkuji na nejnovější verzi + Před položením otázky se prosím podívejte do nastavení aplikace a přečtěte si často kladené otázky. Možná v nich naleznete svou odpověď. + Před hodnocením se prosím podívejte do nastavení aplikace a přečtěte si často kladené otázky. Máte-li nějaké problémy, možná v nich naleznete řešení. + Také se ujistěte, že používáte nejnovější verzi aplikace. + Vezměte také na vědomí, že tato verze aplikace se již nevyvíjí, pro mnoho vylepšení získejte verzi Pro. + Přečíst + Přečíst ČKO + Zdravím,\n\nzdá se, že již tuto aplikaci používáte nějaký čas a velmi si toho ceníme.\n\nMůžeme-li vás proto požádat o laskavost, ohodnoťte nás prosím na Google Play. Moc by nám to pomohlo.\n\nBez ohledu na to, jak se rozhodnete, tato zpráva se vám již nezobrazí.\n\nĎěkujeme! + Ohodnoťte naši aplikaci, prosím :) + Děkujeme + Widget je uzamčen. +\nChcete-li jej odemknout, upgradujte na verzi Pro. + Tato funkce je uzamčena, pro odemknutí celé aplikace si prosím zakupte <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>.<br <br>Jedná se pouze o jednorázovou platbu a pokud nebudete spokojeni, můžeme vám vrátit peníze. + + +
    + pouze bych vám chtěl oznámit, že byla nedávno uveřejněna nová aplikace:

    + %2$s

    + %4$s

    + %6$s

    + Stáhnete ji klepnutím na název.

    + Děkuji + ]]> +
    + Jednoduchý spouštěč aplikací + Jednoduchá kalkulačka + Jednoduchý kalendář + Jednoduchý fotoaparát + Jednoduché hodiny + Simple Contacts + Jednoduchý telefon + Jednoduché kreslení + Simple File Manager + Jednoduchá svítilna + Jednoduchá galerie + Jednoduchá klávesnice + Jednoduchý spouštěč + Jednoduchý hudební přehrávač + Simple Notes + Jednoduché SMS zprávy + Jednoduché děkuji + Jednoduchý hlasový záznamník + Spouštěč aplikací + Kalkulačka + Kalendář + Fotoaparát + Hodiny + Kontakty + Telefon + Kreslení + Správce souborů + Svítilna + Galerie + Klávesnice + Spouštěč + Hudební přehrávač + Poznámky + SMS zprávy + Děkuji + Hlasový záznamník + + zde. + ]]> + + + Často kladené otázky + Před položením otázky si prosím prvně přečtěte + Proč nevidím widget této aplikace v přehledu widgetů? + Je velmi pravděpodobné, že jste aplikaci přesunuli na SD kartu. Jde o omezení systému Android, které v takovém případě skryje widget dané aplikace. + Jediným řešením je přesunutí aplikace zpět do interního úložiště skrze nastavení vašeho zařízení. + Chtěl bych vás podpořit, ale nemohu peněžně. Mohu pomoci i jiným způsobem? + Ano, samozřejmě. Můžete šířit informace o aplikacích nebo poskytnout dobrou zpětnou vazbu a hodnocení. Můžete také pomoci překladem aplikací do nového jazyka nebo jen aktualizovat některé stávající překlady. Průvodce překladem je na <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>této webové stránce</a>. Pokud máte nějaké dotazy, kontaktujte nás na adrese <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>. + Nechtěně jsem smazal některé soubory, jak je mohu obnovit? + Bohužel nemůžete. Soubory jsou smazány okamžitě po potvrzovacím dialogu, žádný koš není k dispozici. + Nelíbí se mi barvy widgetu, mohu je změnit? + Ano, po přidání widgetu na domovskou obrazovku se zobrazí obrazovka s konfigurací. Klepnutím na barevné čtverečky v levém dolním rohu můžete navolit nové barvy. Tažením posuvníku můžete upravit i průhlednost. + Mohu nějakým způsobem obnovit smazané soubory? + Pokud byly skutečně smazány, nemůžete. Ve výchozím nastavení je však povolen koš, což způsobí pouze přesunutí souborů do koše namísto jejich vymazání. + Ikona aplikace zmizela z domovské obrazovky. Co s tím? + Bude to způsobeno tím, že váš spouštěč nepodporuje úpravu ikon korektně. Zkuste aplikaci spustit skrze Obchod Play nebo nějaký widget, pokud je dostupný. + Po spuštění aplikace zkuste nastavit původní oranžovou barvu ikony #F57C00. V nejhorším případě budete muset aplikaci přeinstalovat. + Peníze mi byly z bankovního účtu odepsány, aplikaci však nemohu stáhnout. Co s tím? + Platby jsou plně spravovány Googlem, jejich systém však občas nefunguje tak jak by měl. Zkuste vymazat mezipaměť aplikace Obchod Play, restartujte zařízení a zkuste aplikaci stáhnout znovu. + Proč bych měl přejít na verzi Pro\? + Tato verze aplikace již nebude aktualizována. Chyby, které jste možná objevili, proto nebudou nikdy opraveny. Také již nepřibudou žádné nové funkce. Pro verzi získáte za malý poplatek v Obchodě Google Play. + Jde o jednorázovou platbu, což znamená, že po zakoupení již nebudete muset nic platit znovu. Ani při koupi nového zařízení. Pokud se vám Pro verze nebude líbit, můžete ji do pár hodin odinstalovat a peníze vám budou automaticky vráceny. + Pokud budete chtít aplikaci vrátit kdykoliv později, stačí nám napsat na hello@simplemobiletools.com a peníze vám vrátíme. + Jak mohu vybrat více položek najednou? + Existuje několik způsobů, jak toho dosáhnout. První spouští režim výběru dlouhým stisknutím jedné položky a následným krátkým kliknutím na ostatní, abyste je vybrali. Druhý způsob je podobný výběru položek na PC pomocí myši, stačí spustit režim výběru dlouhým stisknutím jedné položky a potom ji prstem stále dolů přetahovat přes další položky pro výběr. Třetím způsobem výběru více položek je dlouhé stisknutí jedné položky, pak dlouhé stisknutí další a vybere se vše mezi nimi. Pokud chcete vybrat všechny položky, stačí dlouze stisknout jednu položku a poté kliknout na počítadlo vybraných položek v levém horním rohu. Tím se vybere nebo zruší výběr všeho. + Koupil jsem si aplikaci, ale nemohu ji stáhnout do jiného zařízení. + Zkuste vymazat mezipaměť aplikace Google Play a restartovat zařízení. Je to nějaká závada Google Play, která ve skutečnosti nesouvisí se samotnou aplikací. + + Přispěvatelé + Překlad + Vývoj + Other help + Tento seznam obsahuje všechny, kteří výrazně pomohli jakékoli aplikaci v rámci sady Simple Mobile Tools, nejen této. O překlady se starají dobrovolníci, dejte nám vědět, pokud chcete pomoci i Vy. Průvodce překladem je na <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>této webové stránce</a>. Pokud máte nějaké dotazy, kontaktujte nás na adrese <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>. Děkujeme všem přispěvatelům a dalším podporovatelům! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Získejte verzi Pro nyní! + Základní + Pro + Žádné reklamy + Žádný přístup k internetu + 100% záruka vrácení peněz + Jednorázová platba + Vylepšený vzhled + + Pokročilý editor fotografií + Pokročilý editor fotografií a videa + Podpora souborů HEIC/HEIF + Pokročilé dávkové přejmenování souborů + Zamykání jednotlivých složek + Podpora tisku + + Podpora časových pásem + Účastníci a e-mailová připomenutí + Snadný import událostí + Nové widgety + + Vylepšené slučování duplicitních kontaktů + Přizpůsobení velikosti písma + Volitelné sdílení soukromých kontaktů v rámci našich aplikací + Přizpůsobitelné vyzváněcí tóny kontaktů + Filtrování kontaktů + Soukromě uložené kontakty + + Zaškrtávací seznamy + Jiná poznámka a barvy na každém widgetu + Uzamykání poznámek + + Přizpůsobení formátu data a času + Zkratky na domovské obrazovce + File compression support + Tab with recent files + + Přizpůsobení barvy pozadí + Podpora importu souborů + Zoomování + + Tato aplikace používá pro ulehčení mé práce následující knihovny třetích stran. Děkuji. + Licence třetích stran + Kotlin (programovací jazyk) + Subsampling Scale Image View (zoomovatelné zobrazení obrázků) + Glide (načítání a mezipaměť obrázků) + Picasso (načítání a mezipaměť obrázků) + Android Image Cropper (ořez a otáčení obrázků) + RtlViewPager (tažení prstem zprava doleva) + Joda-Time (náhrada datumů v Javě) + Stetho (ladění databází) + Otto (sběrnice událostí) + PhotoView (zoomovatelné GIFy) + PatternLockView (ochrana vzorem) + Reprint (ochrana otiskem prstu) + Gif Drawable (zobrazování GIFů) + AutoFitTextView (změna velikosti textu) + Robolectric (framework pro testování) + Espresso (pomocník pro testování) + Gson (analyzátor JSON) + Leak Canary (detekce úniků paměti) + Number Picker (upravitelné vybírání čísel) + ExoPlayer (video přehrávač) + VR Panorama View (zobrazování panorámat) + Apache Sanselan (čtení metadat obrázku) + Android Photo Filters (filtry obrázků) + Gesture Views (zoomovatelné obrázky) + Indicator Fast Scroll (písmena na posuvníku) + Event Bus (komunikace v rámci aplikace) + Audio Record View (vizualizace zvuku) + SMS MMS (spravovanie SMS a MMS) + APNG Android (podpora animovaného WebP) + PDFViewPager (prohlížeč PDF) + M3U Parser (zpracování souborů playlistů m3u) + AndroidLame (mp3 kodér) + + Zkušební doba vypršela + Zahájit bezplatnou zkušební dobu + Vaše zkušební doba brzy vyprší. + Odemknout aplikaci na poslední jeden den + Vítejte v %s! + Děkujeme, že používáte naši aplikaci. Tuto odemčenou verzi můžete používat %d dnů. Jakmile zkušební doba skončí, zvažte prosím upgrade na verzi Pro, která má obrovské množství nových funkcí, moderní vzhled, žádné reklamy a mnoho dalších vylepšení. +\n +\nStačí za ni jednou za život zaplatit a pokud nebudete spokojeni, můžete ji odinstalovat a peníze Vám budou vráceny. +\n +\nSnad se Vám bude líbit :) + Abyste si aplikaci užili naplno, přejděte prosím na verzi Pro. +\n +\nStačí za ni jednou za život zaplatit a pokud nebudete spokojeni, můžete ji odinstalovat a peníze Vám budou vráceny. +\n +\nUvidíme se tam :) + + Vaše zkušební doba vyprší za %d den. + Vaše zkušební doba vyprší za %d dny. + Vaše zkušební doba vyprší za %d dnů. + + + ZASTARALÁ: Tato verze aplikace již není podporována, stáhněte si Pro verzi na https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Nezapomeňte, že pokud odinstalujete kteroukoliv placenou aplikaci do 2 hodin, budou vám automaticky vráceny peníze. Pokud budete chtít vrátit platbu kdykoliv později, kontaktujte nás prosím na hello@simplemobiletools.com . Tímto vám nic nebrání aplikace plně ozkoušet :) + + Skupina jednoduchých aplikací s otevřeným zdrojovým kódem pro Android s přizpůsobitelnými widgety, bez reklam a zbytečných oprávnění. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-cy/strings.xml b/commons/src/main/res/values-cy/strings.xml new file mode 100644 index 000000000..f0ac78dad --- /dev/null +++ b/commons/src/main/res/values-cy/strings.xml @@ -0,0 +1,1235 @@ + + + Iawn + Diddymu + Back + Nothing + Later + Cadw fel + Cadwyd y ffeil yn llwyddiannus + Fformat ffeil annilys + Gwall allan o gof + Bu gwall: %s + Error: %s + Agor gyda + Golygu gyda + Edit + Ni chanfuwyd ap dilys + No browser found + No email client found + Gosod fel + Copy to clipboard + Copy number to clipboard + Copïwyd y gwerth i\'r clipfwrdd + Copïwyd y gwerth i\'r clipfwrdd:\n%s + Dial number + Anhysbys + Pob tro + Byth + Manylion + Nodiadau + Yn dileu\'r ffolder \'%s\' + Dim + Label + Tryloyw + Lliw tryloyw + Dewis lliw gwahanol + Lawrlwytho + Notification + Notifications + Email + Previous + Play / Pause + Next + Rhif + Ni chanfuwyd unrhyw gysylltiadau + Gofyn am y caniatâd sydd ei angen + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Galw %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Creu cyswllt newydd + Ychwanegu at gyswllt sy\'n bodoli + App Corrupt + Disclaimer + Tynnu llun + Dewis llun + Choose video + Choose contact + Choose file + Record audio + Record video + Yn diweddaru… + Storfa ddyfais + Storfa ddyfais (dim i\'w weld gan apiau eraill) + Audio + + Pen-blwydd + Pen-blwydd achlysur + + Cartref + Gwaith + + Symudol + Prif + Ffacs gwaith + Ffacs cartref + Peiriant galw + Ni chanfuwyd rif ffôn + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + %d columns + %d columns + %d columns + %d columns + + + Rheoli rhifau wedi\'u rhwystro + Nid wyt yn rhwystro unrhyw un. + Ychwanegu rif i\'w rwystro + Rhwystro rhif + Rhwystro rhifau + Rhifau wedi\'u rhwystro + Export blocked numbers + Import blocked numbers + Rhaid gwneud yr ap hwn yr ap deialu rhagosodedig er mwyn defnyddio rhifau wedi\'u rhwystro. + Defnyddio fel y rhagosodedig + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Ffefrynnau + Ychwanegu ffefryn + Ychwanegu at ffefrynnau + Tynnu o ffefrynnau + + Chwilio + Search in %s + Rho o leiaf dau nod i chwilio. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Hidlo + Hidlo (Pro) + Ni chanfuwyd eitemau. + Newid hidlydd + + Rhaid cael caniatâd storfa + Rhaid cael caniatâd cysylltiadau + Rhaid cael caniatâd camera + Rhaid cael caniatâd sain + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Ailenwi ffeil + Ailenwi ffolder + Methwyd ailenwi\'r ffeil + Methwyd ailenwi\'r ffolder + Ni all enw\'r ffolder fod yn wag + Mae eisoes ffolder gyda\'r enw yna + Methu ailenwi ffolder craidd storfa + Ail-enwyd y ffolder yn llwyddiannus + Yn ail-enwi ffolder + Ni all enw\'r ffeil fod yn wag + Mae\'r enw yn cynnwys nodau annilys + Mae\'r enw ffeil \'%s\' yn cynnwys nodau annilys + Ni all yr estyniad fod yn wag + Dyw\'r ffeil tarddiad %s ddim yn bodoli + Rhagddodi enwau ffeiliau + Ôl-ddodi enwau ffeiliau + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + Copïo + Symud + Copïo / Symud + Copïo i + Symud i + Tarddiad + Cyrchfan + Dewisa gyrchfan + Clicia yma i ddewis gyrchfan + Methwyd ag ysgrifennu i\'r gyrchfan a ddewiswyd + Dewisa gyrchfan + Ni all y tarddiad a\'r gyrchfan bod yr un lle + Methwyd â chopïo\'r ffeiliau + Yn copïo… + Copïwyd y ffeiliau\'n llwyddiannus + File copied successfully + Bu gwall + Yn symud… + Symudwyd y ffeiliau\'n llwyddiannus + File moved successfully + Methwyd â symud rhai ffeiliau + Methwyd â chopïo rhai ffeiliau + Dim ffeiliau wedi\'u dewis + Yn cadw… + Methwyd â chreu\'r ffolder %s + Methwyd â chreu\'r ffeil %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + Creu newydd + Ffolder + Ffeil + Creu ffolder newydd + Mae ffeil neu ffolder eisoes yn bodoli gyda\'r enw yna + Mae\'r enw yn cynnwys nodau annilys + Rho enw + Bu gwall anhysbys + + Mae\'r ffeil \"%s\" eisoes yn bodoli + Mae\'r ffeil \"%s\" eisoes yn bodoli. Trosysgrifo? + Mae\'r ffolder \"%s\" eisoes yn bodoli + Cyfuno + Cadw\'r ddau + Trosysgrifo + Neidio + Ychwanegu \'_1\' i\'r diwedd + Gweithredu ar y cwbl + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + Dewisa ffolder + Dewisa ffeil + Cadarnha mynediad at storfa allanol + Confirm folder access + Dewisa ffolder craidd y cerdyn SD ar y sgrin nesaf i roi hawl ysgrifennu + Os nad wyt yn gweld y cerdyn SD, rho gynnig ar hyn + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Cadarnhau dewis + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d eitemau + %d eitem + %d eitem + %d eitem + %d eitem + %d eitem + + + + %d eitemau + %d eitem + %d eitem + %d eitem + %d eitem + %d eitem + + + Yn dileu %d eitemau + Yn dileu %d eitem + Yn dileu %d eitem + Yn dileu %d eitem + Yn dileu %d eitem + Yn dileu %d eitem + + + + %d contact + %d contacts + %d contacts + %d contacts + %d contacts + %d contacts + + + Dewisa storfa + Storage + Mewnol + Cerdyn SD + Craidd + Dewiswyd y ffolder anghywir. Dewisa ffolder craidd dy gerdyn SD + Rhaid bod llwybrau\'r cerdyn SD a\'r ddyfais USB yn wahanol + Mae\'n ymddangos dy fod wedi gosod yr ap ar gerdyn SD, gan olygu nad yw teclynnau\'r ap ar gael. Ni fyddan nhw hyd yn oed ymddangos ar y rhestr o declynnau ar gael. + Mae hyn yn gyfyngiad gan y system, felly os wyt eisiau defnyddio\'r teclynnau, rhaid symud yr ap i storfa fewnol dy ddyfais. + Wrong folder selected, please select path \'%s\' + + Priodweddau + Llwybr + Eitemau a ddewiswyd + Cyfrif is-ffolderi uniongyrchol + Cyfrif cyfanswm ffeiliau + Cydraniad + Hyd + Artist + Casgliad + Hyd ffocal + Amser amlygiad + Cyflymder ISO + F-rif + Camera + EXIF + Teitl trac + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Lliw cefndir + Lliw testun + Prif liw + Accent color of white theme + Accent color of Black & White theme + Lliw blaendir + Lliw eicon yr ap + Lliw bar llywio gwaelod + Adfer rhagosodiadau + Use default + Default + Newid lliw + Thema + Bydd newid lliw yn achosi newid i\'r thema addasedig + Cadw + Gwaredu + Dad-wneud newidiadau + Wyt ti yn bendant eisiau dad-wneud a cholli dy newidiadau? + This action cannot be undone. + Mae gennyt newidiadau heb eu cadw. Cadw cyn gadael? + Rhoi\'r lliwiau ar waith ym mhob ap Simple + RHYBUDD: Mae rhai lansiwyr yn methu ag ymdrin addasiadau i apiau yn gywir. Yn yr achos bod yr eicon yn diflannu, rho gynnig ar lansio\'r ap trwy Google Play neu ryw declyn, os ar gael. + Unwaith y bydd wedi lansio, ail-osoda\'r eicon oren rhagosodedig #F57C00. Yn yr achos gwaethaf, bydd rhaid ail-osod yr ap. + Diweddarwyd y lliwiau yn llwyddiannus. Mae thema newydd o\'r enw \'Rhennir\' wedi ei ychwanegu. Defnyddia honno i ddiweddaru lliwiau pob ap yn y dyfodol. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You i ddatgloi’r nodwedd hon a chefnogi datblygiad, os gweli’n dda. Diolch! + ]]> + + + Golau + Tywyll + Auto + Auto light / dark + Solareiddiwyd + Coch tywyll + White + Du a Gwyn + Addasedig + Rhennir + System default + + Beth sy\'n newydd + * nodir y newidiadau mwyaf yma; mae rhai gwelliannau bychain hefyd fel arfer + + Dileu + Tynnu + Ail-enwi + Rhannu + Rhannu gyda + Resize + Dewis y cwbl + Select text + Cuddio + Datguddio + Cuddio ffolder + Datguddio ffolder + Dangos eitemau cudd dros dro + Stopio dangos cyfryngau cuddiedig + Ni ellir rannu cymaint a hyn o gynnwys ar un tro + Gwagio ac analluogi\'r Bin Sbwriel + Dad-wneud + Ail-wneud + Argraffu + Argraffu (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Trefnu yn ôl + Enw + Maint + Newidiwyd diwethaf + Date created + Dyddiad tynnwyd + Teitl + Enw ffeil + Estyniad + Ar hap + Trefnu ar hap + Esgynnol + Disgynnol + Defnyddio i\'r ffolder hon yn unig + Sort numeric parts by actual value + Enw cyntaf + Enw canol + Cyfenw + Full name + Use custom sorting + Change order + + Wyt ti\'n bendant am barhau i ddileu? + Wyt ti\'n bendant eisiau dileu %s? + Delete %s? + + Wyt ti\'n bendant eisiau symud %s i\'r Bin Ailgylchu? + + Wyt ti\'n bendant eisiau dileu\'r eitem hon? + Wyt ti\'n bendant eisiau symud yr eitem hon i\'r Bin Ailgylchu? + Peidio â gofyn eto yn y sesiwn hon + Do not show again + Ydw + Nac ydw + Maybe + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + WARNING: You are deleting %d folders + WARNING: You are deleting %d folders + WARNING: You are deleting %d folders + WARNING: You are deleting %d folders + + + PIN + Rho PIN + Rho PIN, plîs. + PIN anghywir + Rho\'r PIN eto + Patrwm + Rho batrwm + Patrwm anghywir + Rho\'r patrwm eto + Biometrics + Ôl byd + Ychwanegu ôl bys + Gosoda dy fys ar y synhwyrydd olion bysedd + Open biometric ID verification dialog + Authenticate + Methodd y dilysiad + Rhwystrwyd y dilysiad. Rho gynnig arall arni mewn eiliad + Does dim olion bysedd wedi\'u cofrestru. Ychwanega rai yn Gosodiadau dy ddyfais. + Mynd i\'r Gosodiadau + Gosodwyd cyfrinair yn llwyddiannus. Ailosoda\'r ap os wyt yn ei anghofio. + Gosodwyd diogelwch yn llwyddiannus. Ailosoda\'r ap os wyt yn cael problemau yn ei ailosod. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + Ddoe + Heddiw + Yfory + Every day + Hide year + eiliadau + munudau + oriau + dyddiau + s + m + h + wk. + + %d eiliadau + %d eiliad + %d eiliad + %d eiliad + %d eiliad + %d eiliad + + + %d munudau + %d munud + %d funud + %d munud + %d munud + %d munud + + + %d oriau + %d awr + %d awr + %d awr + %d awr + %d awr + + + %d diwrnodau + %d diwrnod + %d ddiwrnod + %d diwrnod + %d diwrnod + %d diwrnod + + + %d wythnosau + %d wythnos + %d wythnos + %d wythnos + %d wythnos + %d wythnos + + + %d misoedd + %d mis + %d fis + %d mis + %d mis + %d mis + + + %d blynyddoedd + %d flwyddyn + %d flynedd + %d blynedd + %d blynedd + %d mlynedd + + + + %d eiliadau + %d eiliad + %d eiliad + %d eiliad + %d eiliad + %d eiliad + + + %d munudau + %d munud + %d funud + %d munud + %d munud + %d munud + + + %d oriau + %d awr + %d awr + %d awr + %d awr + %d awr + + + %d diwrnodau + %d diwrnod + %d ddiwrnod + %d diwrnod + %d diwrnod + %d diwrnod + + + %d wythnosau + %d wythnos + %d wythnos + %d wythnos + %d wythnos + %d wythnos + + + %d misoedd + %d mis + %d fis + %d mis + %d mis + %d mis + + + %d blynyddoedd + %d flwyddyn + %d flynedd + %d blynedd + %d blynedd + %d mlynedd + + + + %d eiliadau ymlaen llaw + %d eiliad ymlaen llaw + %d eiliad ymlaen llaw + %d eiliad ymlaen llaw + %d eiliad ymlaen llaw + %d eiliad ymlaen llaw + + + %d munudau ymlaen llaw + %d munud ymlaen llaw + %d funud ymlaen llaw + %d munud ymlaen llaw + %d munud ymlaen llaw + %d munud ymlaen llaw + + + %d oriau ymlaen llaw + %d awr ymlaen llaw + %d awr ymlaen llaw + %d awr ymlaen llaw + %d awr ymlaen llaw + %d awr ymlaen llaw + + + %d diwrnodau ymlaen llaw + %d diwrnod ymlaen llaw + %d ddiwrnod ymlaen llaw + %d diwrnod ymlaen llaw + %d diwrnod ymlaen llaw + %d diwrnod ymlaen llaw + + + %d wythnosau ymlaen llaw + %d wythnos ymlaen llaw + %d wythnos ymlaen llaw + %d wythnos ymlaen llaw + %d wythnos ymlaen llaw + %d wythnos ymlaen llaw + + + %d misoedd ymlaen llaw + %d mis ymlaen llaw + %d fis ymlaen llaw + %d mis ymlaen llaw + %d mis ymlaen llaw + %d mis ymlaen llaw + + + %d blynyddoedd ymlaen llaw + %d flwyddyn ymlaen llaw + %d flynedd ymlaen llaw + %d blynedd ymlaen llaw + %d blynedd ymlaen llaw + %d mlynedd ymlaen llaw + + + + %d eiliadau + %d eiliad + %d eiliad + %d eiliad + %d eiliad + %d eiliad + + + %d munudau + %d munud + %d funud + %d munud + %d munud + %d munud + + + %d oriau + %d awr + %d awr + %d awr + %d awr + %d awr + + + %d diwrnodau + %d diwrnod + %d ddiwrnod + %d diwrnod + %d diwrnod + %d diwrnod + + + %d wythnosau + %d wythnos + %d wythnos + %d wythnos + %d wythnos + %d wythnos + + + %d misoedd + %d mis + %d fis + %d mis + %d mis + %d mis + + + %d blynyddoedd + %d flwyddyn + %d flynedd + %d blynedd + %d blynedd + %d mlynedd + + + Amser yn weddill nes bod y larwm yn canu:\n%s + Amser yn weddill nes dy fod yn cael dy atgoffa:\n%s + Time remaining:\n%s + Sicrha bod y larwm yn gweithio\'n iawn cyn dibynnu arno. Gall gamymddwyn o herwydd rhwystrau\'r system yn ymwneud ag arbed batri. + Sicrha bod atgoffa yn gweithio yn iawn cyn dibynnu arnyn nhw. Gellir camymddwyn oherwydd rhwystrau\'r system yn ymwneud ag arbed batri. + Mae hysbysiadau\'r ap hwn wedi\'u hanalluogi. Galluoga nhw yng ngosodiadau dy ddyfais. + + Larwm + Hepian + Diystyr + Dim atgoffa + Ar y dechrau + Synau\'r system + Dy synau di + Ychwanegu sŵn newydd + Dim sŵn + During the day at hh:mm + During the day at %02d:%02d + + Gosodiadau + Prynu Simple Thank You + General + Color customization + Improved color customization + Addasu lliwiau + Addasu lliwiau (Locked) + Locked + Addasu lliwiau teclyn + Customize notifications + Notification sound + Defnyddio Saesneg + Language + Dangos eitemau cudd + Maint ffont + Bach + Canolig + Mawr + Mawr iawn + Gwarchod eitemau cudd â chyfrinair rhag cael eu dangos + Gwarchod yr ap cyfan â chyfrinair + Gwarchod ffeiliau â chyfrinair rhag eu dileu neu symud + Cadw\'r gwerth diwethaf i\'w addasu yng ngweithrediadau ffeiliau + Dangos swigen gwybodaeth ar eitemau sgrolio wrth lusgo\'r bar sgrolio + Atal y ffôn rhag cysgu tra bod yr ap yn y blaen + Peidio â dangos y deialog cadarnhau cyn dileu + Galluogi tynnu-i-ail-lwytho o\'r top + Defnyddio fformat amser 24 awr + Newid fformat dyddiad ac amser + Dechrau\'r wythnos ar ddydd Sul + Teclynnau + Defnyddio\'r un amser hepian o hyd + Amser hepian + Dirgrynu wrth wasgu botwm + Symud eitemau i\'r Bin Ailgylchu yn hytrach na\'u dileu + Cyfnod glanhau\'r Bin Ailgylchu + Gwagio\'r Bin Ailgylchu + Gorfodi modd darlun + Allforio gosodiadau + Mewnforio gosodiadau + Allforiwyd gosodiadau yn llwyddiannus + Mewnforiwyd gosodiadau yn llwyddiannus + Dangos enw gyda\'r cyfenw gyntaf + Clear cache + Dangos deialog i gadarnhau cyn gwneud galwad + + Gweladwyedd + Diogelwch + Sgrolio + Gweithrediadau ffeiliau + Bin Ailgylchu + Cadw + Cychwyn + Testun + Mudo + Quality + Main screen + Thumbnails + List view + + Exclude + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + Rheoli pa dabiau sy\'n cael eu dangos + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + Adfer y ffeil hon + Adfer y ffeiliau a ddewiswyd + Adfer pob ffeil + Gwagiwyd y Bin Ailgylchu yn llwyddiannus + Adferwyd ffeiliau yn llwyddiannus + Wyt ti yn bendant eisiau gwagio\'r Bin Sbwriel? Caiff y ffeiliau eu colli am byth. + Mae\'r Bin Ailgylchu yn wag + Analluogwyd symud eitemau o\'r Bin Ailgylchu. Defnyddia Adfer + Dangos y Bin Ailgylchu + Cuddio\'r Bin Ailgylchu + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + Moving %d items into the Recycle Bin + Moving %d items into the Recycle Bin + Moving %d items into the Recycle Bin + Moving %d items into the Recycle Bin + + + Yn mewnforio… + Yn allforio… + Mewnforiwyd yn llwyddiannus + Allforiwyd yn llwyddiannus + Methodd y mewnforio + Methodd yr allforio + Methwyd mewnforio rhai cofnodion + Methwyd allforio rhai cofnodion + Ni chanfuwyd unrhyw gofnodion i\'w mewnforio + No new entries for importing have been found + Ni chanfuwyd unrhyw gofnodion i\'w hallforio + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Mae’n ymddangos bod dyfais USB wedi’i chysylltu â dy ddyfais. I sicrhau bod ei ffeiliau yn ymddangos yn gywir, rhaid rhoi caniatâd ychwanegol. + Dewisa ffolder craidd y ddyfais USB ar y sgrin nesaf i roi caniatâd + Dewiswyd y ffolder anghywir. Dewisa ffolder craidd dy ddyfais USB + + Ionawr + Chwefror + Mawrth + Ebrill + Mai + Mehefin + Gorffennaf + Awst + Medi + Hydref + Tachwedd + Rhagfyr + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + yn Ionawr + yn Chwefror + yn Mawrth + yn Ebrill + yn Mai + yn Mehefin + yn Gorffennaf + yn Awst + yn Medi + yn Hydref + yn Tachwedd + yn Rhagfyr + Llun + Mawrth + Mercher + Iau + Gwener + Sadwrn + Sul + Ll + M + M + I + G + S + S + Llun + Maw + Mer + Iau + Gwe + Sad + Sul + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + Mae am ddim tan: %s. Os wyt yn ei lawrlwytho cyn hynny, bydd yn bosib ei ddefnydido am ddim am byth. + Mwy o wybodaeth + Uwchraddio + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Ynghylch + Website + Am y ffynonellau, gweler + Anfona dy adborth neu awgrymiadau at + Uwchraddio i Pro + Rhagor o apiau + More apps from us + Gwahodd ffrindiau + Hei, cymer olwg ar %1$s a %2$s + Gwahodd trwy + Sgorio ni + Rate + Rhoddi + Dilyn ni + f %1$s\nHawlfraint © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Gwybodaeth ychwanegol + Fersiwn ap: %s + System y ddyfais: %s + +
    + Gobeithio dy fod yn mwynhau\'r ap. Nid yw\'n cynnwys unrhyw hysbysebion, felly a fyddi di mor garedig â chefnogi ei ddatblygiad gan brynu ap Simple Thank You. Mi fydd hefyd yn stopio\'r neges hon ymddangos eto.

    + Diolch! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Prynu + Get Simple Phone + Diweddara Simple Thank You i\'r fersiwn diweddaraf + Cyn gofyn cwestiwn, gwiria osodiadau\'r ap a\'r atebion i Gwestiynau Cyffredin yn gyntaf. Gall fod y datrysiad yno. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + Jyst yn rhoi gwybod i ti am ap newydd wedi\'i ryddhau yn ddiweddar:

    + %2$s

    + %4$s

    + %6$s

    + Gellir ei lawrlwytho gan glicio\'r teitl.

    + Hwyl. + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + yma. + ]]> + + + Cwestiynau cyffredin + Cyn ofyn cwestiwn, gweler y + Pam nad ydw i\'n gweld teclyn yr ap hwn yn y rhestr teclynnau? + Mwyaf debyg wyt wedi symud yr ap i gerdyn SD. Mae rhwystr yn system Android sy\'n cuddio teclynnau apiau sydd ar y cerdyn SD. Yr unig datrysiad yw mynd i osodiadau dy ddyfais a symud yr ap nôl i\'r storfa fewnol. + Dw i eisiau cefnogi, ond dw i methu rhoi arian. Oes rhywbeth arall galla\'i wneud? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + Dw i wedi dileu ffeiliau ar gam. Sut ydw i\'n eu hadfer nhw? + Yn anffodus, nid yw\'n bosib. Mae ffeiliau yn cael eu dileu ar unwaith ar ôl y deialog cadarnhau. Does dim bin sbwriel. + Dw i\'m yn hoffi lliwiau\'r teclyn. Ga\'i newid nhw? + Cei. Wrth i ti lusgo teclyn ar dy sgrin gartref mae sgrin addasu\'r teclyn yn ymddangos. Gweli sgwariau lliwiau yn y gornel gwaelod chwith. Gwasga fanno i ddewis lliw newydd. Gellir defnyddio\'r llithrydd i addasu\'r alffa hefyd. + Ydy\'n bosib adfer ffeiliau wedi\'u dileu? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + Mae eicon lansio\'r ap wedi diflannu. Beth alla\'i wneud? + Mae hyn am nad yw dy lansiwr yn cefnogi addasu eiconau yn iawn. Rho gynnig ar lansio\'r ap o Google Play neu ryw declyn, os ar gael. + Ar ôl iddo lansio, gosoda eicon yr ap nôl i\'r lliw oren rhagosodedig #F57C00. Os nad yw hyn yn bosib neu\'n gweithio, bydd rhaid ailosod yr ap. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + Mae\'r ap hwn yn defnyddio\'r llyfrgelloedd trydydd parti canlynol i wneud bywyd yn haws. Diolch am bob un. + Trwyddedau trydydd parti + Kotlin (iaith rhaglennu) + Subsampling Scale Image View (zoomable imageviews) + Glide (llwytho a cadw delweddau dros dro) + Picasso (llwytho a cadw delweddau dros dro) + Android Image Cropper (tocio a throi delweddau) + RtlViewPager (llithro dde i\'r chwith) + Joda-Time (amnewidyn dyddiad Java) + Stetho (dadfygio cronfeydd data) + Otto (bws digwyddiadau) + PhotoView (GIFiau chwyddadwy) + PatternLockView (diogelwch patrwm) + Reprint (diogelwch ôl bys) + Gif Drawable (GIFiau llwytho) + AutoFitTextView (newid maint testun) + Robolectric (fframwaith profi) + Espresso (cynorthwyydd profi) + Gson (dosrannydd JSON) + Leak Canary (synhwyrydd cof yn gollwng) + Number Picker (dewisydd rhifau addasedig) + ExoPlayer (chwaraeydd fideo) + VR Panorama View (dangos panoramas) + Apache Sanselan (darllen metadata delweddau) + Android Photo Filters (hidlyddion delweddau) + Gesture Views (delweddau chwyddadwy) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + Your trial expires in %d days. + Your trial expires in %d days. + Your trial expires in %d days. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-da/strings.xml b/commons/src/main/res/values-da/strings.xml new file mode 100644 index 000000000..4d5528006 --- /dev/null +++ b/commons/src/main/res/values-da/strings.xml @@ -0,0 +1,1092 @@ + + + OK + Annuller + Tilbage + Intet + Senere + Gem som + Fil gemt + Ugyldigt filformat + Fejl, ikke mere plads + Der opstod en fejl: %s + Fejl: %s + Åbn med + Rediger med + Redigér + Der blev ikke fundet en gyldig app + Ingen browser fundet + Ingen email klient fundet + Anvend som + Kopier til udklipsholder + Kopier nummeret til udklipsholderen + Værdi kopieret til udklipsholderen + Værdi kopieret til udklipsholderen:\n%s + Opkaldsnummer + Ukendt + Altid + Aldrig + Detaljer + Noter + Sletter mappen \'%s\' + Ingen + Label + Gennemsigtig + Transparent farve + Vælg en anden farve + Download + Underretning + Underretninger + E-mail + Forrige + Afspil / Pause + Næste + Nummer + Ingen kontakter fundet + Anmod om de krævede tilladelser + Appen kunne ikke tilgå dine kontakter + Appen har ikke tilladelse til at foretage telefonopkald, du skal give tilladelse til det i enhedens indstillinger + Indsæt tekst her + Ring til %s + Bekræft opkald til %s + Nul + En + To + Tre + Fire + Fem + Seks + Syv + Otte + Ni + Værdi + Værdien kan ikke være tom + Opret ny kontakt + Tilføj til en eksisterende kontakt + App defekt + Forbehold + Tag foto + Vælg foto + Vælg video + Vælg kontakt + Vælg fil + Optag audio + Optag video + Opdaterer… + Telefon lager + Telefon lager (ikke synlig for andre apps) + Audio + + Fødselsdag + Årsdag + + Hjem + Arbejde + + Mobil + Hovednummer + Arbejdsfax + Hjemmefax + Personsøger + Intet telefonnummer er fundet + + Skift visning + Gitter + Gitter (Pro) + Ujævnt gitter + Liste + Flere kolonner + Færre kolonner + Antal kolonner + Antal kolonner stående format + Antal kolonner liggende format + Skift cover-billede + Vælg billede + + %d kolonne + %d kolonner + + + Administrér blokerede numre + Du blokerer ikke nogen. + Tilføj et blokeret nummer + Blokér nummer + Blokér numre + Blokerede numre + Eksporter blokerede numre + Importer blokerede numre + Du skal gøre denne app til standardopkaldsappen for at gøre brug af blokerede numre. + Gør til standard + Er du sikker på at du vil blokere \"%s\"? + Blokér opkald fra ukendte + Blokér beskeder fra ukendte + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Bogmærker + Tilføj bogmærker + Føj til bogmærker + Fjern fra bogmærker + + Søg + Søg i %s + Start søgningen ved at skrive mindst to tegn. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Filter + Filter (Pro) + Intet fundet. + Skift filter + + Tilladelse til at gemme påkrævet + Adgang til kontakter påkrævet + Adgang til kamera påkrævet + Adgang til lyd påkrævet + Ingen tilladelse + Du skal tillade, at appen viser meddelelser, ellers kan den ikke vise påmindelser. + Du skal tillade, at appen viser meddelelser, ellers kan den ikke vise statuslinjen. + Du skal tillade, at appen viser notifikationer, ellers kan den ikke afspille sange. + Du skal tillade, at appen viser notifikationer, ellers kan den ikke optage lyd. + Du skal tillade, at appen viser meddelelser, ellers kan den ikke vise indgående opkald. + Du skal tillade, at appen viser meddelelser, ellers kan den ikke vise indgående meddelelser. + Giv tilladelse + Tilladelse påkrævet + + Omdøb fil + Omdøb mappe + Kunne ikke omdøbe filen + Kunne ikke omdøbe mappen + Mappen skal have et navn + Navnet bruges allerede af en anden mappe + Kan ikke omdøbe lagerets rodmappe + Mappen er omdøbt + Omdøber mappe + Filen skal have et navn + Filnavnet indeholder ugyldige tegn + Filnavnet \"%s\" indeholder ugyldige tegn + Filtypen kan ikke stå tom + Kildefilen %s eksisterer ikke + Tilføj forrest til filnavne + Tilføj bagerst til filnavne + Simple omdøbning + Mønster + Tekststreng der skal tilføjes + %Y - år\n%M - måned\n%D - dag\n%h - time\n%m - minut\n%s - sekund\n%i - tal stigende fra 1 + Filnavn (uden .txt) + Filnavn (uden .json) + Filnavn (uden .zip) + Fra og med Android 11 kan du ikke længere skjule filer og mapper på den måde + + Kopier + Flyt + Kopier/Flyt + Kopier til + Flyt til + Kilde + Destination + Vælg destination + Klik her for at vælge destination + Kunne ikke skrive til den valgte destination + Vælg en destination + Til og fra skal være forskellige + Kunne ikke kopiere filerne + Kopierer… + Filerne er kopieret + Filen er kopieret + Der opstod en fejl + Flytter… + Filerne er flyttet + Filen er flyttet + Ikke alle filer blev flyttet + Nogle filer blev ikke kopieret + Der er ikke valgt nogen filer + Gemmer… + Kunne ikke oprette mappen %s + Kunne ikke oprette filen %s + Der blev ikke fundet nogen nye filer + Der er ikke plads nok.\nDer skal bruges %1$s, der er %2$s + Systemtjenesten til valg af filer og mapper er ikke tilgængelig + + Opret ny + Mappe + Fil + Opret en ny mappe + Navnet er allerede i brug + Navnet indeholder ugyldige tegn + Skriv et navn + Der opstod en ukendt fejl + + Filen \"%s\" findes allerede + Filen \"%s\" findes allerede. Overskriv? + Mappen \"%s\" findes allerede + Sammenflet + Behold begge + Overskriv + Spring over + Tilføj \"_1\" + Anvend på alle konflikter + Systemet tillader ikke operationen i denne mappe, vælg en anden + Systemet tillader ikke kopiering til denne mappe, vælg en anden + Systemet tillader ikke omdøbning i denne mappe + Cannot rename folders directly on internal storage, only subfolders + Kan ikke omdøbe denne mappe + + Vælg en mappe + Vælg en fil + Bekræft adgang til eksternt lager + Bekræft mappeadgang + Vælg SD-kortets rodmappe på næste side for at give skriveadgang til den + Hvis ikke du kan se SD-kortet kan du prøve dette + Tillad appen at få adgang til det valgte lager på det næste skærmbillede ved at trykke på \'Brug denne mappe\' nederst. + Tillad adgang til \"<b>%s</b>\" på det næste skærmbillede ved at trykke på \"<b>Brug denne mappe</b>\" nederst på skærmen. + Tryk på \'<b>Save</b>\' nederst på det næste skærmbillede for at oprette den nye mappe. + Bekræft valg + Indlæser… + Giv venligst vores app adgang til alle dine filer, den fungerer muligvis ikke godt uden. + + %d element + %d elementer + + + + %d element + %d elementer + + + Sletter %d element + Sletter %d elementer + + + + %d kontakt + %d kontakter + + + Vælg lager + Lagerplads + Intern + SD-kort + Rod + Forkert mappe valgt, vælg rodmappen på SD-kortet + Stierne til SD-kortet og USB-enheden kan ikke være ens + Det ser ud til at du har appen installeret på et SD-kort. Det gør at appens widget ikke er tilgængelig og ikke kan ses på listen med widgets. + Dette skyldes en begrænsning i systemet, så hvis du vil bruge appens widgets må du flytte appen tilbage til det interne lager. + Forkert mappe valgt. Vælg stien \'%s\' + + Egenskaber + Sti + Elementer valgt + Antal direkte underliggende + Antal filer i alt + Opløsning + Varighed + Forfatter + Album + Brændvidde + Eksponeringstid + ISO + F-nummer + Kamera + EXIF + Sangtitel + GPS-koordinater + Højde + Fjern EXIF + Er du sikker på, at du vil fjerne EXIF-værdier som GPS-koordinater, kameramodel osv.? + EXIF-værdierne er fjernet + + Baggrundsfarve + Tekstfarve + Primær farve + Effektfarve på det hvide udseende + Effektfarve på det sorte & hvide udseende + Forgrundsfarve + Farve til appens ikon + Farve på nederste navigationslinje + Gendan standarder + Anvend standard + Standard + Skift farve + Udseende + Ændring af farve vil også medføre skift til tilpasset udseende + Gem + Kassér + Fortryd ændringer + Er du sikker på at du vil fortryde ændringerne? + Handlingen kan ikke fortrydes. + Du har ændringer der ikke er gemt. Vil du gemme dem? + Anvend farverne på alle Simple Apps + ADVARSEL: Ikke alle app-launchers kan håndtere tilpasning af ikonfarve. Hvis et ikon skulle forsvinde kan du prøve at åbne appen via Google Play eller en widget. + Når appen er åben kan du sætte farven til standardfarven #F57C00 igen. I værste fald må du geninstallere appen. + Farverne er ændret. Et nyt udseende kaldet \"Tilpasset\" er tilføjet, brug det ved opdatering af alle app-farver fremover. + Bemærk at selv om du bruger appens Pro-version, skal du af tekniske årsager stadig have Simple Thank You. Den tager sig af farvesynkronisering. + + Simple Thank You for at låse denne funktion op og understøtte appens udvikling. Tak! + ]]> + + + Lys + Mørk + Auto + Auto lyst / mørkt + Solariseret + Mørkerød + Hvid + Sort & hvid + Tilpasset + Gemt + Systemets standard + + Hvad er nyt + * Kun større opdateringer er nævnt her, der er altid flere mindre forbedringer også + + Slet + Fjern + Omdøb + Del + Del via + Skaler + Vælg alle + Vælg tekst + Skjul + Vis + Skjul mappe + Vis mappe + Vis midlertidigt skjulte + Stop visning af skjulte medier + Du kan ikke dele så meget indhold ad gangen + Tøm og deaktiver papirkurven + Fortryd + Gentag + Udskriv + Udskriv (Pro) + Genvej + Opret genvej + Opret genvej (Pro) + Føj nummer til kontakt + Vis kontaktoplysninger + Opkald fra SIM 1 + Opkald fra SIM 2 + Skift filnavnets synlighed + Flyt til toppen + Flyt til bunden + Fastgør emne + Frigør emne + Send SMS + Send email + Opkald + Contact details + Add contact + Tapeter + + Sorter efter + Navn + Størrelse + Senest ændret + Oprettelsesdato + Eksponeringsdato + Titel + Filnavn + Filtype + Tilfældig + Tilfældig rækkefølge + Stigende + Faldende + Anvend kun på denne mappe + Sorter nummerisk indhold efter værdi + Fornavn + Mellemnavn + Efternavn + Fulde navn + Brug brugerdefineret rækkefølge + Skift rækkefølge + + Er du sikker på at du vil fortsætte med at slette? + Er du sikker på at du vil slette %s? + Delete %s? + + Er du sikker på at du vil flytte %s til papirkurven? + + Er du sikker på at du vil slette dette? + Er du sikker på at du vil flytte dette til papirkurven? + Spørg ikke igen i denne session + Vis ikke dette igen + Ja + Nej + Måske + + ADVARSEL: Du sletter en mappe + ADVARSEL: Du sletter %d mapper + + + PIN + Indtast PIN + Indtast en PIN + Forkert PIN + Gentag PIN + Mønster + Indsæt mønster + Forkert mønster + Gentag mønster + Biometri + Fingeraftryk + Tilføj fingeraftryk + Sæt din finger på sensoren + Åbn dialogboksen til verifikation af biometrisk ID + Godkend + Godkendelsen fejlede + Godkendelse blokeret, prøv igen om lidt + Du har ingen registrerede fingeraftryk, tilføj nogle i indstillingerne på din enhed + Gå til indstillingerne + Adgangskoden er oprettet. Geninstaller appen hvis du glemmer den. + Beskyttelsen er oprettet. Geninstaller appen hvis du har problemer med at gendanne den. + Lås mappe + Lås mappe (Pro) + Lås mappe op + Denne beskyttelse virker kun i denne app, den er ikke beregnet som erstatning for rigtig kryptering af mapper på systemniveau. + + I går + I dag + I morgen + Hver dag + Skjul årstal + sekunder + minutter + timer + dage + s + m + t + u. + + %d sekund + %d sekunder + + + %d minut + %d minutter + + + %d time + %d timer + + + %d dag + %d dage + + + %d uge + %d uger + + + %d måned + %d måneder + + + %d år + %d år + + + + %d sekund + %d sekunder + + + %d minut + %d minutter + + + %d time + %d timer + + + %d dag + %d dage + + + %d uge + %d uger + + + %d måned + %d måneder + + + %d år + %d år + + + + %d sekund før start + %d sekunder før start + + + %d minut før start + %d minutter før start + + + %d time før start + %d timer før start + + + %d dag før start + %d dage før start + + + %d uge før start + %d uger før start + + + %d måned før start + %d måneder før start + + + %d år før start + %d år før start + + + + %d sekund + %d sekunder + + + %d minut + %d minutter + + + %d time + %d timer + + + %d dag + %d dage + + + %d uge + %d uger + + + %d måned + %d måneder + + + %d år + %d år + + + Resterende tid før alarmen lyder:\n%s + Tid tilbage inden alarmen lyder:\n%s + Resterende tid:\n%s + Du anbefales sikre dig at alarmen virker som den skal inden du stoler på den. Den kan drille som følge af strømbesparende begrænsninger på systemet. + Du anbefales sikre dig at påmindelser virker som de skal inden du stoler på dem. De kan drille som følge af strømbesparende begrænsninger på systemet. + Påmindelser er ikke aktiveret for denne app. Du kan aktivere dem i indstillingerne på din enhed. + + Alarm + Udsæt + Slå fra + Ingen påmindelse + Ved start + Systemlyde + Dine lyde + Tilføj en ny lyd + Ingen lyd + I løbet af dagen kl. hh:mm + I løbet af dagen kl. %02d:%02d + + Indstillinger + Køb Simple Thank You + Generelt + Farvetilpasning + Forbedret farvetilpasning + Rediger farver + Rediger farver (Låst) + Låst + Rediger widget-farver + Tilpas notifikationer + Notifikationslyd + Brug engelsk + Sprog + Vis skjulte elementer + Skriftstørrelse + Lille + Medium + Stor + Ekstra stor + Beskyt visning af skjulte elementer med en kode + Beskyt hele appen med en adgangskode + Beskyt mod sletning og flytning med en kode + Behold den gamle senest ændrede værdi ved filoperationer + Vis en info-boble når jeg scroller med rullepanelet + Forhindr telefonen i at falde i søvn når appen er i forgrunden + Spørg ikke om bekræftelse før sletning + Aktiver træk nedad for at genindlæse + Brug 24-timersformat + Skift format på dato og tid + Søndag første ugedag + Widgets + Brug altid samme udsættelsestid + Udsættelsestid + Vibrer ved knaptryk + Flyt elementer til papirkurven i stedet for at slette dem + Interval for tømning af papirkurven + Tøm papirkurven + Brug stående visning + Eksporter indstillinger + Importer indstillinger + Indstillinger eksporteret + Indstillinger importeret + Start navn med efternavn + Ryd cache + Vis en opkaldsbekræftelsesdialog før du starter et opkald + + Synlighed + Sikkerhed + Rulning + Filoperationer + Papirkurv + Gemmer + Opstart + Tekst + Migrering + Kvalitet + Hovedskærm + Miniaturebilleder + Listevisning + + Ekskluder + Exkluder mappe + Ekskluderede mapper + (ekskluderet) + Administrer ekskluderede mapper + Fjern alle + Fjern alle fra listen med ekskluderede mapper\? Det vil ikke slette mapperne. + Vis midlertidigt ekskluderede + Stop visning af ekskluderede + + Administrer viste faner + Tab for at åbne ved appstart + Kontakter + Foretrukne + Opkaldshistorik + Grupper + Senest brugte + Filer + Seneste filer + + Gendan denne fil + Gendan valgte filer + Gendan alle filer + Papirkurven blev tømt + Filerne blev gendannet + Er du sikker på at du vil tømme papirkurven? Filerne vil ikke kunne genskabes. + Papirkurven er tom + Flytning af indhold i papirkurven er deaktiveret, gendan i stedet + Vis papirkurven + Skjul papirkurven + Åbn papirkurven + Spring papirkurven over, slet filer direkte + + Flytter en fil til papirkurven + Flytter %d filer til papirkurven + + + Importerer… + Eksporterer… + Import gennemført + Eksport gennemført + Importen mislykkedes + Eksporten mislykkedes + Importen mislykkedes delvist + Eksporten mislykkedes delvist + Der blev ikke fundet indhold til import + Der er ikke fundet nye poster til import + Der er ikke fundet indhold til eksport + Backups + Aktiver automatisk backup + Administrer automatisk backup + Du kan bruge disse pladsholdere til automatisk at navngive din fil:\n\n%Y - år\n%M - måned\n%D - dag\n%h - time\n%m - minut\n%s - sekund + + USB + Du ser ud til at have en USB-enhed tilsluttet. For at sikre at dens filer ses ordentligt, skal du tildele flere rettigheder. + Vælg rodmappen på USB-enheden på den næste skærm for at give adgang + Den forkerte mappe er valgt, vælg rodmappen på din USB-enhed + + Januar + Februar + Marts + April + Maj + Juni + Juli + August + September + Oktober + November + December + + Jan + Feb + Mar + Apr + Maj + Jun + Jul + Aug + Sep + Okt + Nov + Dec + + i januar + i februar + i marts + i april + i maj + i juni + i juli + i august + i september + i oktober + i november + i december + Mandag + Tirsdag + Onsdag + Torsdag + Fredag + Lørdag + Søndag + M + T + O + T + F + L + S + Man + Tir + Ons + Tor + Fre + Lør + Søn + + Din version af appen opdateres ikke længere. Opgrader til Pro-versionen, og du vil få fejlrettelser og andre forbedringer. + Din version af appen opdateres ikke længere. For at få nye fejlrettelser og andre forbedringer må du opgradere til Pro-versionen ved at klikke her. + Den er stadig gratis indtil: %s. Downloader du den indtil da kan du blive ved at bruge den gratis fremover. + Yderligere oplysninger + Opgrader + Du må overføre lokalt gemte begivenheder ved at eksportere til en ics-fil og derpå importere den. Du finder eksport- og importknapper i hovedmenuen. + Hej\n\nDet ser ud til, at du lige har opgraderet fra den gratis version. Når du er tilfreds med denne version og måske har flyttet dine indstillinger og favoritter over, kan du afinstallere den gamle gratis version for at undgå at starte den ved et uheld, da du ikke længere har brug for den..\n\nTak! + Hej\n\nDet ser ud til, at du også allerede har Pro-app-versionen. Når du er tilfreds med den og måske har flyttet dine indstillinger og favoritter over, kan du afinstallere denne for at undgå at starte den ved et uheld, da du ikke længere har brug for den.\n\nTak! + Hej\n\nDet ser ud til at du lige har opgraderet fra den gratis version. Så snart du er tilfreds med denne og måske har flyttet dine data over, kan du afinstallere den gamle og dermed undgå at åbne den ved et uheld, du vil ikke have brug for den mere.\n\nTak! + Hej\n\nDet ser ud til, at du også allerede har Pro app-versionen. Når du er tilfreds med den og måske har overført dine data, kan du afinstallere denne for at undgå at starte den ved et uheld, da du ikke har brug for den længere.\n\nTak! + Hej\n\nDet ser ud til, at du lige har opgraderet fra den gratis version. Hvis du ønsker at overføre dine lokalt gemte begivenheder, skal du gøre det manuelt ved at eksportere dem til en .ics-fil i den gratis app-version og importere dem her via topmenuen. \n\nNår du er tilfreds med din opsætning i Pro-versionen, kan du afinstallere den gamle gratis version, da du ikke længere har brug for den. \n\n\nTak! + Hej\n\nDet ser ud til, at du lige har opgraderet fra den gratis version. Hvis du havde nogen kontakter gemt under \"%s\", skal du overføre dem manuelt ved at eksportere dem i en .vcf-fil fra den gratis app-version og importere dem her via topmenuen.\n\nNår du er tilfreds med din opsætning i Pro-versionen, kan du afinstallere den gamle gratis version, da du ikke længere har brug for den.\n\n\nTak! + Hej\n\nDet ser ud til, at du lige har opgraderet fra den gratis version. Hvis du vil overføre dine noter, skal du gøre det manuelt ved at eksportere dem til en fil i den gratis app-version og importere dem her via topmenuen. \n\nNår du er tilfreds med din opsætning i Pro-versionen, kan du afinstallere den gamle gratis version, da du ikke længere har brug for den. \n\n\nTak! + + Om + Website + For at se kildekoden besøg + Send feedback og forslag til + Opgrader til Pro + Flere apps + Flere apps fra os + Inviter venner + Hej, se %1$s på %2$s + Inviter via + Vurder os + Vurder + Donér + Følg os + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Hjælp os + Social + Andet + Politik om beskyttelse af personlige oplysninger + Version %s + Hej :) + Udviklet med ❤️ i Slovakiet + Yderligere info + Appversion: %s + Enheds-OS: %s + +
    + Håber du kan lide denne app. Den indeholder ingen reklamer, så vær sød at købe appen Simple Thank You, som også vil forhindre at denne besked vises igen.

    + På forhånd tak! + ]]> +
    + Hej,<br><br>Jeg håber, at du nyder appen. Den indeholder ingen reklamer, og vi indsamler heller ikke dine data, men du kan støtte dens udvikling ved at købe <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. Du vil også få alle app-funktioner og farvetilpasning låst op.<br><br>Tak! + Støt os ved at købe <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>, det vil også låse alle app-funktioner op, herunder farvetilpasning. + Køb + Få Simple Phone + Opdater venligst Simple Thank You til den seneste version + Inden du stiller et spørgsmål bedes du først tjekke appens indstillinger og læse de \"Ofte stillede spørgsmål\", måske finder du svaret der. + Tjek appens indstillinger og læs vores ofte stillede spørgsmål inden du vurderer os. Har du nogen problemer, kan du måske finde en løsning der. + Sørg også for at du bruger den seneste version af appen. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Læs det + Read OSS + Hej\n\nDet ser ud til at du har brugt denne app et godt stykke tid, og det er vi virkelig glade for.\n\nHvis vi til gengæld må bede om en tjeneste, vil vi sætte stor pris på din vurdering på Google Play. Det ville være en kæmpe hjælp.\n\nUanset hvad du beslutter dig for, vil du ikke se denne besked igen.\n\nPå forhånd tak! + Vurder vores app :) + Tak skal du have + Widget\'en er låst. +\nOpgrader til Pro-versionen for at låse den op. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + - synes lige du skulle vide at der er kommet en ny app:

    + %2$s

    + %4$s

    + %6$s

    + Du kan downloade den med et klik på titlen.

    + Tak + ]]> +
    + Simpel appstarter + Simpel lommeregner + Simpel kalender + Simpelt kamera + Simpelt ur + Simple Contacts + Simpel Dialer + Simpel tegneapp + Simple File Manager + Simpel lommelygte + Simpelt galleri + Simpelt tastatur + Simpel Launcher + Simpel musikafspiller + Simple Notes + Simpel SMS Messenger + Simpelt tak + Simpel stemmeoptager + Appstarter + Lommeregner + Kalender + Kamera + Ur + Kontakter + Opkald + Tegning + Filhåndtering + Blitz + Galleri + Tastatur + Launcher + Musikafspiller + Noter + Beskeder + Tak skal du have + Lydoptager + + Download den originale version her. + ]]> + + + Ofte stillede spørgsmål + Inden du stiller et spørgsmål bedes du først læse + Hvorfor kan jeg ikke se denne app\'s widget på listen med widgets? + Det er sikkert fordi du har flyttet appen til et SD-kort. Der er en begrænsning i Androidsystemet der i så fald skjuler appens widget. Eneste løsning er at flytte appen tilbage til det interne lager via indstillingerne på din enhed. + Jeg vil gerne støtte dig, men jeg kan ikke donere penge. Er der andet jeg kan gøre? + + dette websted, eller mail til os på adressen hello@simplemobiletools.com, hvis du har spørgsmål. + ]]> + + Jeg fik slettet nogle filer ved en fejl, hvordan kan jeg gendanne dem? + Det kan du desværre ikke. Filer er væk så snart sletningen er bekræftet, og der er ingen papirkurv. + Jeg bryder mig ikke om farverne på widget\'en, kan jeg ændre dem? + Jep. Når du føjer en widget til din skærm kommer muligheden for at konfigurere den frem. I nederste venstre hjørne finder du farvede kvadrater, klik på dem og vælg en ny farve. Du kan justere alfa med skyderen. + Kan jeg gendanne slettede filer? + Nej, ikke hvis de virkelig er slettet. Men som standard er papirkurven aktiveret, i den opbevares \"slettede\" filer, så der vil du kunne finde dem igen. + App-launcher\'ens ikon forsvandt. Hvad gør jeg\? + Det sker når din launcher ikke supporterer tilpasning af ikonet. Prøv at åbne appen via Google Play eller fra en widget. + Når appen er åbnet kan du ingen sætte farven til den orange standardværdi, #F57C00. I værste fald må du reinstallere appen. + Pengene er trukket fra min bankkoto, men jeg kan ikke downloade appen. Hvad gør jeg nu? + Betalinger håndteres af Google, men deres system fejler af og til. Ryd cachen til din Google Play-app og genstart din enhed. Prøv så at downloade appen igen. + Hvorfor skulle jeg opgradere til Pro-versionen? + Da din version af appen ikke opdateres længere, kan den indeholde fejl der aldrig bliver rettet. Der vil heller ikke komme nye funktioner til den. Du kan købe Pro-versionen på Google Play for et lille beløb. + Det er en engangsinvestering, har du betalt een gang skal du aldrig gøre det igen, heller ikke hvis du skifter mobil eller tablet. Kan du ikke lide Pro-versionen, kan du afinstallere den indenfor nogle få timer og du vil automatisk få dine penge tilbage. + Vil du på et senere tidspunkt have pengene refunderet, skal du blot sende en mail til hello@simplemobiletools.com, så klarer vi det. + Hvordan kan jeg vælge flere elementer på én gang? + Der er flere måder at gøre det på. Den første er at starte valgtilstanden ved at trykke længe på et element og derefter klikke kort på andre elementer for at vælge dem. Den anden måde svarer til at vælge elementer på en pc med en mus. + Du skal bare starte valgtilstanden ved at trykke længe på et element og derefter mens fingeren stadig er nede, trække den hen over andre elementer for at vælge dem. Den tredje måde at vælge flere elementer på er ved at trykke længe på et element og derefter trykke længe på et andet element, og alt derimellem bliver valgt. Hvis du + vil vælge alle elementer, skal du blot trykke længe på et element og derefter klikke på tælleren for det valgte element øverst til venstre i hjørnet. Det vil vælge eller fravælge alting. + Jeg har købt appen, men jeg kan ikke downloade den på en anden enhed. + Prøv at rydde din Google Play-appcache og genstarte din enhed. Det er en fejl i Google Play, som ikke har noget med selve appen at gøre. + + Bidragydere + Oversættelse + Udvikling + Anden hjælp + + denne hjemmeside, eller send en mail til hello@simplemobiletools.com, hvis du har spørgsmål. + Tak til alle bidragydere og andre støtter! + ]]> + + Arabisk + Aserbajdsjansk + Bengalsk + Bretonsk + Bulgarsk + Catalansk + Tjekkisk + Walisisk + Dansk + Engelsk + Tysk + Græsk + Spansk + Baskisk + Persisk + Finsk + Fransk + Galicisk + Hindi + Croatisk + Ungarsk + Indonesisk + Italiensk + Hebraisk + Japansk + Koreansk + Litauisk + Nepalesisk + Norsk + Hollandsk + Polsk + Portugisisk + Rumænsk + Russisk + Slovakisk + Slovensk + Serbisk + Svensk + Tamilsk + Tyrkisk + Ukrainsk + Vietnamesisk + Kinesisk (Hong Kong) + Kinesisk (forenklet) + Kinesisk (Traditionelt) + + Få Pro-versionen nu! + Grundlæggende + Pro + Ingen reklamer + Ingen internetadgang + Fuld tilfredshed eller pengene tilbage + Engangsbetaling + Forbedret design + + Avanceret fotoredigering + Advanceret photo- & videoeditor + HEIC/HEIF filunderstøttelse + Avanceret masseomdøbning af filer + Individuel låsning af mapper + Udskrivningssupport + + Tidszone-support + Deltager- og mail-påmindelser + Nem import af begivenheder + Nye widgets + + Forbedret sammenfletning af duplikerede kontakter + Skræddersyet skriftstørrelse + Mulighed for deling af private kontakter med dine apps + Kontaktspecifikke ringetoner + Kontaktfiltrering + Privat gemte kontakter + + Tjeklister + Forskellig note og farver per widget + Note-låsning + + Tilpasning af format på dato og tid + Genveje til startside + Understøtter pakning af filer + Fane med seneste filer + + Selvvalgt baggrundsfarve + Understøtter filimport + Zoomer + + Denne app bruger følgende 3.-parts biblioteker der gør at mit liv bliver lidt enklere. Tak. + 3.-parts licencer + Kotlin (programmeringssprog) + Subsampling Scale Image View (zoombar billedvisning) + Glide (billedindlæsning og -caching) + Picasso (billedindlæsning og -caching) + Android Image Cropper (beskær og roter billede) + RtlViewPager (højre til venstre-swiping) + Joda-Time (Java-dato-erstatning) + Stetho (debugger databaser) + Otto (event bus) + PhotoView (zoombare GIF\'er) + PatternLockView (mønsterbeskyttelse) + Reprint (beskyttelse af fingeraftryk) + Gif Drawable (indlæser GIF\'er) + AutoFitTextView (skalering af tekst) + Robolectric (tester framework) + Espresso (tester helper) + Gson (JSON parser) + Leak Canary (detektering af pladsmangel) + Nummervælger (nummervælger, der kan tilpasses) + ExoPlayer (videoafspiller) + VR Panorama View (viser panoramaer) + Apache Sanselan (læsning af billedmetadata) + Android-fotofiltre (billedfiltre) + Gesture Views (billeder, der kan zoomes) + Hurtig indikatorrulle (bogstaver på rullepanel) + Event Bus (intern kommunikation i appen) + Audio Record View (audio-visualisering) + SMS MMS (håndtering af SMS og MMS) + APNG Android (animeret WebP-understøttelse) + PDFViewPager (PDF viser) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Prøveperioden er udløbet + Start en gratis prøveperiode + Din prøveperiode udløber snart. + Unlock the app for one final day + Velkommen til %s! + Tak, fordi du bruger vores app. Du kan bruge denne ulåste version i <font color=\'#FFFFFFFF\'>%d dage</font>. Når prøveversionen udløber, skal du overveje at opgradere til Pro-versionen. Den har en enorm mængde nye funktioner, et moderne design, ingen reklamer og mange andre forbedringer. + \n\nDu skal bare betale for det en gang for alle, og hvis du ikke er tilfreds, kan du afinstallere det og få pengene tilbage.\n\nHåber du vil kunne lide den :) + Opgrader venligst til Pro-versionen for at nyde appen fuldt ud.\n\nDu skal kun betale for den én gang i livet, og hvis du ikke er tilfreds, kan du afinstallere den og få pengene tilbage.\n\n\nVi ses :) + + Din prøveperiode udløber om %d dag. + Din prøveperiode udløber om %d dage. + + + FORÆLDET: Denne version af appen vedligeholdes ikke længere, skift til Pro-versionen her https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Husk at hvis du afinstallerer en betalt app indenfor 2 timer, får du automatisk pengene tilbage. Vil du have refunderet beløbet på et senere tidspunkt, så send en mail til hello@simplemobiletools.com. På den måde kan du prøvekøre appen uden omkostninger :) + + En gruppe simple, open source apps til Android med widgets, der kan tilpasses, uden reklamer og unødvendige tilladelser. +
    diff --git a/commons/src/main/res/values-de/strings.xml b/commons/src/main/res/values-de/strings.xml new file mode 100644 index 000000000..e707627ea --- /dev/null +++ b/commons/src/main/res/values-de/strings.xml @@ -0,0 +1,1120 @@ + + + OK + Abbrechen + Zurück + Nichts + Später + Speichern unter + Datei erfolgreich gespeichert + Ungültiges Dateiformat + Fehler: Zu wenig Speicher + Es ist ein Fehler aufgetreten: %s + Fehler: %s + Öffnen mit + Bearbeiten mit + Bearbeiten + Keine passende App gefunden + Kein Browser gefunden + Kein E-Mail-Client gefunden + Festlegen als + In die Zwischenablage kopieren + Nummer in Zwischenablage kopieren + Wert in Zwischenablage kopiert + Wert in Zwischenablage kopiert:\n%s + Nummer anrufen + Unbekannt + Immer + Nie + Details + Notizen + Ordner „%s“ wird gelöscht + nichts + Bezeichnung + Durchsichtig + Transparente Farbe + Wähle eine andere Farbe aus + Herunterladen + Benachrichtigung + Benachrichtigungen + E-Mail + Vorheriger Titel + Wiedergabe / Pause + Nächster Titel + Nummer + Keine Kontakte gefunden + Benötigte Berechtigungen anfordern + Die App kann nicht auf deine Kontakte zugreifen + Die App hat nicht die Berechtigung, Telefonanrufe zu tätigen, bitte gewähre sie in den Geräteeinstellungen + Text hier einfügen + %s anrufen + Anruf bestätigen %s + Null + Eins + Zwei + Drei + Vier + Fünf + Sechs + Sieben + Acht + Neun + Wert + Wert darf nicht leer sein + Neuen Kontakt erstellen + Zu einem existierenden Kontakt hinzufügen + App beschädigt + Haftungsausschluss + Foto aufnehmen + Foto auswählen + Video auswählen + Kontakt auswählen + Datei auswählen + Audio aufnehmen + Video aufnehmen + Aktualisieren … + Gerätespeicher + Gerätespeicher (nicht sichtbar für andere Apps) + Audio + + Geburtstag + Jahrestag + + Privat + Arbeit + + Mobil + Festnetz + Arbeit Fax + Privat Fax + Pager + Es wurde keine Telefonnummer gefunden + + Darstellung ändern + Gitternetz + Gitternetz (Pro) + Ungleichmäßiges Raster + Liste + Kacheln verkleinern + Kacheln vergrößern + Spaltenanzahl + Anzahl der Spalten im Hochformat + Anzahl der Spalten im Querformat + Coverbild ändern + Auswählen + + %d Spalte + %d Spalten + + + Blockierte Nummern verwalten + Du blockierst niemanden. + Eine blockierte Nummer hinzufügen + Nummer blockieren + Nummern blockieren + Blockierte Nummern + Blockierte Nummern exportieren + Blockierte Nummern importieren + Du musst diese App als Standardtelefonie-App einstellen, um Nummern blockieren zu können. + Als Standard auswählen + „%s“ wirklich blockieren\? + Anrufe von nicht gespeicherten Kontakten blockieren + Nachrichten von nicht gespeicherten Kontakten blockieren + Gib eine Nummer oder ein Muster (z. B. *12345*, +1*8888) ein, um alle Anrufe und Nachrichten von Nummern zu blockieren, die dem Muster entsprechen. + Unbekannte Nummern können ohne Anrufer-ID-Berechtigung nicht blockiert werden. + + Favoriten + Favoriten hinzufügen + Zu Favoriten hinzufügen + Aus Favoriten entfernen + + Suchen + Suchen in %s + Du musst mindestens 2 Zeichen eingeben, um die Suche zu starten. + Kontakte durchsuchen + Favoriten durchsuchen + Apps durchsuchen + Ereignisse durchsuchen + Gruppen durchsuchen + Verlauf durchsuchen + Anrufe durchsuchen + Dateien durchsuchen + Ordner durchsuchen + Dateien und Ordner durchsuchen + Wiedergabelisten durchsuchen + Künstler durchsuchen + Alben durchsuchen + Lieder durchsuchen + Text durchsuchen + Unterhaltungen durchsuchen + Aufnahmen durchsuchen + + Filter + Filter (Pro) + Keine Elemente gefunden. + Filter ändern + + Speicherberechtigung wird benötigt + Kontaktberechtigung wird benötigt + Kameraberechtigung wird benötigt + Audioberechtigung wird benötigt + Keine Berechtigung + Der App die Anzeige von Benachrichtigungen erlauben, sonst kann sie keine Erinnerungen anzeigen. + Der App die Anzeige von Benachrichtigungen erlauben, sonst kann sie den Fortschrittsbalken nicht anzeigen. + Der App die Anzeige von Benachrichtigungen erlauben, sonst kann sie keine Lieder abspielen. + Der App die Anzeige von Benachrichtigungen erlauben, sonst kann sie keinen Ton aufnehmen. + Der App die Anzeige von Benachrichtigungen erlauben, sonst kann sie keine eingehenden Anrufe anzeigen. + Der App die Anzeige von Benachrichtigungen erlauben, sonst kann sie keine eingehenden Nachrichten anzeigen. + Berechtigung erteilen + Berechtigung erforderlich + + Datei umbenennen + Ordner umbenennen + Konnte die Datei nicht umbenennen + Konnte den Ordner nicht umbenennen + Ordnername darf nicht leer sein + Ein Ordner mit diesem Namen existiert bereits + Das Hauptverzeichnis des Speichers kann nicht umbenannt werden + Ordner erfolgreich umbenannt + Ordner umbenennen + Dateiname darf nicht leer sein + Dateiname enthält ungültige Zeichen + Dateiname ‚%s‘ enthält ungültige Zeichen + Dateiendung darf nicht leer sein + Quelldatei ‚%s‘ existiert nicht + Text dem Dateinamen voranstellen + Text dem Dateinamen anhängen + Einfaches Umbenennen + Muster + Anzufügender Text + %Y - Jahr +\n%M - Monat +\n%D - Tag +\n%h - Stunde +\n%m - Minute +\n%s - Sekunde +\n%i - Zähler, aufsteigend ab 1 + Dateiname (ohne .txt) + Dateiname (ohne .json) + Dateiname (ohne .zip) + Ab Android 11 kann man Dateien und Ordner nicht mehr auf diese Weise verstecken + + Kopieren + Verschieben + Kopieren / Verschieben + Kopieren nach + Verschieben nach + Quelle + Ziel + Ziel auswählen + Klicken um Ziel auszuwählen + Schreiben in ausgewählten Zielordner war nicht möglich + Bitte Ziel auswählen + Quell- und Zielpfad sind identisch + Die Dateien konnten nicht kopiert werden + Kopieren … + Datei(en) erfolgreich kopiert + Datei erfolgreich kopiert + Es ist ein Fehler aufgetreten + Verschieben … + Datei(en) erfolgreich verschoben + Datei erfolgreich verschoben + Einige Dateien konnten nicht verschoben werden + Einige Dateien konnten nicht kopiert werden + Keine Dateien ausgewählt + Speichern … + Ordner %s konnte nicht erstellt werden + Datei %s konnte nicht erstellt werden + Keine neuen Elemente gefunden + Der freie Platz im Zielverzeichnis ist nicht ausreichend.\nErforderlich: %1$s; Vorhanden: %2$s + Der Systemdienst zur Auswahl von Dateien und Ordnern ist nicht verfügbar + + Neuer Ordner + Ordner + Datei + Neuen Ordner erstellen + Ordner oder Datei mit diesem Namen existiert bereits + Der Name enthält unerlaubte Zeichen + Bitte einen Namen angeben + Ein unbekannter Fehler ist aufgetreten + + Datei \"%s\" existiert bereits + Datei \"%s\" existiert bereits. Überschreiben? + Ordner \"%s\" existiert bereits + Zusammenführen + Beide behalten + Überschreiben + Überspringen + \"_1\" anhängen + Bei allen Konflikten anwenden + Das System lässt den Vorgang in diesem Ordner nicht zu, bitte einen anderen Ordner wählen + Das System lässt das Kopieren in diesen Ordner nicht zu, bitte einen anderen Ordner wählen + Das System erlaubt keine Umbenennung in diesem Ordner + Ordner auf dem internen Speicher können nicht direkt umbenannt werden, nur Unterordner + Dieser Ordner kann nicht umbenannt werden + + Ordner auswählen + Datei auswählen + Bitte Zugriff auf externen Speicher bestätigen + Ordnerzugriff bestätigen + Bitte am nächsten Bildschirm das Hauptverzeichnis der SD-Karte auswählen, um Schreibzugriff zu erlauben + Wenn die SD-Karte nicht angezeigt wird, Folgendes versuchen + Bitte am unteren Rand des nächsten Bildschirms der App durch Drücken auf „Diesen Ordner verwenden“ den Zugriff auf den ausgewählten Speicher gewähren. + Bitte auf dem nächsten Bildschirm durch Drücken auf „Diesen Ordner verwenden“ am unteren Bildschirmrand den Zugriff auf „%s“ gewähren. + Bitte am unteren Rand des nächsten Bildschirms auf „Speichern“ drücken, um den neuen Ordner zu erstellen. + Auswahl bestätigen + Wird geladen … + Bitte unserer App Zugriff auf alle Dateien gewähren, da sie sonst möglicherweise nicht richtig funktioniert. + + %d Element + %d Elemente + + + + %d Element + %d Elemente + + + %d Element wird gelöscht + %d Elemente werden gelöscht + + + + %d Kontakt + %d Kontakte + + + Speicher auswählen + Speicherplatz + Intern + SD-Karte + Hauptverzeichnis + Falscher Ordner ausgewählt, bitte Hauptverzeichnis der SD-Karte auswählen + SD-Karten- und USB-Gerätepfad dürfen nicht identisch sein + Die App wurde anscheinend auf der SD-Karte installiert, daher sind die Widgets nicht verfügbar. Sie werden auch in der Liste der Widgets nicht angezeigt. + Dies ist systemseitig so beschränkt. Für die Verwendung der Widgets muss die App wieder im internen Speicher installiert werden. + Falscher Ordner ausgewählt, bitte Pfad „%s“ wählen + + Eigenschaften + Pfad + Ausgewählte Elemente + Enthaltene Elemente (direkt) + Enthaltene Dateien (gesamt) + Auflösung + Dauer + Künstler + Album + Brennweite + Belichtungszeit + Filmempfindlichkeit + Blendenzahl + Kamera + EXIF + Liedtitel + GPS Koordinaten + Höhe + EXIF Daten entfernen + Sollen wirklich alle EXIF-Daten, wie z. B. GPS Koordinaten oder Kameramodell, entfernt werden\? + EXIF Daten erfolgreich entfernt + + Hintergrundfarbe + Schriftfarbe + Primäre Farbe + Akzentfarbe des weißen Themas + Akzentfarbe des Schwarz-Weiß-Farbschemas + Vordergrundfarbe + Farbe des Anwendungssymbols + Farbe der unteren Navigationsleiste + Vorgabe wiederherstellen + Standard verwenden + Vorgabe + Farbe ändern + Thema + Ändern einer Farbe setzt das Thema auf \"Benutzerdefiniert\" + Speichern + Verwerfen + Änderungen verwerfen + Sollen wirklich alle Änderungen verworfen werden\? + Diese Aktion kann nicht rückgängig gemacht werden. + Du hast ungespeicherte Änderungen. Speichern vor dem Beenden? + Farben bei allen schlichten Apps anwenden + WARNUNG: Einige Launcher behandeln die Anpassung von App-Icons nicht richtig. Sollte das Icon verschwinden, versuche die App mit Google Play oder einem Widget (wenn verfügbar) zu starten. + Wenn die App gestartet ist, setze das Icon zurück auf das standardmäßige Orange #F57C00. Im schlimmsten Fall kann es passieren, dass du die App erneut installieren musst. + Farben erfolgreich aktualisiert. Ein neues Thema \"Shared\" wurde hinzugefügt, bitte verwende dieses, um für alle Apps die Farben zu ändern. + Bitte beachten, dass trotz Verwendung der Pro-Version der App aus technischen Gründen immer noch Simple Thank You benötigt wird, damit die Farbsynchronisation funktioniert. + + Simple Thank You um diese Funktion freizuschalten und die Entwicklung zu unterstützen. Danke! + ]]> + + + Hell + Dunkel + Auto + Auto hell / dunkel + Solarisiert + Dunkelrot + Weiß + Schwarz-Weiß + Benutzerdefiniert + Geteilt + Systemvorgabe + + Neue Funktionen + * Kleinere Verbesserungen werden nicht gelistet + + Löschen + Entfernen + Umbenennen + Teilen + Teilen via + Größe ändern + Alle auswählen + Text auswählen + Verstecken + Nicht verstecken + Ordner verstecken + Ordner nicht verstecken + Verstecktes temporär anzeigen + Verstecktes wieder verbergen + So viel Inhalt kann nicht auf einmal geteilt werden + Papierkorb leeren und deaktivieren + Rückgängig + Wiederholen + Drucken + Drucken (Pro) + Abkürzung + Verknüpfung erstellen + Verknüpfung erstellen (Pro) + Nummer zu Kontakt hinzufügen + Kontaktdetails anzeigen + Von SIM 1 anrufen + Von SIM 2 anrufen + Beschriftungen ein/aus + Nach oben verschieben + Nach unten verschieben + Element anheften + Element loslösen + SMS senden + E-Mail senden + Anrufen + Kontaktdetails + Kontakt hinzufügen + Bildschirmhintergründe + + Sortieren nach + Name + Größe + Änderungsdatum + Erstellungsdatum + Aufnahmedatum + Titel + Dateiname + Dateiendung + Zufällig + Zufällig sortieren + Aufsteigend + Absteigend + Nur auf diesen Ordner anwenden + Numerische Teile nach aktuellem Wert sortieren + Vorname + Zweiter Vorname + Nachname + Vollständiger Name + Benutzerdefiniertes Sortieren anwenden + Reihenfolge ändern + + Soll wirklich mit dem Löschen fortgefahren werden\? + %s wirklich löschen\? + %s löschen\? + + %s wirklich in den Papierkorb verschieben\? + + Soll dieses Element wirklich gelöscht werden? + Soll dieses Element wirklich in den Papierkorb verschoben werden? + Nicht erneut fragen (in dieser Sitzung) + Nicht mehr anzeigen + Ja + Nein + Vielleicht + + WARNUNG: %d Ordner soll gelöscht werden + WARNUNG: %d Ordner sollen gelöscht werden + + + PIN + PIN eingeben + Bitte eine PIN eingeben + Falsche PIN + PIN wiederholen + Muster + Muster zeichnen + Falsches Muster + Muster wiederholen + Biometrie + Fingerabdruck + Fingerabdruck hinzufügen + Bitte den Finger auf den Fingerabdrucksensor legen + Dialog zur biometrischen ID-Verifizierung öffnen + Authentifizieren + Authentifizierung fehlgeschlagen + Authentifizierung blockiert, bitte in Kürze erneut versuchen + Keine Fingerabdrücke registriert, bitte in den Geräteeinstellungen hinzufügen + Einstellungen öffnen + Muster/PIN erfolgreich gespeichert. Falls vergessen, muss die App neu installiert werden. + Schutz erfolgreich eingerichtet. Falls beim Zurücksetzen Probleme auftreten, bitte die App neu installieren. + Ordner sperren + Ordner sperren (Pro) + Ordner entsperren + Dieser Schutz ist nur innerhalb dieser App wirksam und kann keine systemweite Datenträgerverschlüsselung ersetzen. + + Gestern + Heute + Morgen + Jeden Tag + Jahr verstecken + Sekunden + Minuten + Stunden + Tage + Sek. + Min. + Std. + KW + + %d Sekunde + %d Sekunden + + + %d Minute + %d Minuten + + + %d Stunde + %d Stunden + + + %d Tag + %d Tage + + + %d Woche + %d Wochen + + + %d Monat + %d Monate + + + %d Jahr + %d Jahre + + + + %d Sekunde + %d Sekunden + + + %d Minute + %d Minuten + + + %d Stunde + %d Stunden + + + %d Tag + %d Tagen + + + %d Woche + %d Wochen + + + %d Monat + %d Monaten + + + %d Jahr + %d Jahren + + + + %d Sekunde vorher + %d Sekunden vorher + + + %d Minute vorher + %d Minuten vorher + + + %d Stunde vorher + %d Stunden vorher + + + %d Tag vorher + %d Tage vorher + + + %d Woche vorher + %d Wochen vorher + + + %d Monat vorher + %d Monate vorher + + + %d Jahr vorher + %d Jahre vorher + + + + %d Sekunde + %d Sekunden + + + %d Minute + %d Minuten + + + %d Stunde + %d Stunden + + + %d Tag + %d Tage + + + %d Woche + %d Wochen + + + %d Monat + %d Monate + + + %d Jahr + %d Jahre + + + Zeit bis Alarm:\n%s + Verbleibende Zeit bis Alarm ausgelöst wird:\n%s + Verbleibende Zeit: +\n%s + Bitte vergewissere dich, dass der Alarm zuverlässig funktioniert, bevor du dich auf ihn verlässt. Er könnte wegen Systemeinschränkungen, wie der Stromsparfunktion, fehlschlagen. + Bitte vergewissere dich, dass die Erinnerungen zuverlässig funktionieren, bevor du dich darauf verlässt. Überprüfe die Geräteakku- und Benachrichtigungseinstellungen, ob nichts die Erinnerungen sperrt oder die App im Hintergrund beendet. + Benachrichtigungen für diese App sind deaktiviert. Wechsle in die Systemeinstellungen und aktiviere sie. + + Wecker + Schlummern + Abstellen + Keine Erinnerung + Zu Beginn + Systemtöne + Deine Töne + Neuen Ton hinzufügen + Stumm + Tagsüber um hh:mm + Tagsüber am %02d:%02d + + Einstellungen + \"Simple Thank You\" App kaufen + Allgemein + Farbanpassung + Verbesserte Farbanpassung + Farben anpassen + Farben anpassen (Locked) + Gesperrt + Widget-Farben anpassen + Benachrichtigungen anpassen + Benachrichtigungston + App in Englisch verwenden + Sprache + Versteckte Elemente anzeigen + Schriftgröße + Klein + Mittel + Groß + Sehr groß + Versteckte Elemente mit Muster/PIN schützen + Gesamte App mit Passwort schützen + Mit Passwort vor Dateilöschung und -verschiebung schützen + Altes Änderungsdatum bei Dateioperationen behalten + Beim Scrollen mit dem Scrollbalken Infofenster anzeigen + Verhindern, dass das Gerät in den Ruhemodus wechselt, solange die App im Vordergrund läuft + Keinen Löschen-bestätigen-Dialog anzeigen + „Auffrischen“ durch Ziehen von der oberen Kante ermöglichen + 24-Stunden-Zählung verwenden + Datums- und Zeitformat ändern + Wochenanfang am Sonntag + Widgets + Immer dasselbe Schlummerintervall verwenden + Schlummerintervall + Bei Tastendruck vibrieren + Elemente in den Papierkorb verschieben statt löschen + Intervall zum Leeren des Papierkorbs + Papierkorb leeren + Porträtmodus erzwingen + Einstellungen exportieren + Einstellungen importieren + Einstellungen erfolgreich exportiert + Einstellungen erfolgreich importiert + Namen mit Nachnamen beginnen + Cache leeren + Bestätigungsdialog anzeigen, bevor ein Anruf durchgeführt wird + + Sichtbarkeit + Sicherheit + Scrollen + Dateioperationen + Papierkorb + Wird gespeichert + Beim Starten + Text + Migrieren + Qualität + Hauptbildschirm + Vorschaubilder + Listenansicht + + Ordner ausschließen + Ordner ausschließen + Ausgeschlossene Ordner + (ausgeschlossen) + Ausgeschlossene Ordner verwalten + Alle entfernen + Alle Ordner aus der Liste ausgeschlossener Ordner entfernen\? Die Ordner selbst werden dabei nicht gelöscht. + Ausgeschlossenes temporär anzeigen + Ausgeschlossenes wieder verbergen + + Anzuzeigende Tabs festlegen + Tab, der beim App-Start geöffnet werden soll + Kontakte + Favoriten + Anrufliste + Gruppen + Zuletzt verwendeter Tab + Dateien + Letzte Dateien + + Diese Datei wiederherstellen + Markierte Dateien wiederherstellen + Alle Dateien wiederherstellen + Papierkorb erfolgreich geleert + Dateien erfolgreich wiederhergestellt + Den Papierkorb wirklich leeren\? Die Dateien sind dann unwiederbringlich gelöscht. + Der Papierkorb ist leer + Das Verschieben von Papierkorbobjekten ist deaktiviert, bitte Wiederherstellen verwenden + Papierkorb anzeigen + Papierkorb verstecken + Papierkorb öffnen + Den Papierkorb überspringen, Dateien sofort löschen + + %d Element wird in den Papierkorb verschoben + %d Elemente werden in den Papierkorb verschoben + + + Importieren … + Exportieren … + Importieren erfolgreich + Exportieren erfolgreich + Importieren fehlgeschlagen + Exportieren fehlgeschlagen + Importieren einiger Einträge fehlgeschlagen + Exportieren einiger Einträge fehlgeschlagen + Keine Einträge zum Importieren gefunden + Es wurden keine neuen Einträge zum Importieren gefunden + Keine Einträge zum Exportieren gefunden + Sicherungen + Automatische Sicherungen aktivieren + Automatische Sicherungen verwalten + Du kannst die folgenden Muster verwenden, um deine Datei automatisch zu benennen: +\n +\n%Y – Jahr +\n%M – Monat +\n%D – Tag +\n%h – Stunde +\n%m – Minute +\n%s – Sekunde + + USB + Es sieht so aus, als hättest du ein USB-Gerät an dein Gerät angeschlossen. Du musst zusätzliche Berechtigungen gewähren, damit die Dateien korrekt angezeigt werden. + Bitte das Hauptverzeichnis des USB-Geräts auf der folgenden Seite wählen, um Zugriff zu gewähren + Falscher Ordner gewählt, bitte das Hauptverzeichnis des USB-Geräts wählen + + Januar + Februar + März + April + Mai + Juni + Juli + August + September + Oktober + November + Dezember + + Jan + Feb + Mär + Apr + Mai + Jun + Jul + Aug + Sep + Okt + Nov + Dez + + im Januar + im Februar + im März + im April + im Mai + im Juni + im Juli + im August + im September + im Oktober + im November + im Dezember + Montag + Dienstag + Mittwoch + Donnerstag + Freitag + Samstag + Sonntag + M + D + M + D + F + S + S + Mo + Di + Mi + Do + Fr + Sa + So + + Deine App-Version wird keine weiteren Aktualisierungen erhalten. Wechsle zur Pro-Version, um Fehlerkorrekturen, Verbesserungen und neue Funktionen zu erhalten. + Deine App-Version wird keine weiteren Aktualisierungen erhalten. Wechsle zur Pro-Version, um Fehlerkorrekturen, Verbesserungen und neue Funktionen zu erhalten, indem du hier tippst. + Sie ist gratis bis: %s. Wenn du sie bis dahin herunterlädst, darfst du sie für immer gratis nutzen. + Mehr Infos + Pro-Version installieren + Um lokal gespeicherte Termine zu migrieren, musst du sie als ics-Datei exportieren und anschließend importieren. Die beiden Schaltflächen befinden sich im Hauptmenü. + Hallo, +\n +\nes sieht so aus, als ob du gerade ein Upgrade von der kostenlosen Version durchgeführt hast. Wenn du mit ihr zufrieden bist und deine Einstellungen und Favoriten übertragen hast, kannst du die alte kostenlose Version deinstallieren, um zu vermeiden, dass sie versehentlich gestartet wird, da du sie nicht mehr benötigst. +\n +\nVielen Dank! + Hallo, +\n +\nes sieht so aus, als hättest du bereits die Pro-Version der App. Wenn du mit ihr zufrieden bist und deine Einstellungen und Favoriten übertragen hast, kannst du diese App deinstallieren, um zu vermeiden, dass sie versehentlich gestartet wird, da du sie nicht mehr benötigst. +\n +\nVielen Dank! + Hallo, +\n +\nes sieht so aus, als ob du gerade ein Upgrade von der kostenlosen Version durchgeführt hast. Wenn du mit ihr zufrieden bist und deine Daten migriert hast, kannst du die alte kostenlose Version deinstallieren, um zu vermeiden, dass sie versehentlich gestartet wird, da du sie nicht mehr benötigst. +\n +\nVielen Dank! + Hallo, +\n +\nes sieht so aus, als hättest du bereits die Pro-Version der App. Wenn du mit ihr zufrieden bist und deine Daten migriert hast, kannst du diese App deinstallieren, um zu vermeiden, dass sie versehentlich gestartet wird, da du sie nicht mehr benötigst. +\n +\nVielen Dank! + Hallo, +\n +\nes sieht so aus, als ob du gerade ein Upgrade von der kostenlosen Version durchgeführt hast. Wenn du deine lokal gespeicherten Termine migrieren möchtest, musst du dies manuell durchführen, indem du sie in der kostenlosen App-Version in eine .ics-Datei exportierst und hier über das obere Menü importierst. +\n +\nSobald du mit deiner Einrichtung in der Pro-Version zufrieden bist, kannst du die alte kostenlose Version deinstallieren, da du sie nicht mehr benötigst. +\n +\nVielen Dank! + Hallo, +\n +\nes sieht so aus, als ob du gerade ein Upgrade von der kostenlosen Version durchgeführt hast. Wenn du Kontakte unter \"%s\" gespeichert hast, musst du diese manuell migrieren, indem du sie in der kostenlosen App-Version in eine .vcf-Datei exportierst und hier über das obere Menü importierst. +\n +\nSobald du mit deiner Einrichtung in der Pro-Version zufrieden bist, kannst du die alte kostenlose Version deinstallieren, da du sie nicht mehr benötigst. +\n +\nVielen Dank! + Hallo, +\n +\nes sieht so aus, als ob du gerade ein Upgrade von der kostenlosen Version durchgeführt hast. Wenn du deine Notizen migrieren möchtest, musst du dies manuell durchführen, indem du sie in der kostenlosen App-Version in eine Datei exportierst und hier über das obere Menü importierst. +\n +\nSobald du mit deiner Einrichtung in der Pro-Version zufrieden bist, kannst du die alte kostenlose Version deinstallieren, da du sie nicht mehr benötigst. +\n +\nVielen Dank! + + Über + Website + Weitere schlichte Apps und Quellcode siehe + Vorschläge und Feedback bitte senden an + Upgrade auf Pro + Weitere Apps + Weitere Apps von uns + Freunde einladen + Hey, wirf mal einen Blick auf %1$s: %2$s + Einladen via + Bewerte uns im Play Store + Bewertung + Spenden + Folge uns + v %1$s\nCopyright © Simple Mobile Tools %2$d + Unterstützung + Hilf uns + Soziale Medien + Anderes + Datenschutzbestimmungen + Version %s + Hallo :) + Gemacht mit ❤️ in der Slowakei + Zusätzliche Infos + App-Version: %s + Betriebssystem: %s + Hallo!,<br><br> Ich hoffe, diese Anwendung gefällt dir. Sie beinhaltet keine Werbung, daher unterstütze bitte die Entwicklung durch den Kauf der <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> App. Dadurch wird auch dieser Dialog künftig nicht mehr angezeigt.<br><br> Vielen Dank! + Hallo,<br><br>wir hoffen, dass dir die App gefällt. Sie enthält keine Werbung und wir sammeln auch nicht deine Daten. Bitte unterstütze die Entwicklung der App, indem du <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Einfaches Dankeschön</a> kaufst. Du bekommst dann auch alle Funktionen der App, einschließlich der Farbanpassung, freigeschaltet.<br><br>Dankeschön! + Unterstütze uns, indem du <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Einfaches Dankeschön</a> kaufst. Damit werden auch alle Funktionen der App, einschließlich der Farbanpassung, freigeschaltet. + Kaufen + Simple Phone bestellen + Bitte Simple Thank You auf die neueste Version aktualisieren + Bevor du eine Frage stellst, überprüfe bitte die App-Einstellungen und lies dir die häufig gestellten Fragen (FAQ) durch. Vielleicht findest du dort eine Lösung. + Bevor du eine Bewertung abgibst, schaue bitte in die Einstellungen der Anwendung und lies dir die häufig gestellten Fragen (FAQ) durch. Vielleicht findest du dort eine Lösung. + Stelle bitte auch sicher, dass du die neuste Version der App benutzt. + Beachte bitte, dass diese App-Version nicht mehr weiterentwickelt wird. Hole dir die Pro-Version mit vielen Verbesserungen. + Bitte lesen + Häufige gestellte Fragen + Hallo, +\n +\nes sieht so aus, als würdest du diese Anwendung schon einige Zeit benutzen. Wir schätzen das sehr. +\n +\nWenn wir dich um einen Gefallen bitten können, bewerte uns bitte auf Google Play. Das würde uns wirklich sehr helfen. +\n +\nEgal wie du dich entscheidest, wirst du diese Nachricht nicht noch einmal bekommen. +\n +\nDanke! + Bewerte bitte unsere App :) + Danke + Das Widget ist gesperrt. +\nBitte zur Pro-Version wechseln, um es freizuschalten. + Diese Funktion ist gesperrt; bitte kaufe <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Schlichtes Dankeschön</a>, um die volle Anwendung freizuschalten.<br><br>Es ist eine einmalige Zahlung und wenn du nicht zufrieden bist, können wir das Geld zurückerstatten. + + Hey,<br><br> nur eine kleine Info zu einigen neu veröffentlichten Apps:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Du kannst sie durch Drücken auf den Namen herunterladen.<br><br> Danke + Einfacher App-Launcher + Schlichter Rechner + Schlichter Kalender + Einfache Kamera + Einfache Uhr + Schlichte Kontakte + Schlichtes Telefon + Schlichter Zeichner + Schlichtes Dateiverwaltungsprogramm + Schlichte Taschenlampe + Schlichte Galerie + Schlichte Tastatur + Einfacher Launcher + Schlichter Musikplayer + Schlichte Notizen + Schlichter SMS-Messenger + Einfaches Dankeschön + Einfaches Diktiergerät + App-Startprogramm + Rechner + Kalender + Kamera + Uhr + Kontakte + Wählscheibe + Zeichenblock + Dateimanager + Taschenlampe + Galerie + Tastatur + Startprogramm + Musikplayer + Notizblock + SMS-Messenger + Dankeschön + Sprachaufzeichnungsprogramm + Deine App-Version scheint beschädigt zu sein. Bitte lade dir <a href=%s>hier</a> die Originalversion herunter. + + Häufig gestellte Fragen + Bevor du eine Frage stellst, lies bitte zuerst die + Weshalb sehe ich das Widget dieser App nicht in der Liste der Widgets? + Wahrscheinlich, weil du die Anwendung auf die Speicherkarte verschoben hast. In diesem Fall werden durch eine Einschränkung von Android die Widgets dieser Anwendung ausgeblendet. Die einzige Lösung ist, die Anwendung über die Geräteeinstellungen wieder in den internen Speicher zu verschieben. + Ich will euch unterstützen, aber es ist mir nicht möglich, Geld zu spenden. Gibt es eine andere Möglichkeit\? + Ja, natürlich. Du kannst die Anwendungen bekannt machen oder lobende Kommentare und Bewertungen abgeben. Du kannst auch bei der Übersetzung der Apps in eine neue Sprache helfen oder einfach schon bestehende Übersetzungen verbessern. Den Leitfaden zum Übersetzen findest du auf <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>dieser Website</a> oder kontaktiere uns einfach unter <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>, wenn du Fragen hast. + Ich habe versehentlich einige Dateien gelöscht. Wie kann ich diese wiederherstellen? + Unglücklicherweise gar nicht. Dateien werden sofort nach dem Bestätigungsdialog gelöscht, da ein Papierkorb nicht vorhanden ist. + Ich mag die Farben des Widgets nicht. Kann ich sie ändern\? + Ja, wenn du ein Widget auf der Startseite ziehst, erscheint ein Konfigurationsmenü. In der linken unteren Ecke sind farbige Kästchen. Drücke auf sie und wähle eine neue Farbe. Außerdem kannst du den Regler nutzen, um den Alphaparameter (Transparenz) einzustellen. + Kann ich gelöschte Dateien wiederherstellen? + Wurden die Dateien endgültig gelöscht, sind sie verloren. Standardmäßig ist jedoch der Papierkorb aktiviert. Dateien werden dann in den Papierkorb verschoben anstatt gelöscht. + Von dort können die Dateien wiederhergestellt werden. + Das App-Icon im Launcher ist verschwunden. Was kann ich tun? + Das passiert, wenn dein Launcher das Anpassen von Anwendungssymbolen nicht richtig unterstützt. Versuche, die App über Google Play oder ein Widget (wenn verfügbar) zu starten. Wenn die App gestartet ist, setze das Icon zurück auf das standardmäßige Orange #F57C00. Im schlimmsten Fall kann es passieren, dass Du die App erneut installieren musst. + Der Betrag wurde von meinem Konto abgebucht, aber ich kann die App nicht herunterladen. Was kann ich machen? + Die Zahlungen werden durch Google gehandhabt. Dabei kommt es gelegentlich zu Verzögerungen. Leere den Cache der Google Play App, starte dein Gerät neu und versuche erneut, die App herunterzuladen. + Warum sollte ich auf die Pro-Version aufrüsten\? + Deine Anwendung wird keine weiteren Aktualisierungen erhalten. Bekannte und später gefundene Fehler werden nicht beseitigt werden. Es werden auch keine neuen Funktionen mehr hinzugefügt werden. Du kannst die Pro-Version auf Google Play für einen kleinen Betrag kaufen. Dies ist eine Einmalzahlung. Auch nach einem Gerätewechsel kannst du weiter die Pro-Version nutzen, ohne erneute dafür bezahlen zu müssen. Sollte dir die Pro Version nicht gefallen, kannst du sie einfach innerhalb einiger Stunden deinstallieren und wirst Dein Geld automatisch zurückerhalten. Möchtest du zu einem späteren Zeitpunkt dein Geld erstattet bekommen, dann kontaktiere uns einfach unter hello@simplemobiletools.com, und du wirst es erhalten. + Wie kann ich mehrere Elemente auf einmal auswählen? + Es gibt mehrere Möglichkeiten, dies zu tun. Die erste ist, den Auswahlmodus durch langes Drücken eines Elements zu starten und anschließend die anderen Elemente durch kurzes Antippen auszuwählen. Die zweite Möglichkeit ähnelt dem Auswählen von Elementen auf PCs mit einer Maus: Starte den Auswahlmodus durch langes Drücken eines Elements und streiche, ohne den Finger vom Display abzuheben, über die anderen Elemente, um sie auszuwählen. Die dritte Möglichkeit, mehrere Elemente auszuwählen, besteht darin, nacheinander zwei Elemente lange zu drücken und dadurch auch alles dazwischen auszuwählen. Wenn du alle Elemente auswählen möchtest, drücke einfach lange auf ein beliebiges Element und tippe dann auf den Zähler für ausgewählte Elemente in der oberen linken Ecke. Durch Antippen des Zählers wird alles aus- oder abgewählt. + Ich habe die App gekauft, kann sie aber nicht auf ein anderes Gerät herunterladen. + Leere den Cache deiner Google Play App und starte dein Gerät neu. Es handelt sich um eine Störung bei Google Play, die nicht wirklich mit der App selbst zusammenhängt. + + Beitragende + Übersetzung + Entwicklung + Other help + Diese Liste enthält alle Personen, die bei der Entwicklung von Simple Mobile-Werkzeuge geholfen haben, nicht nur bei dieser Anwendung. Die Übersetzungen werden von Freiwilligen erledigt, lass es uns wissen, wenn auch du helfen willst. Die Anleitung zum Übersetzen findest du auf <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>dieser Website</a> oder kontaktiere uns einfach unter <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>, wenn du Fragen hast. Vielen Dank allen Mitwirkenden und sonstigen Unterstützern! + Arabisch + Aserbaidschanisch + Bengali + Bretonisch + Bulgarian + Katalanisch + Tschechisch + Walisisch + Dänisch + English + Deutsch + Griechisch + Spanisch + Baskisch + Persisch + Finnisch + Französisch + Galizisch + Hindi + Kroatisch + Ungarisch + Indonesisch + Italienisch + Hebräisch + Japanisch + Koreanisch + Litauisch + Nepalesisch + Norwegisch + Niederländisch + Polnisch + Portugiesisch + Rumänisch + Russisch + Slowakisch + Slowenisch + Serbisch + Schwedisch + Tamilisch + Türkisch + Ukrainisch + Vietnamesisch + Chinesisch (Hongkong) + Chinesisch (vereinfacht) + Chinesisch (traditionell) + + Hol dir jetzt die Pro-Version! + Grundlegend + Pro + Keine Werbung + Kein Internetzugang + 100% Geld-zurück-Garantie + Einmalige Zahlung + Verbessertes Design + + Fortgeschrittener Fotoeditor + Fortgeschrittener Foto- und Videoeditor + HEIC/HEIF-Dateiunterstützung + Fortschrittliche Dateiumbenennung im Stapelverfahren + Individuelle Ordnersperre + Druckunterstützung + + Zeitzonen-Unterstützung + Teilnehmer und E-Mail-Erinnerungen + Einfaches Importieren von Ereignissen + Neue Widgets + + Verbesserte Zusammenführung doppelter Kontakte + Anpassung der Schriftgröße + Optionaler privater Kontaktaustausch innerhalb unserer Anwendungen + Anpassbare Kontaktklingeltöne + Kontaktfilterung + Privat gespeicherte Kontakte + + Checklisten + Unterschiedliche Notizen und Farben pro Widget + Sperren von Notizen + + Anpassung von Datums- und Zeitformat + Shortcuts für den Startbildschirm + Unterstützung für Dateikomprimierung + Tab mit den letzten Dateien + + Anpassung der Hintergrundfarbe + Unterstützung für den Dateiimport + Zoomen + + Diese Anwendung verwendet die folgenden Bibliotheken von Drittanbietern, um mir das Leben zu erleichtern. Vielen Dank dafür. + Drittanbieterlizenzen + Kotlin (Programmiersprache) + Subsampling Scale Image View (Zoombare Bilder) + Glide (Bilder laden und zwischenspeichern) + Picasso (Bilder laden und zwischenspeichern) + Android Image Cropper (Bilder zuschneiden und rotieren) + RtlViewPager (Rechts-Links-Wischen) + Joda-Time (Ersatz für Datums-Implementierung in Java) + Stetho (Datenbanken debuggen) + Otto (Event Bus) + PhotoView (Zoombare GIFs) + PatternLockView (Schutz mit Muster) + Reprint (Schutz mit Fingerabdruck) + Gif Drawable (Laden von GIFs) + AutoFitTextView (Textgröße ändern) + Robolectric (Test-Framework) + Espresso (Test-Hilfstool) + Gson (JSON-Parser) + Leak Canary (Memory-Leak-Detektor) + Number Picker (Konfigurierbarer Zahlenwähler) + ExoPlayer (Videoplayer) + VR Panorama View (Panoramabilder anzeigen) + Apache Sanselan (Bild-Metadaten lesen) + Android Photo Filters (Bilder filtern) + Gesture Views (Zoombare Bilder) + Indicator Fast Scroll (Buchstaben auf dem Scrollbalken) + Event Bus (Kommunikation innerhalb der App) + Audio Record View (Audiovisualisierung) + SMS MMS (SMS- und MMS-Handhabung) + APNG Android (animierte WebP-Unterstützung) + PDFViewPager (PDF-Betrachter) + M3U-Parser (Bearbeitung von m3u-Wiedergabelistendateien) + AndroidLame (mp3-Encoder) + + Testversion abgelaufen + Kostenlos testen + Deine Testversion läuft bald ab. + Die App für einen letzten Tag freischalten + Willkommen bei %s! + Vielen Dank, dass du unsere App benutzt. Du kannst diese freigeschaltete Version für %d Tage nutzen. Nach Ablauf der Testphase solltest du ein Upgrade auf die Pro-Version in Betracht ziehen. Diese hat eine große Anzahl neuer Funktionen, ein modernes Design, keine Werbung und viele andere Verbesserungen. +\n +\nDu musst nur einmal im Leben dafür bezahlen und wenn du nicht zufrieden bist, kannst du die App deinstallieren und eine Rückerstattung erhalten. +\n +\nIch hoffe, es gefällt dir :) + Bitte führe ein Upgrade auf die Pro-Version durch, um die App in vollem Umfang genießen zu können. +\n +\nDu musst nur einmal im Leben dafür bezahlen und wenn du nicht zufrieden bist, kannst du die App deinstallieren und eine Rückerstattung erhalten. +\n +\nWir sehen uns dort :) + + Deine Testversion läuft in %d Tag ab. + Deine Testversion läuft in %d Tagen ab. + + + Veraltet: Diese Version der App wird nicht länger unterstützt. Hole dir die Pro-Version unter https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Vergiss nicht, dass dir der Betrag erstattet wird, wenn du eine bezahlte App innerhalb von zwei Stunden wieder deinstallierst. Falls du später eine Rückerstattung wünschst, kontaktiere uns einfach unter hello@simplemobiletools.com, und du wirst sie bekommen. So kann man ganz einfach die App ausprobieren :) + + Eine Gruppe von einfachen, quelloffenen Android-Apps mit anpassbaren Widgets, ohne Werbung und unnötige Berechtigungen. + \ No newline at end of file diff --git a/commons/src/main/res/values-el/strings.xml b/commons/src/main/res/values-el/strings.xml new file mode 100644 index 000000000..46487dd72 --- /dev/null +++ b/commons/src/main/res/values-el/strings.xml @@ -0,0 +1,1093 @@ + + + OK + Ακύρωση + Πίσω + Τίποτα + Αργότερα + Αποθήκευση ως + Αποθηκεύθηκε επιτυχώς + Μη έγκυρη μορφή αρχείου + Σφάλμα Έλλειψη μνήμης + Παρουσιάστηκε σφάλμα: %s + Σφάλμα: %s + Άνοιγμα με + Επεξεργασία με + Επεξεργασία + Δεν βρέθηκε έγκυρη εφαρμογή + Δεν βρέθηκε φυλλομετρητής + Δεν βρέθηκε client email + Ορισμός ως + Αντιγραφή στο Πρόχειρο + Αντιγραφή αριθμού στο Πρόχειρο + Η τιμή αντιγράφηκε στο πρόχειρο + Η τιμή αντιγράφηκε στο πρόχειρο:\n%s + Κλήση αριθμού + Άγνωστο + Πάντα + Ποτέ + Λεπτομέρειες + Σημειώσεις + Διαγραφή φακέλου \'%s\' + Χωρίς + Ετικέτα + Διαφάνεια + Χρώμα διαφάνειας + Επιλέξτε διαφορετικό χρώμα + Λήψη + Ειδοποίηση + Ειδοποιήσεις + Email + Προηγούμενο + Αναπαραγωγή / Παύση + Επόμενο + Αριθμός + Δεν βρέθηκαν Επαφές + Ζητούνται οι απαιτούμενες Άδειες + Η εφαρμογή δεν έχει πρόσβαση στις επαφές σας + Η εφαρμογή δεν έχει άδεια πραγματοποίησης τηλεφωνικών κλήσεων, παρακαλούμε παραχωρήσετε την στις ρυθμίσεις της συσκευής. + Εισαγωγή κειμένου εδώ + Κλήση %s + Επιβεβαίωση κλήσης %s + Μηδέν + Ένα + Δύο + Τρία + Τέσσερα + Πέντε + Έξι + Επτά + Οκτώ + Εννέα + Value + Η τιμή δεν μπορεί να είναι κενή + Δημιουργία νέας Επαφής + Προσθήκη σε μια υπάρχουσα Επαφή + Κατεστραμμένη Εφαρμογή + Αποποίηση ευθύνης + Λήψη φωτογραφίας + Επιλογή φωτογραφίας + Επιλογή βίντεο + Επιλογή επαφής + Επιλογή αρχείου + Εγγραφή ήχου + Εγγραφή βίντεο + Ενημέρωση… + Αποθηκευτικός χώρος Τηλεφώνου + Ο Αποθηκευτικός χώρος του τηλεφώνου (δεν είναι ορατός από άλλες εφαρμογές) + Ήχος + + + Γενέθλια + Επέτειος + + Οικία + Εργασία + + Κινητό + Κύριο + Φαξ Εργασίας + Φαξ Οικίας + Βομβητής + Δεν βρέθηκε τηλεφωνικός αριθμός + + Αλλαγή τύπου εμφάνισης + Πλέγμα + Πλέγμα (Pro) + Ανισομερές πλέγμα + Λίστα + Αύξηση αριθμού στηλών + Μείωση αριθμού στηλών + Αρίθμηση στηλών + Αρίθμηση στηλών πορτρέτου + Αρίθμηση στηλών τοπίου + Αλλαγή εξώφυλλου φακέλου + Επιλογή φωτογραφίας + + %d στήλη + %d στήλες + + + Διαχείριση αποκλεισμένων αριθμών + Χωρίς αποκλεισμο κανενός. + Προσθήκη ένος αποκλεισμένου αριθμού + Αποκλεισμός αριθμού + Αποκλεισμός αριθμών + Αποκλεισμένοι αριθμοί + Εξαγωγή αποκλεισμένων αριθμών + Εισαγωγή αποκλεισμένων αριθμών + Θα πρέπει να οριστεί προεπιλεγμένη εφαρμογή για χρήση αποκλεισμένων αριθμών. + Ορισμός ως προεπιλογής + Σίγουρα να αποκλειστεί ο \"%s\"? + Αποκλεισμός κλήσεων από μη αποθηκευμένες επαφές + Αποκλεισμός μηνυμάτων από μη αποθηκευμένες επαφές + Εισάγετε έναν αριθμό ή ένα μοτίβο (π.χ. *12345*, +1*8888) για να μπλοκάρετε όλες τις κλήσεις και τα μηνύματα από αριθμούς που αντιστοιχούν στο μοτίβο. + Αδύνατη η φραγή αγνώστων αριθμών χωρίς άδεια ID κλήσεων. + + Αγαπημένα + Προσθήκη αγαπημένων + Προσθήκη στα αγαπημένα + Αφαίρεση απο τα αγαπημένα + + Αναζήτηση + Αναζήτηση σε %s + Πληκτρολογήστε τουλάχιστον 2 χαρακτήρες για να ξεκινήσετε την αναζήτηση. + Αναζήτηση επαφών + Αναζήτηση αγαπημένων + Αναζήτηση εφαρμογών + Αναζήτηση συμβάντων + Αναζήτηση ομάδων + Αναζήτηση ιστορικού + Αναζήτηση κλήσεων + Αναζήτηση αρχείων + Αναζήτηση φακέλων + Αναζήτηση αρχείων και φακέλων + Αναζήτηση λίστες αναπαραγωγής + Αναζήτηση καλλιτεχνών + Αναζήτηση άλμπουμ + Αναζήτηση τραγουδιών + Αναζήτηση κειμένου + Αναζήτηση συνομιλιών + Αναζήτηση ηχογραφήσεων + + Φίλτρο + Φίλτρο (Pro) + Δεν βρέθηκαν στοιχεία. + Αλλαγή φίλτρου + + Απαιτείται άδεια Αποθήκευσης + Απαιτείται άδεια Επαφών + Απαιτείται άδεια Κάμερας + Απαιτείται άδεια Ήχου + Χωρίς άδεια + Πρέπει να επιτρέψετε στην εφαρμογή να εμφανίζει ειδοποιήσεις, διαφορετικά δεν μπορεί να εμφανίσει υπενθυμίσεις. + Πρέπει να επιτρέψετε στην εφαρμογή να εμφανίζει ειδοποιήσεις, διαφορετικά δεν μπορεί να εμφανίσει τη γραμμή προόδου.. + Πρέπει να επιτρέψετε στην εφαρμογή να εμφανίζει ειδοποιήσεις, διαφορετικά δεν μπορεί να αναπαράγει τραγούδια.. + Πρέπει να επιτρέψετε στην εφαρμογή να εμφανίζει ειδοποιήσεις, διαφορετικά δεν μπορεί να καταγράψει ήχο. + Πρέπει να επιτρέψετε στην εφαρμογή να εμφανίζει ειδοποιήσεις, διαφορετικά δεν μπορεί να εμφανίσει τις εισερχόμενες κλήσεις. + Πρέπει να επιτρέψετε στην εφαρμογή να εμφανίζει ειδοποιήσεις, διαφορετικά δεν μπορεί να εμφανίσει τα εισερχόμενα μηνύματα. + Χορήγηση άδειας + Απαιτείται άδεια + + Μετονομασία αρχείου + Μετονομασία φακέλου + Αδύνατη η μετονομασία του αρχείου + Αδύνατη η μετονομασία του φακέλου + Το όνομα του φακέλου δεν πρέπει να είναι κενό + Ένας φάκελος με αυτό το όνομα υπάρχει ήδη + Αδύνατη η μετονομασία του ριζικού φακέλου ενός χώρου αποθήκευσης + Ο φάκελος μετονομάστηκε με επιτυχία + Μετονομασία φακέλου + Το όνομα αρχείου δεν μπορεί να είναι κενό + Το όνομα περιέχει μη έγκυρους χαρακτήρες + Το όνομα \'%s\' περιέχει μη έγκυρους χαρακτήρες + Η επέκταση δεν μπορεί να είναι κενή + To αρχείο προέλευσης %s δεν υπάρχει + Προεπιλεγμένα ονόματα αρχείων + Προσθέστε ονόματα αρχείων + Απλή μετονομασία + Μοτίβο + Συμβολοσειρά για προσθήκη + %Y - έτος\n%M - μήνας\n%D - ημέρα\n%h - ώρα\n%m - λεπτό\n%s - δευτ/το\n%i - αύξηση αριθμού από 1 + Όνομα αρχείου (χωρίς .txt) + Όνομα αρχείου (χωρίς .json) + Όνομα αρχείου (χωρίς .zip) + Ξεκινώντας από το Android 11 δεν μπορείτε πλέον να αποκρύπτετε αρχεία και φακέλους με αυτόν τον τρόπο + + Αντιγραφή + Μετακίνηση + Αντιγραφή / Μετακίνηση + Αντιγραφή σε + Μετακίνηση σε + Προέλευση + Προορισμός + Επιλογή προορισμού + Κάντε κλικ εδώ για να επιλέξετε προορισμό + Αδύνατη η εγγραφή στον επιλεγμένο προορισμό + Επιλέξτε έναν προορισμό + Η προέλευση και ο προορισμός δεν μπορούν να είναι ίδιες + Αδύνατη η αντιγραφή των αρχείων + Αντιγράφονται… + Τα αρχεία αντιγράφηκαν με επιτυχία + Το αρχείο αντιγράφηκε με επιτυχία + Ένα σφάλμα παρουσιάστηκε + Μετακινούνται… + Τα αρχεία μετακινήθηκαν με επιτυχία + Το αρχείο μετακινήθηκε με επιτυχία + Αδύνατη η μετακίνηση ορισμένων αρχείων + Αδύνατη η αντιγραφή ορισμένων αρχείων + Δεν έχουν επιλεγεί αρχεία + Αποθηκεύεται… + Αδύνατη η δημιουργία του φακέλου %s + Αδύνατη η δημιουργία του αρχείου %s + Δεν βρέθηκαν νέα στοιχεία + Ο προορισμός που επιλέξατε δεν διαθέτει τον απαιτούμενο χώρο.\nΑπαιτείται %1$s, διαθέσιμα %2$s + Η υπηρεσία Συστήματος για την επιλογή αρχείων και φακέλων δεν είναι διαθέσιμη + + Δημιουργία νέου + Φάκελος + Αρχείο + Δημιουργία νέου φακέλου + Ένα αρχείο ή φάκελος με αυτό το όνομα υπάρχει ήδη + Το όνομα περιέχει μη αποδεκτούς χαρακτήρες + Παρακαλώ εισάγετε ένα όνομα + Παρουσιάστηκε άγνωστο σφάλμα + + Το αρχείο \"%s\" υπάρχει ήδη + Το αρχείο \"%s\" υπάρχει ήδη. Αντικατάσταση? + Ο φάκελος \"%s\" υπάρχει ήδη + Συγχώνευση + Κρατήστε και τα δύο + Αντικατάσταση + Παράβλεψη + Προσάρτηση με \'_1\' + Εφαρμογή σε όλα + Το Σύστημα δεν επιτρέπει τη λειτουργία σε αυτόν το φάκελο, παρακαλούμε επιλέξτε έναν άλλο φάκελο + Το Σύστημα δεν επιτρέπει την αντιγραφή σε αυτόν τον φάκελο, παρακαλώ επιλέξτε έναν άλλο φάκελο + Το Σύστημα δεν επιτρέπει μετονομασία σε αυτόν το φάκελο + Αδύνατη η μετονομασία φακέλων απευθείας στον εσωτερικό χώρο αποθήκευσης, μόνο σε υποφακέλους + Αδύνατη η μετονομασία αυτού του φακέλου + + Επιλογή φακέλου + Επιλογή αρχείου + Επιβεβαίωση πρόσβασης στην Εξωτερική αποθήκευση + Επιβεβαίωση πρόσβασης φακέλου + Επιλέξτε τον ριζικό φάκελο της κάρτας SD στην επόμενη οθόνη, για να επιτρέψετε πρόσβαση εγγραφής + Εάν δεν βλέπετε την κάρτα SD, δοκιμάστε αυτό + Επιτρέψτε στην εφαρμογή την πρόσβαση στον επιλεγμένο αποθηκευτικό χώρο στην επόμενη οθόνη πατώντας \'Χρήση αυτού του φακέλου\' στο κάτω μέρος. + Επιτρέψτε την πρόσβαση σε \'<b>%s</b>\' στην επόμενη οθόνη πατώντας \'<b>Χρήση αυτού του φακέλου</b>\' στο κάτω μέρος. + Παρακαλώ πατήστε \'<b>Αποθήκευση</b>\' στο κάτω μέρος της επόμενης οθόνης για να δημιουργήσετε το Νέο φάκελο. + Επιβεβαίωση επιλογής + Φόρτωση… + Παρακαλώ παραχωρήστε την πρόσβαση σε όλα τα αρχεία σας, γιατί χωρίς αυτή μπορεί να μην λειτουργεί σωστά. + + %d στοιχείο + %d στοιχεία + + + + %d στοιχείο + %d στοιχεία + + + Διαγραφή %d στοιχείο + Διαγραφή %d στοιχεία + + + + %d επαφή + %d επαφές + + + Επιλέξτε αποθήκευση + Αποθήκευση + Εσωτερική + Κάρτα SD + Root + Επιλέξατε λάθος φάκελο, επιλέξτε τον ριζικό φάκελο της SD card + Οι διαδρομές συσκευών SD card και USB δεν μπορούν να είναι οι ίδιες + Φαίνεται ότι έχετε εγκαταστήσει την εφαρμογή σε μια κάρτα SD, πράγμα που καθιστά τα Γραφικά στοιχεία εφαρμογών μη διαθέσιμα. Δεν θα τα δείτε ακόμη και στη λίστα των διαθέσιμων Γραφικών στοιχείων. + Είναι ένας περιορισμός του συστήματος, οπότε αν θέλετε να χρησιμοποιήσετε τα Γραφικά στοιχεία, θα πρέπει να μετακινήσετε την εφαρμογή πίσω στον εσωτερικό αποθηκευτικό χώρο. + Επιλέξατε λάθος φάκελο, επιλέξτε τη διαδρομή \'%s\' + + Ιδιότητες + Διαδρομή + Επιλεγμένα στοιχεία + Άμμεση καταμέτρηση παιδιών + Αριθμός συνολικών αρχείων + Ανάλυση + Διάρκεια + Καλλιτέχνης + Αλμπουμ + Εστιακό μήκος + Χρόνος έκθεσης + Ταχύτητα ISO + F-αριθμός + Κάμερα + EXIF + Τίτλος τραγουδιού + Συντεταγμένες GPS + Υψόμετρο + Αφαίρεση EXIF + Σίγουρα θέλετε να αφαιρέσετε τις τιμές EXIF, όπως συντεταγμένες GPS, μοντέλο φωτογραφικής μηχανής κ.λ.π.? + Οι τιμές EXIF αφαιρέθηκαν επιτυχώς + + Χρώμα φόντου + Χρώμα κειμένου + Πρωτεύον χρώμα + Χρώμα έμφασης Λευκού θέματος + Χρώμα έμφασης Μαύρου & Λευκού θέματος + Χρώμα προσκηνίου + Χρώμα εικονιδίου εφαρμογής + Χρώμα κάτω γραμμής Πλοήγησης + Επαναφορά προεπιλογών + Χρήση προεπιλογής + Προεπιλογή + Αλλαγή χρώματος + Θέμα + Η αλλαγή ενός χρώματος θα αλλάξει το Προεπιλεγμένο θέμα + Αποθήκευση + Απόρριψη + Αναίρεση αλλαγών + Είστε βέβαιοι ότι θέλετε να αναιρέσετε τις αλλαγές σας? + Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. + Έχετε αλλαγές που δεν έχουν αποθηκευτεί. Αποθήκευση πριν από την έξοδο? + Εφαρμογή χρωμάτων σε όλες τις Απλές Εφαρμογές + ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Ορισμένοι Εκκινητές δεν χειρίζονται σωστά τα εικονίδια της εφαρμογής. Σε περίπτωση που το εικονίδιο εξαφανιστεί, δοκιμάστε να ξεκινήσετε την εφαρμογή μέσω του Google Play ή κάποιου Witget, αν είναι διαθέσιμο. + Μόλις ξεκινήσει, απλά επαναφέρετε το προεπιλεγμένο πορτοκαλί εικονίδιο #F57C00. Μπορεί να χρειαστεί να επανεγκαταστήσετε την εφαρμογή στη χειρότερη περίπτωση. + Τα χρώματα ενημερώθηκαν με επιτυχία. Ένα νέο θέμα που ονομάζεται \"Κοινόχρηστο\" έχει προστεθεί, παρακαλούμε να χρησιμοποιήστε το για την ενημέρωση των χρωμάτων όλων των εφαρμ. στο μέλλον. + Σημειώστε ότι αν και χρησιμοποιείτε την έκδοση εφαρμογής Pro, εξακολουθείτε να χρειάζεστε το \"Απλά Σας Ευχαριστώ\" για τεχνικούς λόγους. Φροντίζει για το συγχρονισμό χρωμάτων. + + Απλά Σας Ευχαριστώ για να ξεκλειδώσετε αυτή τη λειτουργία για να υποστηρίξετε την ανάπτυξη. Ευχαριστώ! + ]]> + + + Φωτεινό + Σκοτεινό + Αυτόματο + Αυτόματο Φωτεινό / Σκοτεινό + Solarized + Σκούρο Κόκκινο + Άσπρο + Μαύρο & Άσπρο + Προσαρμογή + Κοινόχρηστο + Προεπιλογή Συστήματος + + Τι νέο υπάρχει + * μόνο οι μεγαλύτερες ενημερώσεις παρατίθενται εδώ, επίσης υπάρχουν πάντα μερικές μικρότερες βελτιώσεις + + Διαγραφή + Αφαίρεση + Μετονομασία + Κοινοποίηση + Κοινοποίηση μέσω + Αλλαγή μεγέθους + Επιλογή όλων + Επιλογή κειμένου + Απόκρυψη + Επανεμφάνιση + Απόκρυψη φακέλου + Επανεμφάνιση φακέλου + Προσωρινή εμφάνιση κρυφών + Απόκρυψη κρυφών πολυμέσων + Δεν μπορείτε να κοινοποιήσετε τόσο μεγάλο περιεχόμενο ταυτόχρονα + Άδειασμα και απενεργοποίηση του Κάδου Ανακύκλωσης + Αναίρεση + Επανάληψη + Εκτύπωση + Εκτύπωση (Pro) + Συντόμευση + Δημιουργία συντόμευσης + Δημιουργία συντόμευσης (Pro) + Προσθήκη αριθμού στις επαφές + Προβολή λεπτομερειών επαφής + Κλήση απο SIM 1 + Κλήση απο SIM 2 + Αλλαγή προβολής ονόματος αρχείων + Μετακίνηση στην κορυφή + Μετακίνηση στο τέλος + Καρφίτσωμα στοιχείου + Ξεκαρφίτσωμα στοιχείου + Αποστολή SMS + Αποστολή email + Κλήση + Στοιχεία επαφής + Προσθήκη επαφής + Ταπετσαρίες + + Ταξινόμηση κατά + Όνομα + Μέγεθος + Τελευταία τροπ/ηση + Ημερ. δημιουργίας + Ημερ. λήψης + Τίτλο + Όνομα αρχείου + Επέκταση + Τυχαία + Τυχαία ταξ/μηση + Αύξουσα + Φθίνουσα + Χρήση μόνο σε αυτόν το φάκελο + Αριθμητ. τμήμ. κατά πραγμ. τιμή + Όνομα + Μεσαίο όνομα + Επώνυμο + Πλήρες όνομα + Προσαρ/μένη ταξ/μηση + Αλλαγή σειράς + + Είστε βέβαιοι ότι θέλετε να συνεχίσετε τη διαγραφή? + Είστε βέβαιοι ότι θέλετε να διαγράψετε %s? + Διαγραφή %s; + + Είστε βέβαιοι ότι θέλετε να μετακινήσετε %s στον κάδο ανακύκλωσης? + + Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το στοιχείο? + Είστε βέβαιοι ότι θέλετε να μετακινήσετε αυτό το στοιχείο στον κάδο ανακύκλωσης? + Μην ξαναερωτηθώ αυτήν την περίοδο + Χωρίς επανεμφάνιση + Ναί + Όχι + Ίσως + + Προειδοποίηση: Διαγράφετε %d φάκελο + Προειδοποίηση: Διαγράφετε %d φακέλους + + + PIN + Εισαγωγή PIN + Παρακαλώ εισάγετε ένα PIN + Λάθος PIN + Επανάληψη PIN + Μοτίβο + Εισαγωγή μοτίβου + Λάθος μοτίβο + Επανάληψη μοτίβου + Βιομετρικά + Δακτυλικό αποτύπωμα + Προσθήκη δακτυλικού αποτυπώματος + Παρακαλώ τοποθετήστε το δάκτυλό σας στον αισθητήρα δακτυλικών αποτυπωμάτων + Άνοιγμα διαλόγου βιομετρικής πιστοποίησης ID + Πιστοποίηση + Ο έλεγχος ταυτότητας απέτυχε + Αποκλεισμός ελέγχου ταυτότητας, προσπαθήστε ξανά σε λίγο + Δεν έχετε καταχωρήσει δακτυλικά αποτυπώματα, προσθέστε μερικά στις Ρυθμίσεις της συσκευής σας + Μετάβαση στις Ρυθμίσεις + Ο κωδικός πρόσβασης ολοκληρώθηκε με επιτυχία. Εγκαταστήστε ξανά την εφαρμογή σε περίπτωση που τον ξεχάσετε. + Η ρύθμιση προστασίας ολοκληρώθηκε με επιτυχία. Εγκαταστήστε ξανά την εφαρμογή σε περίπτωση προβλημάτων με την επαναφορά της. + Κλείδωμα Φακέλου + Κλείδωμα Φακέλου (Pro) + Ξεκλείδωμα Φακέλου + Αυτή η προστασία λειτουργεί μόνο για αυτήν την εφαρμογή, δεν πρόκειται να αντικαταστήσει την πραγματική κρυπτογράφηση του Συστήματος. + + Χθές + Σήμερα + Αύριο + Καθημερινά + Απόκρυψη χρόνου + δευτερόλεπτα + λεπτά + ώρες + ημερ. + δ + λ + ω + εβδ. + + %d δευτ. + %d δευτ. + + + %d λεπτό + %d λεπτά + + + %d ώρα + %d ώρες + + + %d ημέρα + %d ημέρες + + + %d εβδομάδα + %d εβδομάδες + + + %d μήνα + %d μήνες + + + %d χρόνο + %d χρόνια + + + + σε %d δευτ. + σε %d δευτ. + + + σε %d λεπτό + σε %d λεπτά + + + σε %d ώρα + σε %d ώρες + + + %d ημέρα + %d ημέρες + + + %d εβδομάδα + %d εβδομάδες + + + %d μήνας + %d μήνες + + + %d έτος + %d έτη + + + + πρίν %d δευτ. + πρίν %d δευτ. + + + πρίν %d λεπτό + πρίν %d λεπτά + + + πρίν %d ώρα + πρίν %d ώρες + + + πρίν %d ημέρα + πρίν %d ημέρες + + + πρίν %d εβδομάδα + πρίν %d εβδομάδες + + + πρίν %d μήνα + πρίν %d μήνες + + + πρίν %d έτος + πρίν %d έτη + + + + αναβολή %d δευτ. + αναβολή %d δευτ. + + + αναβολή %d λεπτό + αναβολή %d λεπτά + + + αναβολή %d ώρα + αναβολή %d ώρες + + + %d ημέρα + %d ημέρες + + + %d εβδομάδα + %d εβδομάδες + + + %d μήνα + %d μήνες + + + %d έτος + %d έτη + + + Χρόνος που απομένει μέχρι να κλείσει η ειδοποίηση:\n%s + Χρόνος που απομένει μέχρι να ενεργοποιηθεί η υπενθύμιση:\n%s + Απομένει:\n%s + Βεβαιωθείτε ότι η ειδοποίηση λειτουργεί σωστά πριν βασιστείτε σε αυτήν. Θα μπορούσε να αποτύχει λόγω των περιορισμών του συστήματος που σχετίζονται με την εξοικονόμηση μπαταρίας. + Βεβαιωθείτε ότι η υπενθύμιση λειτουργεί σωστά πριν βασιστείτε σε αυτήν. Θα μπορούσε να αποτύχει λόγω των περιορισμών του συστήματος που σχετίζονται με την εξοικονόμηση μπαταρίας. + Οι ειδοποιήσεις αυτής της εφαρμογής είναι απενεργοποιημένες. Μεταβείτε στις ρυθμίσεις της συσκευής για να τις ενεργοποιήσετε. + + Ειδοποιήσεις + Αναβολή + Απόρριψη + Χωρίς υπενθύμιση + Κατά την έναρξη + Ήχοι συστήματος + Οι ήχοι σας + Προσθέστε νέο ήχο + Χωρίς ήχο + Κατά τη διάρκεια της ημέρας στις hh:mm + Κατά τη διάρκεια της ημέρας στις %02d:%02d + + Ρυθμίσεις + Αγοράστε το \"Απλά Σας ευχαριστώ\" + Γενικά + Προσαρμογή χρώματος + Βελτιωμένη προσαρμογή χρώματος + Προσαρμογή χρωμάτων + Προσαρμογή χρωμάτων (Κλειδωμένο) + Κλειδωμένο + Προσαρμογή χρωμάτων widget + Προσαρμογή ειδοποιήσεων + Ήχος ειδοποίησης + Χρήση γλώσσας English + Γλώσσα + Εμφάνιση κρυφών στοιχείων + Μέγεθος κειμένου + Μικρό + Μεσαίο + Μεγάλο + Τεράστιο + Κωδικός προστασίας προβολής κρυφών στοιχείων + Κωδικός προστασίας ολόκληρης της εφαρμογής + Προστασία με κωδικό για διαγραφή ή μετακίνηση + Διατήρηση προηγ/νης τροπ/μένης τιμής στις λειτουργίες αρχείων + Εμφάνιση φυσαλίδας πληροφοριών κατά την κύλιση στοιχείων στη γραμμή κύλισης + Αποτροπή της αναστολής λειτουργίας του τηλεφώνου ενώ η εφαρμογή βρίσκεται στο προσκήνιο + Παράκαμψη πάντα το παράθυρο διαλόγου επιβεβαίωσης διαγραφής + Ενεργοποίηση ανανέωσης με \"Σάρωση απο πάνω-κάτω\" + Χρήση 24ώρου + Αλλαγή μορφής ημερομηνίας και ώρας + Έναρξη εβδομάδας την Κυριακή + Γραφικά στοιχεία + Χρήση πάντα του ίδιου χρόνου αναβολής + Χρόνος αναβολής + Δόνηση κατά το πάτημα του κουμπιού + Μετακινήστε τα αντικείμενα στον Κάδο Ανακύκλωσης αντί για διαγραφή + Περίοδος καθαρισμού Κάδου ανακύκλωσης + Άδειασμα του Κάδου Ανακύκλωσης + Εξαναγκασμός σε Πορτρέτο + Εξαγωγή ρυθμίσεων + Εισαγωγή ρυθμίσεων + Επιτυχής εξαγωγή ρυθμίσεων + Επιτυχής εισαγωγή ρυθμίσεων + Εμφάνιση πρώτα του επώνυμου + Καθαρισμός cache + Εμφάνιση διαλόγου επιβεβαίωσης πριν από την έναρξη μιας κλήσης + + Προβολή + Ασφάλεια + Κύλιση + Λειτουργίες αρχείων + Κάδος Ανακύκλωσης + Εξοικονόμηση + Εκκίνηση + Κείμενο + Μετεγκατάσταση + Ποιότητα + Αρχική οθόνη + Μικρογραφίες + Προβολή Λίστας + + Εξαίρεση + Εξαίρεση φακέλου + Εξαίρεση φακέλων + (εξαιρούνται) + Διαχείριση εξαιρεμένων φακέλων + Διαγραφή όλων + Να αφαιρεθούν όλοι οι φάκελοι από την λίστα των εξαιρεμένων; Αυτό δεν θα διαγράψει τους φακέλους. + Προσωρινή εμφάνιση αποκλεισμένων + Παύση εμφάνισης αποκλεισμένων + + Διαχείριση εμφανιζόμενων καρτελών + Άνοιγμα καρτέλας κατά την έναρξη της εφαρμογής + Επαφές + Αγαπημένες + Ιστορικό κλήσεων + Ομάδες + Τελευταία χρήση + Αρχεία + Πρόσφατα αρχεία + + Επαναφορά αυτού του αρχείου + Επαναφορά επιλεγμένων αρχείων + Επαναφορά όλων των αρχείων + Ο Κάδος Ανακύκλωσης άδειασε επιτυχώς + Τα αρχεία επαναφέρθηκαν επιτυχώς + Σίγουρα θέλετε να αδειάσετε τον Κάδο Ανακύκλωσης; Τα αρχεία θα χαθούν οριστικά. + Ο Κάδος Ανακύκλωσης είναι άδειος + Η μετακίνηση στον Κάδο είναι ανενεργή, χρησιμοποιείστε την Επαναφορά + Εμφάνιση Κάδου Ανακύκλωσης + Απόκρυψη Κάδου Ανακύκλωσης + Άνοιγμα Κάδου Ανακύκλωσης + Skip the Recycle Bin, delete files directly + + Μετακινήθηκε %d στοιχείο στον Κάδο + Μετακινήθηκαν %d στοιχεία στον Κάδο + + + Εισαγωγή… + Εξαγωγή… + Επιτυχής Εισαγωγή + Επιτυχής Εξαγωγή + Η Εισαγωγή απέτυχε + Η Εξαγωγή απέτυχε + Η Εισαγωγή μερικών καταχωρήσεων απέτυχε + Η Εξαγωγή μερικών καταχωρήσεων απέτυχε + Δεν βρέθηκαν καταχωρήσεις για Εισαγωγή + Δεν βρέθηκαν νέες καταχωρήσεις για Εισαγωγή + Δεν βρέθηκαν καταχωρήσεις για Εξαγωγή + Αντίγραφα ασφαλείας + Ενεργοποίηση αυτόματων αντιγράφων + Διαχείριση αυτόματων αντιγράφων + Μπορείτε να χρησιμοποιήσετε τα ακόλουθα μοτίβα για να ονομάσετε αυτόματα το αρχείο σας:\n\n%Y - έτος\n%M - μήνας\n%D - ημέρα\n%h - ώρα\n%m - λεπτό\n%s - δεθτ. + + USB + Φαίνεται ότι μια συσκευή USB είναι συνδεδεμένη στη συσκευή σας. Για να βεβαιωθείτε ότι τα αρχεία της εμφανίζονται σωστά, χρειάζεται να χορηγήσετε πρόσθετες Άδειες. + Παρακαλώ επιλέξτε τον ριζικό κατάλογο της συσκευής USB στην επόμενη οθόνη, για παραχώρηση πρόσβασης + Λάθος επιλεγμένος κατάλογος, παρακαλώ επιλέξτε το ριζικό κατάλογο της συσκευής USB + + Ιανουάριος + Φεβρουάριος + Μάρτιος + Απρίλιος + Μάιος + Ιούνιος + Ιούλιος + Αύγουστος + Σεπτέμβριος + Οκτώβριος + Νοέμβριος + Δεκέμβριος + + Ιαν + Φεβ + Μαρ + Απρ + Μάι + Ιουν + Ιουλ + Αυγ + Σεπ + Οκτ + Νοε + Δεκ + + τον Ιανουάριο + τον Φεβρουάριο + τον Μάρτιο + τον Απρίλιο + τον Μάιο + τον Ιούνιο + τον Ιούλιο + τον Αύγουστο + τον Σεπτέμβριο + τον Οκτώβριο + τον Νοέμβριο + τον Δεκέμβριο + Δευτέρα + Τρίτη + Τετάρτη + Πέμπτη + Παρασκευή + Σαββάτο + Κυριακή + Δ + Τ + Τ + Π + Π + Σ + Κ + Δευ + Τρί + Τετ + Πέμ + Παρ + Σαβ + Κυρ + + Η έκδοση της εφαρμογής σας δεν θα ενημερώνεται πλέον. Παρακαλώ αναβαθμίστε την στην έκδοση Pro για να λάβετε νέες επιδιορθώσεις και βελτιώσεις. + Η έκδοση της εφαρμογής σας δεν θα ενημερώνεται πλέον. Παρακαλώ αναβαθμίστε την στην έκδοση Pro για να λάβετε νέες επιδιορθώσεις και βελτιώσεις πατώντας εδώ. + Είναι δωρεάν μέχρι: %s. Εάν κάνετε λήψη μέχρι τότε, θα μπορείτε να την χρησιμοποιείτε δωρεάν για πάντα. + Περισσότερα + Αναβάθμιση + Πρέπει να μεταφέρετε τα αποθηκευμένα τοπικά συμβάντα χειροκίνητα, μέσω Εξαγωγής σε αρχείο .ics και στη συνέχεια Εισαγωγή. Μπορείτε να βρείτε τις επιλογές Εξαγωγής/Εισαγωγής, στο μενού της κύριας οθόνης. + Γεια σας,\n\nφαίνεται ότι μόλις αναβαθμίσατε από την δωρεάν έκδοση. Μόλις μείνετε ευχαριστημένοι με αυτή και ίσως μεταφέρετε τις ρυθμίσεις και τα αγαπημένα σας, μπορείτε να απεγκαταστήσετε την παλιά δωρεάν έκδοση για να αποφύγετε την τυχαία εκκίνησή της, καθώς δεν θα την χρειάζεστε πλέον.\n\nΕυχαριστούμε! + Γεια σας,\n\nφαίνεται ότι έχετε ήδη την έκδοση της εφαρμογής Pro. Μόλις μείνετε ευχαριστημένοι με αυτήν και ίσως μεταφέρατε τις ρυθμίσεις και τα αγαπημένα σας, μπορείτε να την απεγκαταστήσετε για να αποφύγετε την τυχαία εκκίνησή της, καθώς δεν θα τη χρειάζεστε πλέον.\n\nΕυχαριστούμε! + Γεια σας,\n\nφαίνεται ότι μόλις αναβαθμίσατε από την δωρεάν έκδοση. Μόλις μείνετε ευχαριστημένοι με αυτή και ίσως μεταφέρετε τα δεδομένα σας, μπορείτε να απεγκαταστήσετε την παλιά δωρεάν έκδοση για να αποφύγετε τυχαία εκκίνησή της, καθώς δεν θα την χρειάζεστε πλέον.\n\nΕυχαριστώ! + Γεια σας,\n\nφαίνεται ότι έχετε ήδη την έκδοση της εφαρμογής Pro επίσης. Μόλις μείνετε ευχαριστημένοι με αυτήν και ίσως μεταφέρατε τα δεδομένα σας, μπορείτε να την απεγκαταστήσετε για να αποφύγετε την τυχαία εκκίνησή της, καθώς δεν θα την χρειάζεστε πια.\n\nΕυχαριστούμε! + Γεια σας,\n\nφαίνεται ότι μόλις αναβαθμίσατε από την δωρεάν έκδοση. Αν θέλετε να μεταφέρετε τα τοπικά αποθηκευμένα συμβάντα σας, θα πρέπει να το κάνετε χειροκίνητα, εξάγοντάς τα σε αρχείο .ics στην έκδοση της δωρεάν εφαρμογής και εισάγοντας τα εδώ μέσω του μενού επάνω. \n\nΜόλις μείνετε ικανοποιημένοι με την εγκατάστασή σας στην έκδοση Pro, μπορείτε να απεγκαταστήσετε την παλιά δωρεάν έκδοση, καθώς δεν την χρειάζεστε πλέον.\n\nΕυχαριστούμε! + Γεια σας,\n\nφαίνεται ότι μόλις αναβαθμίσατε από την δωρεάν έκδοση. Αν είχατε αποθηκεύσει επαφές στο \"%s\", θα πρέπει να τις μεταφέρετε χειροκίνητα, εξάγοντας σε αρχείο .vcf από την έκδοση της δωρεάν εφαρμογής και εισάγοντας εδώ μέσω του επάνω μενού.\n\nΜόλις είστε ικανοποιημένοι με τη ρύθμιση στην έκδοση Pro, μπορείτε να απεγκαταστήσετε την παλιά δωρεάν έκδοση, καθώς δεν τη χρειάζεστε πλέον.\n\n Ευχαριστούμε! + Γεια σας,\n\nφαίνεται ότι μόλις αναβαθμίσατε από την δωρεάν έκδοση. Αν θέλετε να μεταφέρετε τις σημειώσεις σας, θα πρέπει να το κάνετε χειροκίνητα εξάγοντας τις σε ένα αρχείο στην έκδοση της δωρεάν εφαρμογής και εισάγοντας τις εδώ μέσω του επάνω μενού. \n\nΜόλις μείνετε ικανοποιημένοι με την εγκατάστασή σας στην έκδοση Pro, μπορείτε να απεγκαταστήσετε την παλιά δωρεάν έκδοση, καθώς δεν θα την χρειάζεστε πλέον.\n\nΕυχαριστούμε! + + Σχετικά + Ιστοσελίδα + Για τον κώδικα επισκεφθείτε + Στείλτε τα σχόλιά σας ή τις προτάσεις σας + Αναβάθμιση στην Pro + Περισσότερες εφαρμογές + Περισσότερες εφαρμογές από εμάς + Πρόσκληση φίλων + Έι, έλα να δεις %1$s στο %2$s + Πρόσκληση μέσω + Βαθμολογήστε μας + Βαθμολογία + Δωρεά + Ακολουθήστε μας + v %1$s\nCopyright © Simple Mobile Tools %2$d + Υποστήριξη + Βοηθήστε μας + Κοινωνικά + Άλλα + Πολιτική Απορρήτου + Έκδοση %s + Γεια :) + Φτιαγμένο με ❤️ στη Σλοβακία + Πρόσθετες πληροφορίες + Έκδοση εφαρμογής: %s + OS Συσκευής: %s + +
    + Ελπίζω να απολαμβάνετε την εφαρμογή. Δεν περιέχει διαφημίσεις, παρακαλώ υποστηρίξτε την ανάπτυξή της με την αγορά στο Απλά Σας Ευχαριστούμε, θα αποτρέψει επίσης την εμφάνιση αυτού του διαλόγου.

    + Ευχαριστούμε! + ]]> +
    + Γειά σας,<br><br>ελπίζω να απολαμβάνετε την εφαρμογή. Δεν περιέχει διαφημίσεις και δεν συλλέγουμε τα δεδομένα σας, παρακαλούμε υποστηρίξτε την ανάπτυξή της με την αγορά της <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Απλά Σας Ευχαριστούμε</a>. Επίσης, θα έχετε ξεκλειδώσει όλες τις λειτουργίες της και την προσαρμογή των χρωμάτων.<br><br>Σας ευχαριστώ! + Υποστηρίξτε μας αγοράζοντας την <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Απλά Σας Ευχαριστούμε</a> παρακαλώ, θα ξεκλειδώσει επίσης όλες τις λειτουργίες της εφαρμογής και την προσαρμογή χρωμάτων. + Αγορά + Αγορά Simple Phone + Παρακαλώ ενημερώστε την Απλά Σας Ευχαριστούμε στην τελευταία έκδοση + Πριν κάνετε μια ερώτηση, ελέγξτε τις ρυθμίσεις της εφαρμογής και διαβάστε πρώτα τις Συχνές Ερωτήσεις. Ίσως η λύση υπάρχει εκεί. + Πριν μας αξιολογήσετε, ελέγξτε τις ρυθμίσεις εφαρμογής και διαβάστε πρώτα τις Συχνές Ερωτήσεις. Αν έχετε προβλήματα, ίσως η λύση υπάρχει εκεί. + Επίσης, βεβαιωθείτε ότι χρησιμοποιείτε την τελευταία έκδοση της εφαρμογής. + Σημειώστε επίσης ότι αυτή η έκδοση της εφαρμογής δεν αναπτύσσεται πλέον, αποκτήστε την έκδοση Pro για πολλές βελτιώσεις. + Διαβάστε τις + Συχνές Ερωτήσεις + Γειά σας,\n\nφαίνεται ότι χρησιμοποιείτε αυτήν την εφαρμογή ήδη για αρκετό καιρό, και το εκτιμούμε πραγματικά.\n\nΑν μπορούμε να σας ζητήσουμε μια χάρη, παρακαλούμε αξιολογήστε μας στο Google Play. Αυτό θα μας βοηθούσε πολύ.\n\nΑνεξάρτητα τι αποφασίσατε, δεν θα εμφανιστεί ξανά αυτό το μήνυμα.\n\nΕυχαριστούμε! + Βαθμολογήστε την εφαρμογή μας παρακαλώ :) + Σας Ευχαριστούμε + Το widget είναι κλειδωμένο.\nΠαρακαλώ αναβαθμίστε σε Pro έκδοση, για να το ξεκλειδώσετε. + Αυτή η λειτουργία είναι κλειδωμένη, παρακαλούμε αγοράστε <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> για το ξεκλείδωμα της πλήρους εφαρμογής.<br><br>Είναι μια εφάπαξ πληρωμή μόνο και αν δεν είστε ικανοποιημένοι, μπορούμε να σας επιστρέψουμε τα χρήματα. + + +
    + απλά σας ενημερώνουμε ότι πρόσφατα κυκλοφόρησε μια νέα εφαρμογή:

    + %2$s

    + %4$s

    + %6$s

    + Μπορείτε να την κατεβάσετε πατώντας τον τίτλο.

    + Ευχαριστούμε + ]]> +
    + Απλός Εκκινητής + Απλή Αριθμομηχανή + Απλό Ημερολόγιο + Απλή Κάμερα + Απλό Ρολόι + Απλές Επαφές + Απλή Κλήση + Απλή Ζωγραφική + Απλός Διαχειριστής Αρχείων + Απλός Φακός + Απλή Συλλογή + Απλό Πληκτρολόγιο + Απλός Εκκινητής + Απλός Music Player + Απλές Σημειώσεις + Απλός SMS Messenger + Απλά Σας Ευχαριστούμε + Απλή Εγγραφή Φωνής + Εκκινητής εφαρμογών + Αριθμομηχανή + Ημερολόγιο + Κάμερα + Ρολόι + Επαφές + Πληκτ/γιο Κλήσης + Ζωγραφική + Αρχεία + Φακός + Συλλογή + Πληκτρολόγιο + Εκκινητής + Μουσική + Σημειώσεις + Μηνύματα SMS + Σας Ευχαριστούμε + Εγγραφή φωνής + + εδώ. + ]]> + + + Συχνές ερωτήσεις + Πριν κάνετε μια ερώτηση, διαβάστε πρώτα τις + Γιατί δεν βλέπω αυτό το Γραφικό στοιχείο εφαρμογής στη λίστα; + Είναι πολύ πιθανό επειδή μετακινήσατε την εφαρμογή σε μια κάρτα SD. Υπάρχει ένας περιορισμός του συστήματος Android που αποκρύπτει τα συγκεκριμένα Γραφικά στοιχεία εφαρμογών + σε αυτή την περίπτωση. Η μόνη λύση είναι να μετακινήσετε την εφαρμογή πίσω στην εσωτερική αποθήκευση μέσω των ρυθμίσεων της συσκευής σας. + Θέλω να σας υποστηρίξω, αλλά δεν μπορώ να δωρίσω χρήματα. Υπάρχει κάτι άλλο που μπορώ να κάνω; + + ιστότοπο, ή απλά επικοινωνήστε μαζί μας στο hello@simplemobiletools.com αν έχετε οποιεσδήποτε ερωτήσεις. + ]]> + + Διαγραφή κάποιων αρχείων κατά λάθος, πώς μπορώ να τα ανακτήσω; + Δυστυχώς, δεν μπορείτε. Τα αρχεία διαγράφονται αμέσως μετά το παράθυρο διαλόγου επιβεβαίωσης, δεν υπάρχει διαθέσιμος Κάδος ανακύκλωσης. + Δεν μου αρέσουν τα χρώματα του Γραφικού στοιχείου, μπορώ να τα αλλάξω; + Ναι, καθώς σύρετε ένα γραφικό στοιχείο στην αρχική οθόνη σας, εμφανίζεται μια οθόνη διαμόρφωσης Γραφικού στοιχείου. Θα δείτε έγχρωμα τετράγωνα στην κάτω αριστερή γωνία, απλά πατήστε τα για να επιλέξετε ένα νέο χρώμα. Μπορείτε να χρησιμοποιήσετε το ρυθμιστικό για να ρυθμίσετε το alpha επίσης. + Μπορώ να επαναφέρω με κάποιο τρόπο τα διαγραμμένα αρχεία; + Αν όντως διαγράφηκαν, δεν μπορείτε. Ωστόσο, υπάρχει ενεργοποιημένος από προεπιλογή ο Κάδος ανακύκλωσης, αυτό σημαίνει, οτι τα αρχεία μετακινούνται στον Κάδο αντί για διαγραφή. + Το εικονίδιο εκκίνησης εφαρμογών εξαφανίστηκε. Τι μπορώ να κάνω? + Προκαλείται από τον Εκκινητή σας που δεν υποστηρίζει την προσαρμογή εικονιδίων κατάλληλα. Δοκιμάστε να ξεκινήσει η εφαρμογή μέσω του Google Play ή κάποιου Γραφικού στοιχείου, εάν είναι διαθέσιμο. + Μόλις ξεκινήσει, απλά επαναφέρετε το προεπιλεγμένο πορτοκαλί εικονίδιο #F57C00. Μπορεί να χρειαστεί να επανεγκαταστήσετε την εφαρμογή στη χειρότερη περίπτωση. + Τα χρήματα αφαιρέθηκαν από τον τραπεζικό μου λογαριασμό, αλλά δεν μπορώ να κατεβάσω την εφαρμογή. Τι μπορώ να κάνω? + Οι πληρωμές διαχειρίζονται πλήρως από την Google, το σύστημα της δυσλειτουργεί περιστασιακά. Απλώς καθαρίστε την προσωρινή μνήμη εφαρμογών του Google Play, επανεκκινήστε τη συσκευή σας, και προσπαθήστε ξανά να την κατεβάσετε. + Γιατί πρέπει να αναβαθμίσω σε έκδοση Pro; + Καθώς η έκδοση της εφαρμογής σας δεν ενημερώνεται πλέον, τα σφάλματα που εντοπίσατε ίσως δεν θα διορθωθούν ποτέ. Επίσης, δεν θα προστεθούν νέες λειτουργίες. Μπορείτε να αγοράσετε την έκδοση Pro στο Google Play με ένα μικρό χρηματικό ποσό. + Πρόκειται για εφάπαξ πληρωμή, πράγμα που σημαίνει ότι μόλις την αγοράσετε, δεν θα χρειαστεί να την πληρώσετε ξανά. Ούτε καν μετά τη λήψη μιας νέας συσκευής. Εάν δεν σας αρέσει η έκδοση Pro, μπορείτε να την απεγκαταστήσετε μέσα σε λίγες ώρες και θα λάβετε αυτόματα τα χρήματά σας πίσω. + Αν θέλετε επιστροφή χρημάτων οποιαδήποτε στιγμή αργότερα, απλά επικοινωνήστε μαζί μας στη διεύθυνση hello@simplemobiletools.com και θα τα λάβετε. + Πώς μπορώ να επιλέξω πολλά στοιχεία ταυτόχρονα; + Υπάρχουν πολλοί τρόποι για να γίνει αυτό. Το πρώτο είναι η εκκίνηση της λειτουργίας επιλογής πατώντας παρατεταμένα ένα στοιχείο και κατόπιν κάνοντας σύντομο κλικ σε άλλα για να τα επιλέξετε. Ο δεύτερος τρόπος είναι παρόμοιος με την επιλογή στοιχείων σε υπολογιστές με ποντίκι. + απλά ξεκινήστε τη λειτουργία επιλογής πατώντας παρατεταμένα ένα στοιχείο και, στη συνέχεια, κρατώντας πατημένο το δάχτυλό σας, σύρετέ το σε άλλα στοιχεία για επιλογή. Ο τρίτος τρόπος επιλογής πολλών στοιχείων είναι η μεγάλη διάρκεια πίεσης ενός στοιχείου και κατόπιν η μεγάλη διάρκεια πίεσης ενός άλλου και όλων των ενδιάμεσων γίνεται επιλεγμένη. Εάν + θέλετε να επιλέξετε όλα τα στοιχεία, πατήστε μόνο ένα στοιχείο και, στη συνέχεια, κάντε κλικ στον επιλεγμένο μετρητή στοιχείων στην επάνω αριστερή γωνία. Αυτό θα επιλέξει ή θα καταργήσει την επιλογή όλων των στοιχείων. + Έχω αγοράσει την εφαρμογή, αλλά δεν μπορώ να πραγματοποιήσω λήψη της σε άλλη συσκευή. + Δοκιμάστε να διαγράψετε την προσωρινή μνήμη εφαρμογών Google Play και να επανεκκινήσετε τη συσκευή σας. Πρόκειται για κάποιο πρόβλημα του Google Play, το οποίο δεν σχετίζεται με την ίδια την εφαρμογή. + + Συντελεστές + Μετάφραση + Ανάπτυξη + Άλλη Βοήθεια + + ιστότοπο, ή επικοινωνήστε μαζί μας στο hello@simplemobiletools.com αν έχετε οποιεσδήποτε ερωτήσεις. + Ευχαριστούμε όλους τους συνεισφέροντες και υποστηρικτές! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Λάβετε την Pro έκδοση τώρα! + Βασική + Pro + Χωρίς διαφ/σεις + Χωρίς πρόσβαση στο internet + 100% Εγγύηση επιστροφής χρημάτων + Εφάπαξ πληρωμή + Βελτιωμένος σχεδιασμός + + Προηγμένος επεξεργαστής φωτογραφιών + Προηγμένος επεξεργαστής Φώτο & Βίντεο + HEIC/HEIF υποστήριξη αρχείων + Προηγμένη μετονομασία αρχείων δέσμης + Κλείδωμα μεμονωμένων φακέλων + Υποστήριξη εκτύπωσης + + Υποστήριξη ζώνης ώρας + Συμμετέχοντες και υπενθυμίσεις email + Εύκολη εισαγωγή συμβάντων + Νέα γραφικά στοιχεία + + Βελτιωμένη συγχώνευση διπλών επαφών + Προσαρμογή μεγέθους γραμ/σειράς + Προαιρετική κοινή χρήση ιδιωτικών επαφών στις εφαρμογές μας + Προσαρμόσιμοι ήχοι κλήσης επαφών + Φιλτράρισμα επαφών + Ιδιωτικά αποθηκευμένες επαφές + + Λίστες ελέγχου + Διαφορετική σημείωση και χρώματα ανά γραφικό στοιχείο + Κλείδωμα Σημείωσης + + Προσαρμογή μορφής ημ/νίας και ώρας + Συντομεύσεις στην Αρχική οθόνη + Υποστήριξη συμπίεσης αρχείων + Καρτέλα με πρόσφατα αρχεία + + Προσαρμογή χρώματος φόντου + Υποστήριξη εισαγωγής αρχείων + Μεγέθυνση + + Αυτή η εφαρμογή χρησιμοποιεί τις ακόλουθες βιβλιοθήκες τρίτων για να διευκολύνει τη ζωή μου. Ευχαριστώ. + Άδειες τρίτων + Kotlin (γλώσσα προγραμματισμού) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Η Δοκιμή έληξε + Ξεκινήστε δωρεάν δοκιμή + Η Δοκιμή σας λήγει σύντομα. + Ξεκλειδώστε την εφαρμογή για μια τελευταία ημέρα + Καλώς ήρθατε σε %s! + Σας ευχαριστούμε που χρησιμοποιείτε την εφαρμογή μας. Μπορείτε να χρησιμοποιήσετε αυτή την ξεκλείδωτη έκδοση για <font color=\'#FFFFFF\'>%d ημέρες</font>. Μετά το τέλος της δοκιμής, παρακαλούμε εξετάστε το ενδεχόμενο αναβάθμισης στην έκδοση Pro. Διαθέτει μεγάλο αριθμό νέων χαρακτηριστικών, μοντέρνο σχεδιασμό, χωρίς διαφημίσεις και πολλές άλλες βελτιώσεις. + \n\nΑπλά πρέπει να πληρώσετε για αυτό μια φορά στη ζωή σας και αν δεν είστε ικανοποιημένοι, μπορείτε να την απεγκαταστήσετε και να λάβετε επιστροφή χρημάτων.\n\nΕλπίζω να σας αρέσει. :) + Παρακαλούμε αναβαθμίστε στην έκδοση Pro για να απολαύσετε την εφαρμογή στο έπακρο.\n\nΠρέπει να πληρώσετε μόνο μια φορά στη ζωή σας και αν δεν είστε ικανοποιημένοι, μπορείτε να την απεγκαταστήσετε και να λάβετε επιστροφή χρημάτων.\n\nΤα λέμε εκεί. :) + + Η δοκιμή σας λήγει σε %d ημέρα. + Η δοκιμή σας λήγει σε %d ημέρες. + + + ΚΑΤΑΡΓΗΣΗ: Αυτή η έκδοση της εφαρμογής δεν υποστηρίζεται πλέον, λάβετε την έκδοση Pro εδώ https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Μην ξεχνάτε οτι αν απεγκατασταθεί εντός 2 ωρών, θα επιστραφούν αυτόματα τα χρήματα σας. Αν θέλετε επιστροφή χρημάτων οποιαδήποτε στιγμή αργότερα, απλά επικοινωνήστε μαζί μας στο hello@simplemobiletools.com και θα τα λάβετε. Αυτό το κάνει εύκολότερο για να την δοκιμάσετε :) + + Μια ομάδα Απλών εφαρμογών Android ανοιχτού κώδικα με προσαρμόσιμα γραφικά στοιχεία, χωρίς διαφημίσεις και περιττές Άδειες. +
    diff --git a/commons/src/main/res/values-eo/strings.xml b/commons/src/main/res/values-eo/strings.xml new file mode 100644 index 000000000..e3402fd0c --- /dev/null +++ b/commons/src/main/res/values-eo/strings.xml @@ -0,0 +1,1092 @@ + + + Bone + Nuligi + Back + Nenio + Poste + Konservi kiel + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Malfermi per + Redakti per + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Nekonata + Ĉiam + Neniam + Detaloj + Notoj + Deleting folder \'%s\' + Nenio + Etikedo + Transparent + Transparent color + Select a different color + Download + Sciigo + Sciigoj + Retpoŝta adreso + Antaŭa + Play / Pause + Sekva + Nombro + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Nul + Unu + Du + Tri + Kvar + Kvin + Ses + Sep + Ok + Naŭ + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Foti + Elekti foton + Choose video + Choose contact + Choose file + Record audio + Record video + Ĝisdatigante… + Phone storage + Phone storage (not visible by other apps) + Audio + + Naskiĝtago + Anniversary + + Hejmo + Laboro + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + Change view type + Krado + Krado (Pro) + Uneven Grid + Listo + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Uzi kiel impliciton + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Favorites + Add favorites + Add to favorites + Remove from favorites + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Filtri + Filtri (Pro) + No items found. + Change filter + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d item + %d items + + + + %d item + %d items + + + Deleting %d item + Deleting %d items + + + + %d contact + %d contacts + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + Delete + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + + Are you sure you want to move %s into the Recycle Bin? + + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Jes + Ne + Maybe + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + minutes + hours + days + s + m + h + wk. + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + Alarm + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + Vibrigi je butonpremo + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + Ekskluzivi + Exclude folder + Ekskluzivitaj dosierujoj + (ekskluzivita) + Administri ekskluzivitajn dosierujojn + Remove all + Remove all folders from the list of excluded\? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + January + February + March + April + May + June + July + August + September + October + November + December + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + lundo + mardo + merkredo + ĵaŭdo + vendredo + sabato + dimanĉo + L + Ma + Me + Ĵ + V + S + D + lun + mar + mer + ĵaŭ + ven + sab + dim + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + Pliaj informoj + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Pri + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Inviti per + Rate us + Rate + Donaci + Aboni nin + v %1$s\nKopirajtoj © Simple Mobile Tools %2$d + Subteno + Helpi nin + Social + Alia + Privacy policy + Versio %s + Saluton :) + Farita per ❤️ en Slovakio + Pliaj informoj + Versio de programo: %s + Aparata mastruma sistemo: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + Simple App Launcher + Simpla Kalkulilo + Simpla Kalendaro + Simpla Horloĝo + Simpla Fotilo + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simpla Danko + Simple Voice Recorder + Programlanĉilo + Kalkulilo + Kalendaro + Fotilo + Horloĝo + Kontaktoj + Dialer + Draw + File Manager + Flashlight + Galerio + Keyboard + Launcher + Muzikludilo + Notoj + SMS Messenger + Dankon + Voice Recorder + + here. + ]]> + + + Oftaj demandoj + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Araba + Azerbajĝana + Bengala + Bretona + Bulgarian + Kataluna + Ĉeĥa + Kimra + Dana + English + Germana + Greka + Hispana + Eŭska + Persa + Finna + Franca + Galega + Hindia + Kroata + Hungara + Indonezia + Itala + Hebrea + Japana + Korea + Litova + Nepala + Norvega + Nederlanda + Pola + Portugala + Rumana + Rusa + Slovaka + Slovena + Serba + Sveda + Tamula + Turka + Ukraina + Vjetnama + Ĉina (Honkonga) + Ĉina (simpligita) + Ĉina (tradicia) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-es/strings.xml b/commons/src/main/res/values-es/strings.xml new file mode 100644 index 000000000..cbde66687 --- /dev/null +++ b/commons/src/main/res/values-es/strings.xml @@ -0,0 +1,1178 @@ + + + Aceptar + Cancelar + Atrás + Nada + Más tarde + Guardar como + Archivo guardado con éxito + Formato de archivo no válido + Error: sin memoria + Ocurrió un error: %s + Error: %s + Abrir con + Editar con + Editar + No se encontró ninguna aplicación válida + No se encontró ningún navegador + No se ha encontrado ningún cliente de correo electrónico + Establecer como + Copiar al portapapeles + Copiar número al portapapeles + Valor copiado al portapapeles + Valor copiado al portapapeles:\n%s + Marcar número + Desconocido + Siempre + Nunca + Detalles + Notas + Eliminando carpeta \'%s\' + Ninguno + Etiqueta + Transparente + Color transparente + Seleccionar un color diferente + Descarga + Notificación + Notificaciones + Correo electrónico + Anterior + Reproducir/pausar + Siguiente + Número + No se encontraron contactos + Solicitar los permisos requeridos + La aplicación no puede acceder a tus contactos + La aplicación no tiene permiso para iniciar llamadas telefónicas, por favor concédalo en la configuración del dispositivo + Introduce el texto aquí + Llamar a %s + Confirmar la llamada a %s + Cero + Uno + Dos + Tres + Cuatro + Cinco + Seis + Siete + Ocho + Nueve + Valor + El valor no puede estar vacío + Crear nuevo contacto + Añadir a un contacto existente + Aplicación corrupta + Descargo de responsabilidad + Sacar una fotografía + Escoger foto + Elija un vídeo + Elija un contacto + Elija un archivo + Grabar audio + Grabar vídeo + Actualizando… + Almacenamiento del teléfono + Almacenamiento del teléfono (No visible para otras aplicaciones) + Audio + + Cumpleaños + Aniversario + + Casa + Trabajo + + Móvil + Principal + Fax del trabajo + Fax de casa + Localizador + No se encontraron números de teléfono + + Cambiar tipo de vista + Cuadrícula + Cuadrícula (Pro) + Parrilla irregular + Lista + Aumentar el número de columnas + Reducir el número de columnas + Recuento de columnas + Recuento de columnas de retratos + Recuento de columnas apaisadas + Cambiar la imagen de la portada + Seleccione Foto + + Columna %d + Columnas %d + Columnas %d + + + Administrar números bloqueados + Aún no has bloqueado a nadie. + Añadir un número bloqueado + Bloquear número + Bloquear números + Números bloqueados + Exportar números bloqueados + Importar números bloqueados + Tienes que hacer esta aplicación la aplicación de marcación por defecto para hacer uso de los números bloqueados. + Establecer por defecto + ¿Estás seguro de que quieres bloquear a \"%s\"? + Bloquear llamadas de contactos no guardados + Bloquear los mensajes de los contactos no guardados + Ingrese un número o un patrón (por ejemplo, *12345*, +1*8888) para bloquear todas las llamadas y mensajes de números que coincidan con el patrón. + No se pueden bloquear los números desconocidos sin el permiso del identificador de llamadas. + + Favoritos + Añadir a favoritos + Añadir a favoritos + Eliminar de favoritos + + Buscar + Buscar en %s + Escribe por lo menos dos caracteres para iniciar la búsqueda. + Buscar los contactos + Buscar los favoritos + Buscar las aplicaciones + Buscar los eventos + Buscar los grupos + Historial de las búsquedas + Buscar las llamadas + Buscar los archivos + Buscar las carpetas + Buscar los archivos y las carpetas + Buscar las listas de reproducción + Buscar los artistas + Buscar los álbumes + Buscar las pistas + Buscar el texto + Buscar las conversaciones + Buscar las grabaciones + + Filtrar + Filtrar (Pro) + No se ha encontrado ningún elemento. + Cambiar filtro + + Se requiere permiso de Almacenamiento + Se requiere permiso de Contactos + Se requiere permiso para la Cámara + Se requiere permiso de Audio + Sin autorización + Debes permitir que la aplicación muestre notificaciones, de lo contrario no podrá mostrar recordatorios. + Debes permitir que la aplicación muestre notificaciones, de lo contrario no podrá mostrar la barra de progreso. + Debes permitir que la aplicación muestre notificaciones, de lo contrario no podrá reproducir las canciones. + Debes permitir que la aplicación muestre notificaciones, de lo contrario no podrá grabar audio. + Debes permitir que la aplicación muestre notificaciones, de lo contrario no podrá mostrar las llamadas entrantes. + Debes permitir que la aplicación muestre notificaciones, de lo contrario no podrá mostrar los mensajes entrantes. + Conceder el permiso + Permiso necesario + + Renombrar archivo + Renombrar carpeta + No se pudo renombrar el archivo + No se pudo renombrar la carpeta + El nombre de la carpeta no puede estar vacío + Ya existe una carpeta con ese nombre + No se puede cambiar el nombre de la carpeta raíz del almacenamiento + Carpeta renombrada correctamente + Renombrando carpeta + El nombre del archivo no puede estar vacío + El nombre del archivo contiene caracteres no válidos + El nombre del archivo \'%s\' contiene caracteres no válidos + La extensión no puede estar vacía + El archivo %s no existe + Anteponer los nombres de los archivo + Agregar los nombres del archivo + Cambiar el nombre facilmente + Patrón + Cadena para agregar + %Y - Año\n%M - Mes\n%D - Día\n%h - Hora\n%m - Minuto\n%s - Segundo\n%i - número aumentando desde 1 + Nombre del archivo (sin .txt) + Nombre del archivo (sin .json) + Nombre del archivo (sin .zip) + A partir de Android 11 ya no se pueden ocultar archivos y carpetas así + + Copiar + Mover + Copiar/mover + Copiar a + Mover a + Origen + Destino + Seleccionar destino + Pulsa aquí para elegir el destino + No se pudo escribir en el destino elegido + Por favor elige un destino + Origen y destino no pueden coincidir + No se pudieron copiar los archivos + Copiando… + Archivos copiados correctamente + Archivo copiado correctamente + Ha ocurrido un error + Moviendo… + Archivos movidos correctamente + Archivo movido con éxito + Algunos archivos no se pudieron mover + Algunos archivos no se pudieron copiar + No hay archivos seleccionados + Guardando… + No se puede crear la carpeta %s + No se puede crear el fichero %s + No se han encontrado elementos nuevos + El destino no tiene suficiente espacio libre.\nRequerido: %1$s, Disponible: %2$s + El servicio del sistema para seleccionar archivos y carpetas no está disponible + + Crear nueva + Carpeta + Archivo + Crear nueva carpeta + Ya existe un archivo o carpeta con ese nombre + El nombre contiene caracteres no válidos + Por favor introduce un nombre + Ocurrió un error desconocido + + El archivo \"%s\" ya existe + El archivo \"%s\" ya existe. ¿Sobreescribir? + La carpeta \"%s\" ya existe + Fusionar + Mantener ambos + Sobreescribir + Saltar + Agregar con \'_1\' + Aplicar a todo + El sistema no permite la operación en esta carpeta, por favor elija otra + El sistema no permite copiar en esta carpeta, por favor elija otra + El sistema no permite cambiar de nombre esta carpeta + No se pueden renombrar las carpetas directamente en el almacenamiento interno, sólo las subcarpetas + No se puede cambiar el nombre de esta carpeta + + Seleccione una carpeta + Seleccione un archivo + Permita el acceso al almacenamiento externo + Confirmar el acceso a la carpeta + Por favor, elija la carpeta raíz de la tarjeta SD en la próxima pantalla para conceder el acceso de escritura + Si no ve la tarjeta SD, pruebe esto + Por favor permita a la aplicacion acceder al almacenamiento seleccionado en la siguiente pantalla presionando \'Usar esta carpeta\' en la parte inferior. + Permita el acceso a \'%s\' en la siguiente pantalla presionando \'Usar esta carpeta\' en la parte inferior. + Presione \'Guardar\' en la parte inferior de la siguiente pantalla para crear la nueva carpeta. + Confirmar la selección + Cargando… + Por favor conceda a nuestra aplicación el acceso a todos los archivos, es posible que no funcione bien sin ella. + + %d elemento + %d artículos + %d elementos + + + + %d elemento + %d elementos + %d elementos + + + Eliminando %d elemento + Eliminados %d elementos + Eliminando %d elementos + + + + %d contacto + %d contactos + %d contactos + + + Seleccione almacenamiento + Almacenamiento + Almacenamiento interno + Tarjeta SD + Raíz ( Root) + Carpeta incorrecta seleccionada, seleccione la carpeta principal de su tarjeta SD + Las rutas de la tarjeta SD y del dispositivo USB no pueden ser las mismas + Parece que tienes la aplicación instalada en una tarjeta SD, lo que hace que los widgets de la aplicación no estén disponibles. Ni siquiera los verás en la lista de widgets disponibles. + Es una limitación del sistema, por lo que si deseas usar los widgets, debes volver a colocar la aplicación en el almacenamiento interno. + Carpeta incorrecta seleccionada, por favor seleccione la ruta \'%s\' + + Propiedades + Ruta + Elementos seleccionados + Número de archivos directamente contenidos + Número total de archivos + Resolución + Duración + Artista + Álbum + Longitud focal + Tiempo de exposición + Velocidad ISO + Número F + Cámara + EXIF + Título de la canción + Coordenadas GPS + Altitud + Eliminar el EXIF + ¿Estás seguro de que quieres eliminar los valores EXIF como las coordenadas GPS, el modelo de la cámara, etc.\? + Valores EXIF eliminados con éxito + + Color del fondo + Color del texto + Color principal + Color de acento del tema blanco + Color de acento de Negro & Tema blanco + Color de primer plano + Color del icono de la aplicación + Color de la barra de navegación inferior + Valores por defecto + Usar por defecto + Por defecto + Cambiar de color + Tema + Cambiar un color hará que cambie al tema personalizado + Guardar + Deshacer + Deshacer cambios + ¿Seguro que quiere deshacer los cambios? + Esta acción no se puede deshacer. + Tiene cambios sin aplicar. ¿Guardar antes de salir? + Aplicar colores a todas las aplicaciones Simple Apps + ADVERTENCIA: Algunos launchers no manejan correctamente la personalización del icono de la aplicación. En caso de que el icono desaparezca, intente iniciar la aplicación a través de Google Play o algún widget, si está disponible. + Una vez iniciado, simplemente vuelva a establecer el ícono naranja predeterminado #F57C00. Es posible que tengas que volver a instalar la aplicación en el peor de los casos. + Colores actualizados correctamente. Se ha añadido un nuevo tema llamado \'Compartido\', por favor utilicelo para actualizar los colores de todas las aplicaciones en el futuro. + Tenga en cuenta que aunque esté utilizando la versión de la aplicación Pro, aún necesita Simple Gracias por razones técnicas. Se encarga de la sincronización del color. + + Simple Gracias para desbloquear esta función y ayudar al desarrollo. ¡Gracias! + ]]> + + + Claro + Oscuro + Auto + Claro / Negro automático + Solarizado + Rojo oscuro + Blanco + Blanco y negro + Personalizado + Compartido + Sistema por defecto + + Novedades + * Solo las actualizaciones más grandes se enumeran aquí, siempre hay algunas pequeñas mejoras también + + Eliminar + Eliminar + Renombrar + Compartir + Compartir con + Redimensionar + Seleccionar todo + Seleccionar texto + Ocultar + Mostrar + Ocultar carpeta + Mostrar carpeta + Mostrar ocultos temporalmente + No mostrar ocultos + No puedes compartir todo este contenido a la vez + Vaciar y desactivar la papelera de reciclaje + Deshacer + Rehacer + Imprimir + Imprimir (Pro) + Atajo + Crear atajo + Crear atajo (Pro) + Anadir el número a contactos + Ver detalles de contacto + Llamar desde SIM 1 + Llamar desde SIM 2 + Cambiar la visibilidad del nombre de archivo + Mover a la parte superior + Mover a la parte inferior + Anclar elemento + Desanclar elemento + Enviar SMS + Enviar un correo electrónico + Llamar a + Datos de contacto + Añadir contacto + Fondos de pantalla + + Ordenar por + Nombre + Tamaño + Modificación + Fecha de creación + Creación + Título + Nombre del archivo + Extensión + Aleatorio + Ordenar aleatoriamente + Ascendente + Descendente + Solo para esta carpeta + Ordenar partes numéricas por su valor + Primer nombre + Segundo nombre + Apellido + Nombre completo + Utilizar la ordenación personalizada + Cambiar el orden + + ¿Estás seguro de que quieres proceder a la eliminación\? + ¿Estas seguro que quieres borrar %s? + Delete %s? + + ¿Estás seguro de que quieres mover %s a la papelera de reciclaje? + + ¿Seguro que quieres eliminar este elemento? + ¿Seguro que quieres enviar este elemento a la papelera? + No volver a preguntar en esta sesión + No volver a mostrar + + No + Tal vez + + ADVERTENCIA: Está borrando %d carpeta + ADVERTENCIA: Está borrando %d carpetas + ADVERTENCIA: está eliminando %d carpetas + + + PIN + Introduzca PIN + Por favor introduzca PIN + PIN erróneo + Repetir PIN + Patrón + Inserte Patrón + Patrón erroneo + Repetir Patrón + Biometría + Huella + Añadir huella + Por favor pon el dedo en el lector de huellas + Abrir cuadro de verificación de ID biométrica + Autenticar + Autenticación fallida + Autenticación bloqueada, por favor intente de nuevo en un momento + No tiene huellas dactilares registradas, por favor agregue algunas en la configuración de su dispositivo + Ir a la configuración + Se ha agregado la contraseña con éxito. Por favor, vuelva a instalar la aplicación en caso de que la olvide. + Configuración de protección con éxito. Por favor, vuelva a instalar la aplicación en caso de problemas al desbloquear. + Bloquear carpeta + Bloquear carpeta (Pro) + Desbloquear carpeta + Esta protección funciona solo en esta aplicación, no reemplaza un cifrado de carpetas en todo el sistema. + + Ayer + Hoy + Mañana + Todos los días + Ocultar año + segundos + minutos + horas + días + s + m + h + wk. + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d día + %d días + %d días + + + %d semana + %d semanas + %d semanas + + + %d mes + %d meses + %d meses + + + %d año + %d años + %d años + + + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d día + %d días + %d días + + + %d semana + %d semanas + %d semanas + + + %d mes + %d meses + %d meses + + + %d año + %d años + %d años + + + + %d segundo antes + %d segundos antes + %d segundos antes + + + %d minuto antes + %d minutos antes + %d minutos antes + + + %d hora antes + %d horas antes + %d horas antes + + + %d día antes + %d días antes + %d días antes + + + %d semana antes + %d semanas antes + %d semanas antes + + + %d mes antes + %d meses antes + %d meses antes + + + %d año antes + %d años antes + %d años antes + + + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d día + %d días + %d días + + + %d semana + %d semanas + %d semanas + + + %d mes + %d meses + %d meses + + + %d año + %d años + %d años + + + Tiempo restante hasta que suene la alarma:\n%s + Tiempo restante hasta que se active el recordatorio:\n%s + Tiempo restante: +\n%s + Asegúrese de que la alarma funcione correctamente antes de confiar en ella. Podría comportarse mal debido a las restricciones del sistema relacionadas con el ahorro de batería. + Asegúrese de que los recordatorios funcionen correctamente antes de confiar en ellos. Podrían portarse mal debido a las restricciones del sistema relacionadas con el ahorro de batería. + Las notificaciones de esta aplicación están deshabilitadas. Vaya a la configuración de su dispositivo para habilitarlos. + + Alarma + Posponer + Cancelar + Sin recordatorio + Al inicio + Sonidos del sistema + Tus sonidos + Agrega un nuevo sonido + Sin sonido + Durante el día a las hh:mm + Durante el día a las %02d:%02d + + Ajustes + Comprar Simple Gracias + General + Personalización del color + Personalización mejorada de los colores + Cambiar colores + Personalizar colores (Bloqueado) + Bloqueado + Personaliza los colores del widget + Personaliza las notificaciones + Notification sound + Usar el idioma inglés + Idioma + Mostrar elementos ocultos + Tamaño de fuente + Pequeña + Mediana + Grande + Enorme + Contraseña para proteger los medios ocultos + Contraseña para proteger toda la aplicación + Proteger con contraseña eliminar y mover archivos + Mantener el último valor modificado por última vez en las operaciones de archivo + Mostrar una burbuja de información al desplazar elementos arrastrando la barra de desplazamiento + No dejar dormir el teléfono con la aplicación en primer plano + Omitir siempre el diálogo de confirmación de eliminación + Habilitar tirar desde la parte superior para refrescar + Usar el formato 24 horas + Cambiar formato de fecha y hora + Comenzar la semana en Domingo + Widgets + Siempre use el mismo tiempo de repetición + Tiempo de repetición + Vibrar al presionar un botón + Mover los elementos en la papelera de reciclaje en lugar de eliminar + Intervalo de vaciado de la papelera de reciclaje + Vaciar papelera de reciclaje + Forzar el modo retrato + Exportar ajustes + Importar ajustes + Ajustes exportados correctamente + Ajustes importados correctamente + Mostrar nombre por apellido + Limpiar cache + Mostrar un cuadro de confirmación antes de iniciar una llamada + + Visibilidad + Seguridad + Desplazamiento + Operaciones con ficheros + Papelera de reciclaje + Guardado + Puesta en marcha + Texto + Migrando + Calidad + Pantalla principal + Miniaturas + Vista de Lista + + Excluir + Excluir la carpeta + Carpetas excluidas + (no incluido) + Gestionar carpetas excluidas + Eliminar todo + ¿Eliminar todas las carpetas de la lista de excluidas\? Nota: Esto no borrará las carpetas. + Mostrar excluidos temporalmente + Dejar de mostrar excluidos + + Administrar pestañas mostradas + Pestaña para abrir al inicio de la aplicación + Contactos + Favoritos + Historial de llamadas + Grupos + La última usada + Archivos + Archivos recientes + + Restaurar el fichero + Restaurar los ficheros seleccionados + Restaurar todos los ficheros + La papelera se ha vaciado + Lo ficheros han sido restaurados correctamente + ¿Seguro que quieres vaciar la papelera? Los ficheros se perderan definitivamente. + La papelera está vacia + El movimiento de los elementos de la papelera de reciclaje está deshabilitado, utilice Restaurar + Mostrar la paplera de reciclaje + Ocultar la papelera de reciclaje + Abrir la papelera de reciclaje + Sáltate la papelera de reciclaje y elimina archivos directamente + + Moviendo %d elemento a la papelera + Mover %d elementos a la papelera de reciclaje + Moviendo %d elementos a la papelera + + + Importando… + Exportando… + Importación correcta + Exportación correcta + Importación fallida + Exportación fallida + La importación de algunas entradas ha fallado + La exportación de algunas entradas ha fallado + No se han encontrado entradas para importar + No se han encontrado nuevas entradas para importar + No se han encontrado entradas para exportar + Copias de seguridad + Habilitar las copias de seguridad automáticas + Gestionar las copias de seguridad automáticas + Puede utilizar los siguientes patrones para nombrar su archivo automáticamente: +\n +\n%Y - año +\n%M - mes +\n%D - día +\n%h - hora +\n%m - minuto +\n%s - segundo + + USB + Parece que tienes un dispositivo USB conectado a tu dispositivo. Para asegurar que sus archivos aparezcan correctamente, debes otorgar permisos adicionales. + Elija la carpeta raíz del dispositivo USB en la siguiente pantalla para otorgar acceso + Carpeta incorrecta, seleccione la carpeta raíz de su dispositivo USB + + Enero + Febrero + Marzo + Abril + Mayo + Junio + Julio + Agosto + Septiembre + Octubre + Noviembre + Diciembre + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept. + Oct + Nov + Dec + + en Enero + en Febrero + en Marzo + en Abril + en Mayo + en Junio + en Julio + en Agosto + en Septiembre + en Octubre + en Noviembre + en Diciembre + Lunes + Martes + Miércoles + Jueves + Viernes + Sábado + Domingo + L + M + X + J + V + S + D + Lun + Mar + Mié + Jue + Vie + Sáb + Dom + + La versión de tu aplicación ya no será actualizada. Por favor, mejora a la versión Pro para recibir nuevas correcciones y otras mejoras. + La versión de tu aplicación ya no será actualizada. Por favor, mejora a la versión Pro para recibir nuevas correcciones y otras mejoras haciendo clic aquí. + Es gratis hasta: %s. Si lo descargas hasta entonces, podrás usarlo gratis para siempre. + Más información + Actualizar + Tienes que migrar manualmente los eventos almacenados localmente mediante la exportación en un archivo .ics, y luego importarlos. Puedes encontrar los botones de exportar / importar en el menú de la pantalla principal. + Hola, +\n +\nparece que acabas de actualizar desde la versión gratuita. Una vez que estés satisfecho con ésta y hayas migrado tu configuración y favoritos, puedes desinstalar la antigua versión gratuita para evitar iniciarla accidentalmente, ya que no la necesitarás más. +\n +\n¡Gracias! + Hola, +\n +\nparece que ya tienes la versión Pro de la aplicación también. Una vez que estés satisfecho con ella y hayas migrado tus ajustes y favoritos, puedes desinstalar esta para evitar iniciarla accidentalmente, ya que no la necesitarás más. +\n +\n¡Gracias! + Hola, +\n +\nparece que acaba de actualizar desde la versión gratuita. Una vez que esté satisfecho con él y haya migrado sus datos, puede desinstalar la versión gratuita anterior para evitar iniciarla accidentalmente porque ya no la necesita. +\n +\n¡Muchas gracias! + Hola, +\n +\nparece que ya tienes la versión pro de la aplicación también. Una vez que esté satisfecho con ella y haya migrado sus datos, puede desinstalar esta aplicación. Para evitar ponerla en marcha accidentalmente porque ya no la necesitas. +\n +\n¡Muchas gracias! + Hola, +\n +\nParece que has actualizado de la versión gratuita a la versión pro. Si desea migrar los eventos almacenados localmente desde la versión gratuita, debe exportarlos manualmente como archivos .ics en la versión gratuita e importarlos a la versión profesional a través del menú superior. +\n +\nSi está satisfecho con la configuración profesional, puede desinstalar la versión gratuita anterior, ya que ya no la necesita. +\n +\n¡Gracias! + Hola, +\n +\nparece que acaba de actualizar desde la versión gratuita. Si tiene contactos guardados en \"%s\", deberá migrarlos manualmente exportándolos a un archivo .vcf en la versión gratuita de la aplicación e importándolos aquí desde el menú superior. +\n +\nUna vez que esté satisfecho con su configuración en la versión Pro, puede desinstalar la versión gratuita anterior ya que ya no la necesita. +\n +\n¡Muchas gracias! + Hola, +\n +\nparece que acaba de actualizar a partir de la versión gratuita. Si desea migrar las notas, es necesario hacerlo manualmente exportándolas a un archivo en la versión gratuita de la aplicación e importándolas aquí a través del menú superior. +\n +\nCuando esté satisfecho con su configuración de la versión Pro, puede desinstalar la antigua gratuita porque ya no la necesitará. +\n +\n¡Gracias! + + Acerca de + Website + Más aplicaciones sencillas y código fuente en + Envía tus comentarios o sugerencias a + Actualizar a Pro + Más aplicaciones + Más aplicaciones nuestras + Invitar a amigos + Hola, ven y mira %1$s en %2$s + Invitar con + Califícanos en Play Store + Puntuar + Donar + Síguenos + v %1$s +\nCopyright © Simple Mobile Tools %2$d + Soporte + Ayúdenos + Social + Otro + Política de privacidad + Versión %s + Hola :) + Hecho con ❤️ en Slovakia + Información adicional + Versión de la app: %s + SO del dispositivo: %s + +
    + Espero que estés disfrutando de la aplicación. No contiene anuncios, por lo que debe respaldar su desarrollo comprando la aplicación Simple Gracias, también evitará que este diálogo vuelva a aparecer.

    + ¡Gracias! + ]]> +
    + Hola,<br><br>espero que estés disfrutando de la aplicación. No contiene anuncios y tampoco recopilamos sus datos. Apoye su desarrollo comprando <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Gracias</a>. También desbloqueará todas las funciones de la aplicación, incluida la personalización del color.<br><br>¡Gracias! + Apóyenos comprando <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Gracias</a> por favor, también desbloqueará todas las funciones de la aplicación, incluido los colores. + Comprar + Conseguir un teléfono sencillo + Por favor, actualice Simple Gracias a la última versión + Antes de hacer una pregunta, lea las preguntas más frecuentes. Quizás la solución esté ahí. + Antes de calificarnos, verifique la configuración de la aplicación y lea primero las preguntas frecuentes. Si tiene algún problema, tal vez la solución esté ahí. + También asegúrese de estar utilizando la última versión de la aplicación. + También tenga en cuenta que esta versión de la aplicación ya no se está desarrollando, obtenga la versión Pro para obtener muchas mejoras. + Leer + Leer Preguntas Frecuentes + Hola,\n\nparece que ya has usado esta aplicación, y realmente lo apreciamos.\n\nSi te podemos pedir un favor, por favor, puntúanos en Google Play. Eso realmente nos ayudaría mucho.\n\nNo importa lo que decidas, no verás este mensaje de nuevo.\n\n¡Gracias! + Califica nuestra aplicación por favor :) + Gracias + El widget está bloqueado.\nActualice a la versión Pro para desbloquearlo. + Esta función está bloqueada, compre <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Gracias</a> por desbloquear la aplicación completa.<br <br>Es un pago único y si no está satisfecho, podemos reembolsarselo. + + +
    + sólo te informamos que recientemente se ha lanzado una nueva aplicación:

    + %2$s

    + %4$s

    + %6$s

    + Puedes descargarla presionando el título.

    + Gracias + ]]> +
    + Lanzador de Aplicaciones Simple + Calculadora Simple + Calendario Simple + Cámara Simple + Reloj Simple + Contactos Simples + Marcador Simple + Dibuja Simple + Administrador Simple de Archivos + Linterna Simple + Galería Simple + Teclado Sencillo + Lanzador sencillo + Reproductor Simple de Música + Notas Simples + Mensajero SMS Simple + Simple Gracias + Grabadora de Voz Simple + Lanzador de aplicaciones + Calculadora + Calendario + Cámara + Reloj + Contactos + Marcador + Dibujo + Administrador de archivos + Linterna + Galería + Teclado + Lanzador + Reproductor de música + Notas + Mensajero SMS + Gracias + Grabadora de voz + + aquí. + ]]> + + + Preguntas frecuentes + Antes de hacer una pregunta, primero lea las + ¿Cómo es que no veo este widget de aplicaciones en la lista de widgets? + Lo más probable es que haya movido la aplicación en una tarjeta SD. Hay una limitación del sistema Android que oculta los widgets de la aplicación dada + en ese caso. La única solución es volver a colocar la aplicación en el almacenamiento interno a través de la configuración de su dispositivo. + Quiero apoyarte, pero no puedo donar dinero. ¿Hay algo mas que pueda hacer? + + este sitio web, o simplemente contáctenos en hello@simplemobiletools.com si tiene alguna pregunta. + ]]> + + Borré algunos archivos por error, ¿cómo puedo recuperarlos? + Tristemente, no puedes. Los archivos se eliminan instantáneamente después del diálogo de confirmación, no hay papelera disponible. + No me gustan los colores del widget, ¿puedo cambiarlos? + Sí, al arrastrar un widget en la pantalla de inicio aparece una pantalla de configuración de widgets. Verá cuadrados de colores en la esquina inferior izquierda, sólo presione para elegir un nuevo color. Puede usar el control deslizante para ajustar el alfa también. + ¿Puedo de alguna manera restaurar archivos borrados? + Si realmente fueron eliminados, no puedes. Sin embargo, hay una Papelera de Reciclaje activada por defecto, esta hará que los archivos sólo sean movidos a la papelera en lugar de eliminarlos. + El icono del launcher de aplicaciones desapareció. ¿Qué puedo hacer? + Esto se debe a que el launcher no admite correctamente la personalización de iconos. Intenta lanzar la aplicación a través de Google Play o algún widget, si está disponible. + Una vez iniciado, simplemente vuelva a establecer el ícono naranja predeterminado #F57C00. Es posible que tenga que volver a instalar la aplicación en el peor de los casos. + El dinero se ha deducido de mi cuenta bancaria, pero no puedo descargar la aplicación. ¿Qué puedo hacer? + Los pagos son manejados completamente por Google, su sistema falla de vez en cuando. Simplemente borre el caché de su aplicación Google Play y reinicie su dispositivo, luego intente descargarlo nuevamente. + ¿Por qué debería actualizar a la versión Pro? + Ya que la versión de tu aplicación ya no será actualizada, los errores que tiene podrían nunca ser arreglados. Tampoco se añadirán nuevas funciones. Puedes comprar la versión Pro en Google Play por una pequeña cantidad de dinero. + Sólo pagas una vez, lo que significa que, una vez que la hayas comprado, nunca tendrás que pagar de nuevo. Incluso cuando consigas un nuevo dispositivo. Si no te gusta la versión Pro, puedes sólo desinstalarla en un periodo de unas horas y automáticamente recibirás tu dinero de vuelta. + Si quieres un rembolso en cualquier otro momento, sólo contáctanos en hello@simplemobiletools.com y lo tendrás. + ¿Cómo puedo seleccionar varios elementos a la vez? + Hay varias formas de hacerlo. La primera es iniciar el modo de selección pulsando durante mucho tiempo un elemento, luego pulse brevemente en otros elementos para seleccionarlos. La segunda forma es similar a seleccionar elementos en PCs con un ratón, + solo tiene que iniciar el modo de selección pulsando durante mucho tiempo un elemento, luego, con el dedo aún hacia abajo, arrástrelo por otros elementos para seleccionar. La tercera forma de seleccionar varios elementos es presionar durante mucho tiempo un elemento, luego presionando prolongadamente otro y todo lo demás se selecciona. Si + desea seleccionar todos los elementos, solo mantén presionado un elemento, luego pulse en el contador de elementos seleccionados en la esquina superior izquierda. Eso seleccionará o anulará la selección de todo. + He comprado la aplicación, pero no puedo descargarla en otro dispositivo. + Intenta borrando la caché de la aplicación de Google Play Store y reiniciando tu dispositivo. Es un error de Google Play, no de la aplicación. + + Contribuyentes + Traducción + Desarrollo + Otra ayuda + + este sitio web, o simplemente contáctenos en hello@simplemobiletools.com si tiene alguna pregunta. + ¡Gracias a todos los contribuyentes y otros patrocinadores! + ]]> + + Árabe + Azerbaiyan + Bengalí + Bretón + Bulgarian + Catalán + Checo + Galés + Danés + Inglés + Alemán + Griego + Español + Vasco + Persa + Finlandés + Francés + Gallego + Hindi + Croata + Húngaro + Indonesio + Italiano + Hebreo + Japonés + Coreano + Lituano + Nepalí + Noruego + Holandés + Polaco + Portugués + Rumano + Ruso + Eslovaco + Esloveno + Serbio + Sueco + Tamil + Turco + Ucraniano + Vietnamita + Chino (Hong Kong) + Chino (Simplificado) + Chino (Tradicional) + + ¡Obtén la versión Pro ahora! + Básica + Pro + Sin anuncios + Sin acceso a Internet + Garantía de devolución del 100% del dinero + Pago único + Diseño mejorado + + Editor de fotos avanzado + Editor avanzado de fotos y videos + Compatible con archivos HEIC/HEIF + Cambio de nombre de archivo por lotes avanzado + Bloqueo de carpeta individual + Compatible para impresión + + Soporte de zona horaria + Asistencia y recordatorios por correo electrónico + Importación sencilla de eventos + Nuevos widgets + + Fusión de contactos duplicados mejorada + Personalización del tamaño de fuente + Uso compartido opcional de contactos privados dentro de nuestras aplicaciones + Tonos de llamada de contacto personalizables + Filtrado de contactos + Contactos almacenados de forma privada + + Listas de verificación + Diferentes notas y colores por widget + Bloqueo de notas + + Personalización del formato de fecha y hora + Atajos de la pantalla de inicio + Soporte de compresión de archivos + Ficha con archivos recientes + + Personalización del color de fondo + Soporte de importación de archivos + Zoom + + Esta aplicación usa las siguientes bibliotecas de terceros que hacen mi vida más fácil. Gracias. + Licencias de terceros + Kotlin (Lenguaje de programación) + Subsampling Scale Image View (Visor de imágenes con zoom) + Glide (Carga y almacenamiento en caché de imágenes) + Picasso (Carga y almacenamiento en caché de imágenes) + Android Image Cropper (Recortador y rotador de imágenes) + RtlViewPager (Desplazamiento de izquierda a derecha) + Joda-Time (Remplazo a la fecha de Java) + Stetho (Depurador de bases de datos) + Otto (Bus de eventos) + PhotoView (GIFs con zoom) + PatternLockView (Protección con patrón) + Reprint (Protección con huella digital) + Gif Drawable (Carga de GIFs) + AutoFitTextView (Redimensionador de texto) + Robolectric (Framework de pruebas) + Espresso (Auxiliar de pruebas) + Gson (Convertidor de JSON) + Leak Canary (Detector de falta de memoria) + Number Picker (Selector de número personalizable) + ExoPlayer (Reproductor de video) + VR Panorama View (Mostrador de panoramas) + Apache Sanselan (Lector de metadatos de imagen) + Android Photo Filters (Filtros de imagen) + Gesture Views (Imágenes con zoom) + Indicator Fast Scroll (Letras en la barra de desplazamiento) + Event Bus (Comunicación dentro de la aplicación) + Audio Record View (Visualización de audio) + SMS MMS (Manejo de SMS y MMS) + APNG Android (Soporte WebP animado) + PDFViewPager (visor de PDF) + M3U Parser (manejo de archivos de listas de reproducción m3u) + AndroidLame (codificador de mp3) + + La prueba ha caducado + Comienza tu prueba gratuita + Su período de prueba está a punto de expirar. + Desbloquea la aplicación un último día + ¡Bienvenido a %s! + Gracias por usar nuestra aplicación. Puedes usar esta versión desbloqueada durante %d días. Considere actualizar a la versión Pro cuando finalice la prueba. La versión Pro tiene muchas funciones nuevas, un diseño moderno, sin anuncios y muchas otras mejoras. +\n +\nSolo paga una vez, y si no está satisfecho, puede desinstalarlo y recuperar su dinero. +\n +\nEspero que te guste :) + Por favor, actualice a la versión Pro para disfrutar de la aplicación al máximo. +\n +\nSólo tienes que pagar por ella una vez en la vida y si no quedas satisfecho, puedes desinstalarla y obtener un reembolso. +\n +\nNos vemos :) + + Su prueba expira en %d día. + Su prueba expira en %d días. + Su prueba expira en %d días. + + + OBSOLETO: Esta versión de la aplicación ya no es mantenida, obtén la versión Pro en https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + No olvides que si desinstalas cualquier aplicación de paga dentro de un periodo de 2 horas, automáticamente recibirás un rembolso. Si quieres un rembolso en cualquier otro momento, solo contáctanos en hello@simplemobiletools.com y lo recibirás. Eso hace que sea fácil probarlo :) + + Un grupo de aplicaciones de Android simples y de código abierto con widgets personalizables, sin anuncios y permisos innecesarios. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-et/strings.xml b/commons/src/main/res/values-et/strings.xml new file mode 100644 index 000000000..08d9ebe6b --- /dev/null +++ b/commons/src/main/res/values-et/strings.xml @@ -0,0 +1,1094 @@ + + + Sobib + Katkesta + Tagasi + Mitte midagi + Hiljem + Salvesta kui + Faili salvestamine õnnestus + Vigane failivorming + Viga: liiga vähe mälu + Viga: %s + Viga: %s + Ava rakendusega + Muuda rakendusega + Muuda + Sobivat rakendust ei leidu + Brauserit ei leidu + E-posti klienti ei leidu + Seadista kui + Kopeeri lõikelauale + Kopeeri number lõikelauale + Andmed on kopeeritud lõikelauale + Andmed on kopeeritud lõikelauale:\n%s + Helista numbrile + Tundmatu + Alati + Mitte kunagi + Üksikasjad + Märkused + Kustutame „%s“ kausta + Ükski + Silt + Läbipaistev + Läbipaistev värv + Vali mõni muu värv + Lae alla + Teavitus + Teated + E-post + Eelmine + Esita / Peata esitus + Järgmine + Arv + Kontakte ei leidu + Taotle vajalikke õigusi + Rakendusel puudub ligipääs sinu telefoniraamatule + Rakendusel puuduvad õigused kõnede alustamiseks, palun määra seadistustes vastavad õigused + Sisesta tekst siia + Helista %s + Kinnita kõne: %s + Null + Üks + Kaks + Kolm + Neli + Viis + Kuus + Seitse + Kaheksa + Üheksa + Väärtus + Väärtus ei saa tühi olla + Lisa uus kontakt + Lisa olemasolevale kontaktile + Rakendus on rikutud + Vastutusnõue + Pildista + Vali pilt + Vali video + Vali kontakt + Vali fail + Salvesta heli + Salvesta video + Uuendame… + Andmeruum telefonis + Telefonimälu (muud rakendused ei saa siia ligi) + Audio + + Sünnipäev + Aastapäev + + Kodu + Töö + + Mobiilne + Peamine + Tööfaks + Kodufaks + Piipar + Telefoninumbrit ei leidunud + + Muuda vaate tüüpi + Ruudustik + Ruudustik (Pro) + Ebaühtlane võrk + Loetelu + Suurenda veergude arvu + Vähenda veergude arvu + Veergude arv + Portree veergude arv + Maastikuline veergude arv + Muuda kaanepilti + Vali foto + + %d veerg + %d veergu + + + Halda blokeeritud telefoninumbreid + Sa pole veel ühtegi telefoninumbrit blokeerinud. + Lisa blokeeritav telefoninumber + Blokeeri number + Blokeeri telefoninumbreid + Blokeeritud telefoninumbrid + Ekspordi blokeeritud telefoninumbrid + Impordi blokeeritud telefoninumbrid + Kui soovid kasutada blokeeritud telefoninumbrite funktsionaalsust, siis peab see rakendus olema vaikimisi telefonirakendus. + Määra vaikimisi + Kas sa oled kindel, et soovid blokeerida „%s“ telefoninumbrit\? + Blokeeri kõned, kui helistaja pole aadressiraamatus + Blokeeri sõnumid, kui saatja pole aadressiraamatus + Sisestage number või muster (nt *12345*, +1*8888), et blokeerida kõik kõned ja sõnumid mustrile vastavatelt numbritelt. + Ilma helistajanäidu tuvastamise loata ei ole võimalik võõraid helistajaid blokeerida. + + Lemmikud + Lisa lemmikuks + Lisa lemmikute hulka + Eemalda lemmikute hulgast + + Otsi + Otsi siit: %s + Otsingu alustamiseks kirjuta vähemalt 2 tähemärki. + Otsi kontaktide hulgast + Otsi lemmikute hulgast + Otsi rakendusi + Otsi sündmusi + Otsi rühmi + Otsi ajaloost + Otsi seniste kõnede seast + Otsi faile + Otsi kaustu + Otsi faile ja kaustu + Otsi esitusloendeid + Otsi esitajate seast + Otsi albumite seast + Otsi lugusid + Otsi teksti + Otsi vestluste seast + Otsi salvestuste seast + + Filtreeri + Sirvi (Pro) + Ühtegi kirjet ei leidunud. + Muuda otsingufiltrit + + Vajalik on õigus kasutada andmeruumi + Vajalik on õigus kasutada telefoniraamatut + Vajalik on õigus kasutada kaamerat + Vajalik on õigus kasutada helisüsteemi + Õigused puuduvad + Selleks et rakendus saaks näidata meeldetuletusi, pead lubama tal kuvada teavitusi. + Selleks et rakendus saaks näidata edenemisriba, pead lubama tal kuvada teavitusi. + Selleks et rakendus saaks esitada muusikat, pead lubama tal kuvada teavitusi. + Selleks et rakendus saaks salvestada heli, pead lubama tal kuvada teavitusi. + Selleks et rakendus saaks näidata kõnesid, pead lubama tal kuvada teavitusi. + Selleks et rakendus saaks näidata saabunud sõnumeid, pead lubama tal kuvada teavitusi. + Anna vastavad õigused + Luba on nõutav + + Muuda faili nime + Muuda kausta nime + Faili nime muutmine ei õnnestunud + Kausta nime muutmine ei õnnestunud + Kaustal peab olema nimi + Sellise nimega kaust on juba olemas + Andmekogu juurkausta nime ei saa muuta + Kausta nime muutmine õnnestus + Muudame kausta nime + Faili peab olema nimi + Faili nimes on valesid tähemärke + „%s“ faili nimes on valesid tähemärke + Faililaiend ei tohi olla puudu + Lähtefaili %s pole olemas + Lisa faili nimele prefiks + Lisa faili nimele suffiks + Lihtne ümbernimetamine + Muster + String lisada + %Y - aasta +\n%M - kuu +\n%D - päev +\n%h - tund +\n%m - minut +\n%s - sekund +\n%i - loendur alates 1\'st + Faili nimi (ilma .txt laiendita) + Faili nimi (ilma .json laiendita) + Faili nimi (ilma .zip laiendita) + Alates Android 11-st ei saa enam selliseid faile ja kaustu peita + + Kopeeri + Teisalda + Kopeeri / Teisalda + Kopeeri asukohta + Teisalda asukohta + Allikas + Sihtkoht + Vali sihtkaust + Sihtkausta valimiseks klõpsa siin + Valitud sihtkausta ei saanud kirjutada + Palun vali sihtkaust + Lähtekaust ja sihtkaust ei saa olla samad + Failide kopeerimine ei õnnestunud + Kopeerime… + Failide kopeerimine õnnestus + Faili kopeerimine õnnestus + Tekkis viga + Teisaldame… + Failide teisaldamine õnnestus + Faili teisaldamine õnnestus + Mõnda faili ei saanud teisaldada + Mõnda faili ei saanud kopeerida + Ühtegi faili pole valitud + Salvestame… + %s kausta loomine ei õnnestunud + %s faili loomine ei õnnestunud + Uusi objekte ei leidu + Sihtkausta andmekandjal pole piisavalt ruumi.\nVajalik on %1$s, aga leidub %2$s + Süsteemne teenus failide ja kaustade valimiseks pole saadaval + + Loo uus + Kaust + Faili + Loo uus kaust + Selle nimega fail või kaust on juba olemas + Nimes leidub valesid tähemärke + Palun sisesta nimi + Tekkis tundmatu viga + + „%s“ fail on juba olemas + „%s“ fail on juba olemas, kas kirjutame üle\? + „%s“ kaust on juba olemas + Ühinemine + Jäta mõlemad alles + Kirjuta üle + Jäta vahele + Lisa nimele _1 + Kohalda kõigile + Selles kaustas pole toimingud lubatud, palun vali mõni muu kaust + Süsteem ei võimalda sellesse kausta kopeerida, palun vali mõni muu kaust + Süsteem ei võimalda selle kausta nime muuta + Kaustu ei saa ümber nimetada otse sisemälus, seda saad teha ainult alamkaustades + Selle kausta nime ei saa muuta + + Vali kaust + Vali fail + Kinnita juurdepääs välisele salvestusruumile + Luba ligipääs kaustale + Ligipääsu lubamiseks palun vali järgmises vaates SD-kaardi juurkaust + Kui sa SD-kaarti ei näe, siis proovi sellist võimalust + Valitud salvestusruumile ligipääsu saamiseks vali järgmise vaate allosas „Kasuta seda kausta“. + Vajutades järgmise vaate all ääres asuvat „Kasuta seda kausta“ luba ligipääs „%s“ kaustale. + Uue kausta loomiseks palun klõpsi järgmise vaata all ääres olevat „Salvesta“ nuppu. + Kinnita valik + Laadin… + Palun anna rakendusele õigused lugeda kõiki sinu faile, vastasel juhul ta ei toimi eriti hästi. + + %d Üksuse + %d esemed + + + + %d Üksuse + %d esemed + + + Kustutame %d kirje + Kustutame %d kirjet + + + + %d kontakt + %d kontaktid + + + Vali salvestusruum + Andmehoidla + Sisemine + SD-kaart + Juur + Valisid vale kausta, palun vali SD-kaardi juurkaust, mis on kõige esimene kaust + SD-kaardi ja USB-seadme asukohad ei saa olla samad + Tundub, et oled rakenduse paigaldanud SD-kaardile, mis muudab rakenduse vidinad mittekasutatavateks. Sa isegi ei näe neid olemasolevate vidinate nimekirjas. Tegemist on süsteemipiiranguga, seega kui soovid vidinaid kasutada, pead rakenduse tagasi sisemällu tõstma. + Valisid vale kausta, palun vali „%s“ + + Omadused + Asukoht + Kirjeid valitud + Sisalduvate asukohtade arv + Faile kokku + Resolutsioon + Kestus + Kunstnik + Album + Fookuskaugus + Säriaeg + ISO kiirus + F-arv + Kaamera + EXIF + Pala pealkiri + GPS-koordinaadid + Kõrgus + Kustuta EXIF-väljad + Kas sa oled kindel, et soovid kustutada EXIF väljade väärtused nagu näiteks asukoha koordinaadid, kaamera mudel, jmt\? + EXIF-väljade kustutamine õnnestus + + Taustavärv + Teksti värvus + Põhivärv + Valge teema aktsentvärv + Mustvalge teema aktsentvärv + Esiplaani värv + Rakenduse ikooni värv + Alumise navigeerimisriba värv + Taasta algseaded + Kasuta vaikimisi väärtust + Vaikimisi + Muuda värvi + Teema + Värvi muutmisega võtad kasutusele kohandatud värviteema + Salvesta + Loobu + Tühista muudatused + Kas oled kindel, et soovid oma muudatusi tühistada\? + Seda tegevust ei saa tagasi pöörata. + Sul on salvestamata muudatusi. Kas salvestame enne väljumist\? + Kasuta samu värvi kõikides Lihtsate tarvikute rakendsustes + HOIATUS: Mõned käivitajad ei käsitse rakenduste ikoonide kohandamist korralikult. Kui ikoon kaob, proovige käivitada rakendus Google Play või mõne vidina kaudu, kui see on saadaval. Kui olete käivitanud rakenduse, seadistage lihtsalt vaikimisi oranž ikoon #F57C00 tagasi. Halvemal juhul peate rakenduse võib-olla uuesti installima. + Värvide uuendamine õnnestus. Lisasime uue „Jagatud“ teema - edaspidisel värvide muutmisel palun kasuta seda. + Kuigi sa kasutad rakenduse Pro-versiooni, palun siiski tehnilistel põhjustel paigalda rakendus „Lihtne tänuavaldus“. Muu hulgas tema haldab värvide sünkroniseerimist kõikide meie rakenduste vahel. + Selle funktsionaalsuse kasutamiseks ja meie toetamiseks palun osta <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Lihtne tänuavaldus</a>. Tänud juba ette! + + Hele + Tume + Automaatne + Määra hele või tume teema automaatselt + Päikese käes + Tumepunane + Valge + Must-valge + Kohandatud + Jagatud + Süsteemi vaikimisi + + Mida on meil uut + * siin on kirjas vaid suuremad muudatused, kuid alati oleme teinud ka pisikohendusi + + Kustuta + Eemalda + Muuda nime + Jaga + Jaga rakendusega + Muuda suurust + Vali kõik + Vali tekst + Peida + Näida peidetud + Peida kaust + Näita peidetud kausta + Näita peidetuid ajutiselt + Lõpeta peidetud meedia näitamine + Nii palju sisu korraga jagada ei saa + Tühjenda prügikast ja eemalda ta kasutusest + Pööra tegevus tagasi + Korda tegevust + Trüki + Trüki (Pro) + Otsetee + Loo otsetee + Loo otsetee (Pro) + Lisa kontaktnumber + Vaata kontaktandmeid + Kõne SIM-kaardilt 1 + Kõne SIM-kaardilt 2 + Muuda failinime nähtavust + Tõsta kõige ülemiseks + Tõsta kõige alumiseks + Pin üksus + Eemalda klammerdus + Saada SMS sõnum + Saada e-kiri + Helista + Kontakti üksikasjad + Lisa kontakt + Taustapildid + + Sordi + Nimi + Suuruse alusel + Viimati muutmise alusel + Loomise aja alusel + Pildistamise aja alusel + Pealkiri + Faili nimi + Faili tüüp + Juhuslik + Sorteeri juhuslikult + Kasvavalt + Kahanevalt + Kasuta vaid selles kaustas + Sorteeri numbrilised osad tegeliku väärtuse alusel + Eesnimi + Keskmine nimi + Perenimi + Täielik nimi + Kasuta kohandatud sortimist + Muuda järjekorda + + Kas oled kindel, et soovid kustutamist jätkata\? + Kas sa oled kindel, et soovid %s kustutada\? + Delete %s? + + Kas sa oled kindel, et soovid %s visata prügikasti\? + + Kas sa oled kindel, et soovid selle faili kustutada\? + Kas sa oled kindel, et soovid selle faili prügikasti visata\? + Selles sessioonis ära rohkem seda küsi + Ära näita uuesti + Jah + Ei + Võib-olla + + Hoiatus: Oled kustutamas %d kausta + Hoiatus: Oled kustutamas %d kaustad + + + PIN + Sisesta PIN + Palun sisesta PIN-kood + Vale PIN-kood + Korda PIN-koodi + Muster + Joonista muster + Vale muster + Korda mustrit + Biomeetria + Sõrmejälg + Lisa sõrmejälg + Palun aseta sõrm sõrmejäljeandurile + Ava biomeetrilise tuvastamise vaade + Autendi + Autentimine ei õnnestunud + Autentimine on blokeeritud, palun proovi mõne hetke pärast uuesti + Sul ei ole ühtegi sõrmejälge salvestatud, palun lisa need nutiseadme seadistustes + Ava seadistused + Salasõna seadistamine õnnestus. Juhul, kui unustad salasõna, siis paigalda rakendus uuesti. + Turvamise seadistamine õnnestus. Juhul, kui tema lähtestamisel tekib vigu, siis paigalda rakendus uuesti. + Lukusta kaust + Lukusta kaust (Pro) + Eemalda kausta lukustus + See turvameede toimib vaid selles rakenduses ega ole mõeldud asendama süsteemiülest krüptimist. + + Eile + Täna + Homme + Iga päev + Peida aasta + sekundit + Minutit + tundi + päevad + s + m + h + wk. + + %d sekund + %d sekundit + + + %d minut + %d minutit + + + %d tund + %d tundi + + + %d päev + %d päeva + + + %d nädal + %d nädalat + + + %d kuu + %d kuud + + + %d aasta + %d aastat + + + + %d sekundi pärast + %d sekundit pärast + + + %d minut + %d minutit + + + %d tund pärast + %d tundi pärast + + + %d päev pärast + %d päeva pärast + + + %d nädal pärast + %d nädalat pärast + + + %d kuu pärast + %d kuud pärast + + + %d aasta pärast + %d aastat pärast + + + + %d sekund varem + %d sekundit varem + + + %d minut varem + %d minutit varem + + + %d tund varem + %d tundi varem + + + %d päev varem + %d päeva varem + + + %d nädal varem + %d nädalat varem + + + %d kuu varem + %d kuud varem + + + %d aasta varem + %d aastat varem + + + + %d sekund võrra + %d sekundit võrra + + + %d minut + %d minutit + + + %d tund võrra + %d tundi võrra + + + %d päev võrra + %d päeva võrra + + + %d nädal võrra + %d nädalat võrra + + + %d kuu võrra + %d kuud võrra + + + %d aasta võrra + %d aastat võrra + + + Äratuseni jäänud aeg:\n%s + Meeldetuletuseni jäänud aeg:\n%s + Järelejäänud aeg: +\n%s + Palun veendu, et alarm töötab korralikult, enne kui sa sellega arvestad. Alarm võib aku säästmisega seotud süsteemipiirangute tõttu valesti käituda. + Palun veendu, et meeldetuletused töötavad korralikult, enne kui sa sellega arvestad. Kontrolli oma nutiseadme aku ja teavituse seadistusi, kas midagi ei blokeeri meeldetuletusi ega sulge taustal töötavat rakendust. + Selle rakenduse teavitused on välja lülitatud. Nende lubamiseks ava oma nutiseadme seadistused. + + Häire + Tukasta + Jäta vahele + Meeldetuletus puudub + Käivitamisel + Süsteemi helid + Sinu helid + Lisa uus heli + Heli pole + Päeval kell hh:mm + Päeval kell %02d:%02d + + Seadistused + Osta rakendus „Lihtne tänuavaldus“ + Üldine + Värvide kohendamine + Võimalus värvide detailseks kohendamiseks + Muuda rakenduse värve + Muuda rakenduse värve (Lukustatud) + Lukus + Muuda vidina värve + Kohenda teavitusi + Notification sound + Kasuta inglise keelt + Keel + Näita peidetud valikuid + Kirjasuurus + Väike + Keskmine + Suur + Eriti suur + Kaitse peidetud andmete nähtavust salasõnaga + Kaitse salasõnaga kogu rakendust + Kaitse salasõnaga failide kustutamist ja teisaldamist + Failide haldamisel jäta alles ka vanatüübiline „viimati muudatud“ ajatempel + Kerimisriba sikutamisel näita kirjetekohast infomulli + Kui rakendus on avatud ja kasutusel, siis takista telefoni uinumist + Kustutamisel ära mitte kunagi küsi topeltkinnitust + Ülalt alla sikutamisel värskenda andmeid + Kasuta 24-tunni ajavormingut + Muuda kuupäeva ja kellaaja vormingut + Nädal algab pühapäevaga + Vidinad + Alati kasuta sama tukastamise aega + Tukastamise aeg + Nupuvajutusel vibreeri + Kustutamise asemel viska failid prügikasti + Prügikasti tühjendamise välp + Tühjenda prügikast + Kasuta ainult püstvaadet + Ekspordi seadistused + Impordi seadistused + Seadistuste eksport õnnestus + Seadistuste import õnnestus + Alusta nime perenimega + Kustuta puhverdatud andmed + Enne kõne alustamist näita kinnitusvaadet + + Nähtavus + Turvalisus + Kerimine + Tegevused failidega + Prügikast + Salvestame + Käivitamine + Tekst + Migreerimine + Kvaliteet + Põhivaade + Pisipildid + Nimekirja vaade + + Välista + Välista kaust + Välistatud kaustad + (välistatud) + Halda välistatud kaustu + Eemalda kõik + Kas eemaldame kõik kaustad välistatud kaustade loendist\? See tegevus ei kustuta kaustu. + Näita ajutiselt välja jäetud + Lõpeta näitamine välistatud + + Halda näidatavaid vahekaarte + Rakenduse avamisel kuvatav vahekaart + Kontaktid + Lemmikud + Kõnede ajalugu + Rühmad + Viimatikasutatu + Failid + Hiljutine failid + + Taasta see fail + Taasta valitud failid + Taasta kõik failid + Prügikasti tühjendamine õnnestus + Failide taastamine õnnestus + Kas oled kindel, et soovid prügikasti tühjendada\? Failid lähevad lõplikult kaduma. + Prügikast on tühi + Prügikastis olevaid faile ei saa mujale tõsta, palun kasuta taastamist + Näita prügikasti + Peida prügikast + Ava prügikast + Ära viska faile prügikasti, vaid kustuta nad kohe jäädavalt + + Viskan %d faili prügikasti + Viskan %d faili prügikasti + + + Impordime… + Ekspordime… + Importimine õnnestus + Eksportimine õnnestus + Importimine ei õnnestunud + Eksportimine ei õnnestunud + Mõnede kirjete importimine ei õnnestunud + Mõnede kirjete eksportimine ei õnnestunud + Ühtegi importimiseks sobilikku kirjet ei leidu + Ühtegi uut kirjet importimiseks ei leidunud + Ühtegi eksportimiseks sobilikku kirjet ei leidu + Varundus + Kasuta automaatset varundust + Halda automaatset varundust + Failide nimede automaatsel loomisel saad kasutada järgnevaid asendusi: +\n +\n%Y - aasta +\n%M - kuu +\n%D - päev +\n%h - tund +\n%m - minut +\n%s - sekund + + USB + Tundub, et sinu nutiseadme küljes on USB-seade. Selleks, et seal asuvad failid oleks korrektselt loetavad, pead lubama täiendavad õigusi. + Palun valige järgmisel ekraanil USB-seadme ülemine kaust, et anda juurdepääs + Valisid vale kausta, palun vali USB-seadme juurkaust + + Jaanuar + Veebruar + Märts + Aprill + Mai + Juuni + Juuli + Augusti + Septembril + Oktoober + November + Detsember + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + jaanuaris + veebruaris + märtsis + Aprillis + Maikuus + Juunis + Juulis + Augustis + Septembris + Oktoobris + Novembris + Detsembris + Esmaspäev + Teisipäev + Kolmapäev + Neljapäev + Reede + Laupäev + Pühapäev + M + T + W + T + F + S + S + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + Seda rakenduse versiooni me enam ei uuenda. Täiendused ja parandused leiad nüüd Pro-versioonist. + Sellele rakenduse versioonile enam uuendusi ei lisandu. Kui soovid parandusi ja täiendusi, siis klõpsates siin võta kasutusele Pro-versioon. + See rakendus on tasuta kuni %s. Kui laadid ta alla enne seda, siis on ta tasuta kasutamiseks ilma ajalise piiranguta. + Lisateave + Uuenda + Palun tõsta kohalikku andmekogusse salvestatud sündmused uude rakendusse kasutades eksportimist .ics faili ning seejärel importimist saast failist. Vastavad eksportimise/importimise nupud leiad põhivaates asuvast rakenduse menüüst. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Tere, +\n +\nTundub, et sa just uuendasid tasuta versioonist. Kui oled selle versiooniga rahul ja võib-olla oled ka vanad andmed üle viinud, siis võid eelmise tasuta versiooni eemaldada ja seeläbi vältida selle mittevajaliku versiooni juhuslikku käivitamist. +\n +\nAitäh! + Hei, +\n +\ntundub, et sul on juba olemas ka rakenduse Pro-versioon. Kui sa oled selle versiooniga rahul ning oled andmed üle tõstnud, siis vältimaks rakenduste risti-rästi kasutamist võid selle teise eemaldada. +\n +\nTänud! + Hello, +\n +\nTundub, et sa oled just teinud uuenduse tasuta versioonist. Kui sa soovid vanas rakenduses salvestatud sündmused uude kolida, siis ekspordi nad vanast tasuta rakendusest .ics failina ning siin uues rakenduses impordi nad ülamenüüs leiduvast valikust. +\n +\nKui sa oled Pro-versiooniga rahul ja kuna vana versiooni enam vaja pole, siis võid selle eelmise versiooni eemaldada. +\n +\nTänud! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Rakenduse teave + Veebileht + Lähtekoodi leiad siit + Oma tagasiside ja ettepanekud palun saada e-posti aadressile + Võta kasutusele Pro versioon + Vaata kõiki meie rakendusi + Vaata kõiki meie rakendusi + Kutsu sõpru kasutama seda rakendust + Hei, palun vaata, kas sulle meeldiks selline rakendus - %1$s, mille leiad %2$s saidist + Saada kutse rakendusega + Hinda meid + Hinda + Toeta meid + Jälgi meid + v %1$s +\nAutoriõigus © Lihtsad mobiilsed tööriistad %2$d + Kasutajatugi + Osale arenduses + Sotsiaalmeedia + Muud + Privaatsuspoliitika + Versioon %s + Hei :) + Tehtud Slovakkias suure ❤️\'ga + Lisateave + Rakenduse versioon: %s + Seadme operatsioonisüsteem: %s + Tere,<br><br> loodan, et naudite rakendust. See ei sisalda reklaame, palun toetage selle arendamist, ostes <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Limple Aitäh</a> rakendus, see takistab ka selle dialoogi uuesti ilmumist. <br><br> Täname! + Tere!<br><br>Loodan, et teile meeldib see rakendus. Ta ei sisalda reklaame ja me ei kogu ka sinu andmeid. Palun toeta meie arendustegevust, ostes rakenduse <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Lihtne tänuavaldus</a>. Seejärel muutuvad kasutatavaks ka rakenduse lisafunktsionaalsused ja värvide kohandamine.<br><br>Täname! + Palun toeta meid ostes rakenduse <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Lihtne tänuavaldus</a>. Muu hulgas avab see antud rakenduse kõik funktsionaalsused ja sealhulgas võimaldab kohandada liidese värve. + Osta + Telli rakendus Lihtne telefon + Palun uuenda raklendus Lihtne tänuavaldus viimase versioonini + Enne küsimuse esitamist kontrollige rakenduse seadeid ja lugege esmalt Korduma kippuvad küsimused. Võib-olla on lahendus seal olemas. + Enne kui hindate meid, kontrollige palun rakenduse seadeid ja lugege esmalt Korduma kippuvad küsimused. Kui teil on mingeid probleeme, võib-olla on lahendus seal. + Lisaks palun kontrolli, et kasutad rakenduse viimast versiooni. + Pange ka tähele, et seda rakenduse versiooni enam ei arendata, hankige Pro versioon, mis sisaldab palju täiustusi. + Loe järgnevat + Loe korduma kippuvaid küsimusi + Tere, +\n +\ntundub, et kasutate seda rakendust juba mõnda aega ja me hindame seda väga kõrgelt. +\n +\nKui me võime paluda teilt teeneid, siis palun hinnake meid Google Play\'s. See aitaks meid tõesti palju. +\n +\nÜkskõik, kuidas te otsustate, te ei näe seda sõnumit enam. +\n +\nAitäh! + Palun hinda meie rakendust :) + Suur tänu + Rakendus on lukustatud. +\nLukustuse eemaldamiseks palun uuenda ta Pro-versioonini. + See funktsioon on lukus, palun ostke <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Limple Aitäh</a> kogu rakenduse avamise <br><br>eest.See on ainult ühekordne makse ja kui te ei jää rahule, saame teile raha tagasi maksta. + + Hei,<br><br> tahtsime lihtsalt teada anda, et oleme teinud mõned uued rakendused :<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Klõpsides ikooni või nimel saad sa neid alla laadida.<br><br> Tänud + Lihtne rakenduste käivitaja + Lihtne kalkulaator + Lihtne kalender + Lihtne kaamera + Lihtne kell + Lihtsad kontaktid + Lihtne telefon + Lihtne joonistaja + Lihtne failihaldur + Lihtne taskulamp + Lihtne galerii + Lihtne klahvistik + Lihtne käivitaja + Lihtne muusikamängija + Lihtsad märkused + Lihtne SMS sõnumiklient + Lihtne tänuavaldus + Lihtne helisalvestaja + Rakenduste käivitaja + Kalkulaator + Kalender + Kaamera + Kell + Kontaktid + Telefon + Joonistaja + Failihaldur + Taskulamp + Galerii + Klahvistik + Rakenduste käivitaja + Muusikamängija + Märkused + SMS sõnumid + Suur tänu + Helisalvestaja + Tundub sinu hetkel kasutatav rakenduse variant on vigane. Palun laadi algupärane versioon <a href=%s>siit</a>. + + Korduma kippuvad küsimused + Enne küsimuse kirjutamist palun loe esmalt järgnevat lehte + Kuidas ma ei näe seda rakenduste vidinat kõikide vidinate loendis\? + Tõenäoliselt juhtus nii, et teisaldasid rakenduse SD-kaardile. On olemas Android-süsteemi piirang, mis sellisel juhul peidab antud rakenduse vidinad. Ainus lahendus on teisaldada rakendus tagasi sisemälusse kasutades nutiseadme seadistusi. + Ma tahan teid toetada, kuid ma ei saa raha annetada. Kas ma saan veel midagi teha\? + Jah, muidugi. Sa saad rakendust teistele tutvustada või anda head tagasisidet ja hinnanguid. Samuti saad aidata ka rakenduste tõlkimisega uude keelde või lihtsalt mõne olemasoleva tõlke ajakohastamisega. Tõlkimise juhend asub <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>siin lehel</a> või küsimuste puhul lihtsalt võta meiega ühendust aadressil <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>. + Ma kustutasin kogemata mõned failid, kuidas saan neid taastada\? + Kahjuks ei saa. Failid kustutatakse koheselt pärast topeltkinnitust ning prügikasti ei ole kasutusel. + Mulle ei meeldi vidinate värvid, kas ma saan neid muuta\? + Jah, kui lohistad vidinat oma koduekraanile, ilmub vidina seadistusvaade. Sa näed vasakus alumises nurgas värvilisi ruute, ning uue värvi valimiseks vajuta neid. Lisaks saade läbipaistvuse kohendamiseks kasutada liugurit. + Kas ma mingil viisil saan kustutatud faile taastada\? + Kui need on tõesti kustutatud, ei saa sa seda teha. Siiski on vaikimisi kasutusel prügikast ning kustutatud failid esialgu teisaldatakse sinna. + Rakenduse käivitaja ikoon kadus. Mida ma saan teha\? + Selle põhjuseks on see, et teie käivitaja ei toeta ikoonide kohandamist korralikult. Proovige käivitada rakendus Google Play või mõne vidina kaudu, kui see on saadaval. Kui olete käivitanud, seadistage lihtsalt tagasi vaikimisi oranž ikoon #F57C00. Halvemal juhul peate rakenduse võib-olla uuesti installima. + Raha on minu pangakontolt maha kantud, kuid ma ei saa rakendust alla laadida. Mida ma saan teha\? + Makseid teostab täielikult Google, nende süsteemis esineb aeg-ajalt tõrkeid. Lihtsalt tühjendage oma Google Play rakenduse vahemälu ja taaskäivitage seade, seejärel proovige uuesti alla laadida. + Miks peaksin uuendama Pro-versiooni\? + Kuna teie rakenduse versiooni enam ei uuendata, siis ei parandata kunagi teie poolt avastatud vigu. Samuti ei lisata uusi funktsioone. Pro-versiooni saate osta Google Play\'st väikese summa eest. See on ühekordne makse, mis tähendab, et kui olete selle ostnud, ei pea te enam kunagi maksma. Isegi mitte pärast uue seadme soetamist. Kui Pro-versioon ei meeldi teile, saate selle mõne tunni jooksul lihtsalt eemaldada ja saate automaatselt oma raha tagasi. Kui soovite tagasimakseid igal ajal hiljem, võtke meiega ühendust aadressil hello@simplemobiletools.com ja te saate selle. + Kuidas ma saan valida mitu objekti korraga\? + Selleks on mitu võimalust. Esimene neist on valikurežiimi käivitamine, vajutades pikalt ühe objektile ja seejärel teiste valimiseks lühikese klõpsuga. Teine viis on sarnane arvutite elementide valimisega hiirega, lihtsalt käivitage valikurežiim, vajutades pikalt ühele elemendile, seejärel lohistage sõrmega üle teiste elementide valimiseks. Kolmas viis mitme elemendi valimiseks on ühe elemendi pikalt vajutamine, seejärel teise elemendi pikalt vajutamine ja kõik vahepealsed elemendid valitakse. Kui soovite valida kõik elemendid, vajutage lihtsalt pikalt ühe elemendi peale, seejärel klõpsake vasakus ülanurgas asuval valitud elemendi loenduril. See valib või tühistab kõigi valikute valiku. + Ma olen rakenduse ostnud, kuid ma ei saa seda teise seadmesse alla laadida. + Proovige tühjendada Google Play rakenduse vahemälu ja taaskäivitada seade. See on mingi Google Play tõrge, mis ei ole tegelikult seotud rakenduse endaga. + + Kaasautorid + Tõlked + Arendus + Muu abi + See loendis on kõik, kes aitasid märgatavalt arendada või tõlkida mis tahes rakendust komplektis „Lihtsad nutitarvikud“. Tõlkimisega tegelevad vabatahtlikud, anna meile teada, kui soovid ka osaleda. Tõlkimise juhend asub <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>meie Github\'i lehel</a> või kui sul on küsimusi, siis võta meiega ühendust aadressil <href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>. Aitäh kõigile panustajatele ja teistele toetajatele! + Araabia + Aserbaidžaan + Bengali + Bretooni + Bulgaaria + Katalaani + Tšehhi + Walesi + Taani + English + Saksa + Kreeka + Hispaania + Baski + Pärsia + Soome + Prantsuse + Galicia + Hindi + Horvaatia + Ungari + Indoneesia + Itaalia + Heebrea + Jaapani + Korea + Leedu + Nepali + Norra + Hollandi + Poola + Portugali + Rumeenia + Vene + Slovakkia + Sloveenia + Serbian + Rootsi + Tamil + Türgi + Ukraina + Vietnami + Hiina (Hongkong) + Hiina keel (lihtsustatud) + Hiina (traditsiooniline) + + Osta Pro-versioon nüüd! + Põhiline + Pro + Ei mingeid reklaame + Interneti-ühendus puudub + 100% raha tagasi garantii + Ühekordne makse + Parem disain + + Täiustatud fototöötlusprogramm + Täiustatud foto- ja videotöötlusprogramm + HEIC/HEIF failide tugi + Mitme faili nime korraga muutmine + Üksikute kaustade lukustamine + Trükkimise tugi + + Ajavööndite tugi + Osalejad ja e-posti teel saadetavad meeldetuletused + Lihtne sündmuste importimine + Uued vidinad + + Täiustatud topeltkontaktide ühendamine + Kirjasuuruse kohandamine + Valikuline privaatsete kontaktide jagamine meie rakenduste vahel + Kohandatavad helinad kontaktidele + Kontaktide otsing + Privaatselt salvestatud kontaktid + + Tööde loendid + Erinevad märkmed ja värvid iga vidina kohta + Märkmete lukustamine + + Kuupäeva ja kellaaja vormingu kohandamine + Lingid avavaates + Faili pakkimise tugi + Värskete failide vahekaart + + Taustavärvi kohandamine + Failide impordi tugi + Suumimine + + Et arendajate töö oleks tõhusam ja lihtsam, on selles rakenduses kasutusel järgnevad kolmandate osapoolte teegid. Tänud. + Kolmandate osapoolte litsentsid + Kotlin (programmeerimiskeel) + Subsampling Scale Image View (piltide suumitavad vaated) + Glide (piltide laadimine ja puhverdamine) + Picasso (piltide laadimine ja puhverdamine) + Android Image Cropper (piltide kadreerimine ja pööramine) + RtlViewPager (viipamine paremalt vasakule) + Joda-Time (asendus Java kuupäevadele) + Stetho (andmebaaside silumine) + Otto (sündmuste siin) + PhotoView (suumitavad GIF-failid) + PatternLockView (ekraanilukustus) + Reprint (sõrmejälgede kaitse) + Gif Drawable (GIF-failide laadimine) + AutoFitTextView (teksti suuruse muutmine) + Robolectric (ühiktestimise raamistik) + Espresso (testimise abirakendus) + Gson (JSON\'i süntaksianalüüs) + Leak Canary (mälulekete tuvastaja) + Number Picker (kohandatav numbrivalija) + ExoPlayer (videote esitaja) + VR Panorama View (panoraamvaadete esitaja) + Apache Sanselan (piltide metainfo lugeja) + Android Photo Filters (pildifiltrid) + Gesture Views (suumitavad pildid) + Indicator Fast Scroll (tähtede kasutamine kerimisribal) + Event Bus (rakendusesisene suhtlus) + Audio Record View (heli visualiseerimine) + SMS MMS (SMS- ja MMS-sõnumite käsitlemine) + APNG Android (animeeritud WebP tugi) + PDFViewPager (PDF failide kuvamise teek) + M3U Parser (m3u esitusloendi käitleja) + AndroidLame (mp3 kodeerija) + + Prooviperiood on lõppenud + Alusta tasuta prooviperioodi + Selle rakenduse prooviperiood lõppeb peagi. + Luba lukustatud rakendust kasutada veel ühe viimase päeva + Tere tulemast %s kasutajaks! + Täname, et võtsid kasutusele meie rakenduse. Praeguses olekus on ta pruugitav %d päeva. Kui testperiood lõppeb, siis palun kaalu uuendust Pro-versiooniks. Sellel palju lisavõimalusi, moodne kujundus, reklaamivaba lahendus ning paljugi veel. +\n +\nSa maksad Pro-versiooni eest vaid ühe korra ning kasutad seda nii kaua kui soovid. Kui sa pole rakendusega rahul, siis eemalda ta oma nutiseadmest ja küsi makstud summa tagasi. +\n +\nLoodetavasti see rakendus meeldub sulle :) + Palun uuenda Pro-versiooniks ja kasuta rakendust täisfunktsionaalsuses. +\n +\nSa maksad Pro-versiooni eest vaid ühe korra ning kasuta seda nii kaua kui soovid. Kui sa pole rakendusega rahul, siis eemalda ta oma nutiseadmest ja küsi makstud summa tagasi. +\n +\nKohtume õige varsti :) + + Selle rakenduse prooviperiood lõppeb %d päeva pärast. + Selle rakenduse prooviperiood lõppeb %d päeva pärast. + + + AEGUNUD: Selle rakenduse versiooni arendus on lõppenud, laadi PRO-versioon aadressilt https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Palun arvesta, et kui eemaldad tasulise rakenduse nutiseadmest 2 tunni jooksul, siis ostusumma tagastatakse automaatselt. Kui soovit tagastust hiljem, siis saada e-kiri hello@simplemobiletools.com aadressile ning korraldame tagastuse. Mõlemal juhul on sul võimalik meie tasulisi rakendusi testida :) + + Arendame Androidi jaoks avatud lähtekoodil põhinevaid lihtsaid tarvikuid ja milles pole reklaame ega vajadust asjatute õiguste jaoks. + \ No newline at end of file diff --git a/commons/src/main/res/values-eu/strings.xml b/commons/src/main/res/values-eu/strings.xml new file mode 100644 index 000000000..448732990 --- /dev/null +++ b/commons/src/main/res/values-eu/strings.xml @@ -0,0 +1,1093 @@ + + + Ados + Utzi + Back + Nothing + Later + Gorde honela… + Fitxategia ondo gorde da + Fitxategi-formatu baliogabea + Memoriarik gabe errorea + Errorea gertatu da: %s + Error: %s + Ireki honekin… + Editatu honekin… + Edit + Ez da baliozko aplikaziorik aurkitu + No browser found + No email client found + Ezarri honela… + Kopiatu arbelera + Kopiatu zenbakia arbelera + Balioa arbelera kopiatu da + Balioa arbelera kopiatu da:\n%s + Markatzeko zenbakia + Ezezaguna + Beti + Inoiz ez + Xehetasunak + Oharrak + \'%s\' karpeta ezabatzen + Bat ere ez + Etiketa + Gardena + Kolore gardena + Hautatu kolore ezberdina + Deskargatu + Jakinarazpena + Notifications + Eposta + Aurrekoa + Erreproduzitu / Pausatu + Hurrengoa + Zenbakia + Ez da kontakturik aurkitu + Eskatu behar diren baimenak + Aplikazioak ezingo da kontaktuetan sartu + App does not have the permission to initiate phone calls, please grant it in the device settings + Txertatu testua hemen + %s deitu + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Atera argazkia + Hautatu argazkia + Choose video + Choose contact + Choose file + Record audio + Record video + Eguneratzen… + Telefono memoria + Telefono memoria (beste aplikazioentzat ikustezina) + Audio + + Urtebetetzea + Urteurrena + + Etxea + Lana + + Mugikorra + Nagusia + Laneko faxa + Etxeko faxa + Pager + Ez da telefono zenbakirik aurkitu + + Aldatu ikuspegi mota + Sareta + Sareta (Pro) + Uneven Grid + Zerrenda + Gehitu errenkadak + Gutxitu errenkadak + Column count + Portrait column count + Landscape column count + Aldatu azaleko argazkia + Hautatu argazkia + + %d column + %d columns + + + Kudeatu blokeatutako zenbakiak + Ez duzu inor blokeatu. + Gehitu blokeatutako zenbakia + Blokeatu zenbakia + Blokeatu zenbakiak + Blokeatutako zenbakiak + Export blocked numbers + Import blocked numbers + Blokeatutako zenbakiak erabiltzeko aplikazio honek markatzaile-aplikazio lehenetsia izan behar du. + Ezarri lehenetsi gisa + Ziur zaude \"%s\" blokeatu nahi duzula? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Gogokoak + Gehitu gogokoak + Gehitu gogokoetara + Kendu gogokoetatik + + Bilatu + Search in %s + Idatzi gutxienez 2 karaktere bilatzen hasteko. + Search contacts + Search favorites + Search apps + Search events + Bilatu taldeak + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Iragazkia + Iragazkia (Pro) + Elementurik ez da aurkitu. + Aldatu iragazkia + + Biltegiratzerako baimena behar da + Kontaktuetarako baimena behar da + Kamerarako baimena behar da + Audiorako baimena behar da + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Berrizendatu fitxategia + Berrizendatu karpeta + Ezin izan da fitxategi hori berrizendatu + Ezin izan da karpeta hori berrizendatu + Karpetaren izenak ezin du hutsik egon + Izen hori duen karpeta badago + Ezin da biltegiratzearen erro-karpeta berrizendatu + Karpeta ondo berrizendatu da + Karpeta berrizendatzen + Fitxategi-izenak ezin du hutsik egon + Fitxategi-izenak karaktere baliogabeak ditu + \'%s\' fitxategi-izenak karaktere baliogabeak ditu + Luzapenak ezin du hutsik egon + %s iturburu-fitxategia ez dago + Erantsi fitxategi-izenak + Erantsi fitxategi-izenak + Berrizendatze sinplea + Eredua + Gehitzeko katea + %Y - urtea\n%M - hilabetea\n%D - eguna\n%h - ordua\n%m - minutua\n%s - segundoa\n%i - 1 baino gehiago den zenbakia + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + Kopiatu + Mugitu + Kopiatu / Mugitu + Kopiatu hona… + Mugitu hona… + Jatorria + Helburua + Hautatu helburua + Egin klik hemen helburua hautatzeko + Ezin izan da hautatutako helburua idatzi + Hautatu helburua + Jatorria eta helburuak ezin dute berdina izan + Ezin izan dira fitxategiak kopiatu + Kopiatu… + Fitxategiak ondo kopiatu dira + File copied successfully + Errorea gertatu da + Mugitzen… + Fitxategiak ondo mugitu dira + File moved successfully + Fitxategi batzuk ezin izan dira mugitu + Fitxategi batzuk ezin izan dira kopiatu + Fitxategirik ez da hautatu + Gordetzen… + Ezin izan da %s karpeta sortu + Ezin izan da %s fitxategia sortu + Ez da elementu berririk aurkitu + Helburuak ez du espazio nahikorik.\n%1$s behar da, %2$s erabilgarri + System service for selecting files and folders is unavailable + + Sortu berria + Karpeta + Fitxategia + Sortu karpeta berria + Izen hori duen fitxategi edo karpeta bat badago + Izenak baliogabeko karaktereak ditu + Sartu izena + Errore ezezaguna gertatu da + + \"%s\" fitxategia jada badago + \"%s\" fitxategia jada badago. Gainidatzi? + \"%s\" karpeta jada badago + Konbinatu + Biak gorde + Gainidatzi + Saltatu + Erantsi honekin: \'_1\' + Aplikatu guztiei + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + Hautatu karpeta + Hautatu fitxategia + Baieztatu kanpoko biltegiratzea atzitzea + Confirm folder access + Hautatu SD txartelaren karpeta nagusia hurrengo pantailan, idazteko baimena emateko + SD txartela ez badakusazu, saiatu honekin + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Berretsi hautaketa + Loading… + Please grant our app access to all your files, it might not work well without it. + + Elementu %d + %d elementu + + + + elementu %d + %d elementu + + + Elementu %d ezabatzen + %d elementu ezabatzen + + + + kontaktu %d + %d kontaktu + + + Hautatu biltegiratzea + Storage + Bernekoa + SD txartela + Erroa + Okerreko karpeta hautatu da, hautatu SD txartelaren erro-karpeta + SD txartelaren eta USB gailuaren bideak ezin dira berdinak izan + Badirudi aplikazioa SD txartel batean instalatu duzula, horrek aplikazioen widgetak erabilgarri egotea ekiditen du. Ezingo dituzu erabilgarri dauden widgeten zerrendan ikusi. + Sistemaren muga da, beraz, widgetak erabili nahi badituzu, aplikazioa barneko biltegiratzera mugitu behar duzu. + Wrong folder selected, please select path \'%s\' + + Propietateak + Bide-izena + Hautatutako elementuak + Direct children count + Fitxategiak guztira + Bereizmena + Iraupena + Artista + Albuma + Foku-distantzia + Esposizio-denbora + ISO abiadura + F-zenbakia + Kamera + EXIF + Abestiaren izenburua + GPS koordinatuak + Altitudea + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Hondoaren kolorea + Testuaren kolorea + Kolore nagusia + Gai zuriaren kolore orokorra + Gai beltzaren eta zuriaren kolore orokorra + Aurreko planoaren kolorea + Aplikazioaren ikonoaren kolorea + Beheko nabigazio-barraren kolorea + Berrezarri lehenetsiak + Erabili lehenetsia + Lehenetsia + Aldatu kolorea + Gaia + Kolorea aldatzen baduzu Pertsonalizatutako gaiara aldatuko da + Gorde + Baztertu + Desegin aldaketak + Ziur zaude aldaketak desegin nahi dituzula? + This action cannot be undone. + Gorde gabeko aldaketak dituzu. Gorde atera baino lehen? + Aplikatu koloreak Simple aplikazio guztiei + ABISUA: Abiarazle batzuek aplikazio-ikonoaren pertsonalizazioa ez dute ondo kudeatu. Ikonoa desagertuz gero, saiatu aplikazioa Google Play bidez edo widgeten baten bidez abiarazten, eskuragarri badago. + Behin abiarazi duzularik, berrezarri lehenetsitako ikono laranja (#F57C00). Kasurik okerrenean aplikazioa berrinstalatu dezakezu. + Koloreak ondo eguneratu dira. \'Shared\' deituriko gai berria gehitu da, erabili hori aplikazio guztien koloreak eguneratzeko etorkizunean. + Kontuan hartu Pro bertsioa erabili arren, Simple Thank You izaten jarraitu behar duzula arrazoi teknikoak direla eta. Kolorearen sinkronizazioaz arduratzen da. + + Simple Thank You funtzio hau desblokeatzeko eta garatzaileari laguntzeko. Eskerrik asko! + ]]> + + + Argia + Iluna + Auto + Auto light / dark + Eguzkitsua + Gorri iluna + Zuria + Zuri-beltza + Pertsonalizatuta + Partekatuta + System default + + Zer berri + * hemen eguneraketa handienak agertzen dira soilik, hobekuntza txikiak ere beti egoten dira + + Ezabatu + Kendu + Berrizendatu + Partekatu + Partekatu honen bidez: + Aldatu tamaina + Hautatu denak + Hautatu testua + Ezkutatu + Erakutsi + Ezkutatu karpeta + Erakutsi karpeta + Erakutsi ezkutatutakoak aldi baterako + Ez erakutsi ezkutatutako multimedia + Ezin duzu hainbeste eduki partekatu aldi berean + Hustu eta desgaitu zakarrontzia + Desegin + Berregin + Inprimatu + Inprimatu (Pro) + Shortcut + Sortu lasterbidea + Sortu lasterbidea (Pro) + Gehitu zenbakia kontaktura + Ikusi kontaktuaren xehetasunak + Deitu 1. SIMetik + Deitu 2. SIMetik + Aldatu fitxategi-izenaren ikusgaitasuna + Mugitu goiko aldera + Mugitu beheko aldera + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Ordenatze-irizpidea + Izena + Tamaina + Azenen aldaketa + Date created + Ateratze-data + Izenburua + Fitxategi-izena + Luzapena + Ausazkoa + Ordenatu ausaz + Gorantz + Beherantz + Erabili karpeta hau soilik + Ordenatu zenbakizko zatiak balio errealaren arabera + Izena + Bigarren izena + Abizena + Izen-abizenak + Erabili pertsonalizatutako ordenatzea + Aldatu ordena + + Ziur zaude ezabatzearekin jarraitu nahi duzula? + Ziur zaude %s ezabatu nahi d(it)uzula? + + Delete %s? + Ziur zaude %s zakarrontzira mugitu nahi d(it)uzula? + + Ziur zaude elementu hau ezabatu nahi duzula? + Ziur zaude elementu hau zakarrontzira mugitu nahi duzula? + Ez galdetu berriro saio honetan + Do not show again + Bai + Ez + Agian + + ABISUA: Karpeta %d ezabatuko duzu + ABISUA: %d karpeta ezabatuko dituzu + + + PINa + Sartu PINa + Sartu PINa + Okerreko PIN + Errpeikatu PIN + Eredua + Sartu eredua + Okerreko eredua + Errepikatu eredua + Biometrics + Hatz-marka + Gehitu hatz-marka + Jarri hatza hatz-markaren sensorean + Open biometric ID verification dialog + Authenticate + Autentifikazioak huts egin du + Autentifikazioa blokeatuta, saiatu berriro geroago + Ez duzu hatz-markarik erregistratu, gehitu batzuk zeure gailuko ezarpenetan + Joan ezarpenetara + Pasahitza ondo ezarri da. Berrinstalatu aplikazioa ahazten baduzu. + Protekzioa ondo ezarri da. Berrinstalatu aplikazioa berrezartzean arazorik baduzu. + Blokeatu karpeta + Blokeatu karpeta (Pro) + Deblokeatu karpeta + Protekzio hau aplikazio honetan soilik funtzionatuko du, ez du balio it is not supposed to replace a real systemwide folder encryption. + + Atzo + Gaur + Bihar + Every day + Ezkutatu urtea + segundoak + minutuak + orduak + egunak + s + m + h + wk. + + segundo %d + %d segundo + + + minutu %d + %d minutu + + + ordubete + %d ordu + + + egun %d + %d egun + + + astebete + %d aste + + + hilabete + %d hilabete + + + urtebete + %d urte + + + + segundo %d barru + %d segundo barru + + + minutu %d barru + %d minutu barru + + + ordubete barru + %d hours + + + egun %d barru + %d egun barru + + + astebete barru + %d aste barru + + + hilabete barru + %d hilabete barru + + + urtebete barru + %d urte barru + + + + segundo %d lehenago + %d segundo lehenago + + + minutu %d lehenago + %d minutu lehenago + + + ordubete lehenago + %d ordu lehenago + + + egun %d lehenago + %d egun lehenago + + + astebete lehenago + %d aste lehenago + + + hilabete lehenago + %d hilabete lehenago + + + urtebete lehenago + %d urte lehenago + + + + segundo %d-ez + %d segundoz + + + minutu %d-ez + %d minutuz + + + ordubetez + %d orduz + + + egun %d-ez + %d egunez + + + astebetez + %d astez + + + hilabetez + %d hilabetez + + + urtebetez + %d urtez + + + Alarma itzaltzeko geratzen den denbora:\n%s + Oroigarria azaltzeko geratzen den denbora:\n%s + Time remaining:\n%s + Mesedez, ziurtatu alarma ondo dabilela. Arazoak egon daitezke bateria aurreztearekin zerikusia duten sistemaren murrizketak direla-eta. + Mesedez, ziurtatu oroigarria ondo dabilela. Arazoak egon daitezke bateria aurreztearekin zerikusia duten sistemaren murrizketak direla-eta. + Aplikazio honen jakinarazpenak desgaituta daude. Gailuko ezarpenetan gaitu ditzakezu. + + Alarma + Atzeratu + Baztertu + Abisurik ez + Hasieran + Sistemako soinuak + Zure soinuak + Gehitu soinu berria + Soinurik ez + Egunean zehar ordu honetan: hh:mm + Egunean zehar ordun honetan: %02d:%02d + + Ezarpenak + Erosi Simple Thank You + General + Color customization + Improved color customization + Pertsonalizatu koloreak + Pertsonalizatu koloreak (Blokeatuta) + Locked + Pertsonalizatu widgeten koloreak + Pertsonalizatu jakinarazpenak + Notification sound + Erabili ingelesa + Language + Erakutsi ezkutatutako elementuak + Letra-tamaina + Txikia + Ertaina + Handia + Oso handia + Babestu pasahitzarekin ezkutatutako elementuen bistaratzea + Babestu pasahitzarekin aplikazio osoa + Babestu pasahitzarekin fitxategien ezabatzea eta mugitzea + Keep old last-modified value at file operations + Erakutsi informazio-burbuila elementu higigarrietan korritze-barra arrastatuz + Eragotzi mugikorra lo geratzea aplikazio hau atzeko planoan dagoen bitartean + Saltatu ezabatzeko konfirmazio elkarrizketa-koadroa beti + Gaitu "behera egin freskatzeko" goiko aldetik + Erabili 24 orduko ordu-formatua + Aldatu data- eta ordu-formatua + Hasi astea igandean + Trepetak + Erabili atzeratze-denbora berdina beti + Atzeratze-denbora + Egin dar-dar botoia sakatzerakoan + Mugitu elementuak zakarrontzira ezabatu ordez + Zakarrontzia garbitzeko tartea + Hustu zakarrontzia + Behartu modu bertikala + Esportatu ezarpenak + Inportatu ezarpenak + Ezarpenak ondo esportatu dira + Ezarpenak ondo inportatu dira + Hasi izen-abizenarekin + Garbitu cachea + Erakutsi egiaztatze mezua dei bat hasi baino lehen + + Ikusgaitasuna + Segurtasuna + Korritzea + Fitxategi-operazioak + Zakarrontzia + Gordetzen + Abioa + Testua + Migratzea + Quality + Main screen + Thumbnails + List view + + Baztertu + Exclude folder + Baztertutako karpetak + (baztertuta) + Kudeatu baztertutako karpetak + Kendu guztiak + Kendu karpeta guztiak baztertutako zerrendatik\? Honek ez ditu karpetak ezabatuko. + Temporarily show excluded + Stop showing excluded + + Kudeatu erakutsitako fitxak + Aplikazioa hasterakoan irekiko den fitxa + Kontaktuak + Gogokoak + Deien historia + Taldeak + Erabilitako azkena + Fitxategiak + Azken fitxategiak + + Leheneratu fitxategi hau + Leheneratu hautatutako fitxategiak + Leheneratu fitxategi guztiak + Zakarrontzia ondo hustu da + Fitxategiak ondo leheneratu dira + Ziur zaude zakarrontzia hustu nahi duzula? Fitxategiak behin betiko galduko dira. + Zakarrontzia hutsik dago + Elementuak zakarrontzira mugitzea desgaituta dago, erabili Leheneratu + Erakutsi zakarrontzia + Ezkutatu zakarrontzia + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + elementu %d zakarrontzira mugitzen + %d elementu zakarrontzira mugitzen + + + Inportatzen… + Esportatzen… + Ondo inportatu da + Ondo esportatu da + Inportazioak huts egin du + Esportazioak huts egin du + Sarrera batzuk inportatzeak huts egin du + Sarrera batzuk esportatzeak huts egin du + Ez da inportatzeko sarrerarik aurkitu + No new entries for importing have been found + Ez da esportatzeko sarrerarik aurkitu + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Badirudi USB gailuren bat konektatuta duzula zure gailura. Fitxategiak ondo agertzen direla ziurtatzeko, baimen gehigarriak eman behar dituzu. + Hautatu USB gailuaren karpeta nagusia hurrengo pantailan, baimena emateko + Karpeta okerra hautatu da, hautatu USB gailuaren erro-karpeta + + Urtarrila + Otsaila + Martxoa + Apirila + Maiatza + Ekaina + Uztaila + Abuztua + Iraila + Urria + Azaroa + Abendua + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + urtarrilean + otsailean + martxoan + apirilean + maiatzean + ekaninean + uztailean + abuztuan + irailean + urrian + azaroan + abenduan + Astelehena + Asteartea + Asteazkena + Osteguna + Ostirala + Larunbata + Igandea + A + A + A + O + O + L + I + Al + Ar + Az + Og + Or + Lr + Ig + + Zure aplikazioaren bertsioa ez da berriro berrituko. Aldatu Pro bertsiora konponketa eta hobekuntza gehiago jasotzeko. + Zure aplikazioaren bertsioa ez da berriro berrituko. Aldatu Pro bertsiora konponketa eta hobekuntza gehiago jasotzeko hemen klik eginez. + %s arte dohainik da. Hori baino lehen deskargatuz gero, betiko dohainik erabili ahal izango duzu. + Informazio gehiago + Bertsio-berritu + Eskuz biltegiratutako gertaerak migratu behar dituzu .ics fitxategi batean esportatuz, eta gero inportatuz. Esportazio- eta inportazio-botoiak pantaila nagusiaren menuan aurki ditzakezu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Honi buruz + Website + Iturburu-kodeak ikusteko joan hona: + Bidali zure iritziak edo iradokizunak hona: + Pro-ra aldatu + Aplikazio gehiago + Gure aplikazio gehiago + Gonbidatu lagunak + Hey, come check out %1$s at %2$s + Gonbidatu honen bidez: + Baloratu gaituzu + Baloratu + Dohaintza egin + Jarrai gaitzazu + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Informazio gehigarria + Aplikazioaren bertsioa: %s + Gailuaren SE: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Erosi + Get Simple Phone + Eguneratu Simple Thank You azken bertsiora + Galdera bat egin aurretik, begiratu aplikazioaren ezarpenetan eta FAQ atala irakur ezazu. Konponbidea hor egon liteke. + Balorazioa egin baino lehen, Before you rate us, begiratu aplikazioaren ezarpenetan eta FAQ atala irakur ezazu. Arazorik baduzu, konponbidea hor egon liteke. + Horretaz gain, aplikazioaren azken bertsioa erabiltzen ari zarela egiaztatu. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Irakurri + Irakurri FAQ atala + Aupa,\n\nbadirudi aplikazio hau denbora batez erabiltzen daramazula, eskerrik asko.\n\nFabore bat eskatuko dizugu: balora gaitzazu Google Play-en. Asko lagunduko liguke horrek.\n\nErabakitzen duzuna erabakitzen duzula, mezu hau ez duzu berriro ikusiko.\n\nMila esker! + Baloratu gure aplikazioa, mesedez :) + Eskerrik asko + Trepeta blokeatuta dago.\nEguneratu Pro bertsiora desblokeatzeko. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + hainbat aplikazio berri argitaratu berri dira:

    + %2$s

    + %4$s

    + %6$s

    + Izenburuetan edota ikonoetan klik eginez deskargatu ditzakezu.

    + Eskerrik asko + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + Aplikazio abiarazlea + Kalkulagailua + Egutegia + Kamera + Erlojua + Kontaktuak + Markatzailea + Marrazketa + Fitxategi-kudeatzailea + Linterna + Galeria + Keyboard + Launcher + Musika erreproduzigailua + Oharrak + SMS mezularia + Eskerrik asko + Grabagailua + + hemen. + ]]> + + + Maiz egindako galderak + Galdera bat egin aurretik, irakurri + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + Aplikazio honk hurrengo hirugarrenen liburutegi hauek erabiltzen ditu, nire bizitza errazago egiteko. Eskerrik asko. + Hirugarrenen lizentziak + Kotlin (programazio-hizkuntza) + Subsampling Scale Image View (zoomable imageviews) + Glide (irudiak kargatzea eta cachean gordetzea) + Picasso (irudiak kargatzea eta cachean gordetzea) + Android Image Cropper (irudia moztu eta biratu) + RtlViewPager (eskuinetik ezkerrerantz hatza-pasatzeko) + Joda-Time (Java data ordezkapena) + Stetho (datu-baseen arazketa) + Otto (gertaera busa) + PhotoView (zoom egin ditzakezun GIFak) + PatternLockView (eredu-babesa) + Reprint (hatz-markaren babesa) + Gif Drawable (GIFak kargatzeko) + AutoFitTextView (testuaren tamaina aldatzeko) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON analizatzailea) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (bideo-erreproduzigailua) + VR Panorama View (panoramikoak bistaratzeko) + Apache Sanselan (irudien metadatuak irakurtzeko) + Android Photo Filters (irudien filtroak) + Gesture Views (zoom egin daitezkeen irudiak) + Indicator Fast Scroll (letrak korritze-barran) + Event Bus (komunikazioa aplikazioaren barruan) + Audio Record View (audio-bistaratzea) + SMS MMS (SMSen eta MMSen kudeaketa) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. + +
    diff --git a/commons/src/main/res/values-fa/strings.xml b/commons/src/main/res/values-fa/strings.xml new file mode 100644 index 000000000..16dc122c0 --- /dev/null +++ b/commons/src/main/res/values-fa/strings.xml @@ -0,0 +1,1156 @@ + + باشه + لغو + Back + Nothing + بعدا + ذخیره به عنوان + پرونده با موفقیت ذخیره شد + قالب پروندهٔ نامعتبر + خطای خروج از حافظه + یک خطا رخ داد: %s + Error: %s + بازکردن با + ویرایش با + Edit + برنامهٔ معتبری پیدا نشد + No browser found + No email client found + تنظیم به عنوان + رونوشت به بریده‌دان + رونوشت شماره به بریده‌دان + مقدار به بریده‌دان رونوشت شد + مقدار به بریده‌دان رونوشت شد:\n%s + شماره گردان + ناشناس + همیشه + هرگز + جزئیات + یادداشت‌ها + درحال حذف پوشهٔ \'%s\' + هیچکدام + برچسب + شفاف + رنگ شفاف + گزینش یک رنگ متفاوت + بارگیری + اعلان + Notifications + ایمیل + قبلی + پخش / مکث + بعدی + شماره + مخاطبی پیدا نشد + درخواست مجوزهای مورد نیاز + این برنامه به مخاطبین‌تان دسترسی ندارد + App does not have the permission to initiate phone calls, please grant it in the device settings + متن را اینجا وارد کنید + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + + Birthday + Anniversary + + + Home + Work + + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + + تغییر حالت نمایش + شبکه + شبکه (Pro) + Uneven Grid + لیست + افزایش تعداد ستون + کاهش تعداد ستون + Column count + Portrait column count + Landscape column count + تغییر تصویر پوشش + گزینش تصویر + + %d column + %d columns + + + + مدیریت شماره‌های مسدود شده + You are not blocking anyone. + افزودن یک شماره مسدود شده + مسدود کردن شماره + مسدود کردن شماره‌ها + شماره‌های مسدود شده + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + تنظیم به عنوان پیش‌گزیده + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + + موردعلاقه‌ها + افزودن موردعلاقه‌ها + افزودن به موردعلاقه‌ها + برداشتن از موردعلاقه‌ها + + + جست‌وجو + Search in %s + حداقل دو نویسه برای شروع جست‌وجو بنویسید. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + + پالایش + پالایش (Pro) + موردی پیدا نشد. + تغییر پالایش + + + مجوز انبار مورد نیاز است + مجوز مخاطبین مورد نیاز است + مجوز دوربین مورد نیاز است + مجوز صدا مورد نیاز است + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + + تغییرنام پرونده + تغییرنام پوشه + نمی‌توان پرونده را تغییرنام داد + نمی‌توان پوشه را تغییرنام داد + نام پوشه نمی‌تواند خالی باشد + یک پوشه با همین نام هم‌اکنون وجود دارد + نمی‌توان پوشهٔ ریشه یک انبار را تغییرنام داد + پوشه با موفقیت تغییرنام یافت + درحال تغییرنام پوشه + نام پرونده نمیتواند خالی باشد + نام پرونده دارای نویسه‌های نامعتبر است + نام پرونده \'%s\' دارای نویسه‌های نامعتبر است + پسوند نمیتواند خالی باشد + پروندهٔ منبع %s وجود ندارد + افزودن به ابتدای نام پرونده + افزودن به انتهای نام پرونده + تغییرنام آسان + الگو + رشته برای افزودن + %Y - سال\n%M - ماه\n%D - روز\n%h - ساعت\n%m - دقیقه\n%s - ثانیه\n%i - افزایش اعداد با شروع از 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + + رونوشت + جابه‌جایی + رونوشت / جابه‌جایی + رونوشت به + جابه‌جایی به + منبع + مقصد + گزینش مقصد + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + درحال رونوشت… + Files copied successfully + File copied successfully + An error occurred + درحال جابه‌جایی… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + پرونده‌ای گزیده نشده است + درحال ذخیره… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + + ساخت جدید + پوشه + پرونده + ساخت پوشهٔ جدید + A file or folder with that name already exists + The name contains invalid characters + لطفا یک نام وارد کنید + An unknown error occurred + + + پرونده \"%s\" هم‌اکنون وجود دارد + پرونده \"%s\" هم‌اکنون وجود دارد. بازنویسی شود؟ + پوشه \"%s\" هم‌اکنون وجود دارد + ادغام + نگه‌داشتن هر دو + بازنویسی + بعدی + افزودن \'_1\' به انتها + اعمال به همه + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + + گزینش یک پوشه + گزینش یک پرونده + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + + %d مورد + %d مورد + + + + + %d مورد + %d مورد + + + + درحال حذف %d مورد + درحال حذف %d مورد + + + + + %d مخاطب + %d مخاطب + + + + گزینش انبار + Storage + داخلی + کارت حافظه + ریشه + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + + ویژگی‌ها + مسیر + موارد گزیده شدند + Direct children count + تعداد همه پرونده‌ها + وضوح + مدت + هنرمند + آلبوم + فاصله کانونی + زمان نوردهی + سرعت ISO + F-number + دوربین + EXIF + عنوان آهنگ + مختصات جی‌پی‌اس + ارتفاع از سطح دريا + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + + رنگ پس‌زمینه + رنگ متن + رنگ اصلی + رنگ تأکید برای شِمای سفید + رنگ تأکید برای شِمای سیاه & سفید + رنگ پیش‌زمینه + رنگ آیکون برنامه + رنگ نوار پیمایش پایین + بازیابی پیش‌گزیده‌ها + استفاده از پیش‌گزیده + پیش‌گزیده + تغییر رنگ + شِما + تغییر یک رنگ آن را به شِما سفارشی تعویض خواهد میکند + ذخیره + دورانداختن + برگرداندن تغییرات + آیا از برگرداندن تغییرات خود مطمئنید؟ + This action cannot be undone. + شما تغییرات ذخیره نشده دارید. قبل از خروج ذخیره شوند؟ + اعمال رنگ‌ها به همه برنامه‌های آسان + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + + روشن + تاریک + Auto + Auto light / dark + آفتابی + قرمز تاریک + سفید + سیاه & سفید + سفارشی + اشتراک گذاری شد + System default + + + چه چیز جدید است + * only the bigger updates are listed here, there are always some smaller improvements too + + + حذف + برداشتن + تغییر نام + اشتراک گذاری + اشتراک گذاری به وسیلهٔ + Resize + گزینش همه + گزینش متن + مخفی + آشکار + مخفی کردن پوشه + آشکار کردن پوشه + نمایش موقت رسانه‌های مخفی + توقف نمایش رسانه‌های مخفی + شما نمی‌توانید همه این مخاطبین را یکباره به اشتراک بگذارید + Empty and disable the Recycle Bin + برگرداندن + انجام دوباره + چاپ + چاپ (Pro) + Shortcut + ساخت میانبر + ساخت میانبر (Pro) + افزودن شماره به مخاطبین + نمایش جزئیات مخاطب + تماس با سیم‌کارت 1 + تماس با سیم‌کارت 2 + Toggle filename visibility + جابه‌جایی به بالا + جابه‌جایی به پایین + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + + مرتب سازی بر اساس + نام + اندازه + اخرین اصلاح + Date created + تاریخ گرفتن + عنوان + نام پرونده + پسوند + تصادفی + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + نام + نام میانی + Surname + نام کامل + Use custom sorting + Change order + + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + Are you sure you want to move %s into the Recycle Bin? + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + بله + خیر + شاید + + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + + پین + پین را وارد کنید + لطفا یک پین وارد کنید + پین اشتباه است + پین را تکرار کنید + الگو + الگو را وارد کنید + الگو اشتباه است + الگو را تکرار کنید + Biometrics + اثر انگشت + افزودن اثر انگشت + لطفا انگشت خود را روی حسگر اثر انگشت قرار دهید + Open biometric ID verification dialog + Authenticate + احراز هویت ناموفق + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + رفتن به تنظیمات + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + قفل کردن پوشه + قفل کردن پوشه (Pro) + باز کردن قفل پوشه + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + + دیروز + امروز + فردا + Every day + مخفی کردن سال + ثانیه + دقیقه + ساعت + روز + ث + د + س + wk. + + + %d ثانیه + %d ثانیه + + + %d دقیقه + %d دقیقه + + + %d ساعت + %d ساعت + + + %d روز + %d روز + + + %d هفته + %d هفته + + + %d ماه + %d ماه + + + %d سال + %d سال + + + + + %d ثانیه + %d ثانیه + + + %d دقیقه + %d دقیقه + + + %d ساعت + %d ساعت + + + %d روز + %d روز + + + %d هفته + %d هفته + + + %d ماه + %d ماه + + + %d سال + %d سال + + + + + %d ثانیه پیش + %d ثانیه پیش + + + %d دقیقه پیش + %d دقیقه پیش + + + %d ساعت پیش + %d ساعت پیش + + + %d روز پیش + %d روز پیش + + + %d هفته پیش + %d هفته پیش + + + %d ماه پیش + %d ماه پیش + + + %d سال پیش + %d سال پیش + + + + + %d ثانیه + %d ثانیه + + + %d دقیقه + %d دقیقه + + + %d ساعت + %d ساعت + + + %d روز + %d روز + + + %d هفته + %d هفته + + + %d ماه + %d ماه + + + %d سال + %d سال + + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + + هشدار + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + + تنظیمات + Purchase Simple Thank You + General + Color customization + Improved color customization + سفارشی سازی رنگ‌ها + سفارشی سازی رنگ‌ها (قفل ) + Locked + سفارشی سازی رنگ‌های ویجت + سفارشی سازی اعلانات + Notification sound + استفاده از زبان انگلیسی + Language + نمایش موارد مخفی + اندازهٔ قلم + کوچک + متوسط + بزرگ + خیلی بزرگ + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + ابزارک‌ها + Always use same snooze time + Snooze time + Vibrate on button press + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + برون‌ریزی تنظیمات + درون‌ریزی تنظیمات + Settings exported successfully + Settings imported successfully + Start name with surname + پاک کردن انباره + Show a call confirmation dialog before initiating a call + + + Visibility + Security + Scrolling + File operations + زباله‌دان + ذخیره + راه‌انداز + متن + Migrating + Quality + Main screen + Thumbnails + List view + + + مستثنی + Exclude folder + شاخه‌های مستثنی شده + (مستثنی) + مدیریت شاخه‌های مستثنی + Remove all + Remove all folders from the list of excluded\? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + + Manage shown tabs + Tab to open at app start + مخاطب + موردعلاقه + تاریخچه تماس + گروه‌ها + Last used one + پرونده‌ها + پرونده‌های اخیر + + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + + درحال درون‌ریزی… + درحال برون‌ریزی… + درون‌ریزی با موفقیت انجام شد + برون‌ریزی با موفقیت انجام شد + درون‌ریزی شکست خورد + برون‌ریزی شکست خورد + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + + یو‌اس‌بی + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + + ژانویه + فوریه + مارس + آوریل + می + ژوئن + جولای + آگوست + سپتامبر + اکتبر + نوامبر + دسامبر + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + + در ژانویه + در فوریه + در مارس + در آوریل + در می + در ژوئن + در جولای + در آگوست + در سپتامبر + در اکتبر + در نوامبر + در دسامبر + + دوشنبه + سه‌شنبه + چهارشنبه + پنج‌شنبه + جمعه + شنبه + یک‌شنبه + + د + س + چ + پ + ج + ش + ی + + دوشنبه + سه‌شنبه + چهارشنبه + پنج‌شنبه + جمعه + شنبه + یک‌شنبه + + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + + درباره + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + امتیاز به ما + امتیاز + اهدا + پیگیری ما + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + اطلاعات اضافی + نسخه برنامه: %s + سیستم عامل دستگاه: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + ممنونیم + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + + Simple App Launcher + ماشین حساب آسان + تقویم آسان + دوربین آسان + ساعت آسان + مخاطبین آسان + Simple Dialer + نقاشی آسان + مدیر پروندهٔ آسان + Simple Flashlight + گالری آسان + Simple Keyboard + Simple Launcher + پخش کنندهٔ آهنگ آسان + یادداشت آسان + پیام‌رسان اس‌ام‌اس آسان + Simple Thank You + Simple Voice Recorder + + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + + here. + ]]> + + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + + هم‌اکنون نسخهٔ حرفه‌ای را بگیر! + پایه + حرفه‌ای + بدونه تبلیغات + بدونه دسترسی به اینترنت + 100% Money Back Guarantee + One time payment + Improved design + + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + + Checklists + Different note and colors per widget + Note locking + + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + + Background color customization + File importing support + Zooming + + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-fi/strings.xml b/commons/src/main/res/values-fi/strings.xml new file mode 100644 index 000000000..21870349a --- /dev/null +++ b/commons/src/main/res/values-fi/strings.xml @@ -0,0 +1,1118 @@ + + + OK + Peruuta + Takaisin + Ei mitään + Myöhemmin + Tallenna nimellä + Tallennettu + Virheellinen tiedostomuoto + Liian vähän muistia + Tapahtui virhe: %s + Virhe: %s + Avaa sovelluksessa + Muokkaa sovelluksella + Muokkaa + Sovelluksia ei löydetty + Selainta ei löytynyt + Sähköpostiohjelmaa ei löytynyt + Aseta + Kopioi leikepöydälle + Kopioi numero leikepöydälle + Kopioitu leikepöydälle + Kopioitu leikepöydälle:\n%s + Soita numeroon + Tuntematon + Aina + Ei koskaan + Tiedot + Muistiinpanot + Poistetaan kansio \'%s\' + Ei mitään + Nimike + Läpinäkyvä + Läpinäkyvä väri + Valitse eri väri + Lataa + Ilmoitus + Ilmoitukset + Sähköposti + Edellinen + Toista / Tauota + Seuraava + Numero + Yhteystietoja ei löytynyt + Pyydä tarvittavia oikeuksia + Sovelluksella ei ole käyttöoikeutta yhteystietoihin + Sovelluksella ei ole käyttöoikeutta puhelujen aloittamiseen, myönnä käyttöoikeus laitteen asetuksissa + Lisää teksti tähän + Soita %s + Vahvista puhelu yhteystiedolle %s + Nolla + Yksi + Kaksi + Kolme + Neljä + Viisi + Kuusi + Seitsemän + Kahdeksan + Yhdeksän + Arvo + Arvo ei voi olla tyhjä + Luo uusi yhteystieto + Lisää olemassa olevaan yhteystietoon + App korruptoitunut + Vastuuvapauslauseke + Ota kuva + Valitse kuva + Valitse video + Valitse yhteystieto + Valitse tiedosto + Tallenna ääntä + Tallenna videota + Päivitetään… + Puhelimen muisti + Puhelimen muisti (piilotettu muilta sovelluksilta) + Audio + + Syntymäpäivä + Vuosipäivä + + Koti + Työ + + Matkapuhelin + Oletus + Faksi (työ) + Faksi (koti) + Hakulaite + Puhelinnumeroa ei löytynyt + + Vaihda näkymää + Ruudukko + Ruudukko (Pro) + Epätasainen ruudukko + Lista + Lisää sarakkeita + Vähennä sarakkeita + Sarakkeiden lukumäärä + Muotokuvasarakkeiden määrä + Maiseman sarakkeiden määrä + Vaihda kansikuva + Valitse kuva + + %d sarake + %d saraketta + + + Hallitse estettyjä numeroita + Ei estettyjä numeroita. + Lisää estetty numero + Estä numero + Estä numeroita + Estetyt numerot + Vie estetyt numerot + Tuo estetyt numerot + Jotta voit käyttää numeroiden estoja, täytyy tämän sovelluksen olla oletuksena puheluille. + Aseta oletukseksi + Haluatko varmasti estää numeron \"%s\"? + Estä puhelut tallentamattomista yhteystiedoista + Estä viestit tallentamattomista yhteystiedoista + Anna numero tai kuvio (esim. *12345*, +1*8888) estääksesi kaikki puhelut ja viestit kuvion mukaisista numeroista. + Tuntemattomia numeroita ei voida estää ilman soittajan tunnistusoikeutta. + + Suosikit + Lisää suosikkeja + Lisää suosikkeihin + Poista suosikeista + + Haku + Etsi kohteesta %s + Syötä vähintään 2 merkkiä hakeaksesi. + Etsi yhteystietoja + Etsi suosikkeja + Etsi sovelluksia + Etsi tapahtumia + Etsi ryhmiä + Etsi historiasta + Etsi puheluita + Etsi tiedostoja + Etsi kansioita + Etsi tiedostoja ja kansioita + Etsi soittolistoja + Etsi esittäjiä + Etsi albumeita + Etsi kappaleita + Etsi tekstiä + Etsi keskustelua + Etsi äänitteitä + + Suodata + Suodata (Pro) + Kohteita ei löytynyt. + Vaihda suodatin + + Lupa tallennustilaan vaaditaan + Lupa yhteystietoihin vaaditaan + Lupa kameraan vaaditaan + Lupa ääneen vaaditaan + Käyttöoikeutta ei ole + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Uudelleennimeä tiedosto + Uudelleennimeä kansio + Tiedostoa ei voitu uudelleennimetä + Kansiota ei voitu uudelleennimetä + Kansiolle täytyy antaa nimi + Nimi on jo käytössä + Juurihakemistoa ei voi uudelleennimetä + Kansio uudelleennimetty + Uudelleennimetään kansio + Tiedostolle täytyy antaa nimi + Tiedostonimi sisältää kiellettyjä merkkejä + Tiedostonimi \'%s\' sisältää kiellettyjä merkkejä + Tiedostomuoto ei voi olla tyhjä + Lähdetiedostoa %s ei löydy + Lisää tiedostonimien eteen + Lisää tiedostonimien jälkeen + Yksinkertainen uudelleennimeäminen + Kuvio + Lisättävä merkkijono + %Y - vuosi\n%M - kuukausi\n%D - päivä\n%h - tunti\n%m - minuutti\n%s - sekunti\n%i - nouseva numero, alkaen numerosta 1 + Tiedostonimi (ilman .txt-päätettä) + Tiedostonimi (ilman .json-päätettä) + Tiedostonimi (ilman .zip-päätettä) + Android 11 ja uudemmat eivät enää salli tiedostojen ja kansioiden piilottamista + + Kopioi + Siirrä + Kopioi / Siirrä + Kopioi kohteeseen + Siirrä kohteeseen + Lähde + Kohde + Valitse kohde + Kosketa valitaksesi kohteen + Valittuun kohteeseen ei voitu kirjoittaa + Valitse kohde + Lähde ja kohde eivät voi olla samat + Tiedostoja ei voitu kopioida + Kopioidaan… + Tiedostot kopioitu onnistuneesti + Tiedosto kopioitu onnistuneesti + Tapahtui virhe + Siirretään… + Tiedostot siirretty onnistuneesti + Tiedosto siirretty onnistuneesti + Kaikkia tiedostoja ei voitu siirtää + Kaikkia tiedostoja ei voitu kopioida + Ei valittuja tiedostoja + Tallennetaan… + Ei voitu luoda kansiota %s + Ei voitu luoda tiedostoa %s + Uusia kohteita ei löytynyt + Kohteessa ei ole riittävästi tyhjää tilaa vapaana.\nVaaditaan %1$s, vapaana %2$s + Järjestelmän palvelu tiedostojen ja kansioiden valitsemiseen ei ole käytettävissä + + Luo uusi + Kansio + Tiedosto + Luo uusi kansio + Samanniminen tiedosto tai kansio on jo olemassa + Nimessä on kiellettyjä merkkejä + Syötä nimi + Tapahtui tuntematon virhe + + Tiedosto \"%s\" on jo olemassa + Tiedosto \"%s\" on jo olemassa. Korvataanko? + Kansio \"%s\" on jo olemassa + Yhdistä + Pidä molemmat + Korvaa + Ohita + Lisää nimeen \'_1\' + Käytä kaikkiin + Järjestelmä ei salli toimintoa tässä kansiossa, ole hyvä ja valitse toinen + Järjestelmä ei salli kopiointia tähän hakemistoon, ole hyvä ja valitse toinen + Järjestelmä ei salli uudelleennimeämistä tässä hakemistossa + Kansioita ei voi nimetä uudelleen suoraan sisäisessä tallennustilassa, vain alikansioita + Tätä kansiota ei voi nimetä uudelleen + + Valitse kansio + Valitse tiedosto + Vahvista pääsy ulkoiseen tallennustilaan + Varmista kansion käyttöoikeus + Valitse muistikortin juurihakemisto seuraavaksi antaaksesi kirjoitusoikeuden + Jos et näe muistikorttia, kokeile tätä + Anna sovellukselle käyttöoikeus tallennustilan käyttöön painamalla seuraavassa näkymässä \"Käytä tätä hakemistoa\"-painiketta. + Anna käyttöoikeus kohteeseen \'<b>%s</b>\' seuraavalla ruudulla painamalla \'<b>Käytä tätä kansiota</b>\' alalaidasta. + Paina \'<b>Tallenna</b>\' seuraavan ruudun alalaidasta luodaksesi uuden kansion. + Vahvista valinta + Ladataan… + Anna sovellukselle käyttöoikeus kaikkiin tiedoistoihin, muutoin se ei välttämättä toimi. + + %d kohde + %d kohdetta + + + + %d kohteen + %d kohdetta + + + Poistetaan %d kohde + Poistetaan %d kohdetta + + + + %d kohteen + %d kohdetta + + + Valitse tallennustila + Varastointi + Sisäinen + Muistikortti + Juurihakemisto + Väärä kansio valittu, valitse muistikortin juurihakemisto + Muistikortin ja USB-laitteen polut eivät voi olla samat + Sovellus on asennettu muistikortille, jonka vuoksi pienoissovellukset eivät ole käytettävissä. Niitä ei näytetä pienoissovellusten listalla. + Kyseessä on järjestelmän rajoitus, joten jos haluat käyttää pienoissovelluksia, siirrä sovellus takaisin sisäiseen tallennustilaan. + Väärä kansio valittu, valitse \'%s\' + + Ominaisuudet + Polku + Kohteita valittu + Sisältyvien kohteiden määrä + Tiedostoja yhteensä + Resoluutio + Kesto + Esittäjä + Albumi + Polttoväli + Valotusaika + ISO-nopeus + F-arvo + Kamera + EXIF + Kappaleen nimi + GPS-koordinaatit + Korkeus + Poista EXIF + Haluatko varmasti poistaa EXIF-arvot kuten GPS-koordinaatit, kameran mallin yms.\? + EXIF-arvot poistettu onnistuneesti + + Taustaväri + Tekstin väri + Ensisijainen väri + Valkoisen teeman aksenttiväri + Mustavalkoisen teeman aksenttiväri + Etualan väri + Sovelluksen ikonin väri + Alapalkin väri + Palauta oletukset + Käytä oletusta + Oletus + Vaihda väriä + Teema + Värin vaihtaminen vaihtaa teemaksi "Oma teema" + Tallenna + Hylkää + Peru muutokset + Haluatko varmasti perua muutokset? + Toimintoa ei ole mahdollista kumota. + Sinulla on tallentamattomia muutoksia. Tallennetaanko ennen sulkemista? + Käytä värejä kaikissa Simple App -sovelluksissa + VAROITUS: Jotkin käynnistinohjelmat eivät käsittele kuvakkeen mukauttamista oikein. Jos kuvake häviää, käynnistä sovellus Google Playn tai jonkin pienoissovelluksen kautta, jos mahdollista. + Käynnistyksen jälkeen palauta kuvakkeen oranssi oletusväri #F57C00. Pahimmillaan saatat joutua asentamaan sovelluksen uudelleen. + Värit päivitetty. Uusi teema nimeltä \'Jaettu\' käytä sitä jatkossa muokataksesi värejä kaikissa sovelluksissa. + Huomioi, että vaikka käytössäsi on sovelluksen Pro-versio, Simple Thank You tarvitaan teknisistä syistä mm. värien synkronointiin. + + Simple Thank You avataksesi ominaisuuden ja tukeaksesi kehitystä. Kiitos! + ]]> + + + Vaalea + Tumma + Automaattinen + Automaattinen vaalea / tumma + Solarisoitu + Tumman punainen + Valkoinen + Musta & Valkoinen + Oma + Jaettu + Järjestelmän oletus + + Mitä uutta + * tässä mainitaan vain isot muutokset, ei pieniä korjauksia + + Poista + Poista + Uudelleennimeä + Jaa + Jaa sovelluksella + Rajaa + Valitse kaikki + Valitse teksti + Piilota + Näytä piilotetut + Piilota kansio + Näytä piilotettu kansio + Näytä piilotetut väliaikaisesti + Lopeta piilotettujen näyttäminen + Et voi jakaa näin paljoa kerralla + Tyhjennä ja poista roskakori käytöstä + Kumoa + Tee uudelleen + Tulosta + Tulosta (Pro) + Pikakuvake + Luo pikakuvake + Luo pikakuvake (Pro) + Lisää numero yhteystietoon + Näytä yhteystieto + Soita SIM 1-kortilla + Soita SIM 2-kortilla + Tiedostonimien näkyvyys + Siirrä ylimmäksi + Siirrä alimmaksi + Nastan kohta + Poista kohteen kiinnitys + Lähetä tekstiviesti + Lähetä sähköpostia + Soita + Yhteystiedot + Lisää yhteystieto + Taustat + + Järjestä + Nimen perusteella + Koon perusteella + Viimeksi muokattu + Luontipäivämäärä + Viimeksi kuvattu + Nimi + Tiedostonimi + Tiedostopääte + Satunnainen + Lajittele satunnaisesti + Nouseva + Laskeva + Käytä vain tässä kansiossa + Lajittele numeeriset osat tarkan arvon mukaan + Etunimi + Toinen nimi + Sukunimi + Koko nimi + Käytä mukautettua lajittelua + Vaihda järjestystä + + Haluatko varmasti jatkaa poistotoimintoon? + Haluatko varmasti poistaa %s? + Delete %s? + + Haluatko varmasti siirtää kohteen %s roskakoriin? + + Haluatko varmasti poistaa tämän kohteen? + Haluatko varmasti siirtää tämän kohteen roskakoriin? + Älä kysy uudestaan tällä istunnolla + Älä näytä uudelleen + Kyllä + Peruuta + Ehkä + + VAROITUS: Olet poistamassa %d kansion + VAROITUS: Olet poistamassa %d kansiota + + + PIN + Syötä PIN + Syötä PIN + Väärä PIN + Toista PIN + Kuvio + Syötä kuvio + Väärä kuvio + Toista kuvio + Biometria + Sormenjälki + Lisää sormenjälki + Aseta sormi sormenjälkitunnistimelle + Avaa biometrisen tunnistautumisen lomake + Tunnistaudu + Kirjautuminen epäonnistui + Kirjautuminen estetty, yritä myöhemmin uudelleen + Sinulla ei ole tallennettuja sormenjälkiä, lisää niitä laitteesi asetuksista + Mene asetuksiin + Salasana tallennettu. Asenna sovellus uudelleen jos unohdat sen. + Suojaus onnistui. Asenna sovellus uudelleen jos kohtaat ongelmia. + Lukitse kansio + Lukitse kansio (Pro) + Avaa kansion lukitus + Tämä suojaus toimii vain tässä sovelluksessa, se ei korvaa laajempaa järjestelmän kattavaa suojausta. + + Eilen + Tänään + Huomenna + Joka päivä + Piilota vuosi + sekunnit + minuutit + tunnit + päivät + s + m + h + wk. + + %d sekunti + %d sekuntia + + + %d minuutti + %d minuuttia + + + %d tunti + %d tuntia + + + %d päivä + %d päivää + + + %d viikko + %d viikkoa + + + %d kuukausi + %d kuukautta + + + %d vuosi + %d vuotta + + + + %d:ssä sekunnissa + %d sekunnissa + + + %d:ssä minuutissa + %d minuutissa + + + %d:ssä tunnissa + %d tunnissa + + + %d:ssä päivässä + %d päivässä + + + %d:ssä viikossa + %d viikossa + + + %d:ssä kuukaudessa + %d kuukaudessa + + + %d:ssä vuodessa + %d vuodessa + + + + %d sekunti aikaisemmin + %d sekuntia aikaisemmin + + + %d minuutti aikaisemmin + %d minuuttia aikaisemmin + + + %d tunti aikaisemmin + %d tuntia aikaisemmin + + + %d päivä aikaisemmin + %d päivää aikaisemmin + + + %d viikko aikaisemmin + %d viikkoa aikaisemmin + + + %d kuukausi aikaisemmin + %d kuukautta aikaisemmin + + + %d vuosi aikaisemmin + %d vuotta aikaisemmin + + + + %d:llä sekunnilla + %d sekunnilla + + + %d:llä minuutilla + %d minuutilla + + + %d:llä tunnilla + %d tunnilla + + + %d:llä päivällä + %d päivällä + + + %d:llä viikolla + %d viikolla + + + %d:llä kuukaudella + %d kuukaudella + + + %d:llä vuodella + %d vuodella + + + Aikaa hälytykseen:\n%s + Aikaa jäljellä ennen muistutusta:\n%s + Aikaa jäljellä: +\n%s + Varmista että hälytys toimii ennenkuin turvaudut siihen. Se voi toimia virheellisesti laitteesi virransäästötoiminnoista riippuen. + Varmista että muistutus toimii ennenkuin turvaudut siihen. Se voi toimia virheellisesti laitteesi virransäästötoiminnoista riippuen. + Tämän sovelluksen ilmoitukset ovat poissa käytöstä. Kytke ilmoitukset päälle laitteesi asetuksista. + + Herätys + Torkuta + Ohita + Ei muistutusta + Alussa + Järjestelmän äänet + Omat äänet + Lisää uusi ääni + Ei ääntä + Päivällä kello hh:mm + Päivällä kello %02d:%02d + + Asetukset + Osta Simple Thank You + Yleistä + Värien mukautus + Parannettu värien mukautus + Muokkaa sovelluksen värejä + Muokkaa sovelluksen värejä (Locked) + Lukittu + Mukauta pienoissovelluksen värejä + Mukauta ilmoituksia + Notification sound + Käytä englannin kieltä + Kieli + Näytä piilotetut tiedostot + Fonttikoko + Pieni + Keskikokoinen + Suuri + Erittäin suuri + Suojaa piilotetut salasanalla + Suojaa koko sovellus salasanalla + Suojaa tiedostojen poisto ja siirto salasanalla + Pidä viimeisin viimeksi muokattu-arvo tiedostoja käsitellessä + Näytä lisätietokupla vierityspalkista vierittäessä + Estä puhelinta siirtymästä virransäästöön kun sovellus on avattu ja käytössä + Älä koskaan kysy varmistusta tiedostoja poistaessa + Päivitä näkymä vedettäessä ylhäältä alas + Käytä 24:n tunnin kelloa + Vaihda päivämäärän ja kellonajan muotoa + Aloita viikko sunnuntaista + Pienoissovellukset + Käytä aina samaa torkkuaikaa + Torkkuaika + Värähdä painikkeista + Siirrä kohteet roskakoriin poistamisen sijaan + Roskakorin tyhjennysväli + Tyhjennä roskakori + Pakota pystysuunta + Vie asetukset + Tuo asetukset + Asetukset viety onnistuneesti + Asetukset tuotu onnistuneesti + Aloita sukunimellä + Tyhjennä välimuisti + Näytä soiton vahvistusruutu ennen soittoa + + Näkyvyys + Turvallisuus + Vierittäminen + Tiedostotoiminnot + Roskakori + Tallennetaan + Käynnistys + Teksti + Yhdistäminen + Laatu + Päänäkymä + Esikatselukuvat + Luettelonäkymä + + Poissulje + Älä huomioi kansiota + Poissuljetut kansiot + (ohitettu) + Hallitse poissuljettuja kansioita + Poista kaikki + Poista kaikki kansiot poissuljettujen listasta\? Tämä ei poista kansioita. + Näytä tilapäisesti poissuljetut + Lopeta poissuljettujen näyttäminen + + Valitse sovelluksen välilehdet + Välilehti, joka avataan sovelluksen käynnistyessä + Yhteystiedot + Suosikit + Puheluhistoria + Ryhmät + Viimeksi käytetty + Tiedostot + Viimeksi käytetyt tiedostot + + Palauta tämä tiedosto + Palauta valitut tiedostot + Palauta kaikki tiedostot + Roskakori tyhjennetty + Tiedostot on palautettu onnistuneesti + Haluatko varmasti tyhjentää roskakorin? Tiedostoja ei voida enää palauttaa. + Roskakori on tyhjä + Kohteiden siirto roskakorista on poissa käytöstä, käytä palautustoimintoa + Näytä roskakori + Piilota roskakori + Avaa roskakori + Skip the Recycle Bin, delete files directly + + Siirretään %d kohde roskakoriin + Siirretään %d kohdetta roskakoriin + + + Tuodaan… + Viedään… + Tuonti onnistui + Vienti onnistui + Tuonti epäonnistui + Vienti epäonnistui + Joidenkin kohteiden tuonti epäonnistui + Joidenkin kohteiden vienti epäonnistui + Tuotavia kohteita ei löytynyt + Ei uusia tuotavia kohteita + Vientikohteita ei löydetty + Varmuuskopiot + Ota käyttöön automaattiset varmuuskopiot + Hallitse automaattisia varmuuskopioita + Voit käyttää seuraavia merkintöjä tiedostojen automaattiseen nimeämiseen: +\n +\n%Y - vuosi +\n%M - kuukausi +\n%D - päivä +\n%h - tunti +\n%m - minuutti +\n%s - sekunti + + USB + Laitteeseesi on kytketty USB-lisälaite. Jotta tiedostot lisälaitteelta näkyvät oikein, vaaditaan lisäkäyttöoikeus. + Valitse USB-laitteen root-kansio salliaksesi pääsyn + Väärä kansio valittu, valitse USB-laitteen root-kansio + + Tammikuu + Helmikuu + Maaliskuu + Huhtikuu + Toukokuu + Kesäkuu + Heinäkuu + Elokuu + Syyskuu + Lokakuu + Marraskuu + Joulukuu + + Jan + Feb + Mar + Apr + May + June + July + Aug + Syys + Oct + Nov + Dec + + Tammikuussa + Helmikuussa + Maaliskuussa + Huhtikuussa + Toukokuussa + Kesäkuussa + Heinäkuussa + Elokuussa + Syyskuussa + Lokakuussa + Marraskuussa + Joulukuussa + Maanantai + Tiistai + Keskiviikko + Torstai + Perjantai + Lauantai + Sunnuntai + M + T + K + T + P + L + S + Ma + Ti + Ke + To + Pe + La + Su + + Sovellusversiotasi ei enää päivitetä. Hanki päivitys Pro-versioon vastaanottaaksesi uusimmat korjaukset ja kohennukset. + Sovellusversiotasi ei enää päivitetä. Hanki päivitys Pro-versioon vastaanottaaksesi uusimmat korjaukset ja kohennukset klikkaamalla tästä. + Se on ilmainen %s asti. Jos lataat ennen sitä, voit käyttää sovellusta ilmaiseksi ikuisesti. + Lisää tietoa + Päivitä + Sinun tulee yhdistää paikallisesti tallennetut tapahtumat manuaalisesti viemällä ne .ics-tiedostoon ja sen jälkeen tuomalla tiedostosta. Löydät vienti- ja tuontipainikkeet päävalikosta. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hei, +\n +\nnäytät juuri päivittäneen ilmaisversiosta. Kun olet tyytyväinen tähän ja mahdollisesti siirtänyt tietosi, voit poistaa vanhan ilmaisversion asennuksen, ettet vahingossa turhaan avaa sitä, koska et tarvitse sitä enää. +\n +\nKiitos! + Hei, +\n +\nsinulla näyttää jo olevan myös sovelluksen Pro-versio. Kun olet tyytyväinen siihen ja mahdollisesti siirtänyt tietosi, voit poistaa tämän sovelluksen asennuksen, ettet vahingossa turhaan avaa sitä, koska et tarvitse sitä enää. +\n +\nKiitos! + Hei, +\n +\nnäytät juuri päivittäneen ilmaisversiosta. Jos haluat siirtää paikallisesti säilytetyt tapahtumatiedot tähän sovellukseen, on se tehtävä manuaalisesti viemällä ne ensin ilmaisversiosta .ics-tiedostoon, joka voidaan sen jälkeen tuoda tähän sovellukseen ylävalikon kautta. +\n +\nKun olet tyytyväinen Pro-versioon, voit poistaa vanhan ilmaisversion asennuksen, ettet vahingossa turhaan avaa sitä, koska et tarvitse sitä enää. +\n +\nKiitos! + Hei, +\n +\nnäytät juuri päivittäneen ilmaisversiosta. Jos haluat siirtää kohteessa \"%s\" säilytetyt yhteystiedot tähän sovellukseen, on se tehtävä manuaalisesti viemällä ne ensin ilmaisversiosta .vcf-tiedostoon, joka voidaan sen jälkeen tuoda tähän sovellukseen ylävalikon kautta. +\n +\nKun olet tyytyväinen Pro-versioon, voit poistaa vanhan ilmaisversion asennuksen, ettet vahingossa turhaan avaa sitä, koska et tarvitse sitä enää. +\n +\nKiitos! + Hei, +\n +\nnäytät juuri päivittäneen ilmaisversiosta. Jos haluat siirtää muistiinpanosi tähän sovellukseen, on se tehtävä manuaalisesti viemällä ne ensin ilmaisversiosta tiedostoon, joka voidaan sen jälkeen tuoda tähän sovellukseen ylävalikon kautta. +\n +\nKun olet tyytyväinen Pro-versioon, voit poistaa vanhan ilmaisversion asennuksen, ettet vahingossa turhaan avaa sitä, koska et tarvitse sitä enää. +\n +\nKiitos! + + Tietoa + Verkkosivusto + Lähdekoodin löydät täältä + Lähetä palautteesi ja ehdotuksia osoitteeseen + Päivitä Pro-versioon + Lisää sovelluksia + Lisää sovelluksia meiltä + Kutsu ystäviä + Hei, tutustu %1$s täällä %2$s + Kutsu sovelluksella + Arvioi meidät + Arvostele + Lahjoita + Seuraa + v %1$s\nCopyright © Simple Mobile Tools %2$d + Tuki + Auta meitä + Sosiaalinen + Muut + Tietosuojakäytäntö + Versio %s + Hei :) + Tehty ❤️:llä Slovakiassa + Lisätietoa + Sovelluksen versio: %s + Laitteen käyttöjärjestelmä: %s + +
    + toivottavasti pidät sovelluksesta. Se ei sisällä mainoksia, tue sen kehitystä ostamalla Simple Thank You sovellus, tämä myös estää tämän ilmoituksen jatkossa.

    + Kiitos! + ]]> +
    + Hei,<br><br>toivottavasti pidät sovelluksesta. Se ei sisällä mainoksia, emmekä edes kerää tietojasi. Tue kehitystä ostamalla <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Yksinkertainen kiitos</a>. Saat lisäksi käyttöösi kaikki sovelluksen ominaisuudet, kuten värien mukautuksen.<br><br>Kiitos! + Tue meitä ostamalla <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Yksinkertainen kiitos</a>, jolla saat myös käyttöösi sovelluksen kaikki ominaisuudet, kuten värien mukautuksen. + Osta + Hanki yksinkertainen puhelin + Päivitä Yksinkertainen kiitos viimeisimpään versioon + Ennen kysymyksen esittämistä varmista, löytyykö vastaus asetuksista tai usein kysytyistä kysymyksistä (Frequently Asked Questions). + Ennen kuin arvostelet sovelluksen ja sinulla on ongelmia sovelluksen kanssa, varmista, löytyykö ratkaisu asetuksista tai usein kysytyistä kysymyksistä (Frequently Asked Questions). + Varmista myös, että käytät viimeisintä versiota. + Huomioi, että tätä sovellusversiota ei enää kehitetä, hanki Pro-versio parannuksia varten. + Lue + Lue FAQ + Hei, +\n +\nnäyttää siltä, että olet käyttänyt tätä sovellusta jo jonkin aikaa, arvostamme sitä. +\n +\nPyytäisimme sinua lisäämään arvostelun Google Playhyn, se auttaisi meitä paljon. +\n +\nHuolimatta siitä miten toimit, et nää tätä viestiä enää. +\n +\nKiitos! + Arvostele sovelluksemme, kiitos :) + Kiitos + Pienoissovellus on lukittu. +\nOle hyvä ja päivitä Pro-versioon ottaaksesi sen käyttöön. + Tämä ominaisuus on lukittu. Osta <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Kiitos</a> koko sovelluksen lukituksen avaamisesta.<br <br>Se on vain kertamaksu, ja jos et ole tyytyväinen, voimme hyvittää sinulle. + + Hei,<br><br> halusin vain kertoa että uusi sovellus on julkaistu:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Voit ladata sen koskettamalla otsikkoa.<br><br> Kiitos + Yksinkertainen App Launcher + Yksinkertainen laskin + Yksinkertainen kalenteri + Yksinkertainen kamera + Yksinkertainen kello + Yksinkertaiset yhteystiedot + Yksinkertainen valitsin + Yksinkertainen arvonta + Yksinkertainen tiedostonhallinta + Yksinkertainen taskulamppu + Yksinkertainen galleria + Yksinkertainen näppäimistö + Yksinkertainen käynnistin + Yksinkertainen musiikkisoitin + Yksinkertaiset muistiinpanot + Yksinkertaiset viestit + Yksinkertainen kiitos + Yksinkertainen ääninauhuri + Sovelluskäynnistin + Laskin + Kalenteri + Kamera + Kello + Yhteystiedot + Puhelin + Piirrä + Tiedostonhallinta + Taskulamppu + Galleria + Näppäimistö + Käynnistin + Musiikkisoitin + Muistiinpanot + Tekstiviesti Messenger + Kiitos + Ääninauhuri + + täältä. + ]]> + + + Usein kysytyt kysymykset + Ennen kuin esität kysymyksen, luethan ensin + Miksi en näe tämän sovelluksen pienoissovellusta pienoissovellusvalikossa? + Todennäköisesti asensit sovelluksen ulkoiselle muistikortille. Tässä tapauksessa ainoa vaihtoehto on uudelleenasentaa sovellus laitteen sisäiseen tallennustilaan. + Haluan tukea sinua, mutta minulla ei ole varaa lahjoittaa. Voinko auttaa jotenkin muuten? + Kyllä, tottakai. Voit levittää sanaa sovelluksista tai antaa hyvää palautetta ja arvioita. Voit myös auttaa kääntämällä sovelluksia uudelle kielelle tai vain päivittää nykyisiä käännöksiä. Ohje käännöksiin löytyy <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>tästä osoitteesta</a>, tai ole vain yhteydessä sähköpostitse <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> jos sinulla on kysymyksiä. + Poistin tiedostoja vahingossa, miten palautan ne? + Valitettavasti se ei ole mahdollista. Tiedostot poistetaan aina pysyvästi. + En pidä pienoissovelluksen väreistä, voinko vaihtaa ne? + Kyllä. Kun luot pienoissovelluksen aloitusnäytölle aukeaa pienoissovelluksen määritysikkuna. Paina värillisiä neliöitä valitaksesi uudet värit. Vierityspalkista voit myös säätää läpinäkyvyyttä. + Voinko jotenkin palauttaa poistetut tiedostot? + Jos ne todella on poistettu, et voi palauttaa niitä. Oletuksena poistetut tiedostot siirretään roskakoriin, joten varmista, onko tiedostot roskakorissa. + Sovelluksen kuvake hävisi. Mitä voin tehdä? + Tämä johtuu siitä, että käynnistimesi ei tue kuvakkeiden mukauttamista oikein. Yritä käynnistää sovellus Google Playn tai jonkun pienoissovelluksen kautta, jos mahdollista. + Käynnistyksen jälkeen palauta kuvakkeen oranssi oletusväri #F57C00. Pahimmillaan saatat joutua asentamaan sovelluksen uudelleen. + Tiliäni on veloitettu, mutta en voi ladata sovellusta. Mitä voin tehdä\? + Google hoitaa maksut täysin, ajoittain heidän järjestelmässä on häiriöitä. Tyhjennä Google Play-sovelluksen välimuisti, käynnistä laitteesi uudelleen ja yritä latausta uudelleen. + Miksi päivittäisin Pro-versioon? + Koska sovellusversiotasi ei enää päivitetä, et saa korjauksia mahdollisiin bugeihin etkä uusia ominaisuuksia. Voit ostaa Pro-version Google Playsta edullisesti. + Kyseessä on kertamaksu, joka tarkoittaa sitä, että oston jälkeen sinun ei koskaan enää tarvitse maksaa siitä. Ei edes uuden laitteen hankinnan jälkeen. Jos et pidä Pro-versiosta, voit poistaa sen muutaman tunnin kuluessa ja saat automaattisesti rahasi takaisin. + Jos haluat palauttaa myöhemmin. ota yhteyttä hello@simplemobiletools.com ja maksusi palautetaan. + Kuinka valitsen useamman kohteen kerralla? + Siihen on useampi tapa. Ensimmäinen on aloittaa valitsemistila painamalla pitkään yhtä kohdetta ja sen jälkeen napauttamalla muita valittavia kohteita. Toinen tapa on vastaava kuin kohteiden valinta tietokoneella: paina pitkään yhtä kohdetta ja vie sormi muiden valittavien kohteen yli. Kolmas tapa on painaa ensimmäistä kohdetta pitkään ja sen jälkeen viimeistä kohdetta painamalla pitkään valitaan kaikki kohteet niiden väliltä. Jos haluat valita kaikki kohteet, paina vain yhtä kohdetta pitkään ja sen jälkeen valittujen kohteiden lukumäärää yläpalkista napauttamalla valitset kaikki kohteet tai poistat kaikista valinnan. + Olen ostanut sovelluksen, mutta en voi ladata sitä toiselle laitteelle. + Koita tyhjentää Google Play-sovelluksen välimuisti ja käynnistää laite uudestaan. Kyseessä on jokin Google Playn bugi joka ei varsinaisesti liity itse sovellukseen. + + Osallistujat + Käännös + Kehitys + Muu apu + Tämä lista sisältää kaikki ne, jotka ovat merkittävästi auttaneet Simple Mobile Tools-sovelluskokoelman sovelluksissa. Vapaahtoiset tekevätk käännöksiä; ole yhteydessä, jos haluat myös auttaa. Ohje käännöksiin löytyy <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>tästä osoitteesta</a>, tai ole vain yhteydessä sähköpostitse <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> jos sinulla on kysymyksiä. Kiitos kaikille osallistujille ja tukijoille! + Arabia + Azerbaidžan + Bengali + Bretoni + Bulgarian + Katalaani + Tšekki + Kymri + Tanska + English + Saksa + Kreikka + Espanja + Baski + Persia + Suomi + Ranska + Galego + Hindi + Kroatia + Unkari + Indonesia + Italia + Heprea + Japani + Korea + Liettua + Nepali + Norja + Hollanti + Puola + Portugali + Romanian + Venäläinen + Slovakki + Sloveeni + Serbia + Ruotsi + Tamili + Turkki + Ukraina + Vietnam + Kiinalainen (Hongkong) + kiina (yksinkertaistettu) + kiina (perinteinen) + + Hanki Pro-versio nyt! + Perus + Pro + Ei mainoksia + Ei internetyhteyttä + 100% rahat takaisin-takuu + Kertamaksu + Kehittyneempi ulkoasu + + Kehittyt valokuvaeditori + Edistynyt valokuva- ja videoeditori + Tuki HEIC/HEIF-tiedostoille + Kehittynyt monen tiedoston uudelleennimeäminen kerralla + Yksittäisten hakemistojen lukitseminen + Tuki tulostamiselle + + Tuki aikavyöhykkeille + Osallistujat ja sähköpostimuistutukset + Helppo tapahtumien tuonti + Uudet pienoissovellukset + + Parannettu yhteystietojen kaksoiskappaleiden yhdistys + Fonttikoon kustomointi + Valinnainen yhteystietojako sovellustemme välillä + Mukautettavat soittoäänet yhteystiedoille + Yhteystietojen suodatus + Yksityisesti tallennetut yhteystiedot + + Tarkistuslistat + Pienoissovelluskohtainen muistiinpano ja värit + Muistiinpanojen lukitseminen + + Päivämäärän ja ajan näyttömuotojen kustomointi + Pikakuvakkeet kotivalikkoon + Tuki tiedostojen pakkaukselle + Viimeisimmät tiedostot-välilehti + + Taustavärin kustomointi + Tuki tiedostojen tuonnille + Zoomaus + + Tämä sovellus käyttää kolmannen osapuolen lisenssejä tehdäkseni elämästäni helpompaa. Kiitos. + Kolmansien osapuolien lisenssit + Kotlin (ohjelmointikieli) + Subsampling Scale Image View (zoomattavat kuvannäkymät) + Glide (kuvien lataus ja välimuisti) + Picasso (kuvien lataus ja välimuisti) + Android Image Cropper (kuvien rajaus ja kierto) + RtlViewPager (oikealta vasemmalle-pyyhkäisy) + Joda-Time (Java date-korvike) + Stetho (virheenkorjaustietokannat) + Otto (tapahtumaväylä) + PhotoView (zoomattavat GIF-tiedostot) + PatternLockView (kuviolukitus) + Reprint (sormenjälkisuojaus) + Gif Drawable (GIF-lataus) + AutoFitTextView (tekstin koon muutos) + Robolectric (testauspuitteet) + Espresso (testausapuri) + Gson (JSON-jäsennin) + Leak Canary (muistivuotojen havaitseminen) + Number Picker (mukautettava numeronvalitsin) + ExoPlayer (videosoitin) + VR Panorama View (panoraamakuvien näyttö) + Apache Sanselan (kuvien metadatan luku) + Android Photo Filters (kuvasuodattimet) + Gesture Views (zoomattavat kuvat) + Indicator Fast Scroll (kirjaimet vierityspalkissa) + Event Bus (sovelluksen sisäinen viestintä) + Audio Record View (äänen visualisointi) + SMS MMS (SMS ja MMS-viestien käsittely) + APNG Android (animoitu WebP-tuki) + PDFViewPager (PDF-katseluohjelma) + M3U Parser (m3u-soittolistan tiedostojen käsittely) + AndroidLame (mp3-kooderi) + + Kokeilujakso on päättynyt + Aloita ilmainen kokeilujakso + Ilmainen kokeilusi päättyy pian. + Unlock the app for one final day + Tervetuloa sovellukseen %s! + Kiitos sovelluksemme käytöstä. Voit käyttää tätä avattua versiota %d päivän ajan. Harkitse kokeilujakson päättyessä päivitystä Pro-versioon. Se tarjoaa merkittävästi enemmän ominaisuuksoa, modernin ulkoasun ja monia muita parannuksia, eikä siinä ole mainoksia. +\n +\nSe on elinikäinen kertaostos ja jos et ole tyytyväinen, voit poistaa sen ja saada hyvityksen. +\n +\nToivottavasti pidät siitä :) + Päivitä Pro-versioon nauttiaksesi sovelluksesta täysin. +\n +\nSe on elinikäinen kertaostos ja jos et ole tyytyväinen, voit poistaa sen ja saada hyvityksen. +\n +\nNähdään siellä :) + + Kokeilujaksosi päättyy %d päivän kuluttua. + Kokeilujaksosi päättyy %d päivän kuluttua. + + + VANHENTUNUT:: Tätä sovellusversiota ei enää ylläpidetä, hanki Pro-versio osoitteesta https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Muista, että saat rahasi automaattisesti takaisin, jos poistat minkä tahansa maksullisista sovelluksistamme kahden tunnin sisällä asentamisesta. Jos haluat rahasi milloin vain myöhemmin takaisin, ota yhteyttä sähköpostitse hello@simplemobiletools.com ja saat rahat takaisin. Tämä tekee kokeilun helpoksi :) + + Yksinkertaisia vapaan lähdekoodin Android-sovelluksia kustomoitavilla pienoissovelluksilla, ilman mainoksia ja tarpeettomia käyttöoikeuksia. +
    diff --git a/commons/src/main/res/values-fr/strings.xml b/commons/src/main/res/values-fr/strings.xml new file mode 100644 index 000000000..f2f8fd5b3 --- /dev/null +++ b/commons/src/main/res/values-fr/strings.xml @@ -0,0 +1,1165 @@ + + + OK + Annuler + Retour + Aucun + Plus tard + Enregistrer sous + Fichier enregistré + Format de fichier incorrect + Erreur : mémoire insuffisante + Une erreur est survenue : %s + Erreur : %s + Ouvrir avec + Modifier avec + Modifier + Aucune application disponible + Aucun navigateur trouvé + Aucun client de messagerie trouvé + Définir en tant que + Copier dans le presse-papiers + Copier le numéro dans le presse-papiers + Valeur copiée dans le presse-papiers + Valeur copiée dans le presse-papiers : \n%s + Composer le numéro + Inconnu + Toujours + Jamais + Détails + Notes + Suppression du dossier \"%s\" + Aucun + Libellé + Transparent + Couleur transparente + Sélectionnez une couleur différente + Télécharger + Notification + Notifications + Courriel + Précédent + Lecture / Pause + Suivant + Numéro + Aucun contact n\'a été trouvé + Demander les autorisations nécessaires + L\'application n\'a pu accéder à vos contacts + L\'application n\'a pas l\'autorisation de passer des appels téléphoniques, veuillez l\'accorder dans les paramètres de l\'appareil + Saisissez votre texte + Appeler %s + Confirmer l\'appel de %s + Zéro + Un + Deux + Trois + Quatre + Cinq + Six + Sept + Huit + Neuf + Valeur + La valeur ne peut pas être vide + Créer un nouveau contact + Ajouter à un contact existant + Application corrompue + Avis de non-responsabilité + Prendre une photo + Choisir une photo + Choisir une vidéo + Choisir le contact + Choisir un fichier + Enregistrer un audio + Enregistrer une vidéo + Actualisation… + Mémoire du téléphone + Mémoire du téléphone (invisible pour les autres applis) + Audio + + Date de naissance + Autre anniversaire + + Domicile + Travail + + Mobile + Principal + Télécopieur travail + Télécopieur domicile + Téléavertisseur + Aucun numéro de téléphone n\'a été trouvé + + Modifier le mode d\'affichage + Grille + Grille (Pro) + Grille irrégulière + Liste + Ajouter une colonne + Supprimer une colonne + Nombre de colonnes + Nombre de colonnes Portrait + Nombre de colonnes Paysage + Modifier l\'image du dossier + Sélectionner une image + + %d colonne + %d colonnes + %d colonnes + + + Gérer les numéros bloqués + Aucun numéro n\'est bloqué. + Ajouter un numéro bloqué + Bloquer le numéro + Bloquer les numéros + Numéros bloqués + Exporter les numéros bloqués + Importer les numéros bloqués + Cette application doit être l\'application de numérotation par défaut pour utiliser les numéros bloqués. + Définir par défaut + Voulez-vous vraiment bloquer "%s" \? + Bloquer les appels des contacts non enregistrés + Bloquer les messages des contacts non enregistrés + Saisissez un numéro ou un modèle (par exemple, *12345*, +1*8888) pour bloquer tous les appels et messages provenant de numéros correspondant au modèle. + Impossible de bloquer les numéros inconnus sans l\'autorisation de l\'appelant. + + Favoris + Ajouter des favoris + Ajouter aux favoris + Retirer des favoris + + Rechercher + Rechercher dans %s + Saisissez au moins deux caractères pour lancer la recherche. + Rechercher des contacts + Rechercher des favoris + Rechercher des applications + Rechercher des évènements + Rechercher des groupes + Rechercher dans l\'historique + Rechercher des appels + Rechercher des fichiers + Rechercher des dossiers + Rechercher des fichiers et dossiers + Rechercher des playlists + Rechercher des artistes + Rechercher des albums + Rechercher des pistes + Rechercher du texte + Rechercher des conversations + Rechercher des enregistrements + + Filtrer + Filtre (Pro) + Aucun élément trouvé. + Modifier le filtre + + L\'autorisation d\'accès au stockage est nécessaire + L\'autorisation d\'accès aux contacts est nécessaire + L\'autorisation d\'accès à l\'appareil photo est nécessaire + L\'autorisation d\'accès aux paramètres audios est nécessaire + Pas d\'autorisation + Vous devez autoriser l\'application à afficher des notifications, sinon elle ne pourra pas afficher de rappels. + Vous devez autoriser l\'application à afficher des notifications, sinon elle ne pourra pas afficher la barre de progression. + Vous devez autoriser l\'application à afficher des notifications, sinon elle ne peut pas jouer de chansons. + Vous devez autoriser l\'application à afficher des notifications, sinon elle ne peut pas enregistrer de données audio. + Vous devez autoriser l\'application à afficher des notifications, sinon elle ne pourra pas afficher les appels entrants. + Vous devez autoriser l\'application à afficher des notifications, sinon elle ne pourra pas afficher les messages entrants. + Accorder l\'autorisation + Autorisation requise + + Renommer le fichier + Renommer le dossier + Impossible de renommer le fichier + Impossible de renommer le dossier + Le nom de dossier ne peut pas être vide + Un dossier portant ce nom existe déjà + Impossible de renommer le dossier racine de la mémoire + Dossier renommé + Renommage du dossier + Le nom de fichier ne peut pas être vide + Le nom de fichier contient des caractères incorrects + Le nom du fichier \"%s\" contient des caractères incorrects + L\'extension ne peut pas être vide + Le fichier source %s n\'existe pas + Ajouter un préfixe aux noms des fichiers + Ajouter un suffixe aux noms des fichiers + Simple + Modèle + Caractères à ajouter + %Y - année\n%M - mois\n%D - jour\n%h - heure\n%m - minute\n%s - seconde\n%i - Incrémentation débute à 1 + Nom de fichier (sans .txt) + Nom de fichier (sans .json) + Nom de fichier (sans .zip) + À partir d\'Android 11, il n\'est plus possible de cacher les fichiers et les dossiers de cette manière + + Copier + Déplacer + Copier ou déplacer + Copier vers + Déplacer vers + Source + Destination + Sélectionner la destination + Appuyez ici pour sélectionner la destination + Impossible d\'écrire dans la destination sélectionnée + Veuillez sélectionner une destination + La source et la destination ne peuvent pas être identiques + Impossible de copier les fichiers + Copie en cours… + Fichiers copiés + Fichier copié avec succès + Une erreur est survenue + Déplacement en cours… + Fichiers déplacés + Fichier déplacé avec succès + Certains fichiers n\'ont pas pu être déplacés + Certains fichiers n\'ont pas pu être copiés + Aucun fichier sélectionné + Enregistrement en cours… + Impossible de créer le dossier %s + Impossible de créer le fichier %s + Aucun nouvel élément trouvé + La destination n\'a pas assez d\'espace disponible.\nNécessaire : %1$s, disponible : %2$s + Le service système de sélection des fichiers et des dossiers est indisponible + + Créer un nouveau + Dossier + Fichier + Créer un nouveau dossier + Un dossier ou un fichier portant ce nom existe déjà + Le nom contient des caractères incorrects + Veuillez saisir un nom + Une erreur inconnue est survenue + + Le fichier \"%s\" existe déjà + Le fichier \"%s\" existe déjà. L\'écraser ? + Le dossier \"%s\" existe déjà + Fusionner + Conserver les deux + Écraser + Ignorer + Ajouter un suffixe \"_1\" + Appliquer à tous + Le système n\'autorise pas l\'opération dans ce dossier, veuillez en choisir un autre + Le système ne permet pas de copier dans ce dossier, veuillez en choisir un autre + Le système n\'autorise pas le renommage dans ce dossier + Impossible de renommer les dossiers directement sur le stockage interne, seulement les sous-dossiers + Impossible de renommer ce dossier + + Sélectionner un dossier + Sélectionner un fichier + Veuillez confirmer l\'accès au stockage externe + Veuillez confirmer l\'accès au dossier + Veuillez sélectionner le dossier racine de la carte SD sur le prochain écran, pour accorder le droit en écriture + Si vous ne voyez pas la carte SD, essayez ceci + Veuillez autoriser l\'application à accéder au stockage sélectionné sur l\'écran suivant en appuyant sur \"Utiliser ce dossier\" en bas de l\'écran. + Veuillez autoriser l\'accès à \"<b>%s</b>\" sur l\'écran suivant en appuyant sur \"<b>Utiliser ce dossier</b>\" en bas de l\'écran. + Veuillez appuyer sur \"<b>Enregistrer</b>\" en bas de l\'écran suivant pour créer le nouveau dossier. + Confirmer la sélection + Chargement… + Veuillez accorder à notre application l\'accès à tous vos fichiers, elle pourrait ne pas fonctionner correctement sans cela. + + %d élément + %d éléments + %d éléments + + + + %d élément + %d éléments + %d éléments + + + Suppression d\'un élément en cours + Suppression de %d éléments en cours + Suppression de %d éléments en cours + + + + %d contact + %d contacts + %d contacts + + + Sélectionner le stockage + Stockage + Interne + Carte SD + Racine + Dossier sélectionné incorrect, veuillez sélectionner le dossier racine de votre carte SD + Les emplacements de la carte SD et du stockage USB ne peuvent être similaires + L\'application semble installée sur une carte SD, ce qui empêche l\'utilisation des widgets de l\'applications. Ils n\'apparaîtront pas dans la liste des widgets disponibles. + Il s\'agit d\'une limitation système. Si vous souhaitez utiliser des widgets, vous devez déplacer l\'application vers la mémoire interne. + Mauvais dossier sélectionné, veuillez sélectionner l\'emplacement \"%s\" + + Propriétés + Emplacement + Éléments sélectionnés + Nombre de fichiers directs + Nombre total de fichiers + Résolution + Durée + Artiste + Album + Longueur de focale + Durée d\'exposition + Sensibilité ISO + Ouverture + Appareil + EXIF + Titre de la chanson + Coordonnées GPS + Altitude + Supprimer les EXIF + Voulez-vous vraiment supprimer les métadonnées EXIF comme les coordonnées GPS, le modèle d\'appareil etc ? + Valeurs EXIF supprimées avec succès + + Couleur de l\'arrière-plan + Couleur du texte + Couleur principale + Couleur d\'accentuation du thème blanc + Couleur d\'accentuation du thème noir & blanc + Couleur d\'arrière-plan + Couleur d\'icône de l\'application + Couleur de la barre de navigation + Restaurer les valeurs par défaut + Utiliser les valeurs par défaut + Par défaut + Modifier la couleur + Thème + Modifier une couleur renomme le thème en \"Personnalisé\" + Enregistrer + Annuler + Annuler les modifications + Voulez-vous vraiment annuler vos modifications ? + Cette action ne peut être annulée. + Vous avez des modifications non enregistrées. Les enregistrer avant de quitter ? + Appliquer à l\'ensemble de la suite d\'applications \'Simple\' + AVERTISSEMENT : certains lanceurs ne gèrent pas correctement la personnalisation des icônes d\'applications. Au cas où l\'icône disparaîtrait, essayez de lancer l\'application via Google Play ou un widget. + Une fois lancé, réglez simplement l\'icône orange par défaut #F57C00. Dans le pire des cas vous devrez peut-être réinstaller l\'application. + Couleurs actualisées. Un nouveau thème nommé \"Partagé\" a été ajouté. Veuillez utiliser ce thème pour actualiser les couleurs de toutes les applications à partir de maintenant. + Veuillez noter que même si vous utilisez la version Pro de l\'application, pour des raisons techniques, vous aurez toujours besoin de Simple Thank You car c\'est elle qui gère la synchronisation des couleurs. + + Un petit Merci pour déverrouiller cette fonctionnalité et soutenir le développeur. Merci ! + ]]> + + + Clair + Sombre + Automatique + Automatique clair / sombre + Solarisé + Rouge sombre + Blanc + Noir et Blanc + Personnalisé + Partagé + Défaut du système + + Quoi de neuf + * seules les mises à jour les plus importantes sont indiquées ici. Les améliorations mineures ne sont pas détaillées + + Supprimer + Retirer + Renommer + Partager + Partager via + Redimensionner + Tout sélectionner + Sélectionner le texte + Cacher + Ne plus cacher + Cacher le dossier + Ne plus cacher le dossier + Afficher les fichiers cachés + Cacher les fichiers cachés + Impossible de partager autant de contenu à la fois + Vider et désactiver la corbeille + Annuler + Répéter + Imprimer + Imprimer (Pro) + Raccourci + Créer un raccourci + Créer un raccourci (Pro) + Ajouter un numéro au contact + Afficher les détails du contact + Appeler depuis SIM 1 + Appeler depuis SIM 2 + Permuter l\'affichage des noms de fichier + Positionner en haut + Positionner en bas + Épingler l\'élément + Libérer l\'élément + Envoyer un SMS + Envoyer un courriel + Appeler + Détails du contact + Ajouter un contact + Fonds d\'écran + + Trier par + Nom + Dimension + Date de modification + Date de création + Date de prise de vue + Titre + Nom de fichier + Extension + Aléatoire + Trier aléatoirement + Croissant + Décroissant + Utiliser pour ce dossier uniquement + Trier les parties numériques + Prénom + Deuxième prénom + Nom + Nom complet + Utiliser le tri personnalisé + Modifier l\'ordre + + Confirmez-vous vraiment la suppression ? + Voulez-vous vraiment supprimer %s ? + Supprimer %s ? + + Voulez-vous vraiment déplacer %s dans la corbeille ? + + Voulez-vous vraiment supprimer cet élément ? + Voulez-vous vraiment déplacer cet élément dans la corbeille ? + Ne plus demander pour cette session + Ne plus afficher + Oui + Non + Peut-être + + ATTENTION : Vous supprimez %d dossier + ATTENTION : Vous supprimez %d dossiers + ATTENTION : Vous supprimez %d dossiers + + + PIN + Saisir un code PIN + Veuillez saisir un code PIN + Code PIN incorrect + Saisissez à nouveau le code PIN + Schéma + Dessiner un schéma + Schéma incorrect + Redessiner le schéma + Biométrie + Empreinte + Capturer une empreinte + Veuillez placer votre doigt sur le capteur d\'empreinte digitale + Ouvrir la fenêtre de vérification biométrique + Authentifier + Échec de l\'identification + Identification bloquée. Veuillez réessayer dans quelques instants + Vous n\'avez aucune empreinte digitale enregistrée. Veuillez en ajouter depuis les paramètres de votre appareil + Ouvrir les Paramètres + Mot de passe enregistré. Veuillez réinstaller l\'application en cas de problème. + Empreinte enregistrée. Veuillez réinstaller l\'application en cas de problème. + Verrouiller le dossier + Verrouiller le dossier (Pro) + Déverrouiller le dossier + Le verrouillage ne fonctionne que dans cette application. Cette protection ne remplace pas un chiffrage système. + + Hier + Aujourd\'hui + Demain + Tous les jours + Cacher l\'année + secondes + minutes + heures + jours + s + min + h + sem + + %d seconde + %d secondes + %d secondes + + + %d minute + %d minutes + %d minutes + + + %d heure + %d heures + %d heures + + + %d jour + %d jours + %d jours + + + %d semaine + %d semaines + %d semaines + + + %d mois + %d mois + %d mois + + + %d an + %d an + %d ans + + + + %d seconde + %d secondes + %d secondes + + + %d minute + %d minutes + %d minutes + + + %d heure + %d heures + %d heures + + + %d jour + %d jours + %d jours + + + %d semaine + %d semaines + %d semaines + + + %d mois + %d mois + %d mois + + + %d an + %d ans + %d ans + + + + %d seconde avant + %d secondes avant + %d secondes avant + + + %d minute avant + %d minutes avant + %d minutes avant + + + %d heure avant + %d heures avant + %d heures avant + + + %d jour avant + %d jours avant + %d jours avant + + + %d semaine avant + %d semaines avant + %d semaines avant + + + %d mois avant + %d mois avant + %d mois avant + + + %d an avant + %d ans avant + %d ans avant + + + + %d seconde + %d secondes + %d secondes + + + %d minute + %d minutes + %d minutes + + + %d heure + %d heures + %d heures + + + %d jour + %d jours + %d jours + + + %d semaine + %d semaines + %d semaines + + + %d mois + %d mois + %d mois + + + %d an + %d ans + %d ans + + + Durée restante jusqu\'au déclenchement de l\'alarme :\n%s + Durée restante jusqu\'au déclenchement du rappel :\n%s + Temps restant : +\n%s + Veuillez vérifier que l\'alarme fonctionne correctement avant de lui faire confiance. Elle pourrait ne pas fonctionner correctement, en raison du mode d\'économie d\'énergie de votre appareil. + Veuillez vérifier que les rappels fonctionnent correctement avant de leur faire confiance. Ils pourraient ne pas fonctionner correctement, en raison du mode d\'économie d\'énergie de votre appareil. + Les notifications de cette application sont désactivées. Veuillez les activer depuis les paramètres de votre appareil. + + Réveil + Répéter + Ignorer + Aucun rappel + Au démarrage + Sonneries système + Vos sonneries + Ajouter une nouvelle sonnerie + Aucune sonnerie + Pendant la journée à hh:mm + Pendant la journée à %02d:%02d + + Paramètres + Acheter Simple Thank You + Général + Personnalisation des couleurs + Amélioration de la personnalisation des couleurs + Modifier les couleurs + Modifier les couleurs (verrouillé) + Verrouillé + Modifier les couleurs du widget + Personnaliser les notifications + Notification sound + Utiliser la langue anglaise + Langue + Afficher les fichiers cachés + Taille des caractères + Petite + Moyenne + Large + Extra-large + Protéger les éléments cachés par schéma, code PIN ou empreinte + Protéger l\'application par schéma, code PIN ou empreinte + Protéger la suppression et le déplacement de fichiers par schéma, code PIN ou empreinte + Conserver la date de modification après les opérations sur les fichiers + Afficher une info-bulle lors de l\'utilisation de la barre de défilement + Ne pas mettre en veille tant que l\'application est active + Ne pas afficher la fenêtre de confirmation de suppression + Actualiser par glissement depuis le haut de l\'écran + Utiliser le format horaire 24 heures + Modifier le format de date et heure + Démarrer la semaine le dimanche + Widgets + Toujours utiliser le même intervalle de répétition + Intervalle de répétition + Vibrer lors de l\'appui sur un bouton + Déplacer les éléments vers la corbeille au lieu de les supprimer définitivement + Intervalle de vidage de la corbeille + Vider la corbeille + Forcer le mode portrait + Exporter les paramètres + Importer les paramètres + Paramètres exportés avec succès + Paramètres importés avec succès + Trier les contacts par nom de famille + Vider le cache + Afficher une confirmation avant de faire un appel + + Visibilité + Sécurité + Défilement + Opérations de fichiers + Corbeille + Enregistrement en cours + Démarrage + Texte + Migration + Qualité + Écran principal + Vignettes + Liste + + Exclure le dossier + Exclure le dossier + Dossiers exclus + (exclu) + Gérer les dossiers exclus + Tout supprimer + Supprimer tous les dossiers de la liste des exclusions \? Ceci ne supprimera pas les dossiers. + Afficher temporairement les exclus + Arrêter l\'affichage des exclus + + Gérer les onglets affichés + Onglet à ouvrir au démarrage de l\'application + Contacts + Favoris + Historique d\'appels + Groupes + Le dernier utilisé + Fichiers + Fichiers récents + + Restaurer ce fichier + Restaurer la sélection + Restaurer tous les fichiers + Corbeille vidée + Fichiers restaurés avec succès + Voulez-vous vraiment vider la corbeille ? Les fichiers seront définitivement supprimés. + La corbeille est vide + Le déplacement des éléments de la corbeille est désactivé, veuillez utiliser la fonction de restauration + Afficher la corbeille + Cacher la corbeille + Ouvrir la corbeille + Oubliez la corbeille, supprimez directement les fichiers + + %d élément déplacé dans la corbeille + %d éléments déplacés dans la corbeille + %d éléments déplacés dans la corbeille + + + Importer… + Exporter… + Importation terminée + Exportation terminée + Échec de l\'importation + Échec de l\'exportation + Échec de l\'importation de certains éléments + Échec de l\'exportation de certains éléments + Aucun élément pouvant être importé n\'a été trouvé + Aucun nouvel élément pouvant être importé n\'a été trouvé + Aucun élément pouvant être exporté n\'a été trouvé + Sauvegardes + Activer les sauvegardes automatiques + Gérer les sauvegardes automatiques + Vous pouvez utiliser les modèles suivants pour nommer votre fichier automatiquement : +\n +\n%Y - année +\n%M - mois +\n%D - jour +\n%h - heure +\n%m - minute +\n%s - seconde + + USB + Il semblerait qu\'un périphérique USB soit connecté à votre appareil. Pour que les fichiers de ce périphérique s\'affichent correctement, vous devez accorder des autorisations supplémentaires. + Veuillez sélectionner le dossier racine du périphérique USB sur l\'écran suivant afin de pouvoir y accéder + Erreur de dossier. Veuillez sélectionner le dossier racine du périphérique USB + + Janvier + Février + Mars + Avril + Mai + Juin + Juillet + Août + Septembre + Octobre + Novembre + Décembre + + Jan + Fév + Mar + Avr + Mai + Juin + Juil + Aoû + Sept + Oct + Nov + Déc + + en janvier + en février + en mars + en avril + en mai + en juin + en juillet + en août + en septembre + en octobre + en novembre + en décembre + Lundi + Mardi + Mercredi + Jeudi + Vendredi + Samedi + Dimanche + L + Ma + Me + J + V + S + D + Lun + Mar + Mer + Jeu + Ven + Sam + Dim + + La version de votre application ne sera plus mise à jour. Veuillez installer la version Pro pour recevoir des correctifs et bénéficier des améliorations. + La version de votre application ne sera plus mise à jour. Veuillez installer la version Pro pour recevoir des correctifs et bénéficier des nouvelles améliorations en cliquant ici. + Gratuit jusqu\'au : %s. Si vous la téléchargez avant cette date, vous pourrez définitivement l\'utiliser gratuitement. + Plus d\'information + Passer à la version Pro + Vous devez migrer manuellement les évènements stockés localement via une exportation dans un fichier .ics, puis une importation. Vous trouverez les boutons d\'exportation/importation dans le menu de l\'écran principal. + Bonjour, +\n +\nIl semblerait que vous veniez de mettre à jour la version gratuite. Une fois que vous serez satisfait de cette version et que vous aurez peut-être migré vos paramètres et vos favoris, vous pourrez désinstaller l\'ancienne version gratuite pour éviter de la lancer accidentellement, car vous n\'en aurez plus besoin. +\n +\nMerci de votre compréhension ! + Bonjour, +\n +\nil semble que vous ayez déjà la version Pro de l\'application. Une fois que vous en serez satisfait et que vous aurez peut-être migré vos paramètres et vos favoris, vous pourrez désinstaller celle-ci pour éviter de la lancer accidentellement, car vous n\'en aurez plus besoin. +\n +\nMerci de votre compréhension ! + Bonjour, +\n +\nil semble que vous ayez effectué une mise à niveau depuis la version gratuite. Une fois que vous serez satisfait de celle-ci et que vous aurez peut-être migré vos données, vous pourrez désinstaller l\'ancienne version gratuite pour éviter de la lancer accidentellement car vous n\'en aurez plus besoin. +\n +\nMerci ! + Bonjour, +\n +\nil semble que vous ayez déjà la version Pro de l\'application également. Une fois que vous en serez satisfait et que vous aurez peut-être migré vos données, vous pourrez désinstaller celle-ci pour éviter de la lancer accidentellement car vous n\'en aurez plus besoin. +\n +\nMerci ! + Bonjour, +\n +\nIl semble que vous ayez effectué une mise à niveau depuis la version gratuite. Si vous souhaitez migrer vos évènements stockés localement, vous devez le faire manuellement en les exportant dans un fichier .ics dans la version gratuite de l\'application et en les important ici via le menu supérieur. +\n +\nUne fois que vous êtes satisfait de votre installation dans la version Pro, vous pouvez désinstaller l\'ancienne version gratuite car vous n\'en aurez plus besoin. +\n +\nMerci ! + Bonjour, +\n +\nIl semble que vous ayez effectué une mise à jour depuis la version gratuite. Si vous aviez des contacts stockés sous « %s », vous devez les migrer manuellement en les exportant dans un fichier .vcf depuis la version gratuite de l\'application et en les important ici via le menu supérieur. +\n +\nUne fois que vous êtes satisfait de votre installation dans la version Pro, vous pouvez désinstaller l\'ancienne version gratuite car vous n\'en aurez plus besoin. +\n +\nMerci ! + Bonjour, +\n +\nIl semble que vous ayez effectué une mise à niveau depuis la version gratuite. Si vous souhaitez migrer vos notes, vous devez le faire manuellement en les exportant dans un fichier dans la version gratuite de l\'application et en les important ici via le menu supérieur. +\n +\nUne fois que vous êtes satisfait de votre installation dans la version Pro, vous pouvez désinstaller l\'ancienne version gratuite car vous n\'en aurez plus besoin. +\n +\nMerci ! + + À propos + Site web + Pour le code source, consultez + Envoyez vos commentaires ou suggestions à + Passer à la version Pro + Plus d\'applications + Plus d\'applications + Inviter des amis + Salut, viens voir %1$s sur %2$s + Inviter via + Nous évaluer + Notez + Faire un don + Suivez-nous + v %1$s\nCopyright © Simple Mobile Tools %2$d + Assistance + Nous aider + Réseaux sociaux + Autre + Politique de confidentialité + Version %s + Bonjour :) + Fait avec ❤️ en Slovaquie + Informations supplémentaires + Version de l\'application : %s + Système d\'exploitation de l\'appareil : %s + +
    + Nous espérons que vous appréciez cette application. Elle ne contient aucune publicité, mais vous pouvez soutenir son développement en achetant l\'application Simple Thank You. Cela nous permettra également de ne plus vous afficher cette boite de dialogue.

    + Merci ! + ]]> +
    + Bonjour,<br><br>J\'espère que vous appréciez cette application. Elle ne contient aucune publicité et nous ne collectons pas non plus vos données, soutenez son développement en achetant <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. Vous aurez également toutes les fonctionnalités de l\'appli y compris la personnalisation des couleurs débloquées.<br><br>Merci ! + Soutenez-nous en achetant <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> s\'il vous plaît, cela débloquera également toutes les fonctionnalités de l\'application y compris la personnalisation des couleurs. + Acheter + Commander un Simple Phone + Veuillez mettre à jour Simple Thank You + Avant de poser une question, veuillez vérifier les paramètres de l\'application et lire la foire aux questions. Il est possible que la solution s\'y trouve. + Avant de nous évaluer, veuillez vérifier les paramètres de l\'application et lire la foire aux questions. Si vous rencontrez des problèmes, il est possible que la solution s\'y trouve. + Assurez-vous également que vous utilisez la version la plus récente de l\'application. + Notez également que cette version de l\'application n\'est plus développée. Procurez-vous la version Pro pour bénéficier de nombreuses améliorations. + Consulter + Lire la FAQ + Bonjour,\n\nil semblerait que vous utilisez cette application depuis un certain temps et nous vous en remercions.\n\nSi nous pouvons vous demander une faveur, veuillez nous évaluer sur Google Play. Cela nous aiderait beaucoup.\n\nPeu importe le contenu de votre évaluation, vous ne verrez plus ce message.\n\nMerci d\'avance ! + Merci d\'évaluer notre application :) + Merci + Le widget est verrouillé.\nVeuillez passer à la version Pro pour le déverrouiller. + Cette fonctionnalité est verrouillée, achetez <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> pour déverrouiller l\'application complète.<br><br>C\'est un paiement unique et si vous n\'êtes pas satisfait·e, nous pouvons vous rembourser. + + +
    + Une nouvelle application a été publiée récemment :

    + %2$s

    + %4$s

    + %6$s

    + Vous pouvez la télécharger en appuyant sur son titre.

    + Merci + ]]> +
    + Lanceur d\'applications simple + Calculatrice simple + Calendrier simple + Appareil photo simple + Horloge simple + Contacts simple + Clavier de téléphone simple + Dessin simple + Gestionnaire de fichiers simple + Lampe de poche simple + Galerie simple + Clavier simple + Lanceur simple + Lecteur de musique simple + Notes simple + Messagerie SMS simple + Merci simple + Enregistreur vocal simple + Lanceur d\'applications + Calculatrice + Calendrier + Appareil photo + Horloge + Contacts + Clavier de téléphone + Dessin + Gestionnaire de fichiers + Lampe de poche + Galerie + Clavier + Lanceur + Lecteur de musique + Notes + Messagerie SMS + Merci + Enregistreur vocal + + ici. + ]]> + + + Foire aux questions (FAQ) + Avant de poser une question, consultez d\'abord la + Pourquoi ne vois-je pas les widgets de cette application dans la liste des widgets ? + Probablement parce que l\'application a été déplacée sur la carte SD. Android a une limitation qui fait qu\'il n\'affiche pas les widgets de cette application dans ce cas. La seule solution consiste à déplacer l\'application vers le stockage interne depuis les paramètres système. + Je voudrais vous apporter mon soutien, mais je ne peux pas vous donner de l\'argent. Y a-t-il autre chose que je puisse faire ? + Oui, bien sûr. Vous pouvez faire connaître les applications ou donner de bons commentaires et des évaluations. Vous pouvez également aider en traduisant les apps dans une nouvelle langue, ou simplement mettre à jour certaines traductions existantes. Le guide de la traduction se trouve sur <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>ce site web</a>, ou contactez-nous simplement à <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> si vous avez des questions. + J\'ai effacé des fichiers par erreur. Comment les récupérer ? + C\'est malheureusement impossible, car les fichiers sont supprimés instantanément après le dialogue de confirmation et il n\'y a pas de corbeille. + Je n\'aime pas les couleurs du widget. Puis-je les changer ? + Oui, quand vous glissez le widget sur l\'écran d\'accueil un dialogue de configuration apparaît. Vous verrez des carrés en bas à gauche, en appuyant dessus vous pouvez choisir une nouvelle couleur. Vous pouvez aussi utiliser le curseur pour régler la transparence. + Puis-je restaurer les fichiers supprimés ? + S\'ils ont été réellement supprimés, vous ne pouvez pas. Cependant, une corbeille étant activée par défaut, les fichiers ont peut-être simplement été déplacés dans la corbeille au lieu d\'être supprimés. + L\'icône du lanceur d\'applications a disparu. Que puis-je faire ? + Votre lanceur ne prend pas correctement en charge la personnalisation des icônes. Essayez de lancer l\'application via Google Play ou un widget, le cas échéant. + Une fois lancé, il vous suffit de redéfinir l\'icône orange par défaut #F57C00. Dans le pire des cas, vous devrez peut-être réinstaller l\'application. + L\'argent a été débité de mon compte bancaire, mais je ne peux pas télécharger l\'application. Que puis-je faire ? + Les paiements sont entièrement gérés par Google, leur système se heurte parfois à des problèmes. Effacez simplement le cache de votre application Google Play, redémarrez votre appareil, puis réessayez de télécharger. + Pourquoi devrais-je passer à la version Pro ? + La version de votre application n\'étant plus mise à jour, les bugs que vous avez peut-être repérés ne seront jamais corrigés. Il n\'y aura pas non plus de nouvelles fonctions ajoutées. Vous pouvez acheter la version Pro sur Google Play pour une petite somme d\'argent. + C\'est un paiement unique, ce qui signifie qu\'une fois que vous l\'achetez, vous n\'aurez plus jamais à payer. Pas même après avoir acheté un nouvel appareil. Si vous n\'aimez pas la version Pro, vous pouvez simplement la désinstaller après quelques heures et vous serez automatiquement remboursé. + Si vous souhaitez un remboursement à tout moment, contactez-nous à l\'adresse hello@simplemobiletools.com et vous l\'obtiendrez. + Comment puis-je sélectionner plusieurs éléments en même temps ? + Il y a plusieurs façon de faire cela. La première est de passer en mode de sélection en appuyant longuement sur un objet, puis en cliquant simplement sur les autres objets pour les sélectionner. La deuxième est similaire à la sélection d\'objets sur PC avec une souris, + passez en mode de sélection en appuyant longuement sur un objet, puis en maintenant votre doigt appuyé, glissez le sur plusieurs objets pour les sélectionner. La troisième façon de sélectionner plusieurs objets est d\'appuyer longuement sur un objet, puis appuyer longuement sur un autre et tout ce qui sera entre les deux objets sera sélectionné. Si vous + voulez sélectionner tous les objets, appuyez longuement sur un objet, et cliquez sur le compteur de sélection dans le coin supérieur gauche. Cela sélectionnera ou désélectionnera tous les objets. + J\'ai acheté l\'application, mais je ne peux pas la télécharger sur un autre appareil. + Essayez de vider le cache de votre application Google Play et de redémarrer votre appareil. C\'est un problème de Google Play, pas vraiment lié à l\'application elle-même. + + Contributeurs + Traduction + Développement + Autre aide + Cette liste contient toutes les personnes qui ont aidé de manière notable une application de la suite Simple Mobile Tools, et pas seulement celle-ci. Les traductions sont gérées par des bénévoles, faites-nous savoir si vous voulez aider aussi. Le guide de la traduction se trouve sur <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>ce site web</a>, ou contactez-nous simplement à <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> si vous avez des questions. Merci à tous les contributeurs et autres soutiens ! + Arabe + Azerbaïdjanais + Bengali + Breton + Bulgare + Catalan + Tchèque + Gallois + Danois + Anglais + Allemand + Grec + Espagnol + Basque + Persan + Finnois + Français + Galicien + Hindi + Croate + Hongrois + Indonésien + Italien + Hébreu + Japonais + Coréen + Lituanien + Népalais + Norvégien + Néerlandais + Polonais + Portugais + Roumain + Russe + Slovaque + Slovène + Serbe + Suédois + Tamil + Turc + Ukrainien + Vietnamien + Chinois (Hong Kong) + Chinois (Simplifié) + Chinois (Traditionel) + + Obtenez la version Pro maintenant ! + Basique + Pro + Sans publicité + Aucun accès Internet + Garantie de remboursement à 100% + Paiement unique + Design amélioré + + Éditeur de photos avancé + Éditeur photo et vidéo avancé + Support des fichiers HEIC/HEIF + Renommage avancé des fichiers par lot + Verrouillage des dossiers individuels + Support de l\'impression + + Support des fuseaux horaires + Participants et rappels par courrier électronique + Importation facile des évènements + Nouveaux widgets + + Fusion améliorée des contacts en double + Personnalisation de la taille des caractères + Partage facultatif des contacts privés entre nos applications + Sonnerie personnalisée par contact + Filtrage des contacts + Contacts stockés de manière privée + + Listes de contrôle + Différentes couleurs par widget + Verrouillage des notes + + Personnalisation du format de date et d\'heure + Raccourcis pour l\'écran d\'accueil + Prend en charge la compression de fichiers + Onglet avec les fichiers récents + + Personnalisation de la couleur de fond + Prend en charge l\'importation de fichiers + Zoom + + Cette application utilise les bibliothèques tierces suivantes pour me simplifier la vie. Merci. + Licences tierces + Kotlin (langage de programmation) + Subsampling Scale Image View (affichage par zoom des images) + Glide (chargement et mise en cache d\'images) + Picasso (chargement et mise en cache d\'images) + Android Image Cropper (recadrage et rotation d\'images) + RtlViewPager (glissement de droite à gauche) + Joda-Time (conversion de date Java) + Stetho (débogage de bases de données) + Otto (bus d\'événement) + PhotoView (affichage par zoom des GIFs) + PatternLockView (protection par schéma) + Reprint (protection par empreinte digitale) + Gif Drawable (chargement des GIFs) + AutoFitTextView (redimensionnement du texte) + Robolectric (structure de système de test) + Espresso (assistant de test) + Gson (analyseur JSON) + Leak Canary (détecteur de fuite mémoire) + Number Picker (sélecteur de numéro personnalisable) + ExoPlayer (lecteur vidéo) + VR Panorama View (affichage des panoramas) + Apache Sanselan (lecture de métadonnées d\'image) + Android Photo Filters (filtres d\'image) + Gesture Views (zoom d\'images) + Indicator Fast Scroll (lettre sur barre de défilement) + Event Bus (communication au sein de l\'application.) + Audio Record View (visualisation audio) + SMS MMS (gestion SMS et MMS) + APNG Android (support WebP animé) + PDFViewPager (visionneuse de PDF) + M3U Parser (traitement des fichiers de listes de lecture m3u) + AndroidLame (encodeur mp3) + + Essai expiré + Commencer un essai gratuit + Votre essai expire bientôt. + Déverrouiller l\'application pour un dernier jour + Bienvenue sur %s ! + Merci d\'utiliser notre application. Vous pouvez utiliser cette version déverrouillée pendant %d jours. Une fois la période d\'essai terminée, pensez à passer à la version Pro. Elle comporte un grand nombre de nouvelles fonctionnalités, un design moderne, aucune publicité et de nombreuses autres améliorations. +\n +\nVous n\'avez qu\'à payer pour cette version une fois dans votre vie et si vous n\'êtes pas satisfait, vous pouvez la désinstaller et vous faire rembourser. +\n +\nJ\'espère que ça vous plaira :) + Veuillez passer à la version Pro pour profiter pleinement de l\'application. +\n +\nVous n\'avez qu\'à payer une fois dans votre vie et si vous n\'êtes pas satisfait, vous pouvez la désinstaller et vous faire rembourser. +\n +\nÀ bientôt :) + + Votre essai expire dans %d jour. + Votre essai expire dans %d jours. + Votre essai expire dans %d jours. + + + ATTENTION : cette version de l\'application n\'est plus maintenue. Procurez-vous la version Pro à l\'adresse https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + N\'oubliez pas que si vous désinstallez une application payante dans les 2 heures, vous serez automatiquement remboursé. Si vous souhaitez un remboursement, à tout moment, contactez-nous à hello@simplemobiletools.com et vous l\'obtiendrez. Alors n\'hésitez pas et essayez nos applications :) + + Un groupe d\'applications Android open-source simples avec widgets personnalisables, sans publicité ni permission inutile. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-gl/strings.xml b/commons/src/main/res/values-gl/strings.xml new file mode 100644 index 000000000..8530b588d --- /dev/null +++ b/commons/src/main/res/values-gl/strings.xml @@ -0,0 +1,1102 @@ + + + Aceptar + Cancelar + De volta + Nada + Despois + Gardar como + Ficheiro gardado con éxito + Formato de ficheiro non válido + Erro: sen memoria + Ocorreu un erro: %s + Error: %s + Abrir con + Editar con + Editar + Non se atopou un aplicativo válido + Non se atopou ningún navegador + Non se atopou ningún cliente de correo electrónico + Establecer como + Copiar ao portapapeis + Copialo número no portapapeis + Valor copiado no portapapeis + Valor copiado no portapapeis:\n%s + Marque o número + Descoñecido + Sempre + Nunca + Detalles + Notas + Borrando cartafol \'%s\' + Ningún + Etiqueta + Transparente + Cor transparente + Escolle unha cor distinta + Descargar + Notificación + Notifications + Correo electrónico + Anterior + Reprod. / Pausa + Seguinte + Número + Non se atoparon contactos + Solicitar os permisos necesarios + O aplicativo non puido acceder aos teus contactos + A aplicación non ten permiso para iniciar chamadas telefónicas. Concédeo na configuración do dispositivo + Introduce o texto aquí + Chamar a %s + Confirmala chamada de %s + Cero + Un + Dous + Tres + Catro + Cinco + Seis + Sete + Oito + Nove + Valor + O valor non pode atoparse baleiro + Crear un novo contacto + Engadir a un contacto existente + Aplicación corrupta + Exención da responsabilidade + Facer foto + Elexir foto + Escolla un vídeo + Escolla un contacto + Escolla un ficheiro + Gravar audio + Gravar vídeo + Actualizando… + Almacenaxe do móbil + Almacenaxe do móbil (non visible por outras apps) + Audio + + Aniversario + Aniversario + + Persoal + Profesional + + Móbil + Principal + Fax do traballo + Fax persoal + Busca + Número de teléfono non atopado + + Cambiar o tipo de vista + Grella + Grella (Pro) + Reixa desigual + Lista + Aumenta o número de columnas + Reduce o número de columnas + Conta columnas + Número das columnas do retrato + Número das columnas horizontais + Cambiar a imaxe de portada + Escolle foto + + %d columna + %d columnas + + + Administrar números bloqueados + Non hai ninguén bloqueado. + Engadir un número para bloquear + Bloquear número + Bloquear números + Números bloqueados + Exportalos números bloqueados + Importalos números bloqueados + Para facer uso dos números bloqueados, tes que poñer este aplicativo como o marcador telefónico por defecto. + Poñer por defecto + Seguro que queres bloquear a \"%s\"? + Bloquealas chamadas dos contactos non gardados + Bloquealas mensaxes do contactos non gardados + Introduce un número ou un patrón (por exemplo, *12345*, +1*8888) para bloquear todalas chamadas e mensaxes dos números que coincidan co patrón. + Non se poden bloquealos números descoñecidos sen o permiso do identificador das chamadas. + + Favoritos + Engadir a favoritos + Engadir aos favoritos + Eliminar dos favoritos + + Buscar + Busca en %s + Escribe polo menos dous caracteres para iniciar a busca. + Buscar contactos + Atopalos favoritos + Atopalas aplicacións + Buscalos eventos + Atopalos grupos + Historial da busca + Buscalas chamadas + Buscalos ficheiros + Buscalos cartafoles + Buscalos ficheiros e cartafoles + Buscalas listas de reproducions + Buscalos artistas + Buscalos álbums + Buscalas pistas + Buscalo texto + Buscalas conversas + Buscalas gravacións + + Filtro + Filtro (Pro) + Non se atopou ningún elemento. + Cambiar filtro + + Requírese permiso de almacenamento + Requírese permiso de Contactos + Requírese permiso da cámara + Requírese permiso de audio + Sen permiso + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Renomear ficheiro + Renomear cartafol + No se puido renomear o ficheiro + No se puido renomear o cartafol + O nome do cartafol non pode estar baleiro + Xa existe un cartafol con ese nome + Non se pode cambiar o nome do cartafol raíz do almacenamento + Cartafol renomeado correctamente + Renomeando cartafol + O nome do ficheiro non pode estar baleiro + O nome do ficheiro contén caracteres non válidos + O nome do ficheiro \'%s\' contén caracteres non válidos + A extensión non pode estar baleira + O ficheiro %s non existe + Antepoñer nomes de ficheiros + Pospoñer nomes de ficheiros + Renomeado simple + Patrón + Cadea a engadir + %Y - ano +\n%M - mes +\n%D - día +\n%h - hora +\n%m - minuto +\n%s - segundo +\n%i - o número aumenta dende 1 + Nome do ficheiro (sen .txt) + Nome do ficheiro (sen .json) + Nome do ficheiro (sen .zip) + Dende Android 11, xa non podes ocultalos ficheiros e cartafoles así + + Copiar + Mover + Copiar/Mover + Copiar a + Mover a + Orixe + Destino + Seleccionar destino + Prema aquí para escoller o destino + Non se puido escribir no destino escollido + Escolle un destino + A orixe e o destino non poden coincidir + Non se puideron copiar os ficheiros + Copiando… + Ficheiros copiados correctamente + O ficheiro copiouse correctamente + Ocorreu un erro + Movendo… + Ficheiros movidos correctamente + O ficheiro moveuse correctamente + Algúns ficheiros non se puideron mover + Algúns ficheiros non se puideron copiar + Non hai ficheiros seleccionados + Gardando… + Non se puido crear o cartafol %s + Non se puido crear o ficheiro %s + Non se atoparon elementos novos + O destino non ten suficiente espazo dispoñible.\nNecesario %1$s, dispoñible %2$s + O servizo do sistema para seleccionar ficheiros e cartafoles non está dispoñible + + Crear un novo + Cartafol + Ficheiro + Crear novo cartafol + Xa existe un ficheiro ou cartafol con ese nome + O nome contén caracteres non válidos + Introduce un nome + Ocurreu un erro descoñecido + + O ficheiro \"%s\" xa existe + O ficheiro \"%s\" xa existe. Sobreescribir? + O cartafol \"%s\" xa existe + Fusionar + Manter ambos + Sobreescribir + Saltar + Engadir \'_1\' + Aplicar a todo + O sistema non permite a operación neste cartafol, escolla outro + O sistema non permite copiar neste cartafol, escolla outro + O sistema non permite cambialo nome neste cartafol + Non se poden cambialo nome dos cartafoles directamente no almacenamento interno, só os subcartafoles + Non se pode cambialo nome deste cartafol + + Selecciona un cartafol + Selecciona un ficheiro + Permite o acceso ao almacenamiento externo + Confirme o acceso ao cartafol + Por favor, escolle a carpeta raíz da tarxeta SD na próxima pantalla para conceder o acceso de escritura + Se non ves a tarxeta SD, proba isto + Permite que a aplicación acceda ao almacenamento seleccionado na seguinte pantalla premendo \"Usar este cartafol\" na parte inferior. + Permite acceder a \"%s\" na seguinte pantalla premendo \"Usar este cartafol\" na parte inferior. + Preme \"Gardar\" na parte inferior da seguinte pantalla para crear o novo cartafol. + Confirmar a selección + Cargando… + Concédelle á nosa aplicación acceso a todolos teus ficheiros, porque sen ela pode que non funcione ben. + + %d elemento + %d elementos + + + + %d elemento + %d elementos + + + Eliminando %d elemento + Eliminando %d elementos + + + + %d contacto + %d contactos + + + Escolle o almacenamento + Almacenamento + Almacenamento interno + Tarxeta SD + Raíz (Root) + Seleccionouse o cartafol incorrecto; por favor, escolle o cartafol raíz da túa tarxeta SD + Os directorios da tarxeta SD e do dispositivo USB non poden coincidir + Parece que tes o aplicativo instalado na tarxeta SD, o que ocasiona que os widgets do aplicativo non estean dispoñibles. Non os verás na lista de widgets dispoñibles. + Isto é unha limitación do sistema, así que se queres usar os widgets, tes que mover o aplicativo ao almacenamento interno. + Seleccionouse un cartafol errado, selecciona o camiño \'%s\' + + Propiedades + Camiño + Elementos seleccionados + Número de ficheiros directamente contidos + Número total de ficheiros + Resolución + Duración + Artista + Álbum + Lonxitude focal + Tempo de exposición + Velocidade ISO + Número F + Cámara + EXIF + Título da canción + Coordenadas GPS + Altitude + Eliminar EXIF + Estás seguro de que queres eliminar valores EXIF como as coordenadas GPS, o modelo de cámara, etc.\? + Os valores EXIF elimináronse correctamente + + A cor do fondo + Cor do texto + Cor principal + Cor de acento do tema branco + A cor do acento do tema Branco e negro + A cor de diante + Cor da icona do aplicativo + Cor da barra de navegación inferior + Valores por defecto + Usar valor por defecto + Por defecto + Cambiar cor + Tema + Cambiar unha cor fará que se cambie ao tema personalizado + Gardar + Desfacer + Desfacer cambios + Seguro que queres desfacer os cambios? + Esta acción non se pode desfacer. + Tes cambios sen aplicar. Gardar antes de saír? + Aplicar cores a todos os aplicativos. Simple Apps + AVISO: algúns lanzadores non manexan ben a personalización da icona dos aplicativos. Se a icona desaparece, intenta iniciar o aplicativo mediante o Google Play ou algún widget, se está dispoñible. + Unha vez que a inicies, volve a axustar a icona ao laranxa por defecto #F57C00. No peor dos casos, pode que teñas que volver a instalar o aplicativo. + Cores actualizadas correctamente. Engadiuse un novo tema chamado \'Compartido\'. Utilízao para actualizar as cores de todos os aplicativos no futuro. + Teña en conta que aínda que esteas a usar a versión da aplicación Pro, aínda necesitas Grazas Sinxelas por razóns técnicas. Encárgase da sincronización das cores. + Por favor, merca <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> para desbloquear esta función e axudar co desenvolvemento. Grazas! + + Claro + Escuro + Auto + Auto claro/escuro + Solarizado + Vermello escuro + White + Branco e negro + Personalizado + Compartido + Sistema predeterminado + + Novidades + * Só se enumeran aquí as actualizacións máis grandes, sempre hai tamén algunhas melloras pequenas + + Eliminar + Quitar + Renomear + Compartir + Compartir con + Redimensionar + Seleccionar todo + Seleccione o texto + Ocultar + Amosar + Ocultar cartafol + Amosar cartafol + Amosar ocultos temporalmente + Deixar de amosar os ocultos + Non podes compartir todo este contido á vez + Baleirar e desactivar a Papeleira + Desfacer + Refacer + Imprimir + Imprimir (Pro) + Atallo + Crear atallo + Crear atallo (Pro) + Engadir número o contacto + View contact details + Chamada dende a SIM 1 + Chamada dende a SIM 2 + Mudar a visibilidade do ficheiro + Mover á parte superior + Mover ao fondo + Pin item + Solte o elemento + Send SMS + Send email + Chamar + Contact details + Add contact + Fondos da pantalla + + Ordenar por + Nome + Tamaño + Modificación + Data de creación + Creación + Título + Nome do ficheiro + Extensión + Aleatorio + Ordenar aleatoriamente + Ascendente + Descendente + Só para este cartafol + Ordenar as partes numéricas polo seu valor real + Primeiro nome + Segundo nome + Apelidos + Nome completo + Usala clasificación personalizada + Cambialo orde + + Seguro que queres continuar coa eliminación? + Seguro que queres eliminar %s? + Delete %s? + + Seguro que queres mover %s á Papeleira? + + Seguro que queres eliminar este elemento? + Seguro que queres mover este elemento á Papeleira? + Non preguntar de novo nesta sesión + Non volver a mostrar + Si + Non + Pode ser + + AVISO: vas eliminar %d cartafol + AVISO: vas eliminar %d cartafois + + + PIN + Introduce PIN + Por favor, introduce un PIN + PIN erróneo + Repetir PIN + Patrón + Insire patrón + Patrón erróneo + Repetir patrón + Biometría + Pegada dixital + Engadir pegada dixital + Pon o dedo no lector de pegadas dixitais + Abrilo diálogo da verificación da identificación biométrica + Identificarse + Autenticación fallada + Autenticación bloqueada; por favor, inténtao de novo dentro dun pouco + Non tes pegadas dixitais rexistradas; por favor, engada algunhas na Configuración do teu dispositivo + Ir á Configuración + Engadiuse o contrasinal correctamente. Por favor, volve a instalar o aplicativo en caso de que te esquezas dela. + Protección configurada correctamente. Por favor, volve a instalar o aplicativo en caso de que teñas problemas ao restablecela. + Bloquear cartafol + Bloquear cartafol (Pro) + Desbloquear cartafol + Esta protección só funciona neste app, non está pensado para reemprazar un cifrado de cartafois real a nivel de sistema. + + Onte + Hoxe + Mañá + Tódolos días + Agochar ano + Segundos + Minutos + Horas + Días + s + m + h + wk. + + %d segundo + %d segundos + + + %d minuto + %d minutos + + + %d hora + %d horas + + + %d día + %d días + + + %d semana + %d semanas + + + %d mes + %d meses + + + %d ano + %d anos + + + + %d segundo + %d segundos + + + %d minuto + %d minutos + + + %d hora + %d horas + + + %d día + %d días + + + %d semana + %d semanas + + + %d mes + %d meses + + + %d ano + %d anos + + + + %d segundo antes + %d segundos antes + + + %d minuto antes + %d minutos antes + + + %d hora antes + %d horas antes + + + %d día antes + %d días antes + + + %d semana antes + %d semanas antes + + + %d mes antes + %d meses antes + + + %d ano antes + %d anos antes + + + + %d segundo + %d segundos + + + %d minuto + %d minutos + + + %d hora + %d horas + + + %d día + %d días + + + %d semana + %d semanas + + + %d mes + %d meses + + + %d ano + %d anos + + + Tempo que falta para que soe a alarma:\n%s + Tempo que falta para o recordatorio:\n%s + Tempo restante: +\n%s + Por favor, asegúrate de que a alarma funciona correctamente antes de confiares nela. Pode non funcionar ben debido a restricións do sistema relacionadas co aforro de batería. + Por favor, asegúrate de que os recordatorios funcionan correctamente antes de confiares neles. Poden non funcionar ben debido a restricións do sistema relacionadas co aforro de batería. + As notificacións desta aplicación están desactivadas. Accede á configuración do teu dispositivo para activalos. + + Alarma + Pospoñer + Descartar + Sen recordatorio + Ao inicio + Sons do sistema + Os teus sons + Engadir un novo son + Silencio + Durante o día hh:mm + Durante o día en %02d:%02d + + Axustes + Mercar Grazas sinxelas + General + Persoaliza a cor + Persoalización mellorada das cores + Cambiar cores + Persoalizalas cores (bloqueado) + Pechado + Persoalizalas cores do widget + Persoalizalas notificacións + Notification sound + Usala lingua inglesa + Lingua + Amosar elementos ocultos + Tamaño da fonte + Pequena + Mediana + Grande + Enorme + Contrasinal para protexer os elementos ocultos + Contrasinal para protexer todo o aplicativo + Contrasinal para protexer borrado e movemento de ficheiros + Manter a data de última modificación antiga ao operar con ficheiros + Amosar unha burbulla de información ao arrastrar a barra de desprazamento + Impedir que se apague a pantalla mentres o app estea en primeiro plano + Omitir sempre o diálogo de confirmación de eliminación + Habilitar tirar desde a parte superior para actualizar + Usalo formato de 24 horas + Cambiar formato de hora e data + Comezar semana no domingo + Widgets + Usar sempre o mesmo tempo de aprazamento + Tempo de aprazamento + Vibrar ao premer nun botón + Mover elementos á Papeleira no canto de eliminar + Intervalo de limpeza da Papeleira + Baleirar a Papeleira + Forzalo modo retrato + Exportalos axustes + Importalos axustes + Axustes exportados correctamente + Axustes importados correctamente + Empezar o nome cos apelidos + Limpala caché + Mostra un diálogo de confirmación da chamada antes de iniciar unha chamada + + Visibilidade + Seguridade + Desprazamento + Operacións de ficheiros + Papeleira + Gardado + Inicio + Texto + Migración + Calidade + Pantalla principal + Miniaturas + Vista de lista + + Excluír + Excluír cartafol + Cartafoles excluídos + (excluído) + Xestionar cartafoles excluídos + Eliminar todos + Eliminar todos os cartafoles da lista de excluídos\? Isto non borrará os cartafoles. + Exclúese temporalmente + Deixar de mostralos excluídos + + Xestionalas pestanas mostradas + Lapela predeterminada ao inicio + Contactos + Favoritos + Historial de chamadas + Grupos + A última usada + Arquivos + Ficheiros recentes + + Restaurar o ficheiro + Restaurar ficheiros seleccionados + Restaurar todos os ficheiros + A Papeleira baleirouse correctamente + Os ficheiros restauráronse correctamente + Seguro que queres baleirar a Papeleira? Os ficheiros perderanse para sempre. + A Papeleira está baleira + Mover ficheiros da Papeleira está inhabilitado, utiliza Restaurar + Amosar a Papeleira + Ocultar a Papeleira + Abrila papeleira de reciclaxe + Skip the Recycle Bin, delete files directly + + Movendo %d elemento á Papeleira + Movendo %d elementos á Papeleira + + + Importando… + Exportando… + Importación correcta + Exportación correcta + Importación fallada + Exportación fallada + Fallou a importación dalgunhas entradas + Fallou a exportación dalgunhas entradas + Non se atopou ningunha entrada que importar + Non se atoparon novas entradas para importar + Non se atopou ningunha entrada que exportar + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Parece que tes un dispositivo USB conectado ao teu dispositivo. Para asegurar que os ficheiro nel aparecen correctamente, tes que conceder permisos adicionais. + Escolle o cartafol raíz do dispositivo USB na seguinte pantalla para outorgar acceso + Cartafol incorrecto, selecciona a carpeta raíz do teu dispositivo USB + + Xaneiro + Febreiro + Marzo + Abril + Maio + Xuño + Xullo + Agosto + Setembro + Outubro + Novembro + Decembro + + Jan + Feb + Mar + Apr + May + June + July + Aug + Set. + Oct + Nov + Dec + + en xaneiro + en febreiro + en marzo + en abril + en maio + en xuño + en xullo + en agosto + en setembro + en outubro + en novembro + en decembro + Luns + Martes + Mércores + Xoves + Venres + Sábado + Domingo + L + M + M + X + V + S + D + Lun + Mar + Mér + Xov + Ven + Sáb + Dom + + A versión do app que tes non se vai volver actualizar. Actualiza á versión Pro para recibir novas correccións e outras melloras. + A versión do app que tes non se vai volver actualizar. Actualiza á versión Pro para recibir novas correccións e outras melloras premendo aquí. + É gratuito ata: %s. Se o descargas antes desa data, poderás usalo gratis para sempre. + Máis información + Actualizar + Tes que migrar os eventos almacenados localmente exportándoos a un ficheiro .ics, e despois importalo. Podes atopar estes dous botóns, exportar e importar, no menú da pantalla principal. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Ola, +\n +\nParece que acabas de actualizar dende a versión gratuíta. Unha vez que estea satisfeito e quizais migrou os seus datos, pode desinstalalo antigo gratuíto para evitar que o lance accidentalmente xa que xa non o necesitará. +\n +\nGrazas! + Ola, +\n +\nParece que xa tela versión pro da aplicación. Unha vez que esteas satisfeito con el e migraches os teus datos, podes desinstalar esta aplicación. Para evitar iniciala accidentalmente porque xa non a necesitas. +\n +\nMoitas grazas! + Ola, +\n +\nParece que actualizaches a versión gratuíta á versión profesional. Se queres migralos teus eventos almacenados localmente dende a versión gratuíta, debes exportalos manualmente como ficheiros .ics na versión gratuíta e importalos á versión profesional a través do menú superior. +\n +\nSe estás satisfeito coa configuración profesional, podes desinstalala versión gratuíta anterior xa que xa non a necesitas. +\n +\nGrazas! + Ola, +\n +\nParece que acabas de actualizar dende a versión gratuíta. Se tes contactos gardados en \"%s\", terás que migralos manualmente exportándoos a un ficheiro .vcf na versión gratuíta da aplicación e importándoos aquí desde o menú superior. +\n +\nUnha vez que estea satisfeito coa súa configuración na versión Pro, pode desinstalala versión gratuíta anterior porque xa non a necesita. +\n +\nMoitas grazas! + Ola, +\n +\nParece que acabas de actualizar desde a versión gratuíta. Se queres migralas notas, debes facelo manualmente exportándoas a un ficheiro na versión gratuíta da aplicación e importándoas aquí a través do menú superior. +\n +\nCando esteas satisfeito coa configuración da túa versión Pro, podes desinstalala antiga gratuíta porque xa non a necesitarás. +\n +\nGrazas! + + Acerca de + Website + Máis aplicativos sinxelos e código fonte en + Envía os teus comentarios ou suxerencias a + Actualiza a Pro + Máis aplicativos + Máis aplicativos nosos + Convidar a amigos + Ola, bótalle un ollo a %1$s en %2$s + Convidar con + Califícanos + Valora + Doa + Síguenos + v %1$s\nCopyright © Simple Mobile Tools %2$d + Soporte + Axúdanos + Social + Outro + Política da Privacidade + Version %s + Ola :) + Feito con ❤️ en Eslovaquia + Información adicional + Versión do app: %s + SO do dispositivo: %s + Ola,<br><br> Espero que esteas disfrutando do aplicativo. Non contén anuncios, polo que che agradecemos que respaldes o seu desenvolvemento comprando o aplicativo <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Grazas sinxelas</a>, e tamén evitará que este diálogo volva a aparecer.<br><br> Grazas! + Ola,<br><br>espero que che guste a aplicación. Non contén anuncios e tampouco estamos a recompilar os teus datos; apoia o seu desenvolvemento comprando <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Grazas Sinxelo</a>. Tamén terás todas as funcións da aplicación desbloqueadas, incluída a personalización de cores.<br><br>Grazas! + Apóyanos mercando <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Grazas simples</a>, tamén desbloqueará todalas funcións da aplicación, incluída a cor personalizada. + Comprar + Obter un teléfono sinxelo + Actualiza Grazas sinxelas á última versión + Antes de que fagas unha pregunta, primeiro comproba os axustes do app e le as Preguntas Máis Frecuentes. Pode que a solución estea aí. + Antes de que nos puntúes, primeiro comproba os axustes do app e le as Preguntas Máis Frecuentes. Se tes algún problema, pode que a solución estea aí. + Asegúrate tamén de que esteas usando a última versión do app. + Teña en conta que esta versión da aplicación xa non se está a desenvolver, obtén a Pro para moitas melloras. + Ler + Ler Preguntas Máis Frecuentes + Ola,\n\nparece que xa levas un tempo usando este app, e nós apreciámoscho.\n\nSe non che importa, por favor, valóranos no Google Play. Iso axudaríanos moito.\n\nDecidas o que decidas, non volverás ver esta mensaxe de novo.\n\nGrazas! + Valora o noso app, por favor :) + Grazas + O widget estopaze bloqueado. +\nActualiza á versión Pro para desbloquealo. + Esta función está bloqueada. Compra <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Grazas sinxelas</a> por desbloquear a aplicación completa.<br ><br>É un pago único e se non estás satisfeito, devolvemosche o diñeiro. + + +
    + simplemente informámosche de que se lanzaron recentemente novos aplicativos:

    + %2$s

    + %4$s

    + %6$s

    + Podes descargalas premendo no seu título ou icona.

    + Grazas + ]]> +
    + Lanzador de aplicacións sinxelo + Calculadora sinxela + Almanaque sinxelo + Cámara sinxela + Reloxo sinxelo + Contactos sinxelos + Marcador sinxelo + Debuxo sinxelo + Xestor de ficheiros sinxelo + Lanterna sinxela + Galería sinxela + Teclado sinxelo + Lanzador sinxelo + Reproductor de música sinxelo + Notas sinxelas + Mensaxeiro de sms sinxelo + Unicamente Grazas + Gravadora da voz sinxela + Lanzador de aplicacións + Calculadora + Almanaque + Cámara + Reloxo + Contactos + Marcador + Debuxa + File Manager + Lanterna + Galería + Teclado + Lanzador + Reproductor de música + Notes + Mensaxería SMS + Grazas + Gravadora de voz + Parece que a versión da túa aplicación está corrupta. Descarga a versión orixinal <a href=%s>aquí</a>. + + Preguntas máis frecuentes + Antes de facer unha pregunta, lea primeiro + Como é que non vexo este widget de aplicacións na lista de widgets\? + O máis probable é porque moveches a aplicación nunha tarxeta SD. Hai unha limitación do sistema Android que oculta os widgets da aplicación nese caso. A única solución é mover a aplicación de novo ao Almacenamento interno mediante a configuración do dispositivo. + Quero apoialo, pero non podo doar cartos. Hai algo máis que podo facer\? + Si, por suposto. Podes correla voz sobre as aplicacións ou dar boas valoracións e comentarios. Tamén podes axudar traducindo as aplicacións a un novo idioma ou simplemente actualizando algunhas traducións existentes. A guía para traducir atopase <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>este sitio web</a>, ou póñase en contacto connosco en <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se tes algunha dúbida. + Borrei algúns ficheiros por erro, como podo recuperalos\? + Por desgraza, non podes. Os ficheiros elimínanse ao instante despois do diálogo de confirmación, non atoparas ningún lixo dispoñible. + Non me gustan as cores do widget, podo cambialas\? + Si, mentres arrastras un widget na túa pantalla de inicio aparecerá unha pantalla de configuración do widgets. Verás cadrados de cores na esquina inferior esquerda, só tes que premelos para escoller unha nova cor. Tamén podes usalo control deslizante para axustarlo alfa. + Podo restaurar dalgún xeito os ficheiros eliminados\? + Se realmente foron eliminados, non podes. Non obstante, hai unha papeleira de reciclaxe activada por defecto, o que fará que os ficheiros só se movan na papeleira en lugar de eliminalos. + A icona do iniciador de aplicacións desapareceu. Que podo facer\? + É causado porque o teu iniciador non admite a personalización de iconas correctamente. Proba a iniciala aplicación a través de Google Play ou algún widget, se está dispoñible. Unha vez iniciado, só tes que restablecer a icona laranxa predeterminada #F57C00. É posible que teñas que reinstalar a aplicación no peor dos casos. + O diñeiro foi deducido da miña conta bancaria, pero non podo descargala aplicación. Que podo facer\? + Os pagos son xestionados por enteiro por Google, o seu sistema falla de cando en vez. Só tes que borrala caché da aplicación Google Play e reinicialo dispositivo e, a despois, tentar descargalo de novo. + Por que debo actualizar á versión Pro? + Como a versión da túa aplicación xa non se actualiza, os erros que quizais detectaches nunca se solucionarán. Tampouco se engadirán novas funcións. Podes mercala versión Pro en Google Play por unha pequena cantidade de diñeiro. É nun pago so, o que compres unha vez, nunca terás que pagalo de novo. Nin sequera despois de conseguir un novo dispositivo. Se non che gusta a versión Pro, podes desinstalala nunhas poucas horas e recuperarás o teu diñeiro automaticamente. Se queres un reembolso máis tarde, póñase en contacto connosco en hello@simplemobiletools.com e conseguirao. + Como podo seleccionar varios elementos dunha soa vez\? + Atoparas diferentes formas de facelo. O primeiro é iniciar o modo de selección mantendo presionado un elemento e, a continuación, premendo brevemente sobre outros para seleccionalos. A segunda forma é semellante a seleccionar elementos nos ordenadores cun rato, só tes que iniciar o modo de selección mantendo presionado un elemento e, a continuación, co dedo aínda para abaixo arrástralo por outros elementos para seleccionalo. A terceira forma de seleccionar varios elementos é premendo un elemento durante moito tempo, despois premendo outro e seleccionando todo o que hai entre eles. Se queres seleccionar todos os elementos, só tes que premer un elemento e, a continuación, fai clic no contador de elementos seleccionados na esquina superior esquerda. Isto seleccionará ou deseleccionará todo. + Merquei a aplicación, pero non podo descargala noutro dispositivo. + Proba a borrar a caché da aplicación Google Play e reinicia o dispositivo. É un fallo de Google Play, que non está realmente relacionado coa propia aplicación. + + Colaboradores + Tradución + Creadores + Outra axuda + Esta lista contén todolos que axudaron notablemente a calquera aplicación da suite Simple Mobile Tools para móbiles, non só esta. As traducións corren a cargo de voluntarios, avísanos se tamén queres axudar. A guía para traducir atopase <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>este sitio web</a>, ou póñase en contacto connosco en <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se tes algunha dúbida. Grazas a todos os colaboradores e outros seguidores! + Árabe + Azerbaillan + Bengalí + Bretón + Búlgaro + Catalán + Checo + Galés + Danés + Inglés + Alemán + Grego + Castelán + Vasco + Persa + Finés + Francés + Galego + Indi + Croata + Húngaro + Indonesio + Italiano + Hebreo + Xaponés + Coreano + Lituano + Nepalí + Noruegués + Holandés + Polaco + Portugués + Romanés + Ruso + Eslovaco + Esloveno + Serbio + Sueco + Tamil + Turco + Ucraíno + Vietnamita + Chinés (Hong Kong) + Chinés (simplificado) + Chinés (tradicional) + + Obtén a versión Pro agora! + Básica + Pro + Non hai anuncios + Sen acceso a internet + 100% garantía da devolución do diñeiro + Pago unha soa vez + Deseño mellorado + + Editor de fotos avanzado + Editor avanzado de fotos e vídeos + Soporte a ficheiros HEIC/HEIF + Renomear lote de ficheiros avanzado + Pechando o cartafol individual + Soporte de impresión + + Soporte da zoa horaria + Asistentes e recordatorios por correo electrónico + Fácil importación dos eventos + Novo widgets + + Mellorouse a combinación de contactos duplicados + Personalización do tamaño da fonte + Compartir contactos privados opcional nas nosas aplicacións + Tons da chamada dos contactos persoalizables + Filtrado dos contactos + Contactos almaceados de forma privada + + Listaxes de verificación + Diferentes notas e cores por widget + Bloqueo das notas + + Personalización do formato da data e hora + Atallos na pantalla principal + Soporte da compresión do ficheiro + Pestana con ficheiros recentes + + Personalización da cor de fondo + Importando o ficheiro de soporte + Zoom + + Este aplicativo usa as seguintes bibliotecas de terceiros que fan a miña vida máis fácil. Grazas. + Licenzas de terceiros + Kotlin (linguaxe de programación) + Vista da imaxe a escala (vistas da imaxe con zoom) + Glide (carga de imaxes e caché) + Picasso (carga das imaxes e caché) + Android Image Cropper (recortar e xirala imaxe) + RtlViewPager (pasando da dereita a esquerda) + Joda-Time (substitución da data de Java) + Stetho (depuración das bases de datos) + Otto (almaceamento de eventos) + PhotoView (GIF con zoom) + PatternLockView (protección do patrón) + Reimpresión (protección da impresión dixital) + Gif Drawable (cargando GIFs) + AutoFitTextView (redimensionamento do texto) + Roboelectric (marco de proba) + Espresso (axudante de proba) + Gson (analizador JSON) + Leak Canary (detector das fugas na memoria) + Number Picker (selector de números personalizable) + ExoPlayer (reprodutor de vídeo) + VR Panorama View (mostrando panorámicas) + Apache Sanselan (lectura dos metadatos da imaxe) + Android Photo Filters (filtros das imaxes) + Gesture Views (imaxes ampliables) + Indicator Fast Scroll (letras na barra de desprazamento) + Event Bus (comunicación dentro da aplicación) + Audio Record View (visualización do audio) + SMS MMS (Manexo dos SMS e MMS) + APNG Android (soporte para o WebP animado) + PDFViewPager (visor de PDF) + M3U Parser (xestor de ficheiros da lista de reprodución m3u) + AndroidLame (codificador mp3) + + A proba caducou + Comezala proba gratuíta + A túa proba caduca pronto. + Unlock the app for one final day + Benvido a %s! + Grazas por usala nosa aplicación. Podes usar esta versión desbloqueada durante %d días. Unha vez que remate a proba, considere actualizalá versión Pro. Ten unha gran cantidade de novas funcións, deseño moderno, sen anuncios e moitas outras melloras. +\n +\nSó tes que pagalo unha vez na vida e se non estás satisfeito, podes desinstalalo e obter un reembolso. +\n +\nAgardo que vos guste :) + Por favor actualizalá versión Pro para gozar da aplicación ao máximo. +\n +\nSó tes que pagala unha vez na vida e se non estás satisfeito, podes desinstalala e obter un reembolso. +\n +\nVéxote alí :) + + A túa proba caduca en %d día. + A túa proba caduca en %d días. + + + OBSOLETA: Esta versión do app xa non se está mantendo, obtén a versión Pro en https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Non esquezas que se desinstalas calquera app de pago antes de 2 horas, devolveránseche os cartos automáticamente. Se queres unha devolución máis tarde, contáctanos en hello@simplemobiletools.com e terala. Isto fai que sexa fácil probala :) + + Un grupo de aplicacións Android sinxelas e de código aberto con widgets persoalizables, sen anuncios e permisos innecesarios. +
    diff --git a/commons/src/main/res/values-hi-rIN/strings.xml b/commons/src/main/res/values-hi-rIN/strings.xml new file mode 100644 index 000000000..6c030d23d --- /dev/null +++ b/commons/src/main/res/values-hi-rIN/strings.xml @@ -0,0 +1,1092 @@ + + + ठीक + रद्द करें + Back + Nothing + बाद में + Save as + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Open with + Edit with + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Unknown + Always + Never + Details + Notes + Deleting folder \'%s\' + None + Label + Transparent + Transparent color + Select a different color + Download + Notification + Notifications + Email + Previous + Play / Pause + Next + Number + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + Birthday + Anniversary + + Home + Work + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Favorites + Add favorites + Add to favorites + Remove from favorites + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Filter + Filter (Pro) + No items found. + Change filter + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d item + %d items + + + + %d item + %d items + + + Deleting %d item + Deleting %d items + + + + %d contact + %d contacts + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + डिलीट + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + + Are you sure you want to move %s into the Recycle Bin? + + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Yes + No + Maybe + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + minutes + hours + days + s + m + h + wk. + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + Alarm + Snooze + Dismiss + No reminder + शुरुआत के समय + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + बटन प्रेस पर कंपन + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + Exclude + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + जनवरी + फरवरी + मार्च + अप्रैल + मई + जून + जुलाई + अगस्त + सितंबर + अक्टूबर + नवंबर + दिसंबर + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + सो + मं + बू + गु + शु + + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + के बारे में + Website + अधिक एप्पस व सोर्स कोड + अपनी राय या सुझाव को भेजें + Upgrade to Pro + More apps + More apps from us + मित्रो को आमन्त्रित करें + अरे, %1$s को %2$s पर देखो + के माध्यम से आमंत्रित + हमे प्ले स्टोर पर रेट करें + Rate + Donate + हमे फॉलो करें + सं %1$s\nकॉपीराइट © सिंपल मोबाइल टूल्स %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + here. + ]]> + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + प्रो संस्करण अभी प्राप्त करें! + बेसिक + प्रो + बिना विज्ञापन + इन्टरनेट की जरुरत नहीं + 100% मनी बैक गारंटी + One time payment + Improved design + + उन्नत फोटो एडिटर + Advanced photo & video editor + HEIC/HEIF फाइल सपोर्ट + ढेरों फाइल एकसाथ रीनेम करें + व्यक्तिगत फ़ोल्डर लॉक करें + प्रिंटिंग सपोर्ट + + टाइम जोन सपोर्ट + सहभागी और ईमेल रिमाइंडर + आसान इवेंट इम्पोर्ट + नए विजेट + + बेहतर डुप्लिकेट कांटेक्ट मर्जिंग + फ़ॉन्ट साइज़ कस्टमाइजेशन + हमारे एप्स के बीच प्राइवेट कांटेक्ट शेयरिंग (वैकल्पिक) + Customizable contact ringtones + Contact filtering + Privately stored contacts + + चेकलिस्ट्स + हरेक विजेट अलग नोट और रंग में + Note locking + + दिनांक और समय फॉर्मेट कस्टमाइजेशन + होम स्क्रीन शॉर्टकट + फाइल कम्प्रेशन सपोर्ट + Tab with recent files + + बैकग्राउंड कलर कस्टमाइजेशन + फाइल इम्पोर्ट सपोर्ट + Zooming + + मेरा जीवन आसान करने के लिए यह एप्प तीसरे पक्ष की लाइब्रेरी का इस्तेमाल करती हैं। धन्यवाद। + तीसरे पक्ष के लाइसेंस + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + जोड़ा-टाइम(जावा डेट रिप्लेसमेंट) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-hr/strings.xml b/commons/src/main/res/values-hr/strings.xml new file mode 100644 index 000000000..917196fa7 --- /dev/null +++ b/commons/src/main/res/values-hr/strings.xml @@ -0,0 +1,1162 @@ + + + U redu + Poništi + Nazad + Ništa + Kasnije + Spremi kao + Datoteka uspješno spremljena + Nevažeći format datoteke + Greška, nema slobodnog prostora + Dogodila se greška: %s + Error: %s + Otvori s + Uredi pomoću + Uredi + Nema odgovarajuće aplikacije + Preglednik nije pronađen + Nije pronađen klijent e-pošte + Postavi kao + Kopiraj u međuspremnik + Kopiraj broj u međuspremnik + Vrijednost je kopirana u međuspremnik + Vrijednost je kopirana u međuspremnik: +\n%s + Nazovi broj + Nepoznato + Uvijek + Nikada + Detalji + Bilješke + Brisanje mape \'%s\' + Nijedan + Etiketa + Prozirno + Prozirna boja + Odaberi jednu drugu boju + Preuzimanje + Obavijest + Obavijesti + E-mail + Prethodna + Reproduciraj / Pauziraj + Sljedeća + Broj + Nisu pronađeni kontakti + Zatraži potrebna dopuštenja + Aplikacija nije mogla pristupiti tvojim kontaktima + Aplikacija nema dopuštenje za pokretanje telefonskih poziva. Dopusti pokretanje poziva u postavkama uređaja + Ovdje umetni tekst + Nazovi %s + Potvrdi nazivanje %s + Nula + Jedan + Dva + Tri + Četiri + Pet + Šest + Sedam + Osam + Devet + Vrijednost + Vrijednost ne može biti prazna + Stvori novi kontakt + Dodaj postojećem kontaktu + Aplikacija oštećena + Odricanje odgovornosti + Snimi fotografiju + Odaberi fotografiju + Odaberi video + Odaberi kontakt + Odaberi datoteku + Snimi zvuk + Snimi video + Aktualiziranje … + Spremište na mobitelu + Spremište na mobitelu (nije vidljivo za druge aplikacije) + Audio + + Rođendan + Obljetnica + + Kućni + Posao + + Mobitel + Glavni + Poslovni faks + Kućni faks + Pager + Nije pronađen nijedan telefonski broj + + Promijeni vrstu prikaza + Prikaz ikona + Prikaz ikona (Pro) + Neravnomjerni prikaz ikona + Prikaz popisa + Povećaj broj stupaca + Smanji broj stupaca + Broj stupaca + Broj stupaca portreta + Broj vodoravnih stupaca + Promjeni naslovnu sliku + Odaberi sliku + + %d stupac + %d stupca + %d stupaca + + + Upravljanje blokiranim brojevima + Ne blokirate nikoga. + Dodaj blokirani broj + Blokiraj broj + Blokiraj brojeve + Blokirani brojevi + Izvoz blokiranih brojeva + Uvoz blokiranih brojeva + Za korištenje blokiranih brojeva, ovu aplikaciju moraš postaviti kao zadanu za biranje brojeva. + Postavi na zadano + Stvarno želiš blokirati „%s”\? + Blokiraj pozive nepohranjenih kontakata + Blokiraj poruke nepohranjenih kontakata + Upiši broj ili uzorak (npr. *12345*, +1*8888) za blokiranje svih poziva i poruka od brojeva koji odgovaraju uzorku. + Blokiranje nepoznatih brojeva nije moguće bez dozvole ID-a pozivatelja. + + Favoriti + Dodaj favorite + Dodaj u favorite + Ukloni iz favorita + + Traži + Traži u %s + Upiši barem dva znaka za pokretanje pretrage. + Pretraži kontakte + Pretraži favorite + Pretraži aplikacije + Pretraži događaje + Pretraži grupe + Pretraži povijest + Pretraži pozive + Pretraži datoteke + Pretraži mape + Pretraži datoteke i mape + Pretraži playliste + Pretraži izvođače + Pretraži albume + Pretraži pjesme + Pretraži tekst + Pretraži razgovore + Pretraži snimanja + + Filtar + Filtar (Pro) + Nijedna stavka nije pronađena. + Promijeni filtar + + Potrebno je dopuštenje za prostor za pohranu + Potrebno je dopuštenje za kontakte + Potrebno je dopuštenje za kameru + Potrebno je dopuštenje za zvuk + Bez dozvole + Aplikaciji moraš dozvoliti prikazivanje obavijesti, inače ne može prikazivati podsjetnike. + Aplikaciji moraš dozvoliti prikazivanje obavijesti, inače ne može prikazivati traku napretka. + Aplikaciji moraš dozvoliti prikazivanje obavijesti, inače ne može reproducirati pjesme. + Aplikaciji moraš dozvoliti prikazivanje obavijesti, inače ne može snimati zvuk. + Aplikaciji moraš dozvoliti prikazivanje obavijesti, inače ne može prikazivati dolazne pozive. + Aplikaciji moraš dozvoliti prikazivanje obavijesti, inače ne može prikazivati dolazne poruke. + Odobri dozvolu + Zahtijeva dozvolu + + Preimenuj datoteku + Preimenuj mapu + Nije moguće preimenovati datoteku + Nije moguće preimenovati mapu + Ime mape ne smije biti prazno + Mapa s tim imenom već postoji + Nije moguće preimenovati root mapu prostora za pohranu + Mapa uspješno preimenovana + Preimenovanje mape + Ime datoteke ne smije biti prazno + Ime datoteke sadrži neispravne znakove + Ime datoteke \'%s\' sadrži neispravne znakove + Ekstenzija ne smije biti prazna + Izvorna datoteka %s ne postoji + Dodavanje na početak imena datoteke + Dodavanje naziva datoteka + Jednostavno preimenovanje + Uzorak + Znakovni niz za dodavanje + %Y – godina +\n%M – mjesec +\n%D – dan +\n%h – sat +\n%m – minuta +\n%s – sekunda +\n%i – broj se povećava od 1 + Naziv datoteke (bez .txt) + Naziv datoteke (bez .json) + Naziv datoteke (bez .zip) + Počevši od Androida 11, više ne možete sakriti datoteke i mape na taj način + + Kopiraj + Premjesti + Kopiraj/Premjesti + Kopiraj u + Premjesti u + Izvor + Odredište + Odabir odredišta + Pritisni ovdje za biranje odredišta + Nije moguće zapisivanje na odabranom odredištu + Odaberi odredište + Izvor i odredište ne mogu biti isti + Nije bilo moguće kopirati datoteke + Kopiranje… + Datoteke su uspješno kopirane + Datoteka je uspješno kopirana + Dogodila se greška + Premještanje… + Datoteke su uspješno premještene + Datoteka je uspješno premještena + Neke datoteke nije bilo moguće premjestiti + Neke datoteke nije bilo moguće kopirati + Nema odabranih datoteka + Spremanje… + Nije moguće stvoriti mapu %s + Nije moguće stvoriti datoteku %s + Nisu pronađene nove stavke + Odredište nema dovoljno slobodnog prostora. +\nPotreban %1$s, dostupan %2$s + Usluga sustava za odabir datoteka i mapa nije dostupna + + Stvori novo + Mapa + Datoteka + Stvori novu mapu + Datoteka ili mapa s tim nazivom već postoje + Naziv sadrži ne važeće znakove + Upiši ime + Nepoznata greška se dogodila + + Datoteka \"%s\" već postoji + Datoteka \"%s\" već postoji. Presnimiti? + Mapa \"%s\" već postoji + Spoji + Zadrži oboje + Prepiši + Preskoči + Dodaj s \'_1\' + Primjeni na sve sukobe + Sustav ne dopušta rad u ovoj mapi, odaberite drugu + Sustav ne dopušta kopiranje u ovu mapu, odaberite drugu + Sustav ne dopušta preimenovanje u ovoj mapi + Nije moguće preimenovati mape izravno u internoj pohrani, samo podmape + Nije moguće preimenovati ovu mapu + + Odaberi mapu + Odaberi datoteku + Potvrdi pristup vanjskoj memoriji + Potvrdi pristup mapi + Odaberite root mapu SD kartice na sljedećem prozoru da biste omogućili upisivanje + Ukoliko ne vidite SD karticu, probajte ovo + Dopustite aplikaciji pristup odabranoj pohrani na sljedećem zaslonu pritiskom na \'Koristi ovu mapu\' na dnu. + Dopustite pristup \'%s\' na sljedećem ekranu pritiskom na \'Koristi ovu mapu\' na dnu. + Molimo pritisnite \'Spremi\' na dnu sljedećeg zaslona za izradu nove mape. + Potvrdi odabir + Učitavanje … + Dozvoli našoj aplikaciji pristup svim tvojim datotekama. Bez toga aplikacija možda neće dobro funkcionirati. + + %d stavka + %d stavke + %d stavki + + + + %d stavka + %d stavke + %d stavki + + + Brisanje %d stavke + Brisanje %d stavki + Brisanje %d stavki + + + + %d kontakt + %d kontakta + %d kontakta + + + Odaberite prostor za pohranu + Skladištenje + Unutranji prostor za pohranu + SD kartica + Root + Odabrana je pogrešana mapa, molimo odaberite root mapu Vaše SD kartice + Putanje SD kartice i USB uređaja ne mogu biti isti + Čini se da je aplikacija instalirana na SD karticu, što čini widgete aplikacije nedostupnim. Nećete ih čak ni vidjeti na popisu dostupnih widgeta. + To je ograničenje sustava, pa ako želite upotrebljavati widgete, morate vratiti aplikaciju na unutarnju pohranu.. + Odabrana pogrešna mapa, odaberite stazu \'%s\' + + Svojstva + Putanja + Odabrane stavke + Zbroj podstavki + Ukupni zbroj stavki + Rezolucija + Trajanje + Umjetnik + Album + Žarišna duljina + Vrijeme izloženosti + ISO brzina + F-broj + Kamera + EXIF + Naziv pjesme + GPS koordinate + Nadmorska visina + Ukloni EXIF + Jeste li sigurni da želite ukloniti EXIF vrijednosti kao što su GPS koordinate, model kamere itd.\? + EXIF vrijednosti uspješno uklonjene + + Boja pozadine + Boja teksta + Primarna boja + Boja isticanja bijele teme + Boja isticanja crnobijele teme + Boja pozadine + Boja ikone aplikacije + Boja donje navigacijske trake + Vrati zadano + Koristi zadano + Default + Promijeni boju + Tema + Promijenom boje, prelazi se na Prilagođenu temu + Spremi + Odbaci + Poništi promjene + Jeste li sigurni da želite poništiti Vaše promjene? + Ovo je nepovratna radnja. + Imate ne spremljene promjene. Želite li spremiti prije izlaska? + Primjeni boje na sve Jednostavne Aplikacije + UPOZORENJE: neki pokretači ne rukuju ispravno s prilagodbama ikona aplikacija. Ako ikona nestane, pokušajte pokrenuti aplikaciju iz trgovine Google Play ili widgeta, ako je dostupna. + Nakon pokretanja, zadanu ikonu postavite na narančastu #F57C00. Možda će biti potrebno ponovno instalirati aplikaciju ako to ne radi. + Uspješno ažurirane boje. Nova tema pod nazivom \'Shared\' je dodana, molimo koristite ju za ažuriranje svih boja u aplikaciji u budućnosti. + Imajte na umu da iako koristite Pro verziju aplikacije, još uvijek trebate Jednostavno hvala iz tehničkih razloga. Brine se za sinkronizaciju boja. + + Simple Thank You za otključavanje ove funkcije i podršku razvoju. Hvala! + ]]> + + + Svijetla + Tamna + Automatski + Automatski svijetla / tamna + Solarizirana + Tamna crvena + Bijela + Crnobijela + Prilagođena + Dijeljena + Standard sustava + + Što je novo + * samo velika ažuriranja su ovdje izlistana, ali i mala ažuriranja su također prisutna + + Izbriši + Ukloni + Preimenuj + Dijeli + Dijeli putem + Promjeni veličinu + Odaberi sve + Odaberi tekst + Sakrij + Otkrij + Sakrij mapu + Otkrij mapu + Privremeno prikaži skriveno + Zaustavi prikazivanje skrivenih stavki + Nije moguće dijeliti ovoliko stavki odjednom + Isprazni i onemogući koš za smeće + Poništi + Ponovi + Ispiši + Ispiši (Pro) + Prečac + Stvori prečac + Stvori prečac (Pro) + Dodaj broj kontaktu + Prikaži detalje kontakta + Poziv sa SIM 1 + Poziv sa SIM 2 + Uključi prikaz naziva datoteka + Pomakni skroz gore + Pomakni skroz dolje + Prikvači stavku + Otkvači stavku + Pošalji SMS + Pošalji e-mail + Poziv + Detalji kontakta + Dodaj kontakt + Slike pozadine + + Sortiraj po + Naziv + Veličina + Datum zadnje izmjenjene + Datum stvaranja + Datum snimanja + Naslov + Naziv datoteke + Ekstenzija + Slučajno + Sortiraj slučajnim redoslijedom + Uzlazno + Silazno + Koristi samo za ovu mapu + Sortiraj numeričke dijelove prema stvarnoj vrijednosti + Ime + Srednje ime + Prezime + Puno ime i prezime + Koristi prilagođeno sortiranje + Promijeni redoslijed + + Jeste li sigurni da želite nastaviti s brisanjem? + Jeste li sigurni da želite izbrisati %s? + Izbrisati %s\? + + Jeste li sigurni da se želite premjestiti %s u koš za smeće? + + Jeste li sigurni da želite izbrisati ovu stavku? + Jeste li sigurni da želite premjestiti ovu stavku u koš za smeće? + Ne pitaj me više u ovoj sesiji + Nemoj više prikazivati + Da + Ne + Možda + + UPOZORENJE: Brišeš %d mapu + UPOZORENJE: Brišeš %d mape + UPOZORENJE: Brišeš %d mapa + + + PIN + Unesite PIN + Molimo unesite PIN + Pogrešan PIN + Ponovite PIN + Uzorak + Unesite uzorak + Krivi uzorak + Ponovite uzorak + Biometrija + Otisak prsta + Dodaj otisak prsta + Molimo postavite prst na senzor otiska prsta + Otvori dijaloga za provjeru biometrijskog ID-a + Autentifikacija + Neuspješna autentifikacija + Blokirana autentifikacija, molimo pokušajte za par trenutaka + Nemate registiranih otisaka prstiju, molimo dodajte ih u postavkama Vašeg uređaja + Idi u Postavke + Uspješno postavljanje lozinke. Molimo reinstalirajte aplikaciju u slučaju da je zaboravite. + Uspješno postavljanje zaštite. Molimo reinstalirajte aplikaciju u slučaju problema s resetiranjem. + Zaključaj mapu + Zaključaj mapu (Pro) + Otključaj mapu + Ova zaštita radi samo u ovoj aplikaciji. Nije namijenjena za stvarno mijenjanje šifriranja mapa cijelog sustava. + + Jučer + Danas + Sutra + Svaki dan + Sakrij godinu + sekunde + minute + sati + dani + s + min + h + tj. + + %d sekunda + %d sekunde + %d sekundi + + + %d minuta + %d minute + %d minuta + + + %d sat + %d sata + %d sati + + + %d dan + %d dana + %d dana + + + %d tjedan + %d tjedna + %d tjedana + + + %d mjesec + %d mjeseca + %d mjeseci + + + %d godina + %d godine + %d godina + + + + %d sekunde + %d sekunde + %d sekundi + + + %d minute + %d minute + %d minuta + + + %d sat + %d sata + %d sati + + + %d dan + %d dana + %d dana + + + %d tjedan + %d tjedna + %d tjedana + + + %d mjesec + %d mjeseca + %d mjeseci + + + %d godina + %d godine + %d godina + + + + %d sekunda prije + %d sekunde prije + %d sekundi prije + + + %d minuta prije + %d minute prije + %d minuta prije + + + %d sat prije + %d sata prije + %d sati prije + + + %d dan prije + %d dana prije + %d dana prije + + + %d tjedan prije + %d tjedna prije + %d tjedana prije + + + %d mjesec prije + %d mjeseca prije + %d mjeseci prije + + + %d godina prije + %d godine prije + %d godina prije + + + + %d sekundu + %d sekunde + %d sekundi + + + %d minuta + %d minute + %d minuta + + + %d sat + %d sata + %d sati + + + %d dan + %d dana + %d dana + + + %d tjedan + %d tjedna + %d tjedna + + + %d mjesec + %d mjeseca + %d mjeseci + + + %d godina + %d godine + %d godina + + + Preostalo vrijeme do pokretanja alarma:\n%s + Preostalo vrijeme do pokretanja podsjetnika:\n%s + Preostalo vrijeme: +\n%s + Provjeri ispravno funkcioniranje alarma. Mogao bi neispravno raditi zbog ograničenja sustava vezanih uz štednju baterije. + Pazite da podsjetnici ispravno rade prije nego što se oslonite na njih. Moglo bi se dogoditi pogreška zbog ograničenja sustava vezanih uz štednju baterije. + Obavijesti ove aplikacije su deaktivirane. Aktiviraj ih u postavkama uređaja. + + Alarm + Odgodi + Odbaci + Nema podsjetnika + Na početku + Zvukovi sustava + Tvoji zvukovi + Dodaj novi zvuk + Nema zvuka + Tijekom dana u hh:mm + Tijekom dana u %02d:%02d + + Postavke + Kupi aplikaciju „Jednostavno hvala” + Opće + Prilagođavanje boja + Poboljšano prilagođavanje boja + Prilagodi boje + Prilagodi boje (zaključano) + Zaključano + Prilagodi boje widgeta + Prilagodi obavijesti + Zvuk obavijesti + Koristi engleski jezik + Jezik + Prikaži skrivene stavke + Veličina fonta + Mala + Srednja + Velika + Jako velika + Vidljivost skrivenih, lozinkom zaštićenih stavki + Zaštiti cijelu aplikaciju lozinkom + Zaštiti brisanje i premještanje datoteka lozinkom + Zadrži staru vrijednost zadnje promjene pri operacijama nad datotekama + Prikaži informativni balončić prilikom prelistavanja stavki povlačenjem klizne trake + Spriječite da uređaj prijeđe u stanje mirovanja dok je aplikacija u prvom planu + Uvijek preskoči dijaloški okvir za potvrdu brisanja + Aktiviraj aktualiziranje povlačenjem odozgo + Koristite 24-satni format + Promijeni formate datuma i vremena + Početak tjedna u nedjelju + Widgeti + Uvijek koristi isto vrijeme odgode + Vrijeme odgode + Vibriraj prilikom pritiskanja gumba + Premjesti stavke u koš za smeće umjesto brisanja + Interval čišćenja koša za smeće + Isprazni koš za smeće + Prikaz stavke u portretnom formatu + Izvezi postavke + Uvezi postavke + Postavke su uspješno izvezene + Postavke su uspješno uvezene + Započnite imena s prezimenima + Izbriši predmemoriju + Pokažite dijaloški okvir za potvrdu poziva prije pokretanja poziva + + Vidljivost + Sigurnost + Pomicanje + Radnje datoteka + Koš za smeće + Spremanje + Pokretanje + Tekst + Migriranje + Kvaliteta + Glavni ekran + Sličice + Prikaz popisa + + Isključi + Isključi mapu + Isključene mape + (isključene) + Upravljaj isključenim mapama + Ukloni sve + Želiš li ukloniti sve mape s popisa isključenih\? Ovo neće izbrisati mape. + Privremeno prikaži isključene + Prekini prikazivanje isključenih + + Upravljaj prikazanim karticama + Kartica koja se otvara nakon pokretanja programa + Kontakti + Favoriti + Povijest poziva + Grupe + Zadnje korištena + Files + Recent files + + Vrati ovu datoteku + Vrati odabrane datoteke + Vrati sve datoteke + Koš za smeće je uspješno ispražnjen + Datoteke su uspješno vraćene + Jeste li sigurni da želite isprazniti koš za smeće? Datoteke će biti trajno izgubljene. + Koš za smeće je prazan + Premještanje stavki koša za smeće je onemogućeno, koristite Obnavljanje + Prikaži koš za smeće + Sakrij koš za smeće + Otvori koš za smeće + Preskoči koš za smeće, izbriši datoteke odmah + + %d stavka se premješta u koš za smeće + %d stavke se premještaju u koš za smeće + %d stavki se premještaju u koš za smeće + + + Uvoz… + Izvoz… + Uvoz je uspio + Izvoz je uspio + Uvoz nije uspio + Izvoz nije uspio + Uvoz nekih unosa nije uspio + Izvoz nekih unosa nije uspio + Nije pronađen nijedan unos za uvoz + Nije pronađen nijedan nov unos za uvoz + Nije pronađen nijedan unos za izvoz + Sigurnosne kopije + Aktiviraj automatsko spremanje sigurnosnih kopija + Upravljaj automatskim spremanjem sigurnosnih kopija + Za automatsko imenovanje datoteke možeš koristiti sljedeće elemente: +\n +\n%Y – godina +\n%M – mjesec +\n%D – dan +\n%h – sat +\n%m – minuta +\n%s – sekunda + + USB + Čini se da na uređaj imate priključen USB uređaj. Da biste provjerili prikazuju li se datoteke ispravno, morate dodijeliti dodatna dopuštenja. + Molimo odaberite root mapu USB uređaja na sljedećem zaslonu, kako biste odobrili pristup + Odabrana je pogrešna mapa. Odaberite glavnu mapu USB uređaja + + Siječanj + Veljača + Ožujak + Travanj + Svibanj + Lipanj + Srpanj + Kolovoz + Rujan + Listopad + Studeni + Prosinac + + Sij + Velj + Ožu + Tra + Svi + Lip + Srp + Kol + Ruj + Lis + Stu + Pro + + u siječnju + u veljači + u ožujku + u travnju + u svibnju + u lipnju + u srpnju + u kolovozu + u rujnu + u listopadu + u studenom + u prosincu + Ponedjeljak + Utorak + Srijeda + Četvrtak + Petak + Subota + Nedjelja + P + U + S + Č + P + S + N + Pon + Uto + Sri + Čet + Pet + Sub + Ned + + Tvoja verzija aplikacije se više neće ažurirati. Nadogradi na Pro verziju za primanje novih ispravki i druga poboljšanja. + Tvoja verzija aplikacije se više neće ažurirati. Pritisni ovdje za nadogradnju na Pro verziju za primanje novih ispravki i druga poboljšanja. + Besplatno je do: %s. Ako je preuzmete do tada, moći ćete je koristiti zauvijek. + Više informacija + Nadogradi + Lokalno pohranjene događaje morate migrirati ručno putem izvoza u .ics datoteku, a zatim uvoza. Možete pronaći oba gumba za izvoz/uvoz na izborniku glavnog zaslona. + Zdravo, +\n +\nčini se da si upravo nadogradio/la besplatnu verziju aplikacije. Ako ti nadograđena verzija odgovara i ako preuzmeš svoje postavke i favorite, staru besplatnu aplikaciju možeš deinstalirati kako bi se izbjeglo slučajno pokretanje stare verzije jer ti više neće trebati. +\n +\nHvala! + Zdravo, +\n +\nčini se da već imaš i Pro verziju aplikacije. Ako ti Pro verzija odgovara i ako preuzmeš svoje postavke i favorite, staru besplatnu aplikaciju možeš deinstalirati kako bi se izbjeglo slučajno pokretanje stare verzije jer ti više neće trebati. +\n +\nHvala! + Zdravo, +\n +\nčini se da si upravo nadogradio/la besplatnu verziju aplikacije. Ako ti nadograđena verzija odgovara i ako preuzmeš tvoje podatke, staru besplatnu aplikaciju možeš deinstalirati kako bi se izbjeglo slučajno pokretanje stare verzije jer ti više neće trebati. +\n +\nHvala! + Zdravo, +\n +\nčini se da već imaš i Pro verziju aplikacije. Ako ti Pro verzija odgovara i ako preuzmeš tvoje podatke, ovu aplikaciju možeš deinstalirati kako bi se izbjeglo slučajno pokretanje te verzije jer ti više neće trebati. +\n +\nHvala! + Zdravo, +\n +\nčini se da si upravo nadogradio/la besplatnu verziju aplikacije. Ako želiš preuzeti tvoje lokalno spremljene događaje, to moraš učiniti ručno izvozom u .ics datoteku u besplatnoj verziji aplikacije i uvozom ovdje putem gornjeg izbornika. +\n +\nAko ti postava Pro verzije odgovara, staru besplatnu verziju možeš deinstalirati kako bi se izbjeglo slučajno pokretanje stare besplatne verzije jer ti više neće trebati. +\n +\nHvala! + Zdravo, +\n +\nčini se da si upravo nadogradio/la besplatnu verziju aplikacije. Tvoje spremljene kontakte u „%s” moraš preuzeti ručno izvozom u .vcf datoteku u besplatnoj verziji aplikacije i uvozom ovdje putem gornjeg izbornika. +\n +\nAko ti postava Pro verzije odgovara, staru besplatnu verziju možeš deinstalirati jer ti više neće trebati. +\n +\nHvala! + Zdravo, +\n +\nčini se da si upravo nadogradio/la besplatnu verziju aplikacije. Ako želiš preuzeti tvoje lokalno spremljene bilješke, to moraš učiniti ručno izvozom u datoteku u besplatnoj verziji aplikacije i uvozom ovdje putem gornjeg izbornika. +\n +\nAko ti postava Pro verzije odgovara, staru besplatnu verziju možeš deinstalirati jer ti više neće trebati. +\n +\nHvala! + + Informacije + Web stranica + Za izvorni kod posjeti + Pošalji nam povratne informacije ili prijedloge na + Nadogradi na Pro verziju + Daljnje aplikacije + Daljnje aplikacje od nas + Pozovi prijatelje + Hej, posjeti nas na %1$s u %2$s + Pozovi putem + Ocijeni nas + Ocjena + Doniraj + Prati nas + v %1$s\nCopyright © Simple Mobile Tools %2$d + Podrška + Pomogni nam + Društvene mreže + Ostalo + Politika privatnosti + Verzija %s + Zdravo :) + Izrađeno sa ❤️ u Slovačkoj + Dodatne informacije + Verzija aplikacije: %s + OS uređaja: %s + +
    + nadam se da uživate u aplikaciji. Ne sadrži reklame, stoga nas podržite njen razvoj kupovinom Simple Thank You aplikacije, što će spriječiti da se ovaj prozor ponovno pojavljuje.

    + Hvala Vam! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Kupi + Nabavi „Jednostavni telefon” + Ažurirajte „Jednostavno hvala” na najnoviju verziju + Prije nego što postaviš pitanje, provjeri postavke aplikacije i najprije pročitaj stranicu „Često postavljena pitanja”. Rješenje možda već postoji. + Prije nego što nas ocijeniš, provjeri postavke aplikacije i najprije pročitaj stranicu „Često postavljena pitanja”. Ako imaš bilo koji problem, rješenje možda već postoji. + Također osiguraj da koristiš najnoviju verziju aplikacije. + Također imaj na umu da se ova verzija aplikacije više ne razvija. Nabavi Pro verziju za mnoga poboljšanja. + Pročitajte + Pročitaj ČPP + Zdravo, +\n +\nČini se da već duže vrijeme koristiš ovu aplikaciju i mi to jako cijenimo. +\n +\nMolimo te da nas ocijeniš nas na Google Playu. To bi nam stvarno puno pomoglo. +\n +\nKako god odlučiš, ovu poruku više nećeš vidjeti. +\n +\nHvala! + Ocijeni našu aplikaciju :) + Hvala + Widget je zaključan. +\nZa otključavanje widgeta nadogradi na Pro verziju. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + Hej,<br><br> nedavno su objavljene nove aplikacije:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Možeš ih preuzeti pritiskom na njihove naslove ili ikone.<br><br> Hvala + Jednostavni pokretač aplikacija + Jednostavni kalkulator + Jednostavni kalendar + Jednostavna kamera + Jednostavni sat + Jednostavni kontakti + Jednostavni birač + Jednostavno crtanje + Jednostavni upravljač datoteka + Jednostavna svjetiljka + Jednostavna galerija + Jednostavna tipkovnica + Jednostavni pokretač + Jednostavni player glazbe + Jednostavne bilješke + Jednostavni SMS messenger + Jednostavno hvala + Jednostavni diktafon + Pokretač aplikacija + Kalkulator + Kalendar + Kamera + Sat + Kontakti + Birač + Crtanje + Upravljač datoteka + Svjetiljka + Galerija + Tipkovnica + Pokretač + Player glazbe + Bilješke + SMS messenger + Hvala + Diktafon + Čini se da je verzija aplikacije oštećena. Preuzmi izvornu verziju <a href=%s>ovdje</a>. + + Često postavljenja pitanja + Prije postavljanja pitanja, najprije pročitaj + Zašto ne vidim widgete ove aplikacije u popisu widgeta\? + Najvjerojatnije zato jer ste premjestili aplikaciju na SD karticu. Postoji ograničenje Android sustava koje skriva dane widgete aplikacije u tom slučaju. + Jedino je rješenje vratiti aplikaciju na internu pohranu putem postavki uređaja. + Želim Vam pomoći, ali ne mogu donirati novac. Ima li još nešto što mogu učiniti? + Yes, of course. You can spread the word about the apps or give good feedback and ratings. You can also help by translating the apps in a new language, or just update some existing translations. The guide to translating is at <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, or just contact us at <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> if you have any questions. + Slučajno sam izbrisao/la neke datoteke. Kako ih mogu obnoviti\? + Nažalost, ne možete. Datoteke se brišu odmah nakon dijaloškog okvira za potvrdu, nema dostupnog koša za smeće. + Ne sviđa mi se boja widgeta, mogu li ih promijeniti? + Da, kada povlačite widget na početnom zaslonu, pojavit će se zaslon za konfiguraciju widgeta. U donjem lijevom kutu vidjet ćete obojene kvadrate, samo ih pritisnite da biste odabrali novu boju. Možete koristiti i klizač za podešavanje alphe. + Mogu li nekako vratiti izbrisane datoteke? + Ako su stvarno izbrisane, ne možete. Međutim, postoji koš za smeće koji je standardno aktiviran. Na taj se način datoteke samo premještaju u koš umjesto da se izbrišu. + Ikona pokretača aplikacija je nestala. Što mogu učiniti? + Uzrok je to što pokretač ne podržava ispravnu prilagodbu ikone. Pokušajte pokrenuti aplikaciju putem Google Playa ili nekog widgeta, ako je dostupan. + Nakon pokretanja, zadanu ikonu postavite na narančastu #F57C00. Možda će biti potrebno ponovno instalirati aplikaciju ako to ne radi. + The money has been deducted from my bank account, but I cannot download the app. What can I do\? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version\? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once\? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Doprinositelji + Prijevod + Razvoj + Ostala pomoć + This list contains everyone that noticeably helped any app within the Simple Mobile Tools suite, not only this one. Translations are handled by volunteers, let us know if you want to help too. The guide to translating is at <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, or just contact us at <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> if you have any questions. Thanks to all contributors and other supporters! + Arapski + Azerbajdžanski + Bengalski + Bretonski + Bugarski + Katalonski + Češki + Velški + Danski + Engleski + Njemački + Grčki + Španjolski + Baskijski + Perzijski + Finski + Francuski + Galicijski + Hindski + Hrvatski + Mađarski + Indonezijski + Talijanski + Hebrejski + Japanski + Korejski + Litavski + Nepalski + Norveški + Nizozemski + Poljski + Portugalski + Rumunjski + Ruski + Slovački + Slovenski + Srpski + Švedski + Tamilski + Turski + Ukrajinski + Vijetnamski + Kineski (Hong Kong) + Kineski (pojednostavljeni) + Kineski (tradicionalni) + + Nabavi Pro verziju sada! + Osnovna + Pro + Bez oglasa + Bez pristupa intrnetu + Jamstvo za 100 % povrata novca + Jednokratno plaćanje + Poboljšan dizajn + + Napredni uređivač fotografija + Napredni uređivač fotografija i videa + Podrška za HEIC/HEIF datoteke + Napredno grupno preimenovanje datoteka + Zaključavanje pojedinačnih mapa + Podrška za ispis + + Podrška za vremenske zone + Učesnici i podsjetnici putem e-maila + Jednostavan uvoz događaja + Novi widgeti + + Poboljšano spajanje duplih kontakata + Prilagođavanje veličine fonta + Opcionalno dijeljenje privatnih kontakata unutar naših aplikacija + Prilagodljive melodije zvona za kontakte + Filtriranje kontakata + Privatno spremljeni kontakti + + Popisi zadataka + Različite bilješke i boje po widgetu + Zaključavanje bilješki + + Prilagođavanje formata datuma i vremena + Prečaci za početni ekran + Podrška za komprimiranje datoteka + Kartica s nedavno korištenim datotekama + + Prilagođavanje boje pozadine + Podrška za uvoz datoteka + Zumiranje + + Ova aplikacija koristi biblioteke trećih strana kako bi olakšala moj život. Hvala Vam. + Licence trećih strana + Kotlin (programski jezik) + Subsampling Scale Image View (zumiranje prikaza slika) + Glide (učitavanje i predmemoriranje slika) + Picasso (učitavanje i predmemoriranje slika) + Android Image Cropper (rezanje i okretanje slika) + RtlViewPager (povlačenje zdesna ulijevo) + Joda-Time (zamjena datuma pomoću Java) + Stetho (uklanjanje grešaka u bazama podataka) + Otto (kanal događaja) + PhotoView (zumiranje GIF-ova) + PatternLockView (zaštita uzorcima) + Reprint (zaštita otiskom prsta) + Gif Drawable (učitavanje GIF-ova) + AutoFitTextView (mijenjanje veličine teksta) + Robolectric (framework za testiranje) + Espresso (pomoćnik za testiranje) + Gson (JSON analizator) + Leak Canary (detektor propuštanja memorije) + Number Picker (prilagodljiv birač brojeva) + ExoPlayer (video player) + VR Panorama View (panoramski prikaz) + Apache Sanselan (čitanje metapodataka slike) + Android Photo Filters (filteri za slike) + Gesture Views (zumiranje slika) + Indicator Fast Scroll (slova u kliznoj traci) + Event Bus (komunikacija unutar aplikacije) + Audio Record View (vizualizacija zvuka) + SMS MMS (rukovanje SMS i MMS porukama) + APNG Android (podrška za animirani WebP) + PDFViewPager (čitač PDF-ova) + M3U Parser (rukovanje datotekama m3u playlista) + AndroidLame (mp3 koder) + + Probni rok je istekao + Pokreni besplatan probni rok + Tvoj probni rok uskoro isteče. + Otključaj aplikaciju za još jedan zadnji dan + Pozdrav u %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Nadogradi na Pro verziju za potpuni užitak. +\n +\nPlati samo jednom. Ako ti Pro verzija ne odgovara, deinstaliraj je i dobij povrat novca. +\n +\nVidimo se tamo :) + + Tvoje probno razdoblje isteče za %d dan. + Tvoje probno razdoblje isteče za %d dana. + Tvoje probno razdoblje isteče za %d dana. + + + ZASTARJELO: Ova verzija aplikacije se više ne održava. Nabavi Pro verziju na https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Ako deinstaliraš bilo koju plaćenu aplikaciju u roku od 2 sata automatski ćeš dobiti povrat novca. Ako kasnije želiš povrat novca, jednostavno nas kontaktiraj na hello@simplemobiletools.com. To olakšava isprobavanje :) + + Skup jednostavnih Android aplikacija otvorenog koda s prilagodljivim widgetima, bez oglasa i nepotrebnih dozvola. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-hu/strings.xml b/commons/src/main/res/values-hu/strings.xml new file mode 100644 index 000000000..702cd46ef --- /dev/null +++ b/commons/src/main/res/values-hu/strings.xml @@ -0,0 +1,1098 @@ + + + OK + Mégse + Vissza + Semmi + Később + Mentés másként + Fájl mentése sikeres + Érvénytelen fájlformátum + Hiba, elfogyott a memória + Hiba történt: %s + Hiba: %s + Megnyitás ezzel + Szerkesztés ezzel + Szerkesztés + Nem található érvényes alkalmazás + Nem található böngésző + Nem található e-mail-kliens + Beállítás ennek + Másolás a vágólapra + Szám másolása a vágólapra + Érték a vágólapra másolva + Érték a vágólapra másolva:\n%s + Szám tárcsázása + Ismeretlen + Mindig + Soha + Részletek + Jegyzetek + A(z) „%s” mappa törlése + Nincs + Címke + Áttetsző + Áttetsző szín + Válasszon egy másik színt + Letöltés + Értesítés + Értesítések + E-mail + Előző + Lejátszás/szüneteltetés + Következő + Telefonszám + Nem található névjegy + A kívánt jogosultságok igénylése + Az alkalmazás nem tudta elérni a névjegyeit + Az alkalmazásnak nincs jogosultsága telefonhívást indítani, adja meg az eszközbeállításokban + Illeszben be ide szöveget + %s hívása + Confirm calling %s + Nulla + Egy + Kettő + Három + Négy + Öt + Hat + Hét + Nyolc + Kilenc + Érték + Az érték nem lehet üres + Új névjegy hozzáadása + Hozzáadás meglévő névjegyhez + Sérült alkalmazás + Nyilatkozat + Fényképkészítés + Fénykép kiválasztása + Videó kiválasztása + Névjegy kiválasztása + Fájl kiválasztása + Hang felvétele + Videó felvétele + Módosítás… + Telefon tárhelye + Telefon tárhelye (többi alkalmazás számára nem látható) + Audio + + Születésnap + Évforduló + + Otthon + Munkahely + + Mobil + Elsődleges telefonszám + Munkahelyi fax + Otthoni fax + Csipogó + Nem található ilyen telefonszám + + Nézettípus módosítása + Rács + Rács (Pro) + Egyenetlen rács + Lista + Oszlopszám növelése + Oszlopszám csökkentése + Oszlopszám + Oszlopszám álló módban + Oszlopszám fekvő módban + Borítókép módosítása + Válasszon fényképet + + %d oszlop + %d oszlop + + + Letiltott telefonszámok kezelése + Még senkit sem tiltott le. + Letiltott telefonszám hozzáadása + Telefonszám letiltása + Telefonszámok letiltása + Letiltott telefonszámok + Letiltott számok exportálása + Letiltott számok importálása + A letiltott telefonszámok használatához be kell állítani, hogy ez az alkalmazás legyen az alapértelmezett tárcsázó. + Beállítás alapértelmezettként + Biztos, hogy letiltja a következőt: „%s”\? + Nem tárolt névjegyektől érkező hívások blokkolása + Nem tárolt névjegyektől érkező üzenetek blokkolása + Adjon meg egy számot vagy mintát (például *12345*, +1*8888) hogy blokkolja a számokról érkező hívásokat és üzeneteket. + Hívásazonosítási engedély nélkül nem lehet blokkolni az ismeretlen számokat. + + Kedvencek + Kedvencek hozzáadása + Hozzáadás a kedvencekhez + Eltávolítás a kedvencek közül + + Keresés + Keresés itt: %s + Legalább 2 karaktert írjon be a keresés indításához. + Névjegyek keresése + Kedvencek keresése + Alkalmazások keresése + Események keresése + Csoportok keresése + Előzmények keresése + Hívások keresése + Fájlok keresése + Mappák keresése + Fájlok és mappák keresése + Lejátszási listák keresése + Előadók keresése + Albumok keresése + Számok keresése + Szöveg keresése + Beszélgetések keresése + Felvételek keresése + + Szűrő + Szűrő (Pro) + Nem található elem. + Szűrő módosítása + + Tároló engedély szükséges + Névjegyek engedély szükséges + Kamera engedély szükséges + Hang engedély szükséges + Nem szükséges engedély + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Fájl átnevezése + Mappa átnevezése + Nem lehet átnevezni a fájlt + Nem lehet átnevezni a mappát + A mappa neve nem lehet üres + Már létezik egy ilyen nevű mappa + Nem lehet átnevezni a tároló gyökérmappáját + Mappa átnevezése sikeres + Mappa átnevezése + A fájlnév nem lehet üres + A fájlnév érvénytelen karaktereket tartalmaz + A(z) „%s” fájlnév érvénytelen karaktereket tartalmaz + A kiterjesztés nem lehet üres + A(z) %s forrásfájl nem létezik + Fájlnevek eléfűzése + Fájlnevek hozzáfűzése + Egyszerű átnevezés + Minta + Hozzáadandó karakterlánc + %Y – év +\n%M – hónap +\n%D – nap +\n%h – óra +\n%m – perc +\n%s – másodperc +\n%i – 1-től induló számláló + Fájlnév (.txt nélkül) + Fájlnév (.json nélkül) + Fájlnév (.zip nélkül) + Az Android 11-től kezdődően így már nem rejtheti el a fájlokat és mappákat + + Másolás + Áthelyezés + Másolás/áthelyezés + Másolás ide + Áthelyezés ide + Forrás + Cél + Válasszon célt + Kattintson ide a cél kiválasztásához + Nem lehet a kiválasztott célra írni + Válasszon célt + A forrás és a cél nem lehet azonos + Nem lehet másolni a fájlt + Másolás… + A fájlok másolása sikeres + A fájl másolása sikeres + Hiba történt + Áthelyezés… + A fájlok áthelyezése sikeres + A fájl áthelyezése sikeres + Egyes fájlokat nem lehet áthelyezni + Egyes fájlokat nem lehet másolni + Nincs fájl kiválasztva + Mentés… + Nem lehet létrehozni a(z) %s mappát + Nem lehet létrehozni a(z) %s fájlt + Nem található új elem + A célhelyen nincs elég szabad hely.\n%1$s szükséges, %2$s érhető el + A fájlok és mappák kiválasztásához szükséges rendszerszolgáltatás nem érhető el + + Új létrehozása + Mappa + Fájl + Új mappa létrehozása + Már létezik ilyen nevű fájl vagy mappa + A név érvénytelen karaktereket tartalmaz + Írjon be egy nevet + Ismeretlen hiba történt + + A(z) „%s” fájl már létezik + A(z) „%s” fájl már létezik. Felülírja\? + A(z) „%s” mappa már létezik + Összevonás + Mindkettő megtartása + Felülírás + Kihagyás + „_1” hozzáfűzése + Alkalmaz az összesre + A rendszer nem engedélyezi a műveletet ebben a mappában, válasszon másikat + A rendszer nem engedélyezi az ebbe a mappába másolást, válasszon egy másikat + A rendszer nem engedélyezi az átnevezést ebben a mappában + A közvetlenül a belső tárhelyen lévő mappák nem nevezhetők át, csak azok almappái + A mappa nem nevezhető át + + Válasszon egy mappát + Válasszon egy fájlt + Ellenőrizze a külső tároló hozzáférést + Mappaelérés megerősítése + Válassza ki az SD-kártya gyökérmappáját a következő képernyőn, hogy írási hozzáférést adjon + Ha nem látja az SD-kártyát, próbálja meg ezt + Engedélyezze a következő képernyőn, hogy az alkalmazás hozzáférjen a kiválasztott tárolóhoz, úgy hogy a „Mappa használata” gombra kattint lent. + Engedélyezze a(z) „%s” elérését a következő képernyő alján lévő „Mappa használata” gombra kattintással. + A mappa létrehozásához kattintson a következő képernyőn alján lévő „Mentés” gombra. + Kiválasztás megerősítése + Betöltés… + Adjon engedélyt az alkalmazásnak, hogy elérje az összes fájlját, enélkül lehet, hogy nem fog jól működni. + + %d elem + %d elem + + + + %d elem + %d elem + + + %d elem törlése + %d elem törlése + + + + %d névjegy + %d névjegy + + + Válasszon tárolót + Tároló + Belső + SD-kártya + Gyökér + Hibás mappát választott ki, válassza ki az SD-kártya gyökérmappáját + Az SD-kártya és az USB-s eszköz elérési útvonala nem lehet azonos + Úgy tűnik, hogy az alkalmazás az SD-kártyára van telepítve és emiatt az alkalmazás moduljai nem érhetők el. Nem fogja látni a rendelkezésre álló modulok között. Ez egy rendszerkorlátozás, így ha használni szeretné a modulokat, akkor át kell helyeznie az alkalmazást a belső tárterületre. + Hibás mappát választott ki, válassza ezt az útvonalat: „%s” + + Tulajdonságok + Elérési útvonal + Elemek kiválasztva + Közvetlen gyermekek száma + Összes fájl száma + Felbontás + Időtartam + Előadó + Album + Fókusztávolság + Expozíciós idő + ISO érzékenység + F-szám + Kamera + EXIF + Szám címe + GPS koordináták + Magasság + EXIF-értékek eltávolítása + Biztos, hogy eltávolítja az EXIF-értékeket, mint a GPS koordináták, a kameramodell, stb.\? + Az EXIF-értékek sikeresen eltávolítva + + Háttérszín + Szöveg színe + Elsődleges szín + A fehér téma kiemelő színe + A fekete-fehér téma kiemelő színe + Előtérszín + Alkalmazásikon színe + Alsó navigációs sáv színe + Alapértelmezések visszaállítása + Alapértelmezett használata + Alapértelmezett + Szín módosítása + Téma + A szín módosításával átvált az Egyéni témára + Mentés + Elvetés + Változások visszavonása + Biztos, hogy visszavonja a módosításait\? + Ez a művelet nem vonható vissza. + Nem mentette a változtatásokat. Menti a kilépés előtt? + Színek alkalmazása az összes Simple Apps alkalmazásra + FIGYELMEZTETÉS: Néhány indító nem megfelelően kezeli az alkalmazásikon testreszabását. Ha az ikon eltűnik, próbálja meg elindítani az alkalmazást a Google Playen vagy egy modulon keresztül, ha elérhető. Miután elindult, állítsa vissza az alapértelmezett narancssárga (#F57C00) ikont. A legrosszabb esetben újra kellhet telepítenie az alkalmazást. + A színek sikeresen frissültek. Hozzáadott egy új, „Közös” nevű témát, a jövőben ezt használja az összes alkalmazás színének frissítéséhez. + Bár a Pro alkalmazásverziót használja, műszaki okokból így is szükséges az Egyszerű köszönet alkalmazás telepítése, az gondoskodik ugyanis a színek szinkronizálásáról. + Kérjük, vásárolja meg az <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Egyszerű köszönet</a> alkalmazást a funkció feloldásához és a fejlesztés támogatásához. Köszönöm! + + Világos + Sötét + Automatikus + Automatikus világos/sötét + Kiégetett + Sötétvörös + Fehér + Fekete-fehér + Egyéni + Közös + System default + + Újdonságok + * itt csak a nagyobb frissítések vannak felsorolva, de mindig vannak kisebb javítások is + + Törlés + Eltávolítás + Átnevezés + Megosztás + Megosztva ezzel + Átméretezés + Összes kiválasztása + Szöveg kijelölése + Elrejtés + Elrejtés megszüntetés + Mappa elrejtése + Mappa elrejtésének megszüntetése + Rejtettek ideiglenes megjelenítése + Rejtett média ideiglenes megjelenítésének leállítása + Ilyen sok tartalmat nem oszthat meg egyszerre + Lomtár ürítése és letiltása + Visszavonás + Mégis + Nyomtatás + Nyomtatás (Pro) + Indító + Indító létrehozása + Indító létrehozása (Pro) + Szám hozzáadása névjegyhez + Névjegy részleteinek megtekintése + Hívás az 1. SIM-ről + Hívás a 2. SIM-ről + Fájlnév láthatóságának módosítása + Áthelyezés a tetejére + Áthelyezés alulra + Elem rögzítése + Elem rögzítésének megszüntetése + SMS küldése + E-mail küldése + Hívás + Névjegy részletei + Névjegy hozzáadása + Háttérképek + + Rendezés + Név + Méret + Utolsó módosítás + Létrehozás dátuma + Készítés dátuma + Cím + Fájlnév + Kiterjesztés + Véletlenszerű + Véletlenszerű rendezés + Növekvő + Csökkenő + Használat csak ehhez a mappához + Numerikus részek rendezése a tényleges érték szerint + Utónév + Középső név + Vezetéknév + Teljes név + Egyéni rendezés használata + Sorrend módosítása + + Biztos, hogy folytatja a törlést\? + Biztos, hogy törli ezt: %s\? + Delete %s? + + Biztos, hogy áthelyezi a(z) %s fájlt a Lomtárba\? + + Biztos, hogy törli ezt az elemet\? + Biztos, hogy áthelyezi ezt az elemet a Lomtárba\? + Ne kérdezze újra ebben a munkamenetben + Ne jelenítse meg újra + Igen + Nem + Talán + + FIGYELMEZTETÉS: %d mappát töröl + FIGYELMEZTETÉS: %d mappát töröl + + + PIN-kód + Írja be a PIN-kódot + Írjon be egy PIN-kódot + Hibás PIN-kód + PIN-kód újra + Minta + Minta megadása + Hibás minta + Minta ismétlése + Biometrikus adatok + Ujjlenyomat + Ujjlenyomat hozzáadása + Helyezze az ujját az ujjlenyomat-leolvasóra + Bizometrikus ellenőrzése párbeszédablak megnyitása + Hitelesítés + A hitelesítés sikertelen + A hitelesítés blokkolva, próbálkozzon újra egy kicsit később + Nincsenek regisztrált ujjlenyomatok, adjon hozzá néhányat az eszköz beállításaiban + Ugrás a Beállításokhoz + A jelszó beállítása sikeres. Ha elfelejti, akkor újra kell telepítenie az alkalmazást. + A védelem beállítása sikeres. A visszaállítással kapcsolatos problémák esetén telepítse újra az alkalmazást. + Mappa zárolása + Mappa zárolása (Pro) + Mappa zárolásának feloldása + Ez a védelem csak ezen az alkalmazáson belül működik, nem célja egy valódi rendszerszintű mappatitkosítás helyettesítése. + + Tegnap + Ma + Holnap + Minden nap + Év elrejtése + másodperc + perc + óra + nap + mp + p + ó + wk. + + %d másodperc + %d másodperc + + + %d perc + %d perc + + + %d óra + %d óra + + + %d nap + %d nap + + + %d hét + %d hét + + + %d hónap + %d hónap + + + %d év + %d év + + + + %d másodperc + %d másodperc + + + %d perc + %d perc + + + %d óra + %d óra + + + %d nap + %d nap + + + %d hét + %d hét + + + %d hónap + %d hónap + + + %d év + %d év + + + + %d másodperccel korábban + %d másodperccel korábban + + + %d perccel korábban + %d perccel korábban + + + %d órával korábban + %d órával korábban + + + %d nappal korábban + %d nappal korábban + + + %d héttel korábban + %d héttel korábban + + + %d hónappal korábban + %d hónappal korábban + + + %d évvel korábban + %d évvel korábban + + + + %d másodperc + %d másodperc + + + %d perc + %d perc + + + %d óra + %d óra + + + %d nap + %d nap + + + %d hét + %d hét + + + %d hónap + %d hónap + + + %d év + %d év + + + A riasztásig hátralévő idő eltűnik:\n%s + Az emlékeztető aktiválásáig hátralévő idő:\n%s + Hátralévő idő: +\n%s + Győződjön meg róla, hogy a riasztás megfelelően működik, mielőtt napi szinten használná. Az akkumulátor takarékossággal kapcsolatos rendszerkorlátozások miatt helytelenül is működhetnek. + Győződjön meg róla, hogy az emlékeztetők megfelelően működnek, mielőtt napi szinten használná. Az akkumulátor takarékossággal kapcsolatos rendszerkorlátozások miatt helytelenül is működhetnek. + Az alkalmazás értesítései le vannak tiltva. Kérjük, lépjen be a készülék beállításaiba és engedélyezze ezeket. + + Riasztás + Szundi + Elutasítás + Nincs emlékeztető + Kezdete + Rendszerhangok + Saját hangok + Új hang hozzáadása + Nincs hang + Napközben, ekkor: hh:mm + Napközben ekkor: %02d:%02d + + Beállítások + Egyszerű köszönet megvásárlása + Általános + Színek testreszabása + Továbbfejlesztett színtestreszabás + Színek testreszabása + Színek testreszabása (zárolva) + Zárolt + Modulszínek testreszabása + Értesítések testreszabása + Notification sound + Angol nyelv használata + Nyelv + Rejtett elemek megjelenítése + Betűméret + Kicsi + Közepes + Nagy + Extra nagy + Jelszavas védelem a rejtett elem láthatóságához + Jelszavas védelem az egész alkalmazáshoz + Jelszavas védelem a fájlok törléséhez és áthelyezéséhez + A régi „utoljára módosítva” érték megtartása a fájlműveleteknél + Információs buborék megjelenítése a görgetősáv húzásakor + A telefon alvó állapotának megakadályozása, amíg az alkalmazás előtérben van + Mindig ugorja át a törlések megerősítését + Felülről lefelé húzásos frissítés engedélyezése + 24 órás idő formátum használata + Dátum- és időformátum módosítása + A hét kezdete a vasárnap + Modulok + Mindig ugyanazt a szundi időt használja + Szundi ideje + Rezgés gombnyomáskor + Törlés helyett az elemek a Lomtárba helyezése + Lomtár ürítési intervallum + Lomtár ürítése + Álló mód kényszerítése + Beállítások exportálása + Beállítások importálása + A beállítások exportálása sikeres + A beállítások importálása sikeres + Kezdés a vezetéknévvel + Gyorsítótár ürítése + Megerősítő párbeszédablak megjelenítése hívásindítás előtt + + Láthatóság + Biztonság + Görgetés + Fájlműveletek + Lomtár + Mentés + Indítás + Szöveg + Átköltöztetés + Minőség + Főképernnyő + Bélyegképek + Listanézet + + Kizárás + Mappa kizárása + Kizárt mappák + (kizárt) + Kizárt mappák kezelése + Összes eltávolítása + Összes mappa eltávolítása a Kizárás listából. Ez nem törli a mappákat. + Kihagyottak megjelenítése ideiglenesen + Kihagyottak megjelenítésének leállítása + + Megjelenített lapok kezelése + Alkalmazás indításakor megjelenítendő lap + Névjegyek + Kedvencek + Hívásnapló + Csoportok + Utoljára használt + Fájlok + Legutóbbi fájlok + + Fájl helyreállítása + Kiválasztott fájlok helyreállítása + Összes fájl helyreállítása + A Lomtár sikeresen kiürítve + A fájlok sikeresen helyreállítva + Biztos, hogy üríti a Lomtárat\? A fájlok véglegesen elvesznek. + A Lomtár üres + A lomtárelemek áthelyezése le van tiltva, használja a Helyreállítás lehetőséget + Lomtár megjelenítése + Lomtár elrejtése + Lomtár megnyitása + Skip the Recycle Bin, delete files directly + + %d elem áthelyezése a Lomtárba + %d elem áthelyezése a Lomtárba + + + Importálás… + Exportálás… + Sikeres importálás + Sikeres exportálás + Sikertelen importálás + Sikertelen exportálás + Egyes elemek importálása nem sikerült + Egyes elemek exportálása nem sikerült + Az importáláshoz nem találhatók bejegyzések + Az importáláshoz nem találhatók bejegyzések + Az exportáláshoz nem találhatók bejegyzések + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Úgy tűnik, hogy az eszközéhez egy USB-s eszköz van csatlakoztatva. További engedélyeket kell megadnia, hogy a fájlok megfelelően jelenjenek meg. + Válassza ki az USB-s eszköz gyökérmappáját a következő képernyőn, hogy hozzáférést biztosítson + Hibás mappát választott ki, válassza ki az USB-s eszköz gyökérmappáját + + január + február + március + április + május + június + július + augusztus + szeptember + október + november + december + + jan. + feb. + már. + ápr. + máj. + jún. + júl. + aug. + szept. + okt. + nov. + dec. + + januárban + februárban + márciusban + áprilisban + májusban + júniusban + júliusban + augusztusban + szeptemberben + októberben + novemberben + decemberben + hétfő + kedd + szerda + csütörtök + péntek + szombat + vasárnap + H + K + Sz + Cs + P + Sz + V + + Kedd + Sze + Csüt + Pén + Szo + Vas + + Az Ön alkalmazásverziója már nem lesz frissítve. Frissítsen a Pro verzióra, hogy új javításokat és más fejlesztéseket kapjon. + Az Ön alkalmazásverziója már nem lesz frissítve. Frissítsen a Pro verzióra az ide kattintással, hogy új javításokat és más fejlesztéseket kapjon. + Eddig ingyenes: %s. Ha eddig letölti, akkor örökre ingyen használhatja. + További információk + Frissítés + A helyben tárolt eseményeket kézzel kell átköltöztetni egy .ics fájl exportálásával, majd importálással. Az exportálás/importálás gomb a főképernyő menüjében található. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Üdv, +\n +\nÚgy néz ki, hogy frissített az ingyenes verzióról. Ha elégedett ezzel, és átköltöztette az adatait, akkor eltávolíthatja a régi, ingyenes verziót, hogy nehogy azt indítsa el véletlenül, ha már nincs rá szüksége. +\n +\nKöszönöm! + Üdv, +\n +\nÚgy néz ki, hogy már rendelkezik a Pro verzióval. Ha elégedett vele, és átköltöztette az adatait, akkor eltávolíthatja a régi, ingyenes verziót, hogy nehogy azt indítsa el véletlenül, ha már nincs rá szüksége. +\n +\nKöszönöm! + Üdv, +\n +\nÚgy néz ki, hogy frissített az ingyenes verzióról. Ha át akarja költöztetni a helyileg tárolt eseményeit, akkor ezt kézzel kell megtennie, exportálja egy .ics fájlba az ingyenes verzióból, majd importálja a felső menüből. +\n +\nHa elégedett a beállításokkal a Pro verzióban, akkor eltávolíthatja a régi, ingyenes verziót, mert már nem lesz rá szüksége. +\n +\nKöszönöm! + Üdv, +\n +\nÚgy néz ki, hogy frissített az ingyenes verzióról. Ha voltak névjegyei a(z) „%s” alatt, akkor az átköltöztetéshez kézzel kell exportálnia egy .vcf fájlba az ingyenes verzióból, majd importálnia kell a felső menüből. +\n +\nHa elégedett a beállításokkal a Pro verzióban, akkor eltávolíthatja a régi, ingyenes verziót, mert már nem lesz rá szüksége. +\n +\nKöszönöm! + Üdv, +\n +\nÚgy néz ki, hogy frissített az ingyenes verzióról. Ha át akarja költöztetni a jegyzeteit, akkor kézzel kell exportálnia egy fájlba az ingyenes verzióból, majd importálnia kell a felső menüből. +\n +\nHa elégedett a beállításokkal a Pro verzióban, akkor eltávolíthatja a régi, ingyenes verziót, mert már nem lesz rá szüksége. +\n +\nKöszönöm! + + Névjegy + Weboldal + A forráskódok megtekintéséhez + Ide küldje a visszajelzését vagy a javaslatait + Frissítés Pro verzióra + További alkalmazások + További alkalmazásaink + Barátok meghívása + Nézze meg ezt: %1$s – %2$s + Meghívás + Értékeljen minket + Értékelés + Támogatás + Kövessen minket + v %1$s\nCopyright © Simple Mobile Tools %2$d + Támogatás + Segítsen nekünk + Közösségi média + Egyéb + Adatvédelmi irányelvek + Verzió: %s + Üdv :) + Szeretettel ❤️ készült Szlovákiában + Kiegészítő információ + Alkalmazásverzió: %s + Eszköz operációs rendszere: %s + Üdv,<br><br> remélem tetszik az alkalmazás. Nem tartalmaz hirdetéseket. Kérjük támogassa a fejlesztést az <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Egyszerű köszönet</a> megvásárlásával. Utána ez a párbeszédablak sem jelenik meg újra.<br><br> Köszönöm! + Üdv,<br><br> remélem tetszik az alkalmazás. Nem tartalmaz hirdetéseket, és adatokat sem gyűjtünk. Kérjük támogassa a fejlesztést az <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Egyszerű köszönet</a> megvásárlásával. Utána feloldja az összes alkalmazásfunkciót, mint a színek testreszabása.<br><br> Köszönöm! + Támogasson minket az <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Egyszerű köszönet</a> megvásárlásával. Ez feloldja az összes alkalmazásfunkciót, köztük a színek testreszabását is. + Vásárlás + Egyszerű telefon beszerzése + Frissítse az Egyszerű köszönet alkalmazást a legújabb verzióra + Mielőtt kérdezne, ellenőrizze az alkalmazás beállításait, és először olvassa el a Gyakran Ismételt Kérdéseket. Talán ott van a megoldás. + Az értékelés előtt nézze meg az alkalmazás beállításait, és olvassa el a gyakran ismételt kérdéseket. Ha problémája van, lehet, hogy a megoldás már ott van. + Arról is győződjön meg, hogy a legfrissebb verziót használja. + Vegye figyelembe, hogy ez az alkalmazásverziót már nem fejlesztjük, szerezze be a Pro változatot a számos fejlesztésért. + Elolvasás + GYIK elolvasása + Üdv, +\n +\nÚgy tűnik, elég régen használja ezt az alkalmazást, amit nagyra értékelünk. +\n +\nHa megkérhetjük egy szívességre, kérjük, értékeljen minket a Google Playen. Ez igazán segítene nekünk. +\n +\nFüggetlenül attól, hogy hogyan dönt, nem fogja látni ezt az üzenetet újra. +\n +\nKöszönjük! + Értékelje az alkalmazásunkat! :) + Köszönjük + A modul zárolt. +\nFrissítsen a Pro verzióra a feloldásához. + Ez a funkció zárolt, vásárolja meg az <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Egyszerű köszönet</a> alkalmazást a teljes alkalmazás feloldásához.<br><br>Ez egy egyszeri fizetés, és ha nem lesz elégedett, akkor visszatérítjük az árát. + + Üdv!<br><br>Csak tájékoztatni szeretnénk, hogy megjelent néhány új alkalmazás:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> A címeikre vagy ikonjaikra kattintva töltheti le őket.<br><br> Köszönjük! + Egyszerű alkalmazásindító + Egyszerű számológép + Egyszerű naptár + Egyszerű kamera + Egyszerű óra + Egyszerű névjegyek + Egyszerű tárcsázó + Egyszerű rajzolás + Egyszerű fájlkezelő + Egyszerű zseblámpa + Egyszerű galéria + Egyszerű billentyűzet + Egyszerű indító + Egyszerű zenelejátszó + Simple Notes + Egyszerű SMS üzenetküldő + Egyszerű köszönet + Egyszerű hangrögzítő + Alkalmazásindító + Számológép + Naptár + Kamera + Óra + Névjegyek + Tárcsázó + Rajzolás + Fájlkezelő + Zseblámpa + Galéria + Billentyűzet + Indító + Zenelejátszó + Jegyzetek + SMS üzenetküldő + Köszönöm + Hangrögzítő + Úgy tűnik, hogy az alkalmazásverziója megsérült. Töltse le az eredeti verziót <a href=%s>innen</a>. + + Gyakran Ismételt Kérdések + Mielőtt feltenne egy kérdést, először olvassa el ezt: + Miért nem látom az alkalmazás modulját a modulok között\? + Valószínűleg azért, mert áthelyezte az alkalmazást egy SD-kártyára. Van egy androidos rendszerkorlátozás, amely ebben az esetben elrejti az adott alkalmazás moduljait. Az egyetlen megoldás az alkalmazás visszahelyezése a belső tárolóra az eszköz beállításaiban. + Szeretném támogatni, de nem tudok pénzt adományozni. Van még valami, amit tehetek\? + Természetesen. Segítsen az alkalmazások népszerűsítésében, vagy adjon jó visszajelzést és értékelést. Segíthet abban is, hogy lefordítja az alkalmazásokat egy új nyelve, vagy frissítse a meglévő fordításokat. A fordítási leírás <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>ezen a weboldalon</a> található, vagy lépjen velünk kapcsolatba a <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> címen, ha kérdése van. + Tévedésből töröltem néhány fájlt, hogyan tudom helyreállítani\? + Sajnos nem lehet. A fájlok azonnal törlődnek a megerősítő párbeszédablak után, ott nem érhető el Lomtár. + Nem tetszik a modul színe, meg tudom változtatni őket\? + Igen, amikor egy modult futtat a kezdőképernyőn, akkor megjelenik a modulbeállító képernyő. A bal alsó sarokban színes négyzetek láthatók, csak nyomja meg az egyiket, és új színt választhat. Használhatja a csúszkát az alfa beállításához is. + Helyre tudom állítani a törölt fájlokat\? + Ha valóban törölve lettek, akkor nem. Viszont alapértelmezetten be van kapcsolva a Lomtár, így a törölt fájlok egyszerűen a Lomtárba kerülnek ahelyett, hogy ténylegesen törlődnének. + Az alkalmazásindító ikon eltűnt. Mit tehetek? + Ez azért van, mert az indító nem megfelelően kezeli az alkalmazásikon testreszabását. Próbálja meg elindítani az alkalmazást a Google Playen vagy egy modulon keresztül, ha elérhető. Miután elindult, állítsa vissza az alapértelmezett narancssárga (#F57C00) ikont. A legrosszabb esetben újra kellhet telepítenie az alkalmazást. + A pénzt levonták a bankszámlámról, de mégsem tudom letölteni az alkalmazást. Mit tehetek\? + A fizetéseket teljesen a Google kezeli, és néha problémák vannak a rendszerükkel. Csak törölje a Google Play alkalmazása gyorsítótárát és indítsa újra az eszközé, majd próbálja újra letölteni. + Miért érdemes frissítenem a Pro verzióra\? + Mivel ezt az alkalmazásverziót már nem frissítjük, az esetleges hibák sosem lesznek kijavítva, ahogy új funkciókat sem fog kapni az alkalmazás. A Pro verziót egy egyszeri kis összegért megvásárolhatja a Google Play áruházban. Az egyszeri fizetés azt jelenti, hogy ha egyszer megvette, soha többé nem kell fizetnie, még egy új eszközön sem. Ha nem tetszik a Pro verzió, a vásárlás után pár órán belül eltávolítva automatikusan visszakapja az árát. Ha később szeretne visszatérítést, csak írjon nekünk a hello@simplemobiletools.com címre, és meg fogja kapni. + Hogyan tudok egyszerre több elemet kiválasztani\? + Több mód is van rá. Megnyomhatja hosszan az első elemet, majd röviden megérintheti a továbbiakat. Lehet az egérrel ellátott számítógépekhez hasonlóan egy elemet hosszan megnyomva megkezdeni a kijelölést, majd – az ujjat közben nem felengedve – húzással kijelölni a többit. Egy harmadik lehetőség hosszan megnyomni az első elemet, majd szintén hosszan megnyomni az utolsót: ez a kettő közötti összes elemet kijelöli. Ha minden elemet egyszerre ki akar jelölni, nyomja meg hosszan bármelyik elemet, majd érintse meg a bal felső sarokban lévő számlálót, ez minden elemet kijelöl, vagy minden elem kijelölését törli. + Megvásároltam az alkalmazást, de nem tudom letölteni egy másik eszközön. + Próbálja üríteni a Google Play alkalmazás gyorsítótárát és indítsa újra az eszközét. Ez valami Google Play hiba, nem az alkalmazással kapcsolatos. + + Közreműködők + Fordítás + Fejlesztés + Egyéb segítség + Ez a lista mindenkit tartalmaz, aki jelentősen segített a Simple Mobile Tools csomag bármely alkalmazásában, nem csak ebben a konkrét alkalmazásban. A fordítást önkéntesek végzik; lépjen kapcsolatba velünk, ha be szeretne segíteni. Elérhető egy <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>rövid útmutató a fordítás menetéről</a>, és ha további kérdése maradt, a <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> e-mail-címen léphet kapcsolatba velünk. Köszönet minden közreműködőnek és egyéb támogatónak! + Arab + Azerbajdzsáni + Bengáli + Breton + Bulgarian + Katalán + Cseh + Walesi + Dán + English + Német + Görög + Spanyol + Baszk + Perzsa + Finn + Francia + Galiciai + Hindi + Horvát + Magyar + Indonéz + Olasz + Héber + Japán + Koreai + Litván + Nepáli + Norvég + Holland + Lengyel + Portugál + Román + Orosz + Szlovák + Szlovén + Szerb + Svéd + Tamil + Török + Ukrán + Vietnámi + Kínai (Hongkong) + Kínai (egyszerűsített) + Kínai (hagyományos) + + Szerezze be a Pro verziót most! + Alap + Pro + Reklámmentes + Internet-hozzáférés nem szükséges + 100% pénzvisszatérítési garancia + Egyszeri fizetés + Továbbfejlesztett megjelenés + + Fejlett képszerkesztő + Fejlett fénykép- és videószerkesztő + HEIC/HEIF-fájlok támogatása + Fejlett tömeges fájlátnevezés + Mappák egyenkénti zárolása + Nyomtatás támogatása + + Időzónák támogatása + Résztvevők és e-mailes értesítések + Egyszerű eseményimportálás + Új modulok + + Ismétlődő névjegyek egyesítésének fejlesztett megvalósítása + Betűméret testreszabása + Nem kötelező, privát névjegymegosztás az alkalmazásainkban + Testreszabható névjegyenkénti csengőhangok + Névjegyszűrés + Privát módon tárolt névjegyek + + Ellenőrzőlisták + Modulonként eltérő jegyzetek és színek + Jegyzetek zárolása + + Dátum- és időformátum testreszabása + Indítók a kezdőképernyőn + Fájltömörítés-támogatása + Lap a legutóbbi fájlokkal + + Háttérszín testreszabása + Fájlimportálás támogatása + Nagyítás + + Ez az alkalmazás a következő harmadik féltől származó programkönyvtárakat használja az életem megkönnyítéséhez. Köszönöm. + Harmadik feles licencek + Kotlin (programnyelv) + Subsampling Scale Image View (nagyítható képnézetek) + Glide (képbetöltés és gyorsítótárazás) + Picasso (képbetöltés és gyorsítótárazás) + Android Image Cropper (kép vágása és forgatása) + RtlViewPager (jobbról balra csúsztatás) + Joda-Time (alternatív javás dátumkezelés) + Stetho (debug adatbázisok) + Otto (eseménybusz) + PhotoView (nagyítható GIF-ek) + PatternLockView (mintás zárolási védelem) + Reprint (ujjlenyomatos védelem) + Gif Drawable (GIF betöltése) + AutoFitTextView (szöveg átméretezése) + Robolectric (tesztelési keretrendszer) + Espresso (tesztelési segéd) + Gson (JSON értelmező) + Leak Canary (memóriaszivárgás-észlelő) + Number Picker (testreszabható számválasztó) + ExoPlayer (videólejátszó) + VR Panorama View (panorámakép megjelenítése) + Apache Sanselan (kép metaadatainak kiolvasása) + Android Photo Filters (képszűrők) + Gesture Views (nagyítható képek) + Indicator Fast Scroll (betűk a görgetősávon) + Event Bus (alkalmazáson belüli kommunikáció) + Audio Record View (hangvizualizáció) + SMS MMS (SMS- és MMS-kezelés) + APNG Android (animált WebP támogatása) + PDFViewPager (PDF megjelenítő) + M3U Parser (m3u lejátszási listák kezelése) + AndroidLame (mp3 kódoló) + + A próbaidőszak lejárt + Ingyenes próbaidőszak elkezdése + A próbaverziója hamarosan lejár. + Unlock the app for one final day + Üdvözli a(z) %s! + Köszönjük, hogy az alkalmazásunkat használja. Ezt a feloldott verziót %d napig használhatja. Amint a próbaverzió véget ér, fontolja meg a Pro verzióra történő frissítést. Számos új funkcióval és modern dizájnnal rendelkezik, nincsenek benne reklámok, és sok más fejlesztést tartalmaz. +\n +\nCsak egyetlen egyszer kell érte fizetnie, és ha nem elégedett vele, akkor eltávolíthatja és visszakérheti az árát. +\n +\nReméljük, hogy tetszeni fog :) + Frissítsen a Pro verzióra, hogy a teljes mértékig kiélvezhesse az alkalmazást. +\n +\nCsak egyetlen egyszer kell érte fizetnie, és ha nem elégedett vele, akkor eltávolíthatja és visszakérheti az árát. +\n +\nReméljük, hogy tetszeni fog :) + + A próbaverzió %d nap múlva lejár. + A próbaverzió %d nap múlva lejár. + + + ELAVULT: Az alkalmazás ezen verziója már nem fog frissülni, töltse le a Pro verziót a https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro címről + Ne felejtse el, hogy ha 2 órán belül eltávolítja a fizetős alkalmazásunkat, akkor automatikusan visszatérítjük az árát. Ha később bármikor mégis visszatérítést szeretne, lépjen kapcsolatba velünk a hello@simplemobiletools.com címen, és visszakapja. Ez is megkönnyíti a kipróbálást :) + + Egyszerű, nyílt forráskódú androidos alkalmazásgyűjtemény testreszabható modulokkal, hirdetések és felesleges engedélykérések nélkül. + diff --git a/commons/src/main/res/values-in/strings.xml b/commons/src/main/res/values-in/strings.xml new file mode 100644 index 000000000..300ecad0c --- /dev/null +++ b/commons/src/main/res/values-in/strings.xml @@ -0,0 +1,1073 @@ + + + Oke + Batal + Kembali + Tidak ada + Kemudian + Simpan sebagai + Berkas berhasil disimpan + Format berkas tidak valid + Error kehabisan memori + Kesalahan: %s + Error: %s + Buka dengan + Sunting dengan + Sunting + Tidak ada aplikasi yang sesuai + Tidak ada peramban yang ditemukan + Tidak ada klien email yang ditemukan + Setel sebagai + Salin ke papan klip + Salin angka ke papan klip + Nilai disalin ke papan klip + Nilai disalin ke papan klip:\n%s + Nomor telepon + Tidak diketahui + Selalu + Jangan pernah + Detail + Catatan + Menghapus folder \'%s\' + Tidak ada + Label + Transparan + Warna transparan + Pilih warna berbeda + Unduh + Notifikasi + Notifications + Email + Sebelumnya + Putar / Jeda + Berikutnya + Nomor + Tidak ada kontak yang ditemukan + Meminta izin yang diperlukan + Aplikasi tidak dapat mengakses kontak Anda + Aplikasi tidak diizinkan untuk memulai panggilan, mohon berikan izin di setelan perangkat + Masukkan teks di sini + Panggil %s + Confirm calling %s + Nol + Satu + Dua + Tiga + Empat + Lima + Enam + Tujuh + Delapan + Sembilan + Nilai + Nilai tidak boleh kosong + Buat kontak baru + Tambah ke kontak yang ada + Aplikasi Korup + Peringatan + Ambil foto + Pilih foto + Pilih video + Pilih kontak + Pilih berkas + Rekam audio + Rekam video + Memperbarui… + Penyimpanan telepon + Penyimpanan telepon (tidak terlihat oleh aplikasi lain) + Audio + + Ulang tahun + Hari jadi + + Rumah + Kerja + + Ponsel + Utama + Faks Kerja + Faks Rumah + Pager + Tidak ada nomor telepon yang ditemukan + + Ubah tampilan + Kotak + Kotak (Pro) + Grid Tidak Rata + Daftar + Tambah jumlah kolom + Kurangi jumlah kolom + Jumlah kolom + Jumlah kolom potret + Jumlah kolom lanskap + Ubah gambar kover + Pilih foto + + %d column + %d columns + + + Kelola nomor yang diblokir + Anda tidak memblokir siapapun. + Tambahkan nomor yang diblokir + Blokir nomor + Blokir nomor + Nomor yang diblokir + Ekspor nomor terblokir + Impor nomor terblokir + Anda harus mengatur aplikasi ini sebagai aplikasi dialer default untuk menggunakan fitur pemblokir nomor. + Tetapkan sebagai default + Yakin untuk memblokir \"%s\"\? + Blokir panggilan dari kontak yang tidak disimpan + Blokir pesan dari kontak yang tidak disimpan + Masukkan nomor atau pola (mis. *12345*, +62*8888) untuk memblokir semua panggilan dan pesan dari nomor yang sesuai dengan pola. + Tidak dapat memblokir nomor yang tidak diketahui tanpa izin ID pemanggil. + + Favorit + Tambah favorit + Tambah ke favorit + Hapus dari favorit + + Cari + Cari dalam %s + Ketik paling tidak 2 karakter untuk mencari. + Cari kontak + Cari favorit + Cari aplikasi + Cari acara + Cari grup + Riwayat pencarian + Cari panggilan + Cari berkas + Cari folder + Cari berkas dan folder + Cari daftar putar + Cari artis + Cari album + Cari trek + Cari teks + Cari percakapan + Cari rekaman + + Filter + Saring (Pro) + Item tidak ditemukan. + Ubah filter + + Izin penyimpanan diperlukan + Izin kontak diperlukan + Izin kamera diperlukan + Izin audio diperlukan + Tidak ada izin + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Ubah nama berkas + Ubah nama folder + Tidak bisa mengubah nama berkas + Tidak bisa mengubah nama folder + Nama folder tidak boleh kosong + Folder dengan nama sama sudah ada + Tidak bisa mengubah nama folder root penyimpanan + Nama folder berhasil diubah + Mengubah nama folder + Nama berkas tidak boleh kosong + Nama berkas berisi karakter tidak valid + \'%s\' berisi karakter tidak valid + Ekstensi tidak boleh kosong + Berkas sumber %s tidak ada + Tambah akhiran nama berkas + Tambah awalan nama berkas + Perubahan nama sederhana + Pola + Kata untuk ditambahkan + %Y - tahun\n%M - bulan\n%D - hari\n%h - jam\n%m - menit\n%s - detik\n%i - angka bertambah mulai dari 1 + Nama File (tanpa .txt) + Nama File (tanpa .json) + Nama File (tanpa .zip) + Mulai dari Android 11 Anda tidak dapat menyembunyikan file dan folder seperti itu + + Salin + Pindah + Salin / Pindah + Salin ke + Pindah ke + Sumber + Tujuan + Pilih tujuan + Klik di sini untuk memilih tujuan + Tidak bisa menyimpan ke tujuan ini + Silakan pilih tujuan + Sumber dan tujuan tidak boleh sama + Tidak bisa menyalin berkas + Menyalin… + Berkas berhasil disalin + File berhasil disalin + Telah terjadi kesalahan + Memindahkan… + Berkas berhasil dipindahkan + File berhasil dipindah + Beberapa berkas tidak bisa dipindahkan + Beberapa berkas tidak bisa disalin + Tidak ada berkas yang dipilih + Menyimpan… + Tidak bisa membuat folder %s + Tidak bisa membuat berkas %s + Tidak ada item baru yang ditemukan + Tujuan tidak memiliki cukup ruang kosong.\nMembutuhkan %1$s, tersedia %2$s + Layanan sistem untuk memilih file dan folder tidak tersedia + + Buat baru + Folder + File + Buat folder baru + Berkas atau folder dengan nama sama sudah ada + Nama berisi karakter tidak valid + Silakan masukkan nama + Telah terjadi kesalahan yang tidak diketahui + + Berkas \"%s\" sudah ada + Berkas \"%s\" sudah ada. Ganti? + Folder \"%s\" sudah ada + Gabung + Simpan keduanya + Timpa + Lewati + Akhiri dengan \'_1\' + Terapkan ke semua + Sistem tidak memperbolehkan operasi di folder ini, mohon pilih yang lain + Sistem tidak memperbolehkan menyalin ke folder ini, mohon pilih yang lain + Sistem tidak memperbolehkan perubahan nama dalam folder ini + Tidak dapat mengubah nama folder secara langsung pada penyimpanan internal, hanya subfolder + Tidak dapat mengubah nama folder ini + + Pilih folder + Pilih berkas + Konfirmasi akses penyimpanan eksternal + Konfirmasi akses folder + Silakan pilih folder root dari kartu SD pada layar berikutnya, untuk memberi akses penyimpanan + Jika Anda tidak melihat kartu SD, cobalah ini + Mohon izinkan aplikasi mengakses penyimpanan yang dipilih pada layar berikutnya dengan mengetuk \'Gunakan folder ini\' di bawah. + Mohon izinkan mengakses \'%s\' pada layar berikutnya dengan mengetuk \'Gunakan folder ini\' di bawah. + Mohon tekan \'Simpan\' di bawah pada layar berikutnya untuk membuat folder baru. + Konfirmasi pilihan + Memuat… + Mohon berikan aplikasi ini akses ke semua file Anda, mungkin tidak bekerja tanpa itu. + + %d item + + + + %d item + + + Menghapus %d item + + + + %d kontak + %d kontak + + + Pilih penyimpanan + Penyimpanan + Internal + Kartu SD + Root + Folder salah, silakan pilih folder root kartu SD anda + Jalur kartu SD dan perangkat USB tidak boleh sama + Kelihatannya anda memasang aplikasi ini di kartu SD, sehingga widget tidak tersedia. Anda tidak akan melihatnya di daftar widget yang tersedia. + Ini adalah keterbatasan sistem, jika anda ingin menggunakan widget, anda harus memindahkan aplikasi ke penyimpanan internal. + Folder yang dipilih salah, mohon pilih jalur \'%s\' + + Properti + Jalur + Item dipilih + Jumlah isi di dalamnya + Total jumlah berkas + Resolusi + Durasi + Artis + Album + Jarak fokus + Waktu paparan + Kecepatan ISO + Bukaan + Kamera + EXIF + Judul lagu + Koordinat GPS + Ketinggian + Hapus EXIF + Apakah Anda ingin menghapus nilai EXIF seperti koordinat GPS, model kamera dll\? + Nilai EXIF berhasil dihapus + + Warna latar belakang + Warna teks + Warna utama + Warna aksen tema putih + Warna aksen tema Hitam & Putih + Warna latar depan + Warna ikon aplikasi + Warna bilah navigasi bawah + Kembalikan ke default + Gunakan default + Default + Ubah warna + Tema + Mengubah warna akan mengalihkannya ke tema Khusus + Simpan + Abaikan + Urungkan perubahan + Apakah anda yakin ingin mengurungkan perubahan? + Tindakan ini tidak dapat diurungkan. + Perubahan anda belum disimpan. Simpan sebelum keluar? + Terapkan warna ke semua Aplikasi Simpel + PERINGATAN: Beberapa aplikasi launcher tidak mendukung kustomisasi ikon aplikasi. Jika ikon hilang, coba jalankan aplikasi via Google Play atau widget, jika tersedia. + Setelah dijalankan, kembalikan warna default ikon #F57C00. Jika masih tidak bisa, anda mungkin harus memasang ulang aplikasi. + Warna berhasil diperbarui. Tema baru dengan nama \'Saling Berbagi\' telah ditambahkan. Kedepannya, silakan gunakan untuk memperbarui semua warna aplikasi. + Dicatat bahwa meskipun Anda menggunakan versi aplikasi Pro, Anda masih membutuhkan Terima Kasih Simpel untuk alasan teknis. Itu menangani sinkronisasi warna. + Silakan beli <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Terima Kasih Simpel</a> untuk membuka fungsi ini dan mendukung pengembangan. Terima kasih! + + Terang + Gelap + Auto + Terang / gelap otomatis + Solarize + Merah gelap + White + Hitam & Putih + Khusus + Saling Berbagi + System default + + Apa yang baru + * hanya perubahan besar yang ditampilkan di sini, selalu ada juga peningkatan kecil + + Hapus + Buang + Ubah nama + Bagikan + Bagikan via + Ubah ukuran + Pilih semua + Pilih teks + Sembunyikan + Tampilkan + Sembunyikan folder + Tampilkan folder + Sementara tampilkan yang tersembunyi + Berhenti tampilkan media tersembunyi + Anda tidak bisa membagikan konten sebanyak ini sekaligus + Kosongkan dan nonaktifkan Keranjang Sampah + Urungkan + Ulangi + Cetak + Cetak (Pro) + Pintasan + Buat pintasan + Buat pintasan (Pro) + Add number to contact + View contact details + Panggil dari SIM 1 + Panggil dari SIM 2 + Ubah visibilitas nama berkas + Pindahkan ke atas + Pindahkan ke bawah + Pin item + Lepaskan pin item + Kirim SMS + Send email + Panggil + Contact details + Add contact + Wallpaper + + Urutkan menurut + Nama + Ukuran + Terakhir diubah + Tanggal dibuat + Tanggal diambil + Judul + Nama berkas + Ekstensi + Acak + Urutkan secara acak + Naik + Turun + Gunakan hanya untuk folder ini saja + Urutkan bagian numerik menurut nilai sebenarnya + Nama depan + Nama tengah + Nama belakang + Full name + Gunakan urutan khusus + Ubah urutan + + Apakah anda yakin ingin melanjutkan penghapusan? + Apakah anda yakin ingin menghapus %s? + Delete %s? + + Anda yakin ingin memindahkan %s ke Keranjang Sampah? + + Apakah anda yakin ingin menghapus item ini? + Apakah anda yakin ingin memindahkan item ini ke Keranjang Sampah? + Jangan tanya lagi untuk sesi ini + Jangan tampilkan ini lagi + Ya + Tidak + Mungkin + + PERHATIAN: Anda akan menghapus %d folder + + + PIN + Masukkan PIN + Silakan masukkan PIN + PIN salah + Ulangi PIN + Pola + Masukkan pola + Pola salah + Ulangi pola + Biometrik + Sidik jari + Tambah sidik jari + Tempatkan jari anda pada sensor sidik jari + Buka dialog verifikasi ID biometrik + Autentikasi + Autentikasi gagal + Autentikasi diblokir, silakan coba lagi nanti + Anda belum mendaftarkan sidik jari, silakan tambahkan di Pengaturan perangkat anda + Buka Pengaturan + Sandi berhasil dibuat. Silakan pasang ulang aplikasi jika anda melupakannya. + Perlindungan berhasil dibuat. Silakan pasang ulang aplikasi jika ada masalah dalam menyetel ulang. + Kunci folder + Kunci folder (Pro) + Buka kunci folder + Perlindungan ini hanya bekerja di aplikasi ini saja, tidak dibuat untuk menggantikan fitur enkripsi folder keseluruhan sistem. + + Kemarin + Hari ini + Besok + Setiap hari + Sembunyikan tahun + detik + menit + jam + hari + s + m + h + wk. + + %d detik + + + %d menit + + + %d jam + + + %d hari + + + %d minggu + + + %d bulan + + + %d tahun + + + + %d detik + + + %d menit + + + %d jam + + + %d hari + + + %d minggu + + + %d bulan + + + %d tahun + + + + %d detik sebelumnya + + + %d menit sebelumnya + + + %d jam sebelumnya + + + %d hari sebelumnya + + + %d minggu sebelumnya + + + %d months before + + + %d years before + + + + %d detik + + + %d menit + + + %d jam + + + %d hari + + + %d minggu + + + %d bulan + + + %d tahun + + + Sisa waktu hingga alarm berbunyi:\n%s + Sisa waktu hingga pengingat muncul:\n%s + Waktu tersisa: +\n%s + Silakan pastikan alarm berfungsi dengan baik sebelum menggunakannya. Bisa saja terjadi salah tindakan karena keterbatasan sistem terkait penghematan baterai. + Silakan pastikan pengingat berfungsi dengan baik sebelum menggunakannya. Bisa saja terjadi salah tindakan karena keterbatasan sistem terkait penghematan baterai. + Notifikasi aplikasi ini dinonaktifkan. Silakan buka pengaturan perangkat untuk mengaktifkannya. + + Alarm + Tunda + Abaikan + Tidak ada pengingat + Waktu mulai + Suara sistem + Suara khusus + Tambah suara baru + Tidak ada suara + Saat pagi hari pada jj:mm + Saat pagi hari pada %02d:%02d + + Pengaturan + Beli Terima Kasih Simpel + General + Kustomisasi warna + Improved color customization + Sesuaikan warna + Sesuaikan warna (Locked) + Terkunci + Sesuaikan warna widget + Kustomisasi notifikasi + Notification sound + Gunakan bahasa Inggris + Bahasa + Tampilkan item tersembunyi + Ukuran fon + Kecil + Medium + Besar + Sangat besar + Lindungi visibilitas item tersembunyi dengan sandi + Lindungi seluruh aplikasi dengan sandi + Lindungi penghapusan dan pemindahan berkas dengan sandi + Simpan nilai terakhir diubah sebelumnya saat memproses berkas + Tampilkan info saat menggeser bilah gulir + Cegah ponsel tidur saat aplikasi terbuka + Selalu lewati dialog konfirmasi hapus + Aktifkan fitur tarik untuk memperbarui + Gunakan format waktu 24 jam + Ubah format tanggal dan waktu + Awal pekan hari Minggu + Widget + Selalu gunakan waktu tunda yang sama + Waktu tunda + Getar saat tombol disentuh + Pindahkan item ke Keranjang Sampah alih-alih dihapus + Interval pengosongan Keranjang Sampah + Kosongkan Keranjang Sampah + Paksa mode potret + Ekspor pengaturan + Impor pengaturan + Pengaturan berhail diekspor + Pengaturan berhail diimpor + Nama dimulai dengan nama belakang + Hapus tembolok + Tampilkan dialog konfirmasi panggilan sebelum melakukan panggilan + + Visibilitas + Keamanan + Menggulir + Operasi berkas + Keranjang Sampah + Menyimpan + Memulai + Teks + Memindahkan + Kualitas + Layar utama + Thumbnail + List view + + Kecualikan + Tidak sertakan folder + Folder yang dikecualikan + (tidak disertakan) + Kelola folder yang dikecualikan + Buang semua + Buang semua folder dari daftar pengecualian\? Ini tidak akan menghapus folder tersebut. + Tampilkan sementara yang tidak termasuk + Berhenti menampilkan yang tidak termasuk + + Kelola tab yang ditampilkan + Tab untuk dibuka pada saat aplikasi dibuka + Contacts + Favorit + Riwayat Panggilan + Grup + Yang digunakan terakhir kali + Files + File terbaru + + Pulihkan berkas ini + Pulihkan berkas yang dipilih + Pulihkan semua berkas + Keranjang Sampah berhasil dikosongkan + Berkas berhasil dipulihkan + Apakah anda yakin ingin mengosongkan Keranjang Sampah? File akan dihapus secara permanen. + Keranjang Sampah kosong + Memindahkan item Keranjang Sampah dinonaktifkan, silakan gunakan fitur Pemulihan + Tampilkan Keranjang Sampah + Sembunyikan Keranjang Sampah + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Memindahkan %d item ke Keranjang Sampah + + + Mengimpor… + Mengekspor… + Berhasil mengimpor + Berhasil mengekspor + Gagal mengimpor + Gagal mengekspor + Gagal mengimpor beberapa entri + Gagal mengekspor beberapa entri + Tidak ditemukan entri untuk bisa diimpor + Tidak ada entri untuk diimpor + Tidak ditemukan entri untuk bisa diekspor + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Sepertinya anda memiliki perangkat USB di perangkat anda. Untuk memastikan berkas ditampilkan dengan benar, anda perlu memberi izin akses tambahan. + Silakan pilih folder root perangkat USB di layar berikutnya untuk memberi izin akses + Folder yang dipilih salah, silakan pilih folder root perangkat USB + + Januari + Februari + Maret + April + Mei + Juni + Juli + Agustus + September + Oktober + November + Desember + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + pada Januari + pada Februari + pada Maret + pada April + pada Mei + pada Juni + pada Juli + pada Agustus + pada September + pada Oktober + pada November + pada Desember + Senin + Selasa + Rabu + Kamis + Jumat + Sabtu + Minggu + S + S + R + K + J + S + M + Sen + Sel + Rab + Kam + Jum + Sab + Min + + Versi aplikasi Anda tidak akan diperbarui lagi. Silakan tingkatkan ke versi Pro untuk menerima perbaikan baru. + Versi aplikasi Anda tidak akan diperbarui lagi. Silakan tingkatkan ke versi Pro untuk menerima perbaikan baru dengan mengetuk di sini. + Versi Pro tetap gratis hingga: %s. Jika anda mengunduhnya sampai batas waktu tersebut, anda bisa menggunakannya gratis selamanya. + Info selengkapnya + Tingkatkan + Anda perlu memindahkan acara yang disimpan lokal secara manual dengan cara mengekspornya ke berkas .ics, lalu mengimpornya kembali. Anda bisa menemukan tombol ekspor/impor di layar menu utama. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Halo, +\n +\nsepertinya Anda sudah memiliki versi aplikasi Pro juga. Setelah Anda puas dengan aplikasi ini dan mungkin memigrasikan data Anda, Anda dapat menghapus instalasi aplikasi ini untuk menghindari peluncuran aplikasi ini secara tidak sengaja karena Anda tidak akan membutuhkannya lagi. +\n +\nTerima kasih! + Halo, +\n +\nsepertinya Anda baru saja meningkatkan dari versi gratis. Jika Anda ingin memigrasikan acara yang disimpan secara lokal, Anda harus melakukannya secara manual dengan mengekspornya ke dalam berkas .ics dalam versi aplikasi gratis dan mengimpornya di sini melalui menu atas. +\n +\nSetelah Anda puas dengan pengaturan Anda dalam versi Pro, Anda bisa menghapus instalasi versi gratis yang lama karena Anda tidak memerlukannya lagi. +\n +\nTerima kasih! + Halo, +\n +\nsepertinya Anda baru saja meningkatkan dari versi gratis. Jika Anda memiliki kontak yang tersimpan di bawah \"%s\", Anda harus memigrasikannya secara manual dengan mengekspor dalam berkas .vcf dari versi aplikasi gratis dan mengimpornya di sini melalui menu atas. +\n +\nSetelah Anda puas dengan pengaturan Anda dalam versi Pro, Anda dapat menghapus instalasi versi gratis yang lama karena Anda tidak memerlukannya lagi. +\n +\nTerima kasih! + Halo, +\n +\nsepertinya Anda baru saja meningkatkan dari versi gratis. Jika Anda ingin memigrasikan catatan Anda, Anda harus melakukannya secara manual dengan mengekspornya ke dalam berkas di versi aplikasi gratis dan mengimpornya di sini melalui menu atas. +\n +\nSetelah Anda puas dengan pengaturan Anda dalam versi Pro, Anda dapat menghapus versi gratis yang lama karena Anda tidak akan membutuhkannya lagi. +\n +\nTerima kasih! + + Tentang + Website + Untuk kode sumber kunjungi + Kirim umpanbalik atau saran ke + Tingkatkan ke Pro + Aplikasi lainnya + Lebih banyak aplikasi dari kami + Undang teman + Hai, cobalah %1$s di %2$s + Undang via + Nilai kami + Nilai + Donasi + Ikuti kami + v %1$s\nHak cipta © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Kebijakan privasi + Version %s + Halo :) + Dibuat dengan ❤️ di Slovakia + Info tambahan + Versi aplikasi: %s + OS perangkat: %s + Halo,<br><br> semoga Anda menyukai aplikasi ini. Aplikasi ini sama sekali tidak berisi iklan, dukung pengembangan dengan membeli aplikasi <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Terima Kasih Simpel</a>, ini juga untuk mencegah dialog ini muncul kembali.<br><br> Terima kasih! + Halo,<br><br>semoga Anda menikmati aplikasi ini. Aplikasi ini tidak berisi iklan dan kami juga tidak mengumpulkan data Anda, mohon dukung pengembangannya dengan membeli <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Terima Kasih Simpel</a>. Anda juga akan memiliki semua fitur aplikasi termasuk kustomisasi warna.<br><br>Terima kasih! + Silakan dukung kami dengan membeli <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Terima Kasih Simpel</a>, itu juga akan membuka fitur aplikasi termasuk kustomisasi warna. + Beli + Dapatkan Ponsel Simpel + Silakan perbarui Terima Kasih Simpel ke versi terbaru + Sebelum anda bertanya, silakan periksa pengaturan aplikasi dan baca Pertanyaan yang Paling Sering Ditanyakan terlebih dahulu. Mungkin solusi yang anda cari ada di sana. + Sebelum Anda menilai kami, silakan periksa pengaturan aplikasi dan baca Pertanyaan yang Sering Diajukan terlebih dahulu. Jika Anda memiliki masalah, mungkin solusinya ada di sana. + Pastikan juga anda menggunakan versi aplikasi terbaru. + Perhatikan juga bahwa versi aplikasi ini tidak lagi dikembangkan, dapatkan versi Pro untuk banyak peningkatan. + Baca + Baca FAQ + Halo, +\n +\nsepertinya Anda sudah cukup lama menggunakan aplikasi ini, dan kami sangat menghargainya. +\n +\nJika kami bisa meminta bantuan Anda, tolong beri nilai kami di Google Play. Itu akan sangat membantu kami. +\n +\nBagaimanapun Anda memutuskan, Anda tidak akan melihat pesan ini lagi. +\n +\nTerima kasih! + Tolong beri nilai aplikasi kami :) + Terima kasih + Widget terkunci. +\nHarap tingkatkan ke versi Pro untuk membukanya. + Fitur ini terkunci, silakan beli <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Terima Kasih Simpel</a> untuk membuka kunci aplikasi lengkapnya. Ini adalah pembayaran satu kali saja dan jika Anda tidak akan puas, kami dapat mengembalikan uang Anda. + + +
    + hanya memberitahu ada aplikasi baru dirilis:

    + %2$s

    + %4$s

    + %6$s

    + Anda bisa mengunduhnya dengan menekan judulnya.

    + Terima kasih + ]]> +
    + Peluncur Aplikasi Simpel + Kalkulator Simpel + Kalender Simpel + Kamera Simpel + Jam Simpel + Kontak Simpel + Telepon Simpel + Gambar Simpel + Pengelola Berkas Simpel + Senter Simpel + Galeri Simpel + Papan Ketik Simpel + Peluncur Simpel + Pemain Musik Simpel + Catatan Simpel + Perpesanan SMS Simpel + Terima Kasih Simpel + Perekam Suara Simpel + Peluncur Aplikasi + Kalkulator + Kalender + Kamera + Jam + Contacts + Telepon + Gambar + File Manager + Senter + Galeri + Papan Ketik + Peluncur + Pemain Musik + Notes + Perpesanan SMS + Terima Kasih + Perekam Suara + + di sini. + ]]> + + + FAQ + Sebelum anda bertanya, silakan baca + Kenapa saya tidak melihat widget aplikasi ini di daftar widget? + Kemungkinan besar karena anda memindahkan aplikasi ke kartu SD. Ada keterbatasan sistem Android yang akan menyembunyikan widget aplikasi + karena hal tersebut. Satu-satunya solusi adalah memindahkannya kembali ke Penyimpanan Internal melalui pengaturan perangkat anda. + Saya ingin mendukung Anda, tetapi saya tidak bisa berdonasi. Adakah cara lain yang bisa saya lakukan? + Ya, tentu saja. Anda dapat menyebarkan berita tentang aplikasi atau memberikan umpan balik dan penilaian yang baik. Anda juga dapat membantu dengan menerjemahkan aplikasi dalam bahasa baru, atau hanya memperbarui beberapa terjemahan yang sudah ada. Panduan untuk menerjemahkan ada di <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>situs web ini</a>, atau hubungi kami di <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> jika Anda memiliki pertanyaan. + Saya tidak sengaja menghapus berkas, bagaimana saya memulihkannya? + Sayangnya, Anda tidak bisa. File dihapus secara instan setelah dialog konfirmasi, tidak ada tempat sampah yang tersedia. + Saya tidak suka warna widget, bisakah saya mengubahnya? + Ya, setelah anda menyeret widget pada layar beranda, layar konfigurasi widget akan muncul. Anda akan melihat kotak warna di pojok bawah kiri, cukup sentuh untuk memilih warna baru. Anda juga bisa menyeret penggeser untuk menyesuaikan transparansi. + Bisakah saya memulihkan berkas yang terhapus? + Jika berkas memang benar-benar terhapus, anda tidak bisa memulihkannya. Tetapi, jika Recycle Bin diaktifkan secara default, tindakan hapus hanya akan menyebabkan berkas dipindah ke Keranjang Sampah. + Ikon launcher aplikasi menghilang. Apa yang bisa saya lakukan? + Hal tersebut disebabkan oleh launcher anda yang tidak mendukung kustomisasi ikon dengan benar. Coba jalankan aplikasi melalui Google Play atau widget, jika tersedia. + Setelah dijalankan, cukup kembalikan warna ikon default oranye #F57C00. Jika masih tidak bisa, anda mungkin harus memasang ulang aplikasi. + Rekening bank saya telah berkurang, tetapi saya tidak bisa mengunduh aplikasi. Apa yang bisa saya lakukan? + Pembayaran sepenuhnya dikelola oleh Google, sistem mereka terkadang tidak bekerja sebagaimana mestinya. Cukup hapus cache apl Google Play dan mulai ulang perangkat anda, lalu ulangi mengunduh. + Mengapa saya harus meningkatkan ke versi Pro\? + Karena versi aplikasi Anda tidak lagi diperbarui, kutu yang mungkin Anda temukan tidak akan pernah diperbaiki. Tidak akan ada fungsi baru yang ditambahkan. Anda dapat membeli versi Pro di Google Play dengan sejumlah uang yang sedikit. Ini adalah pembayaran satu kali, yang berarti bahwa setelah Anda membelinya, Anda tidak perlu membayar lagi, bahkan setelah mendapatkan perangkat baru. Jika Anda tidak menyukai versi Pro, Anda dapat menghapus instalannya dalam beberapa jam dan Anda akan secara otomatis mendapatkan uang Anda kembali. Jika Anda menginginkan pengembalian dana kapan saja nanti, cukup hubungi kami di hello@simplemobiletools.com dan Anda akan mendapatkannya. + Bagaimana saya bisa memilih beberapa item sekaligus\? + Ada beberapa cara untuk melakukan itu. Cara pertama adalah memulai mode pemilihan dengan menekan lama satu item, kemudian klik pendek pada item lain untuk memilihnya. Cara kedua mirip dengan memilih item pada PC dengan mouse, cukup mulai mode pemilihan dengan menekan lama satu item, kemudian dengan jari Anda masih di bawah seret ke item lain untuk memilih. Cara ketiga untuk memilih beberapa item adalah dengan menekan lama satu item, kemudian menekan lama item lainnya dan semua yang ada di antaranya akan dipilih. Jika Anda ingin memilih semua item, cukup tekan lama satu item, kemudian klik pada penghitung item yang dipilih di sudut kiri atas. Itu akan memilih atau membatalkan pemilihan semua item. + Saya telah membeli aplikasinya, tetapi saya tidak bisa mengunduhnya di perangkat lain. + Coba bersihkan cache aplikasi Google Play Anda dan mulai ulang perangkat Anda. Ini adalah kesalahan Google Play, tidak benar-benar terkait dengan aplikasi itu sendiri. + + Kontributor + Terjemahan + Pengembangan + Other help + Daftar ini berisi semua orang yang secara nyata membantu aplikasi apa pun dalam rangkaian Simple Mobile Tools, tidak hanya yang ini. Penerjemahan ditangani oleh sukarelawan, beri tahu kami jika Anda ingin membantu juga. Panduan untuk menerjemahkan ada di <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>situs web ini</a>, atau hubungi kami di <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> jika Anda memiliki pertanyaan. Terima kasih kepada semua kontributor dan pendukung lainnya! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Dapatkan versi Pro sekarang! + Dasar + Pro + Tanpa iklan + Tanpa akses internet + Jaminan Uang Kembali 100% + Pembayaran satu kali + Desain yang ditingkatkan + + Editor foto tingkat lanjut + Penyunting foto & video tingkat lanjut + Mendukung jenis file HEIC / HEIF + Mengganti nama beberapa file tingkat lanjut + Penguncian folder individu + Mendukung pencetakan + + Dukungan zona waktu + Pengingat email dan peserta + Mengimpor acara dengan mudah + Widget baru + + Peningkatan fitur penggabungan kontak duplikat + Kustomisasi ukuran font + Berbagi kontak pribadi opsional dalam aplikasi kami + Nada dering kontak yang dapat disesuaikan + Pemfilteran kontak + Kontak yang disimpan secara pribadi + + Daftar periksa + Catatan dan warna yang berbeda setiap widget + Penguncian catatan + + Kustomisasi format tanggal dan waktu + Pintasan layar beranda + Mendukung kompresi file + Tab dengan file terbaru + + Kustomisasi warna latar belakang + Mendukung pengimporan file + Memperbesar + + Aplikasi ini menggunakan pustaka pihak ketiga berikut untuk mempermudah pekerjaan. Terima kasih. + Lisensi pihak ketiga + Kotlin (bahasa pemrograman) + Tampilan Gambar Skala Subsampling (tampilan gambar yang dapat diperbesar) + Glide (pemuatan gambar dan caching) + Picasso (pemuatan gambar dan caching) + Pemangkas Gambar Android (pangkas dan putar gambar) + RtlViewPager (geser dari kanan ke kiri) + Joda-Time (pengganti tanggal Java) + Stetho (pengawakutu basis data) + Otto (event bus) + PhotoView (GIF yang dapat diperbesar) + PatternLockView (perlindungan pola) + Reprint (perlindungan sidik jari) + Gif Drawable (memuat GIF) + AutoFitTextView (mengubah ukuran teks) + Robolectric (kerangka kerja pengujian) + Espresso (pembantu pengujian) + Gson (pengurai JSON) + Leak Canary (pendeteksi kebocoran memori) + Pemilih Angka (pemetik angka yang dapat disesuaikan) + ExoPlayer (pemutar video) + Tampilan Panorama VR (menampilkan panorama) + Apache Sanselan (membaca metadata gambar) + Filter Foto Android (filter gambar) + Tampilan Gestur (gambar yang dapat diperbesar) + Indikator Gulir Cepat (huruf pada bilah gulir) + Bus Peristiwa (komunikasi dalam aplikasi) + Tampilan Rekaman Audio (visualisasi audio) + SMS MMS (Penanganan SMS dan MMS) + APNG Android (dukungan animasi WebP) + PDFViewPager (penampil PDF) + M3U Parser (penanganan file daftar putar m3u) + AndroidLame (encoder mp3) + + Uji coba kedaluwarsa + Mulai uji coba gratis + Your trial expires soon. + Unlock the app for one final day + Selamat datang di %s! + Terima kasih telah menggunakan aplikasi kami. Anda dapat menggunakan versi yang tidak terkunci ini selama %d hari. Setelah uji coba berakhir, harap pertimbangkan untuk meningkatkan ke versi Pro. Ini memiliki sejumlah besar fitur baru, desain modern, tidak ada iklan dan banyak peningkatan lainnya. +\n +\nAnda hanya perlu membayarnya sekali seumur hidup dan jika Anda tidak puas, Anda dapat menghapus instalannya dan mendapatkan pengembalian dana. +\n +\nSemoga Anda akan menyukainya :) + Silakan tingkatkan ke versi Pro untuk menikmati aplikasi ini sepenuhnya. +\n +\nAnda hanya perlu membayarnya sekali seumur hidup dan jika Anda tidak puas, Anda dapat menghapus instalannya dan mendapatkan pengembalian dana. +\n +\nSampai jumpa di sana :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + TIDAK DIDUKUNG: Versi aplikasi ini tidak lagi dikembangkan, dapatkan versi Pro di https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Jangan lupa, jika Anda mencopot aplikasi berbayar apa pun dalam waktu 2 jam, uang Anda akan otomatis dikembalikan. Jika Anda ingin pengembalian dilakukan lain waktu, cukup hubungi hello@simplemobiletools.com dan Anda akan mendapatkannya. Itu mempermudah Anda untuk mencobanya terlebih dahulu. :) + + Sekelompok aplikasi Android sumber terbuka sederhana dengan widget yang dapat disesuaikan, tanpa iklan dan perizinan yang tidak diperlukan. +
    diff --git a/commons/src/main/res/values-it/strings.xml b/commons/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..3eccd422d --- /dev/null +++ b/commons/src/main/res/values-it/strings.xml @@ -0,0 +1,1167 @@ + + + OK + Annulla + Indietro + Niente + Dopo + Salva come + File salvato correttamente + Formato del file non valido + Errore: memoria esaurita + Si è verificato un errore: %s + Error: %s + Apri con + Modifica con + Modifica + Non è stata trovata nessuna applicazione valida + Nessun browser trovato + Nessun client e-mail trovato + Imposta come + Copia negli appunti + Copia numero negli appunti + Valore copiato negli appunti + Valore copiato negli appunti:\n%s + Componi numero + Sconosciuto + Sempre + Mai + Dettagli + Note + Eliminazione cartella \'%s\' + Nessuno + Etichetta + Trasparente + Colore trasparente + Seleziona un colore diverso + Scarica + Notifica + Notifiche + E-mail + Precedente + Riproduci / Pausa + Successiva + Numero + Nessun contatto trovato + Richiedi le autorizzazioni necessarie + L\'app non è riuscita ad accedere ai tuoi contatti + L\'app non ha il permesso di avviare chiamate telefoniche, per favore concedilo nelle impostazioni del dispositivo + Inserisci qui il testo + Chiama %s + Conferma chiamata %s + Zero + One + Due + Tre + Quattro + Cinque + Sei + Sette + Otto + Nove + Valore + Il valore non può essere vuoto + Crea un nuovo contatto + Aggiungi a un contatto esistente + App danneggiata + Dichiarazione di non responsabilità + Scatta una foto + Scegli una foto + Scegli il video + Scegli il contatto + Scegli il file + Registra audio + Registra video + Aggiornamento in corso… + Memoria del telefono + Memoria del telefono (non visibile alle altre applicazioni) + Audio + + Compleanno + Anniversario + + Casa + Lavoro + + Cellulare + Principale + Fax di lavoro + Fax di casa + Cercapersone + Non è stato trovato alcun numero di telefono + + Cambia modalità visualizzazione + Griglia + Griglia (Pro) + Griglia irregolare + Elenco + Aumenta numero colonne + Riduci numero colonne + Conteggio colonne + Conteggio delle colonne del ritratto + Conteggio delle colonne del paesaggio + Cambia immagine copertina + Seleziona foto + + %d colonna + %d colonne + %d colonne + + + Gestisci i numeri bloccati + Nessun numero bloccato. + Aggiungi un numero da bloccare + Blocca numero + Blocca numeri + Numeri bloccati + Esporta i numeri bloccati + Importa i numeri bloccati + È necessario impostare quest\'app come predefinita per utilizzare i numeri bloccati. + Imposta come predefinita + Sei sicuro/a di volere bloccare «%s»\? + Blocca le chiamate dai contatti non memorizzati + Blocca i messaggi dei contatti non memorizzati + Inserisci un numero o un modello (ad esempio *12345*, +1*8888) per bloccare tutte le chiamate e i messaggi provenienti da numeri corrispondenti al modello. + Impossibile bloccare i numeri sconosciuti senza l\'autorizzazione dell\'ID chiamante. + + Preferiti + Aggiungi preferiti + Aggiungi ai preferiti + Rimuovi dai preferiti + + Cerca + Ricerca in %s + Digita almeno 2 caratteri per iniziare la ricerca. + Cerca contatti + Cerca preferiti + Cerca applicazioni + Cerca eventi + Cerca gruppi + Cronologia di ricerca + Cerca chiamate + Cerca file + Cerca cartelle + Cerca file e cartelle + Cerca playlist + Cerca artisti + Cerca album + Cerca brani + Cerca testo + Cerca conversazioni + Cerca registrazioni + + Filtro + Filtro (Pro) + Nessun elemento trovato. + Cambia filtro + + L\'autorizzazione Archiviazione è necessaria + L\'autorizzazione Contatti è necessaria + L\'autorizzazione Fotocamera è necessaria + L\'autorizzazione Microfono è necessaria + Nessun permesso + È necessario consentire all\'app di visualizzare le notifiche, altrimenti non potrà mostrare i promemoria. + È necessario consentire all\'applicazione di visualizzare le notifiche, altrimenti non potrà mostrare la barra di avanzamento. + È necessario consentire all\'app di visualizzare le notifiche, altrimenti non potrà riprodurre i brani. + È necessario consentire all\'app di visualizzare le notifiche, altrimenti non potrà registrare l\'audio. + È necessario consentire all\'app di visualizzare le notifiche, altrimenti non potrà mostrare le chiamate in arrivo. + È necessario consentire all\'app di visualizzare le notifiche, altrimenti non potrà mostrare i messaggi in arrivo. + Concedi autorizzazione + Autorizzazione richiesta + + Rinomina file + Rinomina cartella + Impossibile rinominare il file + Impossibile rinominare la cartella + Il nome della cartella non deve essere vuoto + È già esistente una cartella con questo nome + Non è possibile rinominare la cartella principale + Cartella rinominata correttamente + Rinominazione cartella in corso + Il nome del file non deve essere vuoto + Il nome contiene caratteri non validi + Il nome del file \'%s\' contiene caratteri non validi + L\'estensione non può essere vuota + Il file di origine %s non esiste + Anteponi i nomi dei file + Aggiungi i nomi dei file + Rinominazione semplice + Modello + Stringa da aggiungere + %Y - anno\n%M - mese\n%D - giorno\n%h - ora\n%m - minuto\n%s - secondo\n%i - number increasing from 1 + Nome del file (senza .txt) + Nome del file (senza .json) + Nome del file (senza .zip) + A partire da Android 11 non è più possibile nascondere file e cartelle in questo modo + + Copia + Sposta + Copia / Sposta + Copia in + Sposta in + Origine + Destinazione + Seleziona destinazione + Premere qui per selezionare la destinazione + Impossibile scrivere nella destinazione selezionata + Selezionare una destinazione + Origine e destinazione non possono essere uguali + Impossibile copiare i file + Copia in corso… + File copiati correttamente + File copiato con successo + Si è verificato un errore + Spostamento in corso… + File spostati correttamente + File spostato con successo + Alcuni file non possono essere spostati + Alcuni file non possono essere copiati + Nessun file selezionato + Salvataggio in corso… + Impossibile creare la cartella %s + Impossibile creare il file %s + Nessun nuovo elemento trovato + La destinazione non ha abbastanza spazio disponibile.\nRichiesti %1$s, disponibili %2$s + Il servizio di sistema per la selezione di file e cartelle non è disponibile + + Crea nuovo + Cartella + File + Crea una nuova cartella + È già esistente un file o una cartella con quel nome + Il nome contiene caratteri non validi + Inserisci un nome + Si è verificato un errore sconosciuto + + Il file \"%s\" esiste già + Il file \"%s\" esiste già. Sovrascrivere? + La cartella \"%s\" esiste già + Unisci + Mantieni entrambi + Sovrascrivi + Salta + Aggiungi \'_1\' alla fine + Applica a tutti i conflitti + Il sistema non permette l\'operazione in questa cartella, sceglietene un\'altra + Il sistema non permette di copiare in questa cartella, sceglietene un\'altra + Il sistema non permette di rinominare in questa cartella + Impossibile rinominare le cartelle direttamente sulla memoria interna, solo le sottocartelle + Impossibile rinominare questa cartella + + Seleziona una cartella + Seleziona un file + Confermare l\'accesso all\'archiviazione esterna + Conferma l\'accesso alla cartella + Scegliere il percorso della scheda SD nella prossima schermata, per consentire i permessi di scrittura + Se non si ha una scheda SD, provare questo + Consenti all\'app di accedere allo storage selezionato nella schermata successiva premendo «Usa questa cartella» in basso. + Permetti l\'accesso a «<b>%s</b>» nella prossima schermata premendo «<b>Usa questa cartella</b>» in basso. + Premi «<b>Salva</b>» in fondo alla prossima schermata per creare la nuova cartella. + Conferma selezione + Caricamento… + Per favore, concedi alla nostra app l\'accesso a tutti i tuoi file, potrebbe non funzionare bene senza. + + %d elemento + %d elementi + %d elementi + + + + %d elemento + %d elementi + %d elementi + + + Eliminazione di %d elemento in corso + Eliminazione di %d elementi in corso + Eliminazione di %d elementi in corso + + + + %d contatto + %d contatti + %d contatti + + + Seleziona archiviazione + Memoria + Interna + Scheda SD + Root + È stata selezionata una cartella errata, selezionare la cartella di root della scheda SD + I percorsi della scheda SD e del dispositivo USB non possono essere uguali + Sembra che l\'app sia installata nella scheda SD, ciò impedisce l\'uso dei widget dell\'app. Non li vedrai neppure nell\'elenco dei widget disponibili. + È una limitazione di sistema, quindi se si vuole utilizzare i widget, si deve spostare l\'app nella memoria interna. + Cartella errata selezionata, selezionare il percorso «%s» + + Proprietà + Percorso + Elementi selezionati + File direttamente contenuti + Numero totale file + Risoluzione + Durata + Artista + Album + Lunghezza focale + Tempo di esposizione + Velocità ISO + Rapporto focale + Fotocamera + EXIF + Titolo canzone + Coordinate GPS + Altitudine + Rimuovi EXIF + Sei sicuro/a di voler rimuovere i valori EXIF come le coordinate GPS, il modello della fotocamera, ecc.\? + Valori EXIF rimossi con successo + + Colore di sfondo + Colore del testo + Colore primario + Colore di risalto del tema Bianco + Colore di risalto del tema Bianco e nero + Colore in primo piano + Colore dell\'icona app + Colore della barra di navigazione + Ripristina predefiniti + Usa predefinito + Predefinito + Cambia colore + Tema + Modificando un colore, il tema diventerà personalizzato + Salva + Scarta + Annulla modifiche + Sicuro di annullare le modifiche? + Questa azione non può essere annullata. + Ci sono modifiche non salvate. Salvare prima di uscire? + Applica i colori a tutte le App Semplici + ATTENZIONE: alcuni lanciatori non gestiscono correttamente le personalizzazioni delle icone delle applicazioni. Se l\'icona scompare, provare ad avviare l\'applicazione dal Google Play Store oppure dal widget, se disponibile. + Una volta avviata, impostare l\'icona predefinita col colore arancione #F57C00. Potrebbe essere necessario reinstallare l\'applicazione se proprio non funziona. + Colori aggiornati correttamente. È stato aggiunto un nuovo tema chiamato \'Condiviso\', usare questo per aggiornare tutti i colori dell\'app in futuro. + Nota che sebbene tu stia usando la versione Pro, ti serve comunque Ringraziamento Semplice per motivi tecnici. Si occupa della sincronizzazione del colore. + + Semplice Ringraziamento per sbloccare questa funzione e supportare lo sviluppo. Grazie! + ]]> + + + Chiaro + Scuro + Auto + Auto chiaro / scuro + Solarizzato + Rosso scuro + Bianco + Bianco e nero + Personalizzato + Condiviso + System default + + Novità + * solamente le modifiche più importanti vengono segnalate, spesso ci sono anche piccoli miglioramenti + + Elimina + Rimuovi + Rinomina + Condividi + Condividi via + Ridimensiona + Seleziona tutto + Seleziona testo + Nascondi + Non nascondere + Nascondi cartella + Non nascondere cartella + Mostra temporaneamente nascosti + Non mostrare i file nascosti + Non puoi condividere così tanto in una volta sola + Svuota e disattiva il cestino + Annulla + Ripeti + Stampa + Stampa (Pro) + Scorciatoia + Crea scorciatoia + Crea scorciatoia (Pro) + Aggiungi numero al contatto + Vedi dettagli del contatto + Chiama dalla SIM 1 + Chiama dalla SIM 2 + Visibilità nome del file + Sposta in cima + Sposta in fondo + Appunta l\'elemento + Rimuovi l\'elemento + Invia un SMS + Invia un\'e-mail + Chiama + Contact details + Add contact + Sfondi + + Ordina per + Nome + Dimensione + Ultima modifica + Data di creazione + Data acquisizione + Titolo + Nome file + Estensione + Casuale + Ordina in modo casuale + Ascendente + Discendente + Usa solo per questa cartella + Ordina le parti numeriche per valore + Nome + Secondo nome + Cognome + Nome completo + Usa ordinamento personalizzato + Cambia ordine + + Procedere davvero con l\'eliminazione? + Eliminare davvero %s? + Delete %s? + + Spostare davvero nel cestino %s? + + Eliminare davvero questo elemento? + Spostare davvero questo elemento nel cestino? + Non chiedere nuovamente in questa sessione + Non mostrare più + + No + Forse + + ATTENZIONE: si sta per eliminare %d cartella + ATTENZIONE: si stanno per eliminare %d cartelle + ATTENZIONE: si stanno per eliminare %d cartelle + + + PIN + Inserisci un PIN + Per favore inserisci un PIN + PIN errato + Ripeti il PIN + Sequenza + Inserisci una sequenza + Sequenza errata + Ripeti la sequenza + Biometria + Impronta + Aggiungi un\'impronta + Appoggia il dito sul sensore di impronte digitali + Apri la finestra di dialogo della verifica biometrica dell\'ID + Autentica + Autenticazione fallita + Autenticazione bloccata, riprovare fra qualche momento + Non ci sono impronte registrate, aggiungerne alcune nelle impostazioni del tuo dispositivo + Vai alle impostazioni + Password impostata correttamente. Reinstallare l\'app in caso di dimenticanza. + Protezione impostata correttamente. Reinstallare l\'app in caso di problemi nel ripristinarla. + Blocca cartella + Blocca cartella (Pro) + Sblocca cartella + Questa protezione funziona solo nell\'app, non è pensata per sostituire una vera cifratura delle cartelle a livello di sistema. + + Ieri + Oggi + Domani + Ogni giorno + Nascondi anno + secondi + minuti + ore + giorni + s + m + o + wk. + + %d secondo + %d secondi + %d secondi + + + %d minuto + %d minuti + %d minuti + + + %d ora + %d ore + %d ore + + + %d giorno + %d giorni + %d giorni + + + %d settimana + %d settimane + %d settimane + + + %d mese + %d mesi + %d mesi + + + %d anno + %d anni + %d anni + + + + %d secondo + %d secondi + %d secondi + + + %d minuto + %d minuti + %d minuti + + + %d ora + %d ore + %d ore + + + %d giorno + %d giorni + %d giorni + + + %d settimana + %d settimane + %d settimane + + + %d mese + %d mesi + %d mesi + + + %d anno + %d anni + %d anni + + + + %d secondo prima + %d secondi prima + %d secondi prima + + + %d minuto prima + %d minuti prima + %d minuti prima + + + %d ora prima + %d ore prima + %d ore prima + + + %d giorno prima + %d giorni prima + %d giorni prima + + + %d settimana prima + %d settimane prima + %d settimane prima + + + %d mese prima + %d mesi prima + %d mesi prima + + + %d anno prima + %d anni prima + %d anni prima + + + + %d secondo + %d secondi + %d secondi + + + %d minuto + %d minuti + %d minuti + + + %d ora + %d ore + %d ore + + + %d giorno + %d giorni + %d giorni + + + %d settimana + %d settimane + %d settimane + + + %d mese + %d mesi + %d mesi + + + %d anno + %d anni + %d anni + + + Tempo rimanente prima che suoni la sveglia:\n%s + Tempo rimanente prima della notifica promemoria:\n%s + Tempo rimanente: +\n%s + Assicurarsi che la sveglia funzioni correttamente prima di fare affidamento su di essa. Potrebbe comportarsi in modo anomalo a causa di restrizioni di sistema relative al risparmio della batteria. + Assicurarsi che i promemoria funzionino correttamente prima di fare affidamento su di essi. Potrebbero comportarsi in modo anomalo a causa di restrizioni di sistema relative al risparmio della batteria. + Le notifiche di questa applicazione sono disattivate. Andare nelle impostazioni del dispositivo per attivarle. + + Sveglia + Posponi + Ignora + Nessun promemoria + All\'inizio + Suoni di sistema + I propri suoni + Aggiungi un nuovo suono + Nessun suono + Durante il giorno alle oo:mm + Durante il giorno alle %02d:%02d + + Impostazioni + Acquista Semplice Ringraziamento + Generale + Personalizzazione del colore + Miglioramento della personalizzazione dei colori + Personalizza i colori + Personalizza i colori (Locked) + Bloccato + Personalizza i colori del widget + Personalizza le notifiche + Notification sound + Usa la lingua inglese + Lingua + Mostra gli elementi nascosti + Dimensione carattere + Piccolo + Medio + Grande + Molto grande + Proteggi con password gli elementi nascosti + Proteggi con password tutta l\'applicazione + Proteggi con password l\'eliminazione e lo spostamento dei file + Mantieni il vecchio valore di Ultima-modifica nelle operazioni sui file + Mostra un fumetto informativo durante il trascinamento della barra di scorrimento + Impedisci allo schermo di spegnersi mentre l\'app è in primo piano + Non chiedere mai la conferma di eliminazione + Attiva l\'aggiornamento dall\'alto + Usa il formato 24 ore + Cambia la data e il formato dell\'ora + Inizio settimana di domenica + Widget + Usa sempre lo stesso tempo di ripetizione + Tempo di ripetizione + Vibra alla pressione dei tasti + Sposta gli elementi nel cestino invece di eliminarli + Intervallo svuotamento cestino + Svuota il cestino + Forza la modalità ritratto + Esporta impostazioni + Importa impostazioni + Impostazioni esportate correttamente + Impostazioni importate correttamente + Prima il cognome poi il nome + Svuota la cache + Mostra un messaggio di conferma prima di iniziare una chiamata + + Visibilità + Sicurezza + Scorrimento + Operazioni sui file + Cestino + Salvataggio + Avvio + Testo + Migrazione + Qualità + Schermo principale + Miniature + Vista a elenco + + Escludi + Escludi cartella + Cartelle escluse + (esclusa) + Gestisci le cartelle escluse + Rimuovi tutte + Rimuovere tutte le cartelle dalla lista delle esclusioni\? Ciò non eliminerà le cartelle. + Mostra temporaneamente esclusi + Smetti di mostrare esclusi + + Gestisci le schede mostrate + Scheda da aprire all\'avvio dell\'app + Contatti + Preferiti + Cronologia chiamate + Gruppi + L\'ultima usata + File + File recenti + + Ripristina questo file + Ripristina file selezionati + Ripristina tutti i file + Il cestino è stato svuotato correttamente + I file sono stati ripristinati correttamente + Svuotare davvero il cestino? I file verranno persi definitivamente. + Il cestino è vuoto + Lo spostamento degli elementi dal cestino è disabilitato, utilizzare "Ripristina" + Mostra il cestino + Nascondi il cestino + Apri il cestino + Ignora il Cestino, elimina direttamente i file + + Spostamento di %d elemento nel cestino + Spostamento di %d elementi nel cestino + Spostamento di %d elementi nel cestino + + + Importazione… + Esportazione… + Importazione riuscita + Esportazione riuscita + Importazione fallita + Esportazione fallita + Importazione di alcuni elementi fallita + Esportazione di alcuni elementi fallita + Nessun elemento trovato da importare + Non sono state trovate nuove voci per l\'importazione + Nessun elemento trovato da esportare + Backup + Abilita i backup automatici + Gestisci i backup automatici + È possibile utilizzare i seguenti schemi per assegnare automaticamente un nome al file: +\n +\n%Y - anno +\n%M - mese +\n%D - giorno +\n%h - ora +\n%m - minuto +\n%s - secondo + + USB + È collegato un dispositivo USB al dispositivo. Per assicurarsi che i file appaiano correttamente, è necessario accettare permessi aggiuntivi. + Scegliere la cartella di root del dispositivo USB nella prossima schermata per consentire l\'accesso + Cartella selezionata errata, selezionare la cartella di root del dispositivo USB + + Gennaio + Febbraio + Marzo + Aprile + Maggio + Giugno + Luglio + Agosto + Settembre + Ottobre + Novembre + Dicembre + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + a gennaio + a febbraio + a marzo + ad aprile + a maggio + a giugno + a luglio + ad agosto + a settembre + a ottobre + a novembre + a dicembre + Lunedì + Martedì + Mercoledì + Giovedì + Venerdì + Sabato + Domenica + L + M + M + G + V + S + D + Lun + Mar + Mer + Gio + Ven + Sab + Dom + + La versione della tua app non verrà più aggiornata. Aggiorna alla versione Pro per ricevere nuove correzioni ed altri miglioramenti. + La versione della tua app non verrà più aggiornata. Aggiorna alla versione Pro per ricevere nuove correzioni ed altri miglioramenti cliccando qui. + È gratuita fino a: %s. Se la si scarica entro quella data, essa sarà gratuita per sempre. + Maggiori informazioni + Aggiorna + Devi migrare a mano gli eventi salvati localmente esportandoli in un file .ics, poi importandoli. Si possono trovare i pulsanti esporta/importa nel menu della schermata principale. + Ciao, +\n +\nsembra che tu abbia appena effettuato l\'aggiornamento dalla versione gratuita. Una volta che sei soddisfatto di questa versione e magari hai migrato le tue impostazioni e i tuoi preferiti, puoi disinstallare la vecchia versione gratuita per evitare di avviarla accidentalmente, dato che non ti servirà più. +\n +\nGrazie! + Ciao, +\n +\nsembra che tu abbia già la versione Pro dell\'app. Una volta che sarai soddisfatto e magari avrai migrato le tue impostazioni e i tuoi preferiti, potrai disinstallare questa versione per evitare di avviarla accidentalmente, dato che non ti servirà più. +\n +\nGrazie! + Ciao, +\n +\nsembra che tu abbia appena effettuato l\'aggiornamento dalla versione gratuita. Una volta che sei soddisfatto di questa e magari hai migrato i tuoi dati, puoi disinstallare la vecchia versione gratuita per evitare di avviarla accidentalmente, dato che non ti servirà più. +\n +\nGrazie! + Salve, +\n +\nsembra che tu abbia già anche la versione Pro dell\'app. Una volta che sarai soddisfatto e avrai migrato i tuoi dati, potrai disinstallare questa versione per evitare di lanciarla accidentalmente, dato che non ti servirà più. +\n +\nGrazie! + Salve, +\n +\nsembra che tu abbia appena effettuato l\'aggiornamento dalla versione gratuita. Se vuoi migrare gli eventi memorizzati localmente, devi farlo manualmente esportandoli in un file .ics nella versione gratuita dell\'app e importandoli qui attraverso il menu superiore. +\n +\nUna volta soddisfatti della propria configurazione nella versione Pro, è possibile disinstallare la vecchia versione gratuita, poiché non è più necessaria. +\n +\nGrazie! + Salve, +\n +\nsembra che lei abbia appena effettuato l\'aggiornamento dalla versione gratuita. Se aveva dei contatti memorizzati sotto «%s», deve migrarli manualmente esportandoli in un file .vcf dalla versione gratuita dell\'app e importandoli qui attraverso il menu superiore. +\n +\nUna volta soddisfatti della configurazione della versione Pro, è possibile disinstallare la vecchia versione gratuita, poiché non è più necessaria. +\n +\nGrazie! + Salve, +\n +\nsembra che tu abbia appena effettuato l\'aggiornamento dalla versione gratuita. Se vuoi migrare le tue note, devi farlo manualmente esportandole in un file nella versione gratuita dell\'app e importandole qui attraverso il menu in alto. +\n +\nUna volta soddisfatta della sua configurazione nella versione Pro, può disinstallare la vecchia versione gratuita perché non ne avrà più bisogno. +\n +\nGrazie! + + Informazioni + Sito web + Per i codici sorgenti visitare + Invia opinioni e suggerimenti a + Aggiorna alla versione Pro + Altre app + Altre nostre app + Invita un amico + Ciao, controlla %1$s su %2$s + Invita con + Dacci un voto sul Play Store + Valuta + Dona + Seguici + v %1$s\nCopyright © Simple Mobile Tools %2$d + Supporto + Aiutaci + Media sociali + Altro + Informativa sulla riservatezza + Versione %s + Ciao :) + Fatto con ❤️ in Slovacchia + Informazioni aggiuntive + Versione app: %s + SO dispositivo: %s + +
    + spero che tu sia contento dell\'app. Non contiene pubblicità, supporta lo sviluppo acquistando l\'app Semplice Ringraziamento. Inoltre questa finestra non verrà più mostrata.

    + Grazie! + ]]> +
    + Ciao,<br><br>spero che l\'app ti piaccia. Non contiene pubblicità e non stiamo raccogliendo i tuoi dati, per favore sostieni il suo sviluppo acquistando <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Ringraziamento Semplice </a>. Avrai anche tutte le funzioni dell\'app, compresa la personalizzazione dei colori, sbloccate.<br><br>Grazie! + Per favore sostienici acquistando <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Ringraziamento Semplice </a>, che sbloccherà anche tutte le funzioni dell\'app, compresa la personalizzazione dei colori. + Acquista + Scarica Telefono Semplice + Aggiorna Semplice Ringraziamento all\'ultima versione + Prima di fare una domanda, controlla le impostazioni dell\'app e le domande frequenti. Magari si trova la soluzione. + Prima di valutarci, controlla le impostazioni dell\'app e leggi le domande frequenti. Se riscontri problemi, la soluzione potrebbe trovarsi là. + Assicurati anche che tu stia usando la versione più recente dell\'app. + Si noti inoltre che questa versione dell\'app non è più in fase di sviluppo; acquistate quella Pro per ottenere molti miglioramenti. + Leggi + Domande frequenti + Ciao,\n\nstai utilizzando questa app da un po\' di tempo e ne siamo veramente grati..\n\nValutaci su Google Play se vuoi farci un favore, ci aiuterà tantissimo.\n\nNon è importante cosa sceglierai, non vedrai più questo messaggio una volta ancora.\n\nGrazie! + Valuta la nostra app per favore :) + Grazie + Il widget è bloccato. +\nSi prega di aggiornare alla versione Pro per sbloccarlo. + Questa funzionalità è bloccata, si prega di comprare <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Semplice Ringraziamento</a> per sbloccare l\'app completa.<br><br>È solo un pagamento una tantum e se non sarai soddisfatto, possiamo rimborsarti. + + +
    + è uscita una nuova app di recente:

    + %2$s

    + %4$s

    + %6$s

    + Puoi scaricarla toccando il titolo. + Grazie + ]]> +
    + Launcher di Applicazioni Semplice + Calcolatrice Semplice + Calendario Semplice + Fotocamera Semplice + Orologio Semplice + Contatti Semplice + Telefono Semplice + Semplice Disegnare + Gestore di File Semplice + Torcia Semplice + Galleria Semplice + Tastiera Semplice + Launcher Semplice + Lettore Musicale Semplice + Note Semplici + Messaggi SMS Semplici + Ringraziamento Semplice + Registratore Vocale Semplice + Lanciatore di app + Calcolatrice + Calendario + Fotocamera + Orologio + Contatti + Telefono + Disegna + Gestore dei file + Torcia + Galleria + Tastiera + Launcher + Riproduttore musicale + Note + Messaggi SMS + Ringraziamento + Registratore vocale + + qui. + ]]> + + + Domande frequenti + Prima di porre una domanda, per favore leggi le + Come mai non vedo il widget di questa app nell\'elenco dei widget? + Probabilmente perchè si ha spostato l\'app nella scheda SD. C\'è una limitazione di sistema di Android che nasconde i widget in questione. + L\'unica soluzione è spostare l\'app nell\'archiviazione interna usando le impostazioni di sistema. + Vorrei darti supporto, ma non posso donare del denaro. Posso fare dell\'altro? + Sì, certo. Puoi spargere la voce sulle applicazioni o dare un buon commento e valutazioni. Puoi anche aiutare traducendo le app in una nuova lingua, o semplicemente aggiornare alcune traduzioni esistenti. La guida alle traduzioni è su <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>questo sito web</a>, o semplicemente contattaci su <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se hai qualche domanda. + Ho eliminato dei file per errore, come posso recuperarli? + Purtroppo non si può. I file vengono eliminati subito dopo la richiesta di conferma, non c\'è nessun cestino disponibile. + Non mi piacciono i colori del widget, posso cambiarli? + Sì, quando si trascina un widget nella schermata appare una finestra di configurazione. Si vedranno dei quadrati colorati nell\'angolo in basso a sinistra, toccandoli si sceglierà un colore. Si può muovere l\'indicatore per regolare la trasparenza. + Posso recuperare in qualche modo i file eliminati? + Se sono stati veramente eliminati, non puoi. Tuttavia, c\'è un cestino attivato in modo predefinito, farà sì che i file vengano spostati nel cestino invece di eliminarli. + L\'icona dell\'app è scomparsa nel lanciatore. Cosa posso fare? + Il lanciatore attualmente in uso non gestisce correttamente le personalizzazioni delle icone delle applicazioni. Provare ad avviare l\'applicazione dal Google Play Store oppure dal widget, se disponibile. + Una volta avviata, impostare l\'icona predefinita col colore arancione #F57C00. Potrebbe essere necessario reinstallare l\'applicazione se proprio non funziona. + I soldi sono stati detratti dal mio conto corrente, ma non posso scaricare l\'app. Cosa posso fare? + I pagamenti sono gestiti totalmente da Google, il loro sistema si guasta di tanto in tanto. Svuota la cache dell\'app Google Play e riavvia il tuo dispositivo, poi riprova a scaricare. + Perchè dovrei aggiornare alla versione Pro? + Dato che la tua versione non verrà più aggiornata, gli errori che potresti trovare non verranno mai corretti. Non ci saranno inoltre nuove funzioni aggiuntive. Puoi acquistare la versione Pro su Google Play per una piccola cifra. + Si paga una sola volta, ciò significa che quando la acquisti non dovrai mai più pagare. Neanche quando userai un nuovo dispositivo. Se non ti piacerà la versione Pro, ti basta disinstallarla entro alcune ore e otterrai automaticamente un rimborso. + Se vuoi chiedere un rimborso in un momento successivo, contattaci su hello@simplemobiletools.com e lo otterrai. + Come posso selezionare più elementi alla volta? + Ci sono diversi modi per farlo. Il primo è aprire la modalità di selezione premendo a lungo un elemento, poi toccare gli altri elementi da selezionare. Il secondo è simile alla selezione di elementi sul PC con il mouse, + apri la modalità di selezione premendo a lungo un elemento, poi con il dito ancora premuto trascinalo sugli altri elementi da selezionare. Il terzo modo di selezionare più elementi è premendone a lungo uno, poi premere a lungo un altro e tutti quelli in mezzo vegono selezionati. Se + vuoi selezionare tutti gli elementi, premine uno a lungo, poi tocca il contatore di elementi selezionati nell\'angolo in alto a sinistra. Ciò selezionerà o deselezionerà tutto in un colpo solo. + Ho acquistato l\'app, ma non posso scaricarla su un altro dispositivo. + Prova a svuotare la cache dell\'app Google Play e a riavviare il dispositivo. È un errore di Google Play, non correlato all\'app in questione. + + Contributori + Traduzione + Sviluppo + Other help + Questa lista contiene tutti coloro che hanno aiutato in modo significativo qualsiasi app della suite Simple Mobile Tools, non solo questa. Le traduzioni sono gestite da volontari, fateci sapere se volete aiutare anche voi. La guida alle traduzioni è su <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>questo sito web</a>, o semplicemente contattaci su <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se hai qualche domanda. Grazie a tutti i collaboratori e agli altri sostenitori! + arabo + azerbaigiano + bengalese + bretone + Bulgarian + catalano + ceco + gallese + danese + English + tedesco + greco + spagnolo + basco + persiano + finlandese + francese + galiziano + hindi + croato + ungherese + indonesiano + italiano + ebraico + giapponese + coreano + lituano + nepalese + norvegese + olandese + polacco + portoghese + rumeno + russo + slovacco + sloveno + serbo + svedese + tamil + turco + ucraino + vietnamita + cinese (Hong Kong) + cinese (semplificato) + cinese (tradizionale) + + Ottieni subito la versione Pro! + Base + Pro + No pubblicità + No accesso a Internet + 100% garantito soddisfatti o rimborsati + Pagamento unico + Design migliorato + + Editor fotografico avanzato + Editor avanzato di foto e video + Supporto file HEIC/HEIF + Ridenominazione avanzata di file multipli + Bloccaggio individuale delle cartelle + Supporto per la stampa + + Supporto per il fuso orario + Partecipanti e promemoria via email + Facile importazione di eventi + Nuovi widget + + Fusione di contatti duplicati migliorata + Personalizzazione della dimensione dei caratteri + Condivisione opzionale dei contatti privati tra le nostre applicazioni + Suonerie personalizzate per contatto + Filtro contatti + Contatti memorizzati privatamente + + Liste di controllo + Note e colori diversi per ogni widget + Bloccaggio di note + + Personalizzazione del formato di data e ora + Scorciatoie della schermata iniziale + Supporto per la compressione dei file + Scheda con file recenti + + Personalizzazione del colore di sfondo + Supporto per l`importazione di file + Zoom + + Questa app usa le seguenti librerie di terze parti per semplificarmi la vita. Vi ringrazio. + Licenze di terze parti + Kotlin (linguaggio di programmazione) + PhotoView (immagini ingrandibili) + Glide (caricamento e caching immagini) + Picasso (caricamento e caching immagini) + Android Image Cropper (ritaglio e rotazione immagini) + RtlViewPager (swipe da destra a sinistra) + Joda-Time (sostituto di \"Java date\") + Stetho (debug database) + Otto (bus eventi) + PhotoView (GIF ingrandibili) + PatternLockView (sequenza di protezione) + Reprint (protezione impronta) + Gif Drawable (caricamento GIF) + AutoFitTextView (ridimensionamento testo) + Robolectric (ambiente di test) + Espresso (aiutante nei test) + Gson (analizzatore JSON) + Leak Canary (rileva i buchi di memoria) + Number Picker (selettore di numeri personalizzabile) + ExoPlayer (lettore video) + VR Panorama View (visualizzazione panorami) + Apache Sanselan (lettura metadati immagini) + Android Photo Filters (filtri immagine) + Gesture Views (immagini ingrandibili) + Indicator Fast Scroll (lettere su barre di scorrimento) + Event Bus (comunicazione all\'interno dell\'app) + Audio Record View (visualizzazione audio) + SMS MMS (gestione SMS e MMS) + APNG Android (supporto WebP animati) + PDFViewPager (visualizzatore di PDF) + Parser M3U (gestione dei file playlist m3u) + AndroidLame (codificatore mp3) + + Prova scaduta + Inizia la prova gratuita + Il periodo di prova sta per scadere. + Sbloccare l\'app per un ultimo giorno + Benvenuti su %s! + Grazie per aver utilizzato la nostra applicazione. È possibile utilizzare questa versione sbloccata per %d giorni. Una volta terminata la prova, vi invitiamo a considerare l\'aggiornamento alla versione Pro. Questa versione offre un\'enorme quantità di nuove funzioni, un design moderno, l\'assenza di pubblicità e molti altri miglioramenti. +\n +\nDovrete pagare solo una volta nella vita e se non sarete soddisfatti, potrete disinstallarla e ottenere un rimborso. +\n +\nSpero che ti piaccia :) + Si prega di aggiornare alla versione Pro per godere appieno dell\'applicazione. +\n +\nDevi pagare solo una volta nella vita e se non sarai soddisfatto, potrai disinstallarla e ottenere un rimborso. +\n +\nCi vediamo :) + + La prova scade tra %d giorno. + La prova scade tra %d giorno. + La prova scade tra %d giorni. + + + DEPRECATA: Questa versione dell\'app non è più supportata, ottieni la versione Pro a https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Non dimenticarti che se disinstalli qualsiasi app a pagamento entro le due ore dall\'acquisto, verrai automaticamente rimborsato. Se vuoi essere rimborsato quando vuoi dopo le due ore, puoi contattarci a hello@simplemobiletools.com. In questo modo puoi facilmente provare l\'app :) + + Un gruppo di app Android semplici, open source, con widget personalizzabili, senza pubblicità ed autorizzazioni inutili. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-iw/strings.xml b/commons/src/main/res/values-iw/strings.xml new file mode 100644 index 000000000..d1298bcff --- /dev/null +++ b/commons/src/main/res/values-iw/strings.xml @@ -0,0 +1,1092 @@ + + + אישור + ביטול + Back + שום דבר + מאוחר + שמירה בשם + קובץ נשמר + פורמט קובץ שגוי + שגיאת זיכרון + שגיאה: %s + Error: %s + פתיחה באמצעות + עריכה באמצעות + לערוך + לא נמצאה אפליקציה מתאימה + No browser found + No email client found + קבע כ + העתקה לקליפבורד + העתק את המספר ללוח + הועתק לקליפבורד + הועתק לקליפבורד:\n%s + חייג מספר + לא ידוע + תמיד + לעולם לא + פרטים + הערות + מוחק תיקייה \'%s\' + None + תווית + Transparent + Transparent color + Select a different color + הורדה + Notification + Notifications + אימייל + הקודם + הפעל / הפסק + הבא + מספר + לא נמצאו אנשי קשר + נדרשים הרשאות + לא ניתן לגשת לאנשי הקשר + App does not have the permission to initiate phone calls, please grant it in the device settings + הוספת טקסט + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + צור איש קשר חדש + הוסף לאיש קשר קיים + App Corrupt + Disclaimer + לצלם + בחר תמונה + Choose video + Choose contact + Choose file + Record audio + Record video + מעדכן… + אחסון טלפון + אחסון טלפון (לא נראה באפליקציות אחרות) + Audio + + יום הולדת + יום השנה + + Home + Work + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + ניהול מספרים חסומים + אין חסימות + הוספת מספר חסום + חסום מספר + חסום מספרים + מספרים חסומים + Export blocked numbers + Import blocked numbers + נדרש לבחור את האפליקצייה כברירת מחדל בכדי לחסום מספרים. + קבע כברירת מחדל + האם לחסום את \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + מועדפים + הוספה למועדפים + הוסף למועדפים + הסרה ממועדפים + + חיפוש + Search in %s + הקלד/י לפחות 2 תווים כדי להתחיל חיפוש + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + סינון + סינון (Pro) + לא נמצאו פריטים. + שינוי סינון + + נדרשים הרשאות אחסון + נדרשים הרשאות אנשי קשר + נדרשים הרשאות מצלמה + נדרשים הרשאות אודיו + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + שנה שם קובץ + שנה שם תיקייה + לא ניתן לשנות את שם הקובץ + לא ניתן לשנות את שם התיקייה + שם התיקייה לא יכול להיות ריק + קיימת תיקייה עם שם זה + לא ניתן לשנות את תיקיית האב של האחסון + שם תיקייה עודכן + מעדכן שם תיקייה + שם קובץ לא יכול להיות ריק + שם קובץ כולל תווים לא חוקיים + שם קובץ \'%s\' מכיל תווים לא חוקיים + תוסף לא יכול להיות ריק + קובץ מקור %s לא קיים + Prepend filenames + Append filenames + Simple renaming + דפוס + מחרוזת להוספה + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + העתק + העבר + העתק / העבר + העתק אל + העבר אל + מקור + יעד + בחירת יעד + לחץ לבחירת יעד + לא ניתן לכתוב אל היעד הנבחר + נא לבחור יעד + מקור ויעד לא יכולים להיות זהים + לא ניתן להעתיק את הקבצים + מעתיק... + קבצים הועתקו בהצלחה + File copied successfully + אירעה שגיאה + מעביר... + קובץ הועבר בהצלחה + File moved successfully + חלק מהקבצים לא הועברו + חלק מהקבצים לא הועתקו + לא נבחרו קבצים + שומר... + לא ניתן ליצור תיקייה %s + לא ניתן ליצור קובת %s + לא נמצאו פריטים חדשים + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + צור חדש + תיקיה + קובץ + יצירת תיקייה חדשה + קובץ או תיקייה עם שם זהה כבר קיימים + השם מכיל תווים לא חוקיים + נא להכניס שם + שגיאה לא ידועה אירעה + + הקובץ \"%s\" כבר קיים + הקובץ \"%s\" כבר קיים. לדרוס? + התיקייה \"%s\" כבר קיימת + מזג + שמור את שניהם + דרוס + דלג + Append with \'_1\' + החל על הכל + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + בחר/י תיקייה + בחר/י קובץ + אישור גישה לאחסון חיצוני + Confirm folder access + נא לבחור את תיקיית האב של כרטיס ה SD במסך הבא, כדי להעניק הרשאות גישה + אם לא מופיע כרטיס ה SD, ניתן לנסות + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + אישור בחירה + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d item + %d items + + + + %d item + %d items + + + Deleting %d item + Deleting %d items + + + + %d contact + %d contacts + + + בחירת אחסון + Storage + פנימי + כרטיס SD + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + מאפיינים + נתיב + פריטים נבחרים + Direct children count + Total files count + רזולוצייה + Duration + אומן + אלבום + Focal length + Exposure time + ISO speed + F-number + מצלמה + EXIF + כותר שיר + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Background color + צבע טקסט + צבע עיקרי + Accent color of white theme + Accent color of Black & White theme + צבע חזית + צבע אייקון תוכנה + צבע סרגל ניווט + שיחזור ברירת מחדל + שימוש בברירת מחדל + ברירת מחדל + שנה צבע + ערכת נושא + שינוי צבע יגרום לשימוש בערכת נושא מותאמת + שמור + השלך + בטל שינויים + האם לבטל שינויים? + This action cannot be undone. + ישנם שינויים לא שומרים. לשמור לפני יציאה? + קבע צבעים עבור על אפליקציות Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + בהיר + כהה + Auto + Auto light / dark + Solarized + אדום כהה + White + שחור ולבן + מותאם אישית + משותף + System default + + מה חדש + * only the bigger updates are listed here, there are always some smaller improvements too + + מחק + הסר + שנה שם + שתף + שתף דרך + שנה גודל + בחר הכל + Select text + הסתר + בטל הסתרה + הסתר תיקייה + בטל הסתרת תיקייה + הצג הכל באופן זמני + הספק הצגה של מדיה + לא ניתן לשתף כמות זו בבת אחת + רוקן והשבת את סל המחזור + שחזר + בצע מחדש + הדפס + הדפס (Pro) + Shortcut + צור קיצור דרך + צור קיצור דרך (Pro) + הוסף מספר לאנשי קשר + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + מיין לפי + שם + גודל + עודן לאחרונה + Date created + Date taken + כותרת + שם קובץ + תוסף + אקראי + מיין בצורה אקראית + Ascending + Descending + השתמש בתיקייה זו בלבד + Sort numeric parts by actual value + שם + שם אמצעי + שם משפחה + שם מלא + Use custom sorting + Change order + + להמשיך במחיקה? + האם למחוק את %s? + Delete %s? + + האם להעביר את %s לסל המחזור? + + האם למחוק פריט זה? + האם להעביר פריט זה לסל המחזור? + Do not ask again in this session + Do not show again + כן + לא + אולי + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + PIN + הכנס PIN + נא להכניס PIN + שגיאה ב PIN + חזור על PIN + דפוס + הכנס דפוס + דפוס שגוי + חזור על דפוס + Biometrics + טביעת אצבע + הוספת טביעת אצבע + נא להניח את טביעת האצבע על החיישן + Open biometric ID verification dialog + Authenticate + זיהוי נכשל + זיהוי חסוי. נא לנסות שוב מאוחר יותר + אין טביעות אצבע רשומות. נא להוסיף בהגדרות המכשיר + עבור להגדרות + סיסמה הוגדרה בהצלחה. נא להתקין שוב את האפליקציה במיקרה של איבוד הסיסמה. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + נעל תיקייה + נעל תיקייה (Pro) + בטל נעילת תיקייה + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + אתמול + היום + אתמול + Every day + הסתר שנה + שניות + דקות + שעות + ימים + s + m + h + wk. + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + Alarm + Snooze + Dismiss + No reminder + בהתחלה + צלילי מערכת + הצלילים שלך + הוספת צליל + No sound + During the day at hh:mm + During the day at %02d:%02d + + הגדרות + Purchase Simple Thank You + General + Color customization + Improved color customization + התאם צבעים + התאם צבעים (Locked) + Locked + התאם צבעי יישומון + Customize notifications + Notification sound + השתמש בשפה האנגלית + Language + הצג פריטים מוסתרים + גודל פונט + קטן + בינוני + גדול + ענק + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + תמיד לדלג על אישור מחיקה + הפעל סנכרון על ידי משיכה מלמעלה + השתמש בפורמט של 24 שעות + שנה פורמט תאריך ושעה + יום ראשון בשבוע + יישומונים + Always use same snooze time + Snooze time + רטט בעת לחיצה + העבר לסל המחזור במקום מחיקה + זמן ריקון של סל המחזור + רוקן את סל המחזור + אלץ מצב אנכי + ייצא הגדרות + יבא הגדרות + הגדרות הוצאו בהצלחה + הגדרות יובאו בהצלחה + התחל שם בשם משפחה + Clear cache + Show a call confirmation dialog before initiating a call + + נראות + אבטחה + גלילה + פעולות קובץ + סל מחזור + שומר + Startup + טקסט + Migrating + Quality + Main screen + תמונות ממוזערות + List view + + אל תכלול + Exclude folder + תיקיות שלא נכללו + (לא נכלל) + נהל תיקיות שלא נכללו + להסיר הכל + להסיר את כל התיקיות מרשימת החרגות\? פעולה זו לא תמחק את התיקיות. + הצג לא נכלל באופן זמני + הפסק את הצגת החרגות + + Manage shown tabs + טאב בפתיחת האפליקצייה + אנשי קשר + מועדפים + היסטוריית שיחות + קבוצות + בשימוש לאחרונה + Files + Recent files + + שחזר קובץ זה + שחזר קבצים נבחרים + שחזר את כל הקבצים + סל המחזור רוקן בהצלחה + קבצים שוחזרו בהצלחה + האם לרוקן את סל המחזור? הקבצים יימחקו לצמיתות. + סל המחזור ריק + העברה של פריטי סל המחזור מבוטלת. נא להשתמש בשחזור + הצג את סל המחזור + הסתר את סל המחזור + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + מייבא... + מייצא... + ייבוא הצליח + ייצוא הצליח + ייבוא נכשל + ייצוא נכשל + ייבוא חלק מהרשומות נכשל + ייצוא חלק מהרשומות נכשל + לא נמצאו רשומות לייבוא + No new entries for importing have been found + לא נמצאו רשומות לייצוא + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + ינואר + פברואר + מרץ + אפריל + מאי + יוני + יולי + אוגוסט + ספטמבר + אוקטובר + נובמבר + דצמבר + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + בינואר + בפברואר + במרץ + באפריל + במאי + ביוני + ביולי + באוגוסט + בספטמבר + באוקטובר + בנובמבר + בדצמבר + שני + שלישי + רביעי + חמישי + שישי + שבת + ראשון + ב\' + ג\' + ד\' + ה\' + ו\' + ש\' + א\' + ב\' + ג\' + ד\' + ה\' + ו\' + ז\' + א\' + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + מידע נוסף + עדכון + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + אודות + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + Rate us + דרג + תרום + Follow us + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + מידע נוסף + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + מחשבון + יומן + מצלמה + שעון + אנשי קשר + חייגן + צייר + סייר קבצים + פנס + גלריה + Keyboard + Launcher + נגן מוזיקה + פתקים + הודעות SMS + Thank You + רשמקול + + here. + ]]> + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-ja/strings.xml b/commons/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..c2ae22314 --- /dev/null +++ b/commons/src/main/res/values-ja/strings.xml @@ -0,0 +1,1067 @@ + + + OK + キャンセル + 戻る + なし + 後で + 名前を付けて保存 + ファイルを正常に保存しました + 使用できないファイル形式 + メモリー不足エラー + エラーが発生しました: %s + エラー: %s + 別のアプリで開く + 他のアプリで編集 + 編集 + 有効なアプリが見つかりません + ブラウザアプリが見つかりません + メールアプリが見つかりません + 他で使う + クリップボードにコピーする + 数字をクリップボードにコピーする + 値をクリップボードにコピーしました + 値をクリップボードにコピーしました:\n%s + 電話番号 + 不明 + 常に + 何もしない + 詳細 + メモ + フォルダ \'%s\' を削除しています + なし + ラベル + 透過 + 透過色 + 別の色を選択する + ダウンロード + 通知 + 通知 + メールアドレス + 前へ + 再生 / 一時停止 + 次へ + 番号 + 連絡先が見つかりません + 要求された許可をリクエスト + 連絡先情報にアクセスすることが出来ませんでした + アプリに電話をかける権限がありません。デバイス設定で許可してください + ここにテキストを挿入 + %sに発信 + Confirm calling %s + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + + 値を空にすることはできません + 新しい連絡先を作成 + 既存の連絡先に追加 + アプリの破損 + 注意事項 + 写真を撮影 + 写真を選択 + 動画を選択 + 連絡先を選択 + ファイルを選択 + 音声を録音 + 動画を録画 + 更新中… + 内部ストレージ + 内部ストレージ (他のアプリからは表示されません) + Audio + + 誕生日 + 記念日 + + 自宅 + 職場 + + 携帯 + メイン + 職場FAX + 自宅FAX + ポケベル + 電話番号が見つかりません + + 表示形式の変更 + グリッド + グリッド (Pro) + Uneven Grid + リスト + 列数を増やす + 列数を減らす + 列数 + 縦向きの列数 + 横向きの列数 + カバー画像を変更 + 写真を選択 + + %d 列 + + + ブロックした番号を管理 + まだ誰もブロックしていません. + ブロックする番号を追加 + 番号をブロックする + 複数の番号をブロックする + ブロックした番号 + ブロックした番号をエクスポート + ブロックした番号をインポート + 番号ブロックを活用するには、このアプリをデフォルトの電話アプリにする必要があります。 + デフォルトとして設定 + 本当に\"%s\"をブロックしますか? + 連絡先に登録されていない相手からの着信をブロックする + 連絡先に登録されていない相手からのメッセージをブロックする + 番号やパターンを入力すると、番号やパターンに一致する番号からの着信やメッセージをすべてブロックできます (パターンの例:*12345*, +1*8888) 。 + 不明な番号をブロックするには、発信者番号へのアクセス許可が必要です。 + + お気に入り + お気に入りを追加 + お気に入りに追加 + お気に入りから削除 + + 検索 + %s内を検索 + 検索を開始するには少なくとも2文字以上の入力が必要です。 + 連絡先を検索 + お気に入りを検索 + アプリを検索 + 予定を検索 + グループを検索 + 履歴を検索 + 通話を検索 + ファイルを検索 + フォルダを検索 + ファイル/フォルダを検索 + プレイリストを検索 + アーティストを検索 + アルバムを検索 + トラックを検索 + テキストを検索 + 会話を検索 + 録音を検索 + + フィルタ + フィルタ (Pro) + 何も見つかりませんでした。 + フィルタを変更 + + ストレージへのアクセス許可が必要です + 連絡先へのアクセス許可が必要です + カメラへのアクセス許可が必要です + マイクへのアクセス許可が必要です + 許可なし + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + ファイルの名前を変更 + フォルダの名前を変更 + ファイルの名前を変更できませんでした + フォルダの名前を変更できませんでした + フォルダ名は空にできません + その名前のフォルダは既に存在します + ストレージのルートフォルダの名前を変更できません + フォルダの名前を正常に変更しました + フォルダの名前を変更中 + ファイル名は空にできません + ファイル名に無効な文字が含まれています + ファイル名 \'%s\' に無効な文字が含まれています + 拡張子は省略できません + ソースファイル %s が存在しません + ファイル名の前に追加 + ファイル名の後に追加 + 簡単な名前変更 + パターン + 追加する文字列 + %Y - 年\n%M - 月\n%D - 日\n%h - 時\n%m - 分\n%s - 秒\n%i - 1から増える数 + ファイル名 (.txtを除く) + ファイル名 (.jsonを除く) + ファイル名 (.zipを除く) + Android11以降、ファイルやフォルダを非表示にできなくなりました + + コピー + 移動 + コピー / 移動 + コピー + 移動 + + + 宛先を選択 + タップして宛先を選択 + 選択した宛先に書き込みできませんでした + 宛先を選択してください + 元と先を同じにすることはできません + ファイルをコピーできませんでした + コピー中… + ファイルを正常にコピーしました + ファイルのコピーに成功しました + エラーが発生しました + 移動中… + ファイルを正常に移動しました + ファイルの移動に成功しました + 一部のファイルが移動できませんでした + 一部のファイルがコピーできませんでした + ファイルが選択されていません + 保存中… + フォルダ %s を作成できません + ファイル %s を作成できません + 新しいアイテムは見つかりませんでした + 保存先に十分な空き容量がありません。 +\n必要容量 %1$s, 空き容量 %2$s + ファイルとフォルダを選択するためのシステムサービスが利用できません + + 新規作成 + フォルダ + ファイル + フォルダの新規作成 + 同名のファイルまたはフォルダが既に存在しています + 名前に無効な文字が含まれています + 名前を入力してください + 不明なエラーが発生しました + + ファイル \"%s\" は既に存在しています + ファイル \"%s\" は既に存在しています。上書きしますか? + フォルダ \"%s\" は既に存在しています + 統合 + 両方保持する + 上書き + スキップ + \'_1\' に追記する + すべてに適用 + このフォルダでの操作はシステムで許可されていません。別のフォルダを選択してください。 + このフォルダへのコピーはシステムで許可されていません。別のフォルダを選択してください。 + このフォルダでの名前変更はシステムで許可されていません + 内部ストレージのフォルダの名前を直接変更できません。サブフォルダのみ変更できます。 + このフォルダの名前を変更できません + + フォルダを選択 + ファイルを選択 + 外部ストレージへのアクセス確認 + フォルダへのアクセス確認 + 次の画面でSDカードのルートフォルダを選択して、書き込みアクセス許可を付与してください + SDカードの内容が表示されない場合は、こちらをお試しください + 次の画面で、下部にある [このフォルダを使用] を押して、選択したストレージへのアクセスをアプリに許可してください。 + 次の画面で、下部にある [このフォルダを使用] を押して、 [%s] へのアクセスをアプリに許可してください。 + 次の画面で、下部にある [保存] を押して、新しいフォルダを作成してください。 + 選択を確認 + 読み込み中… + [すべてのファイルへのアクセス] をアプリに許可してください。許可をしないとうまく機能しない可能性があります。 + + %d アイテム + + + + %d アイテム + + + %d アイテムを削除しています + + + + %d コンタクト + + + ストレージを選択 + ストレージ + 内部 + SDカード + ルート + フォルダの選択が正しくありません。SDカードを選択してください + SDカードとUSBデバイスのパスを同じにすることはできません + アプリがSDカード上にインストールされているため、アプリのウィジェットは使用できません。利用可能なウィジェットのリストにも表示されないでしょう。 + これはシステムによる制限なので、ウィジェットを使用する場合には、アプリを内部ストレージに戻す必要があります。 + フォルダの選択が正しくありません。パス \'%s\' を選択してください + + プロパティ + パス + アイテム選択 + ファイル数+フォルダ数(サブフォルダ除く) + 合計ファイル数 + 解像度 + 長さ + アーティスト + アルバム + 焦点距離 + 露出時間 + ISO感度 + 絞り値 + カメラ名 + EXIF + 曲名 + GPS座標値 + 高度 + EXIFを削除 + GPSの座標やカメラモデルなどのEXIF情報を削除してもよろしいですか? + EXIF情報の削除に成功しました + + 背景色 + 文字色 + メインカラー + ホワイトテーマのアクセントカラー + モノクロテーマのアクセントカラー + 前景色 + アプリアイコンの色 + ナビゲーションバーの色 + デフォルトに戻す + デフォルトを使用 + デフォルト + 色を変更 + テーマ + 色を変更すると、テーマが \'カスタム\' に切り替わります + 保存 + 破棄 + 変更を元に戻す + 変更を元に戻してもよろしいですか? + この操作は元に戻せません。 + 保存していない変更があります。保存しますか? + すべてのSimple Appsに色を適用する + 注意: 一部のランチャーはアプリアイコンのカスタマイズを適切に処理しません。アイコンが消えた場合は、Google Playもしくはウィジェットからアプリを起動してみてください。起動したら、アイコンをデフォルトのオレンジ色(#F57C00)に戻してください。最悪の場合、アプリの再インストールが必要となります。 + 色の更新に成功しました。新しいテーマ \'共有\' が追加されたので、今後はそちらから全てのアプリの色変更を行ってください。 + Pro版のアプリを使用していても、技術的な理由によりSimple Thank Youが必要であることにご留意下さい。色の同期を処理します。 + + Simple Thank You アプリを購入してください。 + ]]> + + + ライト + ダーク + 自動 + 自動 ライト/ダーク + ソラライズド + ダーク・レッド + ホワイト + モノクロ + カスタム + 共有 + システムのデフォルト + + 更新内容 + * ここでは主な変更点を挙げていますが、その他の細かい改善も行われています + + 削除 + 削除 + 名前の変更 + 共有 + 共有 + リサイズ + すべて選択 + テキストを選択 + 非表示 + 再表示 + フォルダを非表示 + フォルダを再表示 + 非表示項目を一時的に表示 + 非表示項目を表示しない + 一度に複数のコンテンツを共有することはできません + ごみ箱を空にして無効にする + 元に戻す + やり直し + 印刷 + 印刷 (Pro) + ショートカット + ショートカットを作成 + ショートカットを作成 (Pro) + 連絡先に番号を追加 + 連絡先の詳細を表示 + SIM 1 から電話 + SIM 2 から電話 + ファイル名の表示を切り替え + 上部に移動する + 下部に移動する + アイテムをピン留め + アイテムのピン留めを外す + SMS を送信 + メールを送信 + 通話 + 連絡先の詳細 + 連絡先を追加 + 壁紙 + + 並べ替え + 名前 + サイズ + 最終更新日時 + 作成日 + 撮影日時 + タイトル + ファイル名 + 拡張子 + ランダム + ランダムに並び替え + 昇順 + 降順 + このフォルダのみに適用 + 数値を実際の値で並べ替える + + ミドルネーム + + 氏名 + カスタムソートを使用 + 並び替え + + 削除を続行してもよろしいですか? + %s を削除してもよろしいですか? + %s を削除しますか? + + %s をごみ箱に移動してもよろしいですか? + + このアイテムを削除してもよろしいですか? + このアイテムをごみ箱に移動してもよろしいですか? + このセッションでは再度たずねない + 今後表示しない + はい + いいえ + 恐らく + + 警告: %d 個のフォルダを削除しようとしています + + + PIN + PINを入力 + PINを入力してください + PINに誤りがあります + PINを再入力 + パターン + パターンを入力 + パターンに誤りがあります + パターンを再入力 + 生体認証 + 指紋 + 指紋を追加 + 指紋センサーに指を置いてください + 生体認証ID検証ダイアログを開く + 認証 + 認証に失敗しました + 認証がブロックされました、しばらくしてからもう一度お試しください + 指紋がまだ登録されていません、お使いの端末の設定でいくつか追加してください + 設定に移動 + パスワードの設定が完了しました。パスワードを紛失した場合は、アプリを再インストールしてください。 + 指紋認証の設定が完了しました。何らかの問題によりアプリを再インストールした場合には、再度設定し直してください。 + フォルダに鍵をかける + フォルダに鍵をかける (Pro) + フォルダの鍵を外す + この保護はアプリ内のみの機能となっており、実際にフォルダ全体を暗号化保護しているわけではありません。 + + 昨日 + 今日 + 明日 + 毎日 + 年を隠す + + + 時間 + + s + m + h + + + %d秒 + + + %d分 + + + %d時間 + + + %d日 + + + %d週 + + + %dヶ月 + + + %d年 + + + + %d秒 + + + %d分 + + + %d時間 + + + %d日 + + + %d週 + + + %dヶ月 + + + %d年 + + + + %d秒前 + + + %d分前 + + + %d時間前 + + + %d日前 + + + %d週間前 + + + %dヶ月前 + + + %d年前 + + + + %d秒 + + + %d分 + + + %d時間 + + + %d日 + + + %d週間 + + + %dヶ月 + + + %d年 + + + アラームが鳴るまでの時間:\n%s + リマインダー発動までの時間:\n%s + 残り時間: +\n%s + アラームの動作を確認して使用してください。バッテリー節約に関連したシステムの制限によって、誤動作が発生する場合があります。 + リマインダーの動作を確認して使用してください。リマインダーを妨げるものはないか、アプリがバックグラウンドで閉じられないか、デバイスの通知設定と電池設定を確認してください。 + アプリの通知が無効となっています。設定から有効に変更してください。 + + アラーム + スヌーズ + 閉じる + リマインダーなし + 開始時 + システムサウンド + 選択したサウンド + 新しいサウンドを追加 + サウンドなし + 日中 hh:mm + 日中 %02d:%02d + + 設定 + Simple Thank Youを購入 + 全般 + カラーカスタマイズ + カラーカスタマイズの改善 + 表示色のカスタマイズ + 表示色のカスタマイズ (Locked) + Locked + ウィジェットの色をカスタマイズ + 通知をカスタマイズ + Notification sound + 英語で表示する + 言語 + 非表示のアイテムを表示する + メモのフォントサイズ + + 通常 + + 特大 + 非表示にした項目をパスワードで保護する + アプリ全体をパスワードで保護する + ファイルの削除と移動をパスワードで保護する + ファイルの操作時、既存の最終更新日を保持する (更新日を更新しない) + スクロールバーをドラッグ中にアイテムの情報を表示する + アプリの使用中は端末がスリープ状態にならないようにする + 削除時の確認ダイアログを表示しない + 下に引っ張って更新を有効にする + 24時間表示を使用 + 日付と時刻の表示形式を変更 + 週の始めを日曜にする + ウィジェット + 毎回同じスヌーズ時間を使用する + スヌーズ時間 + ボタンを押した時に振動する + 削除の代わりにアイテムをごみ箱に移動する + ごみ箱を自動で空にする間隔 + ごみ箱を空にする + 縦向きモードを強制する + 設定をエクスポート + 設定をインポート + 設定は正常にエクスポートされました + 設定は正常にインポートされました + 姓を先に表示 + キャッシュのクリア + 発信する前に確認ダイアログを表示する + + 表示・非表示 + セキュリティ + スクロール + ファイル操作 + ごみ箱 + 保存 + 起動時 + テキスト + 移行 + 品質 + メイン画面 + サムネイル + リストビュー + + 除外する + フォルダを除外 + 除外フォルダ + (除外) + 除外フォルダの管理 + すべて解除 + 除外するフォルダの登録をすべて解除しますか\? フォルダ自体は削除されません。 + 除外項目を一時的に表示 + 除外項目の表示を中止 + + 表示するタブを管理 + アプリ開始時に開くタブ + 連絡先 + お気に入り + 発着信履歴 + グループ + 最後に使用 + ファイル + 最近使用したファイル + + このファイルを復元 + 選択したファイルを復元 + すべてのファイルを復元 + ごみ箱を空にしました + ファイルが正常に復元されました + ごみ箱を空にしてもよろしいですか?この操作は元に戻すことができません。 + ごみ箱は空です + ごみ箱からの移動はできません。復元を使用してください + ごみ箱を表示 + ごみ箱を隠す + ごみ箱を開く + Skip the Recycle Bin, delete files directly + + %d件のアイテムをごみ箱に移動しています + + + インポート中… + エクスポート中… + 正常にインポートされました + 正常にエクスポートされました + インポートに失敗しました + エクスポートに失敗しました + 一部のエントリのインポートに失敗しました + 一部のエントリのエクスポートに失敗しました + インポートするエントリが見つかりませんでした + インポートする新しいエントリが見つかりませんでした + エクスポートするエントリが見つかりませんでした + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + デバイスにUSBが繋がっているようです。ファイルを正常に表示するためには、追加で許可を行ってください。 + アクセスを許可するには、次の画面でUSBデバイスの1番上のフォルダを選択してください + 選択されたフォルダが間違っています。USBデバイスのルートフォルダを選択してください + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + + 1月 + 2月 + 3月 + 4月 + 5月 + 6月 + 7月 + 8月 + 9月 + 10月 + 11月 + 12月 + 月曜日 + 火曜日 + 水曜日 + 木曜日 + 金曜日 + 土曜日 + 日曜日 + + + + + + + + + + + + + + + + アプリのバージョンはこれ以上更新されません。新しい修正や改善を受けるには、Pro版へアップグレードしてください。 + このアプリのバージョンはこれ以上更新されません。新たな修正と改善を受けるには、ここをタップしてPro版にアップグレードしてください。 + %sまで無料です。それまでにダウンロードすれば、永久に無料でご利用いただけます。 + もっと見る + アップグレードする + ローカルに保存されたイベントは、手動で.icsファイルにエクスポートしてインポートする必要があります。インポート/エクスポートボタンはメイン画面のメニューにあります。 + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + こんにちは、 +\n +\n無料版からアップグレードされたようですね。データの移行やセットアップが完了したら、誤って起動しないように、無料版のアプリをアンインストールしてください。 +\n +\nありがとうございます! + こんにちは、 +\n +\nすでにPro版のアプリをお持ちのようですね。データの移行が完了したら、誤って起動しないように、こちらのアプリをアンインストールしてください。 +\n +\nありがとうございます! + こんにちは、 +\n +\n無料版からアップグレードされたようですね。ローカルに保存された予定を移行したい場合は、手動で予定を移行する必要があります。無料版のアプリのトップメニューから.icsファイルにエクスポートした後に、Pro版のアプリのトップメニューから.icsファイルをインポートしてください。 +\n +\n予定の移行やセットアップが完了したら、不要になった無料版のアプリをアンインストールできます。 +\n +\nありがとうございます! + こんにちは、 +\n +\n無料版からアップグレードされたようですね。「%s」以下に保存されている連絡先がある場合は、手動で連絡先を移行する必要があります。無料版のアプリのトップメニューから.vcfファイルにエクスポートした後に、Pro版のアプリのトップメニューから.vcfファイルをインポートしてください。 +\n +\n連絡先の移行やセットアップが完了したら、不要になった無料版のアプリをアンインストールできます。 +\n +\nありがとうございます! + こんにちは、 +\n +\n無料版からアップグレードされたようですね。メモを移行したい場合は、手動でメモを移行する必要があります。無料版のアプリのトップメニューからメモをエクスポートした後に、Pro版のアプリのトップメニューからメモをインポートしてください。 +\n +\nメモの移行やセットアップが完了したら、不要になった無料版のアプリをアンインストールできます。 +\n +\nありがとうございます! + + このアプリについて + Webサイト + ソースコードはこちら + ご意見やご提案をお送りください + Pro版にアップグレード + 他のアプリ + 当社の他のアプリ + 友達を招待 + %2$s で %1$s を確認してください + 招待 + Playストアで評価してください + 評価する + 寄付 + フォローしてください + v %1$s\nCopyright © Simple Mobile Tools %2$d + サポート + ご協力のお願い + ソーシャル メディア + その他 + プライバシー ポリシー + Version %s + Hello :) + Made with ❤️ in Slovakia + 追加情報 + アプリバージョン: %s + デバイスOS: %s + +
    + アプリを楽しんでいただけているでしょうか。広告無しを続けるため、Simple Thank Youアプリを購入し開発の力になってください。購入されれば、この表示も二度と出ません。

    + ありがとうございます! + ]]> +
    + こんにちは、<br><br> アプリを楽しんでいただけているでしょうか。広告無しでプライバシーを尊重するアプリを続けるため、<a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>アプリを購入し開発の力になってください。購入されれば、色のカスタマイズを含むすべてのアプリ機能のロック解除も行えます。 <br><br> ありがとうございます! + <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>アプリを購入し開発の力になってください。購入されれば、色のカスタマイズを含むすべてのアプリ機能のロック解除も行えます。 + 購入する + Get Simple Phone + \"Simple Thank You\" アプリを最新版に更新してください + お問い合わせいただく前に、アプリの設定を確認し、よくある質問を見てください。答えが載っているかもしれません。 + 当社を評価していただく前に、アプリの設定を確認し、よくある質問を見てください。問題が発生しているなら、答えが見つかるかもしれません。 + 最新バージョンのアプリを利用しているかご確認ください。 + また、このアプリのバージョンは開発されていないことにご注意ください。Pro版を入手すると、多くの改善が得られます。 + 見る + FAQ + こんにちは、\n\n このアプリをしばらくご利用いただいているようで、感謝いたします。\n\n ひとつお願いがあるのですが、Google Playで評価してもらえるでしょうか。お力添えください。 \n\n 評価をしてもしなくても、このメッセージは二度と表示されません。\n\nThanks! + 是非、アプリを評価してください :) + ありがとうございます + ウィジェットはロックされています。 +\nロックを解除するには、Pro版にアップグレードしてください。 + この機能はロックされています。ロックを解除するには、 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> を購入する必要があります。<br><br>お支払いは1回のみで、ご満足いただけない場合はご返金いたします。 + + こんにちは、<br><br> 最近、新しいアプリをいくつかリリースしたのでお知らせします:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> アイコンかタイトルをタップするだけでダウンロードできます。<br><br> ありがとうございます + Simple App ランチャー + Simple電卓 + Simpleカレンダー + Simpleカメラ + Simple時計 + Simpleコンタクト + Simpleダイヤラー + Simpleお絵かき + Simpleファイルマネージャー + Simpleフラッシュライト + Simpleギャラリー + シンプルキーボード + Simpleランチャー + Simple音楽プレーヤー + Simpleメモ + Simpleショートメール + Simple Thank You + Simpleボイスレコーダー + アプリランチャー + 電卓 + カレンダー + カメラ + 時計 + 連絡先 + ダイヤラー + お絵かき + ファイルマネージャー + フラッシュライト + ギャラリー + キーボード + ランチャー + 音楽プレーヤー + メモ + ショートメール + Thank You + ボイスレコーダー + + ここからダウンロードしてください。 + ]]> + + + よくある質問 + 質問する前に、こちらをお読みください + ウィジェットのリストにこのアプリが表示されないのはなぜですか? + おそらく、SDカード内にアプリが保存されているからです。その場合、Androidには特定のアプリウィジェットを非表示にするシステム制限があります。デバイスの設定から、アプリを内部ストレージへ移動してください。 + 支援をしたいけど、お金の寄付が出来ません。他に出来ることはありますか? + はい、もちろんです。このアプリに関しての情報を広めたり、改善のためのフィードバックを送ったり、ストアでの評価を行ったり出来ます。また、アプリの未翻訳フレーズを翻訳したり、既存の翻訳を改善したりすることも出来ます。翻訳ガイドは <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>こちらのWebサイト</a> にあります。ご不明な点がございましたら、 <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> までお問い合わせください。 + 間違えてファイルを削除してしまいました。どうすれば復元できますか? + 残念ながら復元は出来ません。一度了承するとファイルは即座に削除され、ごみ箱も利用不可となります。 + ウィジェットの色が好みじゃないです。変更出来ますか? + はい、ホーム画面でウィジェットをドラッグすると、ウィジェット設定画面が表示されます。左下に色付きの正方形が表示されるので、ボタンを押して色を選択してください。スライダーを使用して透明度を変更することも可能です。 + 削除したファイルを復元出来ますか? + 本当に削除されてしまったのであれば、復元出来ません。ですが、デフォルトでごみ箱機能が有効になっているため、ファイルは削除されたのではなく、ごみ箱に移動している可能性があります。 + ランチャーからアプリのアイコンが消えました。どうしたらいいですか? + ランチャーがアイコンカスタマイズを適切にサポートしていないことが原因となっています。Google Playもしくはウィジェットからアプリを起動してみてください。起動したら、アイコンをデフォルトのオレンジ色(#F57C00)に戻してください。最悪の場合、アプリの再インストールが必要となります。 + 銀行口座から引き落としはされているけど、アプリがダウンロード出来ません。どうしたらいいですか? + お支払いはGoogleが対応していますが、時にシステム上で不具合があるようです。Google Playのアプリキャッシュを削除し、デバイスを再起動してダウンロードしてみてください。 + なぜPro版にアップグレードしたほうがいいのですか? + アプリのバージョンが更新されないので、アプリのバグが発見されても修復されません。新しい機能も追加されません。Pro版はGoogle Playで少額で販売されています。 + 1回のみのお支払いとなりますので、一度購入されるとその後はお支払いいただく必要がなくなります。機種の変更を行った場合も同じです。Pro版がお好みでなかったら、購入して数時間以内にアンインストールすれば自動的に返金されます。 + それよりもあとに払い戻しが必要な場合はこちらにご連絡ください。hello@simplemobiletools.com + 一度に複数のアイテムを選択する方法はありますか? + いくつかの方法があります。1つ目は、アイテムを長押しして選択モードを開始し、他のアイテムを短くタップして選択する方法です。2つ目は、パソコンのマウスでアイテムを選択するのと同じように、アイテムを長押しして選択モードを開始し、そのまま指を他のアイテムにドラッグして選択する方法です。3つ目は、1つ目のアイテムを長押ししてから別のアイテムを長押しする方法で、間にある全てのアイテムが選択されます。全てのアイテムを選択したい場合は、アイテムを長押ししてから、左上にあるアイテムカウンターをタップしてください。アイテムカウンターで全て選択をしたり、解除したりできます。 + アプリを購入しましたが、違うデバイスでダウンロード出来ません。 + Google Playアプリのキャッシュを削除してデバイスを再起動してみてください。Google Playの不具合であり、アプリの不具合ではありません。 + + 貢献者 + 翻訳 + 開発 + Other help + このリストには、このアプリだけでなく、Simple Mobile Tools スイート内の特定のアプリを著しく助けた人たちが含まれています。翻訳はボランティアによって行われています。翻訳を行いたい場合はお知らせください。翻訳ガイドは <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>こちらのWebサイト</a> にあります。ご不明な点がございましたら、 <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> までお問い合わせください。すべての貢献者ならびにすべてのサポーターに感謝いたします! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + 今すぐPro版をゲットしよう! + ベーシック + プロ + 広告なし + インターネットにアクセス不要 + 100%返金保証 + 1回払い + 改良されたデザイン + + 高度な写真編集機能 + 高度な写真&動画編集機能 + HEIC / HEIFファイル対応 + 高度なファイル名の一括変更機能 + 個々のフォルダのロック + 印刷対応 + + 現地時間対応 + 出席者とメール通知 + 簡単な予定のインポート + 新しいウィジェット + + 重複した連絡先登録を改善 + 文字サイズのカスタマイズ + アプリ内で個別連絡先をシェアするオプション + カスタマイズ可能な連絡先の着信音 + 連絡先フィルタリング + 非公開の連絡先 + + チェックリスト + 各ウィジェットに違うメモと色 + メモのロック + + 日付と時刻の表示形式のカスタマイズ + ホーム画面のショートカット + ファイル圧縮対応 + 最近のファイルのタブ + + 背景色のカスタマイズ + ファイル入力対応 + ズーミング + + このアプリは、私の暮らしにゆとりを持たせるために、次のサードパーティのライブラリーを使用しています。ありがとうございます。 + サードパーティー ライセンス + Kotlin (プログラミング言語) + Subsampling Scale Image View (ズーム可能画像ビュー) + Glide (画像ローディングとキャッシング) + Picasso (画像ローディングとキャッシング) + Android Image Cropper (画像のトリミングと回転) + RtlViewPager (右から左へのスワイプ) + Joda-Time (Java date代替) + Stetho (データベースのデバッグ) + Otto (イベントバス) + PhotoView (GIF画像のズーム表示) + PatternLockView (パターン認証) + Reprint (指紋保護) + Gif Drawable (GIF画像の読み込み) + AutoFitTextView (テキストのリサイズ) + Robolectric (フレームワークのテスト) + Espresso (ヘルパーのテスト) + Gson (JSONパーサ) + Leak Canary (メモリリークの検出) + Number Picker (カスタマイズ可能なnumber picker) + ExoPlayer (動画プレーヤー) + VR Panorama View (パノラマ表示) + Apache Sanselan (画像メタデータ読み込み) + Android Photo Filters (画像フィルタ) + Gesture Views (ズーム可能な画像) + Indicator Fast Scroll (スクロールバー上の文字) + Event Bus (アプリ内コミュニケーション) + Audio Record View (オーディオ・ビジュアライゼーション) + SMS MMS (SMSやMMSの取り扱い) + APNG Android (アニメーションWebPサポート) + PDFViewPager (PDFビューア) + M3U Parser (m3uプレイリストの取り扱い) + AndroidLame (mp3エンコーダ) + + 試用期間の終了 + 試用を開始 + 試用期間はまもなく終了します。 + 最終日にアプリのロックを解除する + ようこそ %s へ! + 私たちのアプリをご利用いただきありがとうございます。このアプリのロック解除版を %d 日間 試用することができます。試用が終了したら、Pro版へのアップグレードをご検討ください。多くの新しい機能、モダンなデザイン、広告なし、その他多くの改善点があります。 +\n +\n一度きりの購入で永続的に使用することができます。ご満足いただけない場合は、アプリをアンインストールして払い戻しを受けることもできます。 +\n +\n気に入っていただければ幸いです :) + 多くの機能をともなったPro版へのアップグレードをご検討ください。 +\n +\n一度きりの購入で永続的に使用することができます。ご満足いただけない場合は、アプリをアンインストールして払い戻しを受けることもできます。 +\n +\nそれでは、また :) + + 試用期間の残りは %d 日です。 + + + 非推奨: このバージョンのアプリはメンテナンスが行われなくなります。こちらのURLからPro版を入手してください。https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + どのアプリでも、購入後2時間以内にアンインストールすると自動的に払い戻しされることを覚えていてください。それ以降に払い戻しが必要な場合は、こちらにお問い合わせください。hello@simplemobiletools.com +お試ししやすいかと思います :) + + 広告や不要な権限がなく、カスタマイズ可能なウィジェットを備えたシンプルな複数のオープンソースAndroidアプリ。 +
    diff --git a/commons/src/main/res/values-ko-rKR/strings.xml b/commons/src/main/res/values-ko-rKR/strings.xml new file mode 100644 index 000000000..4dc6a4686 --- /dev/null +++ b/commons/src/main/res/values-ko-rKR/strings.xml @@ -0,0 +1,1058 @@ + + + 확인 + 취소 + Back + Nothing + 나중 + 다른 이름으로 저장 + 파일저장 성공 + 잘못된 파일 형식 + 메모리 부족 오류 + 에러발생: %s + Error: %s + 다른 앱으로 열기 + 편집 앱으로 열기 + Edit + 연결 가능한 앱 없음 + No browser found + No email client found + 다른 앱에 설정 + Copy to clipboard + Copy number to clipboard + 클립보드에 복사됨 + 클립보드에 복사됨:\n%s + Dial number + 알 수 없음 + 항상 + 사용 안함 + 세부 정보 + 추가 정보 + \'%s\' 폴더를 삭제 + 없음 + 라벨 + 투명 + 투명 색상 + 다른 색을 선택해 주세요 + 다운로드 + 알림 + Notifications + 이메일 + 이전 + 재생 / 정지 + 다음 + 연락처 + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + 사진 촬영 + 사진 선택 + Choose video + Choose contact + Choose file + Record audio + Record video + 수정중… + Phone storage + Phone storage (not visible by other apps) + Audio + + 생일 + 기념일 + + + 회사 + + 핸드폰 + Main + 회사 팩스 + 집 팩스 + 호출기 + 전화번호를 찾지 못함 + + 보기 방식 변경 + 타일 + 타일 (Pro) + Uneven Grid + 목록 + 섬네일크기 축소 + 섬네일크기 확대 + Column count + Portrait column count + Landscape column count + 커버 사진 변경 + 사진 선택 + + %d column + %d columns + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + 즐겨찾기 + 즐겨찾기 추가 + 즐겨찾기에 추가 + 즐겨찾기에서 제거 + + 검색 + Search in %s + 최소 두 글자를 입력해 주세요 + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + 필터 + 필터 (Pro) + 항목을 찾지 못함 + 필터 변경 + + 저장 권한이 필요함 + 주소록 사용 권한이 필요함 + 카메라 사용 권한이 필요함 + 오디오 사용 권한이 필요함 + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + 파일명 변경 + 폴더명 변경 + 파일명을 변경 할 수 없음 + 폴더명을 변경 할 수 없음 + 폴더명이 입력되지 않았습니다 + 폴더명이 이미 존재합니다 + 저장소의 루트폴더 이름은 변경 할 수 없습니다 + 폴더명 변경 성공 + 폴더명 변경 + 파일명이 입력되지 않았습니다 + 파일명에 사용할 수 없는 문자가 있습니다 + 파일명 \'%s\'에 사용할 수 없는 문자가 있습니다 + 확장자가 입력되지 않았습니다 + 원본 파일 %s 이(가) 존재하지 않습니다 + 앞에 이름 덧붙이기 + 뒤에 이름 덧붙이기 + 심플 이름 바꾸기 + 패턴 + 추가할 문장 + %Y - 년\n%M - 월\n%D - 일\n%h - 시\n%m - 분\n%s - 초\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + 복사 + 이동 + 복사 / 이동 + 복사하기 + 이동하기 + 원본 + 대상 + 대상 선택 + 대상을 선택하려면 여기를 탭하세요. + 대상경로에 생성 불가 + 대상 경로를 선택하세요 + 대상과 원본이 같습니다. + 파일복사 실패 + 복사중… + 파일복사 성공 + File copied successfully + 오류발생 + 이동중… + 파일이동 성공 + File moved successfully + 일부 파일을 이동 할 수 없음 + 일부 파일을 복사 할 수 없음 + 파일이 선택되지 않았습니다 + 저장중… + %s 폴더 생성에 실패함 + %s 파일 생성에 실패함 + 새 항목을 찾을 수 없음 + 대상 경로의 공간이 부족합니다.\n필요 공간: %1$s, 사용 가능: %2$s + System service for selecting files and folders is unavailable + + 새로 만들기 + 폴더 + 파일 + 새 폴더 만들기 + 동일한 이름의 파일 또는 폴더가 이미 존재합니다 + 이름에 사용 할 수 없는 문자가 있습니다 + 이름이 입력되지 않았습니다 + 알 수 없는 에러가 발생하였습니다 + + \"%s\" 파일이 이미 존재합니다. + \"%s\" 파일이 이미 존재합니다. 덮어쓰시겠습니까? + \"%s\" 폴더가 이미 존재합니다. + 합치기 + 둘 다 유지 + 덮어쓰기 + 건너뛰기 + \'_1\' 문자열을 추가하기 + 모든 충돌에 적용 + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + 폴더 선택 + 파일 선택 + 외장 메모리 접근 허용 + Confirm folder access + 쓰기 권한을 부여하려면 다음 화면에서 SD 카드의 루트 폴더를 선택하세요. + SD 카드가 보이지 않으면 시도해보세요. + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + 선택 확인 + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d개 항목 + + + + %d개 항목 + + + %d개 항목 삭제중 + + + + %d contact + %d contacts + + + 저장공간 선택 + Storage + 내장 메모리 + 외장 메모리 + 루트 + 잘못된 폴더가 선택되었습니다. SD 카드의 루트 폴더를 선택하세요. + SD카드와 USB 장치의 경로가 중복되었습니다. + 시스템 제한으로 SD카드에 설치한 앱은 위젯을 사용할 수 없습니다. 위젯을 사용하시려면 내장 메모리에 앱을 옮겨 주시기 바랍니다 + Wrong folder selected, please select path \'%s\' + + 속성 + 경로 + 선택한 항목 수 + 하위 항목 수 + 전체 파일 수 + 해상도 + 길이 + 가수 + 앨범 + 초점 거리 + 노출 시간 + ISO 속도 + F-number + 카메라 + EXIF + 음악 제목 + GPS 좌표 + 고도 + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + 배경 색상 + 텍스트 색상 + 주요 색상(테마) + Accent color of white theme + Accent color of Black & White theme + 그리기 색상 + 앱 아이콘 색상 + 네비게이션 바 색상 + 기본설정으로 되돌리기 + 기본설정 사용 + 기본값 + 색상 변경 + 테마 + 주요 색상(테마)을 변경하면 사용자 정의 테마로 전환됩니다. + 저장 + 취소 + 변경사항 되돌리기 + 변경된 사항을 취소하시겠습니까? + This action cannot be undone. + 아직 변경사항을 저장하지 않았습니다. 종료전에 저장 하시겠습니까? + 심플 시리즈 앱에 일괄적용 + 경고 : 일부 런처는 앱 아이콘 커스터마이징을 제대로 지원하지 않습니다. 앱의 아이콘이 사라졌다면, 플레이 스토어나 위젯을 통하여 앱을 실행한 뒤 기본값인 주황색(#F57C00)으로 다시 변경해주시기 바랍니다. 최악의 경우에는 앱을 재설치 해야할 수도 있습니다. + 색상이 성공적으로 변경되었습니다. \'공유\'라는 새로운 테마가 추가되었습니다. 앞으로 모든 앱의 색상을 변경할때 사용하세요. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You 앱을 구매해주세요. 감사합니다! + ]]> + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + 사용자 정의 + 공유 + System default + + 새로운 기능 + * 주요 업데이트만 여기에 표시됩니다. 작은 업데이트도 항상 진행되고 있습니다. + + 삭제 + 제거 + 이름 변경 + 공유 + 공유 방법 + 크기 변경 + 전체 선택 + Select text + 숨김 + 숨김 해제 + 폴더 숨김 + 폴더숨김 해제 + 숨김파일 임시보기 + 숨김파일 임시보기 해제 + 한 번에 공유 할 수 있는 항목 수를 초과하였습니다. + 휴지통을 비우고 비활성화하기 + 뒤로 + 앞으로 + 인쇄 + 인쇄 (Pro) + Shortcut + 바로가기 생성 + 바로가기 생성 (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + 파일 이름 보기 + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + 정렬 방식 + 이름 + 크기 + 최종 수정시간 + Date created + 촬영 날짜 + 제목 + 파일명 + 파일 확장자 + 랜덤 + 랜덤 정렬 + 오름차순 + 내림차순 + 현재 폴더만 적용 + 실제 숫자 값으로 숫자 정렬 + 이름 + 중간 이름 + + Full name + Use custom sorting + Change order + + 정말로 삭제 하시겠습니까? + %s을 정말 삭제 하시겠습니까? + Delete %s? + + %s을 정말 휴지통으로 이동하시겠습니까? + + 이 항목을 정말 삭제하시겠습니까? + 이 항목을 정말 휴지통으로 이동하시겠습니까? + 다시 물어보지 않기 + Do not show again + + 아니요 + 아마도 + + 경고 : %d개 폴더를 삭제합니다 + + + PIN + PIN 번호 입력 + PIN 번호를 입력하세요. + PIN 번호가 일치하지 않습니다. + PIN 번호 확인 + 패턴 + 패턴 입력 + 패턴이 잘못 입력되었습니다. + 패턴 확인 + Biometrics + 지문 + 지문 추가 + 지문 센서에 손가락을 올려주세요. + Open biometric ID verification dialog + Authenticate + 인증 실패 + 인증이 차단 되었습니다. 잠시 후 다시 시도하십시오. + 등록 된 지문이 없습니다. 기기의 설정에서 지문을 추가하십시오. + 설정으로 이동 + 암호 설정이 완료되었습니다. 암호를 기억하지 못하는 경우 앱을 다시 설치하시기 바랍니다. + 보안 설정이 성공적으로 완료되었습니다. 재설정 시 문제가 발생하면 앱을 다시 설치하시기 바랍니다. + 폴더 잠그기 + 폴더 잠그기 (Pro) + 폴더 잠금 해제 + 이 보안 설정은 이 앱에서만 작동하며, 실제 시스템 폴더 암호화를 대체할 수 없습니다. + + 어제 + 오늘 + 내일 + Every day + Hide year + + + 시간 + + s + m + h + wk. + + %d초 + + + %d분 + + + %d시간 + + + %d일 + + + %d주 + + + %d달 + + + %d년 + + + + %d초 내 + + + %d분 내 + + + %d시간 내 + + + %d일 내 + + + %d주 내 + + + %d달 내 + + + %d년 내 + + + + %d초 전 + + + %d분 전 + + + %d시간 전 + + + %d일 전 + + + %d일 전 + + + %d달 전 + + + %d년 전 + + + + %d초간 + + + %d분간 + + + %d시간 + + + %d일간 + + + %d주간 + + + %d달간 + + + %d년간 + + + 알람이 울리기까지 남은 시간:\n%s + 알림이 작동하기까지 남은 시간:\n%s + Time remaining:\n%s + 알람을 사용하기 전 제대로 작동하는지 먼저 확인하시기 바랍니다. 배터리 절약과 관련된 시스템 제한으로 오작동 할 가능성이 있습니다. + 알림을 사용하기 전 제대로 작동하는지 먼저 확인하시기 바랍니다. 배터리 절약과 관련된 시스템 제한으로 오작동 할 가능성이 있습니다. + 이 앱의 알림 설정이 비활성화 되어 있습니다. 기기 설정에서 활성화 해 주시기 바랍니다. + + 알람 + 스누즈 + 취소 + 알림 없음 + 시작할 때 + 시스템 소리 + 사용자 소리 + 소리 추가 + 소리 없음 + During the day at hh:mm + During the day at %02d:%02d + + 설정 + 심플 Thank You 구매하기 + General + Color customization + Improved color customization + 테마 및 색상 설정 + 테마 및 색상 설정 (Locked) + Locked + 위젯 색상 설정 + Customize notifications + Notification sound + 영어로 언어 전환 + Language + 숨김 항목 보이기 + 폰트 크기 + 작게 + 중간 + 크게 + 아주 크게 + 숨김 파일 보기 암호설정 + 앱 전체에 암호설정 + 파일 삭제와 이동에 암호설정 + 파일 작업 시 오래된 마지막 변경 값을 유지 + 스크롤바 드래그 시 툴팁 활성화 + 앱 실행중 화면 자동 꺼짐 방지 + 삭제 확인창 비활성화 + 아래로 스와이프하여 새로고침하기 + 24시간 표시 사용 + 날짜 및 시간 표시 형식 변경 + 일요일부터 한 주 시작 + 위젯 + 항상 같은 스누즈 시간 사용 + 스누즈 시간 + 진동 버튼을 누릅니다 + 삭제 시 휴지통으로 이동 + 휴지통 비움 주기 + 휴지통 비우기 + 세로보기 강제 + 설정 내보내기 + 설정 가져오기 + 설정 내보내기 완료 + 설정 가져오기 완료 + 성을 먼저 표시 + Clear cache + Show a call confirmation dialog before initiating a call + + 표시 + 보안 + 스크롤 + 파일 작업 + 휴지통 + 저장 + 시작 + 텍스트 + 옮기기 + Quality + Main screen + Thumbnails + List view + + 제외하기 + Exclude folder + 제외된 폴더 + (제외됨) + 제외된 폴더 관리 + 모두 제거 + 제외된 폴더를 모두 해제하시겠습니까\? + Temporarily show excluded + Stop showing excluded + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + 이 파일 복원하기 + 선택한 파일 복원하기 + 모든 파일 복원하기 + 휴지통이 성공적으로 비워졌습니다. + 파일이 성공적으로 복원되었습니다. + 휴지통을 비우시겠습니까? 비워진 파일은 복구할 수 없습니다. + 휴지통이 비어있습니다. + 휴지통 내의 파일은 복원하기 전까진 옮길 수 없습니다. + 휴지통 보이기 + 휴지통 숨기기 + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + %d개 항목을 휴지통으로 이동하고 있습니다 + + + 가져오는 중… + 내보내는 중… + 가져오기 성공 + 내보내기 성공 + 가져오기 실패 + 내보내기 실패 + 일부 항목 가져오기에 실패함 + 일부 항목 내보내기에 실패함 + 가져올 항복을 찾을 수 없음 + No new entries for importing have been found + 내보낼 항목을 찾을 수 없음 + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + 기기에 USB장치가 연결되어 있습니다. USB의 파일을 표시하려면 추가 권한이 필요합니다. + 다음에 표시되는 화면에서 USB의 루트 폴더를 선택해 주시기 바랍니다. + 잘못된 폴더가 선택되었습니다. USB의 루트 폴더(가장 윗 폴더)를 선택해 주시기 바랍니다. + + 1월 + 2월 + 3월 + 4월 + 5월 + 6월 + 7월 + 8월 + 9월 + 10월 + 11월 + 12월 + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + in 1월 + in 2월 + in 3월 + in 4월 + in 5월 + in 6월 + in 7월 + in 8월 + in 9월 + in 10월 + in 11월 + in 12월 + 월요일 + 화요일 + 수요일 + 목요일 + 금요일 + 토요일 + 일요일 + + + + + + + + 월요일 + 화요일 + 수요일 + 목요일 + 금요일 + 토요일 + 일요일 + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + 앱 정보 + Website + 소스코드 공개 링크 + 피드백 또는 제안 요청 + Pro버전으로 업데이트 + 앱 더보기 + More apps from us + 친구에게 공유 + %1$s 앱을 다운받으세요. %2$s + 공유 선택 + 앱 평가하기 + 평점 주기 + 기부하기 + 팔로우 + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + 추가 정보 + 앱 버전: %s + 기기 OS: %s + + + 우리의 애플리케이션이 도움이 되길 바랍니다.
    + 사용하고 계신 애플리케이션은 광고 및 인앱 결제가 없는 무료 애플리케이션으로 별도의 수익이 발생하지 않습니다.
    + 당신이 원하신다면 개발지원을 위해 Simple Thank You 앱을 다운받아 지원 하실 수 있습니다.
    + \'Simple Thank You\' 앱이 설치되면 이 다이얼로그는 비 활성화 됩니다.
    + 감사합니다. + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + 구매 + Get Simple Phone + Simple Thank You를 최신 버전으로 업데이트 해 주세요. + 질문하기 전에 FAQ를 먼저 읽어 주세요. 해답이 있을지도 모릅니다. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + 읽어보기 + Read FAQ + 이 앱을 자주 사용하시는군요! 혹시 시간이 되신다면 구글 플레이스토어에서 평점을 부탁드립니다. 평점은 저희에게 많은 도움이 됩니다. 감사합니다! (이 메시지는 다시 표시되지 않습니다) + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + 저희의 새로운 앱이 출시되었습니다:

    + %2$s

    + %4$s

    + %6$s

    + 위 링크를 탭하여 받을 수 있습니다.

    + 감사합니다. + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + here. + ]]> + + + 자주 묻는 질문 + Before you ask a question, please first read the + 위젯 목록에 이 앱이 표시되지 않으면 어떻게 해야 하나요? + 앱을 SD카드에 설치했기 때문인 가능성이 큽니다. 안드로이드 시스템 제한으로 SD카드에 설치한 앱은 위젯을 사용할 수 없습니다. 이런 경우에는 위젯을 사용하시려면 내장 메모리로 앱을 옮기는 방법밖에는 없습니다. + 기부가 아닌 다른 방법으로 앱을 지원하고 싶습니다. 다른 방법이 있나요? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + 실수로 일부 파일을 삭제했는데 어떻게 복구 할 수 있습니까? + 아쉽게도 불가능합니다. 휴지통을 거치지 않고 삭제를 선택한 파일은 바로 삭제됩니다. + 위젯 색상이 마음에 들지 않는데 변경할 수 있나요? + 네, 홈 화면에서 위젯을 드래그하면 나오는 위젯 설정 화면에서, 화면 하단 왼쪽에 있는 색 사각형을 터치하여 색상을 변경할 수 있습니다. 슬라이더를 사용하여 투명도를 조정할 수도 있습니다. + 어떻게든 삭제된 파일을 복구할 수는 없을까요? + 파일이 정말로 삭제되었다면 그건 불가능합니다. 그러나 휴지통으로 옮기는 옵션이 활성화 되어 있었다면, 파일은 휴지통으로 이동하여 있을 것입니다. + 앱 아이콘이 사라졌습니다. 어떻게 해야 하나요? + 일부 런처는 앱 아이콘 커스터마이징을 제대로 지원하지 않아 앱의 아이콘이 사라질 수 있습니다. 이런 경우에는 플레이 스토어나 위젯을 통하여 앱을 실행한 뒤 기본값인 주황색(#F57C00)으로 다시 변경해주시기 바랍니다. 최악의 경우에는 앱을 재설치 해야할 수도 있습니다. + 앱 결제를 완료했는데 앱을 다운받을 수 없습니다. 어떻게 해야 하나요? + 앱의 결제는 구글이 관리합니다. 때때로 구글의 시스템에서 오류가 발생할 수도 있습니다. 플레이스토어 앱의 캐시를 지우고, 다시 다운받아 보시기 바랍니다. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + 지금 Pro 버전으로 업그레이드 해보세요! + 일반 + Pro + 광고 없음 + 인터넷 차단 + 불만족시 100% 환불제도 + One time payment + Improved design + + 고급 사진 편집 앱 + Advanced photo & video editor + HEIC/HEIF 파일 지원 + 고급 배치 파일 이름 변경 + 개별 폴더 잠금 + 인쇄 지원 + + 세계 각국 시간 지원 + 참석자 및 이메일 알림 + 간편한 이벤트 가져오기 + 새로운 위젯 + + 중복된 연락처 덮어쓰기 기능 개선 + 글꼴 크기 설정 가능 + 사용자 선택 시, 비공개로 연락처 공유할 수 있음 + Customizable contact ringtones + Contact filtering + Privately stored contacts + + 체크리스트 + 위젯별로 다양한 노트 및 색깔 지원 + Note locking + + 날짜 및 시간 설정 가능 + 홈 화면 바로가기 + 파일 압축 기능 지원 + Tab with recent files + + 바탕화면 설정 가능 + 파일 가져오기 지원 + Zooming + + 이 앱은 삶을 간편하게 만들어주는 다음의 서드파티 라이브버리를 사용합니다. 감사합니다. + 서드파티 라이선스 + Kotlin (프로그래밍 언어) + Subsampling Scale Image View (확대 가능한 이미지 보기) + Glide (이미지 로딩과 캐싱) + Picasso (이미지 로딩과 캐싱) + Android Image Cropper (이미지 자르기와 회전) + RtlViewPager (Right-to-left 스와이핑) + Joda-Time (Java 날짜 대체) + Stetho (데이터베이스 디버깅) + Otto (이벤트 bus) + PhotoView (확대 가능한 GIF) + PatternLockView (패턴 보안 기능) + Reprint (지문 보안 기능) + Gif Drawable (GIF 로딩) + AutoFitTextView (텍스트 크기 변경) + Robolectric (프레임워크 테스팅) + Espresso (테스트 도움) + Gson (JSON parser) + Leak Canary (메모리 누수 감지기) + Number Picker (편집가능 숫자 선택기) + ExoPlayer (영상 재생기) + VR Panorama View (파노라마 뷰어) + Apache Sanselan (이미지 메타데이터 읽기) + Android Photo Filters (이미지 필터) + Gesture Views (확대 가능한 이미지) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + 구버전 경고: 이 버전의 앱은 더이상 관리되지 않습니다. Pro 버전을 설치해 주세요: https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + 플레이스토어에서 구매한 앱은 2시간 내에 삭제하면 자동으로 환불받을 수 있다는 사실을 항상 잊지 마시기 바랍니다. 만약 이후에 환불이 필요하시다면, hello@simplemobiletools.com 으로 연락 주시면 해결해 드리겠습니다. 이제 한번 써보는 것도 나쁘지 않겠죠 :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-lt/strings.xml b/commons/src/main/res/values-lt/strings.xml new file mode 100644 index 000000000..8cce0b646 --- /dev/null +++ b/commons/src/main/res/values-lt/strings.xml @@ -0,0 +1,1100 @@ + + + Gerai + Atšaukti + Atgal + Nieko + Vėliau + Įrašyti kaip + Failas sėkmingai įrašytas + Neteisingas failo formatas + Klaida: trūksta atminties + Įvyko klaida: %s + Error: %s + Atverti naudojant + Taisyti naudojant + Redaguoti + Nerasta jokios tinkamos programėlės + Nerasta jokios naršyklės + Nerasta jokios el. pašto kliento programėlės + Nustatyti kaip + Kopijuoti į iškarpinę + Kopijuoti numerį į iškarpinę + Reikšmė nukopijuota į iškarpinę + Reikšmė nukopijuota į iškarpinę:\n%s + Rinkti numerį + Nežinoma + Visada + Niekada + Išsamiau + Notes + Ištrinamas aplankas „%s“ + Nėra + Etiketė + Permatoma + Permatoma spalva + Pasirinkti kitą spalvą + Atsisiųsti + Pranešimas + Pranešimai + El. paštas + Ankstesnis + Atkurti / Pristabdyti + Kitas + Numeris + Nerasta jokių adresatų + Prašyti reikalingų leidimų + Programėlei nepavyko gauti prieigą prie jūsų adresatų + Programėlė neturi leidimo inicijuoti telefono skambučių, suteikite šį leidimą įrenginio nustatymuose + Įterpkite tekstą čia + Skambinti %s + Patvirtinti skambutį %us + Nulis + Vienas + Du + Trys + Keturi + Penki + Šeši + Septyni + Aštuoni + Devyni + Reikšmė + Reikšmė negali būti tuščia + Sukurti naują adresatą + Pridėti prie esamo adresato + Programėlė pažeista + Atsakomybės ribojimas + Fotografuoti + Pasirinkti nuotrauką + Pasirinkti vaizdo įrašą + Pasirinkti kontaktą + Pasirinkti bylą + Įrašyti garso įrašą + Įrašyti vaizdo įrašą + Atnaujinama… + Telefono atmintis + Telefono atmintis (nematoma kitoms programėlėms) + Audio + + Gimtadienis + Metinės + + Namų + Darbo + + Mobilusis + Pagrindinis + Darbo faksas + Namų faksas + Pranešimų gaviklis + Nerasta telefono numerio + + Keisti rodinio tipą + Tinklelis + Tinklelis (Pro) + Nelyginis tinklelis + Sąrašas + Padidinti stulpelių skaičių + Sumažinti stulpelių skaičių + Stulpelių skaičius + Stulpelių skaičius portretiniame rėžime + "Stulpelių skaičius paverstame rėžime" + Pakeisti viršelio paveikslą + Pasirinkti nuotrauką + + %d stulpelis + %d stulpeliai + %d stulpelių + + + Tvarkyti blokuojamus numerius + Jūs neturite užblokuotų numerių. + Pridėti blokuojamą numerį + Blokuoti numerį + Blokuoti numerius + Užblokuoti numeriai + Eksportuoti užblokuotus numerius + Importuoti užblokuotus numerius + Norėdami blokuoti numerius, turite nustatyti šią programėlę kaip numatytąją numerių rinkimo programėlę. + Nustatyti kaip numatytąją + Ar tikrai norite užblokuoti „%s“\? + Blokuoti skambučius iš neįvestų numerių + Blokuoti žinutes iš neįvestų numerių + Įvesti skaičių ar šabloną (pvz. *12345*, +370*8888) kad blokuoti skambučius ir žinutes iš numerių atitinkančių šabloną. + Negalima blokuoti nežinomų numerių be skambintojo ID leidimo. + + Mėgstami + Pridėti mėgstamus + Pridėti į mėgstamus + Šalinti iš mėgstamų + + Ieškoti + Ieškoti %s + Norėdami pradėti paiešką, įveskite bent 2 simbolius. + Ieškoti kontaktuose + Ieškoti mėgiamiausiuose + Ieškoti programėlėse + Ieškoti renginiuose + Ieškoti grupėse + Ieškoti istorijoje + Ieškoti skambučiuose + Ieškoti bylose + Ieškoti aplankuose + Ieškoti bylose ir aplankuose + Ieškoti grojaraščiuose + Ieškoti atlikėjų + Ieškoti albumų + Ieškoti garso takelių + Ieškoti teksto + Ieškoti pokalbių + Ieškoti įrašų + + Filtras + Filtras (Pro) + Nerasta jokių elementų. + Keisti filtrą + + Yra reikalingas saugyklos leidimas + Yra reikalingas kontaktų leidimas + Yra reikalingas fotoaparato leidimas + Yra reikalingas garso leidimas + Nėra leidimo + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Pervadinti failą + Pervadinti aplanką + Nepavyko pervadinti failo + Nepavyko pervadinti aplanko + Aplanko pavadinimas negali būti tuščias + Aplankas tokiu pavadinimu jau yra + Negalima pervadinti šakninio saugyklos aplanko + Aplankas sėkmingai pervadintas + Pervadinamas aplankas + Failo pavadinimas negali būti tuščias + Failo pavadinime yra negalimų simbolių + Failo pavadinime „%s“ yra negalimų simbolių + Prievardis negali būti tuščias + Pradinio failo %s nėra + Prieš failo pavadinimą + Po failo pavadinimo + Paprastas pervadinimas + Šablonas + String to add + %Y - metai +\n%M - mėnesis +\n%D - diena +\n%h - valanda +\n%m - minutė +\n%s - sekundė +\n%i - nuo 1 didėjantis skaičius + Failo pavadinimas (be .txt) + Failo pavadinimas (be .json) + Failo pavadinimas (be .zip) + "Pradedant nuo Android 11 versijos, šitaip nebegalima slėpti bylų ir aplankų" + + Kopijuoti + Perkelti + Kopijuoti / Perkelti + Kopijuoti į + Perkelti į + Šaltinis + Paskirtis + Pasirinkite paskirties vietą + Spustelėkite čia, norėdami pasirinkti paskirties vietą + Nepavyko rašyti į pasirinktą paskirties vietą + Pasirinkite paskirties vietą + Pradinė ir paskirties vieta negali būti tokios pačios + Nepavyko nukopijuoti failų + Kopijuojama… + Failai sėkmingai nukopijuoti + Failas sėkmingai nukopijuotas + Įvyko klaida + Perkeliama… + Failai sėkmingai perkelti + Failas sėkmingai perkeltas + Kai kurių failų nepavyko perkelti + Kai kurių failų nepavyko nukopijuoti + Nepažymėta jokių failų + Įrašoma… + Nepavyko sukurti aplanko %s + Nepavyko sukurti failo %s + Nerasta jokių naujų elementų + Paskirties vietoje trūksta laisvos vietos.\nReikia %1$s, o yra prieinama %2$s + System service for selecting files and folders is unavailable + + Sukurti naują + Aplanką + Failą + Sukurti naują aplanką + Failas ar aplankas tokiu pavadinimu jau yra + Pavadinime yra neleistinų simbolių + Įveskite pavadinimą + Įvyko nežinoma klaida + + Failas „%s“ jau yra + Failas „%s“ jau yra. Perrašyti\? + Aplankas „%s“ jau yra + Sulieti + Palikti abu + Perrašyti + Praleisti + Pridėti prie pavadinimo „_1“ + Taikyti visiems + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + Pasirinkite aplanką + Pasirinkite failą + Patvirtinkite prieigą prie išorinės saugyklos + Confirm folder access + Kitame ekrane pasirinkite šakninį SD kortelės aplanką, kad suteiktumėte rašymo prieigą + Jei nematote SD kortelės, pabandykite štai ką + Leiskite programėlei gauti prieigą prie pasirinktos saugyklos, kitame ekrane, apačioje paspausdami „Naudoti šį aplanką“. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Patvirtinti žymėjimą + Loading… + Suteikite programėlei prieigą prie visų failų. Be jos, programėlė gali tinkamai neveikti. + + %d elementas + %d elementai + %d elementų + + + + %d elementą + %d elementus + %d elementų + + + Ištrinamas %d elementas + Ištrinami %d elementai + Ištrinama %d elementų + + + + %d adresatas + %d adresatai + %d adresatų + + + Pasirinkite saugyklą + Storage + Vidinė atmintis + SD kortelė + Root + Pasirinktas neteisingas aplankas, pasirinkite pagrindinį SD kortelės aplanką + SD kortelė ir USB įrenginio keliai negali būti tokie patys + Atrodo, kad esate įdiegę programėlę SD kortelėje. Tai padaro programėlės valdiklius neprieinamus. Jūs net jų nematysite prieinamų valdiklių sąraše. Tai yra sisteminis apribojimas, todėl, jei norite naudotis valdikliais, turite perkelti programėlę atgal į vidinę atmintį. + Wrong folder selected, please select path \'%s\' + + Savybės + Kelias + Pažymėtų elementų skaičius + Tiesioginių pavaldinių elementų skaičius + Bendras failų skaičius + Raiška + Trukmė + Atlikėjas + Albumas + Židinio nuotolis + Išlaikymas + ISO greitis + F-number + Fotoaparatas + EXIF + Dainos pavadinimas + GPS koordinatės + Altitudė + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Fono spalva + Teksto spalva + Pirminė spalva + Balto apipavidalinimo paryškinimo spalva + Juodai balto apipavidalinimo paryškinimo spalva + Priekinio plano spalva + Programėlės piktogramos spalva + Apatinės naršymo juostos spalva + Atkurti numatytuosius + Naudoti numatytąjį + Numatytasis + Keisti spalvą + Apipavidalinimas + Pakeitus spalvą bus perjungta į tinkintą apipavidalinimą + Įrašyti + Atmesti + Atšaukti pakeitimus + Ar tikrai norite atšaukti pakeitimus\? + Šio veiksmo neįmanoma atšaukti. + Yra neįrašytų pakeitimų. Įrašyti prieš išeinant\? + Taikyti spalvas visoms paprastoms programėlėms + ĮSPĖJIMAS: Kai kurios paleidyklės tinkamai neapdoroja programėlės piktogramos tinkinimo. Jei piktograma išnyks, pabandykite, jei prieinama, paleisti programėlę per „Google Play“ ar per kokį nors valdiklį. Paleidę programėlę, atstatykite numatytąją oranžinę piktogramą #F57C00. Blogiausiu atveju, jums gali tekti įdiegti programėlę iš naujo. + Spalvos sėkmingai atnaujintos. Buvo pridėtas naujas apipavidalinimas, pavadinimu, „Bendrinamas“, naudokite jį, visų programėlių spalvų atnaujinimui ateityje. + Turėkite omenyje, kad nors naudojate programėlės „Pro“ versiją, jums vis tiek, dėl techninių priežasčių, reikia turėti įdiegtą programėlę „Paprastas ačiū“. Ji pasirūpina spalvų sinchronizavimu. + Įsigykite programėlę <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>„Paprastas ačiū“</a>, kad atrakintumėte šią funkciją ir palaikytumėte programėlių plėtojimą. Dėkojame! + + Šviesus + Tamsus + Automatinis + Auto light / dark + Švytintis + Tamsiai raudonas + Baltas + Juodai baltas + Tinkintas + Bendrinamas + System default + + Kas naujo + * čia yra išvardyti tik svarbesni atnaujinimai, bet visada yra ir smulkesnių + + Ištrinti + Šalinti + Pervadinti + Bendrinti + Bendrinti per + Keisti dydį + Žymėti viską + Žymėti tekstą + Slėpti + Nebeslėpti + Slėpti aplanką + Nebeslėpti aplanko + Laikinai rodyti paslėptus + Neberodyti paslėptos medijos + Negalite bendrinti tiek daug turinio vienu metu + Išvalyti ir išjungti šiukšlinę + Atšaukti + Grąžinti + Spausdinti + Spausdinti (Pro) + Shortcut + Sukurti šaukinį + Sukurti šaukinį (Pro) + Pridėti numerį, su kuriuo galima susisiekti + View contact details + Skambinti iš SIM kortelės 1 + Skambinti iš SIM kortelės 2 + Perjungti failo pavadinimo matomumą + Perkelti į viršų + Perkelti į apačią + Pin item + Atsegti elementą + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Rikiuoti pagal + Pavadinimą + Dydį + Paskutinį modifikavimą + Sukūrimo datą + Fotografavimo datą + Pavadinimą + Failo pavadinimą + Failo prievardį + Atsitiktinė + Rikiuoti atsitiktine tvarka + Didėjančiai + Mažėjančiai + Naudoti tik šiam aplankui + Rikiuoti reikšmes su skaičiais pagal tikrąsias reikšmes + Vardas + Antras vardas + Pavardė + Visas vardas + Naudoti tinkintą rikiavimą + Keisti tvarką + + Ar tikrai norite ištrinti? + Ar tikrai norite ištrinti %s\? + Delete %s? + + Ar tikrai norite perkelti %s į šiukšlinę\? + + Ar tikrai norite ištrinti šį elementą\? + Ar tikrai norite perkelti šį elementą į šiukšlinę\? + Šiame seanse daugiau nebeklausti + Daugiau neberodyti + Taip + Ne + Galbūt + + ĮSPĖJIMAS: Jūs ištrinate %d aplanką + ĮSPĖJIMAS: Jūs ištrinate %d aplankus + ĮSPĖJIMAS: Jūs ištrinate %d aplankų + + + PIN kodas + Įvesti PIN kodą + Įveskite PIN kodą + Neteisingas PIN kodas + Pakartokite PIN kodą + Šablonas + Įveskite šabloną + Neteisingas šablonas + Pakartokite šabloną + Biometrika + Piršto atspaudas + Pridėti piršto atspaudą + Uždėkite pirštą ant piršto atspaudo jutiklio + Atverti biometrinio ID patvirtinimo dialogą + Nustatyti tapatybę + Nepavyko nustatyti tapatybės + Tapatybės nustatymas užblokuotas, netrukus bandykite dar kartą + Neturite jokių registruotų piršto atspaudų, įtraukite juos savo įrenginio nustatymuose + Pereiti į nustatymus + Slaptažodis sėkmingai nustatytas. Jeigu jį pamiršite, įdiekite programėlę iš naujo. + Apsauga sėkmingai nustatyta. Jei kils problemų su apsaugos atstatymu, įdiekite programėlę iš naujo. + Užrakinti aplanką + Užrakinti aplanką (Pro) + Atrakinti aplanką + Ši apsauga veikia tik šioje programėlėje ir ji nepakeičia tikrojo aplankų šifravimo sistemos mastu. + + Vakar + Šiandien + Rytoj + Every day + Slėpti metus + sekundės + minutės + valandos + dienos + sek. + min. + val. + wk. + + %d sekundė + %d sekundės + %d sekundžių + + + %d minutė + %d minutės + %d minučių + + + %d valanda + %d valandos + %d valandų + + + %d diena + %d dienos + %d dienų + + + %d savaitė + %d savaitės + %d savaičių + + + %d mėnuo + %d mėnesiai + %d mėnesių + + + %d metai + %d metai + %d metų + + + + %d sekundės + %d sekundžių + %d sekundžių + + + %d minutės + %d minučių + %d minučių + + + %d valandos + %d valandų + %d valandų + + + %d dienos + %d dienų + %d dienų + + + %d savaitės + %d savaičių + %d savaičių + + + %d mėnesio + %d mėnesių + %d mėnesių + + + %d metų + %d metų + %d metų + + + + %d sekundę prieš įvykį + %d sekundes prieš įvykį + %d sekundžių prieš įvykį + + + %d minutę prieš įvykį + %d minutes prieš įvykį + %d minučių prieš įvykį + + + %d valandą prieš įvykį + %d valandas prieš įvykį + %d valandų prieš įvykį + + + %d dieną prieš įvykį + %d dienas prieš įvykį + %d dienų prieš įvykį + + + %d savaitę prieš įvykį + %d savaites prieš įvykį + %d savaičių prieš įvykį + + + %d mėnesį prieš įvykį + %d mėnesius prieš įvykį + %d mėnesių prieš įvykį + + + %d metus prieš įvykį + %d metus prieš įvykį + %d metų prieš įvykį + + + + %d sekundei + %d sekundėms + %d sekundžių + + + %d minutei + %d minutėms + %d minučių + + + %d valandai + %d valandoms + %d valandų + + + %d dienai + %d dienoms + %d dienų + + + %d savaitei + %d savaitėms + %d savaičių + + + %d mėnesiui + %d mėnesiams + %d mėnesių + + + %d metams + %d metams + %d metų + + + Liko laiko iki tol, kol suveiks žadintuvas:\n%s + Liko laiko iki tol, kol suveiks priminimas:\n%s + Time remaining:\n%s + Prieš pasitikėdami žadintuvu, įsitikinkite, kad jis tinkamai veikia. Jis gali tinkamai neveikti dėl sisteminių apribojimų, susijusių su akumuliatoriaus energijos taupymu. + Prieš pasitikėdami priminimais, įsitikinkite, kad jie tinkamai veikia. Patikrinkite savo įrenginio akumuliatoriaus ir pranešimų nustatymus, ar nėra jokių veiksnių, kurie blokuoja priminimus ar nutraukia programėlės darbą fone. + Šios programėlės pranešimai yra išjungti. Norėdami juos įjungti, pereikite į savo įrenginio nustatymus. + + Žadintuvas + Snausti + Atmesti + Be priminimo + Įvykio pradžioje + Sistemos garsai + Jūsų garsai + Pridėti naują garsą + Be garso + Dienos metu vv:mm + Dienos metu ties %02d:%02d + + Nustatymai + Įsigyti „Paprastą ačiū“ + Bendri + Spalvos tinkinimas + Improved color customization + Tinkinti spalvas + Tinkinti spalvas (Užrakinta) + Locked + Tinkinti valdiklių spalvas + Tinkinti pranešimus + Notification sound + Naudoti anglų kalbą + Language + Rodyti paslėptus elementus + Šrifto dydis + Mažas + Vidutinis + Didelis + Labai didelis + Apsaugoti slaptažodžiu paslėptų elementų matomumą + Apsaugoti slaptažodžiu visą programėlę + Apsaugoti slaptažodžiu failų ištrynimą ir perkėlimą + Vykdant operacijas su failais, palikti seną „paskiausio modifikavimo“ reikšmę + Tempiant slankjuostę, rodyti informacinį burbulą ties slenkamais elementais + Neleisti telefonui užmigti tol, kol programėlė veikia priekiniame plane + Visada praleisti ištrynimo patvirtinimo dialogą + Įjungti traukimo iš viršaus gestą, kuris įkelia iš naujo + Naudoti 24 valandų formatą + Keisti datos ir laiko formatą + Pradėti savaitę nuo sekmadienio + Valdikliai + Visada naudoti tokį patį snaudimo laikotarpį + Snaudimo laikotarpis + Vibruoti, kai paspaudžiami mygtukai + Vietoje ištrynimo, perkelti elementus į šiukšlinę + Šiukšlinės išvalymo intervalas + Išvalyti šiukšlinę + Priverstinai naudoti stačią veikseną + Eksportuoti nustatymus + Importuoti nustatymus + Nustatymai sėkmingai eksportuoti + Nustatymai sėkmingai importuoti + Pirmiausia, rodyti pavardę + Išvalyti podėlį + Prieš inicijuojant skambutį, rodyti patvirtinimo dialogą + + Matomumas + Saugumas + Slinkimas + Operacijos su failais + Šiukšlinė + Įrašymas + Paleidimas + Tekstas + Perkėlimas + Kokybė + Pagrindinis ekranas + Miniatiūros + Sąrašo rodinys + + Išskirti + Exclude folder + Išskirti aplankai + (neįtraukta) + Tvarkyti išskirtus aplankus + Pašalinti visus + Pašalinti visus aplankus iš išskirtųjų sąrašo\? Tai neištrins aplankų. + Temporarily show excluded + Stop showing excluded + + Tvarkyti rodomas korteles + Kortelė, kuri bus rodoma atvėrus šią programėlę + Adresatai + Mėgstami + Skambučių istorija + Grupės + Paskiausiai naudota + Failai + Paskiausi failai + + Atkurti šį failą + Atkurti pažymėtus failus + Atkurti visus failus + Šiukšlinė sėkmingai išvalyta + Failai sėkmingai atkurti + Ar tikrai norite išvalyti šiukšlinę\? Failai bus prarasti visam laikui. + Šiukšlinė yra tuščia + Šiušklinės elementų perkėlimas yra išjungtas, naudokite „Atkurti“ + Rodyti šiukšlinę + Slėpti šiukšlinę + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Perkeliamas %d elementas į šiukšlinę + Perkeliami %d elementai į šiukšlinę + Perkeliama %d elementų į šiukšlinę + + + Importuojama… + Eksportuojama… + Importuota sėkmingai + Eksportuota sėkmingai + Importavimas nepavyko + Eksportavimas nepavyko + Kai kurių įrašų importuoti nepavyko + Kai kurių įrašų eksportuoti nepavyko + Nerasta jokių įrašų importavimui + No new entries for importing have been found + Nerasta jokių įrašų eksportavimui + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Atrodo, kad prie savo įrenginio prijungėte USB atmintuką. Norint užtikrinti, kad jo failai bus tinkamai atvaizduojami, turite suteikti papildomus leidimus. + Kitame ekrane pasirinkite šakninį USB atmintuko aplanką, kad suteiktumėte prieigą + Pasirinktas neteisingas aplankas, pasirinkite pagrindinį USB atmintuko aplanką + + Sausis + Vasaris + Kovas + Balandis + Gegužė + Birželis + Liepa + Rugpjūtis + Rugsėjis + Spalis + Lapkritis + Gruodis + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + sausį + vasarį + kovą + balandį + gegužę + birželį + liepą + rugpjūtį + rugsėjį + spalį + lapkritį + gruodį + Pirmadienis + Antradienis + Trečiadienis + Ketvirtadienis + Penktadienis + Šeštadienis + Sekmadienis + P + A + T + K + P + Š + S + Pir + Ant + Tre + Ket + Pen + Šeš + Sek + + Jūsų programėlės versija daugiau nebebus atnaujinama. Atsinaujinkite į „Pro“ versiją, kad gautumėte naujus klaidų ištaisymus ir kitus patobulinimus. + Jūsų programėlės versija daugiau nebebus atnaujinama. Spusteldami čia, atsinaujinkite į „Pro“ versiją, kad gautumėte naujus klaidų ištaisymus ir kitus patobulinimus. + Tai yra nemokama iki: %s. Jei atsisiųsite iki to laiko, galėsite nemokamai ja naudotis neribotą laiką. + Daugiau informacijos + Naujinti + Vietos mastu saugomus įvykius turite perkelti rankiniu būdu, eksportuodami juos į .ics failą, o tuomet importuodami. Eksportavimo ir importavimo mygtukus galite rasti pagrindinio ekrano meniu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Apie + Website + Pirminį kodą rasite apsilankę adresu + Siųskite atsiliepimus ir pasiūlymus adresu + Naujinti į „Pro“ + Daugiau programėlių + Kitos mūsų programėlės + Pasiūlykite draugams + Labas, išbandyk programėlę, pavadinimu „%1$s“, kurią gali atsisiųsti adresu %2$s + Pasiūlyti per + Įvertinkite mus + Įvertinti + Paaukoti + Sekite mus + v %1$s +\nAutorių teisės © Simple Mobile Tools %2$d + Palaikymas + Padėkite mums + Socialiniai tinklai + Kita + Privacy policy + Versija %s + Sveiki :) + Sukurta su ❤️ Slovakijoje + Papildoma informacija + Programėlės versija: %s + Įrenginio OS: %s + Sveiki,<br><br> tikimės, jog jums patinka naudotis programėle. Joje nėra jokių reklamų, tad, prašome, palaikykite jos plėtojimą įsigydami programėlę, pavadinimu <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>„Paprastas ačiū“</a>. Jos dėka, šis dialogas daugiau nebebus rodomas.<br><br> Dėkojame! + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Įsigyti + Get Simple Phone + Atnaujinkite programėlę „Paprastas ačiū“ iki naujausios versijos + Prieš užduodami klausimą, pasižiūrėkite programėlės nustatymuose ir, iš pradžių, perskaitykite dažniausiai užduodamus klausimus. Galbūt, sprendimas yra aprašytas ten. + Prieš mus įvertindami, pasižiūrėkite programėlės nustatymuose ir, iš pradžių, perskaitykite dažniausiai užduodamus klausimus. Galbūt, sprendimas yra aprašytas ten. + Be to, įsitikinkite, kad naudojate naujausią programėlės versiją. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Skaityti + Skaityti DUK + Sveiki, +\n +\natrodo, kad jau kurį laiką naudojatės šia programėle ir mes labai tai vertiname. +\n +\nJeigu jūs nieko prieš, norėtume jūsų paprašyti įvertinti mus „Google Play“ parduotuvėje. Tai labai mums padėtų. +\n +\nNepaisant to, ką benuspręstumėte, šis pranešimas daugiau nebebus jums rodomas. +\n +\nDėkojame! + Įvertinkite, prašome, mūsų programėlę :) + Ačiū + Valdiklis yra užrakintas. +\nAtsinaujinkite į „Pro“ versiją, norėdami jį atrakinti. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + Sveiki,<br><br> tiesiog, norime jums pranešti, kad neseniai buvo išleistos naujos programėlės:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Galite jas atsisiųsti, spusteldami ant jų pavadinimų ar piktogramų.<br><br>Ačiū + Paprasta programėlių paleidyklė + Paprastas skaičiuotuvas + Paprastas kalendorius + Paprasta kamera + Paprastas laikrodis + Paprasti adresatai + Paprastas rinkiklis + Paprastas piešimas + Paprasta failų tvarkytuvė + Paprastas žibintuvėlis + Paprasta galerija + Paprasta klaviatūra + Simple Launcher + Paprastas muzikos grotuvas + Paprasti užrašai + Paprastos SMS žinutės + Paprastas ačiū + Paprastas garso rašytuvas + Programėlių paleidyklė + Skaičiuotuvas + Kalendorius + Fotoaparatas + Laikrodis + Adresatai + Numerio rinkiklis + Piešimas + Failų tvarkytuvė + Žibintuvėlis + Galerija + Klaviatūra + Launcher + Muzikos grotuvas + Užrašai + Žinutės + Ačiū + Garso rašytuvas + Atrodo, kad jūsų programėlės versija yra pažeista. Atsisiųskite originalią versiją iš <a href=%s>čia</a>. + + Dažniausiai užduodami klausimai + Prieš užduodami klausimą, iš pradžių, perskaitykite + Kodėl valdiklių sąraše nematau šios programėlės valdiklio\? + Greičiausiai, taip yra dėl to, kad perkėlėte programėlę į SD kortelę. Yra „Android“ sistemos apribojimas, kuris tokiu atveju paslepia nurodytos programėlės valdiklius. Vienintelis sprendimas yra per įrenginio nustatymus perkelti programėlę atgal į vidinę atmintį. + Aš noriu jus paremti, bet neturiu galimybės paaukoti pinigų. Ar yra kas nors, ką galiu padaryti\? + Žinoma, yra. Galite skleisti žinią apie programėles arba teikti gerus atsiliepimus ir įvertinimus. Be to, galite padėti versdami programėles į naują kalbą arba atnaujindami esamus vertimus. Vertimo vadovą, galite rasti <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>šioje svetainėje</a> arba, tiesiog, jei turite klausimų, susisiekite su mumis el. paštu <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>. + Aš per klaidą ištryniau keletą failų, kaip galiu juos atkurti\? + Deja, to padaryti negalite. Failai yra ištrinami iš karto po patvirtinimo dialogo, o šiukšlinė yra neprieinama. + Man nepatinka valdiklio spalvos, kaip galiu jas pakeisti\? + Kai velkate valdiklį į pagrindinį ekraną, atsiranda valdiklio konfigūracijos ekranas. Apatiniame kairiajame kampe pamatysite spalvotus kvadratus. Tiesiog, paspauskite ant jų, kad pasirinktumėte naują spalvą. Be to, galite naudoti slankiklį, norėdami reguliuoti permatomumą. + Ar galiu kaip nors atkurti ištrintus failus\? + Jeigu tikrai juos ištrynėte, jų atkurti nebegalite. Vis dėlto, pagal numatymą yra įjungta šiukšlinė ir failai yra neištrinami, o vietoj to, perkeliami į ją. + Programėlės paleidyklės piktograma dingo. Ką daryti\? + Taip yra todėl, kad jūsų paleidyklė tinkamai nepalaiko piktogramos tinkinimo. Jei prieinama, pabandykite paleisti programėlę per „Google Play“ ar per kokį nors valdiklį. Paleidę programėlę, atstatykite numatytąją oranžinę piktogramą #F57C00. Blogiausiu atveju, jums gali tekti įdiegti programėlę iš naujo. + Pinigai buvo nuskaičiuoti nuo mano banko sąskaitos, o aš vis tiek negaliu atsisiųsti programėlės. Ką daryti\? + Mokėjimus pilnai apdoroja „Google“, jų sistema laikas nuo laiko stringa. Tiesiog, išvalykite „Google Play“ programėlės podėlį ir paleiskite įrenginį iš naujo, o tuomet, bandykite atsisiųsti programėlę. + Kodėl turėčiau atsinaujinti į „Pro“ versiją\? + Kadangi jūsų programėlės versija daugiau nebeatnaujinama, klaidos, kurias galbūt pastebėjote, nebebus ištaisomos. Be to, nebebus pridedamos jokios naujos funkcijos. Už nedidelę pinigų sumą, per „Google Play“ galite įsigyti „Pro“ versiją. Tai yra vienkartinis mokestis, kas reiškia, jog vieną kartą įsigiję, daugiau nebeturėsite mokėti dar kartą. Netgi, jei įsigysite naują įrenginį. Jeigu „Pro“ versija jums nepatiks, per kelias valandas galėsite ją pašalinti ir pinigai bus jums grąžinti automatiškai. Jei pinigus norėsite susigrąžinti vėliau, tiesiog, susisiekite su mumis el. paštu hello@simplemobiletools.com ir mes juos grąžinsime. + Kaip vienu metu galiu pažymėti kelis elementus\? + Yra keli būdai, kaip galima tą padaryti. Pirmas būdas, tai įjungti žymėjimo veikseną, paspaudus ir ilgai palaikius ant vieno elemento, o tuomet trumpai paspaudžiant ant kitų, norimų pažymėti, elementų. Antras būdas yra panašus į tą, kuris naudojamas kompiuteriuose žymint elementus pele. Tiesiog, įjunkite žymėjimo veikseną paspaudę ir ilgai palaikę ant vieno elemento, o tuomet neatleisdami piršto, tempkite jį žemyn per kitus elementus, kad juos pažymėtumėte. Trečias būdas, kaip pažymėti kelis elementus, yra paspausti ir ilgai palaikyti ant vieno elemento, tuomet paspausti ir ilgai palaikyti ant kito elemento, ir viskas, kas yra tarp šių dviejų elementų, bus pažymėta. Jei norite pažymėti visus elementus, paspauskite ir ilgai palaikykite ant vieno elemento, o tuomet viršutiniame kairiajame kampe spustelėkite ant pažymėtų elementų skaitiklio. Tai viską pažymės arba nuims žymėjimą nuo visų elementų. + Aš įsigijau programėlę, bet negaliu jos atsisiųsti kitame įrenginyje. + Pabandykite išvalyti „Google Play“ programėlės podėlį ir paleiskite savo įrenginį iš naujo. Tai yra „Google Play“ triktis, kuri nėra susijusi su įsigyta programėle. + + Talkininkai + Vertimas + Plėtojimas + Kita pagalba + Šiame sąraše yra žmonės, kurie daug prisidėjo prie visų „Simple Mobile Tools“ rinkinio programėlių, o ne vien tik prie šios. Programėles į kitas kalbas verčia savanoriai, tad praneškite mums, jei taip pat norite padėti. Vertimo vadovą rasite <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>šioje svetainėje</a> arba, jei turite klausimų, susisiekite su mumis el. paštu <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>. Dėkojame visiems, kas prisidėjo ar kitaip mus palaikė! + Arabų + Azerbaidžaniečių + Bengalų + Bretonų + Bulgarian + Katalonų + Čekų + Valų + Danų + English + Vokiečių + Graikų + Ispanų + Baskų + Persų + Suomių + Prancūzų + Galisų + Hindi + Kroatų + Vengrų + Indoneziečių + Italų + Hebrajų + Japonų + Korėjiečių + Lietuvių + Nepaliečių + Norvegų + Olandų + Lenkų + Portugalų + Rumunų + Rusų + Slovakų + Slovėnų + Serbų + Švedų + Tamilų + Turkų + Ukrainiečių + Vietnamiečių + Kinų (Honkongas) + Kinų(Supaprastinta) + Kinų (Tradicinė) + + Gaukite „Pro“ versiją dabar! + Pagrindinė + „Pro“ + Jokių reklamų + Nereikalauja prieigos prie interneto + 100% pinigų grąžinimo garantija + One time payment + Patobulintas dizainas + + Išplėstinis nuotraukų redaktorius + Advanced photo & video editor + HEIC/HEIF failų palaikymas + Išplėstinis masinis failų pervadinimas + Atskirų aplankų užrakinimas + Spausdinimo palaikymas + + Laiko juostos palaikymas + Kviestiniai ir priminimai el. paštu + Lengvas įvykių importavimas + Nauji valdikliai + + Patobulintas besidubliuojančių adresatų sujungimas + Šrifto dydžio tinkinimas + Pasirinktinis privačių adresatų bendrinimas tarp mūsų programėlių + Tinkinamos adresatų skambučio melodijos + Adresatų filtravimas + Privately stored contacts + + Kontroliniai sąrašai + Kiekviename valdiklyje skirtingi užrašai ir spalvos + Užrašų užrakinimas + + Datos ir laiko formato tinkinimas + Šaukiniai pradiniame ekrane + Failų glaudinimo palaikymas + Kortelė su paskiausiais failais + + Fono spalvos tinkinimas + Failų importavimo palaikymas + Mastelio keitimas + + Ši programėlė naudoja trečiųjų šalių bibliotekas, kurios palengvina man gyvenimą. Dėkoju. + Trečiųjų šalių licencijos + Kotlin (programavimo kalba) + Subsampling Scale Image View (atvaizdų rodinio mastelio keitimui) + Glide (atvaizdų įkėlimas ir podėliavimas) + Picasso (atvaizdų įkėlimas ir podėliavimas) + Android Image Cropper (atvaizdų apkarpymui ir pasukimui) + RtlViewPager (perbraukimui iš dešinės į kairę) + Joda-Time („Java“ duomenų pakeitimui) + Stetho (derinimo duomenų bazės) + Otto (įvykių magistralė) + PhotoView (keičiamo mastelio GIF atvaizdai) + PatternLockView (apsauga šablonu) + Reprint (apsauga piršto atspaudu) + Gif Drawable (GIF atvaizdų įkėlimas) + AutoFitTextView (teksto dydžio keitimas) + Robolectric (testavimo karkasas) + Espresso (testavimo pagelbiklis) + Gson (JSON analizatorius) + Leak Canary (atminties nutekėjimo detektorius) + Number Picker (tinkinamas skaitmenų parinkiklis) + ExoPlayer (vaizdo grotuvas) + VR Panorama View (panoramų atvaizdavimas) + Apache Sanselan (atvaizdų metaduomenų skaitymas) + Android Photo Filters (atvaizdų filtrai) + Gesture Views (keičiamo dydžio atvaizdai) + Indicator Fast Scroll (raidės ant slankjuostės) + Event Bus (susisiekimas programėlės viduje) + Audio Record View (garso vizualizavimas) + SMS MMS (SMS ir MMS apdorojimas) + APNG Android (animuotų WebP palaikymas) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + PASENUSI: Ši programėlės versija daugiau nebeprižiūrima, gaukite „Pro“ versiją, adresu https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Nepamirškite, jog jeigu per 2 valandas pašalinsite bet kurią mokamą programėlę, jums automatiškai bus grąžinti pinigai. Jei norėsite susigrąžinti pinigus vėliau, susisiekite su mumis el. paštu hello@simplemobiletools.com ir juos atgausite. Tokiu būdu galite lengvai išbandyti programėlę :) + + Paprastų, atvirojo kodo „Android“ progamėlių rinkinys su tinkinamais valdikliais, be reklamų ir nereikalingų leidimų. + diff --git a/commons/src/main/res/values-ml/strings.xml b/commons/src/main/res/values-ml/strings.xml new file mode 100644 index 000000000..7fba3af79 --- /dev/null +++ b/commons/src/main/res/values-ml/strings.xml @@ -0,0 +1,1092 @@ + + + OK + Cancel + Back + Nothing + Later + Save as + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Open with + Edit with + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Unknown + Always + Never + Details + Notes + Deleting folder \'%s\' + None + Label + Transparent + Transparent color + Select a different color + Download + Notification + Notifications + Email + Previous + Play / Pause + Next + Number + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + ഫോട്ടോ എടുക്കുക + ഫോട്ടോ തിരഞ്ഞെടുക്കുക + Choose video + Choose contact + Choose file + Record audio + Record video + പുതുക്കുന്നു… + ഫോൺ സ്റ്റോറേജ് + ഫോൺ സ്റ്റോറേജ് (മറ്റ് അപ്ലിക്കേഷനുകൾക്ക് ദൃശ്യമല്ല) + Audio + + ജന്മദിനം + വാർഷികം + + Home + Work + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Favorites + Add favorites + Add to favorites + Remove from favorites + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Filter + Filter (Pro) + No items found. + Change filter + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d item + %d items + + + + %d item + %d items + + + Deleting %d item + Deleting %d items + + + + %d contact + %d contacts + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + Delete + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + + Are you sure you want to move %s into the Recycle Bin? + + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Yes + No + Maybe + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + minutes + hours + days + s + m + h + wk. + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + Alarm + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + ബട്ടൺ അമർത്തുമ്പോൾ വൈബ്രേറ്റ് ചെയ്യുക + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + Exclude + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + January + February + March + April + May + June + July + August + September + October + November + December + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + M + T + W + T + F + S + S + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + About + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + Rate us + Rate + Donate + Follow us + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + here. + ]]> + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-nb-rNO/strings.xml b/commons/src/main/res/values-nb-rNO/strings.xml new file mode 100644 index 000000000..8aa82b573 --- /dev/null +++ b/commons/src/main/res/values-nb-rNO/strings.xml @@ -0,0 +1,1093 @@ + + + OK + Avbryt + Back + Ingenting + Later + Lagre som + Fil vellykket lagret + Ugyldig filformat + Feil: Tomt for minne + En feil oppstod: %s + Error: %s + Åpne med + Rediger med + Edit + Ingen gyldig app funnet + No browser found + No email client found + Sett som + Kopier til utklippstavle + Copy number to clipboard + Verdi kopiert til utklippstavle + Verdi kopiert til utklippstavle:\n%s + Dial number + Ukjent + Alltid + Aldri + Detaljer + Notes + Sletter mappen \'%s\' + Ingen + Påskrift + Transparent + Transparent color + Select a different color + Download + Varsel + Varsler + Email + Previous + Play / Pause + Next + Number + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Verdi + Verdien kan ikke være tom + Opprett ny kontakt + Legg til i eksisterende kontakt + App Corrupt + Disclaimer + Ta bilde + Velg bilde + Velg video + Velg kontakt + Velg fil + Ta opp lyd + Ta opp video + Oppdaterer … + Telefonlager + Telefonlager (ikke synlig for andre programmer) + Lyd + + Fødselsdag + Jubileum + + Privat + Arbeid + + Mobil + Hovednummer + Arbeidsfaks + Hjemmefaks + Personsøker + Fant ikke noe telefonnummer + + Endre visningstype + Rutenett + Rutenett (Pro) + Uneven Grid + Liste + Øk antall kolonner + Reduser antall kolonner + Column count + Portrait column count + Landscape column count + Endre omslagsbilde + Velg foto + + %d column + %d columns + + + Håndter blokkerte numre + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Favoritter + Legg til favoritter + Legg til i favorittene + Fjern fra favorittene + + Søk + Search in %s + Skriv inn minst 2 tegn for å starte søket. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Filter + Filter (Pro) + Ingen elementer funnet. + Endre filter + + Tillatelse for lagring kreves + Tillatelse for kontakter kreves + Tillatelse for kamera kreves + Tillatelse for lyd kreves + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Endre navn på fil + Endre navn på mappe + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + Kopier + Flytt + Kopier / Flytt + Kopier til + Flytt til + Kilde + Mål + Velg mål + Trykk her for å velge mål + Kunne ikke skrive til det valgte målet + Velg et mål + Kilde og mål kan ikke være det samme + Kunne ikke kopiere filene + Kopierer… + Filer ble kopiert vellykket + File copied successfully + En feil oppstod + Flytter… + Filer ble flyttet vellykket + File moved successfully + Noen filer kunne ikke flyttes + Noen filer kunne ikke kopieres + Ingen filer valgt + Lagrer… + Kunne ikke opprette mappen %s + Kunne ikke opprette filen %s + Ingen nye elementer er funnet + Det er ikke nok plass tilgjengelig.\nKreves %1$s, tilgjengelig %2$s + System service for selecting files and folders is unavailable + + Opprett ny + Mappe + Fil + Opprett ny mappe + En fil eller mappe med det navnet finnes allerede + Navnet inneholder ugyldige tegn + Oppfør et navn + En ukjent feil oppstod + + Filen \"%s\" finnes allerede + Filen \"%s\" finnes allerede. Overskrive? + Mappen \"%s\" finnes allerede + Sammenslå + Behold begge + Overskriv + Hopp over + Tilføy \'_1\' + Bruk på alle konflikter + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + Velg en mappe + Velg en fil + Bekreft ekstern lagringstilgang + Confirm folder access + Velg rotmappen til SD-kortet på den neste skjermen for å gi skrivetilgang + Hvis du ikke ser SD-kortet, prøv dette + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Bekreft valg + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d element + %d elementer + + + + %d element + %d elementer + + + Sletter %d element + Sletter %d elementer + + + + %d contact + %d contacts + + + Velg lagring + Storage + Intern + SD-kort + Rot + Feil mappe er valgt, velg rotmappen til SD-kortet + Bane for SD-kort og USB-enhet kan ikke være den samme + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + Egenskaper + Bane + Valgte elementer + Antall direkte underliggende elementer + Totale antall filer + Oppløsning + Varighet + Artist + Album + Brennvidde + Eksponeringstid + ISO-verdi + Blendertall + Kamera + EXIF + Sangtittel + GPS-koordinater + Høyde + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Bakgrunnsfarge + Tekstfarge + Primærfarge + Aksentfarge til hvitt tema + Aksentfarge til svart & hvitt tema + Forgrunnsfarge + Farge for app-ikon + Farge på nedre navigeringslinje + Gjenopprett standard + Bruk standard + Standard + Endre farge + Tema + Endring av farge vil gjøre at det skiftes til Tilpasset tema + Lagre + Forkast + Angre endringer + Er du sikker på at du vil angre dine endringer? + Denne handlingen kan ikke angres. + Du har endringer som ikke er lagret. Lagre før du avslutter? + Bruk fargene i alle Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Fargene er vellykket oppdatert. Et nytt tema kalt \'Delt\' er lagt til, bruk det for å oppdatere alle appenes farger i fremtiden. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + Lyst + Mørkt + Automatisk + Auto light / dark + Solarisert + Mørkerødt + Hvitt + Svart & hvitt + Tilpasset + Delt + System default + + Hva er nytt + * bare de større oppdateringene er oppført her, det er alltid noen mindre forbedringer også + + Slett + Fjern + Endre navn + Del + Del via + Endre størrelse + Velg alle + Select text + Skjul + Ikke skjul + Skjul mappe + Ikke skjul mappe + Vis skjulte midlertidig + Stopp å vise skjulte media + Du kan ikke dele så mye innhold på en gang + Tøm og deaktiver papirkurven + Angre + Annuler angre + Skriv ut + Skriv ut (Pro) + Shortcut + Opprett snarvei + Opprett snarvei (Pro) + Legg til nummer i kontakt + Vis kontaktdetaljer + Call from SIM 1 + Call from SIM 2 + Vis/skjul filnavn + Flytt til toppen + Flytt til bunnen + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Sorter etter + Navn + Størrelse + Sist endret + Dato opprettet + Dato tatt + Tittel + Filnavn + Filendelse + Tilfeldig + Sorter tilfeldig + Stigende + Fallende + Bruk kun for denne mappen + Sorter numeriske deler etter faktisk verdi + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + Er du sikker på at du vil fortsette med slettingen? + Er du sikker på at du vil slette %s? + Delete %s? + + Er du sikker på at du vil flytte %s til papirkurven? + + Er du sikker på at du vil slette dette elementet? + Er du sikker på at du vil flytte dette elementet til papirkurven? + Ikke spør igjen i denne økten + Ikke vis igjen + Ja + Nei + Kanskje + + ADVARSEL: Du sletter %d mappe + ADVARSEL: Du sletter %d mapper + + + PIN-kode + Oppfør PIN-kode + Oppfør en PIN-kode + Feil PIN-kode + Gjenta PIN-kode + Mønster + Tegn mønster + Feil mønster + Gjenta mønster + Biometrisk + Fingeravtrykk + Legg til fingeravtrykk + Plasser fingeren på fingeravtrykksensoren + Open biometric ID verification dialog + Autentiser + Autentisering feilet + Autentisering blokkert, prøv igjen + Du har ingen fingeravtrykk registrert, legg til i enhetens innstillinger + Gå til Innstillinger + Passord er stilt inn. Installer appen på nytt hvis du glemmer det. + Beskyttelse er stilt inn. Installer appen på nytt i tilfelle problemer med å tilbakestille. + Lås mappe + Lås mappe (Pro) + Lås opp mappe + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + I går + I dag + I morgen + Every day + Skjul år + sekunder + minutter + timer + dager + s + m + t + wk. + + %d sekund + %d sekunder + + + %d minutt + %d minutter + + + %d time + %d timer + + + %d dag + %d dager + + + %d uke + %d uker + + + %d måned + %d måneder + + + %d år + %d år + + + + %d sekund + %d sekunder + + + %d minutt + %d minutter + + + %d time + %d timer + + + %d dag + %d dager + + + %d uke + %d uker + + + %d måned + %d måneder + + + %d år + %d år + + + + %d sekund før + %d sekunder før + + + %d minutt før + %d minutter før + + + %d time før + %d timer før + + + %d dag før + %d dager før + + + %d uke før + %d uker før + + + %d måned før + %d måneder før + + + %d år før + %d år før + + + + %d sekund + %d sekunder + + + %d minutt + %d minutter + + + %d time + %d timer + + + %d dag + %d dager + + + %d uke + %d uker + + + %d måned + %d måneder + + + %d år + %d år + + + Tid igjen til alarmen går:\n%s + Tid som gjenstår til påminnelsen utløser:\n%s + Tid igjen: +\n%s + Sørg for at alarmen fungerer ordentlig før du stoler på den. Den kan fungere dårlig på grunn av systembegrensninger relatert til batterisparing. + Sørg for at påminnelsene fungerer riktig før du stoler på dem. De kan fungere dårlig på grunn av systembegrensninger relatert til batterisparing. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + Alarm + Snooze + Slå av + Ingen påminnelse + Ved start + Systemlyder + Dine lyder + Legg til en ny lyd + Ingen lyd + During the day at hh:mm + During the day at %02d:%02d + + Innstillinger + Kjøp Simple Thank You + Generelt + Fargetilpasning + Improved color customization + Tilpass farger + Tilpass farger (låst) + Locked + Tilpass modulfarger + Tilpass varsler + Varslingslyd + Bruk engelsk språk + Language + Vis skjulte elementer + Skriftstørrelse + Liten + Middels + Stor + Ekstra stor + Passordbeskytt synlighet for skjulte elementer + Passordbeskytt hele appen + Passordbeskytt sletting og flytting av filer + Behold sist-endret-verdi ved filoperasjoner + Vis en info-boble ved å dra i rullefeltet + Forhindre at telefonen går i hvilemodus mens appen er i forgrunnen + Hopp alltid over dialog for slettebekreftelse + Aktiver vertikal sveipebevegelse fra toppen for innholdsgjenoppfrisking + Bruk 24-timers tidsformat + Endre format for dato og klokkeslett + Start uken på søndag + Moduler + Bruk alltid samme intervall for Snooze + Intervall for Snooze (Slumre) + Vibrer ved trykk på knapper + Flytt elementer til papirkurven istedenfor å slette dem + Tømmeintervall for papirkurven + Tøm papirkurven + Påtving portrettmodus + Eksporter innstillinger + Importer innstillinger + Innstillinger eksportert + Innstillinger importert + Start name with surname + Tøm hurtiglager + Show a call confirmation dialog before initiating a call + + Synlighet + Sikkerhet + Rulling + Filoperasjoner + Papirkurv + Saving + Startup + Text + Overføring + Quality + Main screen + Thumbnails + List view + + Ekskluder + Exclude folder + Ekskluderte mapper + (ekskludert) + Håndter ekskluderte mapper + Fjern alle + Fjerne alle mapper fra listen av ekskluderte\? Dette sletter ikke mappene. + Vis ekskluderte midlertidig + Stopp å vise ekskluderte + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + Gjenopprett denne filen + Gjenopprett valgte filer + Gjenopprett alle filer + Papirkurven er tømt + Filer er vellykket gjenopprettet + Er du sikker på at du vil tømme papirkurven? Filene vil bli tapt permanent. + Papirkurven er tom + Moving Recycle bin items is disabled, please use Restore + Vis papirkurven + Skjul papirkurven + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Flytter %d element til papirkurven + Flytter %d elementer til papirkurven + + + Importerer… + Eksporterer… + Importering vellykket + Eksportering vellykket + Importering feilet + Eksportering feilet + Importering av noen oppføringer feilet + Eksportering av noen oppføringer feilet + Ingen oppføringer for importering er funnet + No new entries for importing have been found + Ingen oppføringer for eksportering er funnet + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Velg rotmappen til USB-enheten på den neste skjermen for å gi tilgang + Feil mappe valgt, velg rotmappen til USB-enheten din + + Januar + Februar + Mars + April + Mai + Juni + Juli + August + September + Oktober + November + Desember + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + i januar + i februar + i mars + i april + i mai + i juni + i juli + i august + i september + i oktober + i november + i desember + Mandag + Tirsdag + Onsdag + Torsdag + Fredag + Lørdag + Søndag + M + T + O + T + F + L + S + Man + Tir + Ons + Tor + Fre + Lør + Søn + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Om + Website + For kildekoden besøk + Send tilbakemelding eller forslag til + Upgrade to Pro + Flere apper + More apps from us + Inviter venner + Hey, come check out %1$s at %2$s + Inviter via + Bedøm oss + Rate + Gi et bidrag + Følg oss + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Annet + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Tilleggsinformasjon + App-versjon: %s + Operativsystem: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Kjøp + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + here. + ]]> + + + Ofte stilte spørsmål + Før du stiller et spørsmål, les først + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + This app uses the following third party libraries to make my life easier. Thank you. + Tredjepartslisenser + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (lydvisualisering) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-night-v31/colors.xml b/commons/src/main/res/values-night-v31/colors.xml new file mode 100644 index 000000000..a33b44461 --- /dev/null +++ b/commons/src/main/res/values-night-v31/colors.xml @@ -0,0 +1,12 @@ + + + @android:color/system_accent2_800 + @android:color/system_accent1_700 + @android:color/system_neutral1_900 + @android:color/system_neutral1_800 + @android:color/system_accent1_10 + @android:color/system_accent1_400 + @android:color/system_accent1_600 + @android:color/system_accent2_800 + @android:color/system_neutral1_700 + diff --git a/commons/src/main/res/values-nl/strings.xml b/commons/src/main/res/values-nl/strings.xml new file mode 100644 index 000000000..b906d6c20 --- /dev/null +++ b/commons/src/main/res/values-nl/strings.xml @@ -0,0 +1,1100 @@ + + + OK + Annuleren + Terug + Niets + Later + Opslaan als + Bestand opgeslagen + Ongeldig bestandsformaat + Onvoldoende geheugen + Fout opgetreden: %s + Fout: %s + Openen met + Bewerken met + Bewerken + Geen geldige app gevonden + Geen browser gevonden + Geen e-mailapp gevonden + Instellen als + Naar klembord kopiëren + Nummer naar klembord kopiëren + Waarde gekopieerd naar klembord + Gekopieerd naar klembord:\n%s + Nummer bellen + Onbekend + Altijd + Nooit + Details + Notities + Map \'%s\' verwijderen + Geen + Label + Transparant + Transparante kleur + Een andere kleur kiezen + Downloaden + Melding + Meldingen + E-mail + Vorige + Afspelen / Pauzeren + Volgende + Nummer + Geen contacten gevonden + Vereiste rechten vragen + De app heeft geen toegang tot de contactenlijst + App heeft geen recht om telefoongesprekken te starten, verleen het in de systeeminstellingen + Tekst hier invoegen + %s bellen + %s bellen\? + Nul + Eén + Twee + Drie + Vier + Vijf + Zes + Zeven + Acht + Negen + Waarde + Dit veld mag niet leeg zijn + Nieuw contact aanmaken + Aan bestaand contact toevoegen + App corrupt + Disclaimer + Foto nemen + Foto kiezen + Video kiezen + Contact kiezen + Bestand kiezen + Geluid opnemen + Video opnemen + Bijwerken… + Telefoonopslag + Telefoonopslag (niet zichtbaar voor andere apps) + Audio + + Verjaardag + Jubileum + + Thuis + Werk + + Mobiel + Standaard + Fax Werk + Fax Thuis + Semafoon + Geen telefoonnummer gevonden + + Weergave wijzigen + Raster + Raster (Pro) + Ongelijk raster + Lijst + Meer kolommen + Minder kolommen + Aantal kolommen + Aantal kolommen in portretmodus + Aantal kolommen in landschapsmodus + Omslagafbeelding wijzigen + Foto selecteren + + %d kolom + %d kolommen + + + Geblokkeerde nummers beheren + Er worden geen nummers geblokkeerd. + Een geblokkeerd nummer toevoegen + Nummer blokkeren + Nummers blokkeren + Geblokkeerde nummers + Geblokkeerde nummers exporteren + Geblokkeerde nummers importeren + Maak van deze app de standaard telefoon-app om nummers te kunnen blokkeren. + Als standaard instellen + Nummer \"%s\" echt blokkeren\? + Oproepen van onopgeslagen contacten blokkeren + Berichten van onopgeslagen contacten blokkeren + Voer een nummer of patroon in (bijv. *12345*, +31*8888) om alle oproepen en berichten te blokkeren van nummers die overeenkomen met het patroon. + Kan onbekende nummers niet blokkeren zonder toegang tot beller-ID\'s. + + Favorieten + Favorieten toevoegen + Aan favorieten toevoegen + Uit favorieten verwijderen + + Zoeken + Zoeken in %s + Vul tenminste 2 tekens in om de zoekopdracht te starten. + Contact zoeken + Favoriet zoeken + App zoeken + Afspraak zoeken + Groep zoeken + Geschiedenis doorzoeken + Gesprek zoeken + Bestand zoeken + Map zoeken + Bestanden en mappen zoeken + Afspeellijst zoeken + Artiest zoeken + Album zoeken + Nummer zoeken + Tekst zoeken + Gesprek zoeken + Opname zoeken + + Filter + Filteren (Pro) + Geen items gevonden. + Filter wijzigen + + Recht voor opslag is vereist + Recht voor contacten is vereist + Recht voor camera is vereist + Recht voor audio is vereist + Geen toegang + Deze app heeft het recht om meldingen te tonen nodig om herinneringen te kunnen laten zien. + Deze app heeft het recht om meldingen te tonen nodig om een voortgangsindicator te kunnen weergeven. + Deze app heeft het recht om meldingen te tonen nodig om nummers te kunnen afspelen. + Deze app heeft het recht om meldingen te tonen nodig om geluid te kunnen opnemen. + Deze app heeft het recht om meldingen te tonen nodig om te kunnen waarschuwen bij inkomende gesprekken. + Deze app heeft het recht om meldingen te tonen nodig om te kunnen waarschuwen bij nieuwe berichten. + Toestemming geven + Toestemming vereist + + Bestand hernoemen + Map hernoemen + Kon bestandsnaam niet wijzigen + Kon naam van map niet wijzigen + Mapnaam mag niet leeg zijn + Er bestaat al een map met die naam + Kan de naam van de hoofdmap van een opslag niet wijzigen + Naamwijziging is geslaagd + Map hernoemen + Bestandsnaam mag niet leeg zijn + Bestandsnaam bevat ongeldige tekens + Bestandsnaam \'%s\' bevat ongeldige tekens + Extensie mag niet leeg zijn + Bronbestand %s bestaat niet + Tekst voor bestandsnaam invoegen + Tekst na bestandsnaam invoegen + Eenvoudig hernoemen + Patroon + Toe te voegen tekst + %Y - jaar\n%M - maand\n%D - dag\n%h - uur\n%m - minuut\n%s - seconde\n%i - getal oplopend vanaf 1 + Bestandsnaam (zonder .txt) + Bestandsnaam (zonder .json) + Bestandsnaam (zonder .zip) + Vanaf Android 11 is het niet meer mogelijk om op deze manier bestanden of mappen te verbergen + + Kopiëren + Verplaatsen + Kopiëren / Verplaatsen + Kopiëren naar + Verplaatsen naar + Bron + Doel + Doel kiezen + Hier klikken om doel te kiezen + Schrijven naar gekozen doel lukt niet + Doel kiezen + Bron en doel kunnen niet gelijk zijn + Bestanden kopiëren lukt niet + Kopiëren… + Bestanden zijn gekopieerd + Bestand is gekopieerd + Fout opgetreden + Verplaatsen… + Bestanden zijn verplaatst + Bestand is verplaatst + Verplaatsen van sommige bestanden is niet gelukt + Kopiëren van sommige bestanden is niet gelukt + Geen bestanden geselecteerd + Opslaan… + Map %s aanmaken is niet gelukt + Bestand %s aanmaken is niet gelukt + Geen nieuwe items gevonden + Er is onvoldoende ruimte beschikbaar op de bestemming.\nVereist %1$s, beschikbaar %2$s + De systeemservice voor het selecteren van bestanden en mappen is niet beschikbaar + + Nieuw + Map + Bestand + Nieuwe map aanmaken + Bestand of map met deze naam bestaat al + Naam bevat ongeldige tekens + Voer een naam in + Een onbekende fout is opgetreden + + Bestand \"%s\" bestaat al + Bestand \"%s\" bestaat al. Overschrijven\? + Map \"%s\" bestaat al + Samenvoegen + Beide behouden + Overschrijven + Overslaan + Voeg \'_1\' toe + Toepassen op alle + Het systeem staat de bewerking in deze map niet toe, kies een andere map + Het systeem staat het kopiëren naar deze map niet toe + Het systeem staat niet toe om in deze map namen te wijzigen + Kan hoofdmappen op de interne opslag niet hernoemen, alleen submappen + Kan deze map niet hernoemen + + Kies een map + Kies een bestand + Toegang tot externe opslag bevestigen + Toegang tot map bevestigen + Op het volgende scherm schrijfrecht verlenen op de hoofdmap van de SD-kaart + Probeer het volgende als de SD-kaart niet wordt getoond + Verleen de app toegang tot de gekozen map door in het volgende scherm op \'Deze map gebruiken\' te klikken. + Geef toegang tot \'<b>%s</b>\' door onderaan in het volgende scherm op \'<b>Deze map gebruiken</b>\' te drukken. + Druk in het volgende scherm onderaan op \'<b>Opslaan</b>\' om de nieuwe map aan te maken. + Keuze bevestigen + Laden… + Geef toestemming aan de app om alle bestanden op het apparaat te benaderen om er zeker van te zijn dat deze app probleemloos werkt. + + %d item + %d items + + + + %d item + %d items + + + %d item verwijderen + %d items verwijderen + + + + %d contact + %d contacten + + + Opslag kiezen + Opslag + Interne opslag + SD-kaart + Hoofdmap + Verkeerde map: kies de hoofdmap van de SD-kaart + Paden van SD-kaart en USB-apparaat kunnen niet gelijk zijn + Het lijkt erop dat de app is geïnstalleerd op een SD-kaart. Dit zorgt ervoor dat Android de widgets van deze app blokkeert. Dit is een beperking van het systeem en alleen het verplaatsen van de app naar het interne geheugen zal de widgets beschikbaar maken. + De verkeerde map is gekozen. Kies de map \'%s\' + + Eigenschappen + Pad + Geselecteerde items + Direct onderliggende items tellen mee + Totaal aantal bestanden + Resolutie + Looptijd + Artiest + Album + Brandpuntsafstand + Sluitertijd + ISO-waarde + Diafragmagetal + Camera + EXIF + Titel van het nummer + GPS-coördinaten + Hoogte + EXIF verwijderen + De EXIF-gegevens (zoals GPS-coördinaten, cameramodel enz.) verwijderen\? + De EXIF-gegevens zijn verwijderd + + Achtergrondkleur + Tekstkleur + Primaire kleur + Accentkleur van wit thema + Accentkleur van zwart-wit thema + Voorgrondkleur + Kleur app-pictogram + Kleur onderste navigatiebalk + Standaardinstellingen herstellen + Gebruik standaard + Standaard + Kleur wijzigen + Thema + Als een kleur wordt gewijzigd, zal het Aangepaste thema worden gebruikt + Opslaan + Negeren + Wijzigingen ongedaan maken + Wijzigingen inderdaad ongedaan maken\? + Deze bewerking kan niet ongedaan worden gemaakt. + Er zijn niet opgeslagen wijzigingen. Opslaan voor het afsluiten\? + Kleuren toepassen op al onze apps + WAARSCHUWING: Sommige launchers kunnen niet goed omgaan met aangepaste app-iconen. Als het icoon verdwijnt, probeer de app dan te starten via de Play Store of een widget. Zodra de app gestart is kan het icoon middels de standaardkleur #F57C00 worden hersteld. In het ergste geval dient de app opnieuw te worden geïnstalleerd. + Kleuren gewijzigd. Gebruik het nieuwe thema \'Gedeeld\' om de kleuren voor al onze apps aan te passen. + Ook bij gebruik van de Pro-versie van deze app komt de app Eenvoudig Bedankje nog van pas, omdat het de synchronisatie van het gemeenschappelijk thema verzorgt. + Om deze functie te gebruiken en om verdere ontwikkeling te ondersteunen graag <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Eenvoudig Bedankje</a> aanschaffen. Alvast bedankt! + + Licht + Donker + Automatisch + Automatisch licht/donker + Solariseren + Donkerrood + Wit + Zwart-wit + Aangepast + Gedeeld + System default + + Wat is er nieuw + * alleen de grotere veranderingen staan hier vermeld, er zijn ook altijd wat kleinere verbeteringen + + Verwijderen + Verwijderen + Hernoemen + Delen + Delen via + Grootte aanpassen + Alles selecteren + Tekst selecteren + Verbergen + Zichtbaar maken + Map verbergen + Map zichtbaar maken + Verborgen items tijdelijk tonen + Stop met tonen van verborgen media + Zoveel inhoud tegelijk delen kan niet + Prullenbak legen en uitschakelen + Ongedaan maken + Opnieuw + Afdrukken + Afdrukken (Pro) + Snelkoppeling + Snelkoppeling maken + Snelkoppeling maken (Pro) + Nummer toevoegen aan contact + Contactgegevens bekijken + Met SIM 1 bellen + Met SIM 2 bellen + Bestandsnaam tonen aan/uit + Bovenaan zetten + Onderaan zetten + Vastpinnen + Losmaken + SMS versturen + E-mail sturen + Bellen + Contactgegevens + Contact toevoegen + Achtergronden + + Sorteren op + Naam + Grootte + Laatst gewijzigd + Datum gemaakt + Datum opname + Titel + Bestandsnaam + Extensie + Willekeurig + Willekeurige volgorde + Oplopend + Aflopend + Alleen voor deze map gebruiken + Numerieke items op daadwerkelijke waarde sorteren + Voornaam + Tweede voornaam + Achternaam + Volledige naam + Aangepast sorteren + Volgorde aanpassen + + Deze items verwijderen\? + %s verwijderen\? + %s verwijderen\? + + %s verplaatsen naar de prullenbak\? + + Item verwijderen\? + Item verplaatsen naar de prullenbak\? + Onthouden voor deze sessie + Niet opnieuw weergeven + Ja + Nee + Misschien + + WAARSCHUWING: %d map zal worden verwijderd + WAARSCHUWING: %d mappen zullen worden verwijderd + + + Pincode + Pincode invoeren + Graag pincode invoeren + Verkeerde pincode + Pincode herhalen + Patroon + Patroon invoeren + Verkeerd patroon + Patroon herhalen + Biometrie + Vingerafdruk + Vingerafdruk toevoegen + Plaats een vinger op de sensor + Venster biometrische ID-verificatie openen + Verificatie + Verificatie mislukt + Verificatie geblokkeerd, probeer het opnieuw + Er zijn geen vingerafdrukken geregistreerd. Voeg deze toe via de systeeminstellingen. + Ga naar Instellingen + Wachtwoord succesvol ingesteld. App opnieuw installeren als het wachtwoord kwijt is. + Bescherming instellen is gelukt. App opnieuw installeren bij problemen met het terugzetten. + Map vergrendelen + Map vergrendelen (Pro) + Map ontgrendelen + Deze bescherming werkt alleen in deze app, het is niet de bedoeling dat het een echte systeembrede mapversleuteling vervangt. + + Gisteren + Vandaag + Morgen + Dagelijks + Jaartal verbergen + seconden + minuten + uren + dagen + s + m + u + wk. + + %d seconde + %d seconden + + + %d minuut + %d minuten + + + %d uur + %d uren + + + %d dag + %d dagen + + + %d week + %d weken + + + %d maand + %d maanden + + + %d jaar + %d jaren + + + + %d seconde + %d seconden + + + %d minuut + %d minuten + + + %d uur + %d uren + + + %d dag + %d dagen + + + %d week + %d weken + + + %d maand + %d maanden + + + %d jaar + %d jaren + + + + %d seconde eerder + %d seconden eerder + + + %d minuut eerder + %d minuten eerder + + + %d uur eerder + %d uren eerder + + + %d dag eerder + %d dagen eerder + + + %d week eerder + %d weken eerder + + + %d maand eerder + %d maanden eerder + + + %d jaar eerder + %d jaren eerder + + + + %d seconde + %d seconden + + + %d minuut + %d minuten + + + %d uur + %d uren + + + %d dag + %d dagen + + + %d week + %d weken + + + %d maand + %d maanden + + + %d jaar + %d jaren + + + Het alarm zal afgaan over\n%s + De herinnering zal worden getoond over\n%s + Resterende tijd:\n%s + Eerst controleren of het alarm goed werkt. Er kunnen zich problemen voordoen door de batterijbesparing van Android. + Kijk eerst of de herinneringen betrouwbaar werken. Controleer de systeeminstellingen voor batterijoptimalisatie en meldingen om zeker van te zijn dat de app op de achtergrond niet wordt afgesloten of dat de meldingen worden geblokkeerd. + Meldingen van deze app zijn uitgeschakeld. Ga naar de systeeminstellingen voor deze app om ze in te schakelen. + + Alarm + Sluimeren + Afwijzen + Geen herinnering + Bij aanvang + Systeemgeluiden + Eigen geluiden + Nieuw geluid toevoegen + Geen geluid + Overdag om uu:mm + Overdag om %02d.%02du + + Instellingen + Eenvoudig Bedankje kopen + Algemeen + Kleuren aanpassen + Verbeterde aanpassing van kleuren + Kleuren aanpassen + Kleuren aanpassen (vergrendeld) + Vergrendeld + Widgetkleuren aanpassen + Meldingen aanpassen + Meldingsgeluid + Use English language + Taal + Verborgen items tonen + Lettergrootte + Klein + Normaal + Groot + Extra groot + Verborgen items met wachtwoord beveiligen + Hele app met wachtwoord beveiligen + Bestandsbewerkingen Verwijderen en Verplaatsen met wachtwoord beveiligen + Datum laatst gewijzigd na bestandsbewerkingen behouden + Bij slepen van schuifbalk extra informatie tonen + Slaapstand voorkomen wanneer de app actief is + Niet om bevestiging vragen bij verwijderen + Verversen door vegen vanaf de bovenkant inschakelen + 24-uurs tijdnotatie gebruiken + Datum- en tijdnotatie wijzigen + Week op zondag beginnen + Widgets + Altijd dezelfde sluimertijd gebruiken + Interval bij sluimertijd + Trillen bij het indrukken van toetsen + Items niet verwijderen, maar verplaatsen naar de prullenbak + Interval prullenbak leegmaken + Prullenbak leegmaken + Portretmodus forceren + Instellingen exporteren + Instellingen importeren + Instellingen geëxporteerd + Instellingen geïmporteerd + Achternaam eerst + Cache opschonen + Om bevestiging vragen voor het bellen + + Opmaak + Beveiliging + Scrollen + Bestandsbewerkingen + Prullenbak + Slaat op + Opstarten + Tekst + Migreert + Kwaliteit + Hoofdscherm + Miniaturen + Lijstweergave + + Uitsluiten + Map uitsluiten + Uitgesloten mappen + (uitgesloten) + Uitgesloten mappen beheren + Alles verwijderen + De lijst van uitgesloten mappen wissen. Dit zal de mappen zelf niet verwijderen. + Uitgesloten mappen tijdelijk tonen + Uitgesloten mappen verbergen + + Tabs tonen/verbergen + Tab openen bij start + Contacten + Favorieten + Gespreksgeschiedenis + Groepen + Laatst gebruikt + Bestanden + Recente bestanden + + Bestand herstellen + Selectie terugzetten + Alle bestanden terugzetten + Prullenbak is geleegd + Bestanden zijn teruggezet + Prullenbak inderdaad leegmaken\? De bestanden zullen permanent verwijderd worden. + Prullenbak is leeg + Items uit de prullenbak verplaatsen is niet toegestaan. Gebruik de opdracht Herstellen. + De prullenbak tonen + De prullenbak verbergen + Prullenbak openen + Bestanden niet naar de prullenbak verplaatsen, maar direct verwijderen + + %d item naar de prullenbak verplaatsen + %d items naar de prullenbak verplaatsen + + + Importeren… + Exporteren… + Importeren voltooid + Exporteren voltooid + Importeren mislukt + Exporteren mislukt + Het importeren van sommige items is mislukt + Het exporteren van sommige items is mislukt + Er zijn geen items gevonden om te importeren + Er zijn geen nieuwe items gevonden om te importeren + Er zijn geen items gevonden om te exporteren + Back-ups + Automatisch back-ups maken + Automatische back-ups beheren + De volgende patronen worden ondersteund voor de bestandsnamen: +\n +\n%Y - jaar +\n%M - maand +\n%D - dag +\n%h - uren +\n%m - minuten +\n%s - seconden + + USB + USB-apparaat gedetecteerd. Om de bestanden op dit apparaat te kunnen tonen heeft de app aanvullende rechten nodig. + Selecteer in het volgende scherm de hoofdmap van het USB-apparaat + Verkeerde map geselecteerd, kies de hoofdmap van het USB-apparaat + + Januari + Februari + Maart + April + Mei + Juni + Juli + Augustus + September + Oktober + November + December + + Jan + Feb + Mar + apr + mei + juni + juli + aug + sept + okt + nov + dec + + in januari + in februari + in maart + in april + in mei + in juni + in juli + in augustus + in september + in oktober + in november + in december + Maandag + Dinsdag + Woensdag + Donderdag + Vrijdag + Zaterdag + Zondag + M + D + W + D + V + Z + Z + Ma + Di + Wo + Do + Vr + Za + Zo + + Deze app zal niet langer worden bijgewerkt. Upgrade naar de Pro-versie om gebruik te kunnen maken van nieuwe functies en verbeteringen. + Deze app zal niet langer worden bijgewerkt. Klik hier om te upgraden naar de Pro-versie en gebruik te maken van nieuwe functies en verbeteringen. + Het is gratis tot: %s. Als het voordien is gedownload, is het voor altijd gratis te gebruiken. + Meer informatie + Upgraden + Lokaal opgeslagen agenda\'s migreren kan alleen door exporteren naar een .ics bestand, en dan weer importeren. Deze functies zijn te vinden in het menu van de app. + De gratis versie van deze app is ook (nog) geïnstalleerd. Als de Pro-versie bevalt en de instellingen en favorieten zijn overgezet, dan kan de gratis versie worden verwijderd. + De Pro-versie van deze app is ook al geïnstalleerd. Als de Pro-versie bevalt en de instellingen en favorieten (indien gewenst) zijn overgezet vanuit deze versie, dan kan deze app worden verwijderd. + De gratis versie van deze app is ook (nog) geïnstalleerd. Als de Pro-versie bevalt en de gegevens zijn overgezet, dan kan de gratis versie worden verwijderd. + De Pro-versie van deze app is ook al geïnstalleerd. Als de Pro-versie bevalt en de app-gegevens (indien gewenst) zijn overgezet vanuit deze versie, dan kan deze app worden verwijderd. + De gratis versie van deze app is ook (nog) geïnstalleerd. Lokaal opgeslagen afspraken uit de gratis versie zullen handmatig moeten worden overgezet door ze eerst te exporteren naar een .ics-bestand en ze vervolgens weer te importeren in de Pro-versie. Beide functies zijn te vinden in het menu. +\n +\nAls de Pro-versie bevalt, kan de gratis versie worden verwijderd. + De gratis versie van deze app is ook (nog) geïnstalleerd. Eventueel opgeslagen contacten in \"%s\" zullen handmatig moeten worden overgezet door ze eerst te exporteren naar een .vcf-bestand en ze vervolgens weer te importeren in de Pro-versie. Beide functies zijn te vinden in het menu. +\n +\nAls de Pro-versie bevalt, kan de gratis versie worden verwijderd. + De gratis versie van deze app is ook (nog) geïnstalleerd. De notities uit de gratis versie zullen handmatig moeten worden overgezet door ze eerst te exporteren naar een bestand en ze vervolgens weer te importeren in de Pro-versie. Beide functies zijn te vinden in het menu. +\n +\nAls de Pro-versie bevalt, kan de gratis versie worden verwijderd. + + Over + Website + Bezoek voor de broncodes + Stuur reacties of suggesties naar + Upgraden naar Pro-versie + Meer apps + Meer apps van ons + Vrienden uitnodigen + Hé, bekijk %1$s eens op %2$s + Uitnodigen via + Beoordeel ons + Beoordelen + Doneren + Volg ons + v %1$s\nCopyright © Simple Mobile Tools %2$d + Ondersteuning + Help ons + Sociale media + Overig + Privacyverklaring + Versie %s + Hallo :) + Met ❤️ gemaakt in Slowakije + Extra informatie + Versie: %s + Besturingssysteem: %s + +
    + Hopelijk vindt u dit een fijne app. Het bevat geen advertenties, maar u kunt de verdere ontwikkeling wel ondersteunen door de app Eenvoudig Bedankje aan te schaffen. Dit zal ook voorkomen dat dit venster nog eens verschijnt.

    + Dank u wel! + ]]> +
    + Hallo,<br><br>Hopelijk gebruik je deze app met veel plezier. Het bevat geen advertenties en we verzamelen totaal geen gegevens. Je kunt de ontwikkeling ondersteunen door <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Eenvoudig Bedankje</a> aan te schaffen. Hiermee ontgrendel je alle functies in onze apps en kun je de kleuren voor alle apps aanpassen.<br><br>Dankjewel! + Ondersteun ons door de app <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Eenvoudig Bedankje</a> aan te schaffen. Dit zal alle functionaliteit in de apps ontgrendelen. + Kopen + Eenvoudige Telefoon downloaden + Update Eenvoudig Bedankje naar de nieuwste versie + Controleer bij problemen eerst de instellingen van de app en neem de Veelgestelde vragen door. Misschien staat de oplossing daar. + Controleer eerst de app-instellingen en lees de veelgestelde vragen voordat u ons beoordeelt. Als er problemen zijn, staat de oplossing misschien daar. + Zorg er ook voor dat de laatste versie van de app is geïnstalleerd. + Let erop dat deze app niet meer wordt doorontwikkeld. Installeer de Pro-versie voor nieuwe functies en verbeteringen. + Nu lezen + Veelgestelde vragen + Hallo, +\n +\nhet lijkt erop dat u deze app al een tijdje gebruikt, dat waarderen wij enorm. +\n +\nMogen we zo vrij zijn om u te vragen ons een beoordeling te geven op Google Play\? Daarmee helpt u ons enorm. +\n +\nDit bericht wordt maar een keer getoond, ongeacht welke keuze u nu maakt. +\n +\nHartelijk dank! + Beoordeel onze app! :) + Bedankt! + De widget is vergrendeld.\nUpgrade naar de Pro-versie om te ontgrendelen. + Deze functie is vergrendeld. Overweeg het aanschaffen van <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Eenvoudig Bedankje</a> om alle functies in deze app te kunnen gebruiken.<br><br>Dit is een eenmalige aanschaf met een niet-goed-geld-teruggarantie. + + +
    + Er zijn recentelijk nieuwe apps uitgebracht:

    + %2$s

    + %4$s

    + %6$s

    + Download de app door op de naam hierboven te klikken.

    + Bedankt! + ]]> +
    + Eenvoudige App Launcher + Eenvoudige Rekenmachine + Eenvoudige Agenda + Eenvoudige Camera + Eenvoudige Klok + Eenvoudig Adresboek + Eenvoudige Telefoon + Eenvoudig Tekenen + Eenvoudig Bestandsbeheer + Eenvoudige Zaklamp + Eenvoudige Galerij + Eenvoudig Toetsenbord + Eenvoudige Launcher + Eenvoudige Muziekspeler + Eenvoudige Notities + Eenvoudig Berichtenbeheer (SMS) + Eenvoudig Bedankje + Eenvoudige Voicerecorder + App-launcher + Rekenmachine + Agenda + Camera + Klok + Contacten + Telefoon + Tekenen + Bestandsbeheer + Zaklamp + Galerij + Toetsenbord + Launcher + Muziek + Notities + Berichten + Bedankt! + Geluidsrecorder + Het lijkt erop dat deze versie van de app corrupt is. Download de originele versie <a href=%s>hier</a>. + + Veelgestelde vragen + Lees vóór het insturen van een vraag eerst de + Waarom zie ik de widget van deze app niet in de lijst met widgets? + Waarschijnlijk is de app verplaatst naar de SD-kaart. Android verbergt widgets van apps die zich bevinden op de SD-kaart. De enige oplossing is het verplaatsen van de app naar de Interne Opslag via de instellingen van Android. + Ik wil een bijdrage leveren, maar ik kan geen geld doneren. Kan ik iets anders doen? + + deze website, of stuur een bericht naar hello@simplemobiletools.com voor hulp. + ]]> + + Ik heb per ongeluk bestanden verwijderd, hoe kan ik deze herstellen? + Helaas kan dat niet. Bestanden worden onmiddellijk na het bevestigingen verwijderd, er is geen prullenbak beschikbaar. + Ik vind de kleuren van de widgets niet mooi, kan ik ze veranderen? + Ja, bij het plaatsen van een widget naar uw hoofdscherm, verschijnt een widgetconfiguratiescherm. Je ziet gekleurde vierkanten in de linkerbenedenhoek, druk erop om een nieuwe kleur te kiezen. De schuifregelaar is voor de transparantie. + Kan ik verwijderde bestanden terugzetten\? + Niet als de bestanden daadwerkelijk zijn verwijderd. Bestanden kunnen worden teruggezet als de prullenbak is ingeschakeld (dat is standaard het geval, zie Instellingen). + Het icoon voor de app is verdwenen uit mijn launcher. Wat moet ik doen\? + Dit wordt veroorzaakt doordat de launcher het aanpassen van pictogrammen niet goed ondersteunt. Probeer de app te starten via Google Play of een widget, indien beschikbaar. Zodra de app gestart is, kan het icoon met het kiezen van de oranje standaardkleur worden teruggezet. In het ergste geval dient de app opnieuw te worden geïnstalleerd. + Het geld is afgeschreven van mijn rekening, maar ik kan de app nog niet downloaden. Wat moet ik doen? + Betalingen worden verwerkt door Google, maar dit systeem vertoont soms wat problemen. Leeg de cache van de Google Play Store app en start daarna het apparaat opnieuw. Probeer vervolgens nogmaals de app te downloaden. + Waarom zou ik upgraden naar de Pro-versie? + Omdat deze versie van de app niet meer zal worden bijgewerkt, zullen eventuele fouten nooit meer worden opgelost. Ook zullen er geen nieuwe functies meer worden toegevoegd. De Pro-versie is voor een bescheiden bedrag te vinden in de Google Play Store. Dit bedrag hoeft maar een keer te worden betaald, daarna nooit meer. Ook niet voor nieuwe apparaten. Als de Pro-versie toch niet bevalt, verwijder de app dan binnen enkele uren en het bedrag zal worden teruggestort. Ook een latere restitutie is nog mogelijk. Neem hiervoor contact op via hello@simplemobiletools.com en het geld zal alsnog worden teruggestort. + Hoe kan ik meerdere items tegelijk selecteren? + Dit kan op verschillende manieren. De eerste is door met een lange druk op een enkel item de selectiemodus in te schakelen, waarna kort klikken op andere items de selectie zal uitbreiden. De tweede manier is vergelijkbaar met het selecteren van items op een PC met de muis: + druk lang op een item en sleep vervolgens over andere items om ook die te selecteren. De derde manier is door lang te drukken op het eerste item en vervolgens ook lang te drukken op het laatste item, waarna alle items ertussen zullen worden geselecteerd. Om alle + items te selecteren kan na het lang drukken op een item geklikt worden op de teller in de linkerbovenhoek. Dit zal alle items selecteren of de gehele selectie ongedaan maken. + Ik heb de app aangeschaft, maar ik kan deze niet downloaden op een ander toestel. + Probeer uw Google Play app-cache te legen en het toestel opnieuw op te starten. Het is een Google Play probleem, niet gerelateerd aan de app zelf. + + Bijdragers + Vertaling + Ontwikkeling + Andere hulp + Deze lijst bevat de namen van iedereen die aan een app binnen de Simple Mobile Tools suite heeft bijgedragen. Vertalingen worden gedaan door vrijwilligers, dus laat het ons weten als je ook wilt helpen. Lees de instructies <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>op deze website</a>, of stuur bij vragen een bericht naar <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>. Bedankt voor alle bijdragen en andere ondersteuning! + Arabisch + Azerbeidjaans + Bengaals + Bretons + Bulgaars + Catalaans + Tsjechisch + Welsh + Deens + Engels + Duits + Grieks + Spaans + Baskisch + Farsi + Fins + Frans + Galicisch + Hindi + Kroatisch + Hongaars + Indonesisch + Italiaans + Hebreeuws + Japans + Koreaans + Litouws + Nepals + Noors + Nederlands + Pools + Portugees + Roemeens + Russisch + Slovaaks + Sloveens + Servisch + Zweeds + Tamil + Turks + Oekraïens + Vietnamees + Chinees (Hong Kong) + Chinees (Vereenvoudigd) + Chinees (Traditioneel) + + Stap nu over naar de Pro-versie! + Standaard + Pro + Geen advertenties + Geen internettoegang + 100% Niet-goed-geld-teruggarantie + Eenmalige betaling + Verbeterd ontwerp + + Geavanceerde fotobewerking + Geavanceerde foto- en videobewerking + Ondersteuning voor HEIC/HEIF + Geavanceerd batch-bestanden hernoemen + Afzonderlijke mappen vergrendelen + Ondersteuning voor afdrukken + + Ondersteuning voor tijdzones + Uitnodigingen en e-mailherinneringen + Eenvoudig gebeurtenissen importeren + Nieuwe widgets + + Verbeterd samenvoegen van dubbele contacten + Lettergrootte aanpassen + Naar keuze de privécontacten binnen onze apps delen + Aanpasbare beltonen voor contacten + Contacten filteren + Privécontacten + + Controlelijsten + Verschillende notities en kleuren per widget + Notities vergrendelen + + Datum- en tijdnotatie aanpassen + Snelkoppelingen op het startscherm + Ondersteuning voor bestandscompressie + Tab met recente bestanden + + Achtergrondkleur aanpassen + Ondersteuning voor het importeren van bestanden + Zoomen + + Deze app gebruikt de volgende bibliotheken van derden om het leven gemakkelijker te maken. Dank hiervoor. + Licenties van derden + Kotlin (programmeertaal) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Proefperiode verlopen + Start gratis proefperiode + De proefperiode verloopt binnenkort. + Voor nog 1 dag deze app volledig ontgrendelen + Welkom bij %s! + Bedankt voor de interesse in onze app! Deze proefversie is te gebruiken voor %d dagen. Als de proefperiode is afgelopen, overweeg dan een upgrade naar de Pro-versie. Het bevat geen advertenties en heeft een enorme hoeveelheid nieuwe functies, een modern ontwerp en vele andere verbeteringen. +\n +\nWij vragen om een kleine eenmalige betaling, die eenvoudig is terug te draaien indien de Pro-versie niet bevalt. +\n +\nVeel plezier! :) + Om van alle mogelijkheden die deze app biedt gebruik te kunnen maken, is een upgrade naar de Pro-versie aanbevolen. +\n +\nWij vragen om een kleine eenmalige betaling, die eenvoudig is terug te draaien indien de Pro-versie niet bevalt. +\n +\nProbeer het meteen! :) + + Deze proefversie verloopt over %d dag. + Deze proefversie verloopt over %d dagen. + + + VEROUDERD: Deze versie van de app wordt niet meer onderhouden. De Pro-versie is te vinden op https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Bij het verwijderen van de app binnen 2 uur na aanschaf wordt het aankoopbedrag automatisch teruggestort. Wilt u op een later tijdstip een terugbetaling, neem dan contact op via hello@simplemobiletools.com en het wordt geregeld. Zodoende blijft het gemakkelijk om de app uit te proberen :) + + Een verzameling eenvoudige open-source Android-apps met widgets, zonder advertenties of onnodige rechten. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-pa-rPK/strings.xml b/commons/src/main/res/values-pa-rPK/strings.xml new file mode 100644 index 000000000..f13a2db2a --- /dev/null +++ b/commons/src/main/res/values-pa-rPK/strings.xml @@ -0,0 +1,1060 @@ + + + ٹھیک اے + رد کرو + پچھے + کجھ نہیں + فیر + نویں ناں نال سامبھو + فائل سامبھی گئی + فائیل فارمیٹ نہیں درست اے + غلطی، کوئی ہور یاد نہیں + گلتی ائی اے؜:؜ %s + غلطی:؜ ‫%s‬ + ہور اَیپ نال کھُلھو + ہور اَیپ نال کھُلھو + سودھو + کوئی ویدھ اَیپ نہیں لبھی + براؤزر نہیں لبھیا + ای‌میل والے نہیں لبھیا + ناں نال ٹیکو + کاپی کرو + نمبر کاپی کرو + مُل کاپی کیتا گیا + مُل کیتا گیا:؜\n‫%s‬ + نمبر ڈائیل کرو + نامعلوم + ہمیشاں + کدے نہیں + وروے + نوٹ + فولڈر ”⁠‫⁠%s⁠‬⁠“؜ نوں مٹایا جا رہا اے + کوئی نہیں + چیپی + پاردرشتہ + پاردرشی رنگ + ہور رنگ چݨو + ڈاؤن‌لوڈ کرو + خبر دا نوٹ + خبر دے نوٹ + ای‌میل + پچھلا + پلے / رکھ + اگے + گݨتی + کوئی رابطے نہیں لبھے + اِجازتاں لئی بینتی کرو + پہنچ وچ تہاڈے رابطے نہیں اے + فون کال بݨاؤݨ لئی اَیپ دی اِجازت نہیں اے، سیٹنگاں وچ جاکے دیو + اِتھے لکھو + %s کال کرو + Confirm calling %s + صفر + اِکّ + دو + تِن + چار + پنج + چھے + ست + اٹھ + نوں + مُل + مُل خالی نہیں ہو سکدا + نواں رابطہ بݨاؤ + اِک رابطہ وچ ویروے سودھو + اَیپ خراب ہوگی اے + مُنکر ہوݨ + فوٹو کھچو + تصویر چݨو + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + فون دی سٹوریج + فون دی سٹوریج (ہور اَیپاں نوں نظر نہیں آؤندی) + Audio + + جنم دن + ورھےگنڈھ + + گھر + کم + + موبائیل + مکھ + کم دی فیکس + گھر دی فیکس + پیجر + کوئی فون نمبر نہیں لبھیا + + درش دی قسم بدلو + گرِڈ + گرِڈ (جھونگے دا نشان) + اسمان گرِڈ + لِسٹ + کالماں دی گݨتی ودھاؤ + کالماں دی گݨتی گھٹاؤ + کالماں دی گݨتی + کھڑ رُخ نظارے دے کالماں دی گݨتی + پڑے رُک نظارے دے کالماں دی گݨتی + اگلی تصویر بدلو + تصویر چݨو + + %d column + %d columns + + + روکے نمبراں دیاں سیٹنگاں + تہاڈے کوئی روکے نمبر نہیں اے۔ + کجھ روکیا نمبر پایو + نمبر روکو + نمبر روکو + روکے نمبر + روکے نمبر ایکسپورٹ کرو + روکے نمبر ایمپورٹ کرو + نمبر روکݨ لئی ایس اَیپ مول ضروری اے۔ + مول نال ٹیکو + تسیں پکے، ‫”⁠%s‬“؜ روکو؟ + جے رابطے دے باہروں کالاں آؤندیاں اے، ایہہ روکو + جے رابطے دے باہروں سنیہے آؤندے اے، ایہہ روکو + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + پسندیدے + یاد وچ سامبھو + یاد وچ سامبھو + یاد وچ ہٹاؤ + + کھوجو + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + فِلٹر کرو + Filter (Pro) + کوئی چیزاں نہیں لبھیاں۔ + فِلٹر بدلو + + سٹوریج دی اِجازت ضروری اے + رابطے دی اِجازت ضروری اے + کیمرہ دی اِجازت ضروری اے + آڈیو دی اِجازت ضروری اے + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + فائل دا ناں بدلو + فولڈر دا ناں بدلو + غلطی آئی اے، فائل دا ناں بدل نہیں سکدی + غلطی آئی اے، فولڈر دا ناں بدل نہیں سکدی + فولڈر دا ناں وچ کجھ لکھت چاہدی اے + ایس ناں نال اِک فولڈر پہلاں ہی موجودہ اے + روٹ فولڈ دا ناں بدل نہیں سکدا + فولڈر دا ناں بدلیا گیا + فولڈر دا ناں بدلیا جا رہا اے + فائل دا ناں وچ کجھ لکھت چاہدی اے + فائل دا ناں وچ منع اکھر لبھیا + Filename \'%s\' contains invalid characters + ایکسٹینشن خالی نہیں ہو چاہیدی اے + Source file %s doesn\'t exist + پہلے بھاگ وچ فائلاں دے ناؤں پایو + لکھت بعد فائلاں دے ناؤں شامل کرو + سادے ناؤں بدلدے + نمونہ + پاوݨ لئی لکھت + %Y - سال +\n%M - مہینا +\n%D - دن +\n%h - گھنٹہ +\n%m - منٹ +\n%s - سکنٹ +\n%i - نمبر اِکّ توں وڈا رہا اتݨ + فائل دا ناں، .txt نہیں ورتو۔ + فائل دا ناں (‫‎.json‬ ؜بنہا)؜ + فائل دا ناں (‫‎.zip‬ ؜بنہا)؜ + Starting from Android 11 you cannot hide files and folders like that anymore + + کاپی کرو + بھیجو + کاپی / چھلاؤ + اِتھوں تھاں نوں کاپی کرو + اِتھوں تھاں نوں چلاؤ + سروت + منزل + منزل چݨو + منزل چوݨ لئی اِتھے چھوہو + غلطے آئی اے، چݨیا منزل وچ سامبھ نہیں سکدا + منزل چݨیو + سروت تے منزل وکھرے ضروری اے + افسوس، فائلاں کاپی کر نہیں سکدیاں + کاپی کیتا جا رہا اے… + فائلاں کاپی کیتیاں گیاں + فائل کاپی کیتی گئی + افسوس، غلطی آئی اے + تبدیل کیتا جا رہا اے… + فائلاں چالیاں گیاں + فائل چالی گئی اے + سروت دی فائلاں نہیں چال سکدیاں + کجھ فائلاں کاپی کر نہیں سکدیاں + کوئی فائلاں نہیں سکیاں + سامبھیا جا رہا اے… + فولڈر‫ %s‬؜ ؜بݨا نہیں سکدی + فائل‫ %s‬؜ ؜بݨا نہیں سکدی + کوئی نویاں چیزاں نہیں لبھیاں + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + نویں بݨاؤ + فولڈر + فائیل + نواں فولڈر بݨاؤ + ایس ناں نال کجھ فائل یا فولڈر پہلاں ہی موجودہ اے + ایس ناں وچ منع اکھر لبھے + کجھ ناں پایو + نمعلوم غلطی آئی اے + + فائل‫ ”⁠%s‬⁠“ ؜پہلاں ہی موجود اے + File \"%s\" already exists. Overwrite\? + فولڈر‫ ”⁠%s‬⁠“ ؜پہلاں ہی موجود اے + ملاؤ + دوویں رکھو + اُتے لِکھو + اگے + فائل دا نان بعد ‫\'_1\'‬ ؜لکھو + سبھ نوں لگو + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + ایہہ فولڈر دا ناں بدل نہیں سکدا اے + + فولڈر چݨو + فائل چݨو + باہری سٹوریج پہنچ لئی پکا کرو + فولڈر دی اِجازت پکا کرو + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'%s\' on the next screen by pressing \'Use this folder\' at the bottom. + Please press \'Save\' at the bottom of the next screen to create the new folder. + چوݨ نوں پکا کرو + لوڈ کر رہا اے… + Please grant our app access to all your files, it might not work well without it. + + ‫%d‬ ؜چیز + ‫%d‬ ؜چیزاں + + + + ‫%d‬ ؜چیز + ‫%d‬ ؜چیزاں + + + ؜‫%d‬ ؜ چیز مٹائی جا رہی اے + ؜‫%d‬ ؜ چیزاں مٹائیں جا رہیاں اے + + + + ؜‫%d‬ ؜ رابطہ + ؜‫%d‬ ؜ رابطے + + + سٹوریج چݨو + سٹوریج + اندرونی + ایس‌ڈی کارڈ + روٹ + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + ویروے + پاتھ + چݨیاں چیزاں + ادھین چیزاں دی گݨتی + ساریاں فائلاں دی گݨتی + ریزولوشن + معیاد + آرٹسٹ + البم + پرکاش پاوݨ دی لمبائی + پرگٹاوݨ دا سماں + آئیسو رفتار + ایف‌نمبر + کیمرہ + ایکسیف فارمیٹ + گیت دا سرلیکھ + بھوگولک گݨک + اُچائی + ایکسیف ڈیٹا ہٹاؤ + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc\? + سارے ایکسیف مُل ہٹاۓ گئے اے + + پچھے دا رنگ + لکھت دا رنگ + مکھ رنگ + چٹی تھیم لئی دوجا رنگ + سلیٹی تھیم لئی دوجا رنگ + اگواڑا دا رنگ + آئیکون دا رنگ + ہیٹھاں بار دا رنگ + مولاں نوں اُلٹو + مول ورتو + مول + رنگ بدلو + تھیم + Changing a color will make it switch to Custom theme + سامبھو + ہٹاؤ + تبدیلیاں موڑو + Are you sure you want to undo your changes\? + This action cannot be undone. + ہݨے تسیں ساریاں تبدیلیاں نہیں سامبھیاں ہن۔ ہݨ کیہ بند کرن توں پہلاں سامبھیو؟ + ساریاں سادیاں ایپلیکیشناں نوں رنگ لگاؤ + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + Please purchase <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> to unlock this function and support the development. Thanks! + + روشنی + ہنیر + خود بخود + خود بخود روشنی یا ہنیرا بدلو + سورجی + لال سرخ + چٹا + سلیٹی + چݨے + سانجھا کرو + سسٹم دا مول + + کیہ نویں اے + * only the bigger updates are listed here, there are always some smaller improvements too + + مٹاؤ + ہٹاؤ + ناں بدلو + سانجھ کرو + تھاں نوں سانجھ کرو + مُڑ اکار دیو + سبھ چݨو + لکھت چݨو + لُکاؤ + فیر ویکھو + فولڈر لُکاؤ + فولڈر نوں لُکا اُلٹاؤ + وقتی طور تے لُکائیاں چیزاں ویکھاؤ + لُکیاں ہوئیاں تصویراں ویکھاوݨا بند کرو + بہٹ جاݨکی، سبھ سانجھ کر نہیں سکدے + ریسائیکل دان نوں خالی کرو تے چالو اُلٹاؤ + موڑو + دُبارہ کرو + پرینٹ کرو + پرنٹ (فیز ورژن) + شورٹکٹ + شورٹکٹ بݨاؤ + شورٹکٹ بݨاؤ (فیز ورژن) + رابطے نوں نمبر جوڑو + رابطے دے ویروے ویکھو + سیم ۱ توں کال کرو + سیم ۲ توں کال کرو + فائل دا ناں دِکھ بدلو + سکھر تے چلاؤ + پہٹھاں نوں چلاؤ + چیز لگو + ایہہ چیز لگ اُلٹاؤ + سنیہا بھیجو + ای‌میل بھیجو + کال کرو + رابطے دے ویروے + رابطہ پایو + پچھے دیاں تصویراں + + لڑیبندھ + ناں + اکار + پچھلی وار سودھ + بݨاوݨ دی تریخ + کھچݨ دی تریخ + سرلیکھ + فائیل دا ناں + ایکسٹینشن + رلؕوان + رلؕواں کرم + ودھدے کرم + گھٹدے کرم + صرف ایس فولڈر لئی ہی ورتو + نمبر دیاں بھاگاں لئی لڑی نال اصل مُل ورتو + پہلا ناں + مدھ ناں + اُپنگ + سارا ناں + چݨی لڑی ورتو + لڑی بدلو + + Are you sure you want to proceed with the deletion\? + Are you sure you want to delete %s\? + Delete %s? + Are you sure you want to move %s into the Recycle Bin\? + Are you sure you want to delete this item\? + Are you sure you want to move this item into the Recycle Bin\? + ایس سیشن لئی دُبارہ نا پچھو + مُڑ نا ویکھاؤ + ہاں + نہیں + شاعد + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + پین کوڈ + پین کوڈ پایو + تسیں کوئی پین کوڈ نہیں پاۓ گئے اے + پین کوڈ نہیں درست اے + پین کوڈ فیر پایو + نمونہ + نمونہ شامل کرو + نمونہ نہیں درست اے + نمونہ دہراؤ + جیو دے انکڑے + فنگرپرنٹ + فنگرپرنٹ جوڑو + Please place your finger on the fingerprint sensor + جیو انکڑے دے شناختی لئی پکا کرن وِنڈو کھُلھو + تصدیق دیو + پرماݨی کر نہیں سکدی اے + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + سیٹنگاں نوں جاؤ + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + فولڈر نوں کنجی لاؤ + فولڈر بند کرو (فیز ورژن) + فولڈر نوں کنجی لگا اُلٹاؤ + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + کل + اج + کل + ہر ڈن + سال لُکاؤ + سکنٹ + منٹ + گھنٹے + دن + سکنٹ + منٹ + گھنٹے + wk. + + ‫%d‬ ؜سکنٹ + ‫%d‬ ؜سکنٹ + + + ‫%d‬ ؜منٹ + ‫%d‬ ؜منٹ + + + ‫%d‬ ؜گھنٹہ + ‫%d‬ ؜گھنٹے + + + ‫%d‬ ؜دن + ‫%d‬ ؜دن + + + ‫%d‬ ؜ہفتہ + ‫%d‬ ؜ہفتے + + + ‫%d‬ ؜مہینا + ‫%d‬ ؜مہینے + + + ‫%d‬ ؜سال + ‫%d‬ ؜سال + + + + ‫%d‬ ؜سکنٹ + ‫%d‬ ؜سکنٹ + + + ‫%d‬ ؜منٹ + ‫%d‬ ؜منٹ + + + ‫%d‬ ؜گھنٹہ + ‫%d‬ ؜گھنٹے + + + ‫%d‬ ؜دن + ‫%d‬ ؜دن + + + %d ہفتہ + %d ہفتے + + + %d مہینا + %d مہینے + + + ‫%d‬ ؜سال + ‫%d‬ ؜سال + + + + ؜‫%d‬ ؜سکنٹ پہلاں + ؜‫%d‬ ؜سکنٹ پہلاں + + + ؜‫%d‬ منٹ پہلاں + ؜‫%d‬ منٹ پہلاں + + + ؜‫%d‬ گھنٹہ پہلاں + ؜‫%d‬ گھنٹے پہلاں + + + ؜‫%d‬ دن پہلاں + ؜‫%d‬ دن پہلاں + + + ؜‫%d‬ ہفتہ پہلاں + ؜‫%d‬ ہفتے پہلاں + + + ؜‫%d‬ منیہا پہلاں + ؜‫%d‬ منیہے پہلاں + + + ؜‫%d‬ سال پہلاں + ؜‫%d‬ سال پہلاں + + + + ‫%d‬ ؜سکنٹ + ‫%d‬ ؜سکنٹ + + + ‫%d‬ ؜منٹ + ‫%d‬ ؜منٹ + + + ‫%d‬ ؜گھنٹہ + ‫%d‬ ؜گھنٹے + + + ‫%d‬ ؜دن + ‫%d‬ ؜دن + + + ‫%d‬ ؜ہفتہ + ‫%d‬ ؜ہفتے + + + ‫%d‬ ؜مہینا + ‫%d‬ ؜مہینے + + + ‫%d‬ ؜سال + ‫%d‬ ؜سال + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + باکی سماں:؜\n؜‫%s‬؜ + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + الارم + فیر لئی بند کرو + بند کرو + یاد کراوݨ والا نہیں + جدوں شروع کرن + سِسٹم دیاں دھُنیاں + تہاڈیاں دھُنیاں + نویں دھُنی پایو + کوئی دھُنی نہیں اے + During the day at hh:mm + During the day at %02d:%02d + + سیٹنگاں + سادے شکریئے اَیپ کھریدیو + عام + رنگ چݨنا + Improved color customization + رنگ چݨو + چݨیا رنگ (فیز ورژن) + نہیں اُپلبدھ اے + وِجت دا رنگ چݨو + خبر دیاں نوٹاں دیاں سیٹنگاں + Notification sound + انگریزی بولی ورتو + بولی + لُکائیاں چیزاں ویکھو + فونٹ دا اکار + چھوٹا + مدھمان + وڈا + وادھو وڈے + Password protect hidden item visibility + Password protect the whole application + پاس‌ورڈ نال فائل نوں سرکھیا لگاؤ + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + ؜۲۴ گھنٹے دی سماں وݨگی ورتو + تریخ تے سمیں دی فارمیٹ بدلو + اتوار نوں ہفتہ شروع کرو + وِجٹ + ہمیش صرف اِک فیر سماں ہی ورتو + فیر سماں + Vibrate on button press + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + ریسائیکل دان نوں خالی کرو + ہمیش کھڑھا نوں لگو + سیٹنگاں ایکسپورٹ کرو + سیٹنگاں ایمپورٹ کرو + سیٹنگاں ایکسپورٹ کیتیاں گیاں + سیٹنگاں ایمپورٹ کیتیاں گیاں + اُپناں نال ناں شروع کرو + کیش ہٹاؤ + Show a call confirmation dialog before initiating a call + + دکھݨ + سرکھیا + سکرول کرن + فائل ڈاہݨی + ریسائیکل دان + سامبھݨ + شروع + لکھت + چالیاں جا رہیاں اے + حال + مکھ سکرین + تھمنیل + لسٹ سکرین + + باہر کڈھو + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded\? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + تیباں ویکھݨ دیاں ترجیحاں + پہلی ٹیب کیہ کھُلھو + رابطے + پسندیدے + کال کرن دی تریخ + سموہ + پچھلی ورتوں + فائلاں + تازہ فائلاں + + ایس فائل نوں اُلٹو + چݨیاں فائلاں نوں اُلٹو + ساریاں فائلاں نوں اُلٹو + ریسائیکل دان خالی کیتا گیا + فائلاں نوں اُلٹائیاں گیاں + Are you sure you want to empty the Recycle Bin\? The files will be permanently lost. + ریسائیکل دان خالی اے + Moving Recycle bin items is disabled, please use Restore + ریسائیکل دان دکھاؤ + ریسائیکل دان لُکاؤ + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + ایمپورٹ کیتیاں جا رہیاں اے۔ ۔ + اوہ ایکسپورٹ کیتے جا رہے اے۔ ۔ ۔ + ایمپورٹ کیتا گیا + ایکسپورٹ کیتا گیا + غلطی آئی اے، ایمپورٹ کر نہیں سکدا + غلطی آئی اے، ایکسپورٹ کر نہیں سکدا + افسوس، کجھ چیزاں ایمپورٹ کر نہیں سکدیاں + افسوس، کجھ چیزاں ایکسپورٹ کر نہیں سکدیاں + ایکسپورٹ کرن لئی کوئی چیز اں نہیں لبھیاں + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + No new entries for importing have been found + ایمپورٹ کرن لئی کوئی چیز اں نہیں لبھیاں + + یوایس‌بی + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + جنواری + فرواری + مارچ + اپریل + مائی + جون + جلائی + اگست + ستمبر + اکتوبر + نوَمبر + دسمبر + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + جنواری چ + فرواری چ + مارچ اِچ + اپریل چ + مائی چ + جون چ + جلائی چ + اگست وچ + ستمبر وچ + اکتوبر وچ + نوَمبر وچ + دسمبر وچ + سوموار + منگلوار + بدھوار + جمعرات + جمعہ + ہفتہ + اتوار + منگل + منگل + بُدھ + جمعرات + جمعہ + ہفتہ + ات + سوموار + منگلوار + بدھوار + جمعرات + جمعہ + ہفتہ + اتوار + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + ہور جاݨکاری + اپگریڈ کرو + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + بارے + ویب‌سائیٹ + سروت دا کوڈ لئی اوس تے جایو + Send your feedback or suggestions to + فیز ورژن لئی کڑی دا پتہ + ہور جاݨکاری + ساڈے ولوں ہور ایپلیکیشناں + دوستاں نوں مدا دیو + Hey, come check out %1$s at %2$s + ہور اَیپ نال مدا دیو:؜ + آپݨے من دی گل کریو + آپݨے من دی گل کریو + دان کرو + سوشل میڈیا کڑیاں + v %1$s\nCopyright © Simple Mobile Tools %2$d + سہیوگ + مدد دیو + سوشل میڈیا کڑیاں + ہور + پردیداری پالیسی + ورژن %s + سالام علیکم جی 🙂 + سلوویکیہ وچ دل نال اَئپ بنائی + ہور جاݨکاری + ‫اَیپ ورژن:؜ ‏%s‬؜ + ‫ڈیوائیس اوپریٹنگ سِسٹم:؜ ‏%s‬؜ + Hello,<br><br> hope you are enjoying the app. It contains no ads, please support its development by purchasing the <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> app, it will also prevent this dialog from showing up again.<br><br> Thank you! + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + کھریدیو + سادی فون ویچی جا رہا اے + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + پڑھاؤ + سوال تے جواب + Hello, +\n +\nit looks like you are using this app for quite a while already, and we really appreciate it. +\n +\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot. +\n +\nNo matter how you decide, you will not see this message again. +\n +\nThanks! + جے پسند اے، آپݨے من دی گل کریو + مہربانی + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + Hey,<br><br> just letting you know that some new apps have been released recently:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> You can download them by pressing their titles or icons.<br><br> Thanks + سادہ ایپلیکیشن شروع کرتا + سادہ کیلکولیٹر + سادہ کیلینڈر + سادہ کیمرہ + سادہ گڑی + سادے رابطے + سادی فون ڈائل + سادہ اُلیکݨ + سادیاں فائلاں + سادہ ٹورچ + سادیاں تصویراں + سادہ کیبورڈ + سادہ شروع والا + سادہ سنگیت + سادے نوٹ + سادے سنیہے + سادے شکریئے + سادہ ریکارڈ والا + ایپلیکیشن شروع کرتا + کیلکولیٹر + کیلنڈر + کیمرہ + گھڑی + رابطے + فون ڈائل + اُلیکو + فائلاں + ٹورچ + تصویراں + کیبورڈ + شروع والا + سنگیت + نوٹ + سنیہے + مہربانی + ریکارڈ والا + It looks like your app version is corrupt. Please download the original version <a href=%s>here</a>. + + سوال تے جواب + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets\? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do\? + Yes, of course. You can spread the word about the apps or give good feedback and ratings. You can also help by translating the apps in a new language, or just update some existing translations. The guide to translating is at <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, or just contact us at <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> if you have any questions. + I deleted some files by mistake, how can I recover them\? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them\? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files\? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do\? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do\? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version\? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once\? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + لیکھک + ترجمہ + ڈیویلپمنٹ + ہور مدد + This list contains everyone that noticeably helped any app within the Simple Mobile Tools suite, not only this one. Translations are handled by volunteers, let us know if you want to help too. The guide to translating is at <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, or just contact us at <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> if you have any questions. Thanks to all contributors and other supporters! + عربی + ازیری + بنگالی + بریٹونی + بولگاریائی + کیٹالان + چیک + ویلش + ڈینی + انگریزی + جرمان + یونانی + سپینی + باسک + فارسی + فینی + فرانسیسی + گالیسیائی + ہندی + کرواشیائی + ہنگیریائی + اِنڈونیشیائی + اِطالی + عبرانی + جاپانی + کوریائی + لِتھوانیائی + نیپالی + نورویجی + دچ + پولی + پورٹوگلی + رومینیائی + روسی + سلوواک + سلووینیائی + سربیائی + سویدن + تمل + ترکی + یوکرینی + ویٹنامی + چینی (ہونگ کونگ) + چینی (سادہ کیتی) + چینی (روڑھی) + + فیز ورژن دی جاݨکاری + مول ورژن + فیز ورژن + کوئی اِشتہار نہیں + کوئی اینٹرنیٹ دی پہنچ نہیں اے + ؜۱۰۰٪ پیسے واپس کرن دی گرنٹی + اِکّ وار بھُگتان + وکھرا ڈزائن + + فوٹواں لئی اُنت ایڈیٹر + Advanced photo & video editor + ایچ‌ای‌آئی‌سی / ایچ‌ای‌آئی‌ایف فائل ورت سکدے + فائل دا ناں بدلݨ لئی اُنت سموہ دے نشان + ہر فولڈر بند کرن دے نشان ورت سکدے + ہور پرنٹ کرن دے نشان + + ٹائم زون دے نشان + حاضرین تے ای‌میل یاد کراون والے + کیلندر نوں سادہ ایمپورٹ کرن + ہور وِجٹ دے نشان + + رابطے ملاوݨ دے نشان + فونٹ دا اکار چݨ سکدے + ساڈیاں اَیپاں دے اندر وِکلپک چݨیا نجی پردیداری رابطے سانجھ کرن + ہور رِنگ‌ٹون چوݨاں + رابطیاں وچ فِلٹر کر سکدے + نجی رابطے رکھ سکدے + + چیک‌لسٹاں + Different note and colors per widget + نوٹ بند کرن دے نشان + + ہور تریخ تے سمیں دی فارمیٹ چوݨاں + گھر دی سکرین تے شورٹکٹ لگ سکدے + فائل کمپریس کر سکدے + حالیہ فائیلاں ٹیب + + پور رنگ چوݨاں + ہور فائل ایمپورٹ چوݨاں + وڈا کرن + + This app uses the following third party libraries to make my life easier. Thank you. + تیجی دھر دے لائیسنس + کوٹلِن پرگرامنگ بولی + Subsampling Scale Image View (zoomable imageviews) + گلائیڈ تصویر لوڈ کرن تے کیش کرن + پیکاسو تصویر کرن تے کیش کرن + آنڈروئیڈ تصویر کراپ کرتا + آر‌ٹی‌ایل‌ویوپیجر سجے توں کھبے سوائیپ کرن والا + جوڈا ٹائم جاوا تریخ بدلݨا + ستیٹھو دیبگ ڈیٹابیس + اوٹّو ایوینٹ بس + فوٹو ویو جیف فائل والا + پیٹرن‌لاک‌ویو نمونہ سرکھیا + فیر پرنٹ (فنگرپرنٹ پہنچ والا) + جیف ڈراو (جیف فائل لوڈ کرن والا) + خود بخود لکھت دا اکار بدلاوݨ اے + روبوایلیکٹرک + ایسپرسو (آزمائش والا) + گی‌سون (جےسون پڑھاوݨ والا) + لیک پچھی (یاد مارن لبھݨ دار) + نمبر چوݨ والا + ایکسوپلیئر (ویڈیو) + وی‌آر پینوراما دِکھاوݨ والا + اپاچی سینسیلن تصویر دا میٹاڈیٹا پڑھاوݨ والا + آنڈروئیڈ تصویراں دیاں فِلٹراں + گیسٹر ویو تصویر نوں وڈا کرن والا + Indicator Fast Scroll (letters on scrollbar) + ایوینٹ بس ایپلیکیشن سنچار والا + آڈیو ریکارڈ ویو دھُنیاں دِکھاوݨ والا + ایس‌ایم‌ایس ایم‌ایم‌ایس سنیہے والا + اےپی‌این‌گی آنڈروئیڈ چالیاں ویب‌پی فائلاں سہیوگ + آنڈروئیڈ پی‌ڈی‌ایف دِکھݨ والا + ایم‌تھری‌یو پارسر پلےلِسٹ فائل والا + آنڈروئیڈلیم ایم‌پی‌تھری اینکوڈ والا + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. + diff --git a/commons/src/main/res/values-pa/strings.xml b/commons/src/main/res/values-pa/strings.xml new file mode 100644 index 000000000..04f6bd534 --- /dev/null +++ b/commons/src/main/res/values-pa/strings.xml @@ -0,0 +1,1155 @@ + + + ਠੀਕ ਹੈ + ਰੱਦ ਕਰੋ + ਪਿੱਛੇ + ਕੁਝ ਨਹੀਂ + ਫੇਰ + Save as + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Open with + Edit with + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Unknown + Always + Never + Details + Notes + Deleting folder \'%s\' + None + ਚੇਪੀ + ਪਾਰਦਰਸ਼ੀ + Transparent color + Select a different color + ਡਾਉਨਲੋਡ ਕਰੋ + Notification + Notifications + ਈ-ਮੇਲ + ਪਿਛਲਾ + Play / Pause + ਅੱਗੇ + ਨੰਬਰ + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + ਇੱਕ + ਦੋ + ਤਿੰਨ + ਚਾਰ + ਪੰਜ + ਛੇ + ਸੱਤ + ਅੱਠ + ਨੌਂ + ਮੁੱਲ + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ… + ਫ਼ੋਨ ਸਟੋਰੇਜ + ਫ਼ੋਨ ਸਟੋਰੇਜ (ਜੋ ਹੋਰ ਐਪਾਂ ਦੁਆਰਾ ਦਿਖਾਈ ਨਹੀਂ ਦਿੰਦੀ) + Audio + + + Birthday + Anniversary + + + Home + Work + + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + + Favorites + Add favorites + Add to favorites + Remove from favorites + + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + + Filter + Filter (Pro) + No items found. + Change filter + + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + + %d item + %d items + + + + + %d item + %d items + + + + Deleting %d item + Deleting %d items + + + + + %d contact + %d contacts + + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + + Delete + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + Are you sure you want to move %s into the Recycle Bin? + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Yes + No + Maybe + + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + minutes + hours + days + s + m + h + wk. + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + + Alarm + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + Vibrate on button press + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + + Exclude + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + + January + February + March + April + May + June + July + August + September + October + November + December + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + M + T + W + T + F + S + S + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + + About + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + Rate us + Rate + Donate + Follow us + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + here. + ]]> + + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + + Checklists + Different note and colors per widget + Note locking + + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + + Background color customization + File importing support + Zooming + + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-pl/strings.xml b/commons/src/main/res/values-pl/strings.xml new file mode 100644 index 000000000..70fe4d5b7 --- /dev/null +++ b/commons/src/main/res/values-pl/strings.xml @@ -0,0 +1,1193 @@ + + + OK + Anuluj + Wstecz + Nic + Później + Zapisz jako + Plik został zapisany + Nieprawidłowy format pliku + Błąd braku pamięci + Wystąpił błąd: %s + Błąd: %s + Otwórz w + Edytuj w + Edytuj + Nie znaleziono odpowiedniej aplikacji + Nie znaleziono przeglądarki + Nie znaleziono klienta poczty e-mail + Ustaw jako + Kopiuj do schowka + Skopiuj numer do schowka + Wartość skopiowano do schowka + Wartość skopiowano do schowka:\n%s + Wybierz numer + Nieznane + Zawsze + Nigdy + Szczegóły + Notatki + Usuwanie folderu „%s” + Brak + Etykieta + Przezroczysty + Przezroczysty kolor + Wybierz inny kolor + Pobierz + Powiadomienie + Powiadomienia + E-mail + Poprzedni + Odtwórz/Wstrzymaj + Następny + Numer + Nie znaleziono kontaktów + Poproś o wymagane uprawnienia + Aplikacja nie mogła uzyskać dostępu do Twoich kontaktów + Aplikacja nie ma uprawnienia do nawiązywania połączeń telefonicznych. Nadaj je w ustawieniach urządzenia. + Tutaj wstaw tekst + Zadzwoń do %s + Potwierdź połączenie z %s + Zero + Jeden + Dwa + Trzy + Cztery + Pięć + Sześć + Siedem + Osiem + Dziewięć + Wartość + Wartość nie może być pusta + Utwórz nowy kontakt + Dodaj do istniejącego kontaktu + Aplikacja uszkodzona + Uwaga + Zrób zdjęcie + Wybierz zdjęcie + Wybierz wideo + Wybierz kontakt + Wybierz plik + Nagraj dźwięk + Nagraj wideo + Aktualizowanie… + Pamięć telefonu + Pamięć telefonu (niewidoczne dla innych aplikacji) + Audio + + Urodziny + Rocznica + + Domowy + Służbowy + + Komórkowy + Główny + Faks służbowy + Faks domowy + Pager + Nie znaleziono numeru telefonu + + Zmień typ widoku + Siatka + Siatka (Pro) + Nierówna siatka + Lista + Zwiększ liczbę kolumn + Zmniejsz liczbę kolumn + Liczba kolumn + Liczba kolumn w trybie pionowym + Liczba kolumn w trybie poziomym + Zmień okładkę + Wybierz zdjęcie + + %d kolumna + %d kolumny + %d kolumn + %d kolumn + + + Zarządzaj zablokowanymi numerami + Nie blokujesz nikogo. + Dodaj numer do blokowania + Zablokuj numer + Zablokuj numery + Zablokowane numery + Eksportuj zablokowane numery + Importuj zablokowane numery + Musisz ustawić tę aplikację jako domyślną aplikację telefonu, aby blokować numery. + Ustaw jako domyślną + Czy zablokować „%s”\? + Blokuj połączenia od niezapisanych kontaktów + Blokuj wiadomości od niezapisanych kontaktów + Wprowadź numer lub wzorzec (np. *12345*, +48*8888), aby blokować wszystkie połączenia i wiadomości z numerów pasujących do wzorca + Nie można blokować nieznanych numerów bez uprawnienia do identyfikacji rozmówcy + + Ulubione + Dodaj ulubione + Dodaj do ulubionych + Usuń z ulubionych + + Szukaj + Szukaj w %s + Wpisz co najmniej 2 znaki, aby rozpocząć wyszukiwanie. + Szukaj kontaktów + Szukaj ulubionych + Szukaj aplikacji + Szukaj wydarzeń + Szukaj grup + Szukaj w historii + Szukaj połączeń + Szukaj plików + Szukaj folderów + Szukaj plików i folderów + Szukaj playlist + Szukaj artystów + Szukaj albumów + Szukaj utworów + Szukaj tekstu + Szukaj rozmów + Szukaj nagrań + + Filtruj + Filtruj (Pro) + Nic nie znaleziono. + Zmień filtr + + Wymagane jest uprawnienie „Pamięć” + Wymagane jest uprawnienie „Kontakty” + Wymagane jest uprawnienie „Aparat” + Wymagane jest uprawnienie „Mikrofon” + Brak uprawnienia + Musisz zezwolić aplikacji na wyświetlanie powiadomień, w przeciwnym razie nie będzie mogła wyświetlać przypomnień. + Musisz zezwolić aplikacji na wyświetlanie powiadomień, w przeciwnym razie nie będzie mogła wyświetlać paska postępu. + Musisz zezwolić aplikacji na wyświetlanie powiadomień, w przeciwnym razie nie będzie mogła odtwarzać utworów. + Musisz zezwolić aplikacji na wyświetlanie powiadomień, w przeciwnym razie nie będzie mogła nagrywać dźwięku. + Musisz zezwolić aplikacji na wyświetlanie powiadomień, w przeciwnym razie nie będzie mogła wyświetlać połączeń przychodzących. + Musisz zezwolić aplikacji na wyświetlanie powiadomień, w przeciwnym razie nie będzie mogła wyświetlać wiadomości przychodzących. + Nadaj uprawnienie + Wymagane uprawnienie + + Zmień nazwę pliku + Zmień nazwę folderu + Nie udało się zmienić nazwy pliku + Nie udało się zmienić nazwy folderu + Nazwa folderu nie może być pusta + Folder o tej nazwie już istnieje + Nie można zmienić nazwy folderu głównego + Nazwa folderu została zmieniona + Zmienianie nazwy folderu + Nazwa pliku nie może być pusta + Nazwa pliku zawiera niedozwolone znaki + Nazwa „%s” zawiera niedozwolone znaki + Rozszerzenie nie może być puste + Plik źródłowy %s nie istnieje + Poprzedź nazwy plików + Dołącz do nazw plików + Prosta zmiana nazwy + Wzorzec + Ciąg do dodania + %Y — rok\n%M — miesiąc\n%D — dzień\n%h — godzina\n%m — minuta\n%s — sekunda\n%i — numer rosnący od 1 + Nazwa pliku (bez .txt) + Nazwa pliku (bez .json) + Nazwa pliku (bez .zip) + Począwszy od Androida 11 nie można już ukrywać plików i folderów w ten sposób + + Kopiuj + Przenieś + Kopiuj/Przenieś + Kopiuj do + Przenieś do + Źródło + Cel + Wybierz miejsce docelowe + Naciśnij tutaj, aby wybrać miejsce docelowe + Nie udało się zapisać w wybranym miejscu + Wybierz cel + Miejsca źródłowe i docelowe nie mogą być takie same + Nie udało się skopiować plików + Kopiowanie… + Pliki zostały skopiowane + Plik został skopiowany + Wystąpił błąd + Przenoszenie… + Pliki zostały przeniesione + Plik został przeniesiony + Nie udało się przenieść niektórych plików + Nie udało się skopiować niektórych plików + Nie wybrano żadnych plików + Zapisywanie… + Nie udało się utworzyć folderu %s + Nie udało się utworzyć pliku %s + Nie znaleziono nowych elementów + Miejsce docelowe nie ma wystarczającej ilości wolnego miejsca.\nWymagane %1$s, dostępne %2$s + Usługa systemowa do wybierania plików i folderów jest niedostępna + + Utwórz nowy + Folder + Plik + Utwórz nowy folder + Plik lub folder o tej nazwie już istnieje + Nazwa zawiera niedozwolone znaki + Wpisz nazwę + Wystąpił nieznany błąd + + Plik „%s” już istnieje + Plik „%s” już istnieje. Czy go nadpisać? + Folder „%s” już istnieje + Połącz + Zachowaj oba + Nadpisz + Pomiń + Dodaj końcówkę „_1” + Zastosuj do wszystkich + System nie pozwala na operację w tym folderze, wybierz inny + System nie pozwala na kopiowanie do tego folderu, wybierz inny + System nie pozwala na zmianę nazwy w tym folderze + Nie można zmieniać nazw folderów bezpośrednio w pamięci wewnętrznej, tylko podfolderów + Nie można zmienić nazwy tego folderu + + Wybierz folder + Wybierz plik + Potwierdź dostęp do pamięci zewnętrznej + Potwierdź dostęp do folderu + Wybierz folder główny karty pamięci na następnym ekranie, aby przyznać dostęp. + Jeśli nie widzisz karty pamięci, spróbuj tego: + Zezwól na dostęp do wybranej pamięci na następnym ekranie, naciskając „Użyj tego folderu” na dole. + Zezwól na dostęp do „<b>%s</b>” na następnym ekranie, naciskając „<b>Użyj tego folderu</b>” na dole. + Naciśnij „<b>Zapisz</b>” na dole następnego ekranu, aby utworzyć nowy folder. + Potwierdź wybór + Ładowanie… + Przyznaj naszej aplikacji dostęp do wszystkich swoich plików. Bez niego może nie działać dobrze. + + %d element + %d elementy + %d elementów + %d elementów + + + + %d element + %d elementy + %d elementów + %d elementów + + + Usuwanie %d elementu + Usuwanie %d elementów + Usuwanie %d elementów + Usuwanie %d elementów + + + + %d kontakt + %d kontakty + %d kontaktów + %d kontaktów + + + Wybierz pamięć + Pamięć + Wewnętrzna + Karta pamięci + Folder główny + Wybrano nieprawidłowy folder. Wybierz folder główny karty pamięci. + Ścieżki do karty pamięci i pamięci USB nie mogą być takie same + Wygląda na to, że aplikacja jest zainstalowana na karcie pamięci, przez co widżety aplikacji są niedostępne. Nie zobaczysz ich nawet na liście dostępnych widżetów. Jest to ograniczenie systemu, więc jeśli chcesz ich używać, musisz przenieść aplikację z powrotem do pamięci wewnętrznej. + Wybrano nieprawidłowy folder, wybierz ścieżkę „%s” + + Właściwości + Ścieżka + Wybrane elementy + Liczba elementów bezpośrednio w folderze + Liczba wszystkich elementów + Rozdzielczość + Czas trwania + Artysta + Album + Ogniskowa + Czas ekspozycji + Czułość ISO + Wartość przysłony + Aparat + EXIF + Tytuł utworu + Współrzędne GPS + Wysokość + Usuń dane EXIF + Czy usunąć dane EXIF, takie jak współrzędne GPS, model aparatu itp.\? + Dane EXIF zostały usunięte + + Kolor tła + Kolor tekstu + Kolor wiodący + Kolor akcentujący białego motywu + Kolor akcentujący czarno-białego motywu + Kolor pierwszoplanowy + Kolor ikony aplikacji + Kolor dolnego paska nawigacyjnego + Przywróć domyślne + Użyj domyślnego + Domyślny + Zmień kolor + Motyw + Zmiana koloru spowoduje przełączenie motywu na własny + Zapisz + Odrzuć + Cofnij zmiany + Czy cofnąć zmiany\? + Tej akcji nie można cofnąć. + Masz niezapisane zmiany. Czy zapisać je przed wyjściem? + Zastosuj kolory we wszystkich Prostych aplikacjach + UWAGA: Niektóre launchery nie obsługują prawidłowo zmiany ikon aplikacji. Jeśli ona zniknie, uruchom aplikację przez Sklep Google Play lub przez widżet, jeśli jest dostępny. + Po uruchomieniu aplikacji ustaw domyślny kolor ikony (#F57C00). W najgorszym przypadku konieczne może być przeinstalowanie aplikacji. + Kolory zostały zmienione. Dodano nowy motyw o nazwie „wspólny” — użyj go do aktualizacji kolorystyki we wszystkich Prostych aplikacjach w przyszłości. + Pamiętaj, że nawet jeśli używasz wersji Pro aplikacji, nadal potrzebujesz aplikacji „Proste podziękowanie” z powodów technicznych. Zajmuje się ona synchronizacją kolorów. + Aby odblokować tę funkcję (i przy okazji wesprzeć rozwój niniejszej aplikacji), kup aplikację <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Proste podziękowanie</a>. Dzięki! + + Jasny + Ciemny + Automatyczny + Automatyczny jasny/ciemny + Solaryzacja + Ciemnoczerwony + Biały + Czarno-biały + Własny + Wspólny + Domyślny systemowy + + Co nowego + * Tutaj wymienione są tylko większe aktualizacje, ale zawsze są też mniejsze usprawnienia. + + Usuń + Usuń + Zmień nazwę + Udostępnij + Udostępnij w + Zmień rozmiar + Zaznacz wszystko + Zaznacz tekst + Ukryj + Odkryj + Ukryj folder + Odkryj folder + Tymczasowo pokaż ukryte elementy + Przestań pokazywać ukryte elementy + Nie możesz udostępniać tak wielu danych naraz + Opróżnij i wyłącz kosz + Cofnij + Ponów + Drukuj + Drukuj (Pro) + Skrót + Utwórz skrót + Utwórz skrót (Pro) + Dodaj numer do kontaktu + Wyświetl szczegóły kontaktu + Zadzwoń z karty SIM 1 + Zadzwoń z karty SIM 2 + Pokaż/Ukryj nazwy plików + Przesuń na górę + Przesuń na dół + Przypnij element + Odepnij element + Wyślij SMS-a + Wyślij e-mail + Zadzwoń + Szczegóły kontaktu + Dodaj kontakt + Tapety + + Sortuj według + Nazwa + Rozmiar + Data modyfikacji + Data utworzenia + Data wykonania + Tytuł + Nazwa pliku + Rozszerzenie + Losowo + Sortuj losowo + Rosnąco + Malejąco + Tylko w tym folderze + Sortuj części liczbowe według rzeczywistej wartości + Pierwsze imię + Drugie imię + Nazwisko + Pełna nazwa + Użyj własnego sortowania + Zmień kolejność + + Czy kontynuować usuwanie\? + Czy usunąć %s\? + Czy usunąć %s\? + + Czy przenieść %s do kosza\? + + Czy usunąć ten element\? + Czy przenieść ten element do kosza\? + Nie pytaj więcej w tej sesji + Nie pokazuj ponownie + Tak + Nie + Być może + + UWAGA: Usuwasz %d folder + UWAGA: Usuwasz %d foldery + UWAGA: Usuwasz %d folderów + UWAGA: Usuwasz %d folderów + + + PIN + Wprowadź PIN + Wprowadź PIN + Nieprawidłowy PIN + Wprowadź PIN ponownie + Wzór + Wprowadź wzór + Nieprawidłowy wzór + Wprowadź wzór ponownie + Biometria + Odcisk palca + Dodaj odcisk palca + Przyłóż palec do czytnika + Otwórz okno weryfikacji biometrycznej + Uwierzytelnij + Uwierzytelnianie nie powiodło się + Uwierzytelnianie zablokowane. Spróbuj ponownie za chwilę. + Nie masz zarejestrowanych odcisków palców. Dodaj je w ustawieniach swojego urządzenia. + Przejdź do ustawień + Hasło zostało ustawione. Jeśli je zapomnisz, przeinstaluj aplikację. + Zabezpieczenie zostało ustawione. W razie problemów z jego zresetowaniem przeinstaluj aplikację. + Zablokuj folder + Zablokuj folder (Pro) + Odblokuj folder + Ta ochrona działa tylko w tej aplikacji i nie ma zastępować prawdziwego szyfrowania folderów w całym systemie. + + Wczoraj + Dzisiaj + Jutro + Codziennie + Ukryj rok + sekundy + minuty + godziny + dni + s + m + h + tydz. + + %d sekunda + %d sekundy + %d sekund + %d sekund + + + %d minuta + %d minuty + %d minut + %d minut + + + %d godzina + %d godziny + %d godzin + %d godzin + + + %d dzień + %d dni + %d dni + %d dni + + + %d tydzień + %d tygodnie + %d tygodni + %d tygodni + + + %d miesiąc + %d miesiące + %d miesięcy + %d miesięcy + + + %d rok + %d lata + %d lat + %d lat + + + + %d sekundę + %d sekundy + %d sekund + %d sekund + + + %d minutę + %d minuty + %d minut + %d minut + + + %d godzinę + %d godziny + %d godzin + %d godzin + + + %d dzień + %d dni + %d dni + %d dni + + + %d tydzień + %d tygodnie + %d tygodni + %d tygodni + + + %d miesiąc + %d miesiące + %d miesięcy + %d miesięcy + + + %d rok + %d lata + %d lat + %d lat + + + + %d sekundę przed + %d sekundy przed + %d sekund przed + %d sekund przed + + + %d minutę przed + %d minuty przed + %d minut przed + %d minut przed + + + %d godzinę przed + %d godziny przed + %d godzin przed + %d godzin przed + + + %d dzień przed + %d dni przed + %d dni przed + %d dni przed + + + %d tydzień przed + %d tygodnie przed + %d tygodni przed + %d tygodni przed + + + %d miesiąc przed + %d miesiące przed + %d miesięcy przed + %d miesięcy przed + + + %d rok przed + %d lata przed + %d lat przed + %d lat przed + + + + %d sekundę + %d sekundy + %d sekund + %d sekund + + + %d minutę + %d minuty + %d minut + %d minut + + + %d godzinę + %d godziny + %d godzin + %d godzin + + + %d dzień + %d dni + %d dni + %d dni + + + %d tydzień + %d tygodnie + %d tygodni + %d tygodni + + + %d miesiąc + %d miesiące + %d miesięcy + %d miesięcy + + + %d rok + %d lata + %d lat + %d lat + + + Czas pozostały do aktywacji alarmu:\n%s + Czas pozostały do aktywacji przypomnienia:\n%s + Pozostały czas:\n%s + Upewnij się, że alarm działa prawidłowo, zanim zaczniesz na nim polegać. Przez ograniczenia związane m.in. z oszczędzaniem baterii coś może nie zadziałać. + Upewnij się, że przypomnienia działają prawidłowo, zanim zaczniesz na nich polegać. Sprawdź ustawienia baterii i powiadomień w swoim urządzeniu, czy nic nie blokuje przypomnień lub nie wyłącza aplikacji w tle. + Powiadomienia tej aplikacji są wyłączone. Przejdź do ustawień urządzenia, aby je włączyć. + + Alarm + Drzemka + Odrzuć + Brak przypomnienia + Przy rozpoczęciu + Dźwięki systemowe + Dźwięki użytkownika + Dodaj nowy dźwięk + Brak dźwięku + W ciągu dnia o hh:mm + W ciągu dnia o %02d:%02d + + Ustawienia + Kup aplikację „Proste podziękowanie” + Ogólne + Dostosowywanie kolorów + Ulepszone dostosowywanie kolorów + Dostosuj kolory aplikacji + Dostosuj kolory aplikacji (Zablokowane) + Zablokowane + Dostosuj kolory widżetu + Dostosuj powiadomienia + Dźwięk powiadomienia + Wymuszaj używanie przez aplikację języka angielskiego + Język + Pokazuj ukryte elementy + Rozmiar czcionki + Mała + Średnia + Duża + Bardzo duża + Chroń hasłem widoczność ukrytych elementów + Chroń hasłem dostęp do całej aplikacji + Chroń hasłem usuwanie i przenoszenie elementów + Utrzymuj starą datę modyfikacji po operacjach na plikach + Pokazuj dodatkowe informacje o elementach przy przeciąganiu paska przewijania + Zapobiegaj przechodzeniu urządzenia w tryb uśpienia, gdy aplikacja jest aktywna + Nie pokazuj okna potwierdzenia usunięcia elementów + Włącz gest pociągnięcia ekranu od góry w celu odświeżenia widoku + Używaj 24-godzinnego formatu czasu + Zmień format daty i godziny + Rozpoczynaj tydzień od niedzieli + Widżety + Zawsze używaj tego samego czasu trwania drzemki + Czas trwania drzemki + Wibracja przy naciśnięciu przycisku + Przenoś elementy do kosza zamiast je usuwać + Przedział czasowy czyszczenia kosza + Opróżnij kosz + Wymuszaj tryb pionowy + Eksportuj ustawienia + Importuj ustawienia + Ustawienia zostały wyeksportowane + Ustawienia zostały zaimportowane + Zaczynaj nazwę od nazwiska + Wyczyść pamięć podręczną + Pokazuj okno potwierdzenia przed nawiązaniem połączenia + + Widoczność + Bezpieczeństwo + Przewijanie + Operacje na plikach + Kosz + Zapisywanie + Uruchamianie + Tekst + Migracja + Jakość + Ekran główny + Miniaturki + Widok listy + + Wyklucz + Wyklucz folder + Wykluczone foldery + (wykluczone) + Zarządzaj wykluczonymi folderami + Usuń wszystko + Czy usunąć wszystkie foldery z listy wykluczonych\? Nie spowoduje to fizycznego usunięcia folderów. + Tymczasowo pokaż wykluczone foldery + Przestań pokazywać wykluczone foldery + + Zarządzaj pokazywanymi kartami + Karta otwierana przy uruchomieniu aplikacji + Kontakty + Ulubione + Historia połączeń + Grupy + Ostatnio używana + Pliki + Ostatnie pliki + + Przywróć ten plik + Przywróć wybrane pliki + Przywróć wszystkie pliki + Kosz został opróżniony + Pliki zostały przywrócone + Czy opróżnić kosz\? Pliki zostaną utracone bezpowrotnie. + Kosz jest pusty + Przenoszenie elementów z kosza jest wyłączone, użyj przywracania + Pokaż kosz + Ukryj kosz + Otwórz kosz + Pomiń kosz, usuń pliki bezpośrednio + + Przenoszenie %d elementu do kosza + Przenoszenie %d elementów do kosza + Przenoszenie %d elementów do kosza + Przenoszenie %d elementów do kosza + + + Importowanie… + Eksportowanie… + Importowanie zakończone + Eksportowanie zakończone + Importowanie nie powiodło się + Eksportowanie nie powiodło się + Importowanie niektórych wpisów nie powiodło się + Eksportowanie niektórych wpisów nie powiodło się + Nie znaleziono żadnych wpisów do zaimportowania + Nie znaleziono nowych wpisów do zaimportowania + Nie znaleziono żadnych wpisów do wyeksportowania + Kopie zapasowe + Włącz automatyczne kopie zapasowe + Zarządzaj automatycznymi kopiami zapasowymi + Możesz użyć następujących wzorców, aby automatycznie nazywać swój plik: +\n +\n%Y — rok +\n%M — miesiąc +\n%D — dzień +\n%h — godzina +\n%m — minuta +\n%s — sekunda + + USB + Wygląda na to, że masz podpiętą pamięć USB. Aby mieć pewność, że pliki na niej będą poprawnie widoczne, przyznaj aplikacji dodatkowe uprawnienia. + Wybierz folder główny pamięci USB na następnym ekranie, aby przyznać dostęp. + Wybrano nieprawidłowy folder. Wybierz folder główny pamięci USB. + + Styczeń + Luty + Marzec + Kwiecień + Maj + Czerwiec + Lipiec + Sierpień + Wrzesień + Październik + Listopad + Grudzień + + sty + lut + mar + kwi + maj + cze + lip + sie + wrz + paź + lis + gru + + w styczniu + w lutym + w marcu + w kwietniu + w maju + w czerwcu + w lipcu + w sierpniu + we wrześniu + w październiku + w listopadzie + w grudniu + Poniedziałek + Wtorek + Środa + Czwartek + Piątek + Sobota + Niedziela + PN + W + Ś + C + PT + S + N + pon. + wt. + śr. + czw. + pt. + sob. + niedz. + + Twoja wersja aplikacji nie będzie już aktualizowana. Uaktualnij do wersji Pro, aby otrzymywać nowe poprawki i inne ulepszenia. + Twoja wersja aplikacji nie będzie już aktualizowana. Uaktualnij do wersji Pro, aby otrzymywać nowe poprawki i inne ulepszenia, naciskając tutaj. + Aplikacja jest darmowa do %s. Jeśli pobierzesz ją do tego czasu, będziesz mieć ją za darmo na zawsze. + Więcej informacji + Uaktualnij + Musisz przenieść przechowywane lokalnie wydarzenia ręcznie przez wyeksportowanie ich do pliku .ics, a następnie ich zaimportowanie. Oba służące do tego przyciski znajdziesz w menu na ekranie głównym. + Witaj, +\n +\nWygląda na to, że właśnie uaktualniłeś(-aś) darmową aplikację do płatnej. Gdy będziesz z niej zadowolony(-a) i być może przeniesiesz swoje ustawienia i ulubione, możesz odinstalować starą darmową, aby uniknąć przypadkowego jej uruchomienia, ponieważ nie będziesz jej już potrzebować. +\n +\nDzięki! + Witaj, +\n +\nWygląda na to, że masz już także wersję Pro aplikacji. Gdy będziesz z niej zadowolony(-a) i być może przeniesiesz swoje ustawienia i ulubione, możesz odinstalować tę, aby uniknąć przypadkowego uruchomienia, ponieważ nie będziesz jej już potrzebować. +\n +\nDzięki! + Witaj, +\n +\nWygląda na to, że właśnie uaktualniłeś(-aś) darmową aplikację do płatnej. Gdy będziesz z niej zadowolony(-a) i być może przeniesiesz swoje dane, możesz odinstalować starą darmową, aby uniknąć przypadkowego jej uruchomienia, ponieważ nie będziesz jej już potrzebować. +\n +\nDzięki! + Witaj, +\n +\nWygląda na to, że masz już także wersję Pro aplikacji. Gdy będziesz z niej zadowolony(-a) i być może przeniesiesz swoje dane, możesz odinstalować tę, aby uniknąć przypadkowego uruchomienia, ponieważ nie będziesz jej już potrzebować. +\n +\nDzięki! + Witaj, +\n +\nWygląda na to, że właśnie uaktualniłeś(-aś) darmową aplikację do płatnej. Jeśli chcesz przenieść przechowywane lokalnie wydarzenia, musisz zrobić to ręcznie, eksportując je do pliku .ics w darmowej wersji aplikacji i importując tutaj przez górne menu. +\n +\nGdy będziesz zadowolony(-a) z konfiguracji w wersji Pro, możesz odinstalować starą darmową wersję, ponieważ nie będziesz jej już potrzebować. +\n +\nDzięki! + Witaj, +\n +\nWygląda na to, że właśnie uaktualniłeś(-aś) darmową aplikację do płatnej. Jeśli masz jakieś kontakty przechowywane w „%s”, musisz przenieść je ręcznie, eksportując do pliku .vcf w darmowej wersji aplikacji i importując tutaj przez górne menu. +\n +\nGdy będziesz zadowolony(-a) z konfiguracji w wersji Pro, możesz odinstalować starą darmową wersję, ponieważ nie będziesz jej już potrzebować. +\n +\nDzięki! + Witaj, +\n +\nWygląda na to, że właśnie uaktualniłeś(-aś) darmową aplikację do płatnej. Jeśli chcesz przenieść swoje notatki, musisz zrobić to ręcznie, eksportując je do pliku w darmowej wersji aplikacji i importując tutaj przez górne menu. +\n +\nGdy będziesz zadowolony(-a) z konfiguracji w wersji Pro, możesz odinstalować starą darmową wersję, ponieważ nie będziesz jej już potrzebować. +\n +\nDzięki! + + O aplikacji + Strona internetowa + Kod źródłowy można znaleźć na stronie + Wyślij swoje uwagi lub sugestie na: + Uaktualnij do Pro + Więcej aplikacji + Więcej naszych aplikacji + Zaproponuj aplikację znajomym + Hej! Sprawdź aplikację %1$s na %2$s + Zaproś za pomocą: + Oceń aplikację + Oceń + Przekaż datek + Śledź nas + Wersja %1$s\n© Simple Mobile Tools %2$d + Wsparcie + Pomóż nam + Portale społecznościowe + Inne + Polityka prywatności + Wersja %s + Cześć :) + Zrobione z ❤️ na Słowacji + Dodatkowe informacje + Wersja aplikacji: %s + System: %s + Witaj,<br><br> Mamy nadzieję, że aplikacja przypadła Ci do gustu. Jak można zauważyć, nie zawiera reklam, prosimy więc o wsparcie jej rozwoju przez zakup specjalnej aplikacji <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Proste podziękowanie</a>, co poskutkuje również wyłączeniem tego komunikatu.<br><br> Dziękujemy! + Witaj,<br><br>Mamy nadzieję, że aplikacja przypadła Ci do gustu. Nie zawiera reklam oraz nie zbieramy Twoich danych, dlatego wesprzyj jej rozwój, kupując <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Proste podziękowanie</a>. Będziesz także mieć odblokowane wszystkie funkcje aplikacji, w tym dostosowywanie kolorów.<br><br>Dziękujemy! + Wesprzyj nas, kupując <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Proste podziękowanie</a>, co również odblokuje wszystkie funkcje aplikacji, w tym dostosowywanie kolorów. + Kup + Zamów urządzenie Prosty Telefon + Zaktualizuj aplikację Proste podziękowanie do najnowszej wersji + Zanim zadasz pytanie, najpierw sprawdź ustawienia aplikacji i przeczytaj często zadawane pytania. Może znajduje się tam rozwiązanie. + Zanim nas ocenisz, sprawdź ustawienia aplikacji i przeczytaj często zadawane pytania. Jeśli masz jakieś problemy, może jest tam rozwiązanie. + Upewnij się też, że używasz najnowszej wersji aplikacji. + Pamiętaj również, że ta wersja aplikacji nie jest już rozwijana. Pobierz wersję Pro, aby uzyskać wiele ulepszeń. + Przeczytaj to + Przeczytaj FAQ + Witaj! +\n +\nWygląda na to, że używasz tej aplikacji już od dłuższego czasu, i naprawdę to doceniamy. +\n +\nJeśli możemy poprosić Cię o przysługę, oceń nas w Google Play. To by nam naprawdę bardzo pomogło. +\n +\nBez względu na to, jak zdecydujesz, nie zobaczysz tego komunikatu ponownie. +\n +\nDzięki! + Oceń naszą aplikację :) + Dziękujemy + Widżet jest zablokowany.\nUaktualnij do wersji Pro, aby go odblokować. + Ta funkcja jest zablokowana. Kup <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Proste podziękowanie</a>, aby odblokować pełną wersję aplikacji.<br><br>Jest to płatność jednorazowa, a jeśli nie będziesz zadowolony(-a), możemy Ci zwrócić pieniądze. + + Cześć!<br><br> Dajemy Ci znać, że ostatnio zostało wydanych kilka nowych aplikacji:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Możesz je pobrać, naciskając ich nazwy lub ikony.<br><br> Dzięki! + Prosty launcher aplikacji + Prosty kalkulator + Prosty kalendarz + Prosty aparat + Prosty zegar + Proste kontakty + Prosty telefon + Prosty szkicownik + Prosty menedżer plików + Prosta latarka + Prosta galeria + Prosta klawiatura + Prosty launcher + Prosty odtwarzacz muzyki + Proste notatki + Proste wiadomości SMS + Proste podziękowanie + Prosty rejestrator głosu + Launcher aplikacji + Kalkulator + Kalendarz + Aparat + Zegar + Kontakty + Telefon + Szkicownik + Menedżer plików + Latarka + Galeria + Klawiatura + Launcher + Odtwarzacz muzyki + Notatki + Wiadomości SMS + Podziękowanie + Rejestrator głosu + + stąd oryginalną wersję. + ]]> + + + Często zadawane pytania (FAQ) + Zanim zadasz pytanie, przeczytaj najpierw + Dlaczego nie widzę widżetu tej aplikacji na liście widżetów\? + Jest to najprawdopodobniej spowodowane przeniesieniem aplikacji na kartę pamięci. Istnieje ograniczenie systemu Android, które w takim przypadku ukrywa widżety danej aplikacji. Jedynym rozwiązaniem jest przeniesienie aplikacji z powrotem do pamięci wewnętrznej za pomocą ustawień urządzenia. + Chcę Was wesprzeć, ale nie mam jak wpłacić pieniędzy. Czy mogę zrobić coś innego? + + tej stronie, albo po prostu skontaktuj się z nami pod adresem hello@simplemobiletools.com, jeśli masz jakiekolwiek pytania. + ]]> + + Przypadkowo usunąłem kilka plików. Mogę je jakoś odzyskać? + Niestety, nie możesz. Pliki są usuwane natychmiast po potwierdzeniu w oknie dialogowym. System Android nie ma wbudowanego kosza. + Nie podobają mi się kolory widżetów. Czy mogę je zmienić\? + Tak. Po przeciągnięciu widżetu na ekran główny pojawia się okno jego konfiguracji. Zobaczysz na nim kolorowe kółka w lewym dolnym rogu, za pomocą których możesz wybrać nowe kolory. Możesz też użyć suwaka do ustawienia poziomu przezroczystości. + Czy mogę jakoś odzyskać usunięte pliki? + Jeśli faktycznie zostały usunięte, to już nie możesz. Jednakże domyślnie jest włączony kosz, dzięki czemu pliki zostaną przeniesione do niego zamiast zostać usunięte. + Z launchera zniknęła ikona aplikacji. Co mogę zrobić? + Niektóre launchery nie obsługują prawidłowo zmiany ikon aplikacji. Uruchom aplikację przez Sklep Google Play lub przez widżet, jeśli jest dostępny. Po uruchomieniu aplikacji ustaw domyślny kolor ikony (#F57C00). W najgorszym przypadku konieczne może być przeinstalowanie aplikacji. + Pieniądze zostały odjęte z mojego konta bankowego, ale nie mogę pobrać aplikacji. Co mogę zrobić? + Płatności są w pełni obsługiwane przez Google, ich system szwankuje od czasu do czasu. Wystarczy wyczyścić pamięć podręczną aplikacji Google Play i zrestartować urządzenie, a następnie ponowić próbę pobrania. + Dlaczego powinienem uaktualnić do wersji Pro? + Ponieważ Twoja wersja aplikacji nie jest już aktualizowana, błędy, które być może zauważyłeś(-aś), nigdy nie zostaną naprawione. Nie zostaną również dodane żadne nowe funkcje. Możesz kupić wersję Pro w Google Play za niewielką sumę pieniędzy. Jest to jednorazowa płatność, co oznacza, że po zakupie nigdy nie będziesz musiał(a) płacić ponownie, nawet po wymianie urządzenia. Jeśli nie spodoba Ci się wersja Pro, możesz ją po prostu odinstalować w ciągu kilku godzin, a automatycznie otrzymasz swoje pieniądze z powrotem. Jeśli chcesz zwrotu pieniędzy w dowolnym momencie, po prostu skontaktuj się z nami na hello@simplemobiletools.com, a go otrzymasz. + Jak mogę wybrać wiele elementów jednocześnie? + Można to zrobić na wiele sposobów. Pierwszym z nich jest uruchomienie trybu wyboru przez długie naciśnięcie jednego elementu, a następnie krótkie naciśnięcie innych, aby je wybrać. Drugi sposób jest podobny do wybierania elementów na komputerach PC za pomocą myszy. Wystarczy uruchomić tryb zaznaczania przez długie naciśnięcie jednego elementu, a następnie z przyciśniętym palcem przeciągnąć go przez inne elementy do zaznaczenia. Trzeci sposób zaznaczania wielu elementów to długie naciśnięcie jednego elementu, a następnie długie naciśnięcie innego, żeby wszystko pomiędzy zostało zaznaczone. Jeśli chcesz zaznaczyć wszystkie elementy, naciśnij długo jeden element, a następnie naciśnij licznik wybranych elementów w lewym górnym rogu. To zaznaczy lub odznaczy wszystko. + Zakupiłem aplikację, ale nie mogę jej pobrać na inne urządzenie. + Spróbuj wyczyścić pamięć podręczną aplikacji Google Play i zrestartować urządzenie. Jest to jakaś usterka Google Play, nie do końca związana z samą aplikacją. + + Współtwórcy + Tłumaczenie + Rozwój + Inna pomoc + + tej stronie, albo po prostu skontaktuj się z nami pod adresem hello@simplemobiletools.com, jeśli masz jakiekolwiek pytania. + Dziękuję wszystkim współtwórcom i innym wspierającym! + ]]> + + arabski + azerski + bengalski + bretoński + bułgarski + kataloński + czeski + walijski + duński + angielski + niemiecki + grecki + hiszpański + baskijski + perski + fiński + francuski + galicyjski + hindi + chorwacki + węgierski + indonezyjski + włoski + hebrajski + japoński + koreański + litewski + nepalski + norweski + niderlandzki + polski + portugalski + rumuński + rosyjski + słowacki + słoweński + serbski + szwedzki + tamilski + turecki + ukraiński + wietnamski + chiński (Hongkong) + chiński (uproszczony) + chiński (tradycyjny) + + Pobierz wersję Pro już teraz! + Podstawowa + Pro + Brak reklam + Bez dostępu do Internetu + 100% gwarancja zwrotu pieniędzy + Jednorazowa płatność + Udoskonalony wygląd + + Zaawansowany edytor zdjęć + Zaawansowany edytor zdjęć i wideo + Obsługa plików HEIC/HEIF + Zaawansowana wsadowa zmiana nazw plików + Blokowanie poszczególnych folderów + Obsługa drukowania + + Obsługa stref czasowych + Uczestnicy i przypomnienia e-mail + Łatwe importowanie wydarzeń + Nowe widżety + + Ulepszone scalanie powielonych kontaktów + Dostosowywanie rozmiaru czcionki + Opcjonalne udostępnianie prywatnych kontaktów w naszych aplikacjach + Konfigurowalne dzwonki kontaktów + Filtrowanie kontaktów + Kontakty przechowywane prywatnie + + Listy kontrolne + Różne notatki i kolory w widżetach + Blokowanie notatek + + Dostosowywanie formatu daty i godziny + Skróty ekranu głównego + Obsługa kompresji plików + Karta z ostatnimi plikami + + Dostosowywanie koloru tła + Obsługa importowania plików + Powiększanie + + Aplikacja korzysta z następujących bibliotek innych firm, aby ułatwić mi życie. Dziękuję. + Licencje innych firm + Kotlin (język programowania) + Subsampling Scale Image View (przybliżanie obrazów) + Glide (ładowanie obrazów i ich przechowywanie w pamięci podręcznej) + Picasso (ładowanie obrazów i ich przechowywanie w pamięci podręcznej) + Android Image Cropper (kadrowanie i obracanie obrazów) + RtlViewPager (przeciąganie ekranu od prawej do lewej strony) + Joda-Time (zamiennik obsługi dat w Javie) + Stetho (debugowanie baz danych) + Otto (szyna zdarzeń) + PhotoView (przybliżanie GIF-ów) + PatternLockView (ochrona danych wzorem) + Reprint (ochrona danych odciskiem palca) + Gif Drawable (ładowanie GIF-ów) + AutoFitTextView (zmiana rozmiaru tekstu) + Robolectric (testowanie aplikacji) + Espresso (testowanie aplikacji) + Gson (parser JSON) + Leak Canary (wykrywanie wycieków pamięci) + Number Picker (konfigurowalny selektor liczb) + ExoPlayer (odtwarzacz wideo) + VR Panorama View (wyświetlanie panoram) + Apache Sanselan (odczytywanie metadanych obrazów) + Android Photo Filters (filtry obrazów) + Gesture Views (przybliżanie obrazów) + Indicator Fast Scroll (litery na pasku przewijania) + Event Bus (komunikacja w aplikacji) + Audio Record View (wizualizacja audio) + SMS MMS (obsługa SMS-ów i MMS-ów) + APNG Android (obsługa animowanych WebP) + PDFViewPager (czytnik PDF) + M3U Parser (obsługa plików playlist M3U) + AndroidLame (koder MP3) + + Okres próbny wygasł + Rozpocznij darmowy okres próbny + Twój okres próbny wkrótce wygaśnie. + Odblokuj aplikację na jeszcze jeden dzień + Witaj w %s! + Dziękujemy za korzystanie z naszej aplikacji. Możesz używać tej odblokowanej wersji przez %d dni. Po zakończeniu okresu próbnego rozważ uaktualnienie do wersji Pro. Ma ona ogromną liczbę nowych funkcji, nowoczesny wygląd, brak reklam i wiele innych ulepszeń. +\n +\nWystarczy, że zapłacisz za nią tylko raz w życiu, a jeśli nie będziesz zadowolony(-a), możesz ją odinstalować i otrzymać zwrot pieniędzy. +\n +\nMamy nadzieję, że Ci się spodoba :) + Uaktualnij do wersji Pro, aby w pełni korzystać z aplikacji. +\n +\nWystarczy, że zapłacisz za nią tylko raz w życiu, a jeśli nie będziesz zadowolony(-a), możesz ją odinstalować i otrzymać zwrot pieniędzy. +\n +\nDo zobaczenia :) + + Twój okres próbny wygasa za %d dzień. + Twój okres próbny wygasa za %d dni. + Twój okres próbny wygasa za %d dni. + Twój okres próbny wygasa za %d dni. + + + PRZESTARZAŁA: Ta wersja aplikacji nie jest już utrzymywana. Pobierz wersję Pro z https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Pamiętaj, że jeśli odinstalujesz którąkolwiek z płatnych aplikacji w ciągu 2 godzin, automatycznie otrzymasz zwrot pieniędzy. Jeśli chcesz zwrotu pieniędzy w dowolnym momencie później, wystarczy skontaktować się z nami na hello@simplemobiletools.com, a go otrzymasz. To sprawia, że aplikacje są łatwe do wypróbowania :) + + Zestaw prostych, otwartoźródłowych aplikacji na Androida z konfigurowalnymi widżetami, bez reklam i zbędnych uprawnień. + \ No newline at end of file diff --git a/commons/src/main/res/values-pt-rBR/strings.xml b/commons/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000..b37a3f6e1 --- /dev/null +++ b/commons/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,1130 @@ + + + OK + Cancelar + Voltar + Nada + Mais tarde + Salvar como + Arquivo salvo com sucesso + Formato de arquivo inválido + Memória insuficiente + Ocorreu um erro: %s + Error: %s + Abrir com + Editar com + Editar + Nenhum aplicativo encontrado + Nenhum navegador encontrado + Nenhum app de e-mail encontrado + Definir como + Copiar para área de transferência + Copiar número para área de transferência + Valor copiado para a área de transferência + Valor copiado para a área de transferência:\n%s + Discar número + Desconhecido + Sempre + Nunca + Detalhes + Notas + Excluindo pasta \'%s\' + Nenhum + Legenda + Transparente + Cor transparente + Selecione uma cor diferente + Baixar + Notificação + Notificações + E-mail + Anterior + Reproduzir / Pausar + Próximo + Número + Nenhum contato encontrado + Pedir as permissões necessárias + O aplicativo não pode acessar seus contatos + O aplicativo não tem permissão para iniciar chamadas telefônicas, por favor, conceda-a nas configurações do dispositivo + Insira o texto aqui + Ligar para %s + Confirmar chamada %s + Zero + Um + Dois + Três + Quatro + Cinco + Seis + Sete + Oito + Nove + Valor + O valor não pode ficar vazio + Criar novo contato + Adicionar um contato existente + App Corrompido + Isenção + Tirar foto + Escolher foto + Escolher vídeo + Escolher contato + Escolher arquivo + Gravar áudio + Gravar vídeo + Atualizando… + Armazenamento do telefone + Armazenamento do telefone (não visível por outros aplicativos) + Audio + + Data de Nascimento + Data Especial + + Residencial + Comercial + + Celular + Principal + Fax Comercial + Fax Residencial + Pager + Nenhum número de telefone foi encontrado + + Alterar modo de visualização + Grade + Grade (Pro) + Grade irregular + Lista + Aumentar número de colunas + Reduzir número de colunas + Número de colunas + Colunas em retrato + Colunas em paisagem + Trocar imagem de capa + Selecionar foto + + %d coluna + %d colunas + %d colunas + + + Gerenciar números bloqueados + Não há números bloqueados. + Adicionar um número a bloquear + Bloquear número + Bloquear números + Números bloqueados + Exportar números bloqueados + Importar números bloqueados + Você precisa tornar este aplicativo padrão para poder bloquear números. + Definir como padrão + Tem certeza que deseja bloquear \"%s\"? + Bloquear chamadas de contatos não salvos + Bloquear mensagens de contatos não salvos + Digite um número ou um padrão (ex. *12345*, +1*8888) para bloquear todas as chamadas de números correspondentes. + Não é possível bloquear números desconhecidos sem a permissão de ID de chamadas. + + Favoritos + Adicionar favoritos + Adicionar aos favoritos + Remover dos favoritos + + Pesquisar + Pesquisar em %s + Digite pelo menos 2 letras para iniciar a pesquisa. + Pesquisar contatos + Pesquisar favoritos + Pesquisar apps + Pesquisar eventos + Pesquisar grupos + Pesquisar histórico + Pesquisar chamadas + Pesquisar arquivos + Pesquisar pastas + Pesquisar arquivos e pastas + Pesquisar playlists + Pesquisar artistas + Pesquisar álbuns + Pesquisar faixas + Pesquisar texto + Pesquisar conversas + Pesquisar gravações + + Filtrar + Filtrar (Pro) + Nenhum item encontrado. + Alterar filtro + + A permissão de Armazenamento é necessária + A permissão de Contatos é necessária + A permissão de Câmera é necessária + A permissão de Áudio é necessária + Sem permissão + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Renomear arquivo + Renomear pasta + Não foi possível renomear o arquivo + Não foi possível renomear a pasta + O nome da pasta não pode estar vazio + Já existe uma pasta com este nome + Não é possível renomear a pasta raiz de um armazenamento + A pasta foi renomeada com sucesso + Renomeando a pasta + O nome do arquivo não pode ficar em branco + O nome do arquivo contém caracteres inválidos + O nome do arquivo \'%s\' contém caracteres inválidos + A extensão não pode ficar em branco + Arquivo de origem %s não existe + Adicionar ao início dos nomes + Adicionar ao fim dos nomes + Renomeação simples + Padrão + Texto a adicionar + %Y - ano\n%M - mês\n%D - dia\n%h - hora\n%m - minuto\n%s - segundo\n%i – aumento numérico de 1 + Nome do arquivo (sem .txt) + Nome do arquivo (sem .json) + Nome do arquivo (sem .zip) + A partir do Android 11, você não pode mais ocultar arquivos e pastas assim + + Copiar + Mover + Copiar / Mover + Copiar para + Mover para + Origem + Destino + Selecione o destino + Clique aqui para escolher o destino + Não foi possível escrever no destino selecionado + Por favor selecione um destino + A origem e o destino não podem ser iguais + Não foi possível copiar os arquivos + Copiando… + Arquivos copiados com sucesso + Arquivo copiado com sucesso + Ocorreu um erro ao copiar + Movendo… + Arquivos movidos com sucesso + Arquivo movido com sucesso + Alguns arquivos não foram movidos + Alguns arquivos não foram copiados + Nenhum arquivo selecionado + Salvando… + Não foi possível criar pasta %s + Não foi possível criar o arquivo %s + Nenhum novo ítem foi encontrado + O destino não tem espaço suficiente disponível.\nRequerido %1$s, disponível %2$s + O serviço do sistema para selecionar arquivos e pastas não está disponível + + Criar + Pasta + Arquivo + Criar nova pasta + Já existe um arquivo ou pasta com este nome + O nome contém caracteres inválidos + Digite um nome + Ocorreu um erro desconhecido + + Já existe um arquivo com o nome \"%s\" + Já existe um arquivo com o nome \"%s\". Sobrescrever? + A pasta \"%s\" já existe + Mesclar + Manter ambas as versões + Sobrescrever + Ignorar + Adicionar sufixo \'_1\' + Aplicar a todos os conflitos + O sistema não permite a operação nesta pasta, por favor escolha outra + O sistema não permite copiar para esta pasta, por favor, escolha outra + O sistema não permite que você renomeie esta pasta + Não é possível renomear pastas diretamente no armazenamento interno, somente subpastas + Não foi possível renomear esta pasta + + Selecionar pasta + Selecionar arquivo + Confirmar acesso ao armazenamento externo + Confirmar acesso à pasta + Por favor escolha a pasta raiz do cartão SD no próximo passo para conceder acesso de escrita + Se você não encontrar o cartão SD, tente isto + Por favor, permita que o aplicativo acesse o armazenamento utilizando o botão \"Use esta pasta\" no canto inferior da próxima tela. + Por favor, permita o acesso de \'<b>%s</b>\' na próxima tela ao pressionar \'<b>Use this folder</b>\' no canto inferior da tela. + Por favor, pressione \'<b>Save</b>\' no canto inferior da próxima nela para criar uma nova pasta. + Confirmar seleção + Carregando… + Conceda ao nosso aplicativo acesso a todos os seus arquivos, ele pode não funcionar bem sem ele. + + %d item + %d itens + %d itens + + + + %d item + %d itens + %d itens + + + Excluindo %d item + Excluindo %d itens + Excluindo %d itens + + + + %d contato + %d contatos + %d contatos + + + Selecionar armazenamento + Armazenamento + Interno + Cartão SD + Raiz + Pasta inválida, por favor selecione a raiz do cartão SD + As pastas do cartão SD e do dispositivo USB não podem ser a mesma + Parece que você instalou o aplicativo em um cartão SD, o que torna os widgets indisponíveis. Você não os verá na lista de widgets. + Isto é uma limitação do sistema operacional, caso você queira ter acesso aos widgets será preciso mover o aplicativo para o armazenamento interno. + A pasta esrrada foi selecionada, por favor, selecione \'%s\' + + Propriedades + Caminho + Itens selecionados + Itens nesta pasta + Total de arquivos + Resolução + Duração + Artista + Álbum + Distância focal + Tempo de exposição + Velocidade ISO + Abertura + Câmera + EXIF + Título da música + Coordenadas GPS + Altitude + Remover EXIF + Você tem certeza de que desejava remover os valores EXIF, como coordenadas de GPS, modelo de câmera, etc.? + Valores EXIF foram removidos com sucesso + + Cor de fundo + Cor do texto + Cor primária + Cor de destaque do tema branco + Cor de destaque do tema Preto & Branco + Cor do primeiro plano + Cor do ícone do aplicativo + Cor da barra de navegação inferior + Restaurar predefinições + Usar padrão + Padrão + Mudar cor + Tema + Alterar uma cor fará com que mude para o tema Personalizado + Salvar + Descartar + Desfazer alterações + Tem certeza que deseja desfazer as alterações? + Esta ação não pode ser revertida. + Existem alterações não salvas. Salvar antes de sair? + Aplicar cores a todos os aplicativos Simple + AVISO: Alguns lançadores não são capazes de lidar corretamente com a customização de ícones. Nestes casos, se o icone desaparecer tente abrir o aplicativo pelo Google Play, ou através de um widget, se disponível. + Ao entrar, simplesmente reverta a cor do ícone para o valor padrão (laranja #F57C00). No pior dos casos pode ser preciso reinstalar o aplicativo. + Cores atualizadas com sucesso. Um novo tema chamado \'Compartilhado\' foi adicionado, use-o para atualizar as cores de todos os apps no futuro. + Embora você esteja usando a versão Pro do aplicativo, o Simple Thank You ainda é necessário para fins técnicos. Ele realiza a sincronização de cores. + + Agradecimento Simple para desbloquear esta função e apoiar o desenvolvimento. Obrigado! + ]]> + + + Claro + Escuro + Auto + Auto claro / escuro + Ensolarado + Vermelho Escuro + Branco + Preto & branco + Personalizado + Compartilhado + Padrão do sistema + + Novidades + * apenas as alterações significativas são listadas aqui, mas também há sempre algumas melhorias pequenas não mencionadas + + Excluir + Remover + Renomear + Compartilhar + Compartilhar via + Redimensionar + Selecionar tudo + Selecionar texto + Ocultar + Exibir + Ocultar pasta + Reexibir pasta + Exibir ocultos temporariamente + Parar de exibir mídia oculta + Não é possível compartilhar todos esses arquivos de uma só vez + Esvaziar e desativar a Lixeira + Desfazer + Refazer + Imprimir + Imprimir (Pro) + Atalho + Criar atalho + Criar atalho (Pro) + Adicionar número ao contato + Ver detalhes de contato + Chamada no SIM 1 + Chamada no SIM 2 + Exibir/ocultar nome do arquivo + Mover para cima + Mover para baixo + Fixar item + Desfixar item + Enviar SMS + Enviar e-mail + Ligar + Contact details + Add contact + Papeis de parede + + Ordenar por + Nome + Tamanho + Data de modificação + Data de criação + Data de criação + Título + Nome do arquivo + Extensão + Aleatório + Ordenar aleatoriamente + Crescente + Decrescente + Apenas para esta pasta + Ordenar numeros pelo seu valor real + Primeiro nome + Nome do meio + Sobrenome + Nome completo + Usar ordenação personalizada + Alterar ordem + + Deseja realmente excluir? + Deseja realmente excluir %s? + Delete %s? + + Deseja realmente mover %s para a Lixeira? + + Deseja realmente excluir este item? + Deseja realmente mover este item para a Lixeira? + Não perguntar novamente por enquanto + Não mostrar novamente + Sim + Não + Talvez + + AVISO: Você está excluindo %d pasta + AVISO: Você está excluindo %d pastas + AVISO: Você está excluindo %d pastas + + + PIN + Digite o PIN + Favor digitar o PIN + PIN incorreto + Repetir PIN + Padrão + Inserir padrão + Padrão errado + Repetir padrão + Biometria + Digital + Adicionar digital + Posicione seu dedo sobre o leitor de digitais + Abrir diálogo de verificação de ID biométrico + Autenticar + Autenticação falhou + Autenticação bloqueada, favor tentar novamente em instantes + Você não tem digitais cadastradas. Favor adiconar alguma nas Configurações do seu dispositivo + Ir para Configurações + Senha criada com sucesso. Reinstale o app caso você a esqueça. + Proteção criada com sucesso. Reinstale o app caso tenha problemas ao redefini-la. + Bloquear pasta + Bloquear pasta (Pro) + Desbloquear pasta + Esta proteção funciona apenas neste aplicativo, não foi criada para substituir uma criptografia de pasta real a nível de sistema. + + Ontem + Hoje + Amanhã + Todos os dias + Ocultar ano + segundos + minutos + horas + dias + s + m + h + wk. + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d dia + %d dias + %d dias + + + %d semana + %d semanas + %d semanas + + + %d mês + %d meses + %d meses + + + %d ano + %d anos + %d anos + + + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d dia + %d dias + %d dias + + + %d semana + %d semanas + %d semanas + + + %d mês + %d meses + %d meses + + + %d ano + %d anos + %d anos + + + + %d segundo atrás + %d segundos atrás + %d segundos atrás + + + %d minuto atrás + %d minutos atrás + %d minutos atrás + + + %d hora atrás + %d horas atrás + %d horas atrás + + + %d dia atrás + %d dias atrás + %d dias atrás + + + %d semana atrás + %d semanas atrás + %d semanas atrás + + + %d mês atrás + %d meses atrás + %d meses atrás + + + %d ano atrás + %d anos atrás + %d anos atrás + + + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d dia + %d dias + %d dias + + + %d semana + %d semanas + %d semanas + + + %d mês + %d meses + %d meses + + + %d ano + %d anos + %d anos + + + Tempo restante até o alarme disparar:\n%s + Tempo restante até o lembrete:\n%s + Tempo restante: +\n%s + Por favor, verifique se o alarme funciona corretamente antes de confiar nele. Ele pode não funcionar direito devido a restrições de sistema relacionadas à economia de bateria. + Certifique-se de que os lembretes funcionam corretamente antes de confiar neles. Eles podem se funcionar direito devido a restrições de sistema relacionadas à economia de bateria. + As notificações deste aplicativo foram desativadas pelo sistema. Por favor, reative-as através nas configurações do seu aparelho. + + Alarme + Soneca + Dispensar + Sem lembrete + No início + Sons do sistema + Seus sons + Adicionar um novo som + Sem som + Durante o dia às hh:mm + Durante o dia às %02d:%02d + + Configurações + Compre o Simple Thank You + General + Personalização de cores + Personalização de cores aprimorada + Personalizar cores + Personalizar cores (Locked) + Trancado + Personalizar cores de widget + Personalizar notificações + Notification sound + Usar o idioma inglês + Idioma + Exibir itens ocultos + Tamanho do texto + Pequeno + Médio + Grande + Muito grande + Proteger com senha a visualização de itens ocultos + Proteger com senha todo o app + Proteger com senha as operações de excluir e mover arquivos + Não atualizar o valor Data de modificação nas operações com arquivo + Exibir bolha de informação ao rolar usando a barra de rolagem + Impedir que o telefone entre em suspensão enquanto o aplicativo estiver em primeiro plano + Sempre pular confirmação de exclusão + Habilitar puxar do topo da tela para atualizar o conteúdo + Usar horário do formato 24-horas + Alterar formato de data e hora + Iniciar a semana no Domingo + Widgets + Sempre usar o mesmo tempo de soneca + Tempo de soneca + Vibrar ao pressionar um botão + Mover itens para a Lixeira em vez de excluir + Intervalo de limpeza da Lixeira + Esvaziar Lixeira + Forçar modo retrato + Exportar configurações + Importar configurações + Configurações exportadas com sucesso + Configurações importadas com sucesso + Ordenar por sobrenome + Limpar cache + Mostrar diálogo para confirmar a chamada antes de ligar + + Visibilidade + Segurança + Rolagem + Operações de arquivos + Lixeira + Salvando + Inicialização + Texto + Migrando + Qualidade + Tela principal + Miniaturas + Visualização em Lista + + Ignorar + Excluir pasta + Pastas ignoradas + (excluído) + Gerenciar pastas ignoradas + Remover todas + Remover todas as pastas da lista de pastas ignoradas\? Esta ação não exclui as pastas. + Exibir excluído temporariamente + Parar de exibir excluído + + Gerenciar abas visíveis + Aba exibida na inicialização do aplicativo + Contatos + Favoritos + Histórico de chamadas + Grupos + Última usada + Arquivos + Arquivos recentes + + Restaurar este arquivo + Restaurar os arquivos selecionados + Restaurar todos os arquivos + A Lixeira foi esvaziada com sucesso + Os arquivos foram restaurados com sucesso + Deseja realmente esvaziar a Lixeira? Os arquivos serão excluidos permanentemente. + A Lixeira está vazia + Não é permitido mover itens da Lixeira. Por favor, use a função Restaurar + Exibir a Lixeira + Ocultar a Lixeira + Abrir a Lixeira + Skip the Recycle Bin, delete files directly + + Movendo %d item para a Lixeira + Movendo %d itens para a Lixeira + Movendo %d itens para a Lixeira + + + Importando… + Exportando… + Importado com sucesso + Exportado com sucesso + Falha na importação + Falha na exportação + Houve falha em alguns itens da importação + Houve falha em alguns itens da exportação + Não foram encontrados itens para importar + Nenhuma entrada nova foi encontrada + Não foram encontramos itens para exportar + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Parece que você possui um dispositivo USB conectado. Para que os arquivos deste dispositivo sejam exibidos corretamente, pode ser preciso permissões adicionais. + Por favor, escolha a pasta raiz do dispositivo USB na próxima tela, para conceder acesso + Pasta inválida, por favor selecione a raiz do seu dispositivo USB + + Janeiro + Fevereiro + Março + Abril + Maio + Junho + Julho + Agosto + Setembro + Outubro + Novembro + Dezembro + + Jan + Feb + Mar + Apr + May + June + July + Aug + Set + Oct + Nov + Dec + + em Janeiro + em Fevereiro + em Março + em Abril + em Maio + em Junho + em Julho + em Agosto + em Setembro + em Outubro + em Novembro + em Dezembro + Segunda-feira + Terça-feira + Quarta-feira + Quinta-feira + Sexta-feira + Sábado + Domingo + S + T + Q + Q + S + S + D + Seg + Ter + Qua + Qui + Sex + Sáb + Dom + + A versão do seu aplicativo não será mais atualizada. Atualize para a versão Pro para receber novas correções e outras melhorias. + A versão do seu aplicativo não será mais atualizada. Atualize para a versão Pro para receber novas correções e outras melhorias clicando aqui. + Grátis até: %s. Se você baixar antes disso, poderá utilizar gratuitamente para sempre. + Mais informação + Atualizar + Você precisará migrar de forma manual os eventos armazenados localmente. Você pode fazer isso exportando-os para um arquivo .ics, e depois importando este arquivo. Você pode encontrar os botões de importar/exportar no menu da tela inicial. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Olá, +\n +\nparece que você acabou de atualizar a partir da versão gratuita. Assim que você estiver feliz com esta versão e já tenha migrado seus dados, você pode desinstalar a antiga versão gratuita para evitar abri-la acidentalmente, pois você não precisará mais dela. +\n +\nObrigado! + Olá +\n +\nparece que você já tem a versão Pro também. Uma vez que você esteja feliz com e já tenha migrado seus dados, você pode desinstalar esta versão para evitar lançá-la acidentalmente, pois você não precisará mais dela. +\n +\nObrigado! + Olá +\n +\nparece que você acabou de atualizar a partir da versão gratuita. Se você quiser migrar seus eventos armazenados localmente, você tem que fazê-lo manualmente, exportando-os para um arquivo .ics na versão gratuita do aplicativo e importando aqui através do menu superior. +\n +\nUma vez que você esteja satisfeito com sua configuração na versão Pro, você pode desinstalar o antigo gratuito, pois você não precisará mais dele. +\n +\nObrigado! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Sobre + Website + Para os código-fonte visite + Envie os seus comentários ou sugestões para + Atualizar para versão Pro + Mais aplicativos + More aplicativos nossos + Convidar amigos + Opa, dê uma olhada no %1$s em %2$s + Convidar via + Nos avalie na Play Store + Avaliar + Doar + Siga-nos + v %1$s\nCopyright © Simple Mobile Tools %2$d + Suporte + Nos ajude + Social + Outros + Política de Privacidade + Versão %s + Olá :) + Feito com ❤️ na Eslováquia + Informações adicionais + Versão do app: %s + Sistema operacional: %s + +
    + Esperamos que esteja gostando do app. Ele não contém anúncios, então apoie o desenvolvimento adquirindo o Simple Thank You, ele também impede este diálogo de aparecer novamente.

    + Obrigado! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Comprar + Ordem Telefones Simples + Por favor, atualize o Simple Thank You para a versão mais recente + Antes de fazer uma pergunta, por favor verifique as configurações do aplicativo e leia a lista de Perguntas Frequentes. + Antes de nos avaliar, por favor verifique as configurações do aplicativo e leia a lista de Perguntas Frequentes. Se você tiver algum problema, talvez a solução esteja lá. + Verifique também se você está usando a versão mais recente do aplicativo. + Por favor, note que esta versão não está mais sendo desenvolvida. Obtenha a versão Pro para desfrutar das atualizações. + Ler + Leia as Perguntas Frequentes + Olá,\n\nParece que você já está utilizando este app a algum tempo, e nós agradecemos a você por isso.\n\nPor favor, considere nos avaliar na Google Play. Isso iria nos ajudar bastante.\n\nDe uma forma ou de outra, você não verá esta mensagem novamente.\n\nObrigado! + Avalie nosso aplicativo :) + Obrigado + O widget está bloqueado.\nAtualize para a versão Pro para desbloqueá-lo. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + Gostariamos de avisar que lançamos um novo app recentemente:

    + %2$s

    + %4$s

    + %6$s

    + Você pode baixá-lo pressionando o título.

    + Obrigado + ]]> +
    + Lançador de Aplicativos Simples + Calculadora Simples + Calendário Simples + Câmera Simples + Relógio Simples + Contatos Simples + Discador Simples + Desenhos Simples + Gerenciador Simples + Lanterna Simples + Galeria Simples + Teclado Simples + Launcher Simples + Player de Música Simples + Notas Simples + Mensagens SMS Simples + Obrigado Simples + Gravador de Voz Simples + Lançador de Aplicativos + Calculadora + Calendário + Câmara + Relógio + Contatos + Discador + Desenho + Gerenciador de Arquivos + Lanterna + Galeria + Teclado + Launcher + Reprodutor de Músicas + Notas + Mensagens SMS + Obrigado + Gravador de Voz + + aqui. + ]]> + + + Perguntas Frequentes + Antes de fazer uma pergunta, leia primeiro as + Por que não vejo o widget deste aplicativo na lista de widgets? + O mais provável é que você tenha movido o aplicativo para um cartão SD. Existe uma limitação do sistema Android que oculta os widgets de aplicativos fornecidos neste caso. + A única solução é mover o aplicativo de volta para o Armazenamento Interno por meio das configurações do seu dispositivo. + Eu gostaria de apoiá-los, mas não posso doar dinheiro. Há algo mais que eu possa fazer? + Sim, é claro. Você pode divulgar os aplicativos ou dar um bom feedback e avaliações. Você também pode ajudar traduzindo os aplicativos em um novo idioma, ou simplesmente atualizar algumas traduções existentes. O guia de tradução está <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>neste site</a> ou apenas contate-nos em <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se tiver alguma dúvida. + Eu exclui alguns arquivos por engano, como posso recuperá-los? + Infelizmente, você não pode. Os arquivos são apagados instantaneamente após a caixa de diálogo de confirmação, não há lixeira disponível. + Eu não gosto das cores do widget, posso mudá-las? + Sim, enquanto você arrasta um widget em sua tela inicial, uma tela de configuração do widget aparece. Você verá quadrados coloridos no canto inferior esquerdo, basta pressioná-los para escolher uma nova cor. Você também pode usar o controle deslizante para ajustar a transparência (alfa). + Posso restaurar de alguma forma os arquivos apagados? + Por padrão os arquivos são movidos para a Lixeira. No entanto, se a Lixeira tiver sido desativada os arquivos serão removidos permanentemente. + O ícone do app desapareceu. O que posso fazer? + Isso deve ter ocorrido porque o seu lançador de aplicativos não suporta corretamente a customização de ícones. Tente abrir o app pela loja do Google Play ou por um widget, se possível. + Uma vez aberto o app, configure a cor do ícone de volta para o valor padrão (laranja #F57C00). No pior dos casos pode ser preciso reinstalar o app. + O dinheiro foi deduzido da minha conta bancária, mas não consigo fazer o download do aplicativo. O que eu posso fazer? + Os pagamentos são totalmente gerenciados pelo Google, o sistema deles falha de vez em quanto. Apenas limpe o cache do aplicativo Google Play, reinicie o dispositivo e tente baixá-lo novamente. + Por que eu deveria atualizar para a versão Pro? + Como a versão do seu aplicativo não é mais atualizada, os erros que você talvez tenha encontrado nunca serão corrigidos. Também não haverá novas funções adicionadas. Você pode comprar a versão Pro no Google Play por uma pequena quantia em dinheiro. + É um pagamento único, o que significa que, uma vez que você o compre, nunca precisará pagar novamente. Nem mesmo depois de adquirir um novo dispositivo. Se você não gostar da versão Pro, basta desinstalá-la em algumas horas e você receberá seu dinheiro automaticamente. + Se você quiser um reembolso a qualquer momento depois, basta entrar em contato conosco pelo e-mail hello@simplemobiletools.com e você o receberá. + Como posso selecionar múltiplos itens de uma só vez? + Existem muitas formas de fazer isso. A primeira delas é acessar o modo de seleção, mantendo um item pressionado e clicando nos demais para selecioná-los. A segunda maneira é similar à seleção de itens com um mouse em um computador: basta acessar o modo de seleção, mantendo um item pressionado e arrastar seu dedo para selecionar os demais itens. A terceira forma de seleção múltipla é manter um item pressionado e, em seguida, pressionar outro para que todos os itens entre eles sejam selecionados. Caso deseje selecionar todos os itens, basta manter um deles pressionado e clicar na contagem de itens selecionados no canto superior esquerdo da tela. Essa ação selecionará ou removerá a seleção de todos os itens. + Comprei o aplicativo, mas não consigo realizar seu download em outro dispositivo. + Experimente limpar o cache do aplicativo Google Play e reiniciar seu dispositivo. Trata-se de uma falha do Google Play e não está relacionada ao aplicativo em si. + + Contribuidores + Tradução + Desenvolvimento + Other help + Esta lista contém todas as pessoas que ajudaram notavelmente qualquer aplicativo dentro da suíte Simple Mobile Tools, não apenas este. As traduções são feitas por voluntários, avise-nos se você também quiser ajudar. O guia de tradução está <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>neste site</a> ou simplesmente contate-nos em <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se tiver alguma dúvida. Obrigado a todos os colaboradores e outros apoiadores! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Atualize para a versão pro agora! + Básico + Pro + Sem anúncios + Sem acesso à internet + Garantia 100% de Reembolso + Pagamento único + Design aprimorado + + Editor de fotos avançado + Editor avançado de foto e vídeo + Suporte para arquivos HEIC/HEIF + Renomear arquivos em lote avançado + Bloqueio de pastas individuais + Suporte de impressão + + Suporte de fuso-horário + Participantes e lembretes por e-mail + Importação de eventos simples + Novos widgets + + Junção de contatos duplicados melhorada + Personalização do tamanho da letra + Compartilhamento entre contatos opcional dentro de nossos apps + Toques personalizados para os contatos + Filtragem de contatos + Contatos armazenados em local privado + + Listas + Notas e cores diferentes por widgets + Bloqueio de notas + + Personalização do formato de data e hora + Atalhos na tela principal + Suporte para compressão de arquivos + Guia com arquivos recentes + + Personalização da cor de fundo + Suporte de importação de arquivos + Ampliando + + Este aplicativo usa as seguintes bibliotecas de terceiros para facilitar a minha vida. Obrigado. + Licenças de terceiros + Kotlin (linguagem de programação) + Subsampling Scale Image View (ampliação de imagens) + Glide (carregamento e cache de imagens) + Picasso (carregamento e cache de imagens) + Android Image Cropper (recorte e rotação de imagens) + RtlViewPager (deslizar à direita/esquerda) + Joda-Time (sustituto para Java date) + Stetho (depuração a bases de dados) + Otto (canal de eventos) + PhotoView (animação de GIFs) + PatternLockView (travamento via padrões) + Reprint (travamento via impressões digitais) + Gif Drawable (carregamento de GIFs) + AutoFitTextView (redimensionamento de texto) + Robolectric (framework de teste) + Espresso (helper de teste) + Gson (analisador JSON) + Leak Canary (detector de vazamento de memória) + Number Picker (selecionador personalizável de número) + ExoPlayer (reprodutor de vídeos) + VR Panorama View (visualizador de panoramas) + Apache Sanselan (leitura de metadados de imagem) + Android Photo Filters (filtros de imagem) + Gesture Views (zoom para imagens) + Indicator Fast Scroll (letras na barra de rolagem) + Event Bus (comunicação dentro do aplicativo) + Audio Record View (visualização de áudio) + SMS MMS (uso de SMS e MMS) + APNG Android (suporte para WebP animado) + Visualizador PDF Android + M3U Parser (Gerenciador de Arquivo de Playlist m3u) + AndroidLame (codificador de mp3) + + Teste expirado + Iniciar teste grátis + Seu teste acaba em breve. + Unlock the app for one final day + Bem-vindo ao app %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Seu teste acaba em %d dia. + Seu teste acaba em %d dias. + Seu teste acaba em %d dias. + + + OBSOLETO: Esta versão do app não recebe mais atualizações. Por favor obtenha a versão Pro em https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Não se esqueça de que se você desinstalar um aplicativo pago em menos de duas horas você receberá reembolsado(a) automaticamente. Se você precisar de um reembolso após isso, entre em contato conosco através hello@simplemobiletools.com. Isso torna tudo mais fácil se você quiser testar :) + + Um grupo de aplicativos simples, open source, para Android com widgets personalizados, sem anúncios nem permissões desnecessárias. +
    diff --git a/commons/src/main/res/values-pt/strings.xml b/commons/src/main/res/values-pt/strings.xml new file mode 100644 index 000000000..7d929c998 --- /dev/null +++ b/commons/src/main/res/values-pt/strings.xml @@ -0,0 +1,1121 @@ + + + OK + Cancelar + Recuar + Nada + Mais tarde + Guardar como + Ficheiro guardado com sucesso + Formato de ficheiro inválido + Memória insuficiente + Ocorreu um erro: %s + Erro: %s + Abrir com + Editar com + Editar + Nenhuma aplicação encontrada + Navegador não encontrado + Cliente de e-mail não encontrado + Definir como + Copiar para a área de transferência + Copiar número para a área de transferência + Valor copiado para a área de transferência + Valor copiado para a área de transferência:\n%s + Marcar número + Desconhecido + Sempre + Nunca + Detalhes + Notas + A apagar a pasta \'%s\' + Nenhuma + Etiqueta + Transparente + Cor transparente + Selecione uma cor diferente + Descarregar + Notificação + Notificações + E-mail + Anterior + Reproduzir/Pausa + Seguinte + Número + Não existem contactos + Pedir permissão necessária + Não foi possível aceder aos contactos + A aplicação não tem permissão para fazer chamadas. Conceda as permissões necessárias nas definições do sistema + Introduza aqui o texto + Ligar a %s + Confirmar ligação a %s + Zero + Um + Dois + Três + Quatro + Cinco + Seis + Sete + Oito + Nove + Valor + O campo Valor não pode estar vazio + Criar novo contacto + Adicionar a um contacto existente + Aplicação danificada + Aviso legal + Tirar foto + Escolher foto + Escolher vídeo + Escolher contacto + Escolher ficheiro + Gravar áudio + Gravar vídeo + A atualizar… + Armazenamento do telefone + Armazenamento do telefone (não visível por outras alicações) + Audio + + Data de nascimento + Aniversário + + Pessoal + Profissional + + Telemóvel + Principal + Fax profissional + Fax pessoal + Pager + Número de telefone não encontrado + + Mudar tipo de vista + Grelha + Grelha (Pro) + Grelha ímpar + Lista + Aumentar número de colunas + Diminuir número de colunas + Número de colunas + Número de colunas modo vertical + Número de colunas modo horizontal + Alterar imagem do álbum + Selecionar foto + + %d coluna + %d colunas + %d colunas + + + Gerir números bloqueados + Não existem números bloqueados. + Adicionar um número a bloquear + Bloquear número + Bloquear números + Números bloqueados + Exportar números bloqueados + Importar números bloqueados + Tem de tornar esta aplicação como marcador padrão para poder bloquear números. + Definir como padrão + Tem a certeza de que pretende bloquear \"%s\"\? + Bloquear chamadas de números não existentes nos contactos + Bloquear mensagens de números não existentes nos contactos + Introduza um número ou padrão (ex: *12345*, +1*8888) para bloquear todas as chamadas e mensagens de números que coincidam com o padrão. + Não é possível bloquear números desconhecidos sem não conceder a permissão \"Caller ID\". + + Favoritos + Adicionar favoritos + Adicionar aos favoritos + Remover dos favoritos + + Pesquisar + Pesquisar em %s + Introduza, pelo menos, 2 caracteres para iniciar a pesquisa. + Pesquisar contactos + Pesquisar favoritos + Pesquisar aplicações + Pesquisar eventos + Pesquisar grupos + Pesquisar histórico + Pesquisar chamadas + Pesquisar ficheiros + Pesquisar pastas + Pesquisar ficheiros e pastas + Pesquisar listas de reprodução + Pesquisar artistas + Pesquisar álbuns + Pesquisar faixas + Pesquisar texto + Pesquisar conversas + Pesquisar gravações + + Filtrar + Filtrar (Pro) + Sem itens. + Alterar filtro + + Requer acesso ao armazenamento + Requer acesso aos contactos + Requer acesso à câmara + Requer acesso ao áudio + Sem permissão + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Renomear ficheiro + Renomear pasta + Não foi possível renomear o ficheiro + Não foi possível renomear a pasta + O nome da pasta não pode ficar vazio + Já existe uma pasta com este nome + Não pode renomear a pasta raiz de um armazenamento + A pasta foi renomeada com sucesso + A renomear pasta + O nome do ficheiro não pode ficar vazio + O nome do ficheiro contém caracteres inválidos + O nome \'%s\' contém caracteres inválidos + A extensão não pode ficar vazia + O ficheiro de origem %s não existe + Introduzir antes do nome do ficheiro + Introduzir depois do nome do ficheiro + Mudar nome + Padrão + Texto a adicionar + %Y - ano\n%M - mês\n%D - dia\n%h - horas\n%m - minutos\n%s - segundos\n%i - incremento númerico a partir de 1 + Nome do ficheiro (sem .txt) + Nome do ficheiro (sem .json) + Nome do ficheiro (sem .zip) + Em sistemas Android 11+, já não pode ocultar ficheiros e pastas desta forma + + Copiar + Mover + Copiar/Mover + Copiar para + Mover para + Origem + Destino + Selecione o destino + Toque aqui para escolher o destino + Não foi possível escrever no destino selecionado + Por favor selecione um destino + A origem e o destino não podem ser iguais + Não foi possível copiar os ficheiros + A copiar… + Ficheiros copiados com sucesso + Ficheiro copiado com sucesso + Ocorreu um erro + A mover… + Ficheiros movidos com sucesso + Ficheiro movido com sucesso + Alguns ficheiros não foram movidos + Alguns ficheiros não foram copiados + Nenhum ficheiro selecionado + A guardar… + Não foi possível criar a pasta %s + Não foi possível criar o ficheiro %s + Não foram encontrados novos itens + Não existe espaço livre suficiente no destino.\nPrecisa de %1$s e apenas existem %2$s + O serviço para selecionar ficheiros e pastas não está disponível + + Criar + Pasta + Ficheiro + Criar nova pasta + Já existe um ficheiro ou pasta com este nome + O nome contém caracteres inválidos + Introduza um nome + Ocorreu um erro desconhecido + + Já existe um ficheiro com o nome \"%s\" + Já existe um ficheiro com o nome \"%s\". Substituir? + Já existe uma pasta com o nome \"%s\" + Combinar + Manter ambos + Substituir + Ignorar + Anexar \'_1\' + Aplicar a todos + O sistema não permite operações nesta pasta, deve escolher outra + O sistema não permite operações de cópia nesta pasta, deve escolher outra + O sistema não permite alterações de nome nesta pasta + Não é possível mudar diretamente o nome de pastas no armazenamento interno, apenas pode mudar o nome de subpastas + Não pode mudar o nome desta pasta + + Selecionar pasta + Selecionar ficheiro + Confirmar acesso ao armazenamento externo + Confirmar acesso à pasta + Por favor escolha a pasta raíz do cartão SD no próximo ecrã para conceder acesso de escrita + Se não conseguir ver o cartão SD, tente isto + Por favor conceda o acesso ao armazenamento selecionado no ecrã seguinte, premindo \'Usar esta pasta\'. + Deve permitir o acesso a \'%s\' no próximo ecrã, tocando em \'Utilizar esta pasta\'. + Toque em \'Guardar\' na base do próximo ecrã para criar uma nova pasta. + Confirmar seleção + A carregar… + Por favor conceda o acesso a todos os ficheiros porque, sem isso, a aplicação pode não funcionar corretamente. + + %d item + %d itens + %d itens + + + + %d item + %d itens + %d itens + + + A apagar %d item + A apagar %d itens + A apagar %d itens + + + + %d contacto + %d contactos + %d contactos + + + Selecionar armazenamento + Armazenamento + Interno + Cartão SD + Raiz + Pasta inválida, por favor selecione a pasta raíz do cartão SD + Não pode utilizar o mesmo caminho para o cartão SD e para a unidade USB + Parece que a aplicação está instalada no cartão SD, o que torna o widget indisponível. Nem sequer aparecerá na lista de widgets disponíveis. + Esta é uma limitação do sistema e, se quiser usar widgets, tem que mover a aplicação para o armazenamento interno. + Selecionou a pasta errada, selecione o caminho \'%s\' + + Propriedades + Caminho + Itens selecionados + Itens nesta pasta + Total de ficheiros + Resolução + Duração + Artista + Álbum + Distância focal + Tempo de exposição + Velocidade ISO + Número F + Câmara + EXIF + Título da faixa + Coordenadas GPS + Altitude + Remover EXIF + Tem a certeza de que pretende remover os dados EXIF tais como coordenadas GPS, modelo do equipamento.... + Dados EXIF removidos com sucesso + + Cor de fundo + Cor do tipo de letra + Cor primária + Cor de destaque para o tema Branco + Cor de destaque para o tema Preto e branco + Cor secundária + Cor do ícone da aplicação + Cor da barra de navegação inferior + Repor predefinições + Utilizar padrão + Padrão + Alterar cor + Tema + Se alterar uma cor, ativa o modo de tema personalizado + Guardar + Descartar + Desfazer alterações + Tem a certeza de que pretende desfazer as alterações\? + Esta ação não pode ser revertida. + Existem alterações não guardadas. Pretende guardar antes de sair\? + Aplicar cores a todas as aplicações Simple + AVISO: alguns launchers não gerem correctamente a personalização dos ícones. Se o ícone desaparecer, tente iniciar a aplicação através da Google Play ou do widget. Depois de iniciar a aplicação, reverta para a cor original (#F57C00). Em último caso, poderá ser necessário reinstalar a aplicação. + Cores atualizadas com sucesso. Foi criado o novo tema \'Partilhado\', que pode utilizar para atualizar as cores de todas as aplicações Simple. + Tenha em atenção que, mesmo que esteja a utilizar a versão Pro, tem que instalar a aplicação Simple Thank You por motivos técnicos. Esta aplicação controla a sincronização de cores. + + Simple Thank You para desbloquear esta funcionalidade e ajudar no desenvolvimento. Obrigado! + ]]> + + + Claro + Escuro + Automático + Claro/escuro automático + Solar + Vermelho escuro + Branco + Preto e branco + Personalizado + Partilhado + Sistema + + Novidades + * apenas são listadas as alterações mais significativas. Contudo, existem sempre mais revisões do que as aqui referidas + + Apagar + Remover + Mudar nome + Partilhar + Partilhar por + Redimensionar + Selecionar tudo + Selecionar texto + Ocultar + Mostrar + Ocultar pasta + Mostrar pasta + Mostrar ocultas temporariamente + Não mostrar multimédia oculta + Não pode partilhar tantos itens em simultâneo + Limpar e desativar reciclagem + Desfazer + Refazer + Imprimir + Imprimir (Pro) + Atalho + Criar atalho + Criar atalho (Pro) + Adicionar número a um contacto + Ver detalhes do contacto + Ligar do SIM 1 + Ligar do SIM 2 + Mostrar/ocultar nome do ficheiro + Mover para cima + Mover para baixo + Fixar item + Desafixar item + Enviar SMS + Enviar e-mail + Ligar + Detalhes do contacto + Adicionar contacto + Papel de parede + + Ordenar por + Nome + Tamanho + Data de modificação + Data de criação + Data de obtenção + Título + Nome do ficheiro + Extensão + Aleatório + Ordem aleatória + Ascendente + Descendente + Apenas para esta pasta + Ordenar partes numéricas pelo valor nominal + Primeiro nome + Segundo nome + Apelido + Nome completo + Ordenação personalizada + Alterar ordem + + Tem a certeza de que pretende continuar\? + Tem a certeza de que pretende apagar %s\? + Apagar %s? + + Tem a certeza de que pretende mover %s para a reciclagem\? + + Tem a certeza de que pretende apagar este item\? + Tem a certeza de que pretende mover este item para a reciclagem\? + Não perguntar mais para esta sessão + Não mostrar novamente + Sim + Não + Talvez + + AVISO: está prestes a apagar %d pasta + AVISO: está prestes a apagar %d pastas + AVISO: está prestes a apagar %d pastas + + + PIN + Digite o PIN + Por favor digite o PIN + PIN inválido + Repita o PIN + Padrão + Introduza o padrão + Padrão inválido + Repita o padrão + Biométrica + Impressão digital + Adicionar impressão digital + Coloque o dedo no sensor de impressões digitais + Abrir diálogo de verificação biométrica + Autenticar + Falha na autentificação + Autentificação bloqueada. Por favor tente mais tarde + Não existem impressões digitais registadas. Adicione-a nas definições do dispositivo + Abrir definições + Palavra-passe definida com sucesso. Deve reinstalar esta aplicação se não se lembrar da palavra-passe. + Proteção definida com sucesso. Deve reinstalar a aplicação se ocorrerem problemas. + Bloquear pasta + Bloquear pasta (Pro) + Desbloquear pasta + A proteção aqui definida apenas funciona para esta aplicação e não protege o restante conteúdo do seu sistema. + + Ontem + Hoje + Amanhã + Todos os dias + Ocultar ano + segundos + minutos + horas + dias + s + m + h + wk. + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d dia + %d dias + %d dias + + + %d semana + %d semanas + %d semanas + + + %d mês + %d meses + %d meses + + + %d ano + %d anos + %d anos + + + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d dia + %d dias + %d dias + + + %d semana + %d semanas + %d semanas + + + %d mês + %d meses + %d meses + + + %d ano + %d anos + %d anos + + + + %d segundo antes + %d segundos antes + %d segundos antes + + + %d minuto antes + %d minutos antes + %d minutos antes + + + %d hora antes + %d horas antes + %d horas antes + + + %d dia antes + %d dias antes + %d dias antes + + + %d semana antes + %d semanas antes + %d semanas antes + + + %d mês antes + %d meses antes + %d meses antes + + + %d ano antes + %d anos antes + %d anos antes + + + + %d segundo + %d segundos + %d segundos + + + %d minuto + %d minutos + %d minutos + + + %d hora + %d horas + %d horas + + + %d dia + %d dias + %d dias + + + %d semana + %d semanas + %d semanas + + + %d mês + %d meses + %d meses + + + %d ano + %d anos + %d anos + + + O alarme está definido para daqui a:\n%s + O lembrete está definido para daqui a:\n%s + Tempo restante:\n%s + Certifique-se de que o alarme está a funcionar correctamente antes de o utilizar. Pode ter um comportamento errático devido a restrições do sistema. + Certifique-se de que o lembrete está a funcionar corretamente antes de o utilizar. Pode ter um comportamento errático devido a restrições do sistema. + As notificações desta aplicação estão desativadas. Aceda às definições do dispositivo para as poder ativar. + + Alarme + Snooze + Descartar + Sem lembrete + No início + Sons do sistema + Meus sons + Adicionar um novo som + Sem som + Durante o dia às hh:mm + Durante o dia às %02d:%02d + + Definições + Comprar Simple Thank You + Geral + Personalização de cores + Personalização de cores melhorada + Personalizar cores + Personalizar cores (Bloqueado) + Bloqueada + Personalizar cores do widget + Personalizar notificações + Notification sound + Utilizar aplicação em inglês + Idioma + Mostrar itens ocultos + Tamanho do texto + Pequeno + Médio + Grande + Muito grande + Proteger itens ocultos com palavra-passe + Proteger aplicação com palavra-passe + Impedir eliminação e movimentação de ficheiros com palavra-passe + Manter data/hora da última modificação nas operações de ficheiros + Mostrar informação ao arrastar a barra de deslocamento + Impedir que o ecrã se desligue se a aplicação estiver em primeiro plano + Ignorar sempre a confirmação de eliminação de ficheiros + Ativar puxar para recarregar + Utilizar formato 24 horas + Alterar formato da data/hora + Iniciar semana ao domingo + Widgets + Usar sempre o mesmo intervalo para snooze + Intervalo para snooze + Vibrar ao tocar nos botões + Mover itens para a reciclagem em vez de os apagar + Intervalo de tempo para limpar a reciclagem + Limpar reciclagem + Impor modo vertical + Exportar definições + Importar definições + Definições exportadas com sucesso + Definições importadas com sucesso + Ordenar por apelido + Limpar cache + Mostrar diálogo antes de efetuar uma chamada + + Exibição + Segurança + Deslocação + Operações de ficheiros + Reciclagem + Guardar + Arranque + Texto + Migração + Qualidade + Ecrã principal + Miniaturas + Ver em lista + + Exclusão + Excluir pasta + Pastas excluídas + (excluída) + Gerir pastas excluídas + Remover todas + Remover todas as pastas da lista de exclusões\? Esta ação não apaga as pastas. + Mostrar temporariamente itens excluídos + Parar de mostrar itens excluídos + + Separadores a mostrar + Separador a mostrar ao iniciar + Contactos + Favoritos + Registo de chamadas + Grupos + Último utilizado + Ficheiros + Ficheiros recentes + + Restaurar este ficheiro + Restaurar ficheiros selecionados + Restaurar todos os ficheiros + A reciclagem foi limpa + Os ficheiros foram restaurados + Tem a certeza de que pretende esvaziar a reciclagem\? Todos os itens serão apagados permanentemente. + A reciclagem está vazia + Não é possível mover itens para fora da Reciclagem, utilize a opção Restaurar + Mostrar reciclagem + Ocultar reciclagem + Abrir reciclagem + Skip the Recycle Bin, delete files directly + + A mover %d item para a reciclagem + A mover %d itens para a reciclagem + A mover %d itens para a reciclagem + + + A importar… + A exportar… + Importação efetuada + Exportação efetuada + Falha ao importar + Falha ao exportar + Falha ao importar alguns itens + Falha ao exportar alguns itens + Não existem itens para importação + Não existem novos itens para importação + Não existem itens para exportação + Backups + Ativar backups automáticos + Gerir backups automáticos + Pode utilizar os seguintes padrões para nomear automaticamente os seus ficheiros: +\n +\n%Y - ano +\n%M - mês +\n%D - dia +\n%h - hora +\n%m - minutos +\n%s - segundos + + USB + Não parece existir qualquer unidade USB conectada ao dispositivo. Para se certificar de que os ficheiro aparecem, deve conceder algumas permissões. + Escolha a pasta raíz da unidade USB no ecrã seguinte para conceder o acesso + Escolheu uma pasta inválida, deve selecionar a pasta raíz da unidade USB + + janeiro + fevereiro + março + abril + maio + junho + julho + agosto + setembro + outubro + novembro + dezembro + + jan + fev + mar + abr + mai + jun + jul + ago + set + out + nov + dez + + em janeiro + em fevereiro + em março + em abril + em maio + em junho + em julho + em agosto + em setembro + em outubro + em novembro + em dezembro + segunda + terça + quarta + quinta + sexta + sábado + domingo + S + T + Q + Q + S + S + D + seg + ter + qua + qui + sex + sáb + dom + + Esta aplicação já não receberá atualizações. Adquira a versão Pro para receber correções e melhorias. + Esta aplicação já não receberá atualizações. Adquira a versão Pro para receber correções e melhorias ao cliquar aqui. + É gratuita até: %s. Se a descarregar até esta data, será sua para sempre. + Mais informação + Atualizar versão + Pode migrar os eventos locais exportando-os para um ficheiro .ics para posterior importação. Encontra os botões para importar/exportar no menu do ecrã principal. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Olá, +\n +\nParece que fez a atualização a partir da versão gratuita. Se a aplicação for do seu agrado, caso já tenha migrado os dados, pode desinstalar a versão antiga para evitar que a utilize sem querer. +\n +\nObrigado! + Olá, +\n +\nParece que você já tem a versão Pro. Se a aplicação for do seu agrado, caso já tenha migrado os dados, pode desinstalar a versão antiga para evitar que a utilize sem querer. +\n +\nObrigado! + Olá, +\n +\nParece que fez a atualização a partir da versão gratuita. Se quiser migrar os eventos guardados localmente, tem que os exportar para um ficheiro .ics através da aplicação gratuita e importá-los através do menu. +\n +\nSe a versão Pro for do seu agrado, caso já tenha migrado os dados, pode desinstalar a versão antiga para evitar que a utilize sem querer +\n +\nObrigado! + Olá, +\n +\nParece que fez a atualização a partir da versão gratuita. Se tiver contactos guardados em \"%s\" e os quiser migrar para a versão Pro, tem que os exportar para um ficheiro .vcf através da aplicação gratuita e importá-los através do menu. +\n +\nSe a versão Pro for do seu agrado, caso já tenha migrado os dados, pode desinstalar a versão antiga para evitar que a utilize sem querer +\n +\nObrigado! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Acerca + Site + Mais aplicações Simple e código-fonte em + Envie os seus comentários ou sugestões para + Atualizar para versão Pro + Mais aplicações + Mais aplicações nossas + Convidar amigos + Olá, venha experimentar %1$s em %2$s + Convidar por + Avalie-nos na Google Play + Avaliar + Donativos + Siga-nos + V %1$s\nCopyright © Simple Mobile Tools %2$d + Apoio + Ajude-nos + Redes sociais + Outros + Política de privacidade + Versão %s + Olá :) + Feito com ❤️ na Eslováquia + Mais informações + Versão da aplicação: %s + SO do dispositivo: %s + Olá,<br><br> esperamos que esteja a gostar desta aplicação. Se estiver interessado em ajudar ao seu desenvolvimento e dado que não contem anúncios, pode comprar a aplicação <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> o que também fará com que esta solicitação deixe de apareçer novamente.<br><br> Obrigado! + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Comprar + Obter Simple Phone + Deve atualizar a aplicação Simple Thank You para a versão mais recente + Antes de colocar uma questão, verifique as FAQ. Pode ser que a solução esteja lá. + Antes de dar uma avaliação, analise as definições da aplicação e leia as FAQ. Pode ser que a solução para o seu problema esteja aí mesmo. + Certifique-se de que está a utilizar a versão mais recente. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Ler + Ler as FAQ + Olá,\n\nparece que está a utilizar esta aplicação há algum tempo, o que nos deixa satisfeitos.\n\nGostaríamos de lhe pedir o favor de nos avaliar na Google Play. Isso iria ajudar-nos bastante.\n\nIndependentemente da sua escolha, esta mensagem não será mostrada novamente.\n\nObrigado! + Avalie a nossa aplicação :) + Obrigado + O widget está bloqueando. +\nAdquira a versão Pro para desbloquear. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + Olá.<br><br> Temos novidades! Uma nova aplicação ficou disponível recentemente:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> Pode descarregar a nova aplicação carregando no seu título ou ícone.<br><br> Obrigado + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + Calculadora + Calendário + Câmara + Relógio + Contactos + Marcador + Desenho + Gestor de ficheiros + Lanterna + Galeria + Teclado + Lançador + Leitor de músicas + Notas + Mensagens + Obrigado + Gravador de sons + + aqui. + ]]> + + + Perguntas frequentes (FAQ) + Antes de colocar uma questão, leia as + Por que não vejo o widget desta aplicação na lista de widgets\? + O mais provável é que a aplicação tenha sido movida para o cartão SD. Existe uma limitação do sistema Android que oculta os widgets de aplicações quando assim é. A única solução é mover a aplicação de volta para o armazenamento interno através das definições do seu dispositivo. + Gostaria de vos apoiar mas não posso fazer um donativo em dinheiro. Há algo mais que eu possa fazer\? + Claro que sim. Pode divulgar as nossas aplicações, deixar uma avaliação ou um comentário positivo. Pode também traduzir as aplicações noutro idioma ou atualizar as já existentes. Pode encontrar o guia no <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>site</a>, ou contactar-nos para<a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se tiver alguma questão. + Apaguei alguns ficheiros por engano, como posso recuperá-los\? + Infelizmente, não pode. Os ficheiros são apagados instantaneamente após o diálogo de confirmação, não existe reciclagem disponível. + Não gosto das cores do widget, posso mudá-las\? + Sim, ao arrastar um widget no ecrã inicial, aparece a sua configuração. Basta premir os quadrados coloridos no canto inferior esquerdo para escolher uma nova cor. E pode usar a barra deslizante para ajustar a transparência também. + Existe alguma forma de restaurar os ficheiros apagados\? + Se tiverem sido de facto apagados, não. Por definição, os ficheiros são movidos para a reciclagem e não apagados. Se, no entanto, a reciclagem tiver sido desativada, os ficheiros serão apagados permanentemente. + O ícone da aplicação desapareceu. O que posso fazer\? + Isso deve ter ocorrido porque o seu \"launcher\" não suporta a personalização de ícones corretamente. Se possível, tente abrir a aplicação através da Google Play ou de um widget. Uma vez aberta, defina a cor do ícone para o valor padrão (#F57C00). Em último caso, pode ser necessário reinstalar a aplicação. + O dinheiro foi retirado da minha conta bancária, mas não consigo descarregar a aplicação. O que posso fazer\? + Os pagamentos são totalmente geridos pela Google, o sistema deles falha de vez em quanto. Limpe a cache da aplicação Google Play, reinicie o dispositivo e tente descarregá-la novamente. + Porque devo atualizar para a versão Pro\? + Como a versão da sua aplicação já não será atualizada, os erros detetados nunca serão corrigidos. Tão pouco serão novas funções adicionadas. Pode comprar a versão Pro na Google Play por uma pequena quantia. É um pagamento único, o que significa que, uma vez comprada, nunca precisará de pagar novamente. Nem mesmo se trocar de dispositivo. Se não estiver satisfeito com a versão Pro, basta desinstalá-la em algumas horas e será reembolsado automaticamente. Se pretender um reembolso posteriormente, contacte-nos pelo e-mail hello@simplemobiletools.com para o receber. + Como posso selecionar vários itens de uma só vez\? + Existem diversas formas de o fazer. A primeira forma de aceder à seleção é premir longamente um item e ir tocando nos outros para os selecionar. A segunda forma é similar à seleção de itens com um rato no computador: basta manter um item premido e arrastar o dedo para selecionar os restantes. A terceira forma, esta para seleção múltipla, é premir longamente um item e, em seguida, premir longamente também outro item para que todos os itens no intervalo entre eles fiquem selecionados. Caso pretenda selecionar todos os itens, basta manter um deles premido e clicar na contagem de itens selecionados no canto superior esquerdo, ação essa que selecionará ou removerá a seleção de todos os itens. + Comprei a aplicação mas não a consigo descarregar para outro dispositivo. + Experimente limpar a cache da Google Play e reiniciar seu dispositivo. Trata-se de uma falha da Google Play e não está relacionada com a aplicação em si. + + Colaboradores + Tradução + Desenvolvimento + Mais ajuda + Esta lista menciona todos aqueles que, de alguma forma, ajudaram significativamente no desenvolvimento das Simple Mobile Tools e não apenas desta aplicação. As traduções estão a cargo de voluntários. Se quiser participar, encontra o guia no <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>nosso site</a> ou então, contacte-nos para <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> se tiver alguma questão. Obrigado a todos os que contribuiram e nos apoiaram! + Árabe + Azeri + Bengalês + Bretão + Búlgaro + Catalão + Checo + Galês + Dinamarquês + Inglês + Alemão + Grego + Espanhol + Basco + Persa + Finlandês + Françês + Galego + Hindi + Croata + Húngaro + Indonésio + Italiano + Hebreu + Japonês + Coreano + Lituano + Nepalês + Norueguês + Holandês + Polaco + Português + Romeno + Russo + Eslovaco + Esloveno + Sérvio + Sueco + Tamil + Turco + Ucraniano + Vietnamita + Chinês (Hong Kong) + Chinês (Simplificado) + Chinês (Tradicional) + + Atualizar para a versão Pro agora! + Básico + Pro + Sem anúncios + Sem acesso à internet + Garantia de reembolso a 100% + Pagamento único + Design melhorado + + Editor de fotos avançado + Editor avançado de fotos e de vídeos + Suporte a ficheiros HEIC/HEIF + Mudar nome de ficheiros em lote + Bloqueio individual de pastas + Suporte a impressão + + Suporte a fuso-horário + Participantes e lembretes por e-mail + Importação simplificada de eventos + Novos widgets + + Melhorias na triagem e combinação de contactos duplicados + Personalização do tipo de letra + Partilha opcional de contactos entre as aplicações Simple + Personalização de sons por contacto + Filtro de contactos + Contactos guardados localmente + + Listas de verificação + Notas e cores diferentes por widget + Bloqueio de notas + + Personalização do formato de data e de hora + Atalhos no ecrã inicial + Suporte à compressão de ficheiros + Separador com ficheiros recentes + + Personalização da cor de fundo + Suporte à importação de ficheiros + Ampliação + + Esta aplicação usa as seguintes bibliotecas de terceiros para facilitar a minha vida. Obrigado. + Licenças de terceiros + Kotlin (linguagem de programação) + Subsampling Scale Image View (ampliação da vista de imagens) + Glide (carregamento e cache de imagens) + Picasso (carregamento e cache de imagens) + Android Image Cropper (recorte e rotação de imagens) + RtlViewPager (deslizar da direita para a esquerda) + Joda-Time (sustituto para Java date) + Stetho (depuração a bases de dados) + Otto (canal de eventos) + PhotoView (animação de GIF) + PatternLockView (proteção com padrões) + Reprint (proteção com impressões digitais) + Gif Drawable (carregamento de GIF) + AutoFitTextView (redimensionamento de texto) + Robolectric (framework de testes) + Espresso (apoio aos testes) + Gson (processador JSON) + Leak Canary (detector de falhas de memória) + Number Picker (seletor de números personalizado) + ExoPlayer (leitor de vídeo) + VR Panorama View (exibição panorâmica) + Apache Sanselan (leitor de meta-dados das imagens) + Android Photo Filters (filtros de imagens) + Gesture Views (ampliação de imagens) + Indicator Fast Scroll (letras na barra de deslocação) + Event Bus (comunicação dentro da aplicação) + Audio Record View (visualização de áudio) + SMS MMS (gestão de SMS e MMS) + APNG Android (suporte a animação WebP) + PDFViewPager (leitor de PDF) + M3U Parser (gestão de ficheiros m3u) + AndroidLame (codificador de mp3) + + Versão de testes caducada + Iniciar versão de teste + A versão de teste está quase a caducar. + Unlock the app for one final day + Bem-vindo a %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + AVISO: Esta versão da aplicação já não está em desenvolvimento. Pode obter a versão Pro em https://play.google.com/store/apps/details\?id=com.simplemobiletools.xxx.pro + Não se esqueça de desinstalar qualquer aplicação paga no prazo de 2 horas para ser reembolsado automaticamente. Para ser reembolsado posteriormente, contacte-nos para hello@simplemobiletools.com. Assim é mais fácil testar :) + + Uma gama de aplicações para Android, open source, com widgets personalizados, sem anúncios nem permissões desnecessárias. + diff --git a/commons/src/main/res/values-ro/strings.xml b/commons/src/main/res/values-ro/strings.xml new file mode 100644 index 000000000..fa8f0fd40 --- /dev/null +++ b/commons/src/main/res/values-ro/strings.xml @@ -0,0 +1,1120 @@ + + + OK + Anulează + Back + Nimic + Mai târziu + Salvează ca + Fişier salvat cu succes + Format de fişier invalid + Eroare de lipsă de memorie + S-a produs o eroare: %s + Eroare: %s + Deschide cu + Editează cu + Editaţi + Nu s-a găsit nicio aplicaţie validă + Nici un browser găsit + Niciun client de e-mail găsit + Setează ca + Copiază în clipboard + Copiază numărul în clipboard + Valoare copiată în clipboard + Valoare copiată în clipboard:\n%s + Formați numărul + Necunoscut + Întotdeauna + Niciodată + Detalii + Note + Şterge folderul \'%s\' + Niciunul + Etichetă + Transparent + Culoare transparentă + Selectează o culoare diferită + Descarcă + Notificare + Notificări + E-mail + Precedent + Redare / Pauză + Următor + Număr + Niciun contact găsit + Solicită permisiunile necesare + Aplicaţia nu a putut accesa contactele dumneavoastră + Aplicația nu are permisiunea de a iniția apeluri telefonice, vă rugăm să o acordați în setările dispozitivului + Introduceţi textul aici + Sună pe %s + Confirm calling %s + Zero + Unu + Doi + Trei + Patru + Cinci + Șase + Șapte + Opt + Nouă + Valoare + Valoarea nu poate fi goală + Creați un nou contact + Adăugaţi la un contact existent + Aplicație coruptă + Declinarea responsabilității + Faceți o fotografie + Alegeți o fotografie + Choose video + Choose contact + Choose file + Record audio + Record video + Actualizare… + Stocarea telefonului + Stocarea telefonului (nu este vizibilă de către alte aplicații) + Audio + + Ziua de naștere + Aniversare + + Acasă + Muncă + + Mobil + Principal + Fax de muncă + Fax de acasă + Pager + Nu a fost găsit niciun număr de telefon + + Schimbaţi tipul de vizualizare + Grilă + Grilă (Pro) + Grilă neuniformă + Listă + Creşte numărul de coloane + Reduce numărul de coloane + Număr de coloane + Număr de coloane în mod portret + Număr de coloane în mod peisaj + Schimbă imaginea de copertă + Selectaţi fotografia + + %d column + %d columns + + + Gestionaţi numerele blocate + Nu blochezi pe nimeni. + Adăugaţi un număr blocat + Blochează numărul + Blochează numerele + Numere blocate + Exportă numerele blocate + Importă numerele blocate + Trebuie să setaţi aceasta aplicaţie ca aplicaţie implicită de apelare pentru a putea beneficia de funcţia de blocare de numere. + Setează ca implicit + Eşti sigur că vrei să îl/o blochezi pe \"%s\"\? + Blocați apelurile de la contacte care nu sunt stocate + Blocați mesajele de la contactele care nu sunt stocate + Introduceți un număr sau un model (de exemplu, *12345*, +1*8888) pentru a bloca toate apelurile și mesajele de la numere care corespund modelului. + Can\'t block unknown numbers without caller ID permission. + + Favorite + Adaugă favorite + Adaugă la favorite + Elimină din favorite + + Căutare + Search in %s + Introduceţi cel puţin 2 caractere pentru a începe căutarea. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Filtru + Filtru (Pro) + Nu s-a găsit niciun element. + Schimbaţi filtrul + + Este necesară permisiunea la stocare + Este necesară permisiunea la contacte + Este necesară permisiunea la cameră + Este necesară permisiunea la audio + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Redenumire fişierul + Redenumire dosar + Nu s-a putut redenumi fişierul + Nu s-a putut redenumi dosarul + Numele dosarului nu trebuie să fie gol + Există deja un dosar cu acest nume + Nu se poate redenumi dosarul rădăcină al spaţiului de stocare + Dosar redenumit cu succes + Redenumire dosar + Numele fişierului nu poate fi gol + Numele fişierului conţine caractere invalide + Numele fişierului \'%s\' conţine caractere invalide + Extensia nu poate fi goală + Fişierul sursă %s nu există + Adaugă înainte de numele fişierelor + Adaugă după finalul numelor fişierelor + Redenumire simplă + Model + Şir de caractere de adăugat + %Y - an\n%M - lună\n%D - zi\n%h - oră\n%m - minut\n%s - secondă\n%i - numărul crescând de la 1 + Numele fişierului (fără .txt) + Numele fişierului (fără .json) + Numele fişierului (fără .zip) + Începând cu Android 11 nu mai poți ascunde fișiere și dosare astfel + + Copiază + Mută + Copiază / Mută + Copiază la + Mută la + Sursă + Destinaţie + Selectează destinaţia + Faceţi clic aici pentru a selecta destinaţia + Nu s-a putut scrie la destinaţia selectată + Selectaţi o destinaţie + Sursa şi destinaţia nu pot fi identice + Nu s-au putut copia fișierele + Copiere… + Fişiere copiate cu succes + Fişier copiat cu succes + S-a produs o eroare + Mutare… + Fișiere mutate cu succes + Fișier mutat cu succes + Unele fișiere nu au putut fi mutate + Unele fișiere nu au putut fi copiate + Niciun fişier selectat + Salvare… + Nu s-a putut crea dosarul %s + Nu s-a putut crea fişierul %s + Nu au fost găsite elemente noi + Destinaţia nu are suficient spaţiu disponibil.\nNecesar %1$s, disponibil %2$s + Serviciul de sistem pentru selectarea fișierelor și dosarelor nu este disponibil + + Crează nou + Dosar + Fişier + Crează un dosar nou + Există deja un fişier sau un dosar cu acest nume + Numele conţine caractere invalide + Introduceţi un nume + A apărut o eroare necunoscută + + Fişierul \"%s\" există deja + Fişierul\"%s\" există deja. Suprascrieți? + Dosarul \"%s\" există deja + Combină + Păstrează ambele + Suprascrieți + Sari peste + Adăugaţi cu \'_1\' + Se aplică tuturor + Sistemul nu permite operarea în acest dosar, vă rugăm să alegeți un alt dosar + Sistemul nu permite copierea în acest dosar, vă rugăm să alegeți un alt dosar + Sistemul nu permite redenumirea în acest dosar + Nu se pot redenumi dosarele directe de pe memoria internă, ci doar subdosarele + Nu se poate redenumi acest dosar + + Selectaţi un dosar + Selectaţi un dosar + Confirmaţi accesul la memoria externă + Confirmați accesul la dosar + Vă rugăm să alegeţi dosarul rădăcină a cardului SD în ecranul următor, pentru a acorda acces la scriere + Dacă nu vedeţi cardul SD, încercaţi următoarele + Vă rugăm să permiteți aplicației să acceseze spațiul de stocare selectat în ecranul următor, apăsând \'Utilizați acest dosar\' în partea de jos. + Vă rugăm să permiteţi accesul la \'%s\' pe următorul ecran prin apăsarea butonului \'Folosiţi acest dosar\' aflat în partea de jos a ecranului. + Vă rugăm să apăsați \' Salvare\' în partea de jos a ecranului următor pentru a crea noul dosar. + Confirmă selectarea + Încărcare… + Vă rugăm să acordați aplicației noastre acces la toate fișierele dvs., deoarece s-ar putea să nu funcționeze bine fără acest lucru. + + %d articol + %d articole + %d articole + + + + %d articol + %d articole + %d articole + + + Ştergere %d articol + Ştergere %d articole + Ştergere %d articole + + + + %d contact + %d contacte + %d contacte + + + Selectați spațiul de stocare + Stocare + Intern + Card SD + Rădăcină + Dosarul selectat este greșit, vă rugăm să selectați dosarul principal al cardului SD + Căile cardului SD și ale dispozitivului USB nu pot fi aceleași + Se pare că aplicația este instalată pe un card SD, ceea ce face ca widgeturile aplicației să nu fie disponibile. Nu le veți vedea nici măcar în lista de widgeturi disponibile. + Este o limitare a sistemului, așa că, dacă doriți să folosiți widgeturile, trebuie să mutați aplicația înapoi în memoria internă. + A fost selectat un dosar greșit, vă rugăm să selectați calea \'%s\' + + Proprietăţi + Calea de acces + Articole selectate + Numărătoarea copiilor direcţi + Numărul total de fișiere + Rezoluţie + Durată + Artist + Album + Distanță focală + Timp de expunere + viteza ISO + numărul F + Cameră + EXIF + Titlu melodie + coordonate GPS + Altitudine + Eliminați EXIF + Sunteți sigur că doriți să eliminați valorile EXIF, cum ar fi coordonatele GPS, modelul camerei etc.\? + Valorile EXIF au fost eliminate cu succes + + Culoare de fundal + Culoarea textului + Culoarea primară + Accentul de culoare al temei albe + Accentul de culoare pentru tema Negru şi Alb + Culoare de prim-plan + Culoarea pictogramei aplicației + Culoarea barei de navigare de jos + Restaurați valorile implicite + Utilizați valorile implicite + Implicit + Schimbă culoarea + Temă + Schimbarea unei culori va face ca aceasta să devină o tema personalizată + Salvaţi + Renunţă + Anulează modificările + Sunteți sigur că vreţi să anulați modificările? + This action cannot be undone. + Aveți modificări nesalvate. Salvați înainte de a ieși? + Aplicaţi culorile pentru toate aplicaţiile Simple Apps + AVERTISMENT: Unele lansatoare nu gestionează corect personalizarea pictogramelor aplicațiilor. În cazul în care pictograma va dispărea, încercați să lansați aplicația prin Google Play sau prin intermediul unui widget, dacă este posibil. Odată lansată, pur şi simplu setaţi din nou culoarea pictogramei portocalie #F57C00. În cel mai rău caz s-ar putea să fie nevoie să reinstalaţi aplicatia. + Culorile au fost actualizate cu succes. A fost adăugată o nouă temă numită \'Partajată\', vă rugăm să o folosiți pentru actualizarea tuturor culorilor aplicației în viitor. + Rețineți că, chiar dacă utilizați versiunea Pro a aplicației, aveți nevoie de Simple Thank You din motive tehnice. Acesta se ocupă de sincronizarea culorilor. + + Simple Thank You pentru a debloca această funcţie şi pentru a sprijini dezvoltatorii. Vă mulţumim! + ]]> + + + Luminoasă + Întunecată + Automatic + Schimbare automată a modului luminos / întunecat + Solarizat + Roşu închis + Alb + Negru & Alb + Personalizată + Partajată + Sistem implicit + + Ce este nou + * aici sunt listate doar actualizările majore, dar întotdeauna există şi unele îmbunătăţiri mai mici + + Şterge + Elimină + Redenumeşte + Distribuie + Distribuie prin + Redimensionați + Selectați tot + Selectați textul + Ascundeți + Dezvăluiți + Ascundeţi dosarul + Dezvăluiți dosarul + Afişează temporar elementele ascunse + Opreşte afişarea elementelor ascunse + Nu puteți distribui atât de mult conținut deodată + Goleşte și dezactivează coșul de reciclare + Anulaţi + Reveniţi + Printează + Printează (Pro) + Scurtătură + Creați o scurtătură + Creați o scurtătură (Pro) + Adăugați numărul la contact + Vezi detalii de contact + Apelaţi folosind SIM 1 + Apelaţi folosind SIM 2 + Comutaţi vizibilitatea numelui de fișier + Mutaţi în partea de sus + Mutaţi în partea de jos + Fixează elementul + Anulează fixarea unui element + Trimiteți SMS + Trimiteți e-mail + Sunați + Detaliile de contact + Adaugă contact + Wallpapers + + Sortează după + Nume + Dimensiune + Ultima modificare + Data creării + Data realizării + Titlu + Nume de fişier + Extensie + Aleatoriu + Sortează aleatoriu + Ascendent + Descendent + A se utiliza numai pentru acest dosar + Sortează părțile numerice după valoarea reală + Prenume + Numele mijlociu + Numele de familie + Numele complet + Utilizați o sortare personalizată + Ordin de modificare + + Sunteți sigur că doriți să continuaţi cu ștergerea? + Ești sigur că vrei să ștergi %s\? + Delete %s? + + Eşti sigur că vrei să muţi %s în coșul de reciclare? + + Sunteți sigur că doriți să ștergeți acest element? + Sunteți sigur că doriți să mutați acest element în coșul de reciclare? + Nu întreba din nou în această sesiune + Nu întreba din nou + Da + Nu + Poate + + AVERTISMENT: Ștergeți dosarul %d + AVERTISMENT: Ștergeți %d dosare + AVERTISMENT: Ștergeți %d dosare + + + PIN + Introduceţi PIN-ul + Vă rugăm introduceți un PIN + PIN Greşit + Repetaţi PIN-ul + Model + Introduceți modelul + Modelul greşit + Repetaţi modelul + Biometrice + Amprentă digitală + Adaugă amprentă digitală + Vă rugăm să plasați degetul pe senzorul de amprentă digitală + Deschideți dialogul de verificare a identificării biometrice + Autentificare + Autentificare eșuată + Autentificare blocată, vă rugăm să încercați din nou într-un moment + Nu aveți nicio amprentă digitală înregistrată, vă rugăm să adăugați câteva în setările dispozitivului dumneavoastră + Mergeți la Setări + Configurarea parolei a fost efectuată cu succes. Vă rugăm să reinstalați aplicația în cazul în care o uitați. + Configurarea protecției a fost efectuată cu succes. Vă rugăm să reinstalați aplicația în cazul în care aveți probleme cu resetarea acesteia. + Blocare dosar + Blocare dosar (Pro) + Deblocare dosar + Această protecție funcționează doar în această aplicație, ea nu ar trebui să înlocuiască o criptare reală a dosarelor la nivel de sistem. + + Ieri + Astăzi + Mâine + În fiecare zi + Ascunde anul + secunde + minute + ore + zile + s + m + h + wk. + + %d secundă + %d secunde + %d secunde + + + %d minut + %d minute + %d minute + + + %d oră + %d ore + %d ore + + + %d zi + %d zile + %d zile + + + %d săptămână + %d săptămâni + %d săptămâni + + + %d lună + %d luni + %d luni + + + %d an + %d ani + %d ani + + + + %d secundă + %d secunde + %d secunde + + + %d minut + %d minute + %d minute + + + %d oră + %d ore + %d ore + + + %d zi + %d zile + %d zile + + + %d săptămână + %d săptămâni + %d săptămâni + + + %d lună + %d luni + %d luni + + + %d an + %d ani + %d ani + + + + %d secundă înainte + %d secunde înainte + %d secunde înainte + + + %d minut înainte + %d minute înainte + %d minute înainte + + + %d oră înainte + %d ore înainte + %d ore înainte + + + %d zi înainte + %d zile înainte + %d zile înainte + + + %d săptămână înainte + %d săptămâni înainte + %d săptămâni înainte + + + %d lună înainte + %d luni înainte + %d luni înainte + + + %d an înainte + %d ani înainte + %d ani înainte + + + + %d secundă + %d secunde + %d secunde + + + %d minut + %d minute + %d minute + + + %d oră + %d ore + %d ore + + + %d zi + %d zile + %d zile + + + %d săptămână + %d săptămâni + %d săptămâni + + + %d lună + %d luni + %d luni + + + %d an + %d ani + %d ani + + + Timpul rămas până la declanșarea alarmei:\n%s + Timpul rămas până la declanșarea atenționării:\n%s + Timp rămas: +\n%s + Vă rugăm să vă asigurați că alarma funcționează corespunzător înainte de a vă baza pe ea. S-ar putea să se comporte necorespunzător din cauza restricțiilor de sistem legate de economisirea bateriei. + Vă rugăm să vă asigurați că memento-urile funcționează corect înainte de a vă baza pe ele. Verificați setările bateriei dispozitivului, precum și setările de notificare. Unele telefoane au funcţii care pot bloca memento-urile sau pot să elimine procesul de fundal al aplicaţiei. + Notificările privind această aplicație sunt dezactivate. Vă rugăm să accesați setările dispozitivului pentru a le activa. + + Alarmă + Amânăţi + Opriți + Nici un memento + La început + Sunete de sistem + Sunetele tale + Adaugă un sunet nou + Nici un sunet + În timpul zilei la hh:mm + În timpul zilei la %02d:%02d + + Setări + Cumpără Simple Thank You + General + Personalizarea culorilor + Improved color customization + Personalizați culorile + Personalizați culorile (Blocat) + Blocat + Personalizați culorile widgetului + Personalizați notificările + Notification sound + Utilizați limba engleză + Limbă + Afișați elementele ascunse + Dimensiunea fontului + Mic + Medie + Mare + Foarte Mare + Protejați vizibilitatea elementelor ascunse cu o parolă + Protejați întreaga aplicație cu o parolă + Protejați ștergerea și mutarea fișierelor cu o parolă + Păstrați valoarea veche a ultimei modificări în urma operației cu fișiere + Afișarea unei bule de informații la derularea elementelor prin tragerea barei de derulare + Împiedicați ecranul telefonul să se închidă în timp ce aplicația este în prim-plan + Întotdeauna săriţi peste dialogul de confirmare a ștergerii + Activați glisarea din partea de sus a ecranului pentru reîmprospătare + Utilizați formatul de timp de 24 de ore + Modifică formatul de dată și oră + Începeţi săptămâna cu ziua de Duminică + Widgeturi + Utilizați întotdeauna aceeaşi durată de timp pentru amânare + Durata de timp pentru amânare + Vibrează la apăsarea butoanelor + Mutați elementele în coșul de reciclare în loc să le ștergeți + Intervalul de timp pentru curățarea automată a coșului de reciclare + Goleşte coșul de reciclare + Forțează modul portret + Exportă setările + Importă setările + Setări exportate cu succes + Setări importate cu succes + Începeți numele cu numele de familie + Ștergeți memoria cache + Afișarea unui dialog de confirmare a apelului înainte de inițierea unui apel + + Vizibilitate + Securitate + Derulare + Operațiuni de fișier + Coş de reciclare + Salvare + Pornire + Text + Migrare + Calitate + Ecran principal + Miniaturi + List view + + Excludeți + Exclude folder + Dosare excluse + (exclus) + Gestionează dosarele excluse + Elimină tot + Elimini toate dosarele din lista de dosare excluse\? Acest lucru nu va șterge dosarele. + Temporarily show excluded + Stop showing excluded + + Gestionați filele afișate + Fila implicită cu care se deschide aplicația + Contacte + Favorite + Istoriclul apelurilor + Grupuri + Ultimul folosit + Fișiere + Fișiere recente + + Restaurați acest fișier + Restaurați fișierele selectate + Restaurați toate fișierele + Coșul de reciclare a fost golit cu succes + Fișierele au fost restaurate cu succes + Sunteți sigur că doriți să goliți coșul de reciclare? Fișierele vor fi pierdute definitiv. + Coșul de reciclare este gol + Deplasarea elementelor din coșul de reciclare este dezactivată, vă rugăm să utilizați functia de restaurare + Afișați coșul de reciclare + Ascundeţi coșul de reciclare + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Mutarea elementului %d în coşul de recilare + Mutarea elementelor %d în coşul de recilare + Mutarea elementelor %d în coşul de recilare + + + Importare… + Exportare… + Importare realizată cu succes + Exportare realizată cu succes + Importarea a eşuat + Exportarea a eşuat + Importul unor intrări a eșuat + Exportul unor intrări a eșuat + Nu au fost găsite intrări ce pot fi importate + Nu au fost găsite intrări noi pentru import + Nu au fost găsite intrări ce pot fi exportate + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Se pare că aveți un dispozitiv USB atașat la dispozitiv. Pentru a vă asigura că fișierele acestuia apar corect, trebuie să acordați permisiuni suplimentare. + Vă rugăm să alegeți dosarul rădăcină al dispozitivului USB în ecranul următor, pentru a acorda acces + Ați selectat un folder greșit, selectați folderul principal al dispozitivului USB + + Ianuarie + Februarie + Martie + Aprilie + Mai + Iunie + Iulie + August + Septembrie + Octombrie + Noiembrie + Decembrie + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + în Ianuarie + în Februarie + în Martie + în Aprilie + în Mai + în Iunie + în Iulie + în August + în Septembrie + în Octombrie + în Noiembrie + în Decembrie + Luni + Marţi + Miercuri + Joi + Vineri + Sâmbătă + Duminică + L + M + M + J + V + S + D + Lun + Mar + Mie + Joi + Vin + Sâm + Dum + + Versiunea aplicației dvs. nu va mai fi actualizată. Vă rugăm să treceți la versiunea Pro pentru a primi noi remedieri și alte îmbunătățiri. + Versiunea aplicației dvs. nu va mai fi actualizată. Vă rugăm să faceți upgrade la versiunea Pro pentru a primi noi corecturi și alte îmbunătățiri, făcând clic aici. + Este gratis până la: %s. Dacă o descărcați până atunci, o veți putea folosi gratuit pentru totdeauna. + Mai multe informaţii + Actualizează la Pro + Trebuie să migrați manual evenimentele stocate la nivel local prin export într-un fișier .ics, apoi prin import. Puteți găsi ambele butoane de export/import în meniul ecranului principal. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Despre + Website + Pentru codurile sursă, vizitați + Puteţi trimite părerile sau sugestiile dumneavoastră la + Actualizează la Pro + Alte aplicaţii + Alte aplicații de la noi + Invitați prieteni + Hei, vino să vezi %1$s la %2$s + Invită prin + Evaluați-ne + Evaluează + Donează + Urmăriți-ne + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Ajutaţi-ne + Social + Altele + Politică de confidențialitate + Version %s + Salut :) + Realizat cu ❤️ în Slovacia + Informații suplimentare + Versiunea aplicației: %s + Dispozitivul OS: %s + +
    + Sper că vă bucurați de aplicație. Nu conține reclame, vă rugăm să sprijiniți dezvoltarea sa prin achiziționarea aplicației Simple Thank You, de asemenea, va împiedica ca acest dialog să mais apară din nou.

    + Thank you! + ]]> +
    + Salut,<br><br>sper că vă bucurați de aplicație. Nu conține reclame și nici nu vă colectăm datele, vă rugăm să susțineți dezvoltarea ei prin cumpărarea aplicației <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. De asemenea, veți avea deblocate toate funcțiile aplicației precum și personalizarea culorilor.<br><br>Vă mulțumesc! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Cumpără + Get Simple Phone + Vă rugăm să actualizați Simple Thank You la cea mai recentă versiune + Înainte de a pune o întrebare, vă rugăm să verificați setările aplicației și să citiți mai întâi Întrebările frecvente. Este posibil ca soluția să se afle acolo. + Înainte de a ne evalua, vă rugăm să verificați setările aplicației și să citiți mai întâi Întrebările frecvente. Dacă aveți probleme, este posibil ca soluția să se afle acolo. + De asemenea, asigurați-vă că utilizați cea mai recentă versiune a aplicației. + De asemenea, rețineți că această versiune a aplicației nu mai este în curs de dezvoltare, obțineți versiunea Pro pentru multe îmbunătățiri. + Citeşte + Citeşte FAQ + Salut,\n\nse pare că folosiți această aplicație de ceva timp deja și apreciem acest lucru.\n\n Dacă vă putem cere o favoare, vă rugăm să ne evaluați pe Google Play. Asta ne-ar ajuta foarte mult.\n\nIndiferent de decizia pe care o veți lua, nu veți mai vedea acest mesaj.\n\nÎţi mulţumesc! + Vă rugăm să ne evaluaţi aplicaţia :) + Îţi mulţumesc + Widgetul este blocat.\nVă rugăm să faceți upgrade la versiunea Pro pentru a debloca această funcţie. + Această funcție este blocată, vă rugăm să achiziționați <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> pentru a debloca aplicația completă.<br><br>Este o plată unică și dacă nu sunteți mulțumit, putem oferi rambursare. + + +
    + vă anunțam doar că au fost lansate recent câteva aplicații noi:

    + %2$s

    + %4$s

    + %6$s

    + Le puteți descărca apăsând pe titlurile sau pictogramele acestora.

    + Îţi mulţumesc + ]]> +
    + Lansator de Aplicații Simplu + Calculator Simplu + Calendar Simplu + Cameră Simplă + Ceas Simplu + Contacte Simple + Telefon Simplu + Desenează Simplu + Manager de Fișiere Simplu + Lanternă Simplă + Galerie Simplă + Tastatură simplă + Simple Launcher + Player Muzical Simplu + Note Simple + SMS Messenger Simplu + Mulțumesc Simplu + Înregistrări Vocale Simple + Lansator aplicaţii + Calculator + Calendar + Cameră + Ceas + Contacte + Telefon + Desenează + Manager de fișiere + Lanternă + Galerie + Tastatură + Launcher + Player muzical + Note + Mesaje + Îţi mulţumesc + Înregistrare vocală + + aici. + ]]> + + + Întrebări frecvente + Înainte de a pune o întrebare, vă rugăm să citiți mai întâi + Cum se face că nu văd widgetul corespunzător aplicaţiei în lista de widgeturi? + Cel mai probabil se datorează faptului că ați mutat aplicația pe un card SD. Este o limitare a sistemului Android care ascunde widget-urile aplicației. + Singura soluție este să mutați aplicația înapoi în memoria internă prin intermediul setărilor dispozitivului. + Vreau să te sprijin, dar nu pot dona bani. Pot să fac altceva? + + acest site, sau pur și simplu contactați-ne la hello@simplemobiletools.com dacă aveți întrebări. + ]]> + + Am șters niște fișiere din greșeală, cum pot să le recuperez? + Din păcate, nu se poate. Fișierele sunt șterse instantaneu după dialogul de confirmare, nu există nici un coș de gunoi disponibil. + Nu-mi plac culorile widget-urilor, pot să le schimb? + Da, atunci când trageți un widget pe ecranul principal, apare un ecran de configurare a widgeturilor. Veți vedea pătrate colorate în colțul din stânga jos, pe care trebuie doar să le apăsați pentru a alege o nouă culoare. Puteți folosi cursorul pentru a ajusta transparenţa. + Pot să restaurez cumva fișierele șterse? + Dacă au fost șterse cu adevărat, nu se poate. Cu toate acestea, există un coș de reciclare activat în mod implicit, care va face ca fișierele să fie mutate în coșul de reciclare în loc să fie șterse. + Pictograma lansatorului de aplicații a dispărut. Ce pot să fac? + Acest lucru este cauzat de faptul că lansatorul nu acceptă în mod corespunzător personalizarea pictogramelor. Încercați să lansați aplicația prin Google Play sau prin intermediul unui widget, dacă este disponibil. + Odată lansat, trebuie doar să setați înapoi culoarea pictogramei la valoarea implicită portocaliu #F57C00. În cel mai rău caz, s-ar putea să trebuiască să reinstalați aplicația. + Banii au fost decontați din contul meu bancar, dar nu pot descărca aplicația. Ce pot face? + Plățile sunt gestionate în totalitate de Google, dar sistemul lor are probleme din când în când. Pur și simplu ștergeți memoria cache a aplicației Google Play și reporniți dispozitivul, apoi încercați din nou să o descărcați. + De ce ar trebui să trec la versiunea Pro? + Deoarece versiunea aplicației dvs. nu mai este actualizată, erorile pe care poate le-ați detectat nu vor fi rezolvate niciodată. De asemenea, nu vor fi adăugate funcții noi. Puteți achiziționa versiunea Pro de pe Google Play pentru o sumă modestă de bani. + Este o plată unică, ceea ce înseamnă că, odată ce ați cumpărat-o, nu va trebui să mai plătiți niciodată. Nici măcar după ce vă achiziționați un nou dispozitiv. Dacă nu vă place versiunea Pro, puteți să o dezinstalați în câteva ore și vă veți primi automat banii înapoi. + Dacă doriți o rambursare în orice moment ulterior, contactați-ne la hello@simplemobiletools.com și o veți obține. + Cum pot selecta mai multe elemente simultan? + Există mai multe modalități de a face acest lucru. Prima este pornirea modului de selectare prin apăsarea lungă a unui element, apoi prin apăsarea scurtă pe celelalte pentru a le selecta. Al doilea mod este similar cu selectarea elementelor de pe PC-uri cu ajutorul mouse-ului, + porniți modul de selecție prin apăsarea lungă a unui element, apoi, cu degetul încă apăsat, trageți-l peste alte elemente pentru a le selecta. Al treilea mod de a selecta mai multe elemente este apăsarea lungă a unui element, apoi apăsarea lungă a altui element și tot ce se află între ele este selectat. Dacă + doriți să selectați toate elementele, trebuie doar să apăsați lung pe un element, apoi faceți clic pe contorul de elemente selectate din colțul din stânga sus. Astfel, veți selecta sau deselecta totul. + Am achiziționat aplicația, dar nu o pot descărca pe un alt dispozitiv. + Încercați să ștergeți memoria cache a aplicației Google Play și să reporniți dispozitivul. Este vorba de o eroare Google Play, care nu are legătură cu aplicația în sine. + + Contribuitori + Traducere + Dezvoltare + Alte ajutoare + Această listă conține pe toți cei care au ajutat în mod vizibil orice aplicație din suita Simple Mobile Tools, nu numai aceasta. Traducerile sunt efectuate de voluntari, anunțați-ne dacă doriți să ajutați și dumneavoastră. Ghidul de traducere este la <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, sau pur și simplu contactați-ne la <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> dacă aveți întrebări. Mulțumim tuturor contribuitorilor și celorlalți susținători! + Arabică + Azeră + Bengală + Bretonă + Bulgarian + Catalană + Cehă + Galeză + Daneză + English + Germană + Greacă + Spaniolă + Bască + Persană + Finlandeză + Franceză + Galiciană + Hindi + Croată + Ungară + Indoneziană + Italiană + Ebraică + Japoneză + Koreană + Lituaniană + Nepaleză + Norvegiană + Olandeză + Poloneză + Portugheză + Română + Rusă + Slovacă + Slovenă + Sârbă + Suedeză + Tamilă + Turcă + Ucraineană + Vietnameză + Chineză (Hong Kong) + Chineză (Simplificată) + Chineză (Tradiţională) + + Obțineți versiunea Pro acum! + De bază + Pro + Fără reclame + Fără acces la internet + Garanția de 100% a returnării banilor + O singură plată + Design îmbunătățit + + Editor foto avansat + Advanced photo & video editor + Suport pentru fișiere HEIC/HEIF + Redenumire avansată a fișierelor pe loturi + Blocarea dosarelor individuale + Suport pentru imprimare + + Suport pentru fus orar + Participanți și memento-uri prin e-mail + Importarea ușoară a evenimentelor + Noi widget-uri + + Îmbinare îmbunătățită a contactelor duplicate + Personalizarea dimensiunii fontului + Partajarea opțională a contactelor private în cadrul aplicațiilor noastre + Tonuri de apel personalizabile în funcţie de contact + Filtrarea contactelor + Contacte stocate în mod privat + + Liste de verificare + Culori şi note diferite prentru fiecare widget + Blocarea notelor + + Personalizarea formatului de dată și oră + Comenzi rapide pentru ecranul principal + Suport pentru comprimarea fișierelor + Filă cu fișiere recente + + Personalizarea culorii de fundal + Suport pentru importul de fișiere + Mărire + + Această aplicație utilizează următoarele biblioteci terțe pentru a îmi face viața mai ușoară. Îţi mulțumesc. + Licențe ale părţilor terți + Kotlin (Limbaj de programare) + Subsampling Scale Image View (Vizualizări de imagini cu zoom) + Glide (Încărcarea și memorarea în cache a imaginilor) + Picasso (Încărcarea și memorarea în cache a imaginilor) + Android Image Cropper (Tăierea și rotirea imaginii) + RtlViewPager (Glisarea de la dreapta la stânga) + Joda-Time (Înlocuirea datei în java) + Stetho (Depanarea bazelor de date) + Otto (bus de evenimente) + PhotoView (GIF-uri cu zoom) + PatternLockView (protecția modelului) + Reprint (protecția amprentelor digitale) + Gif Drawable (încărcarea GIF-urilor) + AutoFitTextView (redimensionarea textului) + Robolectric (cadru de testare) + Espresso (ajutor de testare) + Gson (JSON parser) + Leak Canary (detector de scurgeri de memorie) + Number Picker (selector de numere personalizabil) + ExoPlayer (player video) + VR Panorama View (afișarea de panorame) + Apache Sanselan (citirea metadatelor imaginii) + Android Photo Filters (filtre de imagine) + Gesture Views (imagini cu zoom) + Indicator Fast Scroll (litere pe bara de derulare) + Event Bus (comunicare în cadrul aplicației) + Audio Record View (vizualizare audio) + SMS MMS (Gestionarea SMS și MMS) + APNG Android (suport WebP animat) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECIAT: Această versiune a aplicației nu mai este întreținută, obțineți versiunea Pro la https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Nu uitați că, dacă dezinstalați orice aplicație plătită în termen de 2 ore, veți fi rambursat automat. Dacă doriți o rambursare oricând mai târziu, contactați-ne la hello@simplemobiletools.com și o veți obține. Astfel, este ușor să o încercați. :) + + Un grup de aplicații Android simple, open source, cu widget-uri personalizabile, fără reclame și permisiuni inutile. +
    diff --git a/commons/src/main/res/values-ru/strings.xml b/commons/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..b4f43fd41 --- /dev/null +++ b/commons/src/main/res/values-ru/strings.xml @@ -0,0 +1,1173 @@ + + + OK + Отмена + Назад + Ничего + Позже + Сохранить как… + Файл сохранён + Неправильный формат файла + Память переполнена + Произошла ошибка: %s + Ошибка: %s + Открыть в… + Редактировать в… + Редактировать + Приложение не найдено + Браузер не найден + Клиент электронной почты не найден + Установить как… + Копировать в буфер обмена + Копировать номер в буфер обмена + Скопировано в буфер обмена + Скопировано в буфер обмена:\n%s + Набрать номер + Неизвестно + Всегда + Никогда + Подробности + Заметки + Удаление папки \"%s\" + Нет + Метка + Прозрачный + Прозрачный цвет + Выберите другой цвет + Загрузка + Уведомление + Уведомления + Электронная почта + Предыдущая + Воспроизведение/Пауза + Следующая + Номер + Контакты не найдены + Запрос необходимых разрешений + Приложение не может получить доступ к вашим контактам + У приложения нет разрешения на совершение телефонных вызовов, пожалуйста, предоставьте его в настройках устройства + Введите текст здесь + Вызов %s + Подтверждение вызова %s + Ноль + Один + Два + Три + Четыре + Пять + Шесть + Семь + Восемь + Девять + Значение + Значение не может быть пустым + Создать новый контакт + Добавить к существующему контакту + Приложение повреждено + Отказ от ответственности + Сделать фото + Выбор фото + Выбор видео + Выбор контакта + Выбор файла + Запись звука + Запись видео + Обновление… + Память устройства + Память устройства (не видна другим приложениям) + Аудио + + День рождения + Годовщина + + Домашний + Рабочий + + Мобильный + Основной + Рабочий факс + Домашний факс + Пейджер + Номер не найден + + Вид + Сетка + Сетка (Pro) + Неровная сетка + Список + Добавить колонку + Убрать колонку + Количество колонок + Количество колонок в портретной ориентации + Количество колонок в альбомной ориентации + Изменить обложку + Выбрать изображение + + %d колонка + %d колонки + %d колонок + %d колонок + + + Управление блокируемыми номерами + Нет блокируемых номеров. + Добавить блокируемый номер + Блокировать номер + Блокировать номера + Заблокированные номера + Экспорт заблокированных номеров + Импорт заблокированных номеров + Чтобы использовать блокировку, необходимо сделать \"Простые контакты\" приложением по умолчанию для набора номера. + Установить по умолчанию + Заблокировать \"%s\"? + Блокировать вызовы от несохранённых контактов + Блокировать сообщения от несохранённых контактов + Введите номер или шаблон (например: *12345*, +1*8888), чтобы блокировать все вызовы и сообщения с номеров, соответствующих шаблону. + Невозможно блокировать неизвестные номера без разрешения идентификации вызывающего абонента. + + Избранное + Добавить избранное + Добавить в избранное + Убрать из избранного + + Поиск + Поиск в %s + Введите как минимум 2 символа для начала поиска. + Поиск контактов + Поиск избранного + Поиск приложений + Поиск событий + Поиск групп + Поиск истории + Поиск вызовов + Поиск файлов + Поиск папок + Поиск файлов и папок + Поиск списков воспроизведения + Поиск исполнителей + Поиск альбомов + Поиск композиций + Поиск текста + Поиск переписок + Поиск записей + + Фильтр + Фильтр (Pro) + Ничего не найдено. + Изменить фильтр + + Требуется разрешение для доступа к хранилищу + Требуется разрешение для доступа к контактам + Требуется разрешение для доступа к камере + Требуется разрешение для доступа аудиосистеме + Отсутствует разрешение + Необходимо разрешить приложению отображать уведомления, иначе оно не сможет показывать напоминания. + Необходимо разрешить приложению отображать уведомления, иначе оно не может показывать индикатор выполнения. + Необходимо разрешить приложению отображать уведомления, иначе оно не сможет воспроизводить композиции. + Необходимо разрешить приложению отображать уведомления, иначе оно не может записывать звук. + Необходимо разрешить приложению отображать уведомления, иначе оно не сможет показывать входящие вызовы. + Необходимо разрешить приложению отображать уведомления, иначе оно не сможет показывать входящие сообщения. + Разрешить + Требуется разрешение + + Изменение имени файла + Изменение имени папки + Невозможно переименовать файл + Невозможно переименовать папку + Имя папки не должно быть пустым + Папка с таким именем уже существует + Нельзя переименовать корневую папку + Папка переименована + Изменение имени папки + Имя файла не может быть пустым + Имя файла содержит недопустимые символы + Имя файла \"%s\" содержит недопустимые символы + Расширение не может быть пустым + Исходный файл \"%s\" не существует + Перед именем файла + После имени файла + Простое переименование + Шаблон + Строка для добавления + %Y — год +\n%M — месяц +\n%D — день +\n%h — час +\n%m — минута +\n%s — секунда +\n%i — порядковый номер с 1 + Имя файла (без .txt) + Имя файла (без .json) + Имя файла (без .zip) + Начиная с Android 11 вы больше не можете скрывать такие файлы и папки + + Копировать + Переместить + Копировать/переместить + Копировать в… + Переместить в… + Путь источника + Путь назначения + Выберите путь назначения + Нажмите здесь, чтобы выбрать расположение + Невозможно записать в выбранное расположение + Выберите путь назначения + Исходный и конечный пути не могут совпадать + Невозможно скопировать файлы + Копирование… + Копирование файлов завершено + Копирование файла завершено + Произошла ошибка + Перемещение… + Перемещение файлов завершено + Перемещение файла завершено + Некоторые файлы не могут быть перемещены + Некоторые файлы не могут быть скопированы + Файлы не выбраны + Сохранение… + Невозможно создать папку \"%s\" + Невозможно создать файл \"%s\" + Ничего не найдено + По выбранному пути недостаточно свободного места. +\nНеобходимо %1$s, доступно %2$s. + Системная служба для выбора файлов и папок недоступна + + Создать + Папка + Файл + Новая папка + Папка или файл с таким именем уже существует + Имя содержит недопустимые символы + Введите имя + Произошла неизвестная ошибка + + Файл \"%s\" уже существует + Файл \"%s\" уже существует. Перезаписать? + Папка \"%s\" уже существует + Объединить + Сохранить оба + Перезаписать + Пропустить + Добавить \"_1\" к имени + Применить ко всем + Система не разрешает операции в этой папке, выберите другую + Система не разрешает копирование в эту папку, выберите другую + Система не разрешает переименование этой папки + Нет возможности переименовать каталог в корне внешнего хранилища, только подкаталоги + Невозможно переименовать папку + + Выбор папки + Выбор файла + Предоставление доступа к внешнему накопителю + Подтвердить доступ к папке + Чтобы предоставить право на запись, выберите корневую папку SD-карты на следующем шаге + Если SD-карта не видна, попробуйте это + Разрешите приложению доступ к выбранному хранилищу на следующем экране, нажав \"Использовать эту папку\" в нижней части. + Разрешите доступ к \"<b>%s</b>\" на следующем экране, нажав \"<b>Использовать эту папку</b>\" внизу. + Нажмите \"<b>Сохранить</b>\" внизу на следующем экране, чтобы создать новую папку. + Подтвердить выделение + Загрузка… + Предоставьте приложению доступ ко всем вашим файлам, без него оно может работать некорректно. + + %d элемент + %d элемента + %d элементов + + + + %d элемент + %d элемента + %d элементов + + + Удаление %d элемента + Удаление %d элементов + Удаление %d элементов + + + + %d контакт + %d контакта + %d контактов + + + Выбрать хранилище + Хранилище + Внутренняя память + SD-карта + Корневая папка + Папка выбрана неверно, выберите SD-карту + Пути к SD-карте и USB-накопителю не могут быть одинаковыми + Похоже, что приложение у вас установлено на SD-карту, а это делает виджеты приложений недоступными. Вы даже не увидите их в списке доступных виджетов. + Это системное ограничение, поэтому, если хотите использовать виджеты, вам нужно переместить приложение обратно во внутреннюю память. + Выбрана неправильная папка, выберите \"%s\" + + Свойства + Расположение + Выбрано элементов + Дочерних элементов + Всего файлов внутри + Разрешение + Длительность + Исполнитель + Альбом + Фокусное расстояние + Выдержка + Светочувствительность (ISO) + Относительное отверстие + Камера + EXIF + Название композиции + Координаты GPS + Высота над уровнем моря + Удалить EXIF + Вы уверены, что хотите удалить записи EXIF, такие как координаты GPS, модель камеры и т.д.\? + Записи EXIF удалены + + Цвет фона + Цвет текста + Основной цвет + Цвет акцента белой темы + Цвет акцента чёрно-белой темы + Цвет переднего плана + Цвет значка приложения + Цвет нижней панели навигации + Сбросить к стандартным + Использовать по умолчанию + По умолчанию + Изменить цвет + Тема + Изменение цвета повлечёт переключение на пользовательскую тему + Сохранить + Нет + Отменить изменения + Отменить изменения? + Это действие не может быть отменено. + У вас есть несохранённые изменения. Сохранить перед выходом? + Применить цвета ко всем приложениям Simple + ВНИМАНИЕ: некоторые рабочие столы неправильно обрабатывают изменение настроек значков приложений. Если значок исчезнет, попробуйте запустить приложение через Google Play или виджет, если он доступен. + После запуска просто установите оранжевый цвет значка по умолчанию #F57C00. В худшем случае вам придётся переустановить приложение. + Цвета обновлены. Добавлена новая тема с названием \"Общая\", в дальнейшем используйте её для обновления цветов всех приложений. + Обратите внимание, что даже если вы используете версию Pro, вам всё равно требуется приложение \"Простое спасибо\" по техническим причинам, т.к. оно обеспечивает синхронизацию цветов. + Пожалуйста, купите <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Простое спасибо</a>, чтобы разблокировать эту функцию и поддержать разработку. Спасибо! + + Светлая + Тёмная + Автовыбор + Авто светлая/тёмная + Солнечная + Тёмно-красная + Белая + Чёрно-белая + Своя + Общая + Системное значение по умолчанию + + Что нового + * здесь представлены только значительные изменения, но всегда присутствуют и мелкие исправления + + Удалить + Убрать + Переименовать + Поделиться + Поделиться через… + Изменить размер + Выделить все + Выделить текст + Скрыть + Показать + Скрыть папку + Показать папку + Временно показать скрытые + Не показывать скрытые медиа + Слишком большой объём данных для функции \"Поделиться\" + Очистить и отключить корзину + Отменить + Повторить + Печать + Печать (Pro) + Ярлык + Создать ярлык + Создать ярлык (Pro) + Добавить номер контакту + Просмотр данных контакта + Вызов с SIM 1 + Вызов с SIM 2 + Переключить отображение имени файла + Переместить наверх + Переместить вниз + Закрепить элемент + Открепить элемент + Отправить SMS + Отправить письмо + Вызов + Данные контакта + Добавить контакт + Обои + + Сортировать по… + Имя + Размер + Время изменения + Время создания + Время создания + Название + Имя файла + Расширение + Случайно + Случайный порядок + По возрастанию + По убыванию + Только для данной папки + Сортировать числовые части по их значению + Имя + Отчество + Фамилия + Полное имя + Произвольная сортировка + Изменить порядок + + Вы точно хотите удалить это\? + Удалить %s? + Удалить %s\? + + Переместить %s в корзину? + + Удалить этот элемент? + Переместить этот элемент в корзину? + Больше не спрашивать (до следующего запуска) + Больше не показывать + Да + Нет + Возможно + + ПРЕДУПРЕЖДЕНИЕ: вы удаляете %d папку + ПРЕДУПРЕЖДЕНИЕ: вы удаляете %d папки + ПРЕДУПРЕЖДЕНИЕ: вы удаляете %d папок + + + PIN-код + Ввод PIN-кода + Введите PIN-код + Неправильный PIN-код + Повторите PIN-код + Графический ключ + Установить ключ + Неправильный графический ключ + Повторите ключ + Биометрические данные + Отпечаток пальца + Добавить отпечаток + Поместите палец на датчик отпечатков + Открыть диалог подтверждения биометрических данных + Авторизация + Ошибка авторизации + Авторизация заблокирована, повторите попытку через некоторое время + Отсутствуют зарегистрированные отпечатки пальцев, добавьте их в настройках устройства + Перейдите в настройки + Пароль установлен. Переустановите приложение в случае, если вы его забудете. + Установка защиты выполнена успешно. Переустановите приложение в случае возникновения проблем с её отключением. + Защитить папку + Защитить папку (Pro) + Снять защиту папки + Данная защита работает только в этом приложении, она не должна заменять собой реальное общесистемное шифрование. + + Вчера + Сегодня + Завтра + Каждый день + Скрыть год + секунд + минут + часов + дней + с + м + ч + нед. + + %d секунда + %d секунды + %d секунд + + + %d минута + %d минуты + %d минут + + + %d час + %d часа + %d часов + + + %d день + %d дня + %d дней + + + %d неделя + %d недели + %d недель + + + %d месяц + %d месяца + %d месяцев + + + %d год + %d года + %d лет + + + + %d секунду + %d секунды + %d секунд + + + %d минуту + %d минуты + %d минут + + + %d час + %d часа + %d часов + + + %d день + %d дня + %d дней + + + %d неделю + %d недели + %d недель + + + %d месяц + %d месяца + %d месяцев + + + %d год + %d года + %d лет + + + + %d секунда до события + %d секунды до события + %d секунд до события + + + %d минута до события + %d минуты до события + %d минут до события + + + %d час до события + %d часа до события + %d часов до события + + + %d день до события + %d дня до события + %d дней до события + + + %d неделя до события + %d недели до события + %d недель до события + + + %d месяц до события + %d месяца до события + %d месяцев до события + + + %d год до события + %d года до события + %d лет до события + + + + %d секунду + %d секунды + %d секунд + + + %d минуту + %d минуты + %d минут + + + %d час + %d часа + %d часов + + + %d день + %d дня + %d дней + + + %d неделю + %d недели + %d недель + + + %d месяц + %d месяца + %d месяцев + + + %d год + %d года + %d лет + + + Время до срабатывания будильника:\n%s + Время до срабатывания напоминания:\n%s + Оставшееся время:\n%s + Убедитесь, что будильник работает правильно, прежде чем полагаться на него. Он может не работать должным образом из-за системных ограничений, связанных с экономией батареи. + Убедитесь, что напоминания работают правильно, прежде чем полагаться на них. Они могут не работать должным образом из-за системных ограничений, связанных с экономией батареи. + Уведомления этого приложения отключены. Перейдите в настройки устройства и включите их. + + Будильник + Отложить + Закрыть + Без напоминания + С наступлением события + Системные звуки + Свои звуки + Добавить новый звук + Без звука + В течение дня в чч:мм + В течение дня в %02d:%02d + + Настройки + Купить \"Простое спасибо\" + Основные + Настройка цвета + Улучшенная настройка цвета + Настройка интерфейса + Настройка интерфейса (заблокировано) + Заблокировано + Настройка цветов виджета + Настройка уведомлений + Звук уведомления + Использовать английский язык + Язык + Показывать скрытые папки + Размер шрифта + Мелкий + Нормальный + Крупный + Очень крупный + Защита паролем отображения скрытых элементов + Защита паролем всего приложения + Защита паролем удаления и перемещения файлов + Не обновлять время последнего изменения при файловых операциях + Показывать информационное окно при прокрутке элементов перетаскиванием полосы прокрутки + Предотвращать засыпание устройства, пока приложение находится на переднем плане + Пропускать диалог подтверждения удаления + Использовать жест \"потянуть для обновления\" в верхней части экрана + 24-часовой формат времени + Формат даты и времени + Воскресенье — начало недели + Виджеты + Всегда использовать один и тот же интервал повтора + Интервал повтора + Вибрация при нажатии кнопок + Перемещать в корзину вместо удаления + Интервал очистки корзины + Очистка корзины + Принудительный портретный режим + Экспорт настроек + Импорт настроек + Настройки успешно экспортированы + Настройки успешно импортированы + Показывать сначала фамилию + Очистка кеша + Показывать диалог подтверждения вызова + + Отображение + Безопасность + Прокрутка + Файловые операции + Корзина + Сохранение + Запуск + Текст + Перенос + Качество + Главный экран + Эскизы + Вид списка + + Исключить + Исключить папку + Исключённые папки + (исключено) + Управление исключёнными папками + Удалить всё + Очистить список исключённых папок\? Сами папки не будут удалены. + Временно показать исключённые + Не показывать исключённые + + Управление отображаемыми вкладками + Открываемая при запуске вкладка + Контакты + Избранное + История вызовов + Группы + Последняя использованная + Файлы + Недавние файлы + + Восстановить этот файл + Восстановить выбранные файлы + Восстановить все файлы + Корзина очищена + Файлы восстановлены + Очистить корзину? Файлы будут удалены безвозвратно. + Корзина пуста + Перемещение элементов корзины отключено, используйте восстановление + Показать корзину + Скрыть корзину + Открыть корзину + Удалять файлы сразу (не в корзину) + + %d элемент перемещается в корзину + %d элемента перемещаются в корзину + %d элементов перемещаются в корзину + + + Импорт… + Экспорт… + Импортирование выполнено успешно + Экспортирование выполнено успешно + Ошибка при импортировании + Ошибка при экспортировании + Ошибка при импортировании некоторых элементов + Ошибка при экспортировании некоторых элементов + Нечего импортировать + Не найдено новых записей для импорта + Нечего экспортировать + Резервные копии + Использовать авторезервирование + Управление авторезервированием + Можно использовать следующие переменные для автоименования файла: +\n +\n%Y — год +\n%M — месяц +\n%D — день +\n%h — час +\n%m — минута +\n%s — секунда + + USB + К устройству подключён USB-накопитель, необходимо убедиться, что файлы на нём отображаются правильно. Для этого необходимо предоставить дополнительные разрешения. + Выберите корневую папку USB-накопителя на следующем экране, чтобы предоставить к нему доступ + Выбрана неправильная папка. Выберите корневую папку USB-накопителя. + + Январь + Февраль + Март + Апрель + Май + Июнь + Июль + Август + Сентябрь + Октябрь + Ноябрь + Декабрь + + янв + фев + мар + апр + май + июн + июл + авг + сен + окт + ноя + дек + + в январе + в феврале + в марте + в апреле + в мае + в июне + в июле + в августе + в сентябре + в октябре + в ноябре + в декабре + Понедельник + Вторник + Среда + Четверг + Пятница + Суббота + Воскресенье + Пн + Вт + Ср + Чт + Пт + Сб + Вс + пн + вт + ср + чт + пт + сб + вс + + Ваша версия приложения больше не будет обновляться. Обновите её до версии Pro, чтобы получать исправления и улучшения. + Ваша версия приложения больше не будет обновляться. Обновите её до версии Pro, чтобы получать исправления и улучшения, нажав здесь. + Это бесплатно до %s. При загрузке до указанной даты вы получаете её бесплатно навсегда. + Подробнее + Обновить + Локально сохранённые события необходимо перенести вручную через экспорт и последующий импорт ics-файла. Кнопки экспорта/импорта находятся в главном меню. + Привет, +\n +\nпохоже, вы только что обновились с бесплатной версии. Когда вы будете довольны pro-версией и, возможно, перенесёте в неё свои данные, можно будет удалить бесплатную версию, чтобы избежать случайного запуска, поскольку она вам больше не понадобится. +\n +\nСпасибо! + Привет, +\n +\nпохоже, что у вас уже есть pro-версия приложения. Когда вы будете довольны им и, возможно, перенесёте в него свои данные, можно будет удалить это, чтобы избежать случайного запуска, поскольку бесплатная версия вам больше не понадобится. +\n +\nСпасибо! + Привет, +\n +\nпохоже, что вы обновились с бесплатного приложения. Если вы будете довольны работой этого приложения и, возможно, перенесёте в него свои данные, то можете удалить старую бесплатную версию, чтобы избежать её случайного запуска, поскольку она вам больше не понадобится. +\n +\nСпасибо! + Привет, +\n +\nпохоже, что у вас уже есть Pro-версия приложения. Когда вы будете довольны им и, возможно, перенесёте в него свои данные, можно будет удалить это, чтобы избежать случайного запуска, поскольку эта версия вам больше не понадобится. +\n +\nСпасибо! + Привет, +\n +\nпохоже, что вы только что перешли с бесплатной версии. Если вы хотите перенести локально сохранённые события, вам нужно сделать это вручную, экспортировав их в ics-файл в бесплатной версии приложения и импортировав сюда через верхнее меню. +\n +\nКак только вы будете довольны настройкой Рго-версии, вы сможете удалить старую бесплатную версию, так как она вам больше не понадобится. +\n +\nСпасибо! + Привет, +\n +\nпохоже, что вы только что перешли с бесплатной версии. Если у вас есть какие-нибудь контакты, сохранённые в \"%s\", вам нужно перенести их вручную, экспортировав их в vcf-файл в бесплатной версии приложения и импортировав сюда через верхнее меню. +\n +\nКак только вы будете довольны настройкой Рго-версии, вы сможете удалить старую бесплатную версию, так как она вам больше не понадобится. +\n +\nСпасибо! + Привет, +\n +\nпохоже, что вы только что перешли с бесплатной версии. Если вы хотите перенести свои заметки, вам нужно сделать это вручную, экспортировав их в файл в бесплатной версии приложения и импортировав сюда через верхнее меню. +\n +\nКак только вы будете довольны настройкой Рго-версии, вы сможете удалить старую бесплатную версию, так как она вам больше не понадобится. +\n +\nСпасибо! + + О приложении + Сайт + Исходный код можно найти по адресу + Отправить отзывы или предложения + Обновить до Pro + Другие простые приложения + Другие наши приложения + Предложить другу + Попробуйте %1$s по ссылке %2$s + Предложить с помощью + Оценить в Google Play + Оценить + Поддержать разработчика + Подписаться на нас + v%1$s +\nАвторские права © Simple Mobile Tools %2$d + Поддержка + Помочь нам + Сообщество + Другое + Политика конфиденциальности + Версия %s + Привет :) + Сделано с ❤️ в Словакии + Дополнительная информация + Версия приложения: %s + ОС устройства: %s + Привет,<br><br> надеюсь, вам нравится приложение. Оно не содержит рекламы, поэтому, пожалуйста, поддержите разработку, купив приложение <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Простое спасибо</a>. Покупка также предотвратит повторное появление данного диалогового окна.<br><br> Спасибо! + Привет,<br><br>надеюсь, вам нравится приложение. Оно не содержит рекламы и не собирает ваши персональные данные. Пожалуйста, поддержите его разработку, купив <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Простое спасибо</a>. У вас также будут разблокированы все функции приложения, включая настройку цвета.<br><br>Спасибо! + Поддержите нас покупкой <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Просто спасибо</a>, которая также разблокирует все функции приложения, включая настройку цвета. + Купить + Получить \"Простой телефон\" + Обновите \"Простое спасибо\" до последней версии + Прежде чем задать вопрос, изучите настройки приложения и прочтите FAQ (часто задаваемые вопросы). Возможно, решение есть. + Прежде чем поставить оценку, изучите настройки приложения и прочтите FAQ (часто задаваемые вопросы). Если у вас возникли какие-то проблемы, возможно, решение уже есть. + Также убедитесь, что используете последнюю версию приложения. + Также обратите внимание, что эта версия приложения больше не разрабатывается. Установите версию Pro для приобретения множества улучшений. + Прочитать + Прочитать FAQ + Привет,\n\nпохоже, вы уже давно используете данное приложение и мы очень ценим это.\n\nНе могли бы вы оказать нам услугу и оценить его в Google Play? Это действительно очень нам поможет.\n\nНезависимо от вашего решения данное сообщение больше не появится.\n\nСпасибо! + Оцените приложение, пожалуйста :) + Спасибо + Виджет заблокирован.\nПерейдите на версию Pro, чтобы разблокировать его. + Эта функция заблокирована, пожалуйста, купите <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Простое спасибо</a> для разблокировки всех возможностей приложения.<br><br>Это разовый платёж, и если вы не будете удовлетворены, возможен возврат денег. + + +
    + просто сообщаю, что недавно были выпущены новые приложения:

    + %2$s

    + %4$s

    + %6$s

    + Их можно скачать, нажимая на заголовок.

    + Спасибо + ]]> +
    + Простой запуск приложений + Простой калькулятор + Простой календарь + Простая камера + Простые часы + Простые контакты + Простой телефон + Простое рисование + Простой менеджер файлов + Простой фонарик + Простая галерея + Простая клавиатура + Простой рабочий стол + Простой музыкальный плеер + Простые заметки + Простые сообщения + Простое спасибо + Простой диктофон + Рабочий стол + Калькулятор + Календарь + Камера + Часы + Контакты + Телефон + Рисование + Файловый менеджер + Фонарик + Галерея + Клавиатура + Лаунчер + Проигрыватель музыки + Заметки + Сообщения + Спасибо + Диктофон + + отсюда. + ]]> + + + Часто задаваемые вопросы + Прежде чем задать вопрос, прочитайте + Почему я не вижу виджет этого приложения в списке виджетов? + Это, скорее всего, потому, что вы перенесли приложение на SD-карту. Существует ограничение системы Android, которое скрывает виджеты приложения в этом случае. Единственное решение — переместить приложение обратно во внутреннее хранилище через настройки вашего устройства. + Я хочу поддержать вас, но не могу пожертвовать деньги. Есть ли что-нибудь ещё, что я могу сделать? + + здесь. Можно просто связаться с нами по электронной почте hello@simplemobiletools.com, если у вас есть какие-либо вопросы. + ]]> + + Я по ошибке удалил некоторые файлы, как их восстановить? + К сожалению, вы не сможете. Файлы удаляются сразу после диалога подтверждения, функции вроде \"корзины\" не предусмотрено. + Мне не нравятся цвета виджета, я могу их изменить? + Да, при перетаскивании виджета на главный экран появляется панель его настройки. На ней вы увидите цветные квадраты в левом нижнем углу, просто нажмите их, чтобы выбрать новый цвет. Также можно использовать ползунок для настройки прозрачности. + Могу я как-то восстановить удалённые файлы? + Если они были действительно были удалены, то не можете. Однако по умолчанию используется \"корзина\" и файлы перемещаются в неё вместо реального удаления. + Значок запуска приложения исчез. Что делать? + Это вызвано тем, что ваш рабочий стол неправильно отображает значок приложения. Если значок исчезнет, попробуйте запустить приложение через Google Play или виджет, если он доступен. + После запуска просто установите оранжевый цвет значка по умолчанию #F57C00. В худшем случае вам придётся переустановить приложение. + Деньги были списаны с моего банковского счета, но я не могу загрузить приложение. Что можно сделать? + Платежи полностью обрабатываются Google, их система время от времени даёт сбои. Просто очистите кеш приложения Google Play и перезагрузите устройство, затем повторите попытку загрузки. + Почему следует перейти на версию Pro? + Поскольку версия приложения больше не обновляется, ошибки, которые вы, возможно, заметили, никогда не будут исправлены. Также не будет добавлено никаких новых функций. Вы можете приобрести Pro-версию на Google Play за очень небольшую сумму. + Это разовая покупка, которая означает, что вам никогда не придётся платить снова. Даже после смены устройства. Если вам не понравится версия Pro, вы можете просто удалить её в течение нескольких часов, после чего автоматически получите свои деньги обратно. + Если вы захотите вернуть деньги в любое время позже, просто свяжитесь с нами по адресу hello@simplemobiletools.com и мы вернём их. + Как выбрать сразу несколько элементов? + Есть несколько способов сделать это. Первый — это включить режим выделения длительным нажатием на одном элементе, а затем выделять другие короткими нажатиями на них. Второй способ аналогичен выбору элементов на ПК с помощью мыши: включите режим выбора длительным нажатием на одном элементе, затем, не отпуская пальца, проведите им по другим элементам для выбора. Третий способ выбора нескольких элементов — длительное нажатие на один элемент, затем длительное нажатие на другой, и всё, что находится между ними, выбирается. Если нужно выбрать все элементы, длительным нажатием выделите один элемент, а затем нажмите на счётчик выбранных элементов в левом верхнем углу. Это действие выберет или отменит выбор всего. + Я купил приложение, но не могу загрузить его на другое устройство. + Попробуйте очистить кеш приложения Google Play и перезагрузить устройство. Это какая-то ошибка в Google Play, не связанная с самим приложением. + + Участники + Перевод + Разработка + Другая помощь + + здесь. Можно просто связаться с нами по электронной почте hello@simplemobiletools.com, если у вас есть какие-либо вопросы. + Спасибо всем участникам и другим помощникам! + ]]> + + Арабский + Азербайджанский + Бенгальский + Бретонский + Болгарский + Каталанский + Чешский + Валлийский + Датский + Английский + Немецкий + Греческий + Испанский + Баскский + Персидский + Финский + Французский + Галицкий + Хинди + Хорватский + Венгерский + Индонезийский + Итальянский + Иврит + Японский + Корейский + Литовский + Непальский + Норвежский + Голландский + Польский + Португальский + Румынский + Русский + Словацкий + Словенский + Сербский + Шведский + Тамильский + Турецкий + Украинский + Вьетнамский + Китайский (Гонконг) + Китайский (упрощённый) + Китайский (традиционный) + + Получите Pro-версию прямо сейчас! + Базовая + Pro + Никакой рекламы + Без доступа к интернету + 100% гарантия возврата денег + Разовый платёж + Улучшенный дизайн + + Мощный фоторедактор + Расширенный редактор фото и видео + Поддержка файлов HEIC/HEIF + Пакетное переименование файлов + Индивидуальная блокировка папок + Поддержка печати + + Поддержка часовых поясов + Участники и напоминания по электронной почте + Удобный импорт событий + Новые виджеты + + Улучшенная функция слияния контактов + Настройка размера шрифта + Дополнительный обмен конфиденциальными контактами в наших приложениях + Настройка мелодии вызова для контакта + Фильтрация контактов + Сохранение конфиденциальности контактов + + Контрольные списки + Разные заметки и цвета для каждого виджета + Блокировка заметок + + Настройка формата даты и времени + Ярлыки на главном экране + Поддержка сжатия файлов + Вкладка с недавними файлами + + Настройка цвета фона + Поддержка импорта файлов + Масштабирование + + Это приложение использует следующие библиотеки сторонних разработчиков, облегчающие мой труд. Спасибо им. + Лицензии третьих сторон + Kotlin (язык программирования) + Subsampling Scale Image View (возможность масштабирования изображений) + Glide (загрузка и кеширование изображений) + Picasso (загрузка и кеширование изображений) + Android Image Cropper (обрезка и поворот изображений) + RtlViewPager (отображение на RTL-языках) + Joda-Time (замена даты Java) + Stetho (отладка баз данных) + Otto (шина событий) + PhotoView (масштабирование GIF) + PatternLockView (защита графическим ключом) + Reprint (защита по отпечатку пальца) + Gif Drawable (отображение GIF) + AutoFitTextView (масштабирование текста) + Robolectric (фреймворк для тестирования) + Espresso (помощник по тестированию) + Gson (анализатор JSON) + Leak Canary (детектор утечек памяти) + Number Picker (настраиваемый ввод чисел) + ExoPlayer (видеопроигрыватель) + VR Panorama View (отображение панорам) + Apache Sanselan (чтение метаданных изображений) + Android Photo Filters (фильтры изображений) + Gesture Views (масштабирование изображений) + Indicator Fast Scroll (буквы на полосе прокрутки) + Event Bus (коммуникация внутри приложения) + Audio Record View (звуковая визуализация) + SMS, MMS (обработка SMS и MMS) + APNG Android (отображение анимации WebP) + PDFViewPager (просмотр PDF) + M3U Parser (обработка файлов списков воспроизведения m3u) + AndroidLame (кодировщик в mp3) + + Пробный период истёк + Начать пробный период + Пробный период скоро истечёт. + Разблокировать приложение на один последний день + Добро пожаловать в %s! + Благодарим вас за использование нашего приложения. Вы можете использовать эту разблокированную версию %d дней. После окончания пробного периода рассмотрите возможность обновления до Pro-версии. Она имеет огромное количество новых функций, современный дизайн, отсутствие рекламы и множество других улучшений. +\n +\nОплата потребуется один раз в жизни и если вы не будете довольны работой приложения, то можете удалить его и получить возврат средств. +\n +\nНадеемся, вам понравится :) + Пожалуйста, обновитесь до Pro-версии, чтобы пользоваться приложением в полном объёме. +\n +\nОплата потребуется один раз в жизни и если вы не будете довольны работой приложения, то можете удалить его и получить возврат средств. +\n +\nУвидимся :) + + Пробный период истекает через %d день. + Пробный период истекает через %d дня. + Пробный период истекает через %d дней. + Пробный период истекает через %d дней. + + + УСТАРЕВШЕЕ: данная версия приложения больше не поддерживается, переходите на версию Pro https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Не забывайте, что если вы удалите любое платное приложение в течение 2 часов, вам будет автоматически возвращена сумма покупки. Если вы захотите вернуть деньги позднее, просто свяжитесь с нами по адресу hello@simplemobiletools.com и вы их получите. Так что можно легко опробовать это приложение :) + + Группа простых приложений для Android с открытым исходным кодом с настраиваемыми виджетами без рекламы и ненужных разрешений. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-sk/strings.xml b/commons/src/main/res/values-sk/strings.xml new file mode 100644 index 000000000..c695c2204 --- /dev/null +++ b/commons/src/main/res/values-sk/strings.xml @@ -0,0 +1,1192 @@ + + OK + Zrušiť + Späť + Nič + Neskôr + Uložiť ako + Súbor bol úspešne uložený + Neplatný formát súboru + Došlo k chybe s nedostatkom pamäte + Došlo k chybe: %s + Chyba: %s + Otvoriť pomocou + Upraviť pomocou + Upraviť + Nenašla sa žiadna vhodná aplikácia + Nenašiel sa žiadny prehliadač + Nenašiel sa žiadny emailový klient + Nastaviť ako + Skopírovať do schránky + Skopírovať číslo do schránky + Hodnota bola vložená do schránky + Hodnota bola vložená do schránky:\n%s + Vytočiť číslo + Neznámy + Vždy + Nikdy + Detaily + Poznámky + Odstraňuje sa priečinok \'%s\' + Žiadny + Štítok + Priesvitná + Priesvitná farba + Zvoliť inú farbu + Stiahnuť + Upozornenie + Upozornenia + Email + Predošlá + Hrať / Pauznúť + Nasledujúca + Číslo + Nenašli sa žiadne kontakty + Vyžiadať potrebné oprávnenia + Nepodarilo sa získať zoznam kontaktov + Apka nemá oprávnenie na iniciovanie hovorov, prosím udeľte ho v nastaveniach zariadenia + Zadajte text sem + Zavolať %s + Potvrďte volanie %s + Nula + Jedna + Dva + Tri + Štyri + Päť + Šesť + Sedem + Osem + Deväť + Hodnota + Hodnota nesmie byť prázdna + Vytvoriť nový kontakt + Pridať k existujúcemu kontaktu + Apka je poškodená + Upozornenie + Vytvoriť fotku + Zvoliť fotku + Zvoliť video + Zvoliť kontakt + Zvoliť súbor + Nahrať audio + Nahrať video + Upravuje sa… + Úložisko mobilu + Úložisko mobilu (neviditeľné pre ostatné apky) + Audio + + + Narodeniny + Výročie + + + Domov + Práca + + + Mobil + Hlavné + Pracovný fax + Domáci fax + Pager + Nenašlo sa žiadne telefónne číslo + + + Zmeniť typ zobrazenia + Mriežka + Mriežka (Pro) + Nerovnomerná mriežka + Zoznam + Zvýšiť počet stĺpcov + Znížiť počet stĺpcov + Počet stĺpcov Column count + Počet stĺpcov v zobrazení na výšku + Počet stĺpcov v zobrazení na šírku + Zmeniť obal albumu + Zvoliť foto + + %d stĺpec + %d stĺpce + %d stĺpcov + + + + Spravovať blokované čísla + Neblokujete nikoho. + Pridať blokované číslo + Blokovať číslo + Blokovať čísla + Blokované čísla + Exportovať blokované čísla + Importovať blokované čísla + Pre použitie blokovania čísel musíte nastaviť aplikáciu ako predvolenú pre správu hovorov. + Nastaviť ako predvolenú + Ste si istý, že chcete zablokovať \"%s\"? + Blokovať volania od neuložených kontaktov + Blokovať správy od neuložených kontaktov + Zadajte číslo, alebo vzor (napr. *12345*, +421*8888) pre blokovanie hovorov a správ z čísel, ktoré spadajú pod daný vzor. + Nedá sa blokovať neznáme čísla bez prístupu ku správe ID. + + + Obľúbené + Pridať obľúbené + Pridať medzi obľúbené + Odstrániť spomedzi obľúbených + + + Vyhľadávanie + Vyhľadať v %s + Zadajte aspoň 2 znaky pre spustenie vyhľadávania. + Vyhľadať kontakty + Vyhľadať obľúbené + Vyhľadať apky + Vyhľadať udalosti + Vyhľadať skupiny + Vyhľadať v histórii + Vyhľadať hovor + Vyhľadať súbory + Vyhľadať priečinky + Vyhľadať súbory a priečinky + Vyhľadať playlisty + Vyhľadať interpretov + Vyhľadať albumy + Vyhľadať skladby + Vyhľadať text + Vyhľadať konverzácie + Vyhľadať nahrávky + + + Filtrovať + Filtrovať (Pro) + Nenašli sa žiadne položky. + Upraviť filter + + + Je potrebné povolenie pre prístup k súborom + Je potrebné povolenie pre prístup ku kontaktom + Je potrebné povolenie pre prístup ku kamere + Je potrebné povolenie pre prístup ku zvuku + Chýba oprávnenie + Musíte apke povoliť zobrazovanie upozornení, ináč nevie zobrazovať pripomienky. + Musíte apke povoliť zobrazovanie upozornení, ináč nevie zobraziť stav kopírovania. + Musíte apke povoliť zobrazovanie upozornení, ináč nevie prehrávať pesničky. + Musíte apke povoliť zobrazovanie upozornení, ináč nevie nahrať audio. + Musíte apke povoliť zobrazovanie upozornení, ináč nevie zobraziť prichádzajúce hovory. + Musíte apke povoliť zobrazovanie upozornení, ináč nevie zobraziť prichádzajúce správy. + Udeliť povolenie + Chýba povolenie + + + Premenovať súbor + Premenovať priečinok + Nepodarilo sa premenovať súbor + Nepodarilo sa premenovať priečinok + Názov priečinka nemôže byť prázdny + Priečinok s daným názvom už existuje + Nepodarilo sa premenovať základný priečinok úložiska + Priečinok bol úspešne premenovaný + Premenúva sa priečinok + Názov súboru nemôže byť prázdny + Názov súboru obsahuje neplatné znaky + Názov súboru \'%s\' obsahuje neplatné znaky + Prípona nesmie byť prázdna + Zdrojový súbor %s neexistuje + Pridať pred názvy súborov + Pridať za názvy súborov + Jednoduché premenovanie + Vzor + Reťazec na pridanie + %Y - rok\n%M - mesiac\n%D - deň\n%h - hodina\n%m - minúta\n%s - sekunda\n%i - číslo narastajúce od 1 + Názov súboru (bez .txt) + Názov súboru (bez .json) + Názov súboru (bez .zip) + Od Android verzie 11 už nie je možné takýmto spôsobom skrývať súbory a priečinky + + + Kopírovať + Presunúť + Kopírovať / presunúť + Kopírovať do + Presunúť do + Zdroj + Cieľ + Vyberte cieľovú cestu + Kliknite sem pre zvolenie cieľovej cesty + Nepodarilo sa písať na cieľovú polohu + Prosím zvoľte cieľ + Zdroj a cieľ sa nemôžu zhodovať + Nepodarilo sa skopírovať súbory + Kopírovanie… + Súbory boli úspešne skopírované + Súbor bol úspešne skopírovaný + Došlo k chybe + Presúvanie… + Súbory boli úspešne presunuté + Súbor bol úspešne presunutý + Nepodarilo sa presunúť niektoré súbory + Nepodarilo sa skopírovať niektoré súbory + Niesú označené žiadne súbory + Ukladanie… + Nepodarilo sa vytvoriť priečinok %s + Nepodarilo sa vytvoriť súbor %s + Nenašli sa žiadne nové položky + V cieľovom priečinku nie je dostatok miesta.\nPotrebných %1$s, k dispozícií %2$s + Systémová služba na voľbu súborov a priečinkov nie je dostupná + + + Vytvoriť nový + Adresár + Súbor + Vytvoriť nový adresár + Súbor alebo adresár s daným názvom už existuje + Názov obsahuje neplatné znaky + Prosím zadajte názov + Došlo k neznámej chybe + + + Súbor \"%s\" už existuje + Súbor \"%s\" už existuje. Prepísať? + Priečinok \"%s\" už existuje + Zlúčiť + Ponechať oba súbory + Prepísať + Preskočiť + Pripnúť \'_1\' + Použiť na všetky konflikty + Systém nepovoľuje túto operáciu v tomto priečinku, prosím zvoľte iný + Systém nepovoľuje kopírovanie do tohto priečinka, prosím zvoľte iný + Systém v tomto priečinku nepovoľuje premenovávanie + Nedá sa premenovať priečinky priamo na internej pamäti, iba podpriečinky + Tento priečinok sa nedá premenovať + + + Zvoľte priečinok + Zvoľte súbor + Potvrďte prístup k externým súborom + Potvrďte prístup k priečinku + Pre poskytnutie práva na zápis prosím zvoľte na nasledujúcej obrazovke základný priečǐnok SD karty + Ak nevidíte SD kartu, skúste toto + Prosím povoľte prístup ku zvolenému úložisku na nasledujúcej obrazovke stlačením spodného tlačidla \"Použiť tento priečinok\". + Prosím povoľte prístup ku \'<b>%s</b>\' na nasledujúcej obrazovke stlačením spodného tlačidla \"<b>Použiť tento priečinok</b>\". + Pre vytvorenie nového priečinka prosím stlačte \'<b>Uložiť</b>\' na spodku nasledujúcej obrazovky. + Potvrdiť výber + Načítavanie… + Prosím povoľte našej apke prístup ku všetkým vašim súborom. Bez neho nebude fungovať správne. + + + %d položka + %d položky + %d položiek + + + + + %d položku + %d položky + %d položiek + + + + Odstraňuje sa %d položka + Odstraňujú sa %d položky + Odstraňuje sa %d položiek + + + + + %d kontakt + %d kontakty + %d kontaktov + + + + Zvoľte úložisko + Úložisko + Interné + SD karta + Koreňový priečinok + Bol zvolený nesprávny priečinok, prosím zvoľte hlavný priečinok SD karty + Cesta k SD karte a USB zariadeniu nesmie byť rovnaká + Vyzerá to tak, že máte aplikáciu nainštalovanú na SD karte, čo spôsobí nedostupnosť widgetov. Ani ich neuvidíte na zozname dostupných widgetov. + Ide o systémové obmedzenie, čiže ak chcete widgety používať, musíte presunúť aplikáciu späť na internú pamäť. + Zvolili ste zlý priečinok, prosím zvoľte \'%s\' + + + Vlastnosti + Cesta + Počet zvolených položiek + Počet priamych podpoložiek + Celkový počet vnútorných položiek + Rozlíšenie + Trvanie + Skupina + Album + Ohnisková vzdialenosť + Dĺžka expozície + Rýchlosť ISO + Clonové číslo + Fotoaparát + EXIF + Názov skladby + GPS súradnice + Nadmorská výška + Odstrániť EXIF + Ste si istý, že chcete odstrániť všetky EXIF hodnoty ako GPS súradnice, model fotoaparátu atď? + EXIF hodnoty boli úspešne odstránené + + + Farba pozadia + Farba textu + Primárna farba + Akcentová farba bielej témy + Akcentová farba Čiernobielej témy + Farba popredia + Farba spúšťacej ikonky apky + Farba spodnej navigačnej lišty + Obnoviť predvolené + Použiť predvolenú + Predvolená + Zmeniť farbu + Téma + Zmena farby spôsobí prepnutie na Vlastnú tému + Uložiť + Zahodiť + Vrátiť zmeny + Ste si istý, že chcete vrátiť zmeny? + Táto akcia sa nedá vrátiť späť. + Máte neuložené zmeny. Chcete ich uložiť pred ukončením? + Použiť farby na všetky Jednoduché Aplikácie + UPOZORNENIE: Niektoré spúšťače zariadení nepodporujú úpravu ikoniek. V prípade, že ikonka apky zmizne, ju skúste spustiť cez Google Play, alebo nejaký widget, ak je dostupný. + Ak je apka spustená, skúste nastaviť pôvodnú oranžovú farbu ikonky #F57C00. V najhoršom prípade budete musieť apku preinštalovať. + Farby boli úspešne aktualizované. Bola pridaná nová \'Zdieľaná\' téma, prosím použite ju pri ďalšej úprave farieb. + Pripomíname vám, že napriek tomu, že používate Pro verziu apky, stále potrebujete \"Jednoduché ďakujem\" z technických príčin. Ona má totižto na starosti synchronizáciu farieb. + + Jednoduché ďakujem na odomknutie tejto funkcie a podporu vývoja. Vďaka! + ]]> + + + + Svetlá + Tmavá + Automatická + Automatická svetlá / tmavá + Solarizovaná + Tmavo červená + Biela + Čiernobiela + Vlastná + Zdieľaná + Systémová + + + Novinky + * sú tu vypísané iba väčšie aktualizácie, stále sú vykonané aj menšie opravy + + + Vymazať + Odstrániť + Premenovať + Zdieľať + Zdieľať cez + Zmeniť veľkosť + Označiť všetko + Označiť text + Skryť + Odkryť + Skryť priečinok + Odkryť priečinok + Dočasne zobraziť skryté + Ukončiť zobrazovanie skrytých médií + Nemôžete zdieľať toľko obsahu naraz + Vysypať a deaktivovať odpadkový kôš + Späť + Obnoviť + Tlačiť + Tlačiť (Pro) + Skratka + Vytvoriť skratku + Vytvoriť skratku (Pro) + Priradiť číslo kontaktu + Zobraziť detaily kontaktu + Zavolať zo SIM 1 + Zavolať zo SIM 2 + Prepnúť viditeľnosť názvov súborov + Presunúť na vrch + Presunúť na spodok + Pripnúť položku + Odopnúť položku + Poslať SMS + Poslať email + Zavolať + Detaily kontaktu + Pridať kontakt + Tapety + + + Na zoradenie použiť + Názov + Veľkosť + Dátum poslednej úpravy + Dátum vytvorenia + Dátum vytvorenia + Názov + Názov súboru + Prípona + Náhodne + Zoradiť náhodne + Vzostupne + Klesajúco + Použiť iba pre tento priečinok + Zoradiť časti s číslami podľa hodnoty + Krstné meno + Stredné meno + Priezvisko + Celé meno + Použiť vlastné zoradenie + Zmeniť poradie + + + Ste si istý, že chcete pokračovať s vymazaním? + Ste si istý, že chcete vymazať %s? + Odstrániť %s? + Ste si istý, že chcete vyhodiť %s do koša? + Ste si istý, že chcete vymazať túto položku? + Ste si istý, že chcete vyhodiť túto položku do odpadkového koša? + Nepýtať sa už v tomto spustení + Viac už nezobrazovať + Áno + Nie + Možno + + + UPOZORNENIE: Chystáte sa vymazať %d priečinok + UPOZORNENIE: Chystáte sa vymazať %d priečinky + UPOZORNENIE: Chystáte sa vymazať %d priečinkov + + + + PIN + Zadajte PIN + Prosím zadajte PIN + Nesprávny PIN + Zopakujte PIN + Vzor + Zadajte vzor + Nesprávny vzor + Zopakujte vzor + Biometria + Odtlačok + Pridať odtlačok prsta + Prosím priložte prst ku senzoru odtlačku prsta + Otvoriť dialóg na biometrické overenie + Overenie + Overovanie zlyhalo + Overovanie je zablokované, prosím skúste o chvíľu + Nemáte zaregistrované žiadne odtlačky, prosím pridajte nejaké v Nastaveniach zariadenia + Ísť do nastavení + Heslo bolo úspešne nastavené. Ak ho zabudnete, prosím preinštalujte aplikáciu. + Ochrana bola úspešne nastavená. Prosím preinštalujte aplikáciu v prípade problémov s jej zmenou. + Uzamknúť priečinok + Uzamknúť priečinok (Pro) + Odomknúť priečinok + Táto ochrana funguje iba v tejto aplikácii, nemá za cieľ nahradiť šifrovanie fungujúce po celom systéme. + + + Včera + Dnes + Zajtra + Každý deň + Ukryť rok + sekundy + minúty + hodiny + dni + s + m + h + t. + + + %d sekunda + %d sekundy + %d sekúnd + + + %d minúta + %d minúty + %d minút + + + %d hodina + %d hodiny + %d hodín + + + %d deň + %d dni + %d dní + + + %d týždeň + %d týždne + %d týždňov + + + %d mesiac + %d mesiace + %d mesiacov + + + %d rok + %d roky + %d rokov + + + + + %d sekundu + %d sekundy + %d sekúnd + + + %d minútu + %d minúty + %d minút + + + %d hodinu + %d hodiny + %d hodín + + + %d deň + %d dni + %d dní + + + %d týždeň + %d týždne + %d týždňov + + + %d mesiac + %d mesiace + %d mesiacov + + + %d rok + %d roky + %d rokov + + + + + %d sekundu vopred + %d sekundy vopred + %d sekúnd vopred + + + %d minútu vopred + %d minúty vopred + %d minút vopred + + + %d hodinu vopred + %d hodiny vopred + %d hodín vopred + + + %d deň vopred + %d dni vopred + %d dní vopred + + + %d týždeň vopred + %d týždne vopred + %d týždňov vopred + + + %d mesiac vopred + %d mesiace vopred + %d mesiacov vopred + + + %d rok vopred + %d roky vopred + %d rokov vopred + + + + + %d sekundu + %d sekundy + %d sekúnd + + + %d minútu + %d minúty + %d minút + + + %d hodinu + %d hodiny + %d hodín + + + %d deň + %d dni + %d dni + + + %d týždeň + %d týždne + %d týždňov + + + %d mesiac + %d mesiace + %d mesiacov + + + %d rok + %d roky + %d rokov + + + + Zostávajúci čas do zvonenia budíka:\n%s + Zostávajúci čas do pripomienky:\n%s + Zostávajúci čas:\n%s + Pred tým, ako by ste sa na budík spoliehali, sa prosím uistite, že funguje správne. Niektoré systémové obmedzenia spojené so zlepšením výdrže batérie môžu spôsobiť problémy. + Pred tým, ako by ste sa na upozornenia spoliehali, sa prosím uistite, že fungujú správne. Pozrite sa do nastavení batérie a upozornení vášho zariadenia, či nič neblokuje upozornenia, alebo nevypína na pozadí apku. + Pripomienky tejto aplikácie sú vypnuté. Pre ich zapnutie prosím choďte do nastavení zariadenia. + + + Budík + Odložiť + Odstrániť + Žiadna pripomienka + Na začiatku + Systémové zvuky + Vaše zvuky + Pridať nový zvuk + Žiadny zvuk + Počas dňa o hh:mm + Počas dňa o %02d:%02d + + + Nastavenia + Kúpiť Jednoduché Ďakujem + Všeobecné + Úprava farieb + Vylepšená úprava farieb + Upraviť farby + Upraviť farby (Uzamknuté) + Uzamknuté + Upraviť farby widgetov + Upraviť pripomienky + Zvuk upozornenia + Použiť angličtinu + Jazyk + Zobraziť skryté položky + Veľkosť písma + Malé + Stredné + Veľké + Extra veľké + Uzamknúť heslom viditeľnosť skrytých položiek + Uzamknúť heslom celú aplikáciu + Uzamknúť heslom mazanie a presúvanie súborov + Ponechať starú hodnotu naposledy-upravené pri súborových operáciách + Zobraziť informačnú bublinu pri prehliadaní položiek ťahaním posuvníka + Zabrániť uspaniu zariadenia kým je apka v popredí + Stále preskočiť potvrdenie vymazania súborov + Povoliť obnovenie súborov potiahnutím zhora + Použiť 24 hodinový časový formát + Zmeniť dátumový a časový formát + Začať týždeň nedeľou + Widgety + Použiť stále rovnaký čas s Odložiť + Čas odloženia + Vibrovať pri stlačení tlačidiel + Presunúť položky miesto vymazania do odpadkového koša + Interval vysypávania koša + Vysypať odpadkový kôš + Stále použiť režim na výšku + Exportovať nastavenia + Importovať nastavenia + Nastavenia boli úspešne exportované + Nastavenia boli úspešne importované + Začať meno priezviskom + Vymazať cache + Zobraziť pred spustením hovoru okno na jeho potvrdenie + + + Viditeľnosť + Bezpečnosť + Skrolovanie + Súborové operácie + Odpadkový kôš + Ukladanie + Po spustení + Text + Migrovanie + Kvalita + Hlavná obrazovka + Miniatúry + Zobrazenie zoznamu + + + Vylúčiť + Vylúčiť priečinok + Vylúčené priečinky + (vylúčené) + Spravovať vylúčené priečinky + Odstrániť všetky + Odstrániť všetky priečinky zo zoznamu vylúčených\? Táto operácia neodstráni samotný obsah priečinkov. + Dočasne zobraziť vylúčené + Ukončiť zobrazovanie vylúčených + + + Spravovať zobrazené karty + Karta otvorená po spustení apky + Kontakty + Obľúbené + História volaní + Skupiny + Naposledy použitá + Súbory + Najnovšie súbory + + + Obnoviť tento súbor + Obnoviť vybrané súbory + Obnoviť všetky súbory + Odpadkový kôš bol vyprázdnený + Súbory boli úspešne obnovené + Ste si istý, že chcete vysypať odpadkový kôš? Súbory budú navždy stratené. + Odpadkový kôš je prázdny + Presúvanie položiek z odpadkového koša je zakázané, prosím použite možnosť Obnoviť + Zobraziť odpadkový kôš + Skryť odpadkový kôš + Otvoriť odpadkový kôš + Vynechať odpadkový kôš, priamo vymazať súbory + + + %d položka sa presúva do odpadkového koša + %d položky sa presúvajú do odpadkového koša + %d položiek sa presúva do odpadkového koša + + + + Importovanie… + Exportovanie… + Importovanie bolo úspešné + Exportovanie bolo úspešné + Importovanie zlyhalo + Exportovanie zlyhalo + Importovanie niektorých položiek zlyhalo + Exportovanie niektorých položiek zlyhalo + Nenašli sa žiadne položky pre import + Nenašli sa žiadne nové položky pre import + Nenašli sa žiadne položky pre export + Zálohy + Povoliť automatické zálohy + Spravovať automatické zálohy + Na pomenúvanie vašich súborov môžete použiť nasledovné vzory:\n\n%Y - rok\n%M - mesiac\n%D - deň\n%h - hodina\n%m - minúta\n%s - sekunda + + + USB + Vyzerá to tak, že máte k zariadeniu pripoené USB zariadenie. Pre správne zobrazovanie sa jeho súborov sú potrebné ďalšie oprávnenia. + Pre poskytnutie práv prosím zvoľte na nasledujúcej obrazovke základný priečinok USB zariadenia + Bol zvolený nesprávny priečinok, prosím zvoľte hlavný priečinok USB zariadenia + + + Január + Február + Marec + Apríl + Máj + Jún + Júl + August + September + Október + November + December + + Jan + Feb + Mar + Apr + Máj + Jún + Júl + Aug + Sept + Okt + Nov + Dec + + + v januári + vo februári + v marci + v apríli + v máji + v júni + v júli + v auguste + v septembri + v októbri + v novembri + v decembri + + Pondelok + Utorok + Streda + Štvrtok + Piatok + Sobota + Nedeľa + + P + U + S + Š + P + S + N + + Po + Ut + St + Št + Pi + So + Ne + + + Vaša verzia aplikácie už nebude dostávať aktualizácie. Pre nové opravy a iné vylepšenia si prosím stiahnite Pro verziu. + Vaša verzia aplikácie už nebude dostávať aktualizácie. Pre nové opravy a iné vylepšenia si prosím stiahnite Pro verziu kliknutím sem. + Je do bezplatné do: %s. Ak ju dovtedy stiahnete, budete ju môcť zadarmo navždy používať. + Viac info + Stiahnuť + Lokálne uložené udalosti musíte exportovať manuálne do .ics súboru, následne importovať. Tlačidlá pre exportovanie/importovanie nájdete v menu hlavnej obrazovky. + Zdravím,\n\nvyzerá to tak, že ste sem práve prešli z bezplatnej verzie apky. Ak ste s touto apkou spokojný a možno aj premigrovali obľúbené položky a nastavenia, môžete bezplatnú apku odinštalovať, aby ste ju nespúšťali náhodou. Nebudete ju už potrebovať.\n\nVďaka! + Zdravím,\n\nvyzerá to tak, že už máte nainštalovanú aj Pro verziu apky. Ak ste s ňou spokojný a možno aj premigrovali obľúbené položky a nastavenia, túto verziu už nebudete potrebovať a môžete ju odinštalovať, aby ste ju nespúšťali náhodou.\n\nVďaka! + Zdravím,\n\nvyzerá to tak, že ste sem práve prešli z bezplatnej verzie apky. Ak ste s touto apkou spokojný a možno aj premigrovali nejaké dáta, môžete bezplatnú apku odinštalovať, aby ste ju nespúšťali náhodou. Nebudete ju už potrebovať.\n\nVďaka! + Zdravím,\n\nvyzerá to tak, že už máte nainštalovanú aj Pro verziu apky. Ak ste s ňou spokojný a možno aj premigrovali nejaké dáta, túto verziu už nebudete potrebovať a môžete ju odinštalovať, aby ste ju nespúšťali náhodou.\n\nVďaka! + Zdravím,\n\nvyzerá to tak, že ste prišiel zo starej, bezplatnej apky. Ak si chcete premigrovať lokálne uložené udalosti, musíte to spraviť ručne exportovaním do .ics súboru v starej apke a následným importovaním do tejto cez horné menu.\n\nAk ste spokojný so všetkým v Pro verzii, môžete odinštalovať starú, keďže ju už potrebovať nebudete.\n\Vďaka! + Zdravím,\n\nvyzerá to tak, že ste prišiel zo starej, bezplatnej apky. Ak ste mali niektoré kontakty uložené v \"%s\", musíte ich premigrovať ručne exportovaním do .vcf súboru v starej apke a následným importovaním do tejto cez horné menu.\n\nAk ste spokojný so všetkým v Pro verzii, môžete odinštalovať starú, keďže ju už potrebovať nebudete.\n\Vďaka! + Zdravím,\n\nvyzerá to tak, že ste prišiel zo starej, bezplatnej apky. Ak chcete premigrovať vaše poznámky, musíte to spraviť ručne exportovaním do súboru v starej apke a následným importovaním do tejto cez horné menu.\n\nAk ste spokojný so všetkým v Pro verzii, môžete odinštalovať starú, keďže ju už potrebovať nebudete.\n\Vďaka! + + + O aplikácií + Webstránka + Pre zdrojové kódy navštívte + Odozvu a návrhy posielajte na + Stiahnuť Pro verziu + Viac aplikácií + Viac aplikácií od nás + Pozvať priateľov + Ahoj, skús %1$s na %2$s + Pozvať cez + Ohodnotiť aplikáciu + Ohodnotiť + Podporiť + Sledujte nás + v %1$s\nCopyright © Simple Mobile Tools %2$d + Podpora + Pomôžte nám + Sociálne siete + Iné + Ochrana osobných údajov + Verzia %s + Ahoj :) + Vyrobené zo ❤️ na Slovensku + Dodatočné informácie + Verzia aplikácie: %s + Operačný systém zariadenia: %s + +
    + dúfam, že sa vám moja apka páči. Neobsahuje žiadne reklamy, podporte prosím jej vývoj zakúpením aplikácie Jednoduché ďakujem. Zaručí to aj to, že tento dialóg už neuvidíte.

    + Ďakujem! + ]]> +
    + Zdravím,<br><br>dúfame, že sa vám naša apka páči. Neobsahuje žiadne reklamy a ani nezbiera vaše údaje, podporte prosíme jej vývoj zakúpením aplikácie <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Jednoduché ďakujem</a>. Budete tým mať zároveň odomknuté všetky funkcie vrátane zmeny farieb.<br><br>Ďakujeme! + Podporte nás prosím kúpou <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Jednoduchého Ďakujem</a>, odomkne to zároveň všetky funkcie apky vrátane zmeny farieb. + Zakúpiť + Objednať Jednoduchý Telefón + Prosím aktualizujte Jednoduché Ďakujem na najnovšiu verziu + Predtým, ako sa niečo opýtate, si prosím prejdite nastavenia aplikácie a prečítajte Často Kladené Otázky. Možno v nich nájdete svoju odpoveď. + Predtým, ako nás ohodnotíte, si prosím prejdite nastavenia aplikácie a prečítajte Často Kladené Otázky. Ak máte nejaké problémy, možno v nich nájdete riešenia. + Taktiež sa uistite, že používate najnovšiu verziu apky. + Taktiež vám dávame na vedomie, že táto verzia apky už nie je vyvíjaná. Pre množstvo vylepšení prejdite na Pro verziu. + Prečítať + Prečítať FAQ + Zdravím,\n\nzdá sa, že už nejaký čas používate túto aplikáciu a to si veľmi ceníme.\n\nAk Vás môžeme požiadať o láskavosť, prosím ohodnoťte nás na Google Play. Naozaj by nám to veľmi pomohlo.\n\nBez ohľadu na to, ako sa rozhodnete, túto správu už neuvidíte.\n\nVďaka! + Ohodnoťte našu aplikáciu, prosím :) + Ďakujeme + Widget je uzamknutý.\nNa odomknutie prosím prejdite na Pro verziu. + Táto funkcia je uzamknutá, prosím kúpte <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Jednoduché ďakujem</a> pre odomknutie celej apky.<br><br>Ide o jednorazovú platbu a ak nebudete spokojný, peniaze vám vrátime. + + + +
    + iba vám oznamujeme, že boli nedávno vydané nové aplikácie:

    + %2$s

    + %4$s

    + %6$s

    + Viete ich stiahnuť kliknutím na ich názov, alebo ikonku.

    + Vďaka + ]]> +
    + + Jednoduchý spúšťač aplikácií + Jednoduchá kalkulačka + Jednoduchý kalendár + Jednoduchý fotoaparát + Jednoduché hodinky + Jednoduché kontakty + Jednoduchý telefón + Jednoduché kreslenie + Jednoduchý správca súborov + Jednoduchá baterka + Jednoduchá galéria + Jednoduchá klávesnica + Jednoduchý spúšťač + Jednoduchý hudobný prehrávač + Jednoduché poznámky + Jednoduché SMS správy + Jednoduché ďakujem + Jednoduchý nahrávač zvuku + + Spúšťač aplikácií + Kalkulačka + Kalendár + Kamera + Hodinky + Kontakty + Telefón + Kreslenie + Správca súborov + Batéria + Galéria + Klávesnica + Spúšťač + Hudobný prehrávač + Poznámky + SMS správy + Ďakujem + Nahrávač zvuku + + + odtiaľ. + ]]> + + + + Často kladené otázky + Predtým, ako sa niečo opýtate si prosíme preštudujte + Prečo nevidím widget tejto apky na zozname widgetov? + Je to pravdepodobne spôsobené tým, že ste apku presunuli na SD kartu. Ide o systémové obmedzenie, ktoré v tomto prípade skryje widget apky. + Jediným riešením je presunutie apky späť na internú pamäť cez nastavnenia zariadenia. + Chcem vás podporiť, ale neviem poslať peniaze. Viem pre vás urobiť aj niečo iné? + + tejto webstránke, alebo nám v prípade potreby napíšte na hello@simplemobiletools.com. + ]]> + + Náhodou som vymazal niektoré súbory, viem ich obnoviť? + Žiaľ, nie. Súbory sú mazané okamžite po potvrdení, nie je dostupný žiadny smetný kôš. + Nepáčia sa mi farby widgetu, viem ich zmeniť? + Áno, po potiahnutí widgetu na plochu sa zobrazí konfiguračná obrazovka. Kliknutím na farebné štvorčeky v ľavom dolnom rohu viete zvoliť nové. Potiahnutím posuvníka viete upraviť aj priehľadnosť. + Viem nejakým spôsobom obnoviť vymazané súbory? + Ak boli dané súbory skutočne vymazané, tak nie. Štandardne je ale zapnutý Odpadkový kôš, vďaka ktorému sú doň súbory iba presunuté, nie hneď vymazané. + Spúšťacia ikonka apky zmizla. Čo mám spraviť? + Bude to spôsobené tým, že váš spúšťač zariadenia nepodporuje úpravu ikoniek. Skúste apku spustiť cez Google Play, alebo nejaký widget, ak je dostupný. + Ak je apka spustená, skúste nastaviť pôvodnú oranžovú farbu ikonky #F57C00. V najhoršom prípade budete musieť apku preinštalovať. + Peniaze som mal stiahnuté z účtu, ale neviem stiahnuť aplikáciu. Čo s tým? + Platby sú plne spravované Googlom, ich systém z času na čas nefunguje. Skúste vymazať cache apky Google Play, reštartujte zariadenie a skúste apku opäť stiahnuť. + Prečo by som si mal stiahnuť Pro verziu? + Keďže táto verzia aplikácie už nebude aktualizovaná, chyby, ktoré ste možno našli, nebudú nikdy opravené. Taktiež už nepribudnú žiadne nové funkcie. Pro verziu si viete kúpiť lacno na Google Play. + Ide o jednorázovú platbu, čo znamená, že ak ju raz zaplatíte, už nikdy nebudete musieť platiť nič. Ani vtedy, ak si kúpite nové zariadenie. Ak sa vám Pro verzia nebude páčiť, môžete ju do pár hodín odinštalovať a peniaze vám budú automaticky vrátené. + Ak budete chcieť vrátiť apku kedykoľvek neskôr, stačí, ak nám napíšete na hello@simplemobiletools.com a peniaze vám vrátime. + Akým spôsobom viem naraz označiť viacero položiek? + Existuje viacero spôsobov. Prvým je aktivovanie označovacieho módu dlhým podržaním jednej položky, následne viete označiť ďalšie krátkymi ťuknutiami. Druhý spôsob je podobný označovaniu položiek myšou na PC. Dlhým podržaním označte jednu položku a bez dvihnutia prsta + ho potiahnite cez ďalšie položky, to ich označí. Tretím spôsobom je dlhé podržanie jednej položky, následne dlhé podržanie inej položky. Označí to všetko medzi týmito 2 položkami. Ak chcete označiť všetko, aktivujte označovací mód dlhým podržaním jednej položky, + potom kliknite na počítadlo označených položiek v ľavom hornom rohu. To označí, resp. odznačí všetko. + Kúpil som si apku, neviem ju ale stiahnuť na inom zariadení. + Skúste vymazať cache apky Google Play a reštartovať vaše zariadenie. Ide o nejakú chybu v Google Play, nie v samotnej apke. + + + Prispievatelia + Preklad + Vývoj + Iná pomoc + + tejto webstránke, alebo ak máte nejaké otázky, tak nám jednoducho napíšte na hello@simplemobiletools.com. + Ďakujeme všetkým prispievateľom a iným podporovateľom! + ]]> + + + Arabčina + Azerbajdžančina + Bengálčina + Bretónčina + Bulharčina + Katalánčina + Čeština + Waleština + Dánčina + Angličtina + Nemčina + Gréčtina + Španielčina + Baskitčina + Perzština + Fínčina + Francúzština + Galičtina + Hindčina + Chorvátčina + Maďarčina + Indonézština + Taliančina + Hebrejčina + Japončina + Kórejčina + Litovčina + Nepálčina + Nórčina + Holandčina + Poľština + Portugalčina + Rumunčina + Ruština + Slovenčina + Slovinčina + Srbčina + Švédčina + Tamilčina + Turečtina + Ukrajinčina + Vietnamčina + Čínština (Hong Kong) + Čínština (zjednodušená) + Čínština (tradičná) + + + Prejdite na Pro verziu teraz! + Základná + Pro + Žiadne reklamy + Žiadny prístup na internet + 100% Garancia vrátenia peňazí + Jednorázová platba + Vylepšený dizajn + + + Pokročilý editor fotiek + Pokročilý editor fotiek a videí + Podpora pre súbory HEIC/HEIF + Pokročilé skupinové premenovávanie súborov + Uzamykanie jednotlivých priečinkov + Podpora tlače + + + Podpora časových pásiem + Účastníci a emailové pripomienky + Jednoduché importovanie udalostí + Nové widgety + + + Pokročilé spájanie duplicitných kontaktov + Nastaviteľná veľkosť písma + Voliteľné zdieľanie súkromných kontaktov vrámci našich apiek + Vlastné zvonenie kontaktov + Filtrovanie kontaktov + Súkromne uložené kontakty + + + Zoznamy položiek + Iná poznámka a farby na každom widgete + Uzamykanie poznámok + + + Nastaviteľný formát dátumu a času + Skratky na domovskú stránku + Kompresia súborov + Karta s najnovšími súbormi + + + Meniteľná farba pozadia + Podpora importovania súborov + Zoomovanie + + + Táto aplikácia používa na uľahčenie práce nasledovné knižnice tretích strán. Ďakujeme. + Knižnice tretích strán + Kotlin (programovací jazyk) + Subsampling Scale Image View (priblížiteľné obrázky) + Glide (načítavanie a cachovanie obrázkov) + Picasso (načítavanie a cachovanie obrázkov) + Android Image Cropper (orezávanie a otáčanie obrázkov) + RtlViewPager (swipovanie sprava vľavo) + Joda-Time (náhrada dátumov v Jave) + Stetho (odladenie databáz) + Otto (event bus) + PhotoView (priblížiteľné GIFká) + PatternLockView (ochrana vzorom) + Reprint (ochrana odtlačkom prsta) + Gif Drawable (zobrazovanie GIF) + AutoFitTextView (text meniaci veľkosť) + Robolectric (testovací framework) + Espresso (testovací pomocník) + Gson (parsovač JSON) + Leak Canary (detektor únikov pamäte) + Number Picker (upraviteľný vyberač čísel) + ExoPlayer (prehrávač videí) + VR Panorama View (zobrazovanie panorám) + Apache Sanselan (čítanie metadát obrázkov) + Android Photo Filters (filtre obrázkov) + Gesture Views (priblížiteľné obrázky) + Indicator Fast Scroll (písmená na posuvníku) + Event Bus (komunikácia vrámci apky) + Audio Record View (vizualizácia zvukov) + SMS MMS (spravovanie SMS a MMS) + APNG Android (podpora pre animované WebP súbory) + PDFViewPager (prehliadač PDF súborov) + M3U Parser (správa playlistových súborov m3u) + AndroidLame (mp3 enkóder) + + Skúšobná doba vypršala + Začať bezplatnú skúšobnú dobu + Vaša skúšobná doba čoskoro vyprší. + Odomknúť apku na 1 posledný deň + Vitajte v %s! + Ďakujeme za používanie našej apky. Túto odomknutú verziu môžete používať po dobu <font color=\'#FFFFFF\'>%d dní</font>. Keď skúšobná doba skončí, zvážte prosím prechod na Pro verziu. Má veľké množstvo nových funkcií, moderný dizajn, žiadne reklamy a mnoho ďalších vylepšení. + \n\nPlatiť za ňu treba iba raz za život a ak nebudete spokojný, môžete ju odinštalovať a peniaze vám budú vrátené.\n\nDúfame, že sa vám bude páčiť :) + Prosím prejdite na Pro verziu, aby ste si apku mohli užívať naplno.\n\nPlatiť za ňu treba iba raz za život a ak nebudete spokojný, môžete ju odinštalovať a peniaze vám budú vrátené.\n\nStretneme sa tam :) + + Vaša skúšobná doba uplynie o %d deň. + Vaša skúšobná doba uplynie o %d dni. + Vaša skúšobná doba uplynie o %d dní. + + + + ZASTARALÁ: Táto verzia aplikácie už nie je podporovaná. Stiahnite si Pro verziu na https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Nezabudnite, že ak odinštalujete platenú verziu do 2 hodín, peniaze vám budú automaticky vrátené. Ak ich budete chcieť späť hocikedy neskôr, len nám dajte vedieť na hello@simplemobiletools.com. To vám zabezpečí jednoduchý spôsob na ich vyskúšanie :) + + + Skupina jednoduchých, open source Android apiek s nastaviteľnými widgetmi, bez reklám a nepotrebných oprávnení. +
    diff --git a/commons/src/main/res/values-sl/strings.xml b/commons/src/main/res/values-sl/strings.xml new file mode 100644 index 000000000..f7ef20047 --- /dev/null +++ b/commons/src/main/res/values-sl/strings.xml @@ -0,0 +1,1201 @@ + + + OK + Prekliči + Nazaj + Nič + Pozneje + Shrani kot + Datoteka uspešno shranjena + Neveljaven format datoteke + Premalo prostora + Prišlo je do napake: %s + Error: %s + Odpri z + Uredi z + Uredi + Veljavna aplikacija ni bila najdena + Brskalnik ni bil najden + E-poštni odjemalec ni bil najden + Nastavi kot + Kopiraj v odložišče + Kopiraj številko v odložišče + Vrednost kopirana v odložišče + Vrednost kopirana v odložišče:\n%s + Pokliči številko + Neznano + Vedno + Nikoli + Podrobnosti + Zapiski + Brisanje mape \'%s\' + Nič + Oznaka + Prosojno + Prosojna barva + Izberi drugo barvo + Prenesi + Obvestilo + Obvestila + Email + Prejšnji + Predvajaj / Premor + Naslednji + Številka + Ni najdenih stikov + Zahtevajte potrebna dovoljenja + Aplikacija ne more dostopati do vaših stikov + Aplikacija nima dovoljenja za opravljanje telefonskih klicev. Odobrite v nastavitvah naprave + Vstavi besedilo tukaj + Pokliči %s + Potrdi klicanje %s + Nula + Ena + Dva + Tri + Štiri + Pet + Šest + Sedem + Osem + Devet + Vrednost + Vrednost ne more biti prazna + Ustvari nov stik + Dodaj k obstoječemu stiku + Aplikacija je poškodovana + Izjava + Posnemi fotografijo + Izberi fotografijo + Izberi video + Izberi kontakt + Izberi datoteko + Posnami zvok + Posnami video + Posodabljam … + Shramba telefona + Shramba telefona (ni vidna drugim aplikacijam) + Audio + + Rojstni dan + Obletnica + + Doma + Delo + + Mobile + Glavni + Službeni faks + Domači Fax + Pozivnik + Nobena telefonska številka ni bila najdena + + Spremeni tip pogleda + Mreža + Mreža (Pro) + Neenakomerna mreža + Seznam + Povečaj število stolpcev + Zmanjšaj število stolpcev + Število stolpcev + Število pokončnih stolpcev + Ležeče število stolpcev + Spremeni naslovno fotografijo + Izberi fotografijo + + %d stolpec + %d stolpca + %d stolpci + %d stolpcev + + + Upravljanje blokiranih številk + Trenutno nikogar ne blokirate. + Dodaj blokirano številko + Blokiraj številko + Blokiraj številke + Blokirane številke + Izvozi blokirane številke + Uvozi blokirane številke + Če želite uporabljati blokirane številke, je potrebno to aplikacijo nastaviti kot privzeto aplikacijo za klicanje. + Nastavi kot privzeto + Ste prepričani, da želite blokirati \"%s\"\? + Blokiranje klicev iz neohranjenih stikov + Blokiranje sporočil iz neohranjenih stikov + Vnesite številko ali vzorec (npr. *12345*, +1*8888), da se blokirajo vsi klici in sporočila iz številk, ki ustrezajo vzorcu. + Neznanih številk ni mogoče blokirati brez dovoljenja za ID klicalca. + + Priljubljeno + Dodaj priljubljene + Dodaj med priljubljene + Odstrani iz priljubljenih + + Iskanje + Išči v %s + Vpišite vsaj 2 znaka za začetek iskanja. + Poišči stike + Išči priljubljene + Poišči aplikacije + Išči dogodke + Išči skupine + Išči po zgodovini + Išči med klici + Poišči datoteke + Poišči mape + Išči datoteke in mape + Poišči sezname predvajanja + Išči izvajalce + Išči albume + Išči pesmi + Išči besedilo + Poišči pogovore + Poišči posnetke + + Filter + Filtriranje (Pro) + Ni najdenih elementov. + Spremeni filter + + Potrebno je dovoljenje za shranjevanje + Potreben je dostop do stikov + Potrebno je dovoljenje za uporabo kamere + Potrebno je dovoljenje za zvok + Brez dovoljenja + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Preimenuj datoteko + Preimenuj mapo + Datoteke ni bilo mogoče preimenovati + Mape ni bilo mogoče preimenovati + Ime mape ne sme biti prazno + Mapa s tem imenom že obstaja + Ne morete preimenovati korenske mape + Mapa uspešno preimenovana + Preimenovanje mape + Ime datoteke ne more biti prazno + Ime datoteke vsebuje neveljavne znake + Ime \'%s\' vsebuje neveljavne znake + Končnica ne more biti prazna + Datoteka %s ne obstaja + Dodaj pred imena datotek + Dodaj zadaj za imena datotek + Enostavno preimenovanje + Vzorec + Niz za dodati + %Y - leto +\n%M - mesec +\n%D - dan +\n%h - ura +\n%m - minuta +\n%s - sekunda +\n%i - število, ki narašča od 1 + Ime datoteke (brez .txt) + Ime datoteke (brez .json) + Ime datoteke (brez .zip) + Datotek in map ne gre več skriti na ta način od Androida 11 dalje + + Kopiraj + Premakni + Kopiraj / premakni + Kopiraj v + Premakni v + Izvor + Cilj + Izberi cilj + Klinite, da izberete cilj + Na izbrano mesto ni bilo mogoče pisati + Izberi cilj + Izvor in cilj ne moreta biti enaka + Kopiranje ni bilo mogoče + Kopiranje… + Datoteke uspešno kopirane + Datoteka uspešno kopirana + Prišlo je do napake + Premikanje… + Datoteke uspešno premaknjene + Datoteka uspešno premaknjena + Nekaterih datotek ni bilo mogoče premakniti + Nekaterih datotek ni bilo mogoče kopirati + Ni izbranih datotek + Shranjevanje… + Mape %s ni bilo mogoče ustvariti + Datoteke %s ni bilo mogoče ustvariti + Novi predmeti niso bili najdeni + Destinacija nima na voljo dovolj prostora. +\nZahtevano %1$s, na razpolago %2$s + Sistemska storitev za izbiranje datotek in map ni na voljo + + Ustvari novo + Mapa + Datoteka + Ustvari novo mapo + Mapa ali datoteka s tem imenom že obstaja + Ime vsebuje neveljavne znake + Vpišite ime + Prišlo je do neznane napake + + Datoteka %s že obstaja + Datoteka %s že obstaja. Jo želite prepisati? + Mapa %s že obstaja + Združi + Obdrži obe + Prepiši + Preskoči + Dodaj \'_1\' + Uporabi za vse + Sistem ne dovoljuje operacije v tej mapi, izberite drugo + Sistem ne dovoljuje kopiranja v to mapo, izberite drugo + Sistem ne dovoljuje preimenovanja v tej mapi + Ne morete preimenovati map neposredno v notranjem pomnilniku, le podmape + Te mape ni mogoče preimenovati + + Izberi mapo + Izberi datoteko + Potrdi dostop do zunanje shrambe + Potrdi dostop do mape + Izberi korensko mapo SD kartice na naslednjem zaslonu, da odobrite dovoljenje za pisanje + Če SD kartica ni vidna, poskusite to + Na naslednjem zaslonu dovolite aplikaciji dostop do izbrane shrambe tako, da na dnu pritisnete \"Uporabi to mapo\". + Omogočite dostop do \'%s\' ,da na dnu naslednjega zaslona pritisnite \'Uporabite to mapo\'. + Pritisnite \'Shrani\' na dnu naslednjega zaslona, da ustvarite novo mapo. + Potrdi izbor + Nalaganje… + Naši aplikaciji omogočite dostop do vseh datotek, saj sicer ne bo delovala dobro. + + %d element + %d elementa + %d elementi + %d elementov + + + + %d element + %d elementa + %d elementi + %d elementov + + + Brisanje %d elementa + Brisanje %d elementov + Brisanje %d elementov + Brisanje %d elementov + + + + %d stik + %d stika + %d stiki + %d stikov + + + Izberi shrambo + Shramba + Notranja shramba + SD kartica + Korenska mapa + Izbrali ste napačno mapo. Izbrati morate korensko mapo SD kartice + Pot do SD kartice in USB ne moreta biti enaki + Aplikacijo ste namestili na SD kartico, zaradi tega pripomočki ne bodo delovali. Ne boste jih niti videli na seznamu. To je sistemska omejitev. Če želite uporabljati pripomočke, morate aplikacijo premakniti nazaj v notranjo shrambo. + Izbrana napačna mapa, izberite pot \'%s\' + + Lastnosti + Pot + Izbrani elementi + Število neposrednih potomcev + Skupno število datotek + Ločljivost + Trajanje + Izvajalec + Album + Goriščna razdalja + Čas osvetlitve + ISO občutljivost + Zaslonka + Fotoaparat + EXIF + Naslov pesmi + GPS koordinate + Nadmorska višina + Odstranite EXIF + Ste prepričani, da želite odstraniti EXIF podatke, kot so GPS koordinate, model fotoaparata itd.\? + Vrednosti EXIF so uspešno odstranjene + + Barva ozadja + Barva besedila + Primarna barva + Barva poudarka bele teme + Barva poudarka črno-bele teme + Barva ospredja + Barva ikone aplikacije + Barva spodnje navigacijske vrstice + Ponastavi na privzeto + Uporabi privzeto + Privzeto + Spremeni barvo + Tema + Spreminjanje barve bo preklopilo na temo po meri + Shrani + Zavrzi + Razveljavi spremembe + Res želite razveljaviti spremembe? + To dejanje ni mogoče razveljaviti. + Imate neshranjene spremembe. Jih želite shraniti pred izhodom? + Uveljavite barve za vse aplikacije iz serije Simple Apps + OPOZORILO: Nekateri zaganjalniki ne znajo upravljati z ikono aplikacije, nastavljene po meri. Če ikona izgine, poskusite zagnati aplikacijo skozi Google Play ali kakšen drug pripomoček. Ko je aplikacija spet zagnana, nastavite nazaj privzeto oranžno ikono #F57C00. V najslabšem primeru bo potrebno aplikacijo ponovno namestiti. + Barve so bile uspešno posodobljene. Nova tema \'Deljeno\' je bila dodana. V prihodnje za spreminjanje barv uporabljajte to. + Upoštevajte, da kljub uporabi Pro verzije, iz tehničnih razlogov še vedno potrebujete aplikacijo Preprosto hvala. Ta skrbi za sinhronizacijo barv. + Prosimo, kupite aplikacijo <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>, da odklenete to funkcijo in podprete razvoj. Hvala! + + Svetlo + Temno + Samodejno + Samodejno svetlo / temno + Osončeno + Temno rdeče + Belo + Črno-belo + Po meri + Deljeno + Sistemsko privzeto + + Novosti + * tukaj so omenjene le večje spremembe. Vsaka različica vsebuje tudi dosti manjših izboljšav + + Izbriši + Odstrani + Preimenuj + Deli + Deli preko + Spremeni velikost + Izberi vse + Izberi besedilo + Skrij + Odkrij + Skrij mapo + Odkrij mapo + Začasno pokaži skrito + Ne prikazuj skritih medijev + Toliko vsebine naenkrat ni mogoče deliti + Izprazni in onemogoči Koš + Razveljavi + Ponovno uveljavi + Natisni + Natisni (Pro) + Bližnjice + Ustvari bližnjico + Ustvari bližnjico (Pro) + Dodaj številko k stiku + Prikaži podrobnosti stika + Klic iz SIM 1 + Klic iz SIM 2 + Preklopi vidljivost imen datotek + Premakni se na vrh + Premakni se na dno + Pripni element + Odpni element + Pošlji SMS + Pošlji email + Klic + Podrobnosti stika + Dodaj stik + Ozadja + + Razvrsti po + Ime + Velikost + Zadnja sprememba + Datum nastanka + Datum snemanja + Naslov + Ime datoteke + Datotečna končnica + Naključno + Naključno razvrsti + Naraščajoče + Padajoče + Uporabi le za to mapo + Razvrsti številčne dele po dejanski vrednosti + Ime + srednje ime + Priimek + Full name + Uporabi razvrščanje po meri + Spremeni vrstni red + + Ste prepričani, da nadaljujete brisanje\? + Res želite izbrisati \'%s\'? + Izbriši %s\? + + Res želite \'%s\' premakniti v Koš? + + Res želite izbrisati ta element? + Res želite premakniti ta element v Koš? + Ne sprašuj več to sejo + Ne prikazuj več + Da + Ne + Mogoče + + OPOZORILO: Brišete %d mapo + OPOZORILO: Brišete %d mapi + OPOZORILO: Brišete %d mape + OPOZORILO: Brišete %d map + + + PIN + Vpišite PIN + Prosimo vpišite PIN + Napačen PIN + Ponovite PIN + Vzorec + Narišite vzorec + Napačen vzorec + Ponovite vzorec + Biometrično + Prstni odtis + Dodaj prstni odtis + Postavite prst na čitalec prstnih odtisov + Odpri pogovorno okno za preverjanje biometričnega ID-ja + Preverjanje pristnosti + Overitev ni uspela + Overitev je blokirana, prosimo počakajte trenutek + Registrirali še niste nobenega prstnega odtisa. Prosimo, dodajte jih v nastavitvah naprave + Odpri nastavitve + Geslo uspešno nastavljeno. Če ga pozabite, izbrišite in ponovno naložite aplikacijo. + Zaščita uspešno nastavljena. Če pride do težav s ponastavitvijo, izbrišite in ponovno naložite aplikacijo. + Zakleni mapo + Zakleni mapo (Pro) + Odkleni mapo + Ta zaščita deluje samo v tej aplikaciji in ni mišljena kot nadomestek pravega sistemskega šifriranja map. + + Včeraj + Danes + Jutri + Vsak dan + Skrij leto + sekund + minut + ur + dni + s + m + h + wk. + + %d sekunda + %d sekundi + %d sekunde + %d sekund + + + %d minuta + %d minuti + %d minute + %d minut + + + %d ura + %d uri + %d ure + %d ur + + + %d dan + %d dneva + %d dni + %d dni + + + %d teden + %d tedna + %d tedne + %d tednov + + + %d mesec + %d meseca + %d meseci + %d mesecev + + + %d leto + %d leti + %d leta + %d let + + + + %d sekundo + %d sekundi + %d sekunde + %d sekund + + + %d minuto + %d minuti + %d minute + %d minut + + + %d uro + %d uri + %d ure + %d ur + + + %d dan + %d dni + %d dni + %d dni + + + %d teden + %d tedna + %d tedne + %d tednov + + + %d mesec + %d meseca + %d mesece + %d mesecev + + + %d leto + %d leti + %d leta + %d let + + + + %d sekundo prej + %d sekundi prej + %d sekunde prej + %d sekund prej + + + %d minuto prej + %d minuti prej + %d minute prej + %d minut prej + + + %d uro prej + %d uri prej + %d ure prej + %d ur prej + + + %d dan prej + %d dneva prej + %d dni prej + %d dni prej + + + %d teden prej + %d tedna prej + %d tedne prej + %d tednov prej + + + %d mesec prej + %d meseca prej + %d mesece prej + %d mesecev prej + + + %d leto prej + %d leti prej + %d leta prej + %d let prej + + + + %d sekundo + %d sekundi + %d sekunde + %d sekund + + + %d minuto + %d minuti + %d minute + %d minut + + + %d uro + %d uri + %d ure + %d ur + + + %d dan + %d dni + %d dni + %d dni + + + %d teden + %d tedna + %d tedne + %d tednov + + + %d mesec + %d meseca + %d mesece + %d mesecev + + + %d leto + %d leti + %d leta + %d let + + + Čas do sprožitve alarma: +\n%s + Čas do sprožitve opomnika: +\n%s + Preostali čas: +\n%s + Predlagamo, da alarm preizkusite, preden se nanj zanesete. Alarm lahko zataji zaradi sistemskih omejitev, povezanih z varčevanjem baterije. + Predlagamo, da opomnike preizkusite, preden se na njih zanesete. Opomniki lahko zatajijo zaradi sistemskih omejitev, povezanih z varčevanjem baterije. + Obvestila so za to aplikacijo onemogočena. Vklopite jih lahko v nastavitvah naprave. + + Alarm + Dremež + Ustavi + Brez opomnika + Na začetku + Sistemski zvoki + Vaši zvoki + Dodaj nov zvok + Brez zvoka + Čez dan ob hh:mm + Čez dan ob %02d:%02d + + Nastavitve + Kupite aplikacijo Simple Thank You + General + Prilagajanje barv + Izboljšana prilagoditev barv + Prilagodi barve + Prilagodi barve (Locked) + Zaklenjeno + Prilagoditev barv pripomočka + Prilagodi obvestila + Zvok obvestila + Uporabi angleški jezik + Jezik + Prikaži skrite elemente + Velikost pisave + Majhna + Srednja + Velika + Zelo velika + Zaščiti skrite elemete z geslom + Celotno aplikacijo žaščiti z geslom + Z geslom zaščiti brisanje in premikanje datotek + Obdrži stare vrednosti atributa zadnjič spremenjeno + Prikaži info mehurček pri premikanju drsnika + Prepreči prehod v stanje mirovanja, dokler je aplikacija v ospredju + Vedno preskoči potrditev brisanja + Omogočite poteg iz vrha za ponovno nalaganje + Uporabljaj 24-urni format + Spremeni obliko zapisa datuma in ure + Začni teden v nedeljo + Pripomočki + Vedno uporabi enak čas dremeža + Čas dremeža + Vibriraj ob pritisku gumba + Premakni datoteke v koš namesto dokončnega brisanja + Čas med čiščenji Koša + Izprazni Koš + Vsili pokončni zaslon + Izvozi nastavitve + Uvozi nastavitve + Nastavitve uspešno izvožene + Nastavitve uspešno uvožene + Začni s priimkom + Počisti predpomnilnik + Pred začetkom klica prikaži pogovorno okno za potrditev klica + + Vidljivost + Varnost + Pomikanje + Operacije z datotekami + Koš + Shranjevanje + Zagon + Besedilo + Migracija + Kakovost + Glavni zaslon + Sličice + Prikaz kot seznam + + Izključi + Izključi mapo + Izključene mape + (izključeno) + Urejaj izključene mape + Odstrani vse + Odstranim vse mape iz seznama izključenih\? Mape ne bodo izbrisane. + Začasno prikaži izključeno + Prenehaj prikazovati izključeno + + Upravljaj prikazane zavihke + Zavihek za odpiranje ob zagonu aplikacije + Stiki + Priljubljene + Zgodovina klicev + Skupine + Nazadnje uporabljen + Datoteke + Nedavne datoteke + + Obnovi to datoteko + Obnovi izbrane datoteke + Obnovi vse datoteke + Koš je bil uspešno izpraznjen + Datoteke so bile uspešno obnovljene + Res želite izprazniti Koš? Datoteke bodo izgubljene za vedno. + Koš je prazen + Premikanje elementov v Košu je onemogočeno, uporabite Obnovitev + Prikaži Koš + Skrij Koš + Odpri Koš + Skip the Recycle Bin, delete files directly + + Premikanje %d elementa v Koš + Premikanje %d elementa v Koš + Premikanje %d elementov v Koš + Premikanje %d elementov v Koš + + + Uvažanje… + Izvažanje… + Uvažanje uspešno + Izvažanje uspešno + Uvažanje ni uspelo + Izvažanje ni uspelo + Uvažanje nekaterih vnosov ni uspelo + Izvažanje nekaterih vnosov ni uspelo + Za uvoz ni bilo najdenih nobenih vnosov + Za uvoz ni bilo najdenih novih vnosov + Za izvoz ni bilo najdenih nobenih vnosov + Varnostne kopije + Omogoči samodejne varnostne kopije + Upravljaj samodejne varnostne kopije + Uporabite lahko naslednje parametre za samodejno poimenovanje datoteke: +\n +\n%Y - leto +\n%M - mesec +\n%D - dan +\n%h - ura +\n%m - minuta +\n%s - sekunda + + USB + Kaže, da imate v napravo priključen USB pogon. Da zagotovite pravilno prikazovanje datotek, morate odobriti dodatna dovoljenja. + Izberitre korensko mapo USB pogona na naslednjem zaslonu, da odobrite dostop + Izbrana napačna mapa. Prosimo, izberite začetno mapo na vašem USB pogonu + + Januar + Februar + Marec + April + Maj + Junij + Julij + Avgust + September + Oktober + November + December + + Jan + Feb + Mar + Apr + Maj + Jun + Jul + Avg + Sep + Okt + Nov + Dec + + v januarju + v februarju + v marcu + v aprilu + v maju + v juniju + v juliju + v avgustu + v septembru + v oktobru + v novembru + v decembru + Ponedeljek + Torek + Sreda + Četrtek + Petek + Sobota + Nedelja + P + T + S + Č + P + S + N + Pon + Tor + Sre + Čet + Pet + Sob + Ned + + Vaša različica aplikacije ne bo več posodobljena. Prosimo, nadgradite na Pro verzijo, da prejmete nove popravke in druge izboljšave. + Vaša različica aplikacije ne bo več posodobljena. Prosimo, nadgradite na Pro verzijo, da prejmete nove popravke in druge izboljšave. + Še vedno je zastonj do: %s. Če jo naložite do takrat, jo boste lahko zastonj uporabljali za vedno. + Več informacij + Nadgradi + Lokalno shranjene dogodke lahko migrirate ročno preko izvoza v .ics datoteko, katero kasneje uvozite nazaj. Ukaze za uvoz/izvoz najdete v meniju na glavnem zaslonu. + Pozdravljeni, +\n +\nkaže, da ste pravkar nadgradili iz brezplačne verzije. Ko boste s to novo zadovoljni in boste morda prenesli nastavitve in priljubljene, lahko staro brezplačno verzijo odstranite. Tako se izognete, da bi jo pomotoma zagnali, saj je ne potrebujete več. +\n +\nHvala! + Pozdravljeni, +\n +\nkaže, da že imate Pro verzijo. Ko boste z novo zadovoljni in boste morda prenesli nastavitve in priljubljene, lahko to staro brezplačno verzijo odstranite. Tako se izognete, da bi jo pomotoma zagnali, saj je ne potrebujete več. +\n +\nHvala! + Pozdravljeni, +\n +\nkaže, da ste pravkar nadgradili iz brezplačne verzije. Ko boste s to novo zadovoljni in boste morda prenesli podatke, lahko staro brezplačno verzijo odstranite. Tako se izognete, da bi jo pomotoma zagnali, saj je ne potrebujete več. +\n +\nHvala! + Pozdravljeni, +\n +\nkaže, da že imate Pro verzijo. Ko boste z novo zadovoljni in boste morda prenesli podatke, lahko to staro brezplačno verzijo odstranite. Tako se izognete, da bi jo pomotoma zagnali, saj je ne potrebujete več. +\n +\nHvala! + Pozdravljeni, +\n +\nkaže, da ste pravkar nadgradili iz brezplačne verzije. Če želite migrirati lokalno shranjene dogodke, morate to storiti ročno. Izvozite jih v .ics datoteko v brezplačni verziji in jih uvozite tukaj v zgornjem meniju. +\n +\nKo boste zadovoljni z nastavitvami v Pro verziji, lahko staro brezplačno verzijo odstranite, saj je ne boste več potrebovali. +\n +\nHvala! + Pozdravljeni, +\n +\nkaže, da ste pravkar nadgradili iz brezplačne verzije. Če ste imeli shranjene kakšne stike pod \"%s\", jih morate migrirati ročno. Izvozite jih v .vcf datoteko v brezplačni verziji in jih uvozite tukaj v zgornjem meniju. +\n +\nKo boste zadovoljni z nastavitvami v Pro verziji, lahko staro brezplačno verzijo odstranite, saj je ne boste več potrebovali. +\n +\nHvala! + Pozdravljeni, +\n +\nkaže, da ste pravkar nadgradili iz brezplačne verzije. Če želite migrirati lokalno shranjene beležke, morate to storiti ročno. Izvozite jih v datoteko v brezplačni verziji in jih uvozite tukaj v zgornjem meniju. +\n +\nKo boste zadovoljni z nastavitvami v Pro verziji, lahko staro brezplačno verzijo odstranite, saj je ne boste več potrebovali. +\n +\nHvala! + + O aplikaciji + Spletna stran + Za izvorno kodo obiščite + Svoje predloge in povratne informacije pošljite na + Nadgradi na Pro + Več aplikacij + Več aplikacij od nas + Povabi prijatelje + Oglejte si tudi %1$s na %2$s + Povabite preko + Ocenite nas + Ocenite + Donirajte + Sledite nam + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Politika zasebnosti + Version %s + Pozdravljeni :) + Izdelano s ❤️ na Slovaškem + Dodatne informacije + Različica aplikacije: %s + Operacijski sistem: %s + +
    + upamo, da vam je aplikacija všeč. Ne vsebuje oglasov, zato vas prosimo, da podprete razvoj z nakupom aplikacije Simple Thank You. S tem bo tudi to sporočilo izginilo.

    + Hvala! + ]]> +
    + Pozdravljeni, <br><br>upam, da uživate v aplikaciji. Ne vsebuje nobenih oglasov in tudi ne zbiramo vaših podatkov, zato vas prosim, da podprete razvoj aplikacije z nakupom <i><a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Preprosto hvala</a></i>. Prav tako boste imeli odklenjene vse funkcije aplikacije, vključno s prilagajanjem barv. <br><br>Hvala! + Prosimo, podprite nas z nakupom <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Enostavno hvala</a>. Odklenile se bodo tudi vse funkcije aplikacije, vključno s prilagajanjem barv. + Kupi + Prenesi Enostaven telefon + Prosimo nadgradite Simple Thank You na zadnjo verzijo + Pred zastavljanjem vprašanje preverite nastavitve aplikacije in preberite pogosta vprašanja in odgovore. Morda je rešitev že tam. + Preden nas ocenite vas prosimo, da najprej preverite nastavitve aplikacije in preberete pogosto zastavljena vprašanja. Če imate težave, je rešitev morda tam. + Prepričajte se tudi, da uporabljate najnovejšo različico aplikacije. + Upoštevajte tudi, da se ta različica aplikacije ne razvija več, zato si priskrbite Pro verzijo s številnimi izboljšavami. + Preberite + Preberi pogosta vprašanja + Živjo,\n\nizgleda, da že nekaj časa uporabljate aplikacijo. To zares cenimo.\n\nLahko nam naredite uslugo in nas ocenite na Google Play. To bi nam res pomagalo.\n\nKakorkoli se že boste odločili, tega sporočila ne bomo več prikazovali.\n\nHvala! + Prosimo, ocenite našo aplikacijo :) + Hvala + Pripomoček je zaklenjen. +\nZa odklepanje nadgradite na različico Pro. + Ta funkcija je zaklenjena, za odklepanje celotne aplikacije prosimo kupite <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Enostavno hvala</a>.<br <br>Gre za enkratno plačilo in če ne boste zadovoljni, vam lahko vrnemo denar. + + +
    + želimo vam sporočiti, da smo pred kratkim objavili novo aplikacijo:

    + %2$s

    + %4$s

    + %6$s

    + Prenesete jo lahko s klikom na naslov.

    + Hvala + ]]> +
    + Enostaven zaganjalnik aplikacij + Enostaven kalkulator + Enostaven koledar + Enostavna kamera + Enostavna ura + Enostavni stiki + Enostaven telefon + Enostavno risanje + Enostaven upravitelj datotek + Enostavna svetilka + Enostavna galerija + Enostavna tipkovnica + Enostaven zaganjalnik + Enostaven predvajalnik glasbe + Enostavne beležke + Enostavna SMS sporočila + Enostavno hvala + Enostaven snemalnik zvoka + Zaganjalnik aplikacij + Kalkulator + Koledar + Kamera + Ura + Stiki + Telefon + Risanje + Upravitelj datotek + Svetilka + Galerija + Tipkovnica + Zaganjalnik + Predvajalnik glasbe + Beležke + SMS sporočila + Hvala + Snemalnik + + tukaj. + ]]> + + + Pogosta vprašanja + Preden postavite vprašanje, preberite + Zakaj aplikacije ne vidim na seznamu pripomočkov? + Najverjetneje zato, ker ste aplikacijo premaknili na SD kartico. Zaradi omejite sistema Android se pripomočki takih aplikacij ne prikažejo. Edina rešitev je, da aplikacijo premaknete nazaj na notranjo shrambo. + Želim vas podpirati, ampak ne morem donirati denarja. Lahko pomagam kako drugače? + Seveda. Lahko širite informacije o aplikacijah ali man daste dobre povratne informacije in ocene. Lahko tudi pomagate prevesti aplikacije v nov jezik ali samo izboljšate obstoječe prevode. Vodič o prevajanju se nahaja na <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>tej spletni strani</a>, ali nas le kontaktirajte na <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> , če imate kakeršna koli vprašanja. + Po pomoti sem izbrisal nekaj datotek. Jih lahko obnovim? + Na žalost, ne. Datoteke so izbrisane takoj po potrditvi in Koš ni na razpolago. + Barve pripomočkov mi niso všeč. Jih lahko spremenim? + Seveda. Ko pripomoček dodate na domači zaslon, sem vam prikaže zaslon z nastavitvami. S klikom na barvne kvadratke, lahko izberete novo barvo. Z drsnikom lahko nastavljate tudi prosojnost. + Lahko kako obnovim izbrisane datoteke? + Če so bile zares izbrisane, jih ne morete. Kakorkoli privzeto je omogočen Koš in povzroči, da se datoteke le premaknejo v Koš namesto dokončnega izbrisa. + Ikona v zaganjalniku je izginila. Kaj lahko naredim? + Nekateri zaganjalniki ne prepoznajo posebej nastavljenih ikon. Poskusite zagnati aplikacijo preko Google Play ali kakega pripomočka, če je to mogoče. + Ko se bo aplikacija zagnala, nastavite nazaj originalno privzeto oranžno ikono #F57C00. V najslabšem primeru bo potrebno aplikacijo ponovno naložiti. + Denar je bil odtegnjen z mojega bančnega računa, vendar aplikacije ne morem prenesti. Kaj lahko storim\? + Plačila v celoti obdeluje Google, njihov sistem pa se občasno zaplete. Počistite predpomnilnik aplikacije Google Play in znova zaženite napravo, nato pa poskusite znova prenesti aplikacijo. + Zakaj naj nadgradim na različico Pro\? + Ker različica aplikacije ni več posodobljena, morebiti opažene napake ne bodo nikoli odpravljene. Prav tako ne bodo dodane nove funkcije. Za majhen znesek lahko Pro verzijo kupite v trgovini Google Play. Gre za enkratno plačilo, kar pomeni, da vam po nakupu ne bo treba nikoli več plačati. Tudi ko zamenjate napravo. Če vam Pro verzija ne bo všeč, jo lahko v nekaj urah preprosto odstranite in denar bo samodejno vrnjen. Če želite vračilo denarja kadar koli pozneje, nas preprosto kontaktirajte na hello@simplemobiletools.com in ga boste dobili. + Kako lahko izberem več elementov hkrati\? + To lahko storite na več načinov. Prvi je, da začnete izbiro z dolgim pritiskom na en element, nato pa s kratkim klikom na druge elemente, da jih izberete. Drugi način je podoben izbiranju elementov na osebnih računalnikih z miško: način izbiranja zaženete tako, da dolgo pritisnete en element, nato pa ga s prstom še vedno vlečete navzdol čez druge elemente, da jih izberete. Tretji način izbiranja več elementov je, da dolgo pritisnete en element, nato dolgo pritisnete drugega in vse, kar je vmes, bo izbrano. Če želite izbrati vse elemente, preprosto dolgo pritisnite en element, nato pa kliknite na števec izbranih elementov v zgornjem levem kotu. Tako boste izbrali ali preklicali izbor vseh elementov. + Aplikacijo sem kupil, vendar je ne morem prenesti v drugo napravo. + Poskusite počistiti predpomnilnik aplikacije Google Play in znova zaženite napravo. Gre za napako v storitvi Google Play, ki ni povezana s samo aplikacijo. + + Sodelujoči + Prevajanje + Razvoj + Druga pomoč + Ta seznam vsebuje vsakogar, ki je opazno pomagal katerikoli aplikaciji iz paketa Simple Mobile Tools, ne le tej. Za prevode skrbijo prostovoljci. Sporočite nam, če želite pomagati tudi vi. Vodnik za prevajanje je na naslovu<a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, ali nas kontaktirajte na <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> če imate kakršna koli vprašanja. Hvala vsem sodelujočim in drugim podpornikom! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Takoj prenesi Pro različico! + Osnovno + Pro + Brez oglasov + Brez dostopa do interneta + 100% jamstvo za vračilo denarja + Enkratno plačilo + Izboljšan dizajn + + Napredni urejevalnik fotografij + Napredni urejevalnik fotografij in videoposnetkov + Podpora za datoteke HEIC/HEIF + Napredno masovno preimenovanje datotek + Zaklepanje posameznih map + Podpora za tiskanje + + Podpora za časovni pas + Udeleženci in e-poštni opomniki + Enostaven uvoz dogodkov + Novi pripomočki + + Izboljšano združevanje podvojenih stikov + Prilagajanje velikosti pisave + Neobvezna zasebna skupna raba stikov med našimi aplikacijami + Možnost različnih zvonjenj za stike + Filtriranje stikov + Zasebno shranjeni stiki + + Kontrolni seznami + Različne opombe in barve za vsak pripomoček + Zaklepanje zapiskov + + Prilagajanje oblike datuma in časa + Bližnjice na domačem zaslonu + Podpora stisnjenim datotekam + Zavihek z nedavnimi datotekami + + Prilagajanje barv ozadja + Podpora za uvoz datotek + Povečava + + Da si olajšamo delo, aplikacija uporablja naslednje programske knjižnice. Hvala. + Licence tretjih oseb + Kotlin (programski jezik) + Subsampling Scale Image View (pogled slik z povečevanjem) + Glide (nalaganje in predpomnjevanje slik) + Picasso (nalaganje in predpomnjevanje slik) + Android Image Cropper (obrezovanje in rotacija slik) + RtlViewPager (potegi levo in desno) + Joda-Time (nadomestitev za Java datume) + Stetho (razhroščevalne baze) + Otto (dogodkovno vodilo) + PhotoView (povečevanje slik GIF) + PatternLockView (zaščita z vzorci) + Reprint (zaščita s prtnimi odtisi) + Robolectric (testno okolje) + AutoFitTextView (spreminjanje velikosti besedila) + Robolectric (testno okolje) + Espresso (testirni pomočnik) + Gson (razčenjevalec JSON) + Leak Canary (memory leak detektor) + Number Picker (prilagodljiv pripomoček za izbiranje številk) + ExoPlayer (predvajalnik videjev) + VR Panorama View (prikazovanje panoram) + Apache Sanselan (branje metapodatkov slik) + Android Photo Filters (filtri za slike) + Gesture Views (povečljive slike) + Indikator za Hitro drsenje (črke na drsnem traku) + Vodilo dogodkov (komunikacija znotraj aplikacije) + Pogled zvočnega zapisa (vizualizacija zvoka) + SMS MMS (ravnanje z SMS in MMS) + APNG Android (podpora za animirani WebP) + PDFViewPager (pregledovalnik PDF) + Razčlenjevalnik M3U (prepoznava datotek m3u) + AndroidLame (mp3 kodiranje) + + Preizkusno obdobje je poteklo + Začni preizkusno obdobje + Vaše poskusno obdobje bo kmalu poteklo. + Odkleni aplikacijo še za en zadnji dan + Dobrodošli v %s! + Zahvaljujemo se vam za uporabo naše aplikacije. To odklenjeno različico lahko uporabljate %d dni. Ko se preizkusno obdobje konča, razmislite o nadgradnji na Pro verzijo. Ima ogromno novih funkcij, sodobno obliko, brez oglasov in številne druge izboljšave. +\n +\nPlačati jo morate le enkrat v življenju in če ne boste zadovoljni, jo lahko odstranite in zahtevate vračilo denarja. +\n +\nUpamo, da vam bo všeč :) + Če želite v celoti uživati v aplikaciji, jo nadgradite na Pro verzijo. +\n +\nPlačati jo morate le enkrat v življenju in če ne boste zadovoljni, jo lahko odstranite in dobite povračilo. +\n +\nSe vidimo tam :) + + Vaše poskusno obdobje poteče čez %d dan. + Vaše poskusno obdobje poteče čez %d dni. + Vaše poskusno obdobje poteče čez %d dni. + Vaše poskusno obdobje poteče čez %d dni. + + + ZASTARELO: Ta verzija aplikacije se ne vzdržuje več, pridobite si Pro verzijo na https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Ne pozabite - če odstranite katerokoli plačljivo aplikacijo v dveh urah, dobite povrnjen avtomatično denar. Če želite povrnitev denarja po preteku tega časa, nas kontaktirajte na hello@simplemobiletools.com in poskrbeli bomo za to. Zaradi tega je preizkušanje aplikacije še bolj preprosto. :) + + Skupina preprostih odprtokodnih aplikacij za Android s prilagodljivimi pripomočki, brez oglasov in nepotrebnih dovoljenj. +
    diff --git a/commons/src/main/res/values-sr/strings.xml b/commons/src/main/res/values-sr/strings.xml new file mode 100644 index 000000000..c6cf46f9d --- /dev/null +++ b/commons/src/main/res/values-sr/strings.xml @@ -0,0 +1,1126 @@ + + + Одобри + Поништи + Назад + Ништа + Касније + Сачувај као + Датотека успешно сачувана + Нетачан формат датотеке + Недовољно меморије - грешка + Дошло је до грешке: %s + Error: %s + Отвори са + Измени са + Уредити + Није пронађена одговарајућа апликација + Није пронађен ниједан претраживач + Није пронађен ниједан клијент е-поште + Подеси као + Копирај у међуспремник + Копирајте број у међуспремник + Вредност копирана у клипборд + Вредност копирана у клипборд:\n%s + Позовите број + Непознато + Увек + Никад + Детаљи + Белешке + Бришем фасциклу \'%s\' + Ни један + Ознака + Провидан + Провидна боја + Изабери другу боју + Преузимање + Обавештење + Notifications + Е-пошта + Претходна + Пусти / Пауза + Следећи + Number + Није пронађен ниједан контакт + Затражите потребне дозволе + Апликација није могла да приступи вашим контактима + Апликација нема дозволу за иницирање телефонских позива, одобрите је у подешавањима уређаја + Уметните текст овде + Позив %s + Confirm calling %s + Нула + Једно + Два + Три + Четири + Пет + Шест + Седам + Осам + Девет + Вредност + Вредност не може бити празна + Креирајте нови контакт + Додајте постојећем контакту + Апликација је оштећена + Одрицање од одговорности + Фотографисати + Изаберите фотографију + Изаберите видео + Изаберите контакт + Одаберите датотеку + Снимити звук + Видео запис + Ажурирање… + Меморија телефона + Складиште телефона (није видљиво другим апликацијама) + Audio + + Рођендан + Годишњица + + Кућа + Рад + + Мобилни + Главни + Радни факс + Кућни факс + Позивник + Број телефона није пронађен + + Промени тип прегледа + Мрежа + Мрежа (Pro) + Неуједначена мрежа + Листа + Повећај број колона + Смањи број колона + Број колона + Портретни број колона + Пејзажни број колона + Промени насловну слику + Изабери фотографију + + %d column + %d columns + + + Управљајте блокираним бројевима + Не блокирате никога. + Додајте блокирани број + Број блока + Блокирајте бројеве + Блокирани бројеви + Извезите блокиране бројеве + Увезите блокиране бројеве + Морате да подесите ову апликацију као подразумевану апликацију за бирање бројева да бисте користили блокиране бројеве. + Set as default + Да ли сте сигурни да желите да блокирате \"%s\"\? + Блокирајте позиве из несачуваних контаката + Блокирајте поруке од несачуваних контаката + Унесите број или образац (нпр. *12345*, +1*8888) да бисте блокирали све позиве и поруке са бројева који одговарају шаблону. + Не могу блокирати непознате бројеве без дозволе ИД позиваоца. + + Омиљено + Додај омиљене + Додај у омиљене + Уклони из омиљених + + Претрага + Search in %s + Укуцај најмање 2 карактера да стартујеш претрагу. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Филтер + Филтер (Pro) + Нема резултата. + Промени филтер + + Неопходна је дозвола за складиштење + Неопходна је дозвола за контакте + Неопходна је дозвола за камеру + Неопходна је дозвола за аудио + Нема дозволу + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Преименуј датотеку + Преименуј фасциклу + Не могу да преименујем датотеку + Не могу да преименујем фасциклу + Име фасцикле не сме да буде празно + Фасцикла са тим именом већ постоји + Није могуће преименовати почетну фасциклу складишта + Фасцикла је успешно преименована + Мења се име фасцикле + Име датотеке не може бити празно + Име датотеке садржи недозвољене карактере + Име датотеке \'%s\' садржи недозвољене карактере + Тип датотеке не може бити празан + Изворни код датотеке %s не постоји + Додај префикс именима датотека + Додај суфикс именима датотека + Једноставно преименовање + Шаблон + Низ за додавање + %Y - година +\n%M - месец +\n%D - дан +\n%h - сат +\n%m - минут +\n%s - секунда +\n%i - број се повећава са 1 + Име датотеке (без .ткт) + Име датотеке (без .јсон) + Име датотеке (без .зип-а) + Почевши од Андроида 11 више не можете сакрити датотеке и фасцикле + + Копирај + Премести + Копирај / Премести + Копирај у + Премести у + Извор + Одредиште + Изабери одредиште + Кликни да изабереш одредиште + Не могу да пишем у изабрано одредиште + Изабери одредиште + Извор и одредиште не могу бити исти + Не могу да копирам датотеке + Копирам… + Датотеке успешно ископиране + Датотека је успешно копирана + Дошло је до грешке + Премештам… + Датотеке успешно премештене + Датотека је успешно премештена + Неке датотеке се не могу преместити + Неке датотеке се не могу ископирати + Ни једна датотека није означена + Чувам… + Не могу да направим фасциклу %s + Не могу да направим датотеку %s + Нису пронађене нове ставке + Одредиште нема довољно слободног простора. +\nПотребан %1$s, доступан %2$s + Системска услуга за избор датотека и фасцикли је недоступна + + Направи ново + Фасцикла + Датотека + Направи нову фасциклу + Датотека или фасцикла са тим именом већ постоји + Име садржи недозвољене карактере + Унесите име + Дошло је до грешке + + Датотека \"%s\" већ постоји + Датотека \"%s\" већ постоји. Препиши је? + Фасцикла \"%s\" већ постоји + Споји + Задржи оба + Препиши + Прескочи + Додај суфикс \'_1\' + Примени на све + Sustav ne dopušta rad u ovoj mapi, odaberite drugu + Sustav ne dopušta kopiranje u ovu mapu, odaberite drugu + Sustav ne dopušta preimenovanje u ovoj mapi + Nije moguće preimenovati mape izravno u internoj pohrani, samo podmape + Nije moguće preimenovati ovu mapu + + Изабери фасциклу + Изабери датотеку + Потврди приступ спољашњој меморији + Potvrdite pristup mapi + Изаберите почетну фасциклу СД картице на следећем екрану, да дозволите записивање + Ако не видите СД картицу, пробајте ово + Дозволите апликацији да приступи изабраном складишту на следећем екрану притиском на „Користи овај фолдер“ на дну. + Дозволите приступ\'%s\' на следећем екрану притиском на \'Користите ову фасциклу\' на дну. + Молимо притисните\'Уштедјети \' на дну следећег екрана да бисте креирали нову фасциклу. + Потврдите одабир + Учитавање… + Дозволите нашој апликацији приступ свим вашим датотекама, без тога можда неће добро функционисати. + + %d ставка + %d ставки + %d ставкe + + + + %d ставка + %d ставки + %d ставкe + + + Бришем %d ставку + Бришем %d ставки + Бришем %d ставки + + + + %d контакт + %d контактa + %d контакти + + + Изабери складиште + Складиште + Унутрашња + СД картица + Почетно + Изабрана је погрешна фасцикла, молим вас изаберите почетну фасциклу на СД картици + Стазе СД картице и УСБ уређаја не могу бити исте + Апликација је већ инсталирана на СД картици, зато су виџети недоступни. То је ограничење система, и ако желите да користите виџете морате да преместите апликацију назад у унутрашње складиште. + Изабран је погрешан фолдер, изаберите путању \'%s\' + + Својства + Стаѕа + Ставки селектовано + Број директних потомака + Укупан број датотека + Резолуција + Дужина + Уметник + Албум + Фокусна дужина + Време експозиције + ISO брзина + Ф-број + Камера + EXIF + Име песме + ГПС координате + Altitude + Уклоните ЕКСИФ + Да ли сте сигурни да желите уклонити ЕКСИФ вредности као што су ГПС координате, модел камере итд\? + ЕКСИФ вредности су успешно уклоњене + + Боја позадине + Боја текста + Главна боја + Акцентна боја беле теме + Акцентна боја црно-беле теме + Позадинска боја + Боја иконе апликације + Боја доње навигационе линије + Врати на подразумевана подешавања + Користи подразумеване вредности + Уобичајено + Промени боју + Тема + Изменом боје започињете прилагођену тему + Сачувај + Одбаци + Поништи измене + Да ли желите да поништите измене? + This action cannot be undone. + Имате несачуване измене. Сачувај пре изласка? + Примени боје на све Simple Apps + УПОЗОРЕЊЕ: Неки покретачи се не зналазе са изменама икона апликација. Ако икона нестане, покрените апликацију преко Гугл плеја или неког виџета, ако су доступни. + Када покренете, подесите подразумевајућу наранџасту икону #F57C00. У најгорем случају ћете морати да реинсталирате апликацију. + Боје су ажуриране успешно. Нова тема под именом \'Shared\' је додата, молимо вас да је користите за ажурирање свих боја у будућности. + Имајте на уму да иако користите верзију апликације Про, и даље вам је потребна Једноставно хвала из техничких разлога. Брине о синхронизацији боја. + + Simple Thank You да откључате ову функцију и подржите наш развој. Хвала вам! + ]]> + + + Светла + Тамна + Auto + Ауто светло / тамно + Осветљена + Тамно црвена + White + Црно & Бела + Прилагођена + Дељена + System default + + Шта је ново + * овде су изслистана само већа ажурирања, увек постоје и нека мања унапређења + + Обриши + Уклони + Преименуј + Подели + Подели путем + Промена величине + Означи све + Изаберите текст + Сакриј + Прикажи + Склони фасциклу + Прикажи фасциклу + Привремено прикажи скривено + Прекини са приказивањем скривених медија + Не можете поделити оволико садржаја одједном + Испразни и онемогући канту за отпатке + Поништи измене + Поврати измене + Штампај + Штампај (Pro) + Пречица + Направити пречицу + Направите пречицу (Про) + Додајте број контакту + View contact details + Позив са СИМ 1 + Позив са СИМ 2 + Измени видљивост датотеке + Помери се на врх + Пређите на дно + Pin item + Откачите ставку + Send SMS + Send email + Позив + Contact details + Add contact + Позадине + + Сортирај према + Име + Величина + Задњи пут измењено + Датум креирања + Датум настанка + Наслов + Име фајла + Тип фајла + Насумично + Сортирај насумично + Растуће + Опадајуће + Користи само за ову фасциклу + Сортирај нумеричке делове по стварној вредности + Име + Middle name + Презиме + Пуно име + Користите прилагођено сортирање + Промени редослед + + Да ли сте сигурни да желите да наставите са брисањем? + Да ли сте сигурни да желите обришете %s? + Delete %s? + + Да ли сте сигурни да желите да преместите %s у канту за отпатке? + + Да ли сте сигурни да желите да обришете ову ставку? + Да ли сте сигурни да желите да преместите ову ставку у канту за отпатке? + Не питај више у овој сеанси + Не показуј поново + Да + Не + Можда + + УПОЗОРЕЊЕ: Бришете %d фасциклу + УПОЗОРЕЊЕ: Бришете %d фасцикли + УПОЗОРЕЊЕ: Бришете %d фасциклe + + + ПИН + Унесите ПИН + Молимо вас унесите ПИН + Погрешан ПИН + Поновите ПИН + Шаблон + Унесите шаблон + Погрешан шаблон + Поновите шаблон + Биометрија + Отисак прста + Додајте отисак прста + Молимо вас ставите ваш прст на сензор за отисак прста + Отворите дијалог за верификацију биометријског ИД-а + Аутхентицате + Провера идентитета неуспешна + Провера идентитета блокирана, покушајте поново касније + Немате регистрованих отисака прстију, додајте неке у Подешавања вашег уређаја + Иди у подешавања + Успешно подешена шифра. Поново инсталирајте апликацију за случај да изгубите шифру. + Заштита је успешно подешена. Поново инсталирајте апликацију за случај да имате проблема са ресетовањем отиска прста. + Закључај мапу + Закључај мапу (Про) + Откључај мапу + Ова заштита функционише само у овој апликацији, не би требало да замени право шифровање директоријума у целом систему. + + Јуче + Данас + Сутра + Сваки дан + Сакриј годину + секунде + минуте + сати + дани + s + m + h + wk. + + %d секунда + %d секунди + %d секунда + + + %d минут + %d минутa + %d минутe + + + %d сат + %d сати + %d сати + + + %d дан + %d данa + %d дани + + + %d недеља + %d недеља + %d недељe + + + %d месец + %d месеци + %d месеци + + + %d година + %d година + %d годинe + + + + %d секунда + %d секунди + %d секундe + + + %d минут + %d минути + %d минутe + + + %d сат + %d сати + %d сати + + + %d дан + %d данa + %d дани + + + %d недеља + %d недеља + %d недељe + + + %d месец + %d месецa + %d месеци + + + %d година + %d година + %d годинe + + + + %d секунд пре тога + %d секунди пре тога + %d секундe пре тога + + + %d минут пре тога + %d минути пре тога + %d минутe пре тога + + + %d сат пре тога + %d сати пре тога + %d сати пре тога + + + %d дан пре тога + %d дана пре тога + %d дани пре тога + + + %d недељу пре тога + %d недељи пре тога + %d недељe пре тога + + + %d месец пре тога + %d месеци пре тога + %d месеци пре тога + + + %d годину пре тога + %d година пре тога + %d годинe пре тога + + + + %d секунда + %d секунди + %d секундe + + + %d минут + %d минути + %d минутe + + + %d сат + %d сати + %d сати + + + %d дан + %d данa + %d дани + + + %d недеља + %d недеља + %d недељe + + + %d месец + %d месеци + %d месеци + + + %d година + %d година + %d годинe + + + Преостало време до активације аларма:\n%s + Преостало време до активације подсетника:\n%s + Преостало време: +\n%s + Проверите да ли аларм ради како треба пре него што кренете да се ослањате на њега. Дешава се да не ради како треба због ограничења у систему која се односе на уштеду батерије. + Уверите се да подсетник ради како треба пре него што кренете да се ослањате на њега. Дешава се да не ради како треба због ограничења у систему која се односе на уштеду батерије. + Обавештења ове апликације су онемогућена. У подешавањима уређаја их можете укључити. + + Аларм + Успавај + Вољно + Без подсетника + Приликом старта + Системски звукови + Ваши звукови + Додај нови звук + Без звука + Током дана у cc:мм + Током дана у %02d:%02d + + Подешавања + Пазарите Simple Thank You + General + Прилагођавање боја + Improved color customization + Прилагодите боје + Прилагодите боје (Locked) + Закључано + Прилагодите боје виџета + Прилагодите обавештења + Notification sound + Користи енглески језик + Језик + Прикажи скривене ставке + Величина фонта + Мали + Средњи + Велики + Додатно велик + Заштити шифром видљивост скривених ставки + Заштити шифром целу апликацију + Заштити шифром брисање фајла и премештање + Задржи задње измењено + Прикажи балончић са информацијама приликом скроловања + Спречи телефон од успављивања када је апликација у првом плану + Увек прескочи дијалог за потврду брисања + Омогући повуци-да-освежиш са врха + Користи 24-часовни формат за време + Измени формат за датум и време + Старт седмице у недељу + Виџети + Увек користи исто време за успављивање + Време успављивања + Вибрирајте притиснути дугметом + Премести ставке у канту за отпатке уместо брисања + Временски интервал за чишћење канте за отпатке + Испразни канту за смеће + Форсирај режим портрета + Извези подешавања + Увези подешавања + Подешавања извежена успешно + Подешавања увежена успешно + Почните име са презименом + Обриши кеш меморију + Прикажите дијалог за потврду позива пре него започнете позив + + Видљивост + Безбедност + Скроловање + Операције над датотекама + Канта за смеће + Чување + Стартовање + Текст + Селидба + Квалитет + Главни екран + Сличице + List view + + Изузми + Изузми мапу + Изузете фасцикле + (изузето) + Управљај изузетим фасциклама + Уклони све + Уклони све фасцикле са листе изузетих\? Ово неће обрисати фасцикле. + Привремено је искључена емисија + Престани да се приказује искључено + + Управљајте приказаним картицама + Таб за отварање при покретању апликације + Contacts + Фаворити + Позив историја + Групе + Последњи коришћени + Files + Recent files + + Поврати овај фајл + Поврати изабране датотеке + Поврати све датотеке + Канта за отпатке је успешно испражњена + Фајлови су повраћени успешно + Да ли сте сигурни да желите да испразните канту за отпатке? Датотеке ће бити трајно обрисане. + Канта за отпатке је празна + Премештање ставки из канте за отпатке је онемогућено, употребите повраћај датотека + Прикажи канту за отпатке + Сакриј канту за отпатке + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Премештам %d ставку у канту за отпатке + Премештам %d ставки у канту за отпатке + Премештам %d ставкe у канту за отпатке + + + Увозим… + Извозим… + Увоз успешан + Извоз успешан + Увожење неуспешно + Извожење успешно + Увоз одређених ставки није успело + Извоз одређених ставки није успело + Нема ставки за увоз + Нису пронађени нови уноси за увоз + Нема ставки за извоз + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + УСБ + УСБ уреđај је прикаčен на уреđај. Доделите додатне дозволе да би се датотеке приказивале исправно. + Изаберите почетну фасциклу УСБ уређаја на следећем екрану, да доделите приступ + Изабрана је погрешна фасцикла, изаберите почетну фасциклу УСБ уређаја + + Јануар + Фебруар + Март + Април + Мај + Јуни + Јули + Август + Септембар + Октобар + Новембар + Децембар + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + у јануару + у фебруару + у марту + у априлу + у мају + у јуну + у јулу + у августу + у септембру + у октобру + у новембру + у децембру + Понедељак + Уторак + Среда + Четвртак + Петак + Субота + Недеља + П + У + С + Ч + П + С + Н + Пон + Уто + Сре + Чет + Пет + Суб + Нед + + Верзија ваше апликације се више неће ажурирати. Надоградите на Про верзију да бисте добили нове исправке и друга побољшања. + Верзија ваше апликације се више неће ажурирати. Надоградите на Про верзију да бисте добили нове поправке и друга побољшања кликом овде. + Бесплатна је до: %s. Ако је преузмете до тада, моћи ћете да је користите бесплатно заувек. + Више информација + Унапређивање + Морате да преселите локално складиштене догађаје ручно преко извожења у .ics датотеку, а затим да увезете. Можете наћи дугмад за увоз и извоз у главном екрану. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + О апликацији + Website + За изворни код посаетите + Пошаљите ваше повратне информације или сугестије на + Унапредите у професионалну верзију + Више апликација + Више апликација од нас + Позовите пријатеље + Посетите %1$s на %2$s + Позовите преко + Оцените нас + Rate + Донирај + Запратите нас + v %1$s\nАуторска права © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Правила о приватности + Version %s + Здраво :) + Произведено са ❤️ у Словачкој + Додатне информације + Верзија апликације: %s + Оперативни систем уређаја: %s + +
    + надамо се да уживате у апликацији. Она не садржи огласе, молимо вас да подржите њен развој куповином Simple Thank You апликације, то ће такође спречити овај дијалог од поновног појављивања.

    + Хвала вам! + ]]> +
    + Здраво,<бр><бр>надам се да уживате у апликацији. Не садржи огласе, а ни ми не прикупљамо ваше податке, подржите његов развој куповином <а хреф=хттпс://плаи.гоогле.цом/сторе/аппс/детаилс\?ид=цом.симплемобилетоолс.тханкиоу>Једноставно хвала Ви</а>. Такође ћете имати откључане све функције апликације, укључујући прилагођавање боја.<бр><бр>Хвала! + Подржите нас тако што ћете купити <а хреф=хттпс://плаи.гоогле.цом/сторе/аппс/детаилс\?ид=цом.симплемобилетоолс.тханкиоу>Једноставно хвала</а>, такође ће откључати све функције апликације, укључујући боју Подешавање. + Купите + Набавите једноставан телефон + Молимо вас ажурирајте Simple Thank You на најскорију верзију + Пре постављања питања проверите подешавања апликације и прочитајте најчешће постављана питања. Можда су решења већ ту. + Пре него што нас оцените, проверите подешавања апликације и прво прочитајте Често постављана питања. Ако имате било каквих проблема, можда је решење ту. + Такође се уверите да користите најновију верзију апликације. + Такође имајте на уму да се ова верзија апликације више не развија, набавите Про за многа побољшања. + Прочитајте + Прочитајте ФАК + Здраво, +\n +\nизгледа да ову апликацију користите већ дуже време, и ми то заиста ценимо. +\n +\nАко можемо да вас замолимо за услугу, оцените нас на Гоогле Плаи-у. То би нам заиста много помогло. +\n +\nКако год да одлучите, ову поруку више нећете видети. +\n +\nХвала! + Молимо оцените нашу апликацију :) + Хвала вам + Виџет је закључан. +\nНадоградите на Про верзију да бисте је откључали. + Ова функција је закључана, купите <а хреф=хттпс://плаи.гоогле.цом/сторе/аппс/детаилс\?ид=цом.симплемобилетоолс.тханкиоу>Једноставно хвала</а> за откључавање целе апликације.<бр ><бр>То је само једнократно плаћање и ако не будете задовољни, можемо вам вратити новац. + + +
    + само вас обавештавамо да је нова апликација објављена:

    + %2$s

    + %4$s

    + %6$s

    + Можете је преузети притиском на наслов.

    + Хвала + ]]> +
    + Једноставан покретач апликација + Једноставан калкулатор + Једноставан календар + Једноставна камера + Једноставан сат + Simple Contacts + Једноставан бројчаник + Једноставан цртеж + Једноставан менаџер фолдера + Једноставна лампа + Једноставна галерија + Једноставна тастатура + Једноставан покретач + Једноставан музички плејер + Једноставне белешке + Једноставан СМС Мессенгер + Једноставно хвала + Једноставан диктафон + Покретач апликација + Калкулатор + Календар + Камера + Сат + Контакти + Диалер + Диалер + Филе Манагер + Батеријска лампа + Галерија + Тастатура + Иницијатор + Музички плејер + Notes + СМС Мессенгер + Хвала вам + Диктафон + + овде. + ]]> + + + Најчешће постављена питања + Пре него поставите питање, прво прочитајте + Зашто не видим виџете ове апликације у листи виџета? + Највероватније јер сте преместили апликацију на СД картицу. Постоји ограничење Андроид система које скрива виџете у том случају. Једино решење је да вратите апликацију у интерно складиште преко подешавања уређаја. + Желим да вам дам подршку, али не могу да донирам новац. Да ли могу да учиним нешто друго? + Да наравно. Можете ширити вест о апликацијама или дати добре повратне информације и оцене. Такође можете помоћи тако што ћете превести апликације на нови језик или једноставно ажурирати неке постојеће преводе. Водич за превођење налази се на <а хреф=хттпс://гитхуб.цом/СимплеМобилеТоолс/Генерал-Дисцуссион#хов-цан-и-суггест-ан-едит-то-а-филе>овом веб-сајту</а>, или само нас контактирајте на <а хреф=маилто:хелло@симплемобилетоолс.цом>хелло@симплемобилетоолс.цом</а> ако имате питања. + Обрисао сам неке датотеке грешком, како их могу повратити? + Нажалост не можете. Датотеке се бришу одмах након дијалога за потврду, не постоји канта за отпатке. + Не свиђају ми се боје виџета, да ли могу да их променим? + Да, како вучете виџет на ваш екран, прозор за подешавање виџета се појављује. Видећете квадрате у бојама у доњем левом ћошку, једноставно их притисните да изаберете нову боју. Можете употребити и клизач да одредите финесе боје. + Да ли могу да повратим обрисане фајлове? + Ако су заиста избрисани, не можете. Међутим, постоји подразумевано омогућена корпа за отпатке, то ће проузроковати да се датотеке једноставно преместе у корпу уместо да их се бришу. + Икона покретача апликација је нестала. Шта да урадим? + То је узроковано изостатком подршке вашег покретача за прилагођавање икона. Пробајте да покренете апликацију преко Гугл плеја или неког виџета, ако су доступни. + Кад се покрене, подесите подразумевајућу наранџасту икону #F57C00. Можда будете морали да реинсталирате апликацију, у најгорем случају. + Новац је скинут са мог банковног рачуна, али не могу да преузмем апликацију. Шта могу да урадим\? + Плаћања у потпуности обавља Гоогле, њихов систем повремено квари. Само обришите кеш апликације Гоогле Плаи и поново покрените уређај, а затим покушајте поново да га преузмете. + Зашто да надоградим на Про верзију\? + Пошто се верзија ваше апликације више не ажурира, грешке које сте можда приметили никада неће бити исправљене. Такође неће бити додане нове функције. Про верзију можете купити на Гоогле Плаи-у за малу суму новца. То је једнократно плаћање, што значи да када га једном купите, више никада нећете морати да плаћате. Чак ни након набавке новог уређаја. Ако вам се не свиђа Про верзија, можете је само деинсталирати у року од неколико сати и аутоматски ћете добити свој новац назад. Ако желите повраћај новца било када касније, само нас контактирајте на хелло@симплемобилетоолс.цом и добићете га. + Како могу да изаберем више ставки одједном\? + Постоји више начина да се то уради. Први је покретање режима селекције дугим притиском на једну ставку, а затим кратким кликом на друге да бисте их изабрали. Други начин је сличан одабиру ставки на рачунарима помоћу миша, само покрените режим селекције дугим притиском на једну ставку, а затим је прстом и даље доле превуците преко других ставки да бисте изабрали. Трећи начин одабира више ставки је дуго притискање једне ставке, затим дуго притискање друге и све између се бира. Ако желите да изаберете све ставке, само дуго притисните једну ставку, а затим кликните на бројач изабраних ставки у горњем левом углу. То ће све изабрати или поништити избор. + Купио сам апликацију, али не могу да је преузмем на другом уређају. + Покушајте да обришете кеш апликације Гоогле Плаи и поново покренете уређај. То је нека грешка у Гоогле Плаи-у, која није баш повезана са самом апликацијом. + + Сарадници + Превод + Развој + Друга помоћ + Ова листа садржи све који су приметно помогли било којој апликацији у оквиру пакета Симпле Мобиле Тоолс, не само овој. Преводе обављају волонтери, јавите нам ако и ви желите да помогнете. Водич за превођење налази се на <а хреф=хттпс://гитхуб.цом/СимплеМобилеТоолс/Генерал-Дисцуссион#хов-цан-и-суггест-ан-едит-то-а-филе>овом веб-сајту</а>, или само нас контактирајте на <а хреф=маилто:хелло@симплемобилетоолс.цом>хелло@симплемобилетоолс.цом</а> ако имате питања. Хвала свим сарадницима и осталим присталицама! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Преузмите Про верзију одмах! + Основно + Pro + Нема реклама + Нема приступа интернету + 100% гаранција поврата новца + Једанпут се плаћа + Побољшан дизајн + + Напредни уређивач фотографија + Напредни уређивач фотографија и видео записа + Подршка за ХЕИЦ/ХЕИФ фајлове + Напредно преименовање батцх датотеке + Индивидуално закључавање фолдера + Подршка за штампање + + Подршка за временску зону + Учесници и подсетници путем е-поште + Једноставан увоз догађаја + Нови виџети + + Побољшано спајање дупликата контаката + Прилагођавање величине фонта + Опционо дељење приватних контаката у оквиру наших апликација + Прилагодљиве мелодије звона за контакте + Филтрирање контаката + Приватно сачувани контакти + + Контролне листе + Различите белешке и боје по виџету + Напомена закључавање + + Прилагођавање формата датума и времена + Пречице на почетном екрану + Подршка за компресију датотека + Картица са недавним датотекама + + Прилагођавање боје позадине + Подршка за увоз датотека + Зумирање + + Ова апликација користи следеће библиотеке које припадају трећим лицима, како би учинили наш живот лакшим. Хвала вам. + Лиценце трећих лица + Kotlin (програмски језик) + Subsampling Scale Image View (погледи на слике са зумирањем) + Glide (учитавање слика и кеширање) + Picasso (учитавање слика и кеширање) + Android Image Cropper (исецање и ротирање слика) + RtlViewPager (премештање десно и лево) + Joda-Time (замена за Јава датум) + Stetho (отклањање грешака на базама података) + Otto (магистрала за догађаје) + PhotoView (подршка за зумирање ГИФ-ова) + PatternLockView (заштита шаблона) + Reprint (заштита отисака прстију) + Gif Drawable (учитавање ГИФ-ова) + AutoFitTextView (промена величине текста) + Robolectric (радни оквир за тестирање) + Espresso (помагач за тестирање) + Gson (JSON синтаксни анализатор) + Leak Canary (детектор за цурење меморије) + Number Picker (прилагодљиви изабирач бројева) + ExoPlayer (видео плејер) + VR Panorama View (постављање панорама) + Apache Sanselan (исчитавање мета података слика) + Android Photo Filters (филтери за слике) + Gesture Views (зумирање слика) + Индикатор за брзо померање (слова на траци за померање) + Аутобус догађаја (комуникација унутар апликације) + Приказ аудио записа (аудио визуелизација) + СМС ММС (СМС и ММС руковање) + АПНГ Андроид (подршка за анимирани ВебП) + Андроид ПдфВиевер (ПДФ прегледач) + М3У Парсер (руковање датотекама листе песама м3у) + АндроидЛаме (мп3 кодер) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + ЗАСТАРЕЛО: Ова верзија апликације се више не одржава, набавите Про верзију на хттпс://плаи.гоогле.цом/сторе/аппс/детаилс\?ид=цом.симплемобилетоолс.ккк.про + Не заборавите да ако деинсталирате било коју плаћену апликацију у року од 2 сата, новац ће вам аутоматски бити враћен. Ако желите повраћај новца било када касније, само нас контактирајте на hello@simplemobiletools.com и добићете га. То олакшава испробавање :) + + Група једноставних Андроид апликација отвореног кода са прилагодљивим виџетима, без огласа и непотребних дозвола. +
    diff --git a/commons/src/main/res/values-sv/strings.xml b/commons/src/main/res/values-sv/strings.xml new file mode 100644 index 000000000..6730ee70d --- /dev/null +++ b/commons/src/main/res/values-sv/strings.xml @@ -0,0 +1,1118 @@ + + + OK + Avbryt + Tillbaka + Ingenting + Senare + Spara som + Filen har sparats + Ogiltigt filformat + Minnet är fullt + Ett fel har uppstått: %s + Fel: %s + Öppna med + Redigera med + Redigera + Ingen giltig app hittades + Ingen webbläsare hittades + Ingen e-postklient hittades + Använd som + Kopiera till urklipp + Kopiera nummer till urklipp + Värdet har kopierats till urklipp + Värdet har kopierats till urklipp:\n%s + Ring nummer + Okänd + Alltid + Aldrig + Information + Anteckningar + Tar bort mappen \'%s\' + Ingen + Etikett + Genomskinlig + Genomskinlig färg + Välj en annan färg + Hämta + Avisering + Aviseringar + E-post + Föregående + Spela / Pausa + Nästa + Nummer + Inga kontakter hittades + Begär de behörigheter som krävs + Appen kunde inte nå dina kontakter + Appen har inte behörighet att ringa telefonsamtal, ge den behörighet i din apparats inställningar + Skriv här + Ring %s + Bekräfta ringer %s + Noll + Ett + Två + Tre + Fyra + Fem + Sex + Sju + Åtta + Nio + Värde + Värdet får inte vara tomt + Skapa ny kontakt + Lägg till i en befintlig kontakt + Appen är skadad + Ansvarsfriskrivning + Ta foto + Välj foto + Välj video + Välj kontakt + Välj fil + Spela in ljud + Spela in video + Updaterar… + Telefonlagring + Telefonlagring (inte synligt för andra appar) + Audio + + Födelsedag + Årsdag + + Hem + Arbete + + Mobil + Primärt nummer + Arbetsfax + Hemfax + Personsökare + Inget telefonnummer hittades + + Ändra vy + Rutnät + Rutnät (Pro) + Ojämnt rutnät + Lista + Öka antalet kolumner + Minska antalet kolumner + Antal kolumner + Antal kolumner i stående läge + Antal kolumner i liggande läge + Byt omslagsbild + Välj foto + + %d kolumn + %d kolumner + + + Hantera blockerade nummer + Du blockerar inte någon. + Lägg till ett blockerat nummer + Blockera nummer + Blockera nummer + Blockerade nummer + Exportera blockerade nummer + Importera blockerade nummer + Du måste ställa in den här appen som standardtelefonapp för att kunna använda blockerade nummer. + Ange som standard + Är du säker på att du vill blockera \"%s\"? + Blockera samtal från okända nummer + Blockera meddelanden från okända nummer + Ange ett nummer eller en nummerserie (exempel *12345*, +1*8888) för att blockera alla samtal och meddelanden som matchar nummret eller nummerserien. + Can\'t block unknown numbers without caller ID permission. + + Favoriter + Lägg till favoriter + Lägg till i favoriter + Ta bort från favoriter + + Sök + Sök i %s + Skriv in minst två tecken för att starta sökningen. + Sök efter kontakter + Sök efter favoriter + Sök efter appar + Sök efter händelser + Sök efter grupper + Sök i historiken + Sök efter samtal + Sök efter filer + Sök efter mappar + Sök efter filer och mappar + Sök efter spellistor + Sök efter artister + Sök efter album + Sök efter låtar + Sök efter text + Sök efter konversationer + Sök efter inspelningar + + Filtrera + Filtrera (Pro) + Inga objekt hittades. + Ändra filter + + Lagringsbehörighet krävs + Kontaktbehörighet krävs + Kamerabehörighet krävs + Mikrofonbehörighet krävs + Ingen behörighet + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Byt namn på fil + Byt namn på mapp + Det gick inte att byta namn på filen + Det gick inte att byta namn på mappen + Du måste ange ett mappnamn + Det finns redan en mapp med samma namn + Det går inte att byta namn på rotmappen på ett lagringsutrymme + Mappen har fått ett nytt namn + Byter namn på mappen + Du måste ange ett filnamn + Filnamnet innehåller ogiltiga tecken + Filnamnet \'%s\' innehåller ogiltiga tecken + Filnamnstillägget får inte vara tomt + Källfilen %s finns inte + Lägg till före filnamnen + Lägg till efter filnamnen + Enkel namnändring + Mönster + String to add + %Y - år\n%M - månad\n%D - dag\n%h - timme\n%m - minut\n%s - sekund\n%i - number increasing from 1 + Filnamn (utan .txt) + Filnamn (utan .json) + Filnamn (utan .zip) + Sedan Android 11 kan du inte dölja filer och mappar på det viset + + Kopiera + Flytta + Kopiera / Flytta + Kopiera till + Flytta till + Källa + Mål + Välj mål + Tryck här för att välja mål + Det gick inte att skriva till målet + Välj mål + Källa och mål kan inte vara samma + Det gick inte att kopiera filerna + Kopierar… + Filerna har kopierats + Filen har kopierats + Ett fel har uppstått + Flyttar… + Filerna har flyttats + Filen har flyttats + Det gick inte att flytta vissa filer + Det gick inte att kopiera vissa filer + Inga filer har valts + Sparar… + Det gick inte att skapa mappen %s + Det gick inte att skapa filen %s + Inga nya objekt hittades + Otillräckligt med utrymme. +\nBehövs %1$s, tillgängligt %2$s + System service for selecting files and folders is unavailable + + Skapa ny + Mapp + Fil + Skapa ny mapp + Det finns redan en fil eller mapp med samma namn + Namnet innehåller ogiltiga tecken + Ange ett namn + Ett okänt fel har uppstått + + Filen \"%s\" finns redan + Filen \"%s\" finns redan. Skriv över? + Mappen \"%s\" finns redan + Slå ihop + Behåll båda + Skriv över + Hoppa över + Lägg till \'_1\' + Använd på alla konflikter + The system does not allow the operation in this folder, please pick another one + Systemet tillåter inte kopiering till denna mapp, välj någon annan + Systemet tillåter inte namnändring i denna mapp + Kan inte ändra namn på mappar direkt på det interna lagringsutrymmet, endast undermappar + Går ej att ändra namn på denna mapp + + Välj mapp + Välj fil + Bekräfta åtkomst till extern lagring + Bekräfta mappåtkomst + Välj rotmappen på ditt SD-kort på nästa skärm, för att bevilja skrivrättigheter + Om du inte ser SD-kortet, prova detta + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Bekräfta val + Läser in… + Vänligen ge oss tillgänglighet till dina filer, den kanske inte fungerar väl utan det. + + %d objekt + %d objekt + + + + %d objekt + %d objekt + + + Tar bort %d objekt + Tar bort %d objekt + + + + %d kontakt + %d kontakter + + + Välj lagringsplats + Lagringsutrymme + Internt + SD-kort + Rot + Du har valt fel mapp, välj rotmappen på ditt SD-kort + SD-kortets och USB-enhetens sökvägar kan inte vara samma + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + Egenskaper + Sökväg + Valda objekt + Antal direkta döttrar + Antal filer + Upplösning + Varaktighet + Artist + Album + Brännvidd + Exponeringstid + ISO-grader + F-nummer + Kamera + EXIF + Låttitel + GPS-koordinater + Höjd över havet + Ta bort EXIF-data + Är du säker på att du vill ta bort EXIF-data som GPS-koordinater, kameramodell med mera? + EXIF-datan har tagits bort + + Bakgrundsfärg + Textfärg + Primär färg + Accentfärg för vitt tema + Accentfärg för svartvitt tema + Förgrundsfärg + Appikonens färg + Navigeringsfältets färg + Återställ standardfärger + Använd standard + Standard + Ändra färg + Tema + Om du ändrar en färg, ändras temat till anpassat tema + Spara + Avbryt + Ångra ändringar + Är du säker på att du vill ångra dina ändringar? + Denna åtgärd kan inte ångras. + Du har ändringar som inte är sparade. Spara innan du lämnar? + Använd färgerna i alla Simple-appar + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Färgerna har uppdaterats. Ett nytt Tema som heter \'Delat\' har lagts till, använd det för att uppdatera alla apparnas färger i framtiden. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You för att låsa upp denna funktion och stödja utvecklingen. Tack! + ]]> + + + Ljust + Mörkt + Automatiskt + Auto ljust/mörkt + Solariserat + Mörkrött + Vitt + Svartvitt + Anpassat + Delat + Systemstandard + + Vad är nytt + * bara de större uppdateringarna visas här, det görs också alltid några mindre förbättringar + + Ta bort + Ta bort + Byt namn + Dela + Dela via + Ändra storlek + Markera alla + Markera text + Dölj + Visa + Dölj mapp + Visa mapp + Visa dolda objekt tillfälligt + Sluta visa dolda objekt + Du kan inte dela så här mycket innehåll på en gång + Töm och inaktivera papperskorgen + Ångra + Gör om + Skriv ut + Skriv ut (Pro) + Genväg + Skapa genväg + Skapa genväg (Pro) + Lägg till nummer i kontakt + Visa kontaktuppgifter + Ring med SIM-kort 1 + Ring med SIM-kort 2 + Visa/dölj filnamn + Flytta högst upp + Flytta längst ned + Fäst objekt + Lossa objekt + Skicka sms + Skicka e-post + Ring + Kontaktuppgifter + Lägg till kontakt + Bakgrunder + + Sortera efter + Namn + Storlek + Senast ändrad + Date created + Fotodatum + Titel + Filnamn + Filnamnstillägg + Slumpmässigt + Ordna slumpmässigt + Stigande + Fallande + Använd bara för denna mapp + Sortera numeriska delar efter faktiskt värde + Förnamn + Mellannamn + Efternamn + Fullständigt namn + Använd anpassad sortering + Ändra ordning + + Är du säker på att du vill fortsätta med borttagningen? + Är du säker på att du vill ta bort %s? + Vill du ta bort %s\? + + Är du säker på att du vill flytta %s till papperskorgen\? + + Är du säker på att du vill ta bort det här objektet? + Är du säker på att du vill flytta det här objektet till papperskorgen\? + Fråga inte igen i denna session + Visa inte igen + Ja + Nej + Kanske + + VARNING! Du håller på att ta bort %d mapp + VARNING! Du håller på att ta bort %d mappar + + + PIN-kod + Ange PIN-kod + Ange en PIN-kod + Du har angett fel PIN-kod + Upprepa PIN-kod + Mönster + Rita mönster + Du har ritat fel mönster + Upprepa mönster + Biometri + Fingeravtryck + Lägg till fingeravtryck + Placera fingret på fingeravtrycksläsaren + Open biometric ID verification dialog + Autentisera + Autentiseringen misslyckades + Autentisering blockeras, försök igen om en stund + Du har inga registrerade fingeravtryck, lägg till några i Inställningarna på din enhet + Gå till Inställningar + Lösenordet har ställts in. Installera om appen om du glömmer bort det. + Skyddet har ställts in. Installera om appen om du inte kan ta bort skyddet. + Lås mapp + Lås mapp (Pro) + Lås upp mapp + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + Igår + Idag + Imorgon + Varje dag + Dölj årtal + sekunder + minuter + timmar + dagar + s + m + h + v. + + %d sekund + %d sekunder + + + %d minut + %d minuter + + + %d timme + %d timmar + + + %d dag + %d dagar + + + %d vecka + %d veckor + + + %d månad + %d månader + + + %d år + %d år + + + + %d sekund + %d sekunder + + + %d minut + %d minuter + + + %d timme + %d timmar + + + %d dag + %d dagar + + + %d vecka + %d veckor + + + %d månad + %d månader + + + %d år + %d år + + + + %d sekund innan + %d sekunder innan + + + %d minut innan + %d minuter innan + + + %d timme innan + %d timmar innan + + + %d dag innan + %d dagar innan + + + %d vecka innan + %d veckor innan + + + %d månad innan + %d månader innan + + + %d år innan + %d år innan + + + + %d sekund + %d sekunder + + + %d minut + %d minuter + + + %d timme + %d timmar + + + %d dag + %d dagar + + + %d vecka + %d veckor + + + %d månad + %d månader + + + %d år + %d år + + + Återstående tid tills alarmet ringer:\n%s + Återstående tid tills påminnelsen aktiveras:\n%s + Återstående tid:\n%s + Kontrollera att alarmet fungerar som det ska innan du förlitar dig på det. Det kanske inte fungerar som det ska på grund av batterisparrelaterade systembegränsningar. + Kontrollera att påminnelserna fungerar som de ska innan du förlitar dig på dem. De kanske inte fungerar som de ska på grund av batterisparrelaterade systembegränsningar. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + Alarm + Snooza + Stäng av + Ingen påminnelse + Vid start + Systemljud + Dina ljud + Lägg till ett nytt ljud + Inget ljud + Under dagen klockan hh:mm + Under dagen klockan %02d:%02d + + Inställningar + Köp Simple Thank You + Allmänt + Färganpassning + Förbättrad färganpassning + Anpassa färger + Anpassa färger (låst) + Låst + Anpassa widgetarnas färger + Anpassa aviseringar + Aviseringsljud + Använd engelska + Språk + Visa dolda objekt + Teckenstorlek + Liten + Medelstor + Stor + Extra stor + Lösenordsskydda synligheten för dolda objekt + Lösenordsskydda hela appen + Lösenordsskydda borttagning och flytt av filer + Behåll senast ändrad-tider vid filåtgärder + Visa en informationsbubbla när jag rullar genom objekt genom att dra rullningslisten + Hindra aktivering av viloläge när appen körs i förgrunden + Hoppa alltid över dialogrutan för bekräftelse av borttagning + Aktivera uppdatering vid svepning från överkant + Använd 24-timmarsformat + Ändra datum- och tidsformat + Börja veckan på söndag + Widgetar + Använd alltid samma snooze-intervall + Snooze-intervall + Vibrera när jag trycker på knapparna + Flytta objekt till Papperskorgen istället för att ta bort dem + Rensningsintervall för Papperskorgen + Töm Papperskorgen + Lås skärmen i stående läge + Exportera inställningar + Importera inställningar + Inställningarna har exporterats + Inställningarna har importerats + Visa efternamn först + Rensa cacheminne + Visa en bekräftelsedialogruta före uppringning + + Synlighet + Säkerhet + Rullning + Filåtgärder + Papperskorgen + Sparande + Start + Text + Migrering + Kvalitet + Huvudskärm + Miniatyrbilder + Listvy + + Uteslut + Uteslut mapp + Uteslutna mappar + (exkluderad) + Hantera uteslutna mappar + Ta bort alla + Vill du ta bort alla mappar från uteslutningslistan\? Detta raderar inte mapparna. + Visa uteslutna mappar tillfälligt + Sluta visa uteslutna mappar + + Välj vilka flikar som ska visas + Flik som öppnas när appen startas + Kontakter + Favoriter + Samtalshistorik + Grupper + Den senast använda + Filer + Senaste filer + + Återställ filen + Återställ valda filer + Återställ alla filer + Papperskorgen har tömts + Filerna har återställts + Är du säker på att du vill tömma papperskorgen\? Filerna tas bort permanent. + Papperskorgen är tom + Flytt av objekt i papperskorgen är inaktiverad, använd Återställ + Visa papperskorgen + Dölj papperskorgen + Öppna papperskorgen + Skip the Recycle Bin, delete files directly + + Flyttar %d objekt till papperskorgen + Flyttar %d objekt till papperskorgen + + + Importerar… + Exporterar… + Importen lyckades + Exporten lyckades + Importen misslyckades + Exporten misslyckades + Importen av vissa poster misslyckades + Exporten av vissa poster misslyckades + Inga poster som kan importeras hittades + Inga nya poster som kan importeras hittades + Inga poster som kan exporteras hittades + Säkerhetskopieringar + Aktivera automatiska säkerhetskopieringar + Hantera automatiska säkerhetskopieringar + Du kan använda följande mönster för att namnge filen automatiskt: +\n +\n%Y - år +\n%M - månad +\n%D - dag +\n%h - timme +\n%m - minut +\n%s - sekund + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Välj rotmappen på USB-enheten på nästa skärm, för att ge åtkomst + Du har valt fel mapp, välj rotmappen på din USB-enhet + + Januari + Februari + Mars + April + Maj + Juni + Juli + Augusti + September + Oktober + November + December + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + i januari + i februari + i mars + i april + i maj + i juni + i juli + i augusti + i september + i oktober + i november + i december + Måndag + Tisdag + Onsdag + Torsdag + Fredag + Lördag + Söndag + M + T + O + T + F + L + S + Mån + Tis + Ons + Tor + Fre + Lör + Sön + + Din appversion kommer inte updateras mer. Vänligen upgradera till Pro-versionen för att ta del av förbättringar och bugfixar. + Din appversion kommer inte updateras mer. Vänligen upgradera till Pro-versionen för att ta del av förbättringar och bugfixar genom att klicka här. + Den är gratis fram till: %s. Om du hämtar den innan dess, kan du använda den kostnadsfritt för all framtid. + Mer information + Uppgradera + Lokalt sparade händelser kan bara migreras manuellt genom att exportera och importera dem till och från en .ics-fil. Du hittar knappar för både export och import i huvudvymenyn. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hej, +\n +\ndet ser ut som du precis upgraderat från gratisversionen. Om du vill migrera dina lokalt sparade händelser, så behöver du manuellt exportera dem till en .ics-fil i gratisappen och importera de här genom menyn. +\n +\nNär du är nöjd med dina ändringar i Pro-versionen så kan du avinstallera den gamla gratisversionen. +\n +\nTack! + Hej, +\n +\ndet ser ut som du precis upgraderat från gratisversionen. Om du hade några kontakter lagrat under \"%s\" så behöver du manuellt exportera dem till en .vcf-fil i gratisappen och importera de här genom menyn. +\n +\nNär du är nöjd med dina ändringar i Pro-versionen så kan du avinstallera den gamla gratisversionen. +\n +\nTack! + Hej, +\n +\ndet ser ut som du precis upgraderat från gratisversionen. Om du vill migrera dina anteckningar över, så behöver du manuellt exportera dem till en fil i gratisappen och importera de här genom menyn. +\n +\nNär du är nöjd med dina ändringar i Pro-versionen så kan du avinstallera den gamla gratisversionen. +\n +\nTack! + + Om + Webbplats + Du hittar källkoden på + Skicka dina synpunkter och förslag till + Uppgradera till Pro + Fler appar + Fler appar från oss + Bjud in vänner + Hej, läs om %1$s på %2$s + Bjud in via + Betygsätt oss + Betygsätt + Donera + Följ oss + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Hjälp oss + Socialt + Övrigt + Integritetspolicy + Version %s + Hej :) + Skapad med ❤️ i Slovakien + Ytterligare information + Appversion: %s + Enhetens operativsystem: %s + +
    + jag hoppas att du gillar appen. Den innehåller ingen reklam. Stöd dess utveckling genom att köpa appen Simple Thank You, som även hindrar den här dialogrutan från att visas igen.

    + Tack! + ]]> +
    + Hejsvejs,<br><br>hoppas du gillar appen. Den innehåller inga annonser och samlar inte in data om dig heller, vänligen stöd dess vidare utveckling genom att köpa <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. Du får ytterligare funktioner inklusive färganpassning.<br><br>Tackar! + Vänligen, stöd oss genom att köpa <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. Det låser även upp ytterligare funktioner inklusive färganpassning. + Köp + Skaffa Simple Phone + Uppdatera Simple Thank You till den senaste versionen + Innan du frågar, vänligen kolla appens inställningar och läs FAQ:en först. Kanske finns lösningen där. + Innan du betygsätter oss, vänligen kolla appens inställningar och läs FAQ:en innan. Om du har några problem, kanske finns lösningen där. + Dubbelkolla så du har den senaste versionen av appen. + Notera att denna appversionen inte utvecklas längre, skaffa Pro-versionen för förbättringar istället. + Läs + Läs FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Betygsätt vår app :) + Tack + Widgeten är låst.\nUppgradera till Pro-versionen för att låsa upp den. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + jag vill bara meddela att en ny app nyligen har publicerats:

    + %2$s

    + %4$s

    + %6$s

    + Du kan hämta den genom att trycka på titeln.

    + Tack + ]]> +
    + Simple App Launcher + Simpel kalkylator + Simpel kalender + Simpel kamera + Simpel klocka + Simple Contacts + Simpel telefon + Simple Draw + Simpel filhanterare + Simpel ficklampa + Simpelt galleri + Simpelt tangentbord + Simpelt startprogram + Simpel musikspelare + Simple Notes + Simple SMS Messenger + Simpelt tack + Simpel röstinspelare + App Launcher + Kalkylator + Kalender + Kamera + Klocka + Kontakter + Telefon + Rita + Filhanterare + Ficklampa + Galleri + Tangentbord + Startprogram + Musikspelare + Anteckningar + Sms + Tack + Röstinspelare + + here. + ]]> + + + Frågor och svar + Innan du ställer en fråga, läs först + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Bidragsgivare + Översättning + Utveckling + Annan hjälp + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabiska + Azerbajdzjanska + Bengali + Bretonska + Bulgarian + Katalanska + Tjeckiska + Walesiska + Danska + Engelska + Tyska + Grekiska + Spanska + Baskiska + Persiska + Finska + Franska + Galiciska + Hindi + Kroatiska + Ungerska + Indonesiska + Italienska + Hebreiska + Japanska + Koreanska + Litauiska + Nepali + Norska + Nederländska + Polska + Portugisiska + Rumänska + Ryska + Slovakiska + Slovenska + Serbiska + Svenska + Tamil + Turkiska + Ukrainska + Vietnamesiska + Kinesiska (Hongkong) + Kinesiska (förenklad) + Kinesiska (traditionell) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + Denna app använder följande tredjepartsbibliotek för att göra mitt liv enklare. Tack. + Tredjepartslicenser + Kotlin (programmeringsspråk) + Subsampling Scale Image View (zoombara bildvyer) + Glide (inläsning och cachning av bilder) + Picasso (inläsning och cachning av bilder) + Android Image Cropper (beskärning och rotering av bilder) + RtlViewPager (höger-till-vänster-svepning) + Joda-Time (ersättning för Javas datumklass) + Stetho (avlusning av databaser) + Otto (händelsebuss) + PhotoView (zoombara GIF-bilder) + PatternLockView (mönsterlås) + Reprint (fingeravtryckslås) + Gif Drawable (inläsning av GIF-bilder) + AutoFitTextView (storleksändring av text) + Robolectric (testramverk) + Espresso (testhjälpklass) + Gson (JSON-parser) + Leak Canary (minnesläckagedetektor) + Number Picker (anpassningsbar talväljare) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-sw600dp/dimens.xml b/commons/src/main/res/values-sw600dp/dimens.xml new file mode 100644 index 000000000..e396c089d --- /dev/null +++ b/commons/src/main/res/values-sw600dp/dimens.xml @@ -0,0 +1,11 @@ + + 50dp + 80dp + 40dp + + 38dp + + 18sp + 22sp + 26sp + diff --git a/commons/src/main/res/values-ta/strings.xml b/commons/src/main/res/values-ta/strings.xml new file mode 100644 index 000000000..9cde5ae41 --- /dev/null +++ b/commons/src/main/res/values-ta/strings.xml @@ -0,0 +1,1092 @@ + + + சரி + ரத்துசெய் + Back + Nothing + பின்னர் + இவ்வாறு சேமி + கோப்பு வெற்றிகரமாக சேமிக்கப்பட்டது + தவறான கோப்பு வடிவம் + நினைவக பிழை இல்லை + பிழை ஏற்பட்டது: %s + Error: %s + இதனுடன் திற + இதனுடன் திருத்து + திருத்து + சரியான செயலி ஏதுமில்லை + No browser found + No email client found + இதுவாக அமை + நினைவிக்கு நகலெடு + நினைவிக்கு எண்ணை நகலெடு + மதிப்பு நினைவிக்கு நகலெடுக்கப்பட்டது + மதிப்பு நினைவிக்கு நகலெடுக்கப்பட்டது:\n%s + டயல் எண் + தெரியவில்லை + எப்போதும் + ஒருபோதுமில்லை + விவரங்கள் + குறிப்புகள் + \'%s\' கோப்புறையை நீக்குகிறது + ஏதுமில்லை + சிட்டை + ஒளிபுகும் + ஒளிபுகு நிறம் + வேறு நிறத்தைத் தேர்ந்தெடு + பதிவிறக்கு + அறிவிப்பு + Notifications + மின்னஞ்சல் + முந்தைய + இயக்கு / இடைநிறுத்து + அடுத்தது + எண் + தொடர்புகள் ஏதுமில்லை + தேவையான அனுமதிகளைக் கோருங்கள் + செயலியால் உங்கள் தொடர்புகளை அணுக இயலவில்லை + App does not have the permission to initiate phone calls, please grant it in the device settings + உரையை இங்கே சேர்க்கவும் + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + Birthday + Anniversary + + Home + Work + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + காட்சி வகையை மாற்று + கட்டம் + கட்டம் (Pro) + Uneven Grid + பட்டியல் + நெடுவரிசை அதிகரி + நெடுவரிசை குறை + Column count + Portrait column count + Landscape column count + அட்டைப் படத்தை மாற்று + புகைப்படத்தைத் தேர்ந்தெடு + + %d column + %d columns + + + தடுக்கப்பட்ட எண்களை நிர்வகி + நீங்கள் யாரையும் தடுக்கவில்லை. + தடுக்கப்பட்ட எண்ணைச் சேர்க்கவும் + எண்ணைத் தடு + எண்களைத் தடு + தடுக்கப்பட்ட எண்கள் + Export blocked numbers + Import blocked numbers + தடுக்கப்பட்ட எண்களைப் பயன்படுத்த இப்பயன்பாட்டை இயல்புநிலை டயலர் பயன்பாடாக மாற்ற வேண்டும். + இயல்புநிலையாக அமை + \"%s\" ஐத் தடுக்க விரும்புகிறீர்களா? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + பிடித்தவை + பிடித்தவற்றைச் சேர் + பிடித்தவையில் சேர் + பிடித்தவையிலிருந்து அகற்று + + தேடல் + Search in %s + தேடலைத் தொடங்க குறைந்தது 2 எழுத்துக்களைத் தட்டச்சு செய்க. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + வடிகட்டி + வடிகட்டி (Pro) + உருப்படிகள் எதுவும் கிடைக்கவில்லை. + வடிப்பானை மாற்றவும் + + சேமிப்பு அனுமதி தேவை + தொடர்புகளின் அனுமதி தேவை + கேமரா அனுமதி தேவை + ஆடியோ அனுமதி தேவை + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + கோப்பை மறுபெயரிடு + கோப்புறையை மறுபெயரிடு + கோப்பின் மறுபெயரிட முடியவில்லை + கோப்புறையின் மறுபெயரிட முடியவில்லை + கோப்புறையின் பெயர் காலியாக இருக்கக்கூடாது + அந்த பெயருடன் ஒரு கோப்புறை ஏற்கனவே உள்ளது + சேமிப்பகத்தின் ரூட் கோப்புறையை மறுபெயரிட முடியாது + கோப்புறை வெற்றிகரமாக மறுபெயரிடப்பட்டது + கோப்புறையை மறுபெயரிடுகிறது + கோப்பு பெயர் காலியாக இருக்க முடியாது + கோப்பு பெயரில் தவறான எழுத்துக்கள் உள்ளன + கோப்பு பெயர் \'%s\' தவறான எழுத்துக்களைக் கொண்டுள்ளது + நீட்டிப்பு காலியாக இருக்க முடியாது + மூல கோப்பு %s இல்லை + கோப்பு பெயர்களைத் முன்சேர்க்கவும் + கோப்பு பெயர்களைச் பின்சேர்க்கவும் + எளிய மறுபெயரிடுதல் + முறை + சேர்க்க வேண்டிய சரம் + %Y - ஆண்டு\n%M - மாதம்\n%D - நாள்\n%h - மணி\n%m - நிமிடம்\n%s - விநாடிகள்\n%i - 1 இலிருந்து அதிகரிக்கும் எண் + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + நகலெடுக்கவும் + நகர்வு + நகலெடு / நகர்த்து + இதற்கு நகலெடு + இதற்கு நகர்த்து + மூலம் + இலக்கு + இலக்கைத் தேர்ந்தெடு + இலக்கைத் தேர்ந்தெடுக்க இங்கே அழுத்து + தேர்ந்தெடுக்கப்பட்ட இலக்குக்கு எழுத முடியவில்லை + Please select a destination + Source and destination cannot be the same + Could not copy the files + நகலெடுக்கிறது… + கோப்புகள் வெற்றிகரமாக நகலெடுக்கப்பட்டது + File copied successfully + ஒரு பிழை ஏற்பட்டது + நகர்த்துகிறது… + கோப்புகள் வெற்றிகரமாக நகர்த்தப்பட்டது + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + சேமிக்கிறது… + Could not create folder %s + Could not create file %s + புது உருப்படிகள் ஏதுமில்லை + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + Create new + கோப்புறை + கோப்பு + புது கோப்புறை உருவாக்கு + A file or folder with that name already exists + The name contains invalid characters + பெயரை உள்ளிடவும் + ஓர் அறியா பிழை ஏற்பட்டது + + கோப்பு \"%s\" ஏற்கனவே உள்ளது + கோப்பு \"%s\" ஏற்கனவே உள்ளது. மேலெழுதவா? + கோப்புறை \"%s\" ஏற்கனவே உள்ளது + ஒன்றுசேர் + இரண்டையும் வைத்திரு + மேலெழுது + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + கோப்புறையை தேர்ந்தெடு + கோப்பை தேர்ந்தெடு + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + தேர்வை உறுதிசெய் + Loading… + உங்கள் எல்லா கோப்புகளுக்கும் எங்கள் பயன்பாட்டு அணுகலை வழங்கவும், அது இல்லாமல் அது சரியாக இயங்காது. + + %d உருப்படி + %d உருப்படிகள் + + + + %d உருப்படி + %d உருப்படிகள் + + + %d உருப்படியை அழிக்கிறது + %d உருப்படிகளை அழிக்கிறது + + + + %d தொடர்பு + %d தொடர்புகள் + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + பண்புகள் + பாதை + உருப்படிகள் தேர்ந்தெடுக்கப்பட்டது + Direct children count + மொத்த கோப்புகள் எண்ணிக்கை + Resolution + கால‌ அளவு + கலைஞர் + Album + குவியத்தூரம் + வெளிக்கொணர்தல் நேரம் + ISO வேகம் + F-number + படக்கருவி + EXIF + பாடல் தலைப்பு + GPS ஆய அச்சுகள் + உயரம் + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + பின்புல நிறம் + சொற்சர நிறம் + Primary color + Accent color of white theme + Accent color of Black & White theme + முன்புல நிறம் + செயலி படவுரு நிறம் + Bottom navigation bar color + இயல்புநிலைகளை மீட்டமை + இயல்புநிலையை பயன்படுத்து + இயல்புநிலை + நிறம் மாற்று + Theme + Changing a color will make it switch to Custom theme + சேமி + கைவிடு + மாற்றங்களை செயல்தவிர் + உமது மாற்றங்களை செயல்தவிர்க்க உறுதியா? + This action cannot be undone. + சேமிக்காத மாற்றங்களுள்ளன. வெளியேறும்முன் சேமிக்கவா? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + பதிது என்ன + * only the bigger updates are listed here, there are always some smaller improvements too + + அழி + நீக்கு + மறுபெயரிடு + பகிர் + இதன்மூலம் பகிர் + மறுஅளவிடு + எல்லாம் தேர்ந்தெடு + சொற்சரத்தை தேர்ந்தெடு + மறை + மறைக்காதே + கோப்புறையை மறை + கோப்புறையை மறைக்காதே + மறைத்தவையை தற்காலிகமாக காட்டு + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + செயல்தவிர் + Redo + அச்சிடு + அச்சிடு (Pro) + Shortcut + குறுக்குவழி உருவாக்கு + குறுக்குவழி உருவாக்கு (Pro) + எண்ணைத் தொடர்புக்குச் சேர் + தொடர்பு விவரங்களைப் பார் + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + உச்சிக்கு நகர்த்து + அடிப்புறத்திற்கு நகர்த்து + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + இதன்படி வரிசைபடுத்து + பெயர் + அளவு + Last modified + Date created + எடுக்கப்பட்ட தேதி + தலைப்பு + கோப்புப்பெயர் + நீட்டிப்பு + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + முதற் பெயர் + Middle name + Surname + முழு பெயர் + Use custom sorting + Change order + + Are you sure you want to proceed with the deletion? + %s-ஐ அழிக்க நீங்கள் உறுதியா? + Delete %s? + + Are you sure you want to move %s into the Recycle Bin? + + இவ்வுருப்படியை அழிக்க நீங்கள் உறுதியா? + Are you sure you want to move this item into the Recycle Bin? + இவ்வமர்வில் மீண்டும் கேட்காதே + மீண்டும் காட்டாதே + ஆம் + இல்லை + ஒருவேலை + + எச்சரிக்கை: %d கோப்புறையை அழிக்கிறீர்கள் + எச்சரிக்கை: %d கோப்புறைகளை அழிக்கிறீர்கள் + + + குறியீட்டெண் + குறியீட்டெண்ணை உள்ளிடு + ஒரு குறியீட்டெண்ணை உள்ளிடவும் + தவறான குறியீட்டெண் + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + கைரேகை + கைரேகை சேர் + கைரேகை உணர்வியில் உமது விரலை வைக்கவும் + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + அமைப்புகளுக்கு செல் + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + கோப்புறையை பூட்டு + கோப்புறையை பூட்டு (Pro) + கோப்புறையை பூட்டவிழ் + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + நேற்று + இன்று + நாளை + Every day + ஆண்டை மறை + விநாடிகள் + நிமிடங்கள் + மணிநேரங்கள் + நாட்கள் + வி + நி + + wk. + + %d விநாடி + %d விநாடிகள் + + + %d நிமிடம் + %d நிமிடங்கள் + + + %d மணிநேரம் + %d மணிநேரங்கள் + + + %d நாள் + %d நாட்கள் + + + %d வாரம் + %d வாரங்கள் + + + %d மாதம் + %d மாதங்கள் + + + %d ஆண்டு + %d ஆண்டுகள் + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + Alarm + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + அமைப்புகள் + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + ஆங்கில மொழியை பயன்படுத்து + Language + மறைத்த உருப்படிகளை காட்டு + எழுத்துரு அளவு + சிறிது + நடுத்தர + பெரிது + மிகப் பெரிது + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + தேதி மற்றும் நேர வடிவமைப்பை மாற்று + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + Vibrate on button press + அழிப்பதற்கு பதில் மறுசுழற்சி தொட்டிக்குள் உருப்படிகளை நகர்த்து + Recycle Bin cleaning interval + மறுசுழற்சி தொட்டியை காலியாக்கு + Force portrait mode + அமைப்புகள் ஏற்றுமதி + அமைப்புகள் இறக்குமதி + அமைப்புகள் ஏற்றுமதி வெற்றி + அமைப்புகள் இறக்குமதி வெற்றி + Start name with surname + பிடிதரவை துடை + Show a call confirmation dialog before initiating a call + + தெரிவுநிலை + பாதுகாப்பு + உருட்டுதல் + கோப்பு செயல்பாடுகள் + மறுசுழற்சி தொட்டி + சேமிக்கிறது + Startup + சொற்சரம் + இடம்பெயர்கிறது + Quality + Main screen + சிறுபடங்கள் + List view + + விலக்கு + Exclude folder + விலக்கிய அடைவுகள் + (விலக்கிய) + விலக்கிய அடைவுகளை நிர்வகி + எல்லாம் நீக்கு + விலக்கப்பட்டவை பட்டியலிலிருந்து எல்லா அடைவுகளையும் நீக்கவா\? இது அடைவுகளை அழிக்காது. + Temporarily show excluded + Stop showing excluded + + காட்டப்படும் தாவல்களை நிர்வகி + Tab to open at app start + தொடர்புகள் + பிடித்தமானவை + அழைப்பு வரலாறு + குழுக்கள் + கடைசியாக பயன்படுத்தியது + கோப்புகள் + அண்மை கோப்புகள் + + இககோப்பை மீட்டமை + தேர்ந்தெடுத்த கோப்புகளை மீட்டமை + எல்லா கோப்புகளையும் மீட்டமை + மறுசுழற்சி தொட்டி வெற்றிகரமாக காலியாக்கப்பட்டது + கோப்புகள் வெற்றிகரமாக மீட்டமைக்கப்பட்டன + மறுசுழற்சி தொட்டியை காலியாக்க நீங்கள் உறுதியா? கோப்புகளை நிரந்தரமாக இழப்பீர்கள். + மறுசுழற்சி தொட்டி காலி + Moving Recycle bin items is disabled, please use Restore + மறுசுழற்சி தொட்டியை காட்டு + மறுசுழற்சி தொட்டியை மறை + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + %d உருப்படியை மறுசுழற்சி தொட்டிக்குள் நகர்த்துகிறது + %d உருப்படிகளை மறுசுழற்சி தொட்டிக்குள் நகர்த்துகிறது + + + ஏற்றுகிறது… + இறக்குகிறது… + ஏற்றுமதி வெற்றி + இறக்குமதி வெற்றி + ஏற்றுமதி தோல்வி + இறக்குமதி தோல்வி + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + ஜனவரி + பிப்ரவரி + மார்ச் + ஏப்ரல் + மே + ஜூன் + ஜூலை + ஆகஸ்ட் + செப்டம்பர் + அக்டோபர் + நவம்பர் + டிசம்பர் + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + ஜனவரியில் + பிப்ரவரியில் + மார்ச்சில் + ஏப்ரலில் + மேயில் + ஜூனில் + ஜூலையில் + ஆகஸ்டில் + செப்டம்பரில் + அக்டோபரில் + நவம்பரில் + டிசம்பரில் + திங்கள் + செவ்வாய் + புதன் + வியாழன் + வெள்ளி + சனி + ஞாயிறு + தி + செ + பு + வி + வெ + + ஞா + தி + செ + பு + வி + வெ + + ஞா + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + மேலும் தகவல் + தரமுயர்த்து + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + பற்றி + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + மேலும் செயலிகள் + எங்களிடமிருந்து மேலும் செயலிகள் + நன்பர்களை அழைப்பிடு + Hey, come check out %1$s at %2$s + Invite via + எம்மை மதிப்பிடு + மதிப்பிடு + நன்கொடையளி + எம்மை பின்தொடர் + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + செயலி பதிப்பு: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + எளிய செயலி ஏவி + எளிய கணிப்பபொறி + எளிய நாட்காட்டி + எளிய படக்கருவி + எளிய கடிகாரம் + எளிய தொடர்புகள் + Simple Dialer + Simple Draw + எளிய கோப்பு நிர்வாகி + எளிய ஒளிவிளக்கு + எளிய காட்சியகம் + Simple Keyboard + Simple Launcher + எளிய இசை இயக்கி + எளிய குறிப்புகள் + எளிய குறுஞ்செய்தி தூதர் + எளிய நன்றி + எளிய குரல் பதிவான் + செயலி ஏவி + கணிப்பபொறி + நாட்காட்டி + படக்கருவி + கடிகாரம் + தொடர்புகள் + Dialer + Draw + கோப்பு நிர்வாகி + ஒளிவிளக்கு + காட்சியகம் + Keyboard + Launcher + இசை இயக்கி + குறிப்புகள் + குறுஞ்செய்தி தூதர் + நன்றி + குரல் பதிவான் + + here. + ]]> + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + இணைய அணுகல் இல்லை + 100% Money Back Guarantee + One time payment + Improved design + + மேம்பட்ட புகைப்பட திருத்தி + Advanced photo & video editor + HEIC/HEIF கோப்பு ஆதரவு + Advanced batch file renaming + Individual folder locking + அச்சிடுதல் ஆதரவு + + நேர மண்டல ஆதரவு + Attendees and email reminders + எளிதான நிகழ்வு இறக்குமதி + New widgets + + Improved duplicate contact merging + எழுத்துரு அளவு தனிப்பயனாக்கம் + Optional private contact sharing within our apps + Customizable contact ringtones + தொடர்பு வடிகட்டல் + Privately stored contacts + + Checklists + Different note and colors per widget + குறிப்பு பூட்டல் + + தேதி மற்றும் நேர வடிவமைப்பு தனிப்பயனாக்கம் + முகப்புத்திரை குறுக்குவழிகள் + கோப்பு சுருக்கம் ஆதரவு + அண்மை கோப்புகள் கொண்ட தாவல் + + பின்புல நிறம் தனிப்பயனாக்கம் + கோப்பு இறக்குமதி ஆதரவு + Zooming + + This app uses the following third party libraries to make my life easier. Thank you. + மூன்றாம் தரப்பு உரிமங்கள் + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-th/strings.xml b/commons/src/main/res/values-th/strings.xml new file mode 100644 index 000000000..cee991019 --- /dev/null +++ b/commons/src/main/res/values-th/strings.xml @@ -0,0 +1,1157 @@ + + + OK + Cancel + Back + Nothing + Later + Save as + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Open with + Edit with + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Unknown + Always + Never + Details + Notes + Deleting folder \'%s\' + None + Label + Transparent + Transparent color + Select a different color + Download + Notification + Notifications + Email + Previous + Play / Pause + Next + Number + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + + Birthday + Anniversary + + + Home + Work + + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + + Favorites + Add favorites + Add to favorites + Remove from favorites + + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + + Filter + Filter (Pro) + No items found. + Change filter + + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + + %d item + %d items + + + + + %d item + %d items + + + + Deleting %d item + Deleting %d items + + + + + %d contact + %d contacts + + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + + Delete + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + Are you sure you want to move %s into the Recycle Bin? + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Yes + No + Maybe + + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + minutes + hours + days + s + m + h + wk. + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + + Alarm + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + Vibrate on button press + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + + Exclude + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded\? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + + January + February + March + April + May + June + July + August + September + October + November + December + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + M + T + W + T + F + S + S + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + + About + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + Rate us + Rate + Donate + Follow us + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + + here. + ]]> + + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + + Checklists + Different note and colors per widget + Note locking + + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + + Background color customization + File importing support + Zooming + + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values-tr/strings.xml b/commons/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..5e3866b89 --- /dev/null +++ b/commons/src/main/res/values-tr/strings.xml @@ -0,0 +1,1132 @@ + + + Tamam + İptal + Geri + Hiçbir şey + Sonra + Farklı kaydet + Dosya başarıyla kaydedildi + Geçersiz dosya biçimi + Yetersiz hafıza hatası + Bir hata oluştu: %s + Hata: %s + Birlikte aç + Şununla düzenle + Düzenle + Geçerli bir uygulama bulunamadı + Tarayıcı bulunamadı + E-posta istemcisi bulunamadı + Ayarla + Panoya kopyala + Numarayı panoya kopyala + Değer panoya kopyalandı + Değer panoya kopyalandı:\n%s + Numarayı çevir + Bilinmeyen + Her zaman + Asla + Ayrıntılar + Notlar + \'%s\' klasörü siliniyor + Hiçbiri + Etiket + Şeffaf + Şeffaf renk + Farklı bir renk seçin + İndir + Bildirim + Bildirimler + E-posta + Önceki + Çal / Duraklat + Sonraki + Numara + Kişi bulunamadı + Gerekli izinleri iste + Uygulama, kişilerinize erişemedi + Uygulamanın telefon görüşmesi başlatma izni yok, lütfen aygıt ayarlarında izin verin + Metni buraya girin + %s kişisini ara + %s kişisini aramayı onayla + Sıfır + Bir + İki + Üç + Dört + Beş + Altı + Yedi + Sekiz + Dokuz + Değer + Değer boş olamaz + Yeni kişi oluştur + Mevcut bir kişiye ekle + Uygulama Bozuk + Sorumluluk Reddi + Fotoğraf çek + Fotoğraf seç + Video seç + Kişi seç + Dosya seç + Ses kaydet + Video kaydet + Güncelleniyor… + Telefon belleği + Telefon belleği (diğer uygulamalar tarafından görülmez) + Audio + + Doğum günü + Yıldönümü + + Ev + İş + + Cep + Ana + İş Faksı + Ev Faksı + Çağrı Cihazı + Telefon numarası bulunamadı + + Görünüm türünü değiştir + Izgara + Izgara (Pro) + Düzensiz Izgara + Liste + Sütun sayısını artır + Sütun sayısını azalt + Sütun sayısı + Dikey sütun sayısı + Yatay sütun sayısı + Kapak resmini değiştir + Fotoğraf seç + + %d sütun + %d sütun + + + Engellenen numaraları yönet + Kimseyi engellemiyorsun. + Engellenen numara ekle + Numarayı engelle + Numaraları engelle + Engellenen numaralar + Engellenen numaraları dışa aktar + Engellenen numaraları içe aktar + Engellenen numaraları kullanmak için bu uygulamayı öntanımlı çevirici uygulaması yapmalısınız. + Öntanımlı olarak ayarla + \"%s\" gerçekten engellensin mi? + Kayıtlı olmayan kişilerden gelen aramaları engelle + Kayıtlı olmayan kişilerden gelen mesajları engelle + Eşleşen numaralardan gelen tüm aramaları ve mesajları engellemek için bir numara veya desen (örn. *12345*, +1*8888) girin. + Arayan kimliği izni olmadan bilinmeyen numaralar engellenemiyor. + + Favoriler + Favori ekle + Favorilere ekle + Favorilerden kaldır + + Ara + %s içinde ara + Aramaya başlamak için en az 2 karakter yazın. + Kişileri ara + Favorileri ara + Uygulama ara + Etkinlikleri ara + Grupları ara + Geçmişte ara + Aramalarda ara + Dosyaları ara + Klasörleri ara + Dosya ve klasörleri ara + Çalma listelerinde ara + Sanatçıları ara + Albümleri ara + Parçaları ara + Metin ara + Görüşmeleri ara + Kayıt ara + + Filtre + Filtre (Pro) + Hiçbir öge bulunamadı. + Filtreyi değiştir + + Depolama izni gerekiyor + Kişiler izni gerekiyor + Kamera izni gerekiyor + Ses izni gerekiyor + İzin yok + Uygulamanın bildirimleri göstermesine izin vermelisiniz, aksi halde hatırlatıcıları gösteremez. + Uygulamanın bildirimleri göstermesine izin vermelisiniz, aksi halde ilerleme çubuğunu gösteremez. + Uygulamanın bildirimleri göstermesine izin vermelisiniz, aksi halde şarkı çalamaz. + Uygulamanın bildirimleri göstermesine izin vermelisiniz, aksi halde ses kaydedemez. + Uygulamanın bildirimleri göstermesine izin vermelisiniz, aksi halde gelen aramaları gösteremez. + Uygulamanın bildirimleri göstermesine izin vermelisiniz, aksi halde gelen mesajları gösteremez. + İzin Ver + İzin Gerekli + + Dosyayı yeniden adlandır + Klasörü yeniden adlandır + Dosya yeniden adlandırılamıyor + Klasör yeniden adlandırılamıyor + Klasör adı boş olamaz + Bu ada sahip bir klasör zaten var + Depolama biriminin kök klasörü yeniden adlandıramaz + Klasör başarıyla yeniden adlandırıldı + Klasörü yeniden adlandırma + Dosya adı boş olamaz + Dosya adı geçersiz karakterler içeriyor + Dosya adı \'%s\' geçersiz karakterler içeriyor + Uzantı boş olamaz + %s kaynak dosyası mevcut değil + Ön dosya adları + Dosya adlarını ekle + Basit yeniden adlandırma + Desen + Eklenecek dize + %Y - yıl\n%M - ay\n%D - gün\n%h - saat\n%m - dakika\n%s - saniye\n%i - 1\'den artan sayı + Dosya adı (.txt olmadan) + Dosya adı (.json olmadan) + Dosya adı (.zip olmadan) + Android 11\'den itibaren dosya ve klasörleri artık bu şekilde gizleyemezsiniz + + Kopyala + Taşı + Kopyala / Taşı + Kopyala: + Taşı: + Kaynak + Hedef + Hedef seç + Hedef seçmek için buraya tıklayın + Seçilen hedefe yazılamadı + Lütfen bir hedef seçin + Kaynak ve hedef aynı olamaz + Dosyalar kopyalanamadı + Kopyalanıyor… + Dosyalar başarıyla kopyalandı + Dosya başarıyla kopyalandı + Bir hata oluştu + Taşınıyor… + Dosyalar başarıyla taşındı + Dosya başarıyla taşındı + Bazı dosyalar taşınamadı + Bazı dosyalar kopyalanamadı + Hiçbir dosya seçilmedi + Kaydediliyor… + %s klasörü oluşturulamıyor + %s dosyası oluşturulamıyor + Yeni öge bulunamadı + Hedef yeterli alana sahip değil.\nGereken %1$s, kullanılabilir %2$s + Dosya ve klasörleri seçmek için sistem hizmeti kullanılamıyor + + Yeni oluştur + Klasör + Dosya + Yeni klasör oluştur + Bu ada sahip bir dosya veya klasör zaten var + Ad, geçersiz karakterler içeriyor + Lütfen yeni bir ad girin + Bilinmeyen bir hata oluştu + + \"%s\" dosyası zaten var + \"%s\" dosyası zaten var. Üzerine yazılsın mı? + \"%s\" klasörü zaten var + Birleştir + İkisini de sakla + Üzerine yaz + Atla + \'_1\' ile ekle + Tümüne uygula + Sistem bu klasörde işlem yapmaya izin vermiyor, lütfen başka bir tane seçin + Sistem bu klasöre kopyalamaya izin vermiyor, lütfen başka bir tane seçin + Sistem bu klasörde yeniden adlandırmaya izin vermiyor + Dahili depolama alanındaki klasörler doğrudan yeniden adlandırılamıyor, yalnızca alt klasörler yeniden adlandırılabilir + Bu klasör yeniden adlandırılamıyor + + Bir klasör seç + Bir dosya seç + Harici depolama erişimini onayla + Klasör erişimini onayla + Yazma erişimi vermek için lütfen bir sonraki ekranda SD kartın kök klasörünü seçin + SD kartı görmüyorsanız, bunu deneyin + Lütfen alttaki \'Bu klasörü kullan\' seçeneğine basarak uygulamanın seçilen depolama alanına erişmesine izin verin. + Lütfen alttaki \'<b>Bu klasörü kullan</b>\' seçeneğine basarak bir sonraki ekranda \'<b>%s</b>\' erişimine izin verin. + Yeni klasörü oluşturmak için lütfen sonraki ekranın altındaki \'<b>Kaydet</b>\' düğmesine basın. + Seçimi onayla + Yükleniyor… + Lütfen uygulamamızın tüm dosyalarınıza erismesine izin verin, bu olmadan iyi çalışmayabilir. + + %d öge + %d öge + + + + %d öge + %d öge + + + %d öge siliniyor + %d öge siliniyor + + + + %d kişi + %d kişi + + + Depolama seç + Depolama + Dahili + SD Kart + Kök + Yanlış klasör seçildi, lütfen SD kartınızın kök klasörünü seçin + SD kart ve USB aygıt yolları aynı olamaz + Uygulama, uygulama widget\'larını kullanılamaz hale getiren bir SD karta kurulmuş görünüyor. Onları mevcut widget\'lar listesinde bile görmeyeceksiniz. Bu bir sistem sınırlamasıdır, bu yüzden widget\'ları kullanmak istiyorsanız, uygulamayı dahili depolama birimine geri taşımalısınız. + Yanlış klasör seçildi, lütfen \'%s\' yolunu seçin + + Özellikler + Yol + Seçilen ögeler + Alt öge sayısı + Toplam dosya sayısı + Çözünürlük + Süre + Sanatçı + Albüm + Odak uzaklığı + Pozlama süresi + ISO hızı + Diyafram + Kamera + EXIF + Şarkı başlığı + GPS koordinatları + Rakım + EXIF\'i kaldır + GPS koordinatları, kamera modeli vb. EXIF değerlerini kaldırmak istediğinizden emin misiniz\? + EXIF değerleri başarıyla kaldırıldı + + Arka plan rengi + Metin rengi + Ana renk + Beyaz temanın vurgu rengi + Siyah & Beyaz temanın aksan rengi + Ön plan rengi + Uygulama simgesi rengi + Alt gezinti çubuğu rengi + Öntanımlı değerleri geri yükle + Öntanımlıyı kullan + Öntanımlı + Rengi değiştir + Tema + Bir rengin değiştirilmesi, Özel temaya geçilmesini sağlayacaktır + Kaydet + Çık + Değişiklikleri geri al + Değişikliklerinizi geri almak istediğinizden emin misiniz? + Bu eylem geri alınamaz. + Kaydedilmemiş değişiklikleriniz var. Çıkmadan önce kaydedilsin mi? + Tüm Basit Uygulamalara renk uygula + UYARI: Bazı başlatıcılar uygulama simgesi özelleştirmesini düzgün kullanamıyor. Simgenin kaybolması durumunda, uygulamayı Google Play\'den veya varsa bir widget kullanarak başlatmayı deneyin. Başlatıldıktan sonra, sadece öntanımlı turuncu simgeyi #F57C00 geri ayarlayın. En kötü durumda uygulamayı yeniden kurmanız gerekebilir. + "Renkler başarıyla güncellendi. 'Paylaşılan' adlı yeni bir Tema eklendi, lütfen gelecekte tüm uygulama renklerini güncellemek için onu kullanın." + Pro uygulama sürümünü kullanıyor olsanız bile, teknik nedenlerden dolayı yine de Basit Teşekkürler\'e ihtiyacınız olduğunu unutmayın. Renk eşzamanlamasını o yapar. + + Basit Teşekkürler\'i satın alın. Teşekkürler! + ]]> + + + Aydınlık + Karanlık + Otomatik + Otomatik açık / koyu + Güneşte kalmış + Koyu Kırmızı + Beyaz + Siyah & Beyaz + Özel + Paylaşılan + Sistem öntanımlı değeri + + Yenilikler + * yalnızca büyük güncellemeler burada listelenmiştir; daima bazı küçük geliştirmeler de vardır + + Sil + Kaldır + Yeniden adlandır + Paylaş + Şununla paylaş + Yeniden boyutlandır + Tümünü seç + Metin seç + Gizle + Göster + Klasörü gizle + Klasörü göster + Geçici olarak gizliyi göster + Gizli medyayı göstermeyi bırak + Bu kadar çok içeriği bir kerede paylaşamazsınız + Geri Dönüşüm Kutusu\'nu boşalt ve devre dışı bırak + Geri al + Yinele + Yazdır + Yazdır (Pro) + Kısayol + Kısayol oluştur + Kısayol oluştur (Pro) + Kişiye numara ekle + İletişim bilgilerini görüntüle + SIM 1\'den ara + SIM 2\'den ara + Dosya adı görünürlüğünü aç/kapat + Üste taşı + Alta taşı + Ögeyi sabitle + Ögenin sabitlemesini kaldır + SMS gönder + E-posta gönder + Ara + Kişi bilgileri + Kişi ekle + Duvar kağıtları + + Sıralama ölçütü + Ad + Boyut + Son değiştirilme + Oluşturma tarihi + Alınan tarih + Başlık + Dosya adı + Uzantı + Rastgele + Rastgele sırala + Artan + Azalan + Yalnızca bu klasör için kullan + Sayısal parçaları gerçek değere göre sırala + Adı + Göbek adı + Soyadı + Tam adı + Özel sıralama kullan + Düzeni değiştir + + Silme işlemine devam etmek istediğinizden emin misiniz? + %s gerçekten silinsin mi? + Delete %s? + + %s gerçekten Geri Dönüşüm Kutusuna taşınsın mı? + + Bu ögeyi silmek istediğinizden emin misiniz? + Bu ögeyi Geri Dönüşüm Kutusu\'na taşımak istediğinizden emin misiniz? + Bu oturumda tekrar sorma + Tekrar gösterme + Evet + Hayır + Belki + + UYARI: %d klasör siliyorsunuz + UYARI: %d klasör siliyorsunuz + + + PIN + PIN\'i gir + Lütfen PIN\'i girin + Yanlış PIN + PIN\'i tekrar gir + Desen + Deseni çiz + Yanlış desen + Deseni tekrar çiz + Biyometri + Parmak izi + Parmak izi ekle + Lütfen parmağınızı parmak izi sensörüne yerleştirin + Biyometrik kimlik doğrulama iletişim kutusunu aç + Kimlik doğrula + Kimlik doğrulama başarısız + Kimlik doğrulama engellendi, lütfen birazdan tekrar deneyin + Parmak iziniz kayıtlı değil, lütfen aygıtınızın Ayarlar bölümünden ekleyin + Ayarlar\'a git + Parola kurulumu başarıyla yapıldı. Unutursanız lütfen uygulamayı yeniden yükleyin. + Koruma kurulumu başarıyla yapıldı. Sıfırlamayla ilgili sorun olursa lütfen uygulamayı yeniden yükleyin. + Klasörü kilitle + Klasörü kilitle (Pro) + Klasörün kilidini aç + Bu koruma yalnızca bu uygulamada çalışır, gerçek bir sistem çapında klasör şifrelemesinin yerini almaz. + + Dün + Bugün + Yarın + Her gün + Yılı gizle + saniye + dakika + saat + gün + sn + dk + sa + wk. + + %d saniye + %d saniye + + + %d dakika + %d dakika + + + %d saat + %d saat + + + %d gün + %d gün + + + %d hafta + %d hafta + + + %d ay + %d ay + + + %d yıl + %d yıl + + + + %d saniye + %d saniye + + + %d dakika + %d dakika + + + %d saat + %d saat + + + %d gün + %d gün + + + %d hafta + %d hafta + + + %d ay + %d ay + + + %d yıl + %d yıl + + + + %d saniye önce + %d saniye önce + + + %d dakika önce + %d dakika önce + + + %d saat önce + %d saat önce + + + %d gün önce + %d gün önce + + + %d hafta önce + %d hafta önce + + + %d ay önce + %d ay önce + + + %d yıl önce + %d yıl önce + + + + %d saniye + %d saniye + + + %d dakika + %d dakika + + + %d saat + %d saat + + + %d gün + %d gün + + + %d hafta + %d hafta + + + %d ay + %d ay + + + %d yıl + %d yıl + + + Alarmın çalmasına şu kadar kaldı:\n%s + Hatırlatıcı tetiklenene kadar kalan süre:\n%s + Kalan süre:\n%s + Lütfen alarma güvenmeden önce düzgün çalıştığından emin olun. Pil tasarrufu ile ilgili sistem kısıtlamaları nedeniyle yanlış davranabilir. + Lütfen hatırlatıcılara güvenmeden önce düzgün çalıştıklarından emin olun. Pil tasarrufu ile ilgili sistem kısıtlamaları nedeniyle yanlış davranabilirler. + Bu uygulamanın bildirimleri devre dışı. Lütfen bunları etkinleştirmek için aygıt ayarlarınıza gidin. + + Alarm + Ertele + Kapat + Hatırlatma yok + Başlangıçta + Sistem sesleri + Sesleriniz + Yeni bir ses ekle + Ses yok + Gün boyunca ss:dd + Gün boyunca %02d:%02d + + Ayarlar + Basit Teşekkürler\'i Satın Al + Genel + Renk özelleştirme + İyileştirilmiş renk özelleştirmesi + Renkleri özelleştir + Renkleri özelleştir (Kilitli) + Kilitli + Widget renklerini özelleştir + Bildirimleri özelleştir + Notification sound + İngilizce dilini kullan + Dil + Gizli ögeleri göster + Yazı tipi boyutu + Küçük + Orta + Büyük + Çok büyük + Gizli öge görünürlüğünü parola ile koru + Tüm uygulamayı parola ile koru + Parola korumalı dosya silme ve taşıma + Dosya işlemlerinde eski son değiştirme değerini koru + Kaydırma çubuğunu sürükleyerek ögeleri kaydırırken bilgi balonunu göster + Uygulama ön plandayken telefonun uykuya geçmesini önle + Her zaman silme onayı penceresini atla + Üstten yenilemek için çekmeyi etkinleştir + 24 saat biçimini kullan + Tarih ve saat biçimini değiştir + Pazar günü hafta başlangıcı + Widget\'lar + Her zaman aynı erteleme süresini kullan + Erteleme süresi + Düğmeye basıldığında titret + Ögeleri silmek yerine Geri Dönüşüm Kutusuna taşı + Geri Dönüşüm Kutusu temizleme süresi + Geri Dönüşüm Kutusunu boşalt + Dikey modu zorla + Ayarları dışa aktar + Ayarları içe aktar + Ayarlar başarıyla dışa aktarıldı + Ayarlar başarıyla içe aktarıldı + Soyadı ile başla + Önbelleği temizle + Arama başlatmadan önce arama onayı penceresi göster + + Görünürlük + Güvenlik + Kaydırma + Dosya işlemleri + Geri Dönüşüm Kutusu + Kaydetme + Başlangıç + Metin + Geçiş + Kalite + Ana ekran + Küçük resimler + Liste görünümü + + Hariç tut + Klasörü hariç tut + Hariç tutulan klasörler + (hariç) + Hariç tutulan klasörleri yönet + Tümünü kaldır + Tüm klasörler hariç tutulanlar listesinden kaldırılsın mı\? Bu klasörleri silmez. + Hariç tutulanları geçici olarak göster + Hariç tutulanları göstermeyi durdur + + Gösterilen sekmeleri yönet + Uygulama başlatıldığında açılacak sekme + Kişiler + Favoriler + Arama Geçmişi + Gruplar + Son kullanılan + Dosyalar + Son Dosyalar + + Bu dosyayı geri yükle + Seçilen dosyaları geri yükle + Tüm dosyaları geri yükle + Geri Dönüşüm Kutusu başarıyla boşaltıldı + Dosyalar başarıyla geri yüklendi + Geri Dönüşüm Kutusu\'nu boşaltmak istediğinizden emin misiniz? Dosyalar kalıcı olarak kaybolacak. + Geri Dönüşüm Kutusu boş + Geri Dönüşüm kutusu ögelerini taşıma devre dışı, lütfen Geri Yükle\'yi kullanın + Geri Dönüşüm Kutusunu göster + Geri Dönüşüm Kutusunu gizle + Geri Dönüşüm Kutusunu aç + Geri dönüşüm kutusunu atla, dosyaları doğrudan sil + + %d öge Geri Dönüşüm Kutusu\'na taşınıyor + %d öge Geri Dönüşüm Kutusu\'na taşınıyor + + + İçe aktarılıyor… + Dışa aktarılıyor… + İçe aktarma başarılı + Dışa aktarma başarılı + İçe aktarılamadı + Dışa aktarılamadı + Bazı ögeler içe aktarılamadı + Bazı ögeler dışa aktarılamadı + İçe aktarılacak öge bulunamadı + İçe aktarılacak yeni öge bulunamadı + Dışa aktarılacak öge bulunamadı + Yedeklemeler + Otomatik yedeklemeleri etkinleştir + Otomatik yedeklemeleri yönet + Dosyanızı otomatik olarak adlandırmak için aşağıdaki desenleri kullanabilirsiniz: +\n +\n%Y - yıl +\n%M - ay +\n%D - gün +\n%h - saat +\n%m - dakika +\n%s - saniye + + USB + Aygıtınıza takılı bir USB aygıtınız var gibi görünüyor. Dosyalarının düzgün görünmesini sağlamak için ek izinler vermeniz gerekiyor. + Erişim vermek için lütfen bir sonraki ekranda USB aygıtının kök klasörünü seçin + Yanlış klasör seçildi, lütfen USB aygıtınızın kök klasörünü seçin + + Ocak + Şubat + Mart + Nisan + Mayıs + Haziran + Temmuz + Ağustos + Eylül + Ekim + Kasım + Aralık + + Oca + Şub + Mar + Nis + May + Haz + Tem + Ağu + Eyl + Eki + Kas + Ara + + Ocak ayında + Şubat ayında + Mart ayında + Nisan ayında + Mayıs ayında + Haziran ayında + Temmuz ayında + Ağustos ayında + Eylül ayında + Ekim ayında + Kasım ayında + Aralık ayında + Pazartesi + Salı + Çarşamba + Perşembe + Cuma + Cumartesi + Pazar + P + S + Ç + P + C + C + P + Pzt + Sal + Çar + Per + Cum + Cmt + Paz + + Uygulama sürümünüz artık güncellenmeyecek. Yeni düzeltmeler ve diğer iyileştirmeleri almak için lütfen Pro sürümüne yükseltin. + Uygulama sürümünüz artık güncellenmeyecek. Buraya tıklayarak yeni düzeltmeler ve diğer iyileştirmeleri almak için lütfen Pro sürümüne yükseltin. + Şu süre kadar ücretsiz: %s. O zamana kadar indirirseniz, sonsuza dek ücretsiz olarak kullanabileceksiniz. + Daha fazla bilgi + Yükselt + Yerel olarak depolanan etkinlikleri bir .ics dosyasına dışa aktarıp ardından içe aktarma yoluyla el ile geçirmeniz gerekir. Her iki dışa aktarma/içe aktarma düğmelerini ana ekran menüsünde bulabilirsiniz. + Merhaba, +\n +\nGörünüşe göre ücretsiz sürümden yeni yükseltme yaptınız. Bu sürümden memnun kaldığınızda ve belki de ayarlarınızı ve favorilerinizi taşıdığınızda, artık ihtiyacınız olmayacağı için yanlışlıkla başlatmaktan kaçınmak için eski ücretsiz sürümü kaldırabilirsiniz. +\n +\nTeşekkürler! + Merhaba, +\n +\nGörünüşe göre zaten Pro uygulama sürümüne de sahipsiniz. Bundan memnun kaldığınızda ve belki ayarlarınızı ve favorilerinizi taşıdığınızda, artık ihtiyacınız olmayacağı için yanlışlıkla başlatmaktan kaçınmak için bunu kaldırabilirsiniz. +\n +\nTeşekkürler! + Merhaba, +\n +\nGörünüşe göre ücretsiz sürümden yeni yükseltme yaptınız. Bundan memnun olduğunuzda ve belki de verilerinizi aktardığınızda, artık ihtiyacınız olmayacağı için yanlışlıkla başlatılmasını önlemek için eski ücretsiz olanı kaldırabilirsiniz. +\n +\nTeşekkürler! + Merhaba, +\n +\nGörünüşe göre zaten Pro uygulama sürümüne de sahipsiniz. Bundan memnun olduğunuzda ve belki de verilerinizi taşıdığınızda, artık ihtiyacınız olmayacağı için yanlışlıkla başlatmaktan kaçınmak için bunu kaldırabilirsiniz. +\n +\nTeşekkürler! + Merhaba, +\n +\nGörünüşe göre ücretsiz sürümden yeni yükseltme yaptınız. Yerel olarak depolanan etkinliklerinizi taşımak istiyorsanız, ücretsiz uygulama sürümünde bunları bir .ics dosyasına aktararak ve üst menüden buraya aktararak bunu elle yapmanız gerekir. +\n +\nPro sürümdeki kurulumunuzdan memnun olduğunuzda, artık ihtiyacınız olmayacağı için eski ücretsiz sürümü kaldırabilirsiniz. +\n +\nTeşekkürler! + Merhaba, +\n +\nGörünüşe göre ücretsiz sürümden yeni yükseltme yaptınız. \"%s\" altında kayıtlı kişileriniz varsa, ücretsiz uygulama sürümünde bunları bir .vcf dosyasına aktararak ve üst menüden buraya aktararak bunu elle yapmanız gerekir. +\n +\nPro sürümdeki kurulumunuzdan memnun olduğunuzda, artık ihtiyacınız olmayacağı için eski ücretsiz sürümü kaldırabilirsiniz. +\n +\nTeşekkürler! + Merhaba, +\n +\nGörünüşe göre ücretsiz sürümden yeni yükseltme yaptınız. Notlarınızı taşımak istiyorsanız, ücretsiz uygulama sürümünde bunları bir dosyaya aktararak ve üst menüden buraya aktararak bunu elle yapmanız gerekir. +\n +\nPro sürümdeki kurulumunuzdan memnun olduğunuzda, artık ihtiyacınız olmayacağı için eski ücretsiz sürümü kaldırabilirsiniz. +\n +\nTeşekkürler! + + Hakkında + Web sitesi + Kaynak kodları için ziyaret edin + Görüşlerinizi veya önerilerinizi şuraya gönderin: + Pro\'ya Yükselt + Daha fazla uygulama + Diğer uygulamalarımız + Arkadaşlarınızı davet edin + Selam, %1$s adlı harika bir uygulama buldum. %2$s adresinden indir + Şununla davet et + Bizi değerlendirin + Oyla + Bağış yap + Bizi takip edin + v %1$s\nTelif hakkı © Simple Mobile Tools %2$d + Destek + Bize yardım edin + Sosyal + Diğer + Gizlilik politikası + Sürüm %s + Merhaba :) + ❤️ ile Slovakya\'da yapıldı + Ek bilgiler + Uygulama sürümü: %s + Aygıt İS: %s + +
    + umarım uygulamadan memnunsunuzdur. Hiçbir reklam içermiyor, bu yüzden lütfen Basit Teşekkürler uygulamasını satın alarak geliştirmeyi destekleyip, bu pencerenin tekrar görünmesini de önleyin.

    + Teşekkürler! + ]]> +
    + Merhaba,<br><br> umarım uygulamadan memnunsunuzdur. Hiçbir reklam içermiyor ve verilerinizi de toplamıyoruz, lütfen <href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Basit Teşekkürler</a> uygulamasını satın alarak geliştirmeyi destekleyin. Ayrıca renk özelleştirme dahil tüm uygulama özelliklerinin kilidi açılacaktır.<br><br> Teşekkürler! + Lütfen <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Basit Teşekkürler</a> uygulamasını satın alarak bizi destekleyin, ayrıca renk özelleştirme dahil tüm uygulama özelliklerinin kilidi açılacaktır. + Satın al + Basit Telefon Sipariş Edin + Lütfen Basit Teşekkürler\'i son sürüme güncelleyin + Bir soru sormadan önce, lütfen uygulama ayarlarını gözden geçirin ve önce Sık Sorulan Sorular bölümünü okuyun. Belki çözüm oradadır. + Bize puan vermeden önce lütfen uygulama ayarlarını gözden geçirin ve önce Sık Sorulan Sorular bölümünü okuyun. Herhangi bir sorunuz varsa, belki çözüm oradadır. + Ayrıca uygulamanın en son sürümünü kullandığınızdan emin olun. + Ayrıca bu uygulama sürümünün artık geliştirilmediğini unutmayın, birçok iyileştirme için Pro sürümünü edinin. + Oku + SSS\'yi oku + Merhaba,\n\nzaten bir süredir bu uygulamayı kullanıyor gibi görünüyorsunuz ve gerçekten takdir ediyoruz.\n\nSizden bir iyilik isteyebilirsek, lütfen bizi Google Play\'de oylayın. Bu bize gerçekten çok yardımcı olacak.\n\nNasıl karar verirseniz verin, bu mesajı bir daha görmeyeceksiniz.\n\nTeşekkürler! + Lütfen uygulamamızı oylayın :) + Teşekkürler + Widget kilitli.\nKilidi açmak için lütfen Pro sürümüne yükseltin. + Bu özellik kilitlidir, lütfen tam uygulamanın kilidini açmak için <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Basit Teşekkürler</a> uygulamasını satın alın.<br><br>Bu yalnızca tek seferlik bir ödemedir ve memnun kalmazsanız geri ödeme yapabiliriz. + + +
    + kısa bir süre önce yeni uygulamamın yayınlandığını bilmenizi istiyorum:

    + %2$s

    + %4$s

    + %6$s

    + Başlığa basarak indirebilirsiniz.

    + Teşekkürler + ]]> +
    + Basit Uygulama Başlatıcı + Basit Hesap Makinesi + Basit Takvim + Basit Kamera + Basit Saat + Basit Kişiler + Basit Çevirici + Basit Çizim + Basit Dosya Yöneticisi + Basit Fener + Basit Galeri + Basit Klavye + Basit Başlatıcı + Basit Müzik Çalar + Basit Notlar + Basit SMS Messenger + Basit Teşekkürler + Basit Ses Kaydedici + Uygulama Başlatıcı + Hesap Makinesi + Takvim + Kamera + Saat + Kişiler + Çevirici + Çizim + Dosya Yöneticisi + Fener + Galeri + Klavye + Başlatıcı + Müzik Çalar + Notlar + SMS Messenger + Teşekkürler + Ses Kaydedici + + buradan orijinal sürümünü indirin. + ]]> + + + Sık sorulan sorular + Bir soru sormadan önce, lütfen şurayı okuyun: + Uygulamanın widget\'ını widget\'lar listesinde neden göremiyorum? + Büyük olasılıkla uygulamayı SD karta taşıdığınız içindir. Bu durumda verilen uygulama widget\'larını gizleyen bir Android sistem sınırlaması var. Tek çözüm, aygıt ayarlarınızı kullanarak uygulamayı Dahili Depolama birimine geri taşımaktır. + Seni desteklemek istiyorum ama para bağışlayamıyorum. Yapabileceğim başka bir şey var mı? + + bu sayfadadır veya herhangi bir sorunuz varsa hello@simplemobiletools.com adresinden bize ulaşın. + ]]> + + Bazı dosyaları yanlışlıkla sildim, onları nasıl kurtarabilirim? + Ne yazık ki, yapamazsınız. Onay penceresinden sonra dosyalar anında silinir, kullanılabilir çöp kutusu yoktur. + Widget renklerini beğenmedim, değiştirebilir miyim? + Evet, ana ekranınızda bir widget\'ı sürüklediğinizde, bir widget yapılandırma ekranı görünür. Sol alt köşede renkli kareler göreceksiniz, sadece yeni bir renk seçmek için onlara basın. Alfa\'yı da ayarlamak için kaydırıcıyı kullanabilirsiniz. + Bir şekilde silinen dosyaları geri yükleyebilir miyim? + Gerçekten silinmişlerse, yapamazsınız. Ancak, öntanımlı olarak etkinleştirilmiş bir Geri Dönüşüm Kutusu vardır, dosyaların silinmek yerine depoya taşınmasına neden olur. + Uygulama başlatıcısı simgesi kayboldu. Ne yapabilirim? + Başlatıcınızın, simge özelleştirmesini doğru şekilde desteklememesi nedeniyle ortaya çıkar. Uygulamayı Google Play\'den veya varsa bir widget aracılığıyla başlatmayı deneyin. Başlatıldıktan sonra, sadece öntanımlı turuncu simgeyi #F57C00 geri ayarlayın. En kötü durumda uygulamayı yeniden kurmanız gerekebilir. + Para banka hesabımdan düşüldü, ancak uygulamayı indiremiyorum. Ne yapabilirim? + Ödemeler tamamen Google tarafından işlenir, zaman zaman sistemleri aksar. Sadece Google Play uygulama önbelleğinizi temizleyin ve aygıtınızı yeniden başlatın, ardından yeniden indirmeyi deneyin. + Neden Pro sürümüne yükseltmeliyim? + Uygulama sürümünüz artık güncellenmediğinden, tespit ettiğiniz hatalar asla düzeltilmeyecektir. Ayrıca yeni işlevler eklenmeyecektir. Pro sürümünü Google Play\'den az miktarda para karşılığında satın alabilirsiniz. Bir kerelik ödeme, yani bir kez satın aldığınızda, bir daha asla ödeme yapmanız gerekmeyeceği anlamına gelir. Yeni bir aygıt aldıktan sonra bile. Pro sürümünü beğenmediyseniz, birkaç saat içinde kaldırabilirsiniz ve paranızı otomatik olarak geri alırsınız. Daha sonra istediğiniz zaman geri ödeme almak isterseniz, hello@simplemobiletools.com adresinden bizimle iletişime geçmeniz yeterlidir. + Aynı anda birden çok ögeyi nasıl seçebilirim? + Bunu yapmanın birçok yolu var. İlki, bir ögeye uzun süre basarak seçim modunu başlatmak, ardından diğerlerini seçmek için kısa tıklamaktır. İkinci yol, PC\'lerdeki ögeleri fareyle seçmeye benzer, yalnızca bir ögeye uzun basarak seçim modunu başlatın ve ardından parmağınızı aşağı doğru kaydırarak diğer ögelere sürükleyin. Birden fazla öge seçmenin üçüncü yolu, bir ögeye uzun süre basmak, ardından diğerine uzun basmaktır. Tüm ögeleri seçmek istiyorsanız, yalnızca bir ögeye uzun basın, ardından sol üst köşedeki seçili öge sayacına tıklayın. Bu, her şeyi seçecek veya seçimini kaldıracaktır. + Uygulamayı satın aldım ancak başka bir aygıta indiremiyorum. + Google Play uygulama önbelleğinizi temizlemeyi ve aygıtınızı yeniden başlatmayı deneyin. Bu, uygulamanın kendisiyle gerçekten ilgili olmayan bir Google Play sorunudur. + + Katkıda bulunanlar + Çeviri + Geliştirme + Diğer yardımlar + + bu sayfadadır veya herhangi bir sorunuz varsa hello@simplemobiletools.com adresinden bize ulaşın. + Tüm katkıda bulunanlara ve diğer destekçilere teşekkürler! + ]]> + + Arapça + Azerice + Bengalce + Bretonca + Bulgarca + Katalanca + Çekce + Galce + Danca + İngilizce + Almanca + Yunanca + İspanyolca + Baskça + Farsça + Fince + Fransızca + Galiçyaca + Hintçe + Hırvatça + Macarca + Endonezyaca + İtalyanca + İbranice + Japonca + Korece + Litvanyaca + Nepalce + Norveççe + Felemenkçe + Lehçe + Portekizce + Rumence + Rusça + Slovakça + Slovence + Sırpça + İsveççe + Tamilce + Türkçe + Ukraynaca + Vietnamca + Çince (Hong Kong) + Çince (Basitleştirilmiş) + Çince (Geleneksel) + + Pro sürümünü şimdi alın! + Temel + Pro + Reklamsız + İnternet erişimi yok + %100 Para İadesi Garantisi + Tek seferlik ödeme + Geliştirilmiş tasarım + + Gelişmiş fotoğraf düzenleyici + Gelişmiş fotoğraf ve video düzenleyici + HEIC/HEIF dosya desteği + Gelişmiş toplu dosya adlandırma + Kişisel klasör kilidi + Yazıcı desteği + + Zaman dilimi desteği + Toplantı ve e-posta hatırlatıcıları + Kolay etkinlik ekleme + Yeni widget\'lar + + Rehberde tekrarlanan kişilerin birleştirilmesi + Metin boyutu kişiselleştirme + Uygulamalarımız arasında tercihe bağlı rehber bilgileri paylaşma + Özelleştirilebilir kişi zil sesleri + Kişi filtreleme + Özel olarak saklanan kişiler + + Yapılacaklar listeleri + Her araç için farklı not ve renkler + Not kilitleme + + Saat ve tarih biçimini kişiselleştirme + Ana sayfada kısayollar + Dosya sıkıştırma desteği + Son dosyaların bulunduğu sekme + + Arka plan renklerini kişiselleştirme + Dosya ekleme desteği + Yakınlaştırma + + Bu uygulama hayatımı kolaylaştırmak için aşağıdaki üçüncü taraf kitaplıklarını kullanır. Teşekkürler. + Üçüncü taraf lisansları + Kotlin (programlama dili) + Subsampling Scale Image View (yakınlaştırılabilir görüntü görünümleri) + Glide (görüntü yükleme ve önbellekleme) + Picasso (görüntü yükleme ve önbellekleme) + Android Image Cropper (görüntü kırpma ve döndürme) + RtlViewPager (sağdan sola kaydırma) + Joda-Time (Java tarih değiştirme) + Stetho (hata ayıklama veritabanları) + Otto (etkinlik veri yolu) + PhotoView (yakınlaştırılabilir GIF\'ler) + PatternLockView (desen koruması) + Reprint (parmak izi koruması) + Gif Drawable (GIF\'leri yükleme) + AutoFitTextView (metin boyutunu değiştirme) + Robolectric (test çerçevesi) + Espresso (test yardımcısı) + Gson (JSON ayrıştırıcısı) + Leak Canary (bellek sızıntısı dedektörü) + Number Picker (özelleştirilebilir numara seçici) + ExoPlayer (video oynatıcı) + VR Panorama View (panorama görüntüleme) + Apache Sanselan (görüntü meta verileri okuma) + Android Photo Filters (görüntü filtreleri) + Gesture Views (yakınlaştırılabilir görüntüler) + Indicator Fast Scroll (kaydırma çubuğundaki harfler) + Event Bus (uygulama içi iletişim) + Audio Record View (ses görselleştirme) + SMS MMS (SMS ve MMS yönetimi) + APNG Android (hareketli WebP desteği) + PDFViewPager (PDF görüntüleyici) + M3U Ayrıştırıcı (m3u çalma listesi dosyası işleme) + AndroidLame (mp3 kodlayıcı) + + Deneme süresi sona erdi + Deneme sürümünü başlat + Deneme süreniz yakında sona eriyor. + Son bir gün için uygulamanın kilidini aç + %s uygulamasına hoş geldiniz! + Uygulamamızı kullandığınız için teşekkür ederiz. Bu kilitsiz sürümü %d gün kullanabilirsiniz. Deneme sürümü sona erdiğinde, lütfen Pro sürümüne yükseltmeyi düşünün. Çok sayıda yeni özelliğe, modern tasarıma, reklamsız kullanıma ve diğer birçok iyileştirmeye sahiptir. +\n +\nBunun için yalnızca bir kez ödeme yapmanız yeterlidir, memnun kalmazsanız kaldırabilir ve geri ödeme alabilirsiniz. +\n +\nUmarım beğenirsiniz :) + Uygulamanın keyfini sonuna kadar çıkarmak için lütfen Pro sürümüne yükseltin. +\n +\nYalnızca bir kez ödeme yapmanız yeterlidir, memnun kalmazsanız kaldırabilir ve geri ödeme alabilirsiniz. +\n +\nOrada görüşürüz :) + + Deneme süreniz %d gün içinde sona erecektir. + Deneme süreniz %d gün içinde sona erecek. + + + Kullanımdan kaldırıldı: Uygulamanın bu sürümü artık sağlanmıyor, Pro sürümünü şuradan indirin: https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Ücretli herhangi bir uygulamayı 2 saat içinde kaldırırsanız, otomatik olarak iade edileceğini unutmayın. İstediğiniz zaman geri ödeme almak isterseniz, hello@simplemobiletools.com adresinden bizimle iletişime geçmeniz yeterli olacaktır. Bu denemeyi kolaylaştırır :) + + Özelleştirilebilir widget\'lara sahip, reklamlar ve gereksiz izinler içermeyen bir grup basit, açık kaynaklı Android uygulaması. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-uk/strings.xml b/commons/src/main/res/values-uk/strings.xml new file mode 100644 index 000000000..c7c7d282f --- /dev/null +++ b/commons/src/main/res/values-uk/strings.xml @@ -0,0 +1,1193 @@ + + + OK + Скасувати + Назад + Нічого + Пізніше + Зберегти як + Файл успішно збережено + Недопустимий формат файлу + Недостатньо пам\'яті + Сталася помилка: %s + Error: %s + Відкрити за допомогою + Редагувати за допомогою + Редагувати + Не знайдено допустимих додатків + Браузер не знайдено + Поштовий клієнт не знайдено + Встановити як + Копіювати у буфер обміну + Копіювати номер у буфер обміну + Значення скопійовано у буфер обміну + Значення скопійовано у буфер обміну:\n%s + Набрати номер + Невідомо + Завжди + Ніколи + Подробиці + Нотатки + Видалення теки \'%s\' + Нічого + Позначка + Прозорий + Колір прозорості + Обрати інший колір + Завантажити + Повідомлення + Notifications + E-mail + Попередній + Відтворення / Пауза + Наступний + Номер + Контактів не знайдено + Запит на необхідні дозволи + Додаток не має доступу до контактів + Додаток не має дозволу ініціювати телефонні дзвінки, будь ласка, надайте його в налаштуваннях пристрою + Вставте текст сюди + Телефонувати %s + Підтвердити виклик %s + Zero + One + Два + Три + Чотири + П\'ять + Шість + Сім + Вісім + Дев’ять + Значення + Значення не може бути порожнім + Створити новий контакт + Додати до існуючого контакту + Застосунок пошкоджено + Застереження + Зробити світлину + Обрати світлину + Виберіть відео + Виберіть контакт + Виберіть файл + Запис аудіо + Запис відео + Триває оновлення… + Пам\'ять пристрою + Пам\'ять пристрою (прихована від інших застосунків) + Audio + + День народження + Річниця + + Домашній + Робочий + + Мобільний + Основний + Робочий факс + Домашній факс + Пейджер + Номер не знайдено + + Змінити тип перегляду + Сітка + Сітка (Pro) + Нерівна сітка + Список + Збільшити кількість колонок + Зменшити кількість колонок + Кількість стовпців + Кількість портретних стовпців + Альбомна кількість стовпців + Змінити обкладинку + Вибрати світлину + + %d стовпець + %d стовпці + %d стовпців + %d стовпців + + + Керувати блокованими номерами + Немає блокованих номерів. + Додати номер до блокованих + Блокувати номер + Блокувати номери + Заблоковані номери + Експортувати заблоковані номери + Імпортувати заблоковані номери + Щоб використовувати функцію блокування номерів, вам необхідно встановити цей додаток як стандартний для роботи з контактами. + Встановити додаток як стандартний + Ви впевнені що хочете заблокувати \"%s\"? + Блокувати дзвінки від не збережених контактів + Блокувати повідомлення від не збережених контактів + Введіть номер або шаблон (наприклад, *12345*, +1*8888), щоб заблокувати всі дзвінки та повідомлення з номерів, що відповідають шаблону. + Неможливо заблокувати невідомі номери без дозволу ідентифікатора абонента. + + Улюблене + Додати улюблене + Додати до улюбленого + Видалити з улюбленого + + Пошук + Пошук в %s + Введіть принаймні 2 символи, щоб почати пошук. + Пошук контактів + Пошук улюблених + Пошук застосунків + Пошук подій + Пошук груп + Пошук історії + Пошук дзвінків + Пошук файлів + Пошук папок + Пошук файлів та папок + Пошук плейлистів + Пошук артистів + Пошук альбомів + Пошук треків + Пошук тексту + Пошук розмов + Пошук записів + + Фільтр + Фільтр (Pro) + Нічого не знайдено. + Змінити фільтр + + Необхідний дозвіл на доступ до внутрішньої пам\'яті + Необхідний дозвіл на доступ до контактів + Необхідний дозвіл на доступ до камери + Необхідний дозвіл на доступ до аудіо + Без дозволу + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Перейменувати файл + Перейменувати теку + Не вдалося перейментувати файл + Не вдалося перейментувати теку + Ім\'я теки не може бути порожнім + Тека з таким іменем вже існує + Не можна перейменувати кореневу теку внутрішньої пам\'яті + Теку успішно перейменовано + Перейменування теки + Ім\'я файлу не може бути порожнім + Ім\'я файлу містить недопустимі символи + Ім\'я файлу \'%s\' містить недопустимі символи + Розширення не може бути порожнім + Вихідний файл %s не існує + Префікс імен файлів + Суфікс імен файлів + Просте перейменування + Шаблон + Рядок для додавання + %Y - рік\n%M - місяць\n%D - день\n%h - година\n%m - хвилина\n%s - секунда\n%i - номер від 1 + Ім\'я файлу (без .txt) + Ім\'я файлу (без .json) + Ім\'я файлу (без .zip) + Починаючи з Android 11, ви більше не можете приховувати такі файли та теки + + Копіювати + Перемістити + Копіювати / Перемістити + Копіювати до + Перемістити до + Джерело + Місце призначення + Обрати місце призначення + Натисніть тут, щоб обрати місце призначення + Не вдалося записати в обране місце призначення + Оберіть місце призначення + Джерело та місце призначення не можуть співпадати + Не вдалося скопіювати файли + Триває копіювання… + Файли успішно скопійовано + Файл успішно скопійовано + Сталася помилка + Триває переміщення… + Файли успішно переміщено + Файл успішно переміщено + Деякі файли не можуть бути переміщені + Деякі файли не можуть бути скопійовані + Не обрано жодного файлу + Триває збереження… + Не вдалося створити теку %s + Не вдалося створити файл %s + Не знайдено нових елементів + Місце призначення не має достатньо вільного місця.\nНеобхідно %1$s, доступно %2$s + Системна служба для вибору файлів і тек недоступна + + Створити новий + Теку + Файл + Створити нову теку + Файл або тека з таким іменем вже існує + Ім\'я містить недопустимі символи + Введіть ім\'я + Сталася невідома помилка + + Файл \"%s\" вже існує + Файл \"%s\" вже існує. Перезаписати? + Тека \"%s\" вже існує + Об\'єднати + Зберегти обидва + Перезаписати + Пропустити + Додати \'_1\' в кінець + Застосувати до усіх + Система не дозволяє операцію в цій теці, будь ласка, виберіть іншу + Система не дозволяє копіювати в цю теку, будь ласка, виберіть іншу + Система не дозволяє перейменовувати в цій теці + Не можна перейменувати теки безпосередньо у внутрішній пам\'яті, лише у вкладених теках + Не вдається перейменувати цю теку + + Обрати теку + Обрати файл + Підтвердити дозвіл на доступ до зовнішньої пам\'яті + Підтвердити доступ до теки + Щоб надати доступ на запис, оберіть кореневу теку SD-карти на наступному екрані + Якщо ви не бачите SD-карту, спробуйте це + Будь ласка, дозвольте додатку отримати доступ до вибраного сховища на наступному екрані, натиснувши \"Використовувати цю теку\" внизу. + Будь ласка, дозвольте доступ до \'%s\' на наступному екрані, натиснувши \'Використовувати цю теку\' внизу. + Будь ласка, натисніть \'Зберегти\' внизу наступного екрана, щоб створити нову теку. + Підтвердіть вибір + Завантаження… + Будь ласка, надайте даному додатку доступ до ваших файлів, без цього він може несправно працювати. + + %d елемент + %d елемента + %d елементів + %d елементів + + + + %d елемент + %d елемента + %d елементів + %d елементів + + + Видалення %d елементу + Видалення %d елементів + Видалення %d елементів + Видалення %d елементів + + + + %d контакт + %d контакти + %d контактів + %d контактів + + + Обрати пам\'ять + Сховище + Внутрішня + SD-карта + Корінь + Обрано невірну теку. Оберіть кореневу теку вашої SD-карти + Шляхи до SD-карти та USB-пристрою не можуть співпадати + Схоже, ви встановили додаток на SD-карту, що робить віджети додатка недоступними. Ви навіть не побачите їх у списку доступних віджетів. + Це обмеження системи, тож якщо ви хочете використовувати віджети, вам треба перемістити додаток до внутрішньої пам\'яті. + Вибрано неправильну теку, будь ласка, виберіть \'%s\' + + Властивості + Шлях + Обрані елементи + Кількість вкладених елементів + Загальна кількість файлів + Роздільна здатність + Тривалість + Виконавець + Альбом + Фокальна відстань + Час експозиції + Світлочутливість за ISO + Діафрагмове число + Камера + EXIF + Назва пісні + GPS координати + Висота над рівнем моря + Видалити EXIF + Ви впевнені, що хочете видалити значення EXIF, як-от координати GPS, модель камери тощо\? + Значення EXIF успішно видалено + + Колір фону + Колір тексту + Первинний колір + Колір акцента білої теми + Колір акцента чорно-білої теми + Колір переднього плану + Колір піктограми додатка + Колір нижньої навігаційної панелі + Відновити стандартні параметри + Використовувати типово + Типово + Змінити колір + Тема + Зміна кольору увімкне Користувацьку тему + Зберегти + Відмовитися + Скасувати зміни + Ви впевнені, що хочете скасувати зміни? + Цю дію неможливо скасувати. + Ви маєте незбережені зміни. Зберегти перед виходом? + Застосувати кольори до усіх додатків Simple Apps + УВАГА: Деякі лончери некоректно опрацьовують зміну піктограми додатків. Якщо піктограма додатка зникне, спробуйте запустити його через Google Play або віджет, якщо доступний. + Після запуску просто поверніть стандартний колір піктограми: #F57C00. У найгіршому випадку вам доведеться перевстановити додаток. + Кольори успішно оновлено. Було додано нову тему під назвою \'Загальна\', використовуйте її для оновлення кольорів усіх додатків у майбутньому. + Зауважте, що хоча ви користуєтеся версією Pro додатка, вам необхідний додаток Просто Подяка з технічних причин. Він подбає про синхронізацію кольору. + Будь ласка, придбайте <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Просту Подяку</a>, щоб розблокувати цю функцію і підтримати розробку. Дякую! + + Світла + Темна + Auto + Автоматично світла/темна + Солярис + Темно-червоний + White + Чорний & Білий + Користувацька + Загальна + System default + + Що нового + * тут перераховані тільки великі оновлення, але завжди є менші покращення + + Видалити + Перемістити + Перейменувати + Поділитися + Поділитися через + Змінити розмір + Обрати все + Обрати текст + Приховати + Показати + Приховати теку + Показати теку + Тимчасово показати приховане + Припинити показ прихованих медіа + Не можна поширити так багато контенту за раз + Спорожнити та вимкнути Кошик + Повернути + Повторити + Друкувати + Друкувати (Pro) + Shortcut + Створити посилання + Створити посилання (Pro) + Додати номер до контактів + Переглянути деталі контакту + Виклик з SIM 1 + Виклик з SIM 2 + Перемкнути відображення імені файлу + Перемістити наверх + Перемістити вниз + Pin item + Відкріпити елемент + Надіслати SMS + Send email + Виклик + Contact details + Add contact + Шпалери + + Сортувати за + Ім\'я + Розмір + Остання зміна + Дата створення + Дата зйомки + Заголовок + Ім\'я файла + Розширення + Випадково + Сортувати випадково + За зростанням + За спаданням + Використовувати тільки для цієї теки + Сортувати за значенням числової частини + Ім\'я + По-батькові + Прізвище + Повне ім\'я + Сортувати власноруч + Змінити порядок + + Ви впевнені, що хочете продовжити видалення? + Ви впевнені, що хочете видалити %s? + Delete %s? + + Ви впевнені, що хочете перемістити %s у Кошик? + + Ви впевнені, що хочете видалити цей елемент? + Ви впевнені, що хочете перемістити цей елемент у Кошик? + Більше не питати у цій сесії + Не показувати знову + Так + Ні + Можливо + + УВАГА: Ви видаляєте %d теку + УВАГА: Ви видаляєте %d теки + УВАГА: Ви видаляєте %d тек + УВАГА: Ви видаляєте %d тек + + + PIN + Введіть PIN + Будь ласка, введіть PIN + Невірний PIN + Повторіть PIN + Шаблон + Вставити шаблон + Невірний шаблон + Повторіть шаблон + Біометричні дані + Відбиток пальця + Додати відбиток пальця + Помістіть ваш палець на сканер відбитка пальця + Відкрити діалог підтвердження біометричних даних + Авторизуйтеся + Помилка автентифікації + Автентифікацію заблоковано, спробуйте це раз + У вас немає зареєстрованих відбитків пальця, додайте їх у Налаштуваннях вашого пристрою + Перейти до Налаштувань + Пароль успішно встановлено. Якщо ви його забудете, перевстановіть додаток. + Захист успішно встановлено. При проблемах з його скиданням перевстановіть додаток. + Заблокувати теку + Заблокувати теку (Pro) + Розблокувати теку + Цей захист працює тільки у цьому додатку, він не призначений для заміни загальносистемного шифрування тек. + + Вчора + Сьогодні + Завтра + Щодня + Приховати рік + секунд + хвилин + годин + днів + с + х + г + wk. + + %d секунда + %d секунди + %d секунд + %d секунд + + + %d хвилина + %d хвилини + %d хвилин + %d хвилин + + + %d година + %d години + %d годин + %d годин + + + %d день + %d дні + %d днів + %d днів + + + %d тиждень + %d тижні + %d тижнів + %d тижнів + + + %d місяць + %d місяці + %d місяців + %d місяців + + + %d рік + %d роки + %d років + %d років + + + + %d секунду + %d секунди + %d секунд + %d секунд + + + %d хвилину + %d хвилини + %d хвилин + %d хвилин + + + %d годину + %d години + %d годин + %d годин + + + %d день + %d дні + %d днів + %d днів + + + %d тиждень + %d тижні + %d тижнів + %d тижнів + + + %d місяць + %d місяці + %d місяців + %d місяців + + + %d рік + %d роки + %d років + %d років + + + + за %d секунду + за %d секунди + за %d секунд + за %d секунд + + + за %d хвилину + за %d хвилини + за %d хвилин + за %d хвилин + + + за %d годину + за %d години + за %d годин + за %d годин + + + за %d день + за %d дні + за %d днів + за %d днів + + + за %d тиждень + за %d тижні + за %d тижнів + за %d тижнів + + + за %d місяць + за %d місяці + за %d місяців + за %d місяців + + + за %d рік + за %d роки + за %d років + за %d років + + + + %d секунду + %d секунди + %d секунд + %d секунд + + + %d хвилину + %d хвилини + %d хвилин + %d хвилин + + + %d годину + %d години + %d годин + %d годин + + + %d день + %d дні + %d днів + %d днів + + + %d тиждень + %d тижні + %d тижнів + %d тижнів + + + %d місяць + %d місяці + %d місяців + %d місяців + + + %d рік + %d роки + %d років + %d років + + + Сигнал будильника зазвучить через:\n%s + Час до того, як спрацює нагадування:\n%s + Час, що залишився: +\n%s + Переконайтеся, що будильник працює коректно, перед тим, як на нього покладатися. Він може не спрацювати через системні обмеження, пов\'язані з економією заряду батареї. + Переконайтеся, що нагадування працюють коректно, перед тим, як на них покладатися. Вони можуть не спрацювати через системні обмеження, пов\'язані з економією заряду батареї. + Сповіщення від цього додатка заборонені. Перейдіть до Налаштувань пристрою, щоб їх увімкнути. + + Будильник + Відкласти + Відхилити + Без нагадування + При запуску + Системні звуки + Ваші звуки + Додати новий звук + Без звуку + Протягом дня о гг:хх + Протягом дня о %02d:%02d + + Налаштування + Придбати \"Просту Подяку\" + General + Налаштування кольору + Покращено налаштування кольору + Налаштувати кольори + Налаштувати кольори (Locked) + Заблоковано + Налаштувати кольори віджета + Налаштувати повідомлення + Notification sound + Використовувати англійську (Use English language) + Мова + Показати приховані елементи + Розмір шрифту + Малий + Середній + Великий + Надвеликий + Захистити паролем видимість прихованих елементів + Захистити паролем весь додаток + Захистити паролем видалення та переміщення файлів + Не оновлювати час останніх змін при діях з файлами + Показувати інфополе при прокручуванні елементів смугою прокрутки + Запобігати засинанню телефона, поки додаток на передньому плані + Завжди пропускати діалог підтвердження видалення + Увімкнути оновлення свайпом згори вниз + Використовувати 24-годинний формат дати + Змінити формат дати й часу + Починати тиждень з неділі + Віджети + Завжди використовувати однаковий час відкладання + Час відкладання + Вібрація при натисканні на кнопки + Переміщати елементи у Кошик замість видаляти + Інтервал очищення Кошика + Очистити Кошик + Примусовий портретний режим + Експортувати налаштування + Імпортувати налаштування + Налаштування успішно експортовано + Налаштування успішно імпортовано + Показувати спочатку прізвище + Очистити кеш + Показувати діалог підтвердження виклику + + Відображення + Безпека + Прокручування + Дії з файлами + Кошик + Збереження + Запуск + Текст + Перенесення + Якість + Головний екран + Мініатюри + List view + + Виключити + Виключити папку + Виключені теки + (виключено) + Керування виключеними теками + Видалити все + Видалити всі теки зі списку виключених\? Це не видалить теки з пристрою. + Тимчасово показати вилучені + Припинити показ вилучених + + Керування вкладками, що відображаються + Вкладка, що відкривається при запуску додатка + Контакти + Обране + Історія дзвінків + Групи + Останнє використане + Файли + Нещодавні файли + + Відновити цей файл + Відновити обрані файли + Відновити всі файли + Кошик успішно спорожнено + Файли успішно відновлено + Ви впевнені, що хочете спорожнити Кошик? Файли будуть втрачені назавжди. + Кошик порожній + Переміщення елементів з Кошика відключено, будь ласка, використовуйте опцію Відновити + Показати Кошик + Приховати Кошик + Відкрити Кошик + Skip the Recycle Bin, delete files directly + + Переміщення %d елемента в Кошик + Переміщення %d елементів у Кошик + Переміщення %d елементів у Кошик + Переміщення %d елементів у Кошик + + + Триває імпортування… + Триває експортування… + Імпортування успішно завершено + Експортування успішно завершено + Не вдалось імпортувати + Не вдалось експортувати + Не вдалось імпортувати деякі елементи + Не вдалось експортувати деякі елементи + Не знайдено елементів для імпортування + Не знайдено нові записи для імпортування + Не знайдено елементів для експортування + Резервні копії + Увімкнути автоматичне резервне копіювання + Керувати автоматичними резервними копіями + Ви можете використовувати наведені нижче шаблони для автоматичного присвоєння імені файлу: +\n +\n%Y - рік +\n%M - місяць +\n%D - день +\n%h - година +\n%m - хвилина +\n%s - секунда + + USB + Здається, до вашого пристрою приєднано USB-пристрій. Для коректного відображення його файлів вам необхідно надати додаткові дозволи. + Будь ласка, оберіть кореневу теку USB-пристрою далі, щоб надати доступ + Обрано невірну теку, будь ласка, оберіть кореневу теку вашого USB-пристрою + + Січень + Лютий + Березень + Квітень + Травень + Червень + Липень + Серпень + Вересень + Жовтень + Листопад + Грудень + + Jan + Feb + Mar + Apr + May + June + July + Aug + Вересень + Oct + Nov + Dec + + у Січні + у Лютому + у Березні + у Квітні + у Травні + у Червні + у Липні + у Серпні + у Вересні + у Жовтні + у Листопаді + у Грудні + Понеділок + Вівторок + Середа + Четвер + П\'ятниця + Субота + Неділя + П + В + С + Ч + П + С + Н + Пон + Вів + Сер + Чет + Пят + Суб + Нед + + Ця версія додатку більше не буде оновлюватися. Please upgrade to the Pro version to receive new fixes and other improvements. + Ця версія додатку більше не буде оновлюватися. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + Це безкоштовно до: %s. Якщо ви завантажите додаток до вказаної дати, ви отримаєте його безкоштовно назавжди. + Більше інформації + Оновити + Вам доведеться власноруч перемістити події, що зберігаються локально, експортувавши їх в .ics файл, а потім імпортувавши з нього. Ви знайдете кнопку експорту/імпорту в меню головного екрана. + Привіт, +\n +\nсхоже, ви щойно оновили безплатну версію. Якщо ви задоволені цією версією і, можливо, перенесли свої налаштування і вибране, ви можете видалити стару безплатну версію, щоб випадково не запустити її, оскільки вона вам більше не знадобиться. +\n +\nДякуємо! + Привіт, +\n +\nсхоже, що у вас вже є Pro-версія застосунку. Якщо ви задоволені нею і, можливо, перенесли свої налаштування та дані, ви можете видалити цю версію, щоб не запускати її випадково, оскільки вона вам більше не знадобиться. +\n +\nДякуємо! + Привіт, +\n +\nздається, ви щойно оновили безплатну версію. Коли ви задоволені цим і, можливо, перенесете свої дані, ви можете видалити старий безплатний, щоб уникнути його випадкового запуску, оскільки він вам більше не знадобиться. +\n +\nДякую! + Привіт, +\n +\nздається, у вас уже є версія застосунку Pro. Коли ви задоволені ним і, можливо, перенесете свої дані, ви можете видалити його, щоб уникнути його випадкового запуску, оскільки він вам більше не знадобиться. +\n +\nДякую! + Привіт, +\n +\nздається, ви щойно оновили безкоштовну версію. Якщо ви хочете перенести локально збережені події, ви повинні зробити це вручну, експортувавши їх у файл .ics у безкоштовній версії застосунку та імпортувавши сюди через верхнє меню. +\n +\nКоли ви задоволені налаштуваннями версії Pro, ви можете видалити стару безкоштовну версію, оскільки вона вам більше не знадобиться. +\n +\nДякую! + Привіт, +\n +\nздається, ви щойно оновили безкоштовну версію. Якщо у вас були будь-які контакти, збережені в \"%s\", вам потрібно перенести їх вручну, експортувавши у файл .vcf із безкоштовної версії застосунку та імпортувавши сюди через верхнє меню. +\n +\nКоли ви задоволені налаштуваннями версії Pro, ви можете видалити стару безкоштовну версію, оскільки вона вам більше не знадобиться. +\n +\nДякую! + Привіт, +\n +\nздається, ви щойно оновили безкоштовну версію. Якщо ви хочете перенести свої нотатки, ви повинні зробити це вручну, експортувавши їх у файл у безкоштовній версії застосунку та імпортувавши сюди через верхнє меню. +\n +\nКоли ви задоволені налаштуваннями версії Pro, ви можете видалити стару безкоштовну версію, оскільки вона вам більше не знадобиться. +\n +\nДякую! + + Про додаток + Веб-сайт + Вихідний код знайдете за адресою + Надсилайте ваші відгуки і пропозиції до + Оновити до версії Pro + Більше додатків + Більше додатків від нас + Запропонувати друзям + Спробуй %1$s за посиланням %2$s + Запропонувати з допомогою + Оцінити нас + Оцінити + Підтримати розробника + Підписатися на нас + v %1$s\nАвторські права © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Політика конфіденційності + Версія %s + Привіт :) + Зроблено з ❤️ у Словаччині + Додаткова інформація + Версія додатка: %s + ОС пристрою: %s + Привіт,<br><br> сподіваюсь, вам подобається додаток. Він не містить реклами, будь ласка, підтримайте його розробку, придбавши додаток <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Проста Подяка</a>. Покупка також відмінить повторне спливання цього повідомлення.<br><br> Спасибі! + Вітаю,<br><br>сподіваюся, вам подобається застосунок. Він не містить реклами, також ми не збираємо ваші дані. Будь ласка, підтримайте розвиток, придбавши <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Просту подяку</a>. Таким чином ви розблокуєте всі можливості застосунку, зокрема налаштування кольорів.<br><br>Дякуємо! + Підтримайте нас, придбавши <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> будь ласка, це також розблокує всі функції застосунку, включаючи налаштування кольорів. + Придбати + Замовити Простий Телефон + Будь ласка, оновіть \"Просту Подяку\" до останньої версії + Перш ніж запитувати, будь ласка, ознайомтесь із налаштуваннями додатка та прочитайте Часті Питання. Можливо, відповідь там. + Перш ніж ви оціните нас, будь ласка перегляньте налаштування додатка та прочитайте Часті Питання. Якщо у вас виникнуть проблеми, можливо там буде вирішення. + Також переконайтеся, що ви користуєтеся найновішою версією додатка. + Також зверніть увагу, що ця версія програми більше не розробляється, придбайте версію Pro, щоб отримати багато покращень. + Прочитати + Читати ЧаПи + Привіт,\n\nздається, ви вже давно користуєтесь цим додатком, і ми це високо цінуємо.\n\nЧи могли б ви зробити нам послугу і оцінити додаток в Google Play? Це дійсно дуже нам допоможе.\n\nНезалежно від того, що ви вирішите, ви не побачите знову це повідомлення.\n\nСпасибі! + Оцініть наш додаток :) + Подяка + Віджет заблоковано. +\nБудь ласка, оновіть додаток до версії Pro, щоб розблокувати віджет. + Ця функція заблокована, будь ласка, придбайте <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Просту Подяку</a>, щоб розблокувати весь застосунок.<br><br>Це лише одноразовий платіж, якщо ви не будете задоволені, ми зможемо повернути вам гроші. + + +
    + просто повідомляємо, що нещодавно випущено новий додаток:

    + %2$s

    + %4$s

    + %6$s

    + Ви можете його завантажити, натиснувши на заголовок.

    + Спасибі + ]]> +
    + Простий Лаунчер + Простий Калькулятор + Простий Календар + Проста Камера + Простий Годинник + Прості контакти + Простий Телефон + Просте Малювання + Простий Файловий Менеджер + Простий Ліхтарик + Проста Галерея + Проста Клавіатура + Simple Launcher + Простий Музичний Програвач + Прості Нотатки + Прості SMS Повідомлення + Проста Подяка + Простий диктофон + Лаунчер + Калькулятор + Календар + Камера + Годинник + Контакти + Телефон + Малювання + Менеджер Файлів + Ліхтарик + Галерея + Клавіатура + Launcher + Музичний Програвач + Нотатник + SMS Повідомлення + Подяка + Диктофон + + тут. + ]]> + + + Часті питання - ЧаПи + Перш ніж запитувати, будь ласка, прочитайте + Чому я не бачу віджета цього додатка у списку віджетів? + Найімовірніше тому, що ви перемістили додаток на SD карту. В системі Android існує обмеження, що приховує віджети додатка + в цьому випадку. Єдине рішення - перемістити додаток назад у Внутрішню Пам\'ять з допомогою налаштувань вашого пристрою. + Я хочу вас підтримати, але я не можу пожертвувати гроші. Чи є ще щось, що я можу зробити? + Так, звісно. Ви можете поширювати інформацію про наші застосунки або давати хороші відгуки та оцінки. Ви також можете допомогти, переклавши застосунки на нову мову або просто оновивши деякі наявні переклади. Посібник з перекладу знаходиться на веб-сайті <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>за цією адресою</a> або просто зв\'яжіться з нами через електронну пошту <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>, якщо у вас виникли запитання. + Я випадково видалив деякі файли, як я можу їх відновити? + На жаль, ви не можете. Файли видаляються негайно після діалогу-підтвердження, функції типу \"Кошик\" не передбачено. + Мені не подобаються кольори віджета, чи можу я їх змінити? + Так, коли ви перетягуєте віджет на головний екран, з\'являється панель його налаштувань. Ви побачите кольорові квадрати в нижньому лівому куті, просто натисніть їх, щоб обрати новий колір. Ви також можете використати ковзну панель, щоб налаштувати ступінь прозорості. + Чи можу я якось відновити видалені файли? + На жаль, ні, якщо вони були дійсно видалені. Однак стандартно увімкнена функція Кошика, вона переміщає файли в Кошик замість їх видаляти. + Значок запуску додатка зник. Що робити? + Це спричинено тим, що ваша програма запуску неправильно підтримує налаштування значків. Спробуйте запустити додаток через Google Play або віджет, якщо він доступний. + Після запуску встановіть типовий оранжевий колір значка #F57C00. У найгіршому випадку вам доведеться перевстановити додаток. + Гроші списано з мого банківського рахунку, проте я не можу завантажити додаток. Що мені робити? + Сплатою рахунків цілком керує Google, у їхній системі трапляються збої час від часу. Для початку очистіть кеш додатка Google Play та перезапустіть ваш пристрій, потім спробуйте завантажити його знову. + Чому мені слід перейти на версію Pro? + Оскільки версія вашого додатка більше не оновлюється, помилки, які ви можливо виявили, ніколи не будуть виправлені. Також не буде додано ніяких нових функцій. Ви можете придбати версію Pro через Google Play за деяку незначну плату. + Це одноразова плата і означає, що як тільки ви придбаєте його, вам більше не доведеться знову платити. Навіть якщо ви придбаєте новий пристрій. Якщо вам не сподобається версія Pro, ви можете просто деінсталювати її протягом кількох годин, і ви автоматично отримаєте сплачені кошти назад. + Якщо ви захочете повернути кошти пізніше, просто напишіть нам сюди hello@simplemobiletools.com, і ви їх отримаєте. + Як мені обрати декілька елементів одразу? + Ви можете це зробити кількома способами. Перший спосіб - увімкнути режим виділення, натиснувши тривалий час на одному з елементів, потім виділяти інші коротким натисненням на них. Другий спосіб подібний до обирання елементів на комп\'ютері з допомогою мишки, + увімкніть режим виділення, натиснувши тривалий час на одному з елементів, потім, не відпускаючи пальця, проведіть ним по інших елементах для вибору. Третій спосіб виділити декілька елементів - тривале натиснення на одному елементі, потім тривале натиснення на іншому, і все, що розміщене між ними, буде виділене. Якщо ви + хочете виділити всі елементи, тривалим натисненням виділіть один елемент, потім натисніть на лічильник елементів у верхньому лівому куті. Ця дія виділить або відмінить виділення всіх елементів. + Я придбав додаток, проте не можу завантажити його на іншому пристроєві. + Спробуйте очистити кеш вашого додатка Google Play і перезапустіть ваш пристрій. Це помилка в роботі Google Play, що насправді не пов\'язана з самим додатком. + + Помічники + Переклад + Розробка + Other help + У цьому списку є всі, хто помітно допоміг будь-якому додатку в наборі Simple Mobile Tools, не тільки цьому. Перекладами займаються волонтери. Якщо ви також хочете допомогти, то повідомте нас. Посібник з перекладу знаходиться на вебсайті <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>за цією адресою</a> або просто зв\'яжіться з нами через електронну пошту <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>, якщо у вас виникли запитання. Дякуємо всім помічникам та всім, хто підтримує! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Отримайте Pro-версію просто зараз! + Базова + Pro + Жодної реклами + Без доступу до Інтернету + 100% гарантія повернення коштів + Одноразовий платіж + Покращений дизайн + + Удосконалений редактор світлин + Розширений редактор фото & відео + Підтримка файлів HEIC/HEIF + Удосконалене перейменування пакетних файлів + Індивідуальне блокування тек + Підтримка друку + + Підтримка часових поясів + Відвідувачі та нагадування електронною поштою + Зручний імпорт подій + Нові віджети + + Удосконалена функція злиття контактів + Налаштування розміру шрифту + Додатковий обмін конфіденційними контактами в наших додатках + Налаштування мелодій виклику для контакту + Фільтрування контактів + Приватно збережені контакти + + Контрольні списки + Різні замітки та кольори для кожного віджета + Блокування нотаток + + Налаштування формату дати та часу + Ярлики на головному екрані + Підтримка стиснення файлів + Вкладка з нещодавніми файлами + + Налаштування кольору фону + Підтримка імпорту файлів + Масштабування + + Цей додаток створено з використанням наступних бібліотек сторонніх розробників, що полегшує мою працю. Дякую. + Ліцензії третіх сторін + Kotlin (мова програмування) + Subsampling Scale Image View (можливість масштабувати зображення) + Glide (завантаження і кешування зображень) + Picasso (завантаження і кешування зображень) + Android Image Cropper (обрізання та обертання зображень) + RtlViewPager (свайп справа наліво) + Joda-Time (заміна дати Java) + Stetho (налагодження баз даних) + Otto (шина подій) + PhotoView (масштабування GIF-зображень) + PatternLockView (захист графічним ключем) + Reprint (захист з відбитком пальця) + Gif Drawable (завантаження GIF-зображень) + AutoFitTextView (масштабування тексту) + Robolectric (програмний каркас для тестування) + Espresso (помічник для тестування) + Gson (синтаксичний аналізатор JSON) + Leak Canary (детектор просочення пам\'яті) + Number Picker (введення чисел) + ExoPlayer (відеопрогравач) + VR Panorama View (відображення панорам) + Apache Sanselan (читання метаданих зображень) + Android Photo Filters (фільтри зображень) + Gesture Views (масштабування зображень) + Indicator Fast Scroll (літери на прокрутці) + Event Bus (комунікація в додатку) + Audio Record View (аудіо візуалізація) + SMS MMS (обробка SMS та MMS) + APNG Android (підтримка анімацій WebP) + PDFViewPager (переглядач PDF) + M3U Парсер (обробка m3u-файлів списків відтворення) + AndroidLame (mp3 encoder) + + Термін пробного періоду закінчився + Почати безкоштовну пробну версію + Термін дії вашої пробної версії скоро закінчиться. + Розблокуйте застосунок на один останній день + Ласкаво просимо до %s! + Дякуємо за використання нашого застосунку. Ви можете використовувати цю розблоковану версію протягом %d днів. Після завершення пробного періоду подумайте про оновлення до версії Pro. Він має величезну кількість нових функцій, сучасний дизайн, відсутність реклами та багато інших покращень. +\n +\nВи просто повинні заплатити за це один раз у житті, і якщо ви не будете задоволені, ви можете видалити його та отримати відшкодування. +\n +\nСподіваюся, вам сподобається :) + Перейдіть на версію Pro, щоб насолоджуватися застосунком у повному обсязі. +\n +\nВи просто повинні платити за це один раз в житті, і якщо ви не будете задоволені, ви можете видалити його і отримати відшкодування. +\n +\nПобачимося :) + + Термін дії пробного періоду закінчується через %d день. + Термін дії пробного періоду закінчується через %d дні. + Термін дії пробного періоду закінчується через %d днів. + Термін дії пробного періоду закінчується через %d днів. + + + Застаріла: Ця версія додатка більше не підтримується, встановіть версію Pro за адресою https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Пам\'ятайте: якщо ви видалите будь-який платний додаток протягом 2 годин, вам буде автоматично повернена сума покупки. Якщо ви захочете повернути гроші пізніше, сконтактуйте з нами за адресою hello@simplemobiletools.com, і ви їх отримаєте. Таким чином ви можете легко спробувати додаток :) + + Група простих Android-додатків з відкритим вихідним кодом, настроювальними віджетами, без реклами та непотрібних дозволів. +
    diff --git a/commons/src/main/res/values-v31/colors.xml b/commons/src/main/res/values-v31/colors.xml new file mode 100644 index 000000000..5d2354731 --- /dev/null +++ b/commons/src/main/res/values-v31/colors.xml @@ -0,0 +1,12 @@ + + + @android:color/system_accent1_50 + @android:color/system_accent1_400 + @android:color/system_neutral1_10 + @android:color/system_neutral1_50 + @android:color/system_accent1_900 + @android:color/system_accent1_400 + @android:color/system_accent1_600 + @android:color/system_accent2_50 + @android:color/system_neutral1_50 + diff --git a/commons/src/main/res/values-vi/strings.xml b/commons/src/main/res/values-vi/strings.xml new file mode 100644 index 000000000..52556f4ca --- /dev/null +++ b/commons/src/main/res/values-vi/strings.xml @@ -0,0 +1,1092 @@ + + + OK + Hủy bỏ + Quay lại + Không có gì + Sau + Lưu thành + Tệp đã được lưu thành công + Định dạng tập tin không hợp lệ + Lỗi bộ nhớ + Xảy ra lỗi: %s + Error: %s + Mở với + Chỉnh sửa với + Chỉnh sửa + Không tìm thấy ứng dụng hợp lệ + Không tìm thấy trình duyệt + Không tìm thấy ứng dụng email + Đặt làm + Sao chép vào bộ nhớ tạm + Sao chép số vào bộ nhớ tạm + Giá trị được sao chép vào clipboard + Giá trị được sao chép vào clipboard:\n%s + Quay số + Không xác định + Luôn luôn + Không bao giờ + Chi tiết + Ghi chú + Xóa thư mục \'%s\' + Không + Nhãn + Trong suốt + Màu trong suốt + Chọn một màu khác + Tải xuống + Thông báo + Notifications + Email + Trước đó + Phát / Dừng + Next + Number + Không tìm thấy liên lạc + Yêu cầu các quyền cần thiết + Ứng dụng không thể truy cập vào danh bạ của bạn + Ứng dụng không có quyền thực hiện cuộc gọi điện thoại, vui lòng cấp quyền đó trong cài đặt thiết bị + Chèn văn bản vào đây + Gọi %s + Confirm calling %s + Zero + One + Hai + Ba + Bốn + Năm + Sáu + Bảy + Tám + Chín + Giá trị + Giá trị không thể bỏ trống + Tạo liên hệ mới + Thêm vào một liên hệ hiện có + Ứng dụng bị gián đoạn + Từ chối trách nhiệm + Chụp ảnh + Chọn hình ảnh + Choose video + Choose contact + Choose file + Ghi âm + Quay video + Đang cập nhật… + Bộ nhớ điện thoại + Bộ nhớ điện thoại (không hiển thị bởi các ứng dụng khác) + Audio + + Ngày sinh nhật + Dịp kỉ niệm + + Home + Công việc + + Mobile + Chính + Work Fax + Home Fax + Pager + No phone number has been found + + Thay đổi kiểu xem + Lưới + Lưới (Pro) + Uneven Grid + Danh sách + Tăng số lượng cột + Giảm số lượng cột + Column count + Portrait column count + Landscape column count + Thay đổi ảnh bìa + Chọn ảnh + + %d column + %d columns + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + Yêu thích + Thêm mục yêu thích + Thêm vào mục yêu thích + Loại bỏ khỏi mục ưa thích + + Tìm kiếm + Search in %s + Nhập ít nhất 2 ký tự để bắt đầu tìm kiếm. + Tìm liên hệ + Tìm kiếm yêu thích + Search apps + Search events + Tìm nhóm + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + Bộ lọc + Bộ lọc (Pro) + Không tìm thấy mục nào. + Thay đổi bộ lọc + + Cần quyền lưu trữ + Cần quyền truy cập danh bạ + Cần quyền truy cập máy ảnh + Cần quyền truy cập âm thanh + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + Đổi tên tập tin + Đổi tên thư mục + Không thể đổi tên tập tin + Không thể đổi tên thư mục + Tên thư mục không được để trống + Một thư mục có tên đó đã tồn tại + Không thể đổi tên thư mục gốc của bộ lưu trữ + Thư mục được đổi tên thành công + Đổi tên thư mục + Tên tệp không thể để trống + Tên tệp chứa các ký tự không hợp lệ + Tên tệp \'%s\' chứa các ký tự không hợp lệ + Phần mở rộng không thể để trống + Tệp nguồn %s không tồn tại + Thêm vào đầu tên tập tin + Thêm vào cuối tên tập tin + Đổi tên đơn giản + Mẫu + Chuỗi để thêm + %Y - năm\n%M - tháng\n%D - ngày\n%h - giờ\n%m - phút\n%s - giây\n%i - số tăng từ 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + Sao chép + Di chuyển + Sao chép / Di chuyển + Sao chép vào + Chuyển tới + Nguồn + Nơi lưu trữ + Chuyển đến... + Nhấn vào đây để chọn + Không thể ghi vào nơi đã chọn + Vui lòng chọn một nơi lưu trữ + Nguồn và nơi đến không thể giống nhau + Không thể sao chép các tập tin + Đang sao chép... + Tập tin được sao chép thành công + File copied successfully + Đã xảy ra lỗi + Di chuyển... + Tập tin đã được chuyển thành công + File moved successfully + Một số tệp không thể di chuyển + Một số tệp không thể sao chép + Không có tập tin nào được chọn + Đang lưu… + Không thể tạo thư mục %s + Không thể tạo tệp %s + Không có mục mới được tìm thấy + Đích đến không có đủ dung lượng khả dụng.\nRequired %1$s, khả dụng %2$s + System service for selecting files and folders is unavailable + + Tạo mới + Thư mục + Tệp + Tạo thư mục mới + Một tập tin hoặc thư mục có tên đó đã tồn tại + Tên chứa các ký tự không hợp lệ + Vui lòng nhập tên + Xảy ra lỗi không xác định + + Tệp \"%s\" đã tồn tại + Tệp \"%s\" đã tồn tại. Ghi đè? + Thư mục \"%s\" đã tồn tại + Kết hợp + Giữ cả hai + Ghi đè + Skip + Nối với \'_1\' + Áp dụng cho tất cả + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Không thể đổi tên thư mục này + + Chọn một thư mục + Chọn một tập tin + Xác nhận truy cập bộ nhớ ngoài + Confirm folder access + Vui lòng chọn thư mục trên cùng của thẻ SD trên màn hình tiếp theo, để cấp quyền truy cập ghi + Nếu bạn không thấy thẻ SD, hãy thử điều này + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Xác nhận lựa chọn + Loading… + Please grant our app access to all your files, it might not work well without it. + + %d item + %d items + + + + %d item + %d items + + + Deleting %d item + Deleting %d items + + + + %d contact + %d contacts + + + Chọn nơi lưu trữ + Storage + Bộ nhớ trong + Thẻ SD + Root + Đã chọn sai thư mục, vui lòng chọn thư mục gốc của thẻ SD của bạn + Đường dẫn thẻ SD và thiết bị USB không thể giống nhau + Bạn dường như đã cài đặt ứng dụng trên thẻ SD, điều đó làm cho các widget ứng dụng không khả dụng. Bạn thậm chí sẽ không nhìn thấy chúng trong danh sách các widget có sẵn. +         Đây là một giới hạn hệ thống, vì vậy nếu bạn muốn sử dụng các widget, bạn phải di chuyển ứng dụng vào bộ nhớ trong. + Wrong folder selected, please select path \'%s\' + + Chi tiết + Đường dẫn + Các mục được chọn + Đếm thư mục con trực tiếp + Tổng số tập tin + Độ phân giải + Thời lượng + Nghệ sĩ + Album + Tiêu cự + Thời gian phơi sáng + Tốc độ ISO + F-number + Camera + EXIF + Tên bài hát + tọa độ GPS + Độ cao + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + Màu nền + Màu văn bản + Màu chính + Accent color of white theme + Accent color of Black & White theme + Màu nền + Màu biểu tượng ứng dụng + Màu thanh điều hướng phía dưới + Khôi phục mặc định + Sử dụng mặc định + Mặc định + Thay đổi màu sắc + Chủ đề + Thay đổi một màu sẽ làm ứng dụng chuyển sang chủ đề Tùy chỉnh + Lưu + Bỏ qua + Hoàn tác thay đổi + Bạn có chắc chắn muốn hoàn tác các thay đổi của mình? + Hành động này không thể được hoàn tác. + Bạn có các thay đổi chưa lưu. Lưu trước khi thoát? + Áp dụng màu sắc cho tất cả Simple Apps + CẢNH BÁO: Một số trình khởi chạy không xử lý tùy chỉnh biểu tượng ứng dụng đúng cách. Trong trường hợp biểu tượng biến mất, hãy thử khởi chạy ứng dụng qua Google Play hoặc một số tiện ích, nếu có. +         Sau khi khởi chạy, chỉ cần đặt lại biểu tượng màu cam mặc định #F57C00. Bạn có thể phải cài đặt lại ứng dụng trong trường hợp xấu nhất. + Màu sắc được cập nhật thành công. Một chủ đề mới có tên \'Shared\' đã được thêm vào, vui lòng sử dụng chủ đề đó để cập nhật tất cả các màu của ứng dụng trong tương lai. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You để mở khóa tính năng này và hỗ trợ nhà phát triển. Cảm ơn! + ]]> + + + Sáng + Tối + Auto + Auto light / dark + Solarized + Đỏ sẫm + White + Đen & trắng + Tùy chỉnh + Đã chia sẻ + System default + + Có gì mới ? + * chỉ các bản cập nhật lớn hơn được liệt kê ở đây, luôn luôn cũng có một số cải tiến nhỏ hơn + + Xóa bỏ + Xóa + Đổi tên + Chia sẻ + Chia sẻ qua + Thay đổi kích thước + Chọn tất cả + Select text + Ẩn + Bỏ ẩn + Ẩn thư mục + Bỏ ẩn thư mục + Tạm thời hiển thị mục đã ẩn + Dừng hiển thị mục đã ẩn + Bạn không thể chia sẻ nhiều nội dung này cùng một lúc + Làm trống và tắt Thùng rác + Hoàn tác + Khôi phục + In + In (Pro) + Shortcut + Tạo phím tắt + Tạo phím tắt (Pro) + Thêm số để liên hệ + View contact details + Call from SIM 1 + Call from SIM 2 + Chuyển đổi khả năng hiển thị tên tệp + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + Sắp xếp theo + Tên + Kích thước + Sửa đổi lần cuối + Date created + Ngày chụp + Tiêu đề + Tên tệp + Phần mở rộng + Ngẫu nhiên + Sắp xếp ngẫu nhiên + Tăng dần + Giảm dần + Chỉ sử dụng cho thư mục này + Sắp xếp các phần số theo giá trị thực + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + Bạn có chắc chắn muốn tiến hành xóa? + Bạn có chắc chắn muốn xóa %s? + Delete %s? + + Bạn có chắc chắn muốn chuyển %s vào Thùng rác không? + + Bạn có chắc bạn muốn xóa mục này? + Bạn có chắc chắn muốn chuyển mục này vào Thùng rác không? + Đừng hỏi lại trong phần này + Do not show again + + Không + Có lẽ + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + PIN + Nhập PIN + Vui lòng nhập mã PIN + PIN sai + Lặp lại mã PIN + Mẫu hình + Chèn mẫu hình + Mẫu hình sai + Lặp lại mẫu hình + Biometrics + Vân tay + Thêm dấu vân tay + Vui lòng đặt ngón tay của bạn trên cảm biến vân tay + Open biometric ID verification dialog + Authenticate + Quá trình xác thực đã thất bại + Xác thực bị chặn, vui lòng thử lại sau giây lát + Bạn chưa đăng ký dấu vân tay, vui lòng thêm trong Cài đặt của thiết bị + Chuyển đến Cài đặt + Thiết lập mật khẩu thành công. Vui lòng cài đặt lại ứng dụng trong trường hợp bạn quên nó. + Thiết lập bảo vệ thành công. Vui lòng cài đặt lại ứng dụng trong trường hợp có vấn đề với việc thiết lập lại. + Khóa thư mục + Khóa thư mục (Pro) + Mở khóa thư mục + Bảo vệ này chỉ hoạt động trong ứng dụng này, nó không được phép thay thế mã hóa thư mục toàn hệ thống thực sự. + + Hôm qua + Hôm nay + Ngày mai + Every day + Hide year + giây + phút + giờ + ngày + s + m + h + wk. + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + Thời gian còn lại cho đến khi báo thức kêu: \n%s + Thời gian còn lại cho đến khi nhắc nhở kích hoạt: \n%s + Time remaining:\n%s + Hãy chắc chắn rằng báo thức hoạt động đúng trước khi dựa vào nó. Nó có thể hoạt động sai do hạn chế hệ thống liên quan đến tiết kiệm pin. + Hãy chắc chắn rằng các lời nhắc hoạt động đúng trước khi dựa vào chúng. Chúng có thể hoạt động sai do hạn chế hệ thống liên quan đến tiết kiệm pin. + Thông báo của ứng dụng này đã bị vô hiệu hóa. Vui lòng vào cài đặt thiết bị của bạn để kích hoạt chúng. + + báo thức + Báo lại + Bỏ qua + Không nhắc nhở + Khi bắt đầu + Âm báo hệ thống + Âm báo của bạn + Thêm một âm báo mới + Không có âm báo + During the day at hh:mm + During the day at %02d:%02d + + Cài đặt + Cảm ơn vì đã mua hàng Simple + General + Color customization + Improved color customization + Tùy chỉnh màu sắc + Tùy chỉnh màu sắc (Locked) + Locked + Tùy chỉnh màu widget + Customize notifications + Notification sound + Sử dụng tiếng anh + Language + Hiển thị các mục ẩn + Cỡ chữ + Nhỏ + Trung bình + Lớn + Rất lớn + Mật khẩu bảo vệ khả năng hiển thị mục ẩn + Mật khẩu bảo vệ toàn bộ ứng dụng + Mật khẩu bảo vệ xóa tập tin và di chuyển + Giữ giá trị sửa đổi cuối cùng cũ tại các thao tác tập tin + Hiển thị bong bóng thông tin tại các mục cuộn bằng cách kéo thanh cuộn + Ngăn điện thoại ngủ trong khi ứng dụng đang hoạt động trước nền + Luôn bỏ qua hộp thoại xác nhận xóa + Cho phép kéo từ trên xuống để làm mới + Sử dụng định dạng 24 giờ + Thay đổi định dạng ngày giờ + Bắt đầu tuần vào chủ nhật + Widgets + Luôn luôn sử dụng cùng thời gian báo lại + Thời gian báo lại + Rung khi nhấn nút + Di chuyển các mục vào Thùng rác thay vì xóa + Khoảng thời gian làm sạch thùng rác + Làm sạch thùng rác + Buộc chế độ dọc + Xuất cài đặt + Nhập cài đặt + Cài đặt được xuất thành công + Cài đặt được nhập thành công + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + Hiển thị + Bảo vệ + Cuộn + Thao tác tập tin + Thùng rác + Đang lưu… + Mở đầu + Văn bản + Di chuyển + Quality + Main screen + Thumbnails + List view + + Loại trừ + Exclude folder + Các thư mục bị loại trừ + (loại trừ) + Quản lý các thư mục loại trừ + Xóa tất cả + Xóa tất cả các thư mục khỏi danh sách loại trừ\? Điều này sẽ không xóa các thư mục. + Temporarily show excluded + Stop showing excluded + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + Khôi phục tập tin này + Khôi phục các tập tin đã chọn + Khôi phục tất cả các tệp + Thùng rác đã được dọn sạch thành công + Tập tin đã được khôi phục thành công + Bạn có chắc chắn muốn dọn sạch Thùng rác? Các tập tin sẽ bị mất vĩnh viễn. + Thùng rác trống + Di chuyển mục trong Thùng rác bị vô hiệu hóa, vui lòng sử dụng Khôi phục + Hiển thị thùng rác + Ẩn thùng rác + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + Đang nhập… + Đang xuất… + Nhập thành công + Xuất thành công + Nhập thất bại + Xuất thất bại + Nhập một số mục không thành công + Xuất một số mục không thành công + Không có mục để nhập được tìm thấy + No new entries for importing have been found + Không có mục nào để xuất được tìm thấy + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + Bạn dường như có một USB được gắn vào thiết bị của bạn. Để đảm bảo các tệp của nó xuất hiện đúng, bạn cần cấp quyền bổ sung. + Vui lòng chọn thư mục trên cùng của thiết bị USB trên màn hình tiếp theo để cấp quyền truy cập + Đã chọn sai thư mục, vui lòng chọn thư mục gốc của thiết bị USB của bạn + + Tháng Một + Tháng Hai + Tháng Ba + Tháng Tư + Tháng Năm + Tháng Sáu + Tháng Bảy + Tháng Tám + Tháng Chín + Tháng Mười + Tháng Mười Một + Tháng Mười Hai + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + trong Tháng Một + trong Tháng Hai + trong Tháng Ba + trong Tháng Tư + trong Tháng Năm + trong Tháng Sáu + trong Tháng Bảy + trong Tháng Tám + trong Tháng Chín + trong Tháng Mười + trong Tháng Mười Một + trong tháng Mười Hai + Thứ hai + Thứ ba + Thứ tư + Thứ năm + Thứ sáu + Thứ bảy + Chủ nhật + T.H + T.B + T.T + T.N + T.S + T.B + CN + T.hai + T.ba + T.tư + T.năm + T.sáu + T.bảy + CN + + Phiên bản ứng dụng của bạn sẽ không được cập nhật nữa. Vui lòng nâng cấp lên phiên bản Pro để nhận bản sửa lỗi mới và các cải tiến khác. + Phiên bản ứng dụng của bạn sẽ không được cập nhật nữa. Vui lòng nâng cấp lên phiên bản Pro để nhận các bản sửa lỗi mới và các cải tiến khác bằng cách nhấp vào đây. + Nó là miễn phí cho đến: %s. Nếu bạn tải xuống trong thời gian free, bạn sẽ có thể sử dụng miễn phí mãi mãi. + Thêm thông tin + Nâng cấp + Bạn phải di chuyển thủ công các sự kiện được lưu trữ cục bộ thông qua xuất trong tệp .ics, sau đó nhập. Bạn có thể tìm thấy cả hai nút xuất / nhập ở menu màn hình chính. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + Thông tin + Website + Đối với các mã nguồn truy cập + Gửi phản hồi hoặc đề xuất của bạn tới + Nâng cấp lên Pro + Các ứng dụng khác + More apps from us + Mời bạn bè + Xin chào, hãy kiểm tra %1$s tại %2$s + Mời qua + Đánh giá chúng tôi + Đánh giá + Donate + Theo dõi chúng tôi + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Thông tin bổ sung + Phiên bản ứng dụng: %s + Hệ điều hành thiết bị: %s + +
    + hy vọng bạn đang thưởng thức ứng dụng. Nó không chứa quảng cáo, vui lòng hỗ trợ sự nhà phát triển bằng cách mua ứng dụngSimple Thank You nó cũng sẽ ngăn hộp thoại này hiển thị lại.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Mua hàng + Get Simple Phone + Vui lòng cập nhật Simple Thank You lên phiên bản mới nhất + Trước khi bạn đặt câu hỏi, vui lòng kiểm tra cài đặt ứng dụng và đọc Câu hỏi thường gặp trước. Có thể giải pháp ở đó. + Trước khi bạn đánh giá chúng tôi, vui lòng kiểm tra cài đặt ứng dụng và đọc Câu hỏi thường gặp trước. Nếu bạn gặp vấn đề, có thể giải pháp ở đó. + Hãy đảm bảo rằng bạn đang sử dụng phiên bản ứng dụng mới nhất. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Hãy đọc + Đọc Câu hỏi thường gặp(FAQ) + Xin chào,\n\ncó vẻ như bạn đang sử dụng ứng dụng này khá lâu và chúng tôi thực sự đánh giá cao nó.\n\nNếu có thể, vui lòng đánh giá chúng tôi trên Google Play. Điều đó thực sự sẽ giúp chúng tôi rất nhiều.\n\n Bất kể bạn quyết định như thế nào, bạn sẽ không thấy thông báo này nữa.\n\nCảm ơn! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + chỉ cho bạn biết rằng một ứng dụng mới đã được phát hành gần đây:

    + %2$s

    + %4$s

    + %6$s

    + Bạn có thể tải xuống bằng cách nhấn vào tiêu đề.

    + Thanks + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + tại đây. + ]]> + + + Các câu hỏi thường gặp + Trước khi bạn đặt câu hỏi, trước tiên hãy đọc + Tại sao tôi không thấy widget ứng dụng này trong danh sách widget? + Rất có thể là do bạn đã di chuyển ứng dụng vào thẻ SD. Có một giới hạn hệ thống Android ẩn các widget ứng dụng đã cho + trong trường hợp đó. Giải pháp duy nhất là chuyển ứng dụng trở lại Bộ nhớ trong thông qua cài đặt thiết bị của bạn. + Tôi muốn hỗ trợ bạn, nhưng tôi không thể quyên góp tiền. Tôi có thể làm gì khác không? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + Tôi đã xóa một số tệp do nhầm lẫn, làm cách nào để khôi phục chúng? + Đáng buồn thay, bạn không thể. Các tập tin sẽ bị xóa ngay lập tức sau hộp thoại xác nhận, không có thùng rác nào có sẵn. + Tôi không thích màu của widget, tôi có thể thay đổi chúng không? + Được chứ, khi bạn kéo một widget trên màn hình chính, màn hình cấu hình widget sẽ xuất hiện. Bạn sẽ thấy các ô vuông màu ở góc dưới bên trái, chỉ cần nhấn chúng để chọn màu mới. Bạn cũng có thể sử dụng thanh trượt để điều chỉnh alpha. + Tôi có thể khôi phục các tập tin bị xóa bằng cách nào đó không? + Nếu chúng thực sự bị xóa, bạn không thể. Tuy nhiên, có một Thùng rác được bật theo mặc định, nó sẽ khiến các tệp được di chuyển vào Thùng thay vì xóa chúng. + Biểu tượng khởi chạy ứng dụng này biến mất. Tôi có thể làm gì? + Nguyên nhân là do trình khởi chạy của bạn không hỗ trợ tùy chỉnh biểu tượng đúng cách. Hãy thử khởi chạy ứng dụng thông qua Google Play hoặc một số tiện ích nếu có. + Sau khi khởi chạy, chỉ cần đặt lại biểu tượng màu cam mặc định #F57C00. Bạn có thể phải cài đặt lại ứng dụng trong trường hợp xấu nhất. + Tiền đã được khấu trừ từ tài khoản ngân hàng của tôi, nhưng tôi không thể tải xuống ứng dụng. Tôi có thể làm gì? + Thanh toán được xử lý hoàn toàn bởi Google, hệ thống của họ thỉnh thoảng bị trục trặc. Chỉ cần xóa bộ nhớ cache ứng dụng Google Play của bạn và khởi động lại thiết bị của bạn, sau đó thử tải xuống lại. + Tại sao tôi nên nâng cấp lên phiên bản Pro? + Vì phiên bản ứng dụng của bạn không còn được cập nhật, các lỗi bạn có thể phát hiện sẽ không bao giờ được sửa. Cũng sẽ không có chức năng mới được thêm vào. Bạn có thể mua phiên bản Pro trên Google Play với một khoản tiền nhỏ. + Đó là thanh toán một lần, có nghĩa là một khi bạn mua nó, bạn sẽ không bao giờ phải mua lại. Ngay cả sau khi nhận được một thiết bị mới. Nếu bạn không thích phiên bản Pro, bạn có thể gỡ cài đặt trong vòng vài giờ và bạn sẽ tự động lấy lại tiền. + Nếu bạn muốn hoàn lại tiền bất cứ lúc nào sau đó, chỉ cần liên hệ với chúng tôi tại hello@simplemobiletools.com và bạn sẽ nhận được nó. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + Ứng dụng này sử dụng các thư viện bên thứ ba sau đây để giúp tôi thực hiện dễ dàng hơn. Cảm ơn. + Giấy phép bên thứ ba + Kotlin (ngôn ngữ lập trình) + Lấy mẫu tỷ lệ xem hình ảnh (số lần xem hình ảnh có thể phóng to) + Lướt (tải hình ảnh và bộ nhớ đệm) + Picasso (tải hình ảnh và bộ nhớ đệm) + Android Image Cropper (cắt ảnh và xoay) + RtlViewPager (vuốt từ phải sang trái) + Joda-Time (thay thế ngày Java) + Stetho (cơ sở dữ liệu gỡ lỗi) + Otto (event bus) + PhotoView (GIF có thể phóng to) + PatternLockView (bảo vệ mẫu hình) + In lại (bảo vệ vân tay) + Gif Drawable (tải GIF) + AutoFitTextView (thay đổi kích thước văn bản) + Robolectric (khung thử nghiệm) + Espresso (người trợ giúp thử nghiệm) + Gson (Trình phân tích cú pháp JSON) + Leak Canary (bộ phát hiện rò rỉ bộ nhớ) + Bộ chọn số (bộ chọn số tùy chỉnh) + ExoPlayer (trình phát video) + Chế độ xem toàn cảnh VR (hiển thị ảnh toàn cảnh) + Apache Sanselan (đọc siêu dữ liệu hình ảnh) + Bộ lọc ảnh Android (bộ lọc hình ảnh) + Chế độ xem cử chỉ (hình ảnh có thể phóng to) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + THÔNG BÁO: Phiên bản của ứng dụng này không còn được duy trì, hãy tải phiên bản Pro tại https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Đừng quên rằng nếu bạn gỡ cài đặt bất kỳ ứng dụng phải trả tiền nào trong vòng 2 giờ, bạn sẽ tự động được hoàn lại tiền. Nếu bạn muốn hoàn lại tiền bất cứ lúc nào sau đó, chỉ cần liên hệ với chúng tôi tại hello@simplemobiletools.com và bạn sẽ nhận được nó.Thật dễ dàng đúng không :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    \ No newline at end of file diff --git a/commons/src/main/res/values-zh-rCN/strings.xml b/commons/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 000000000..303b578d5 --- /dev/null +++ b/commons/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,1082 @@ + + + 确认 + 取消 + 返回 + 没有东西 + 稍后 + 保存 + 文件保存成功 + 无效文件格式 + 内存不足 + 啊哦,出错啦:%s + 错误: %s + 打开方式 + 编辑方式 + 编辑 + 未找到可用应用 + 未找到浏览器 + 未找到电子邮件客户端 + 设置为 + 复制到剪贴板 + 复制号码到剪贴板 + 内容已复制到剪贴板 + 内容已复制到剪贴板:\n%s + 拨号 + 未知 + 总是 + 从不 + 详细 + 笔记 + 正在删除目录 \'%s\' + + 标签 + 透明 + 透明颜色 + 选择一个不同的颜色 + 下载 + 通知 + 通知 + 电子邮件 + 上一首 + 播放/暂停 + 下一首 + 号码 + 未发现联系人 + 请求必要的权限 + 该应用无法访问联系人 + 应用没有发起呼叫的权限,请在设备设置中授予该权限 + 在此输入文本 + 打电话给 %s + 确认呼叫 %s + + + + + + + + + + + + 值不能为空 + 建立新联系人 + 添加至已存在的联系人 + 应用损坏 + 免责声明 + 拍照 + 选择照片 + 选择视频 + 选择联系人 + 选择文件 + 录音 + 录像 + 更新中… + 手机存储 + 手机空间 (其他程序不可见) + 音频 + + 生日 + 纪念日 + + 家庭 + 工作 + + 手机 + 主用 + 工作传真 + 家庭传真 + 呼叫器 + 未发现电话号码 + + 更改视图类型 + 网格 + 网格 (Pro) + 非均匀网格 + 列表 + 显示更多项目 + 显示更少项目 + 列数 + 垂直列数 + 水平列数 + 更换封面图片 + 选择图片 + + %d 列 + + + 管理黑名单 + 你没有拦截任何人。 + 添加黑名单号码 + 加入黑名单 + 加入黑名单 + 黑名单 + 导出屏蔽号码 + 导入屏蔽号码 + 您必须将这应用程序设为默认的拨号程序来使用黑名单。 + 设为默认 + 您确定要将 \"%s\" 添加到黑名单吗? + 拦截来自未存储联系人的通话 + 拦截来自未存储联系人的消息 + 输入号码或模式(例如 *12345*、+1*8888)以阻止来自匹配模式的号码的所有来电和消息。 + 要拦截未知号码,你必须将应用设为默认的来电显示和骚扰电话屏蔽应用。 + + 收藏 + 添加收藏 + 添加到收藏 + 从收藏中移除 + + 搜索 + 在 %s 中搜索 + 请输入至少两个字符来开始搜索。 + 搜索联系人 + 搜索收藏 + 搜索应用 + 搜索事件 + 搜索组 + 搜索历史 + 搜索通话 + 搜索文件 + 搜索文件夹 + 搜索文件和文件夹 + 搜索播放列表 + 搜索艺术家 + 搜索专辑 + 搜索曲目 + 搜索文本 + 搜索对话 + 搜索录音 + + 过滤 + 过滤 (Pro) + 找不到任何项目。 + 更改过滤器 + + 请授予存储权限 + 请授予通讯录权限 + 请授予相机权限 + 请授予音频权限 + 无权限 + 你必须允许应用展示通知,否则它无法显示提醒。 + 你必须允许应用展示通知,否则它无法显示进度条。 + 你必须允许应用展示通知,否则它无法播放歌曲。 + 你必须允许应用展示通知,否则它无法录音。 + 你必须允许应用展示通知,否则它无法显示来电。 + 你必须允许应用展示通知,否则它无法显示消息。 + 授予权限 + 权限是必需的 + + 重命名文件 + 重命名文件夹 + 无法重命名文件 + 无法重命名文件夹 + 文件夹名不能为空 + 文件夹名已存在 + 无法重命名存储器的根目录 + 文件夹重命名成功 + 重命名文件夹 + 文件名不能为空 + 文件名包含无效字符 + 文件名 \'%s\' 包含无效的字符 + 扩展名不能为空 + 原文件 %s 不存在 + 文件名前缀 + 文件名后缀 + 简单重命名 + 图案 + 要添加的字符串 + %Y - 年\n%M - 月\n%D - 日\n%h - 时\n%m - 分\n%s - 秒\n%i - 数字从1递增 + 文件名(不带 .txt) + 文件名(不带 .json) + 文件名(不带 .zip) + 从 Android 11 开始,你再也不能像这样隐藏文件和文件夹了 + + 复制 + 移动 + 复制/移动 + 复制到 + 移动到 + 原始路径 + 目标路径 + 选择目标路径 + 点击此处以设置目标路径 + 无法写入到选中目标路径 + 请选择目标路径 + 原始路径和目标路径不能相同 + 无法复制文件 + 正在复制… + 复制成功 + 文件复制成功 + 操作失败 + 正在移动… + 文件移动成功 + 文件移动成功 + 无法移动相同文件 + 无法复制相同文件 + 未选择文件 + 正在保存… + 创建文件夹 %s 失败 + 创建文件 %s 失败 + 没有找到新的项目 + 目标位置没有足够的可用空间。\n需要 %1$s,可用 %2$s + 选择文件和文件夹的系统服务不可用 + + 新建 + 文件夹 + 文件 + 新建文件夹 + 同名文件夹或文件已存在 + 名称包含无效字符 + 请输入名称 + 未知错误 + + 文件 \"%s\" 已存在 + 文件 \"%s\" 已存在。是否覆盖? + 文件夹 \"%s\" 已存在 + 合并 + 保留两者 + 覆盖 + 跳过 + 应用到 \'_1\' + 应用到全部冲突项 + 系统不允许在此文件夹中操作,请选择另一个文件夹 + 系统不允许复制到此文件夹,请选择另一个文件夹 + 系统不允许在此文件夹内重命名 + 不能在内部存储上直接重命名文件夹,只能重命名子文件夹 + 无法重命名此文件夹 + + 选择文件夹 + 选择文件 + 确认外部存储器访问权限 + 确认文件夹访问 + 请选择 SD 卡根目录并授予写权限 + 如果您未找到 SD 卡目录,请尝试 + 请在下一个屏幕上按下底部的“使用此文件夹”,允许应用程序访问所选的存储空间。 + 请在下个屏幕上允许访问 \'<b>%s</b>\',方法是按下底部的“<b>使用此文件夹</b>”。 + 请按下下个屏幕底部的“<b>保存</b>”按钮来创建新文件夹。 + 确认选择 + 加载中… + 请允许我们的应用程序访问您的所有文件,没有此权限它可能不能正常工作。 + + %d 个项目 + + + + %d 个项目 + + + 正在删除 %d 个项目 + + + + %d 联系人 + %d 联系人 + + + 选择存储器 + 存储 + 内部存储器 + SD 卡 + 根目录 + 目录选择错误,请选择 SD 卡 + SD 卡和 USB 设备路径不能相同 + 您似乎已将应用程序安装在 SD 卡上,这使得应用的小部件不可用。您将无法在小部件列表里看到它们。 + 这是一个系统限制,所以如果您想要使用这些小部件,您必须将应用移回内部存储器。 + 选中了错误的文件夹,请选择路径 \'%s\' + + 属性 + 路径 + 已选择项目 + 子目录数 + 总文件数 + 分辨率 + 时长 + 艺术家 + 专辑 + 焦距 + 曝光时间 + ISO 速度 + 光圈 + 相机 + EXIF + 歌曲标题 + GPS 坐标 + 海拔高度 + 删除 EXIF + 你确定你想删除 EXIF 值,如 GPS 坐标,相机型号等\? + 成功删除了 EXIF 值 + + 背景色 + 文本颜色 + 主体色 + 白色主题的强调色 + 黑 & 白色主题的强调色 + 前景色 + 应用图标颜色 + 底部导航栏颜色 + 恢复默认 + 使用默认 + 默认 + 修改颜色 + 主题 + 更改颜色将切换到自定义主题 + 保存 + 丢弃 + 撤销更改 + 是否撤销您的更改? + 此操作无法撤销。 + 您尚未保存更改,是否保存? + 应用到所有简约系列应用 + 警告:某些桌面应用无法正确处理自定义应用图标。如果图标消失,请尝试通过 Google Play 或某个小部件启动应用(如果有的话)。 +在成功启动之后,请将图标颜色设置为默认的橙色#F57C00。在最坏的情况下,您可能必须重新安装本应用。 + 颜色更改成功。已添加名为“共享”的新主题,以后您可以使用它来更改所有应用的颜色。 + 注意尽管您已经使用 Pro 版本的应用,由于技术原因您仍然需要简单感谢。它用来负责颜色同步。 + 请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>简单感谢</a> 以解锁此功能并支持开发。感谢! + + 浅色主题 + 深色主题 + 自动 + 自动切换浅色/深色主题 + 曝光过度 + 深红 + 白色 + 黑白 + 自定义 + 共享 + 系统默认 + + 更新日志 + * 此处仅列举了重大更新,更多修正可在使用中体验 + + 删除 + 移除 + 重命名 + 分享 + 分享到 + 调整尺寸 + 全选 + 选择文本 + 隐藏 + 取消隐藏 + 隐藏文件夹 + 取消隐藏文件夹 + 暂时显示隐藏内容 + 停止显示隐藏的媒体文件 + 您不能一次分享太多的内容 + 清空并禁用回收站 + 撤销 + 重做 + 打印 + 打印 (Pro) + 快捷方式 + 创建快捷方式 + 创建快捷方式 (Pro) + 添加号码至联系人 + 查看联系人详情 + 来自 SIM 1 的通话 + 来自 SIM 2 的通话 + 显示文件名 + 移到顶部 + 移到底部 + 固定项目 + 取消固定项目 + 发送短信 + 发送邮件 + 呼叫 + 联系人详情 + 添加联系人 + 壁纸 + + 排序方式 + 名称 + 大小 + 修改日期 + 创建日期 + 拍摄日期 + 标题 + 文件名 + 扩展名 + 随机 + 随机排序 + 递增 + 递减 + 仅应用于此文件夹 + 按实际值排序数字部分 + 名字 + 中间名 + 姓氏 + 全名 + 使用自定义排序 + 更改排序 + + 是否执行此删除操作? + 您确定要删除 %s? + Delete %s? + + 您确定要移动 %s到回收站? + + 您确定要删除此项目吗? + 您确定要移动此项目到回收站吗? + 重启前不再提醒 + 不再显示 + + + 也许 + + 警告: 您正在删除 %d 目录 + + + 密码 + 输入密码 + 请输入密码 + 密码错误 + 重复密码 + 图案 + 绘制图案 + 图案错误 + 重复图案 + 生物识别 + 指纹 + 添加指纹 + 请将手指放在指纹传感器上 + 打开生物识别 ID 验证对话框 + 身份验证 + 验证失败 + 验证已被阻止,请稍后再试 + 您还没有注册指纹,请先给您的设备添加一些指纹 + 去设置 + 密码设置成功。如果您不慎遗忘了,请重新安装本应用。 + 指纹保护设置成功。如果出现问题,请重新安装本应用。 + 锁定文件夹 + 锁定文件夹 (Pro) + 解锁文件夹 + 此保护仅适用于此应用程序,不应取代真正的系统级文件夹加密。 + + 昨天 + 今天 + 明天 + 每天 + 隐藏年份 + + 分钟 + 小时 + + s + m + h + wk. + + %d 秒 + + + %d 分钟 + + + %d 小时 + + + %d 日 + + + %d 周 + + + %d 月 + + + %d 年 + + + + %d 秒 + + + %d 分钟 + + + %d 小时 + + + %d 天 + + + %d 周 + + + %d 月 + + + %d 年 + + + + %d 秒前 + + + %d 分钟前 + + + %d 小时前 + + + %d 天前 + + + %d 周前 + + + %d 月前 + + + %d 年前 + + + + %d 秒 + + + %d 分钟 + + + %d 小时 + + + %d 天 + + + %d 周 + + + %d 月 + + + %d 年 + + + 距闹钟响起还有:\n%s + 距提醒触发还有:\n%s + 剩余时间:\n%s + 在依赖它之前,请确保闹钟能够正常工作。由于系统与节电有关的限制,它有时可能会失灵。 + 在依赖它们之前,请确保提醒能够正常工作。由于系统与节电有关的限制,它们有时可能会失灵。 + 此应用程序的通知已被禁用。请在您的设备设置中启用它们。 + + 闹钟 + 贪睡 + 关闭 + 不再提醒 + 开始时 + 系统铃声 + 您的铃声 + 添加新的铃声 + 无铃声 + 在日间的 小时:分钟 内 + 在日间的 %02d:%02d 内 + + 设置 + 感谢购买 + 通用 + 颜色定制 + 改进的色彩自定义 + 自定义颜色 + 自定义颜色 (锁定) + 已锁定 + 自定义小部件颜色 + 自定义通知 + Notification sound + 强制使用英语语言 + 语言 + 显示隐藏的项目 + 字体大小 + + + + 巨大 + 使用密码保护隐藏项 + 使用密码保护本应用 + 使用密码保护文件删除和移动 + 操作文件时保留旧的最后修改日期 + 拖动滚动条时在滚动项目旁显示一个信息气泡 + 阻止设备自动休眠 + 忽略删除确认对话框 + 启用顶部上拉刷新 + 使用 24 小时制 + 更改日期和时间格式 + 每周以周日开头 + 小部件 + 始终使用相同的贪睡时间 + 贪睡时间 + 按下按键后震动 + 将项目转移到回收站而不是直接删除 + 回收站清理间隔 + 清空回收站 + 固定竖屏使用 + 导出设置 + 导入设置 + 设置导出成功 + 设置导入成功 + 姓氏在前 + 清除缓存 + 开始通话前显示通话确认框 + + 可见度 + 安全 + 滚动 + 文件操作 + 回收站 + 正在保存 + 启动 + 文本 + 转移 + 质量 + 主屏幕 + 缩略图 + 列表视图 + + 排除 + 排除文件夹 + 排除的文件夹 + (已排除) + 管理排除的文件夹 + 全部移除 + 是否移除排除列表中的所有项目?此操作不会删除文件夹本身。 + 临时显示已排除的 + 停止显示已排除的 + + 管理显示的页面 + 应用启动时打开的页面 + 联系人 + 收藏 + 通话记录 + 分组 + 上次使用的 + 文件 + 最近的文件 + + 恢复此文件 + 恢复选中的文件 + 恢复所有文件 + 清空回收站成功 + 恢复文件成功 + 您确定要清空回收站吗?这些文件将永久丢失。 + 回收站是空的 + 移动回收站项目被禁用,请使用恢复功能 + 显示回收站 + 隐藏回收站 + 打开回收站 + 跳过回收站,直接删除文件 + + 正在移动 %d 个项目到回收站 + + + 正在导入… + 正在导出… + 导入成功 + 导出成功 + 导入失败 + 导出失败 + 部分项目导入失败 + 部分项目导出失败 + 未找到要导入的项目 + 没有发现用于导入的新条目 + 未找到要导出的项目 + 备份 + 启用自动备份 + 管理自动备份 + 你可以使用下列模式自动命名你的文件: +\n +\n%Y - 年份 +\n%M - 月份 +\n%D - 天 +\n%h - 小时 +\n%m - 分钟 +\n%s - 秒 + + USB + 检测到有 USB 设备连接到您的设备。您需要授予额外的权限以确保文件能够正确显示。 + 请在下一界面选择 USB 设备的根文件夹以授予访问权限 + 选择错误,请正确选择 USB 设备的根文件夹 + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + Jan + Feb + Mar + Apr + May + June + July + Aug + 九月 + Oct + Nov + Dec + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + 周一 + 周二 + 周三 + 周四 + 周五 + 周六 + 周日 + + + + + + + + 周一 + 周二 + 周三 + 周四 + 周五 + 周六 + 周日 + + 您的应用版本将不会再收到更新。请升级到专业版以获取最新的程序修复和改进。 + 您的应用版本不会再收到更新。请点击此处升级到专业版以获取最新的程序修复和改进。 + 免费期限至: %s。如果在此之后下载,您可以永久免费使用。 + 更多信息 + 升级 + 您必须通过导出/导入.ics文件来自行转移本地存储的事件。您可以在主界面菜单中找到导出/导入选项。 + 嘿, +\n +\n你似乎刚从免费版升级过来。 如果你对专业版感到满意,而且已经迁移了设置和收藏等必要项目,你可以卸载旧的免费版以免意外启动,因你不再需要它。 +\n +\n谢谢! + 嘿, +\n +\n你似乎也安装了这个应用的专业版。如果你用得满意而且已经迁移了设置和收藏等必要项目,你可以卸载免费版以免意外启动,因为你不再需要它。 +\n +\n谢谢! + 嘿, +\n +\n你似乎刚从免费版升级过来。 如果你对收费版用得满意并且已经迁移了数据,你可以卸载旧的免费版避免意外启动,因为你不再需要它了。 +\n +\n谢谢! + 嘿, +\n +\n除了免费版,你似乎也已经安装了专业版。如果你觉得满意并且迁移了数据,你可以卸载免费版避免意外启动,因你不再需要它。 +\n +\n谢谢! + 嘿, +\n +\n你似乎从免费版升级到了专业版。如果你想把免费版中本地存储的事件迁移过来,你必须手动在免费版中把它们导出为 .ics 文件,并通过顶部菜单导入到专业版中。 +\n +\n如果你对专业版设置感到满意,你就可以卸载旧的免费版,因你不再需要它。 +\n +\n谢谢! + 嘿, +\n +\n你似乎刚从免费版升级到了专业版。如果你有任何存储在 \"%s\" 下的联系人,你必须手动在免费版中把它们导出为 .vcf 文件,并通过顶部菜单导入到专业版中。 +\n +\n如果你对专业版设置感到满意,你就可以卸载旧的免费版,因你不再需要它。 +\n +\n谢谢! + 嘿, +\n +\n你似乎刚从免费版升级到了专业版。如果你想迁移笔记数据,你必须手动在免费版中把它们导出为文件,并通过顶部菜单导入到专业版中。 +\n +\n如果你对专业版设置感到满意,你就可以卸载旧的免费版,因你不再需要它。 +\n +\n谢谢! + + 关于 + 网站 + 应用源码 + 发送反馈 + 升级到专业版 + 更多应用 + 我们的其他应用 + 分享给好友 + 嘿,请前往 %2$s 看看我们的 %1$s 吧 + 分享到 + 为我们评分 + 评分 + 捐赠 + 关注我们 + v %1$s +\n版权所有 © Simple Mobile Tools %2$d + 支持 + 帮助我们 + 社交网络 + 其他 + 隐私政策 + 版本 %s + 你好 :) + 饱含 ❤️ 于斯洛伐克制作 + 额外信息 + 应用版本:%s + 设备系统:%s + +
    + 希望您喜欢这个应用。它不包含广告,所以请购买Simple Thank You 这个应用支持一下,这样此对话框将不再出现。

    + 非常感谢! + ]]> +
    + 你好,<br><br>希望您喜欢这个应用程序。它不包含广告,我们也不收集您的数据,要支持它的开发, 请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. 您将解锁所有的应用功能,包括颜色自定义。<br><br>谢谢你! + 请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> 支持我们,购买后还可解锁所有应用功能,包括允许定制颜色。 + 购买 + 订购 Simple Phone + 请更新简单感谢到最新版本 + 提问之前,请先打开应用设置并阅读常见问题。也许您可以在那里找到答案。 + 评分之前,请先打开应用设置并阅读常见问题。也许您可以在那里找到答案。 + 另外,请确保您正在使用的是最新版本的应用。 + 还请注意,作者不再开发这个应用版本,请获取有多处改进的专业版。 + 阅读 + 阅读常见问题 + 您好,\n\n看来您使用这个应用已经有一段时间了,我们真的很感激。\n\n如果您喜欢,请在Google Play上为我们评分。这对我们很有帮助。\n\n无论您做何决定,您都不会再看到这个消息了。\n\n感谢! + 请为我们的应用评分 :) + 非常感谢 + 小部件被锁定。 +\n请升级到专业版解锁。 + 此功能被锁,请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> 解锁完整版应用。<br><br>这是一次性付款,如果您不满意,我们可以退款给您。 + + 嘿,<br><br>我们最近发布了一些新的应用:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> 您可以点击标题或图标来下载。<br><br> 谢谢 + 简单应用启动器 + 简单计算器 + 简单日历 + 简单相机 + 简单时钟 + 简单通讯录 + 简单拨号器 + 简单绘图 + 简单文件管理器 + 简单手电筒 + 简单图库 + 简单键盘 + 简单启动器 + 简单音乐播放器 + 简单笔记 + 简单短信 + 简单感谢 + 简单录音机 + 应用启动器 + 计算器 + 日历 + 相机 + 时钟 + 通讯录 + 拨号器 + 绘图 + 文件管理器 + 手电筒 + 图库 + 键盘 + 启动器 + 音乐播放器 + 笔记 + 短信 + 感谢 + 录音机 + + 在此下载原版应用。 + ]]> + + + 常见问题 + 在提问之前,请先阅读 + 为什么我在应用小部件列表里没有找到这个应用的小部件? + 这很可能是因为您将应用程序移动到了SD卡。由于 Android 系统的限制,在这种情况下会隐藏应用程序的小部件。 唯一的解决方法是在系统设置中将应用程序移回内部存储。 + 我想支持您,但我不能捐赠金钱。 还有什么是我能够做的吗? + 是的,当然。 您可以传播有关应用程序的信息或提供良好的反馈和评分。 您还可以通过以新语言翻译应用程序,或仅更新一些现有翻译来提供帮助。 翻译指南位于 <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, 或者如果你有任何问题,欢迎发送邮件到 <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> 。 + 我该怎么恢复误删的文件? + 不幸的是,您无法恢复。在确认对话框后文件将被立即删除,您并没有回收站用。 + 我不喜欢小部件的颜色,我可以修改吗? + 是可以的,当您在主屏幕上拖动小部件时,会出现小部件配置界面。您会在左下角看到彩色的方块,只需按下它们即可选择新的颜色。您还可以通过滑块来调整 Alpha 值。 + 我可以恢复已删除的文件吗? + 如果您确实把它们删除了,那么您无法恢复。不过,默认情况下启用了回收站,所以文件可能被移动到回收站了而不是被删除了。 + 应用图标消失了。我该怎么办? + 这是因为某些桌面应用无法正确处理自定义应用图标。如果图标消失,请尝试通过 Google Play 或某个小部件启动应用(如果有的话)。 +在成功启动之后,请将图标颜色设置为默认的橙色#F57C00。在最坏的情况下,您可能必须重新安装本应用。 + 我已付费,但我无法下载这个应用,我该怎么办? + 支付完全是由Google处理的,他们的系统有时会发生故障。您可以在清除Google Play的应用数据之后,重启设备并再次尝试下载。 + 为什么我需要升级到专业版? + 由于您的应用程序版本不再更新,bug可能将永远得不到修复,也不会再添加任何新功能。 您可以在Google Play上花少量的钱来购买专业版。 + 这是一次性付款,意味着您在购买之后就不再收费,即使您更换了新的设备。 如果您不喜欢Pro版本,可以在几个小时内将其卸载,之后您将自动收到退款。 +         如果您想要在此之后退款,请通过hello@simplemobiletools.com与我们联系。 + 我如何一次性选择多个项目? + 有多种方式可以做到。第一种是长按一个项目进入选择模式,然后轻轻点击其余项目来选择它们。第二种方式类似于在电脑上使用鼠标选择项目, + 长按一个项目进入选择模式,然后用您的手指向下滑过其它项目来实现选择。第三种选择多个项目的方式是长按一个项目,然后长按另一个从而选择它们之间全部的项目。如果您 + 想要选择所有的项目,只需长安一个项目,然后点击在左上角的项目计数器。这样将会选择或者取消选择全部项目。 + 我已经购买了这个应用,但我无法在另外的设备下载它。 + 尝试清除您 Google Play 应用缓存并重启您的设备。这是某些 Google Play 的小问题,并非应用程序本身的问题。 + + 贡献者 + 翻译 + 开发 + 其他帮助 + 此列表包含对 Simple Mobile Tools 套件中的任何应用程序有显著帮助的所有人,而不仅仅是这个应用程序。 翻译由志愿者处理,如果您也想提供帮助,请告诉我们。 翻译指南位于 <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>,或者如果你有任何问题,欢迎发送电子邮件到 <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>。感谢所有贡献者和其他支持者! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + 立即获取专业版! + 基础版 + 专业版 + 无广告 + 无互联网访问权限 + 100% 退款保证 + 一次性付款 + 改进的设计 + + 高级照片编辑器 + 高级照片和视频编辑器 + 支持 HEIC/HEIF 文件 + 高级批量文件重命名 + 单独文件夹锁定 + 支持打印 + + 支持时区 + 出席人和电邮提醒 + 轻松导入事件 + 新的小部件 + + 改进了重复联系人合并功能 + 定制字体大小 + 应用内可选的私密联系人共享 + 可自定义的联系人铃声 + 联系人过滤 + 私密地保存联系人 + + 清单 + 每个小部件不同的注释和颜色 + 锁定笔记 + + 自定义日期和时间格式 + 主屏幕快捷方式 + 文件压缩支持 + 包含最近文件的标签页 + + 自定义背景色 + 支持文件导入 + 缩放 + + 此应用使用了以下三方库。致谢。 + 第三方许可证 + Kotlin (编程语言) + 子采样比例图像视图 (可缩放的图像视图) + Glide(图片加载和缓存) + Picasso (图片加载和缓存) + 安卓图像剪裁器(图像裁剪和旋转) + RtlViewPager (从右向左滑动) + Joda-Time (Java日期替换) + Stetho (调试数据库) + Otto (事件总线) + PhotoView (可缩放 GIFs) + PatternLockView (模式保护) + Reprint (指纹保护) + Gif Drawable (加载 GIFs) + AutoFitTextView (调整文本大小) + Robolectric (测试框架) + Espresso (测试助手) + Gson (JSON 解析器) + Leak Canary (内存泄漏检测器) + Number Picker (可定制的号码选择器) + ExoPlayer (视频播放器) + VR Panorama View (显示全景) + Apache Sanselan (读取图像元数据) + Android Photo Filters (图像滤镜) + Gesture Views (可缩放的图像) + Indicator Fast Scroll (滚动条上的字母) + Event Bus (应用程序内通信) + Audio Record View (音频可视化) + SMS MMS (短信和彩信处理) + APNG Android (动画 WebP 支持) + PDFViewPager (PDF 查看器) + M3U 解析器 (m3u 播放列表文件处理) + AndroidLame (mp3 编码器) + + 试用期已过 + 开始免费试用 + 你的试用期即将结束。 + 再试用最后一天 + 欢迎来到 %s! + 谢谢你使用我们的应用。你可以使用此解锁版 %d 天。试用结束后请考虑升级到专业版。专业版有大量新功能,现代设计,无广告及许多其他改进。 +\n +\n你只需付款一次,如不满意你可以卸载它并获得退款。 +\n +\n希望你会喜欢它 :) + 请升级到专业版以最大程度享受本应用 +\n +\n你只需付款一次,如不满意你可以卸载它并获得退款。 +\n +\n希望你会喜欢它 :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + 已弃用:该应用版本已不再维护,请在以下链接获取专业版 https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + 别忘了如果您在2小时内卸载任何付费应用将会自动退款。如果您想在之后退款,只需通过 hello@simplemobiletools.com 联系我们即可。这样您就可以放心试用了 :) + + 一组简单且开源的 Android 应用程序,可自定义小部件,并且没有广告和不必要的权限。 +
    \ No newline at end of file diff --git a/commons/src/main/res/values-zh-rHK/strings.xml b/commons/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000..ab3037556 --- /dev/null +++ b/commons/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,1035 @@ + + + 确认 + 取消 + 返回 + 没有东西 + 稍后 + 保存 + 文件保存成功 + 无效文件格式 + 内存不足 + 啊哦,出错啦:%s + 错误: %s + 打开方式 + 编辑方式 + 编辑 + 未找到可用应用 + 未找到浏览器 + 未找到电子邮件客户端 + 设置为 + 复制到剪贴板 + 复制号码到剪贴板 + 内容已复制到剪贴板 + 内容已复制到剪贴板:\n%s + 拨号 + 未知 + 总是 + 从不 + 详细 + 笔记 + 正在删除目录 \'%s\' + + 标签 + 透明 + 透明颜色 + 选择一个不同的颜色 + 下载 + 通知 + 通知 + 电子邮件 + 上一首 + 播放/暂停 + 下一首 + 号码 + 未发现联系人 + 请求必要的权限 + 该应用无法访问联系人 + 应用没有发起呼叫的权限,请在设备设置中授予该权限 + 在此输入文本 + 打电话给 %s + Confirm calling %s + + + + + + + + + + + + 值不能为空 + 建立新联系人 + 添加至已存在的联系人 + 应用损坏 + 免责声明 + 拍照 + 选择照片 + 选择视频 + 选择联系人 + 选择文件 + 录音 + 录像 + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + 生日 + 纪念日 + + 家庭 + 工作 + + 手机 + 主用 + 工作传真 + 家庭传真 + 呼叫器 + 未发现电话号码 + + 更改视图类型 + 网格 + 网格 (Pro) + 非均匀网格 + 列表 + 显示更多项目 + 显示更少项目 + 列数 + 垂直列数 + 水平列数 + 更换封面图片 + 选择图片 + + %d column + %d columns + + + 管理黑名单 + 你没有拦截任何人。 + 添加黑名单号码 + 加入黑名单 + 加入黑名单 + 黑名单 + 导出屏蔽号码 + 导入屏蔽号码 + 您必须将这应用程序设为默认的拨号程序来使用黑名单。 + 设为默认 + 您确定要将 \"%s\" 添加到黑名单吗? + 拦截来自未存储联系人的通话 + 拦截来自未存储联系人的消息 + 输入号码或模式(例如 *12345*、+1*8888)以阻止来自匹配模式的号码的所有来电和消息。 + 要拦截未知号码,你必须将应用设为默认的来电显示和骚扰电话屏蔽应用。 + + 收藏 + 添加收藏 + 添加到收藏 + 从收藏中移除 + + 搜索 + Search in %s + 请输入至少两个字符来开始搜索。 + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + 过滤 + 过滤 (Pro) + 找不到任何项目。 + 更改过滤器 + + 请授予存储权限 + 请授予通讯录权限 + 请授予相机权限 + 请授予音频权限 + 无权限 + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + 重命名文件 + 重命名文件夹 + 无法重命名文件 + 无法重命名文件夹 + 文件夹名不能为空 + 文件夹名已存在 + 无法重命名存储器的根目录 + 文件夹重命名成功 + 重命名文件夹 + 文件名不能为空 + 文件名包含非法字符 + 文件名 \'%s\' 包含无效的字符 + 扩展名不能为空 + 原文件 %s 不存在 + 文件名前缀 + 文件名后缀 + 简单重命名 + 图案 + 要添加的字符串 + %Y - 年\n%M - 月\n%D - 日\n%h - 时\n%m - 分\n%s - 秒\n%i - 数字从1递增 + 文件名(不带 .txt) + 文件名(不带 .json) + 文件名(不带 .zip) + 从 Android 11 开始,你再也不能像这样隐藏文件和文件夹了 + + 复制 + 移动 + 复制/移动 + 复制到 + 移动到 + 原始路径 + 目标路径 + 选择目标路径 + 点击此处以设置目标路径 + 无法写入到选中目标路径 + 请选择目标路径 + 原始路径和目标路径不能相同 + 无法复制文件 + 正在复制… + 复制成功 + 文件复制成功 + 操作失败 + 正在移动… + 文件移动成功 + 文件移动成功 + 无法移动相同文件 + 无法复制相同文件 + 未选择文件 + 正在保存… + 创建文件夹 %s 失败 + 创建文件 %s 失败 + 没有找到新的项目 + 目标位置没有足够的可用空间。\n需要 %1$s,可用 %2$s + 选择文件和文件夹的系统服务不可用 + + 新建 + 文件夹 + 文件 + 新建文件夹 + 同名文件夹或文件已存在 + 名称包含非法字符 + 请输入名称 + 未知错误 + + 文件 \"%s\" 已存在 + 文件 \"%s\" 已存在。是否覆盖? + 文件夹 \"%s\" 已存在 + 合并 + 保留两者 + 覆盖 + 跳过 + 应用到 \'_1\' + 应用到全部冲突项 + 系统不允许在此文件夹中操作,请选择另一个文件夹 + 系统不允许复制到此文件夹,请选择另一个文件夹 + 系统不允许在此文件夹内重命名 + 不能在内部存储上直接重命名文件夹,只能重命名子文件夹 + 无法重命名此文件夹 + + 选择文件夹 + 选择文件 + 确认外部存储器访问权限 + 确认文件夹访问 + 请选择 SD 卡根目录并授予写权限 + 如果您未找到 SD 卡目录,请尝试 + 请在下一个屏幕上按下底部的“使用此文件夹”,允许应用程序访问所选的存储空间。 + 请在下个屏幕上允许访问 \'<b>%s</b>\',方法是按下底部的“<b>使用此文件夹</b>”。 + 请按下下个屏幕底部的“<b>保存</b>”按钮来创建新文件夹。 + 确认选择 + 加载中… + 请允许我们的应用程序访问您的所有文件,没有此权限它可能不能正常工作。 + + %d 个项目 + + + + %d 个项目 + + + 正在删除 %d 个项目 + + + + %d 联系人 + %d 联系人 + + + 选择存储器 + 存储 + 内部存储器 + SD 卡 + 根目录 + 目录选择错误,请选择 SD 卡 + SD 卡和 USB 设备路径不能相同 + 您似乎已将应用程序安装在 SD 卡上,这使得应用的小部件不可用。您将无法在小部件列表里看到它们。 + 这是一个系统限制,所以如果您想要使用这些小部件,您必须将应用移回内部存储器。 + 选中了错误的文件夹,请选择路径 \'%s\' + + 属性 + 路径 + 已选择项目 + 子目录数 + 总文件数 + 分辨率 + 时长 + 艺术家 + 专辑 + 焦距 + 曝光时间 + ISO 速度 + 光圈 + 相机 + EXIF + 歌曲标题 + GPS 坐标 + 海拔高度 + 删除 EXIF + 你确定你想删除 EXIF 值,如 GPS 坐标,相机型号等\? + 成功删除了 EXIF 值 + + 背景色 + 文本颜色 + 主体色 + 白色主题的强调色 + 黑 & 白色主题的强调色 + 前景色 + 应用图标颜色 + 底部导航栏颜色 + 恢复默认 + 使用默认 + 默认 + 修改颜色 + 主题 + 更改颜色将切换到自定义主题 + 保存 + 丢弃 + 撤销更改 + 是否撤销您的更改? + 此操作無法撤消。 + 您尚未保存更改,是否保存? + 应用到所有简约系列应用 + 警告:某些桌面应用无法正确处理自定义应用图标。如果图标消失,请尝试通过 Google Play 或某个小部件启动应用(如果有的话)。 +在成功启动之后,请将图标颜色设置为默认的橙色#F57C00。在最坏的情况下,您可能必须重新安装本应用。 + 颜色更改成功。已添加名为“共享”的新主题,以后您可以使用它来更改所有应用的颜色。 + 注意尽管您已经使用 Pro 版本的应用,由于技术原因您仍然需要简单感谢。它用来负责颜色同步。 + 请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>简单感谢</a> 以解锁此功能并支持开发。感谢! + + 浅色主题 + 深色主题 + 自动 + 自动切换浅色/深色主题 + 曝光过度 + 深红 + 白色 + 黑白 + 自定义 + 共享 + 系统默认 + + 更新日志 + * 此处仅列举了重大更新,更多修正可在使用中体验 + + 删除 + 移除 + 重命名 + 分享 + 分享到 + 调整尺寸 + 全选 + 选择文本 + 隐藏 + 取消隐藏 + 隐藏文件夹 + 取消隐藏文件夹 + 暂时显示隐藏内容 + 停止显示隐藏的媒体文件 + 您不能一次分享太多的内容 + 清空并禁用回收站 + 撤销 + 重做 + 打印 + 打印 (Pro) + 快捷方式 + 创建快捷方式 + 创建快捷方式 (Pro) + 添加号码至联系人 + 查看联系人详情 + 来自 SIM 1 的通话 + 来自 SIM 2 的通话 + 显示文件名 + 移到顶部 + 移到底部 + 固定项目 + 取消固定项目 + 发送短信 + 发送邮件 + 呼叫 + 联系人详情 + 添加联系人 + 壁纸 + + 排序方式 + 名称 + 大小 + 修改日期 + 创建日期 + 拍摄日期 + 标题 + 文件名 + 扩展名 + 随机 + 随机排序 + 递增 + 递减 + 仅应用于此文件夹 + 按实际值排序数字部分 + 名字 + 中间名 + 姓氏 + 全名 + 使用自定义排序 + 更改排序 + + 是否执行此删除操作? + 您确定要删除 %s? + Delete %s? + + 您确定要移动 %s到回收站? + + 您确定要删除此项目吗? + 您确定要移动此项目到回收站吗? + 重启前不再提醒 + 不再显示 + + + 也许 + + 警告: 您正在删除 %d 目录 + + + 密码 + 输入密码 + 请输入密码 + 密码错误 + 重复密码 + 图案 + 绘制图案 + 图案错误 + 重复图案 + 生物识别 + 指纹 + 添加指纹 + 请将手指放在指纹传感器上 + 打开生物识别 ID 验证对话框 + 身份验证 + 验证失败 + 验证已被阻止,请稍后再试 + 您还没有注册指纹,请先给您的设备添加一些指纹 + 去设置 + 密码设置成功。如果您不慎遗忘了,请重新安装本应用。 + 指纹保护设置成功。如果出现问题,请重新安装本应用。 + 锁定文件夹 + 锁定文件夹 (Pro) + 解锁文件夹 + 此保护仅适用于此应用程序,不应取代真正的系统级文件夹加密。 + + 昨天 + 今天 + 明天 + 每天 + 隐藏年份 + + 分钟 + 小时 + + s + m + h + wk. + + %d 秒 + + + %d 分钟 + + + %d 小时 + + + %d 日 + + + %d 周 + + + %d 月 + + + %d 年 + + + + %d 秒 + + + %d 分钟 + + + %d 小时 + + + %d 天 + + + %d 周 + + + %d 月 + + + %d 年 + + + + %d 秒前 + + + %d 分钟前 + + + %d 小时前 + + + %d 天前 + + + %d 周前 + + + %d 月前 + + + %d 年前 + + + + %d 秒 + + + %d 分钟 + + + %d 小时 + + + %d 天 + + + %d 周 + + + %d 月 + + + %d 年 + + + 距闹钟响起还有:\n%s + 距提醒触发还有:\n%s + 剩余时间:\n%s + 在依赖它之前,请确保闹钟能够正常工作。由于系统与节电有关的限制,它有时可能会失灵。 + 在依赖它们之前,请确保提醒能够正常工作。由于系统与节电有关的限制,它们有时可能会失灵。 + 此应用程序的通知已被禁用。请在您的设备设置中启用它们。 + + 闹钟 + 贪睡 + 关闭 + 不再提醒 + 开始时 + 系统铃声 + 您的铃声 + 添加新的铃声 + 无铃声 + 在日间的 小时:分钟 内 + 在日间的 %02d:%02d 内 + + 设置 + 感谢购买 + 通用 + 颜色定制 + Improved color customization + 自定义颜色 + 自定义颜色 (锁定) + 已锁定 + 自定义小部件颜色 + 自定义通知 + Notification sound + 强制使用英语语言 + 语言 + 显示隐藏的项目 + 字体大小 + + + + 巨大 + 使用密码保护隐藏项 + 使用密码保护本应用 + 使用密码保护文件删除和移动 + 操作文件时保留旧的最后修改日期 + 拖动滚动条时在滚动项目旁显示一个信息气泡 + 阻止设备自动休眠 + 忽略删除确认对话框 + 启用顶部上拉刷新 + 使用 24 小时制 + 更改日期和时间格式 + 每周以周日开头 + 小部件 + 始终使用相同的贪睡时间 + 贪睡时间 + 按下按键后震动 + 将项目转移到回收站而不是直接删除 + 回收站清理间隔 + 清空回收站 + 固定竖屏使用 + 导出设置 + 导入设置 + 设置导出成功 + 设置导入成功 + 姓氏在前 + 清除缓存 + 开始通话前显示通话确认框 + + 可见度 + 安全 + 滚动 + 文件操作 + 回收站 + 正在保存 + 启动 + 文本 + 转移 + 质量 + 主屏幕 + 缩略图 + 列表视图 + + 排除 + 排除文件夹 + 排除的文件夹 + (已排除) + 管理排除的文件夹 + 全部移除 + 是否移除排除列表中的所有项目?此操作不会删除文件夹本身。 + 临时显示已排除的 + 停止显示已排除的 + + 管理显示的页面 + 应用启动时打开的页面 + 联系人 + 收藏 + 通话记录 + 分组 + 上次使用的 + 文件 + 最近的文件 + + 恢复此文件 + 恢复选中的文件 + 恢复所有文件 + 清空回收站成功 + 恢复文件成功 + 您确定要清空回收站吗?这些文件将永久丢失。 + 回收站是空的 + 移动回收站项目被禁用,请使用恢复功能 + 显示回收站 + 隐藏回收站 + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + 正在移动 %d 个项目到回收站 + + + 正在导入… + 正在导出… + 导入成功 + 导出成功 + 导入失败 + 导出失败 + 部分项目导入失败 + 部分项目导出失败 + 未找到要导入的项目 + 没有发现用于导入的新条目 + 未找到要导出的项目 + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + 检测到有 USB 设备连接到您的设备。您需要授予额外的权限以确保文件能够正确显示。 + 请在下一界面选择 USB 设备的根文件夹以授予访问权限 + 选择错误,请正确选择 USB 设备的根文件夹 + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + 周一 + 周二 + 周三 + 周四 + 周五 + 周六 + 周日 + + + + + + + + 周一 + 周二 + 周三 + 周四 + 周五 + 周六 + 周日 + + 您的应用版本将不会再收到更新。请升级到专业版以获取最新的程序修复和改进。 + 您的应用版本不会再收到更新。请点击此处升级到专业版以获取最新的程序修复和改进。 + 免费期限至: %s。如果在此之后下载,您可以永久免费使用。 + 更多信息 + 升级 + 您必须通过导出/导入.ics文件来自行转移本地存储的事件。您可以在主界面菜单中找到导出/导入选项。 + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + 关于 + 网站 + 应用源码 + 发送反馈 + 升级到专业版 + 更多应用 + 我们的其他应用 + 分享给好友 + 嘿,请前往 %2$s 看看我们的 %1$s 吧 + 分享到 + 为我们评分 + 评分 + 捐赠 + 关注我们 + v %1$s +\n版权所有 © Simple Mobile Tools %2$d + 支持 + 帮助我们 + 社交网络 + 其他 + 隐私政策 + 版本 %s + 你好 :) + 饱含 ❤️ 于斯洛伐克制作 + 额外信息 + 应用版本:%s + 设备系统:%s + +
    + 希望您喜欢这个应用。它不包含广告,所以请购买Simple Thank You 这个应用支持一下,这样此对话框将不再出现。

    + 非常感谢! + ]]> +
    + 你好,<br><br>希望您喜欢这个应用程序。它不包含广告,我们也不收集您的数据,要支持它的开发, 请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a>. 您将解锁所有的应用功能,包括颜色自定义。<br><br>谢谢你! + 请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> 支持我们,购买后还可解锁所有应用功能,包括允许定制颜色。 + 购买 + 订购 Simple Phone + 请更新简单感谢到最新版本 + 提问之前,请先打开应用设置并阅读常见问题。也许您可以在那里找到答案。 + 评分之前,请先打开应用设置并阅读常见问题。也许您可以在那里找到答案。 + 另外,请确保您正在使用的是最新版本的应用。 + 还请注意,作者不再开发这个应用版本,请获取有多处改进的专业版。 + 阅读 + 阅读常见问题 + 您好,\n\n看来您使用这个应用已经有一段时间了,我们真的很感激。\n\n如果您喜欢,请在Google Play上为我们评分。这对我们很有帮助。\n\n无论您做何决定,您都不会再看到这个消息了。\n\n感谢! + 请为我们的应用评分 :) + 非常感谢 + 小部件被锁定。 +\n请升级到专业版解锁。 + 此功能被锁,请购买 <a href=https://play.google.com/store/apps/details\?id=com.simplemobiletools.thankyou>Simple Thank You</a> 解锁完整版应用。<br><br>这是一次性付款,如果您不满意,我们可以退款给您。 + + 嘿,<br><br>我们最近发布了一些新的应用:<br><br> <a href=%1$s>%2$s</a><br><br> <a href=%3$s>%4$s</a><br><br> <a href=%5$s>%6$s</a><br><br> 您可以点击标题或图标来下载。<br><br> 谢谢 + 简单应用启动器 + 简单计算器 + 简单日历 + 简单相机 + 简单时钟 + 简单通讯录 + 简单拨号器 + 简单绘图 + 简单文件管理器 + 简单手电筒 + 简单图库 + 简单键盘 + 简单启动器 + 简单音乐播放器 + 简单笔记 + 简单短信 + 简单感谢 + 简单录音机 + 应用启动器 + 计算器 + 日历 + 相机 + 时钟 + 通讯录 + 拨号器 + 绘图 + 文件管理器 + 手电筒 + 图库 + 键盘 + 启动器 + 音乐播放器 + 笔记 + 短信 + 感谢 + 录音机 + + 在此下载原版应用。 + ]]> + + + 常见问题 + 在提问之前,请先阅读 + 为什么我在应用小部件列表里没有找到这个应用的小部件? + 这很可能是因为您将应用程序移动到了SD卡。由于 Android 系统的限制,在这种情况下会隐藏应用程序的小部件。 唯一的解决方法是在系统设置中将应用程序移回内部存储。 + 我想支持您,但我不能捐赠金钱。 还有什么是我能够做的吗? + 是的,当然。 您可以传播有关应用程序的信息或提供良好的反馈和评分。 您还可以通过以新语言翻译应用程序,或仅更新一些现有翻译来提供帮助。 翻译指南位于 <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>, 或者如果你有任何问题,欢迎发送邮件到 <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a> 。 + 我该怎么恢复误删的文件? + 不幸的是,您无法恢复。在确认对话框后文件将被立即删除,您并没有回收站用。 + 我不喜欢小部件的颜色,我可以修改吗? + 是可以的,当您在主屏幕上拖动小部件时,会出现小部件配置界面。您会在左下角看到彩色的方块,只需按下它们即可选择新的颜色。您还可以通过滑块来调整 Alpha 值。 + 我可以恢复已删除的文件吗? + 如果您确实把它们删除了,那么您无法恢复。不过,默认情况下启用了回收站,所以文件可能被移动到回收站了而不是被删除了。 + 应用图标消失了。我该怎么办? + 这是因为某些桌面应用无法正确处理自定义应用图标。如果图标消失,请尝试通过 Google Play 或某个小部件启动应用(如果有的话)。 +在成功启动之后,请将图标颜色设置为默认的橙色#F57C00。在最坏的情况下,您可能必须重新安装本应用。 + 我已付费,但我无法下载这个应用,我该怎么办? + 支付完全是由Google处理的,他们的系统有时会发生故障。您可以在清除Google Play的应用数据之后,重启设备并再次尝试下载。 + 为什么我需要升级到专业版? + 由于您的应用程序版本不再更新,bug可能将永远得不到修复,也不会再添加任何新功能。 您可以在Google Play上花少量的钱来购买专业版。 + 这是一次性付款,意味着您在购买之后就不再收费,即使您更换了新的设备。 如果您不喜欢Pro版本,可以在几个小时内将其卸载,之后您将自动收到退款。 +         如果您想要在此之后退款,请通过hello@simplemobiletools.com与我们联系。 + 我如何一次性选择多个项目? + 有多种方式可以做到。第一种是长按一个项目进入选择模式,然后轻轻点击其余项目来选择它们。第二种方式类似于在电脑上使用鼠标选择项目, + 长按一个项目进入选择模式,然后用您的手指向下滑过其它项目来实现选择。第三种选择多个项目的方式是长按一个项目,然后长按另一个从而选择它们之间全部的项目。如果您 + 想要选择所有的项目,只需长安一个项目,然后点击在左上角的项目计数器。这样将会选择或者取消选择全部项目。 + 我已经购买了这个应用,但我无法在另外的设备下载它。 + 尝试清除您 Google Play 应用缓存并重启您的设备。这是某些 Google Play 的小问题,并非应用程序本身的问题。 + + 贡献者 + 翻译 + 开发 + 其他帮助 + 此列表包含对 Simple Mobile Tools 套件中的任何应用程序有显著帮助的所有人,而不仅仅是这个应用程序。 翻译由志愿者处理,如果您也想提供帮助,请告诉我们。 翻译指南位于 <a href=https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file>this website</a>,或者如果你有任何问题,欢迎发送电子邮件到 <a href=mailto:hello@simplemobiletools.com>hello@simplemobiletools.com</a>。感谢所有贡献者和其他支持者! + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + 立即获取专业版! + 基础版 + 专业版 + 无广告 + 无互联网访问权限 + 100% 退款保证 + 一次性付款 + 改进的设计 + + 高级照片编辑器 + 高级照片和视频编辑器 + 支持 HEIC/HEIF 文件 + 高级批量文件重命名 + 单独文件夹锁定 + 支持打印 + + 支持时区 + 出席人和电邮提醒 + 轻松导入事件 + 新的小部件 + + 改进了重复联系人合并功能 + 定制字体大小 + 应用内可选的私密联系人共享 + 可自定义的联系人铃声 + 联系人过滤 + 私密地保存联系人 + + 清单 + 每个小部件不同的注释和颜色 + 锁定笔记 + + 自定义日期和时间格式 + 主屏幕快捷方式 + 文件压缩支持 + 包含最近文件的标签页 + + 自定义背景色 + 支持文件导入 + 缩放 + + 此应用使用了以下三方库。致谢。 + 第三方许可证 + Kotlin (编程语言) + 子采样比例图像视图 (可缩放的图像视图) + Glide(图片加载和缓存) + Picasso (图片加载和缓存) + 安卓图像剪裁器(图像裁剪和旋转) + RtlViewPager (从右向左滑动) + Joda-Time (Java日期替换) + Stetho (调试数据库) + Otto (事件总线) + PhotoView (可缩放 GIFs) + PatternLockView (模式保护) + Reprint (指纹保护) + Gif Drawable (加载 GIFs) + AutoFitTextView (调整文本大小) + Robolectric (测试框架) + Espresso (测试助手) + Gson (JSON 解析器) + Leak Canary (内存泄漏检测器) + Number Picker (可定制的号码选择器) + ExoPlayer (视频播放器) + VR Panorama View (显示全景) + Apache Sanselan (读取图像元数据) + Android Photo Filters (图像滤镜) + Gesture Views (可缩放的图像) + Indicator Fast Scroll (滚动条上的字母) + Event Bus (应用程序内通信) + Audio Record View (音频可视化) + SMS MMS (短信和彩信处理) + APNG Android (动画 WebP 支持) + PDFViewPager (PDF 查看器) + M3U 解析器 (m3u 播放列表文件处理) + AndroidLame (mp3 编码器) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + 已弃用:该应用版本已不再维护,请在以下链接获取专业版 https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + 别忘了如果您在2小时内卸载任何付费应用将会自动退款。如果您想在之后退款,只需通过 hello@simplemobiletools.com 联系我们即可。这样您就可以放心试用了 :) + + 一组简单且开源的 Android 应用程序,可自定义小部件,并且没有广告和不必要的权限。 +
    \ No newline at end of file diff --git a/commons/src/main/res/values-zh-rTW/strings.xml b/commons/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..7f5ac04b5 --- /dev/null +++ b/commons/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,1059 @@ + + + 確定 + 取消 + Back + Nothing + Later + 儲存 + 成功儲存檔案 + 無效的檔案格式 + 記憶體不足 + 發生錯誤: %s + Error: %s + 以其他應用程式開啟 + 用其他程式編輯 + Edit + 找不到應用程式 + No browser found + No email client found + 設為 + Copy to clipboard + Copy number to clipboard + 數值複製到剪貼簿 + 數值複製到剪貼簿:\n%s + Dial number + 未知的 + 總是 + 從不 + 詳細資訊 + 筆記 + 資料夾 \'%s\' 刪除中 + + 標籤 + 透明 + 透明顏色 + 選取不同的顏色 + 下載 + 通知 + Notifications + 電子信箱 + 上一首 + 播放 / 暫停 + 下一首 + 號碼 + 未發現聯絡人 + 請求必要的權限 + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + 打電話給 %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + 建立新聯絡人 + 添加至已存在的聯絡人 + App Corrupt + Disclaimer + 拍照 + 選擇相片 + Choose video + Choose contact + Choose file + Record audio + Record video + 更新中… + 手機空間 + 手機空間 (其他程式不可見) + Audio + + 生日 + 紀念日 + + 住家 + 工作 + + 手機 + 主用 + 工作傳真 + 住家傳真 + 呼叫器 + 未發現電話號碼 + + 改變瀏覽類型 + 格狀 + 格狀 (Pro) + Uneven Grid + 列表 + 增加欄數 + 減少欄數 + Column count + Portrait column count + Landscape column count + 更換封面圖片 + 選擇相片 + + %d column + %d columns + + + 管理黑名單 + 你沒有封鎖任何人 + 添加封鎖的號碼 + 封鎖號碼 + 封鎖號碼 + 黑名單 + Export blocked numbers + Import blocked numbers + 你必須將這應用程式設為預設的撥號程式來使用黑名單。 + 設為預設 + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + 我的最愛 + 添加我的最愛 + 加入我的最愛 + 移除我的最愛 + + 搜尋 + Search in %s + 輸入兩個字以上來開始搜尋。 + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + 篩選 + 篩選 (Pro) + 未發現項目 + 更改篩選條件 + + 儲存空間權限是必要的 + 聯絡人權限是必要的 + 相機權限是必要的 + 音訊權限是必要的 + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + 重新命名檔案 + 重新命名資料夾 + 無法重新命名檔案 + 無法重新命名資料夾 + 資料夾名稱不得空白 + 已經存在這名稱的資料夾 + 無法重新命名根目錄 + 成功重新命名資料夾 + 資料夾重新命名中 + 檔名不得空白 + 檔名包含無效字元 + 檔名 \'%s\' 包含無效字元 + 副檔名不得空白 + 原始檔案 %s 不存在 + 檔名前綴 + 附加檔名 + 簡易重新命名 + 格式重新命名 + 添加文字 + %Y - 年\n%M - 月\n%D - 日\n%h - 小時\n%m - 分鐘\n%s - 秒鐘\n%i - 數字從1增加起 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + 複製 + 移動 + 複製 / 移動 + 複製 + 移動 + 來源 + 目標 + 選擇目標 + 點此選擇目標 + 無法寫入選擇的目標 + 請選擇目標 + 目標跟來源不能相同 + 無法複製檔案 + 複製中… + 成功複製檔案 + File copied successfully + 發生錯誤 + 移動中… + 成功移動檔案 + File moved successfully + 部分檔案無法被移動 + 部分檔案無法被複製 + 未選擇檔案 + 儲存中… + 無法建立資料夾 %s + 無法建立檔案 %s + 未發現新的項目 + 目標沒有足夠的可用空間。\n需求 %1$s, 可用 %2$s + System service for selecting files and folders is unavailable + + 新增 + 資料夾 + 檔案 + 新增資料夾 + 已經存在相同名稱的檔案或資料夾 + 名稱包含無效的字元 + 請輸入一個名稱 + 發生未知的錯誤 + + 檔案 \"%s\" 已經存在 + 檔案 \"%s\" 已經存在。 要覆蓋嗎? + 資料夾 \"%s\" 已經存在 + 合併 + 雙方皆保留 + 覆蓋 + 跳過 + 附加 \'_1\' + 添加到全部衝突 + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + 選擇資料夾 + 選擇檔案 + 確認外部儲存空間存取權限 + Confirm folder access + 請在下個畫面選擇SD卡的根目錄,以授予存取權限 + "如果看不到SD卡,試試這個" + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + 確認選擇 + Loading… + 請授予我們的 app 對所有檔案的存取權,否則其可能無法正常運作。 + + %d個項目 + + + + %d個項目 + + + %d個項目刪除中 + + + + %d個聯絡人 + %d個聯絡人 + + + 選擇儲存空間 + Storage + 內部儲存空間 + SD卡 + 根目錄 + 選擇了錯誤的資料夾,請選擇SD卡的根目錄 + SD卡和USB裝置的路徑不能相同 + 你似乎將應用程式安裝在SD卡,那會造成應用程式小工具無法使用。你甚至不會在可用的小工具列表中見到它們。 + 那是個系統限制,所以如果你想要使用小工具,你必須把應用程式移動回內部儲存空間。 + Wrong folder selected, please select path \'%s\' + + 屬性 + 路徑 + 選擇的項目 + 子目錄數 + 總檔案數 + 解析度 + 時間長度 + 演唱者 + 專輯 + 焦距 + 曝光時間 + ISO速度 + 光圈 + 相機 + EXIF + 歌名 + GPS座標 + 海拔高度 + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + 背景顏色 + 文字顏色 + 主體顏色 + Accent color of white theme + Accent color of Black & White theme + 前景顏色 + 應用程式圖標顏色 + 底部導航列顏色 + 恢復預設 + 使用預設 + 預設 + 改變顏色 + 主題 + 改變顏色將切換成[自訂]主題 + 儲存 + 丟棄 + 恢復變更 + 確定要恢復變更嗎? + 此操作無法撤消。 + 尚未儲存變更。離開前是否儲存? + 將顏色套用於[簡易]系列全部應用程式 + 警告:部分啟動器無法正確地處理應用程式圖標自訂化。要是圖標消失了,如果可以,試著透過Google Play或某些小工具來啟動應用程式。 + 一旦啟動了,只要設回預設的橘色圖標 #F57C00 即可。最糟的情況,你可能必須重新安裝應用程式。 + 顏色更新成功。新增了一個名為 \'Shared\' 的新主題,以後請使用那個來更新全部應用程式顏色。 + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You 來解鎖此功能及支持開發者。謝謝! + ]]> + + + 明亮主題 + 灰暗主題 + Auto + Auto light / dark + Solarized + 深紅主題 + White + 黑白主題 + 自訂 + 分享 + System default + + 更新了什麼 + *此處僅列出大更新,尚有一些小改善 + + 刪除 + 移除 + 重新命名 + 分享 + 分享方式 + 縮放 + 全選 + Select text + 隱藏 + 取消隱藏 + 隱藏資料夾 + 取消隱藏資料夾 + 暫時顯示隱藏的檔案 + 停止顯示隱藏的檔案 + 你不能一次分享這麼多內容 + 清空並停用回收桶 + 復原 + 取消復原 + 列印 + 列印 (Pro) + Shortcut + 建立捷徑 + 建立捷徑 (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + 顯示檔案名稱 + Move to the top + Move to the bottom + Pin item + Unpin item + 傳送簡訊 + Send email + Call + Contact details + Add contact + Wallpapers + + 排序 + 名稱 + 大小 + 最後修改 + Date created + 拍照日期 + 標題 + 檔案名稱 + 副檔名 + 隨機 + 隨機排序 + 遞增 + 遞減 + 僅套用於此資料夾 + 以實際值來排序數字部分 + 名字 + 中間名 + 姓氏 + Full name + Use custom sorting + Change order + + 確定要進行刪除嗎? + 你確定要刪除%s嗎? + Delete %s? + + 你確定要把%s移到回收桶嗎? + + 你確定要刪除這個項目嗎? + 你確定要把這個項目移到回收桶嗎? + 這情況不再詢問 + Do not show again + + + 或許 + + 注意: 你正在刪除%d個資料夾 + + + PIN碼 + 輸入PIN碼 + 請輸入PIN碼 + PIN碼錯誤 + 再次輸入PIN碼 + 圖形 + 畫出解鎖圖形 + 解鎖圖形錯誤 + 再次畫出解鎖圖形 + Biometrics + 指紋 + 添加指紋 + 請將您的手指放置在指紋感應器上 + Open biometric ID verification dialog + Authenticate + 驗證失敗 + 驗證被限制,請稍後再重試 + 你尚未有登錄的指紋,請在裝置的[設定]內添加 + 前往[設定] + 密碼設置成功。若遺忘了,請重新安裝應用程式。 + 保護設置成功。若再次設置時發生問題,請重新安裝應用程式。 + 上鎖資料夾 + 上鎖資料夾 (Pro) + 解鎖資料夾 + 這保護僅限作用於此應用程式,並不該用來取代真正系統級的資料夾加密。 + + 昨天 + 今天 + 明天 + Every day + Hide year + 秒鐘 + 分鐘 + 小時 + + s + m + h + wk. + + %d秒鐘 + + + %d分鐘 + + + %d小時 + + + %d天 + + + %d週 + + + %d個月 + + + %d年 + + + + %d秒鐘內 + + + %d分鐘內 + + + %d小時內 + + + %d天內 + + + %d週內 + + + %d個月內 + + + %d年內 + + + + %d秒鐘前 + + + %d分鐘前 + + + %d小時前 + + + %d天前 + + + %d週前 + + + %d個月前 + + + %d年前 + + + + %d秒鐘 + + + %d分鐘 + + + %d小時 + + + %d天 + + + %d週 + + + %d個月 + + + %d年 + + + 鬧鐘響起剩餘時間:\n%s + 提醒觸發剩餘時間:\n%s + Time remaining:\n%s + 依靠鬧鐘功能之前,請先確認是否正常運作,有可能因為省電相關的系統限制而導致失靈。 + 依靠提醒功能之前,請先確認是否正常運作,有可能因為省電相關的系統限制而導致失靈。 + 這應用程式的通知被停用了。請到你的裝置設定中去啟用。 + + 鬧鐘 + 延遲 + 關閉 + 不提醒 + 準時 + 系統音效 + 你的音效 + 添加新的音效 + 無音效 + During the day at hh:mm + During the day at %02d:%02d + + 設定 + 購買Simple Thank You + General + Color customization + Improved color customization + 自訂顏色 + 自訂顏色 (Locked) + Locked + 自訂小工具顏色 + Customize notifications + Notification sound + 強制使用英語 + Language + 顯示隱藏的項目 + 字體大小 + + + + 特大 + 用密碼保護隱藏的物件 + 用密碼保護整個應用程式 + 用密碼保護檔案刪除或移動 + 當檔案操作時,保留舊的[最後修改]數值 + 拖曳滾動條時,顯示訊息氣泡 + 當程式在前景使用時,防止手機進入睡眠 + 刪除不再進行確認 + 啟用頂端下拉更新 + 使用24小時制 + 更改日期和時間格式 + 每周由星期日開始 + 小工具 + 總是使用相同延遲間隔 + 延遲時間 + 按下按鈕時震動 + 將項目移入回收桶取代刪除 + 回收桶清理間隔 + 清空回收桶 + 強制直向模式 + 匯出設定 + 匯入設定 + 設定匯出成功 + 設定匯入成功 + 姓氏在前 + Clear cache + 開始通話前顯示通話確認框 + + 可見度 + 安全性 + 滑動 + 檔案操作 + 回收桶 + 儲存中 + 啟動 + 文字 + 搬移 + Quality + Main screen + Thumbnails + List view + + 排除 + Exclude folder + 排除資料夾 + (排除) + 管理排除資料夾 + 移除全部 + 是否將排除列表中的所有資料夾都移除?這不會刪除資料夾。 + 暫時顯示已排除的項目 + 停止顯示已排除的項目 + + 管理顯示的頁面 + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + 還原這個檔案 + 還原選擇的檔案 + 還原全部檔案 + 回收桶已成功清空 + 檔案已成功還原 + 你確定要清空回收桶嗎?檔案將會永久消失。 + 回收桶是空的 + 移動回收桶項目的功能已停用,請使用復原 + 顯示回收桶 + 隱藏回收桶 + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + 正在移動%d個項目進回收桶 + + + 正在匯入… + 正在匯出… + 匯入成功 + 匯出成功 + 匯入成功 + 匯出失敗 + 部分項目匯入失敗 + 部分項目匯出失敗 + 未發現供匯入的項目 + No new entries for importing have been found + 未發現供匯出的項目 + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + USB + 似乎有USB裝置接上了你的裝置。為確保檔案正確顯示,你必須授予額外的權限。 + 請在下個畫面選擇USB裝置的根目錄,以授予存取權限 + 選擇到錯誤資料夾,請選擇你USB裝置的根目錄 + + 一月 + 二月 + 三月 + 四月 + 五月 + 六月 + 七月 + 八月 + 九月 + 十月 + 十一月 + 十二月 + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + 在一月 + 在二月 + 在三月 + 在四月 + 在五月 + 在六月 + 在七月 + 在八月 + 在九月 + 在十月 + 在十一月 + 在十二月 + 星期一 + 星期二 + 星期三 + 星期四 + 星期五 + 星期六 + 星期日 + + + + + + + + 週一 + 週二 + 週三 + 週四 + 週五 + 週六 + 週日 + + 你的應用程式版本將不再更新。請更新到專業版以獲得新的修復和其他改善。 + 你的應用程式版本將不再更新。請點擊這裡,更新到專業版以獲得新的修復和其他改善。 + 它在此日期前免費:%s。如果您在到期前下載,將能夠永久免費使用。 + 更多資訊 + 升級 + 你必須手動搬移儲存在本機端的活動,透過匯出.ics檔案再接著匯入。你可以在主畫面選單中,找到 匯出/匯入 兩個按鈕。 + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + 關於 + Website + 觀看原始碼 + 傳送您的反饋或建議 + 升級至專業版 + 更多應用程式 + 更多我們的應用程式 + 邀請朋友 + 嘿,來試試看「%1$s」吧! %2$s + 邀請 + 為我們評分 + 評分 + 捐贈 + 追蹤我們 + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + 進階資訊 + 應用程式版本: %s + 裝置系統: %s + +
    + 希望您喜愛這應用程式。 它不含廣告,所以請購買應用程式 Simple Thank You 來支持開發者,這對話框也不會再出現。

    + 感謝! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + 購買 + Get Simple Phone + 請更新[Simple Thank You]至最新版本 + 在您發問前,請先檢查程式設定及閱讀[常見問題]。或許解決方法就在那裡。 + 在您給我們評價前,請先檢查程式設定及閱讀[常見問題]。如果您遇到任何困難,或許解決方法就在那裡。 + 並且確保您正使用最新的應用程式版本。 + Also note that this app version is no longer being developed, get the Pro one for many improvements. + 讀它 + 閱讀FAQ + 哈囉\n\n您似乎已經使用這應用程式一段時間了,我們相當感激。\n\n如果我們能請您幫個忙,請在Google Play上為我們評分。這對我們很有幫助。\n\n無論您的決定如何,都不會再看到這則訊息。\n\n感謝! + 請給我們的應用程式評分 :) + 感謝 + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + +
    + 告訴你最近有一個新的應用程式剛發布:

    + %2$s

    + %4$s

    + %6$s

    + 點標題下載來試試看吧

    + 謝謝 + ]]> +
    + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + App Launcher + 計算機 + 行事曆 + 相機 + 簡易時鐘 + 通訊錄 + Dialer + 繪圖 + 檔案管理器 + 手電筒 + 相簿 + Keyboard + Launcher + 音樂播放器 + 筆記 + SMS Messenger + Thank You + Voice Recorder + + 這裡 下載原始版本。 + ]]> + + + 常見問題 + 在你發問之前,請先閱讀 + 為什麼我在小工具列表中沒看到這應用程式的小工具? + 這很可能是因為你把應用程式移動到SD卡。那樣的話,有個隱藏特定程式小工具的Android系統限制存在。 + 只有一個解決方法,就是經由你的裝置設定,把應用程式移動回內部儲存空間。 + 我想要支持您,但我無法捐款。還有什麼我能做的嗎? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + 我誤刪了一些檔案,如何復原? + 不幸地,沒有辦法。檔案經確認後就立即刪除了,沒有垃圾筒可用。 + 我不喜歡小工具的顏色,我能更改嗎? + 可啊,當你在主畫面拖動小工具時,會出現小工具設置畫面。你會在左下角看到顏色方塊,點下去再挑個新顏色就好了。你也能用拉條來調整透明度。 + 我有辦法恢復被刪除的檔案嗎? + 如果它們確實被刪除了,那沒辦法。然而,預設情況下啟用了回收桶,使得檔案並沒有被刪除,只是被移動到桶內。 + 應用程式啟動器上的圖標消失了。我該怎麼辦? + 這是由於你的啟動器無法正確地支援圖標自訂。如果可以,試著透過Google Play或某些小工具來啟動應用程式。 + 一旦啟動,只要設回預設的橘色圖標 #F57C00 即可。最糟的情況,你可能必須重新安裝應用程式。 + 錢已經從我的銀行帳戶扣除,但我無法下載這應用程式。我能怎麼做? + 支付完全交由Google處理,他們的系統偶爾會發生故障。只要清除您的Google Play應用程式快取並重新啟動裝置,然後再次嘗試下載。 + 為什麼我應該升級到專業版? + 由於你的程式版本不再更新,將永遠不會修復可能遇到的錯誤,也不會再添加新功能。你可以在Google Play上用一小筆錢購買專業版。 + 這是一次性付款。也就是說,一旦你購買了將不必再次付費,即使之後有新裝置也不用。如果你不喜歡專業版,則可以在幾個小時內解除安裝,將自動拿回你的錢。 + 之後如果何時想退款,只要你以 hello@simplemobiletools.com 聯絡我們然後就能獲得退款了。 + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + Checklists + Different note and colors per widget + Note locking + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + Background color customization + File importing support + Zooming + + 這程式使用了下列的第三方函式庫來讓我工作簡化。感謝。 + 第三方授權 + Kotlin(程式語言) + Subsampling Scale Image View(可縮放圖片檢視) + Glide(圖片載入與快取) + Picasso(圖片載入與快取) + Android Image Cropper(圖片裁切與旋轉) + RtlViewPager(由右向左滑) + Joda-Time(Java 日期取代) + Stetho(除錯資料庫) + Otto(事件匯流排) + PhotoView(可縮放的 GIF) + PatternLockView(模式保護) + Reprint(指紋保護) + Gif Drawable(載入 GIF) + AutoFitTextView(調整文字大小) + Robolectric(測試框架) + Espresso(測試助理程式) + Gson(JSON 解析器) + Leak Canary(記憶體洩露偵測器) + Number Picker(可自訂的號碼挑選器) + ExoPlayer(影片播放器) + VR Panorama View(顯示全景) + Apache Sanselan(讀取圖片詮釋資料) + Android Photo Filters(圖片過濾器) + Gesture Views (可縮放的圖片) + Indicator Fast Scroll (滾動條上字母) + Event Bus (應用程式溝通) + Audio Record View (音訊視覺化) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + Your trial expires in %d day. + Your trial expires in %d days. + + + 已捨棄: 這版本的應用程式不再維護,在這取得專業版 https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + 別忘記如果您在2小時內解除安裝任何付費應用程式,將會自動被退款。若您在之後隨時想退款,只要透過 @simplemobiletools.com 聯絡我們,即可收到退款。這麼一來輕鬆就能試用了 :) + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    \ No newline at end of file diff --git a/commons/src/main/res/values/arrays.xml b/commons/src/main/res/values/arrays.xml new file mode 100644 index 000000000..79390993c --- /dev/null +++ b/commons/src/main/res/values/arrays.xml @@ -0,0 +1,274 @@ + + + + @color/md_red + @color/md_pink + @color/md_purple + @color/md_deep_purple + @color/md_indigo + @color/md_blue + @color/md_light_blue + @color/md_cyan + @color/md_teal + @color/md_green + @color/md_light_green + @color/md_lime + @color/md_yellow + @color/md_amber + @color/md_orange + @color/md_deep_orange + @color/md_brown + @color/md_blue_grey + @color/md_grey + + + + @color/md_red_700 + @color/md_pink_700 + @color/md_purple_700 + @color/md_deep_purple_700 + @color/md_indigo_700 + @color/md_blue_700 + @color/md_light_blue_700 + @color/md_cyan_700 + @color/md_teal_700 + @color/md_green_700 + @color/md_light_green_700 + @color/md_lime_700 + @color/md_yellow_700 + @color/md_amber_700 + @color/md_orange_700 + @color/md_deep_orange_700 + @color/md_brown_700 + @color/md_blue_grey_700 + @color/md_grey_black + + + + @color/md_amber_100 + @color/md_amber_200 + @color/md_amber_300 + @color/md_amber_400 + @color/md_amber_500 + @color/md_amber_600 + @color/md_amber_700 + @color/md_amber_800 + @color/md_amber_900 + + + + @color/md_blue_100 + @color/md_blue_200 + @color/md_blue_300 + @color/md_blue_400 + @color/md_blue_500 + @color/md_blue_600 + @color/md_blue_700 + @color/md_blue_800 + @color/md_blue_900 + + + + @color/md_blue_grey_100 + @color/md_blue_grey_200 + @color/md_blue_grey_300 + @color/md_blue_grey_400 + @color/md_blue_grey_500 + @color/md_blue_grey_600 + @color/md_blue_grey_700 + @color/md_blue_grey_800 + @color/md_blue_grey_900 + + + + @color/md_brown_100 + @color/md_brown_200 + @color/md_brown_300 + @color/md_brown_400 + @color/md_brown_500 + @color/md_brown_600 + @color/md_brown_700 + @color/md_brown_800 + @color/md_brown_900 + + + + @color/md_cyan_100 + @color/md_cyan_200 + @color/md_cyan_300 + @color/md_cyan_400 + @color/md_cyan_500 + @color/md_cyan_600 + @color/md_cyan_700 + @color/md_cyan_800 + @color/md_cyan_900 + + + + @color/md_deep_orange_100 + @color/md_deep_orange_200 + @color/md_deep_orange_300 + @color/md_deep_orange_400 + @color/md_deep_orange_500 + @color/md_deep_orange_600 + @color/md_deep_orange_700 + @color/md_deep_orange_800 + @color/md_deep_orange_900 + + + + @color/md_deep_purple_100 + @color/md_deep_purple_200 + @color/md_deep_purple_300 + @color/md_deep_purple_400 + @color/md_deep_purple_500 + @color/md_deep_purple_600 + @color/md_deep_purple_700 + @color/md_deep_purple_800 + @color/md_deep_purple_900 + + + + @color/md_green_100 + @color/md_green_200 + @color/md_green_300 + @color/md_green_400 + @color/md_green_500 + @color/md_green_600 + @color/md_green_700 + @color/md_green_800 + @color/md_green_900 + + + + @color/md_grey_white + @color/md_grey_200 + @color/md_grey_300 + @color/md_grey_400 + @color/md_grey_500 + @color/md_grey_600 + @color/md_grey_700 + @color/md_grey_800 + @color/md_grey_black + + + + @color/md_indigo_100 + @color/md_indigo_200 + @color/md_indigo_300 + @color/md_indigo_400 + @color/md_indigo_500 + @color/md_indigo_600 + @color/md_indigo_700 + @color/md_indigo_800 + @color/md_indigo_900 + + + + @color/md_light_blue_100 + @color/md_light_blue_200 + @color/md_light_blue_300 + @color/md_light_blue_400 + @color/md_light_blue_500 + @color/md_light_blue_600 + @color/md_light_blue_700 + @color/md_light_blue_800 + @color/md_light_blue_900 + + + + @color/md_light_green_100 + @color/md_light_green_200 + @color/md_light_green_300 + @color/md_light_green_400 + @color/md_light_green_500 + @color/md_light_green_600 + @color/md_light_green_700 + @color/md_light_green_800 + @color/md_light_green_900 + + + + @color/md_lime_100 + @color/md_lime_200 + @color/md_lime_300 + @color/md_lime_400 + @color/md_lime_500 + @color/md_lime_600 + @color/md_lime_700 + @color/md_lime_800 + @color/md_lime_900 + + + + @color/md_orange_100 + @color/md_orange_200 + @color/md_orange_300 + @color/md_orange_400 + @color/md_orange_500 + @color/md_orange_600 + @color/md_orange_700 + @color/md_orange_800 + @color/md_orange_900 + + + + @color/md_pink_100 + @color/md_pink_200 + @color/md_pink_300 + @color/md_pink_400 + @color/md_pink_500 + @color/md_pink_600 + @color/md_pink_700 + @color/md_pink_800 + @color/md_pink_900 + + + + @color/md_purple_100 + @color/md_purple_200 + @color/md_purple_300 + @color/md_purple_400 + @color/md_purple_500 + @color/md_purple_600 + @color/md_purple_700 + @color/md_purple_800 + @color/md_purple_900 + + + + @color/md_red_100 + @color/md_red_200 + @color/md_red_300 + @color/md_red_400 + @color/md_red_500 + @color/md_red_600 + @color/md_red_700 + @color/md_red_800 + @color/md_red_900 + + + + @color/md_teal_100 + @color/md_teal_200 + @color/md_teal_300 + @color/md_teal_400 + @color/md_teal_500 + @color/md_teal_600 + @color/md_teal_700 + @color/md_teal_800 + @color/md_teal_900 + + + + @color/md_yellow_100 + @color/md_yellow_200 + @color/md_yellow_300 + @color/md_yellow_400 + @color/md_yellow_500 + @color/md_yellow_600 + @color/md_yellow_700 + @color/md_yellow_800 + @color/md_yellow_900 + + diff --git a/commons/src/main/res/values/attrs.xml b/commons/src/main/res/values/attrs.xml new file mode 100644 index 000000000..f1b2becf8 --- /dev/null +++ b/commons/src/main/res/values/attrs.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/commons/src/main/res/values/bools.xml b/commons/src/main/res/values/bools.xml new file mode 100644 index 000000000..0ae73bae4 --- /dev/null +++ b/commons/src/main/res/values/bools.xml @@ -0,0 +1,8 @@ + + + false + false + false + false + false + diff --git a/commons/src/main/res/values/colors.xml b/commons/src/main/res/values/colors.xml new file mode 100644 index 000000000..4219b3835 --- /dev/null +++ b/commons/src/main/res/values/colors.xml @@ -0,0 +1,446 @@ + + + #FFF57C00 + #FFD76D00 + @color/color_primary + + #08000000 + #44888888 + #55808080 + #CC000000 + #FF333333 + #FFF1F1F1 + #00FFFFFF + + #99FFFFFF + #66000000 + #40FFFFFF + + + @color/md_grey_800_dark + @color/md_grey_white + @color/md_grey_200 + @color/md_grey_800_dark + @color/md_indigo_900_dark + @color/md_amber_700 + @color/md_indigo_900 + @color/md_red_700 + + + @color/theme_dark_text_color + @color/theme_dark_background_color + @color/color_primary + @color/color_primary + @color/color_primary + #AA000000 + @color/color_primary + + + #FFECECEC + #FFB2B2B2 + + + #FF757575 + + + #FFC107 + #2196F3 + #607D8B + #795548 + #00BCD4 + #FF5722 + #673AB7 + #4CAF50 + #9E9E9E + #3F51B5 + #03A9F4 + #8BC34A + #CDDC39 + #FF9800 + #E91E63 + #9C27B0 + #F44336 + #009688 + #FFEB3B + + #FFECB3 + #FFE082 + #FFD54F + #FFCA28 + #FFC107 + #FFB300 + #FFA000 + #FF8F00 + #FF6F00 + + #FFE28A + #FFD659 + #FFCC26 + #FFC100 + #DEA700 + #D79700 + #D78700 + #D77800 + #D75D00 + + #BBDEFB + #90CAF9 + #64B5F6 + #42A5F5 + #2196F3 + #1E88E5 + #1976D2 + #1565C0 + #0D47A1 + + #94CCF9 + #69B8F7 + #3DA2F4 + #1A92F3 + #0B82E0 + #1673C4 + #1462AE + #11529B + #09367B + + #CFD8DC + #B0BBC5 + #90A4AE + #78909C + #607D8B + #546E7A + #455A64 + #37474F + #263238 + + #B8C5CB + #99A7B4 + #78919D + #647C88 + #4F6873 + #445962 + #34454C + #263237 + #151C1F + + #D7CCC8 + #BCAAA4 + #A1887F + #8D6E63 + #795548 + #6D4C41 + #5D4037 + #4E342E + #3E2723 + + #C6B7B1 + #AB958D + #8F7369 + #755B52 + #5F4339 + #533A31 + #432E28 + #34231F + #241714 + + #B2EBF2 + #80DEEA + #4DD0E1 + #26C6DA + #00BCD4 + #00ACC1 + #0097A7 + #00838F + #006064 + + #90E3ED + #5DD5E5 + #2AC7DB + #1FA7B8 + #0098AB + #008898 + #00727E + #005E66 + #00393B + + #FFCCBC + #FFAB91 + #FF8A65 + #FF7043 + #FF5722 + #F4511E + #E64A19 + #D84315 + #BF360C + + #FFAD93 + #FF8C68 + #FF6B3C + #FF511A + #F93C00 + #DF3D0A + #C13E14 + #B33710 + #992B09 + + #D1C4E9 + #B39DDB + #9575CD + #7E57C2 + #673AB7 + #5E35B1 + #512DA8 + #4527A0 + #311B92 + + #BAA6DE + #9C7FD0 + #7E56C2 + #693FB0 + #563098 + #4E2B92 + #412488 + #371F7F + #251470 + + #C8E6C9 + #A5D6A7 + #81C784 + #66BB6A + #4CAF50 + #43A047 + #388E3C + #2E7D32 + #1B5E20 + + #ACDAAE + #89CA8D + #65BB69 + #4CAC51 + #409343 + #37833A + #2C7130 + #235F26 + #113E15 + + #FFFFFF + #EEEEEE + #E0E0E0 + #BDBDBD + #9E9E9E + #757575 + #616161 + #424242 + #000000 + + #DFDFDF + #DADADA + #CCCCCC + #A9A9A9 + #8A8A8A + #606060 + #4C4C4C + #2D2D2D + #000000 + + #C5CAE9 + #9FA8DA + #7986CB + #5C6BC0 + #3F51B5 + #3949AB + #303F9F + #283593 + #1A237E + + #A8AFDE + #828ECF + #5B6CC0 + #4354B0 + #344497 + #2E3C8C + #263380 + #1F2973 + #12195C + + #B3E5FC + #81D4fA + #4fC3F7 + #29B6FC + #03A9F4 + #039BE5 + #0288D1 + #0277BD + #01579B + + #8BD8FB + #59C7F9 + #27B6F6 + #02A7F9 + #028DCC + #0280BD + #016EA9 + #015E95 + #004072 + + #DCEDC8 + #C5E1A5 + #AED581 + #9CCC65 + #8BC34A + #7CB342 + #689F38 + #558B2F + #33691E + + #C9E3A9 + #B2D787 + #9BCB62 + #89C246 + #76AC38 + #679537 + #54812D + #426C24 + #234915 + + #F0F4C3 + #E6EE9C + #DCE775 + #D4E157 + #CDDC39 + #C0CA33 + #A4B42B + #9E9D24 + #827717 + + #E8EEA0 + #DEE879 + #D3E152 + #CBDB34 + #BAC923 + #A2AA2A + #869323 + #7D7D1C + #5F5710 + + #FFE0B2 + #FFCC80 + #FFB74D + #FFA726 + #FF9800 + #FB8C00 + #F57C00 + #EF6C00 + #E65100 + + #FFD089 + #FFBC57 + #FFA724 + #FD9600 + #D78000 + #D37600 + #CD6800 + #C65A00 + #BD4200 + + #F8BBD0 + #F48FB1 + #F06292 + #EC407A + #E91E63 + #D81B60 + #C2185B + #AD1457 + #880E4F + + #F596B7 + #F16998 + #ED3C78 + #E91A60 + #CB1352 + #B4154F + #9E134A + #880F44 + #630A3A + + #E1BEE7 + #CE93D8 + #BA68C8 + #AB47BC + #9C27B0 + #8E24AA + #7B1FA2 + #6A1B9A + #4A148C + + #D3A0DC + #C175CD + #AC4ABD + #913AA0 + #7F1F8F + #711C88 + #611880 + #521477 + #370E68 + + #FFCDD2 + #EF9A9A + #E57373 + #EF5350 + #F44336 + #E53935 + #D32F2F + #C62828 + #B71C1C + + #FFA4AE + #EA7777 + #DF5050 + #EC2E2A + #F21F0F + #D61F1A + #B32525 + #A42020 + #941616 + + #B2DFDB + #80CBC4 + #4DB6AC + #26A69A + #009688 + #00897B + #00796B + #00695C + #004D40 + + #95D3CE + #63BFB7 + #3F9B92 + #1E857C + #006D63 + #006056 + #005047 + #004038 + #00241E + + #FFF9C4 + #FFF590 + #FFF176 + #FFEE58 + #FFEB3B + #FDD835 + #FBC02D + #F9A825 + #F57F17 + + #FFF59B + #FFF267 + #FFED4D + #FFEA2F + #FFE712 + #FDD10B + #FBB504 + #EF9606 + #DA6B09 + + diff --git a/commons/src/main/res/values/dimens.xml b/commons/src/main/res/values/dimens.xml new file mode 100644 index 000000000..55f187973 --- /dev/null +++ b/commons/src/main/res/values/dimens.xml @@ -0,0 +1,63 @@ + + 1dp + 2dp + 4dp + 6dp + 8dp + 12dp + 16dp + 20dp + 24dp + 32dp + 72dp + 22dp + 44dp + + 28dp + 24dp + 40dp + 34dp + 64dp + 240dp + 272dp + 30dp + 30dp + 70dp + + 48dp + 72dp + 56dp + 76dp + 54dp + 40dp + 60dp + 100dp + 4dp + 10dp + 24dp + 48dp + 56dp + + 56dp + 26dp + 50dp + 80dp + 10dp + 64dp + + 8sp + 10sp + 12sp + 14sp + 15sp + 16sp + 17sp + 18sp + 21sp + 22sp + + 168dp + 85dp + 4dp + 2px + diff --git a/commons/src/main/res/values/donottranslate.xml b/commons/src/main/res/values/donottranslate.xml new file mode 100644 index 000000000..77a2124e9 --- /dev/null +++ b/commons/src/main/res/values/donottranslate.xml @@ -0,0 +1,213 @@ + + com.simplemobiletools.commons + Pro + Simple Commons + %1$s / %2$s + https://www.simplemobiletools.com/donate#paypal + https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou + am + pm + Material You + + + %1$s%2$s + \nhttps://simplemobiletools.com + elvero.studio@gmail.com + noreply@gmail.com + Facebook + Reddit + Telegram + GitHub + Viber + + + Aga-C, AlbertoPellitteri, Alfavio, connyduck, correia55, dagkalis, DaPa, ForgottenUmbrella, KryptKode, Naveen3Singh, qwertyfinger + + karmac2015, unofficial-hima + Gozzwip + avtkal + kabirnayeem99 + + Solatec + dadaewq, fiepi, KrasnayaPloshchad, linsui, Pzqqt, waldens, WanderMax, xiaomingyan + 1552980358 + abc0922001, fricyo, KrasnayaPloshchad, s8321414, Vdragon, zica87 + dugi991 + Filda6, herkul-s, novas78, pcpepik + 10cents, chreddy, HJMVR + alpenblauwtje, Joppla, ltGuillaume + matiasblomqvist, Nekromanser, teemue + AlbatorV, AO-LocLab, Aur36, canou, Charles-770, KevinMinions, ldmpub, Pierre49, Poussinou, xinxinxinxinxin + aluaces, davidre345, susosl, xmgz + fscholdei, GithubUser699, Honk2, jokay, kniddl, MartinGSch, michaelof, mklopp, mueller-ma, NicoHood, nopeppermint, Phoenix1747, rak-rak, sodewe, wistein + spkprs + xdavidel + DhruvaSambrani + hevesij + siswonugroho, zmni, Zxc-40 + bellingeri, gcalzo, igor-cali, mastu, Mek101, pyvirus, random4545454, unbranched + AioiLight, crusepath, naofum, ray4423, ScratchBuild + hanjoongcho, yclee126 + VGumbakis + dipenSan + comradekingu, FTno + eshagh79 + Aga-C, CompGame356, gregory678, jacklul, kryger, ONLAN-PL + ailmcoll, floppyD, hugomg, lnux-usr, marciozomb13, matheusvictor, RodolfoCandido, rodymacedo, smarquespt + melintemarian + antonv6, AVM77, macbaze, solokot, trubitsyn + + tibbi + franga2000, rmajc + FredMan95, Guzleon, MarcAbonce, mlopezgva, Yngvar-Skjaldulfsson + en2sv + GobinathAL + akcansoft, ersen0, Fatih-BaKeR + bac1, motomoto7, sawka6630 + + Cymrodor + + + Copyright 2010 - 2018 JetBrains s.r.o.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/JetBrains/kotlin + Copyright 2018 David Morrissey\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/davemorrissey/subsampling-scale-image-view + Copyright 2014 Google, Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS\'\' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + https://github.com/bumptech/glide + Copyright 2013 Square, Inc.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/square/picasso + Copyright 2016, Arthur Teplitzki, 2013, Edmodo, Inc.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/ArthurHub/Android-Image-Cropper + Copyright 2016 Duolingo\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/duolingo/rtl-viewpager + Copyright 2013 JodaOrg\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/JodaOrg/joda-time + BSD License\n\nFor Stetho software\n\nCopyright (c) 2015, Facebook, Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n * Neither the name Facebook nor the names of its contributors may be used to\n endorse or promote products derived from this software without specific\n prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + https://github.com/facebook/stetho + Copyright 2012 Square, Inc.\nCopyright 2010 Google, Inc.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/square/otto + Copyright 2017 Chris Banes\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/chrisbanes/PhotoView + Copyright 2017 aritraroy\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/aritraroy/PatternLockView + Copyright 2015 - 2017 AJ Alt\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/ajalt/reprint + The MIT License (MIT)\n\nCopyright (c) 2016 Karol Wrótniak, Droids on Roids\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + https://github.com/koral--/android-gif-drawable + Copyright 2014 Grantland Chew\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/grantland/android-autofittextview + The MIT License\n\nCopyright (c) 2010 Xtreme Labs and Pivotal Labs\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + https://github.com/robolectric/robolectric + Copyright 2014 The Android Open Source Project\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://developer.android.com/training/testing/espresso/index.html + Copyright 2008 Google Inc.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/google/gson + Copyright 2015 Square, Inc.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + https://github.com/square/leakcanary + The MIT License (MIT)\n\nCopyright (c) 2018 ShawnLin013\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + https://github.com/ShawnLin013/NumberPicker + Copyright 2014 Google, Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/google/ExoPlayer + Copyright 2016 Google, Inc. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/googlevr/gvr-android-sdk + Copyright 2016 The Apache Software Foundation\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://mvnrepository.com/artifact/org.apache.sanselan/sanselan/0.97-incubator + Copyright 2016 ravi8x\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/ravi8x/AndroidPhotoFilters + Copyright 2018 alexvasilkov\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/alexvasilkov/GestureViews + The MIT License (MIT)\n\nCopyright (c) 2018 Reddit\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + https://github.com/reddit/IndicatorFastScroll + Copyright (C) 2012-2020 Markus Junginger, greenrobot\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/greenrobot/EventBus + Copyright (C) 2020 Armen Gevorgyan\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/Armen101/AudioRecordView + Copyright (C) 2017 Jacob Klinker\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/klinker41/android-smsmms + Copyright (C) 2019 Zhou Pengfei\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/penfeizhou/APNG4Android + Copyright 2016 Olmo Gallegos Hernández\n\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at\n\nhttps://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License. + https://github.com/voghDev/PdfViewPager + MIT License\n\nCopyright (c) 2022 Björn Petersen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + https://github.com/BjoernPetersen/m3u-parser + Copyright (C) 2015 Naman Dwivedi\n\nThis is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this app. If not, see https://www.gnu.org/licenses/. + https://github.com/naman14/TAndroidLame + + + MD5 + + + @string/january + @string/february + @string/march + @string/april + @string/may + @string/june + @string/july + @string/august + @string/september + @string/october + @string/november + @string/december + + + + @string/january_short + @string/february_short + @string/march_short + @string/april_short + @string/may_short + @string/june_short + @string/july_short + @string/august_short + @string/september_short + @string/october_short + @string/november_short + @string/december_short + + + + @string/in_january + @string/in_february + @string/in_march + @string/in_april + @string/in_may + @string/in_june + @string/in_july + @string/in_august + @string/in_september + @string/in_october + @string/in_november + @string/in_december + + + + @string/monday + @string/tuesday + @string/wednesday + @string/thursday + @string/friday + @string/saturday + @string/sunday + + + + @string/monday_letter + @string/tuesday_letter + @string/wednesday_letter + @string/thursday_letter + @string/friday_letter + @string/saturday_letter + @string/sunday_letter + + + + @string/monday_short + @string/tuesday_short + @string/wednesday_short + @string/thursday_short + @string/friday_short + @string/saturday_short + @string/sunday_short + + diff --git a/commons/src/main/res/values/ids.xml b/commons/src/main/res/values/ids.xml new file mode 100644 index 000000000..9dc71d4cd --- /dev/null +++ b/commons/src/main/res/values/ids.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/commons/src/main/res/values/integers.xml b/commons/src/main/res/values/integers.xml new file mode 100644 index 000000000..5e6beed71 --- /dev/null +++ b/commons/src/main/res/values/integers.xml @@ -0,0 +1,6 @@ + + + 1 + 1 + 0 + diff --git a/commons/src/main/res/values/strings.xml b/commons/src/main/res/values/strings.xml new file mode 100644 index 000000000..606e52dfd --- /dev/null +++ b/commons/src/main/res/values/strings.xml @@ -0,0 +1,1158 @@ + + + OK + Cancel + Back + Nothing + Later + Save as + File saved successfully + Invalid file format + Out of memory error + An error occurred: %s + Error: %s + Open with + Edit with + Edit + No valid app found + No browser found + No email client found + Set as + Copy to clipboard + Copy number to clipboard + Value copied to clipboard + Value copied to clipboard:\n%s + Dial number + Unknown + Always + Never + Details + Notes + Deleting folder \'%s\' + None + Label + Transparent + Transparent color + Select a different color + Download + Notification + Notifications + Email + Previous + Play / Pause + Next + Number + No contacts found + Request the required permissions + The app could not access your contacts + App does not have the permission to initiate phone calls, please grant it in the device settings + Insert text here + Call %s + Confirm calling %s + Zero + One + Two + Three + Four + Five + Six + Seven + Eight + Nine + Value + Value cannot be empty + Create new contact + Add to an existing contact + App Corrupt + Disclaimer + Take photo + Choose photo + Choose video + Choose contact + Choose file + Record audio + Record video + Updating… + Phone storage + Phone storage (not visible by other apps) + Audio + + + Birthday + Anniversary + + + Home + Work + + + Mobile + Main + Work Fax + Home Fax + Pager + No phone number has been found + + + Change view type + Grid + Grid (Pro) + Uneven Grid + List + Increase column count + Reduce column count + Column count + Portrait column count + Landscape column count + Change cover image + Select photo + + %d column + %d columns + + + + Manage blocked numbers + You are not blocking anyone. + Add a blocked number + Block number + Block numbers + Blocked numbers + Export blocked numbers + Import blocked numbers + You have to make this app the default dialer app to make use of blocked numbers. + Set as default + Are you sure you want to block \"%s\"? + Block calls from not stored contacts + Block messages from not stored contacts + Enter a number or a pattern (e.g. *12345*, +1*8888) to block all calls and messages from numbers matching the pattern. + Can\'t block unknown numbers without caller ID permission. + + + Favorites + Add favorites + Add to favorites + Remove from favorites + + + Search + Search in %s + Type in at least 2 characters to start the search. + Search contacts + Search favorites + Search apps + Search events + Search groups + Search history + Search calls + Search files + Search folders + Search files and folders + Search playlists + Search artists + Search albums + Search tracks + Search text + Search conversations + Search recordings + + + Filter + Filter (Pro) + No items found. + Change filter + + + Storage permission is required + Contacts permission is required + Camera permission is required + Audio permission is required + No permission + You must allow the app displaying notifications, else it cannot show reminders. + You must allow the app displaying notifications, else it cannot show the progress bar. + You must allow the app displaying notifications, else it cannot play songs. + You must allow the app displaying notifications, else it cannot record audio. + You must allow the app displaying notifications, else it cannot show incoming calls. + You must allow the app displaying notifications, else it cannot show incoming messages. + Grant Permission + Permission Required + + + Rename file + Rename folder + Could not rename the file + Could not rename the folder + Folder name must not be empty + A folder with that name already exists + Cannot rename the root folder of a storage + Folder renamed successfully + Renaming folder + Filename cannot be empty + Filename contains invalid characters + Filename \'%s\' contains invalid characters + Extension cannot be empty + Source file %s doesn\'t exist + Prepend filenames + Append filenames + Simple renaming + Pattern + String to add + %Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second\n%i - number increasing from 1 + Filename (without .txt) + Filename (without .json) + Filename (without .zip) + Starting from Android 11 you cannot hide files and folders like that anymore + + + Copy + Move + Copy / Move + Copy to + Move to + Source + Destination + Select destination + Click here to select destination + Could not write to the selected destination + Please select a destination + Source and destination cannot be the same + Could not copy the files + Copying… + Files copied successfully + File copied successfully + An error occurred + Moving… + Files moved successfully + File moved successfully + Some files could not be moved + Some files could not be copied + No files selected + Saving… + Could not create folder %s + Could not create file %s + No new items have been found + The destination does not have enough space available.\nRequired %1$s, available %2$s + System service for selecting files and folders is unavailable + + + Create new + Folder + File + Create new folder + A file or folder with that name already exists + The name contains invalid characters + Please enter a name + An unknown error occurred + + + File \"%s\" already exists + File \"%s\" already exists. Overwrite? + Folder \"%s\" already exists + Merge + Keep both + Overwrite + Skip + Append with \'_1\' + Apply to all + The system does not allow the operation in this folder, please pick another one + The system does not allow copying into this folder, please pick another one + The system does not allow renaming in this folder + Cannot rename folders directly on internal storage, only subfolders + Cannot rename this folder + + + Select a folder + Select a file + Confirm external storage access + Confirm folder access + Please choose the top folder of the SD card on the next screen, to grant write access + If you don\'t see the SD card, try this + Please allow the app accessing the selected storage on the next screen by pressing \'Use this folder\' at the bottom. + Please allow accessing \'<b>%s</b>\' on the next screen by pressing \'<b>Use this folder</b>\' at the bottom. + Please press \'<b>Save</b>\' at the bottom of the next screen to create the new folder. + Confirm selection + Loading… + Please grant our app access to all your files, it might not work well without it. + + + %d item + %d items + + + + + %d item + %d items + + + + Deleting %d item + Deleting %d items + + + + + %d contact + %d contacts + + + + Select storage + Storage + Internal + SD Card + Root + Wrong folder selected, please select the main folder of your SD card + SD card and USB device paths cannot be the same + You seem to have the app installed on an SD card, that makes the app widgets unavailable. You won\'t even see them on the list of available widgets. + It is a system limitation, so if you want to use the widgets, you have to move the app back on the internal storage. + Wrong folder selected, please select path \'%s\' + + + Properties + Path + Items selected + Direct children count + Total files count + Resolution + Duration + Artist + Album + Focal length + Exposure time + ISO speed + F-number + Camera + EXIF + Song title + GPS coordinates + Altitude + Remove EXIF + Are you sure you want to remove EXIF values like GPS coordinates, camera model etc? + EXIF values removed successfully + + + Background color + Text color + Primary color + Accent color of white theme + Accent color of Black & White theme + Foreground color + App icon color + Bottom navigation bar color + Restore defaults + Use default + Default + Change color + Theme + Changing a color will make it switch to Custom theme + Save + Discard + Undo changes + Are you sure you want to undo your changes? + This action cannot be undone. + You have unsaved changes. Save before exit? + Apply colors to all Simple Apps + WARNING: Some launchers do not handle app icon customization properly. In case the icon will disappear, try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + Colors updated successfully. A new Theme called \'Shared\' has been added, please use that for updating all app colors in the future. + Note that even though you are using the Pro app version, you still need Simple Thank You for technical reasons. It takes care of the color synchronization. + + Simple Thank You to unlock this function and support the development. Thanks! + ]]> + + + + Light + Dark + Auto + Auto light / dark + Solarized + Dark red + White + Black & White + Custom + Shared + System default + + + What\'s new + * only the bigger updates are listed here, there are always some smaller improvements too + + + Delete + Remove + Rename + Share + Share via + Resize + Select all + Select text + Hide + Unhide + Hide folder + Unhide folder + Temporarily show hidden + Stop showing hidden media + You cannot share this much content at once + Empty and disable the Recycle Bin + Undo + Redo + Print + Print (Pro) + Shortcut + Create shortcut + Create shortcut (Pro) + Add number to contact + View contact details + Call from SIM 1 + Call from SIM 2 + Toggle filename visibility + Move to the top + Move to the bottom + Pin item + Unpin item + Send SMS + Send email + Call + Contact details + Add contact + Wallpapers + + + Sort by + Name + Size + Last modified + Date created + Date taken + Title + Filename + Extension + Random + Sort randomly + Ascending + Descending + Use for this folder only + Sort numeric parts by actual value + First name + Middle name + Surname + Full name + Use custom sorting + Change order + + + Are you sure you want to proceed with the deletion? + Are you sure you want to delete %s? + Delete %s? + Are you sure you want to move %s into the Recycle Bin? + Are you sure you want to delete this item? + Are you sure you want to move this item into the Recycle Bin? + Do not ask again in this session + Do not show again + Yes + No + Maybe + + + WARNING: You are deleting %d folder + WARNING: You are deleting %d folders + + + + PIN + Enter PIN + Please enter a PIN + Wrong PIN + Repeat PIN + Pattern + Insert pattern + Wrong pattern + Repeat pattern + Biometrics + Fingerprint + Add fingerprint + Please place your finger on the fingerprint sensor + Open biometric ID verification dialog + Authenticate + Authentication failed + Authentication blocked, please try again in a moment + You have no fingerprints registered, please add some in the Settings of your device + Go to Settings + Password setup successfully. Please reinstall the app in case you forget it. + Protection setup successfully. Please reinstall the app in case of problems with reseting it. + Lock folder + Lock folder (Pro) + Unlock folder + This protection works in this app only, it is not supposed to replace a real systemwide folder encryption. + + + Yesterday + Today + Tomorrow + Every day + Hide year + seconds + minutes + hours + days + s + m + h + wk. + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + + %d second before + %d seconds before + + + %d minute before + %d minutes before + + + %d hour before + %d hours before + + + %d day before + %d days before + + + %d week before + %d weeks before + + + %d month before + %d months before + + + %d year before + %d years before + + + + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + + %d year + %d years + + + + Time remaining till the alarm goes off:\n%s + Time remaining till the reminder triggers:\n%s + Time remaining:\n%s + Please make sure the alarm works properly before relying on it. It could misbehave due to system restrictions related to battery saving. + Please make sure the reminders work properly before relying on them. Check your device battery and notification settings, if there is nothing blocking the reminders, or killing the app in the background. + Notifications of this application are disabled. Please go in your device settings for enabling them. + + + Alarm + Snooze + Dismiss + No reminder + At start + System sounds + Your sounds + Add a new sound + No sound + During the day at hh:mm + During the day at %02d:%02d + + + Settings + Purchase Simple Thank You + General + Color customization + Improved color customization + Customize colors + Customize colors (Locked) + Locked + Customize widget colors + Customize notifications + Notification sound + Use English language + Language + Show hidden items + Font size + Small + Medium + Large + Extra large + Password protect hidden item visibility + Password protect the whole application + Password protect file deletion and moving + Keep old last-modified value at file operations + Show an info bubble at scrolling items by scrollbar dragging + Prevent phone from sleeping while the app is in foreground + Always skip delete confirmation dialog + Enable pull-to-refresh from the top + Use 24-hour time format + Change date and time format + Start week on Sunday + Widgets + Always use same snooze time + Snooze time + Vibrate on button press + Move items into the Recycle Bin instead of deleting + Recycle Bin cleaning interval + Empty the Recycle Bin + Force portrait mode + Export settings + Import settings + Settings exported successfully + Settings imported successfully + Start name with surname + Clear cache + Show a call confirmation dialog before initiating a call + + + Visibility + Security + Scrolling + File operations + Recycle Bin + Saving + Startup + Text + Migrating + Quality + Main screen + Thumbnails + List view + + + Exclude + Exclude folder + Excluded folders + (excluded) + Manage excluded folders + Remove all + Remove all folders from the list of excluded? This will not delete the folders. + Temporarily show excluded + Stop showing excluded + + + Manage shown tabs + Tab to open at app start + Contacts + Favorites + Call History + Groups + Last used one + Files + Recent files + + + Restore this file + Restore selected files + Restore all files + The Recycle Bin has been emptied successfully + Files have been restored successfully + Are you sure you want to empty the Recycle Bin? The files will be permanently lost. + The Recycle Bin is empty + Moving Recycle bin items is disabled, please use Restore + Show the Recycle Bin + Hide the Recycle Bin + Open the Recycle Bin + Skip the Recycle Bin, delete files directly + + + Moving %d item into the Recycle Bin + Moving %d items into the Recycle Bin + + + + Importing… + Exporting… + Importing successful + Exporting successful + Importing failed + Exporting failed + Importing some entries failed + Exporting some entries failed + No entries for importing have been found + No new entries for importing have been found + No entries for exporting have been found + Backups + Enable automatic backups + Manage automatic backups + You can use the following patterns to name your file automatically:\n\n%Y - year\n%M - month\n%D - day\n%h - hour\n%m - minute\n%s - second + + + USB + You seem to have an USB device attached to your device. To make sure its files appear properly, you need to grant additional permissions. + Please choose the top folder of the USB device on the next screen, to grant access + Wrong folder selected, please select the main folder of your USB device + + + January + February + March + April + May + June + July + August + September + October + November + December + + Jan + Feb + Mar + Apr + May + June + July + Aug + Sept + Oct + Nov + Dec + + + in January + in February + in March + in April + in May + in June + in July + in August + in September + in October + in November + in December + + Monday + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday + + M + T + W + T + F + S + S + + Mon + Tue + Wed + Thu + Fri + Sat + Sun + + + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements. + Your app version will not be updated anymore. Please upgrade to the Pro version to receive new fixes and other improvements by clicking here. + It is free till: %s. If you download it till then, you will be able to use it for free forever. + More info + Upgrade + You have to migrate locally stored events manually via exporting in an .ics file, then importing. You can find both export/import buttons at the main screen menu. + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your settings and favorites over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your settings and favorites over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. Once you are happy with this one and maybe migrated your data over, you can uninstall the old free one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you already have the Pro app version too. Once you are happy with it and maybe migrated your data over, you can uninstall this one to avoid launching it accidentally as you will not need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your locally stored events over, you have to do it manually by exporting them into an .ics file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you had any contacts stored under \"%s\", you have to migrate them manually by exporting in a .vcf file from the free app version and importing here through the top menu.\n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + Hello,\n\nseems like you just upgraded from the free version. If you want to migrate your notes over, you have to do it manually by exporting them into a file in the free app version and importing here through the top menu. \n\nOnce you are satisfied with your setup in the Pro version, you can uninstall the old free one as you won\'t need it anymore.\n\nThanks! + + + About + Website + For the source codes visit + Send your feedback or suggestions to + Upgrade to Pro + More apps + More apps from us + Invite friends + Hey, come check out %1$s at %2$s + Invite via + Rate us + Rate + Donate + Follow us + v %1$s\nCopyright © Simple Mobile Tools %2$d + Support + Help us + Social + Other + Privacy policy + Version %s + Hello :) + Made with ❤️ in Slovakia + Additional info + App version: %s + Device OS: %s + +
    + hope you are enjoying the app. It contains no ads, please support its development by purchasing the Simple Thank You app, it will also prevent this dialog from showing up again.

    + Thank you! + ]]> +
    + Hello,<br><br>hope you are enjoying the app. It contains no ads and we aren\'t collecting your data either, please support its development by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a>. You will also have all app features including color customization unlocked.<br><br>Thank you! + Support us by purchasing <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> please, it will also unlock all app features including color customization. + Purchase + Get Simple Phone + Please update Simple Thank You to the latest version + Before you ask a question, please check the app settings and read the Frequently Asked Questions first. Maybe the solution is there. + Before you rate us, please check the app settings and read the Frequently Asked Questions first. If you have any problems, maybe the solution is there. + Also make sure that you are using the latest app version. + Also note that this app version is no longer being developed, get the Pro one for many improvements. + Read it + Read FAQ + Hello,\n\nit looks like you are using this app for quite a while already, and we really appreciate it.\n\nIf we can ask you a favor, please rate us on Google Play. That would really help us a lot.\n\nNo matter how you decide, you will not see this message again.\n\nThanks! + Rate our app please :) + Thank you + The widget is locked.\nPlease upgrade to the Pro version to unlock it. + This feature is locked, please purchase <a href=https://play.google.com/store/apps/details?id=com.simplemobiletools.thankyou>Simple Thank You</a> for unlocking the full app.<br><br>It is a one time payment only and if you won\'t be satisfied, we can refund you. + + + +
    + just letting you know that some new apps have been released recently:

    + %2$s

    + %4$s

    + %6$s

    + You can download them by pressing their titles or icons.

    + Thanks + ]]> +
    + + Simple App Launcher + Simple Calculator + Simple Calendar + Simple Camera + Simple Clock + Simple Contacts + Simple Dialer + Simple Draw + Simple File Manager + Simple Flashlight + Simple Gallery + Simple Keyboard + Simple Launcher + Simple Music Player + Simple Notes + Simple SMS Messenger + Simple Thank You + Simple Voice Recorder + + App Launcher + Calculator + Calendar + Camera + Clock + Contacts + Dialer + Draw + File Manager + Flashlight + Gallery + Keyboard + Launcher + Music Player + Notes + SMS Messenger + Thank You + Voice Recorder + + here. + ]]> + + + + Frequently asked questions + Before you ask a question, please first read the + How come I don\'t see this apps widget on the list of widgets? + It is most likely because you moved the app on an SD card. There is an Android system limitation which hides the given app widgets + in that case. The only solution is to move the app back onto the Internal Storage via your device settings. + I want to support you, but I cannot donate money. Is there anything else I can do? + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + ]]> + + I deleted some files by mistake, how can I recover them? + Sadly, you cannot. Files are deleted instantly after the confirmation dialog, there is no trashbin available. + I don\'t like the widget colors, can I change them? + Yep, as you drag a widget on your home screen a widget config screen appears. You will see colored squares at the bottom left corner, just press them to pick a new color. You can use the slider for adjusting the alpha too. + Can I somehow restore deleted files? + If they were really deleted, you cannot. However, there is a Recycle Bin enabled by default, it will cause the files just be moved in the Bin instead of deleting them. + The app launcher icon disappeared. What can I do? + It is caused by your launcher not supporting icon customization properly. Try launching the app via Google Play or some widget, if available. + Once launched, just set back the default orange icon #F57C00. You might have to reinstall the app in the worst case. + The money has been deducted from my bank account, but I cannot download the app. What can I do? + Payments are fully handled by Google, their system glitches from time to time. Just clear your Google Play app cache and restart your device, then retry downloading it. + Why should I upgrade to the Pro version? + As your app version is no longer updated, the bugs you have maybe spotted will never be fixed. There will also be no new functions added. You can purchase the Pro version on Google Play for a small sum of money. + It is a one time payment, which means that once you purchase it, you will never have to pay again. Not even after getting a new device. If you won\'t like the Pro version, you can just uninstall it within a few hours and you will automatically get your money back. + If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. + How can I select multiple items at once? + There are multiple ways of doing that. The first one is starting the selection mode by long pressing one item, then short clicking on others to select them. The second way is similar to selecting items on PCs with a mouse, + just start the selection mode by long pressing one item, then with your finger still down drag it across other items for selecting. The third way of selecting multiple items is long pressing one item, then long pressing another one and everything in between gets selected. If you + want to select all items, just long press one item, then click at the selected item counter at the top left corner. That will select or unselect all everything. + I have purchased the app, but I cannot download it on another device. + Try clearing your Google Play app cache and restarting your device. It is some Google Play glitch, not really related to the app itself. + + + Contributors + Translation + Development + Other help + + this website, or just contact us at hello@simplemobiletools.com if you have any questions. + Thanks to all contributors and other supporters! + ]]> + + + Arabic + Azerbaijani + Bengali + Breton + Bulgarian + Catalan + Czech + Welsh + Danish + English + German + Greek + Spanish + Basque + Persian + Finnish + French + Galician + Hindi + Croatian + Hungarian + Indonesian + Italian + Hebrew + Japanese + Korean + Lithuanian + Nepali + Norwegian + Dutch + Polish + Portuguese + Romanian + Russian + Slovak + Slovenian + Serbian + Swedish + Tamil + Turkish + Ukrainian + Vietnamese + Chinese (Hong Kong) + Chinese (Simplified) + Chinese (Traditional) + + + Get the Pro version now! + Basic + Pro + No ads + No internet access + 100% Money Back Guarantee + One time payment + Improved design + + + Advanced photo editor + Advanced photo & video editor + HEIC/HEIF file support + Advanced batch file renaming + Individual folder locking + Printing support + + + Time zone support + Attendees and email reminders + Easy event importing + New widgets + + + Improved duplicate contact merging + Font size customization + Optional private contact sharing within our apps + Customizable contact ringtones + Contact filtering + Privately stored contacts + + + Checklists + Different note and colors per widget + Note locking + + + Date and time format customization + Home screen shortcuts + File compression support + Tab with recent files + + + Background color customization + File importing support + Zooming + + + This app uses the following third party libraries to make my life easier. Thank you. + Third party licences + Kotlin (programming language) + Subsampling Scale Image View (zoomable imageviews) + Glide (image loading and caching) + Picasso (image loading and caching) + Android Image Cropper (image crop and rotate) + RtlViewPager (right to left swiping) + Joda-Time (Java date replacement) + Stetho (debugging databases) + Otto (event bus) + PhotoView (zoomable GIFs) + PatternLockView (pattern protection) + Reprint (fingerprint protection) + Gif Drawable (loading GIFs) + AutoFitTextView (resizing text) + Robolectric (testing framework) + Espresso (testing helper) + Gson (JSON parser) + Leak Canary (memory leak detector) + Number Picker (customizable number picker) + ExoPlayer (video player) + VR Panorama View (displaying panoramas) + Apache Sanselan (reading image metadata) + Android Photo Filters (image filters) + Gesture Views (zoomable images) + Indicator Fast Scroll (letters on scrollbar) + Event Bus (communication within the app) + Audio Record View (audio visualization) + SMS MMS (SMS and MMS handling) + APNG Android (animated WebP support) + PDFViewPager (PDF viewer) + M3U Parser (m3u playlist file handling) + AndroidLame (mp3 encoder) + + + Trial expired + Start free trial + Your trial expires soon. + Unlock the app for one final day + Welcome to %s! + Thank you for using our app. You can use this unlocked version for <font color=\'#FFFFFF\'>%d days</font>. Once the trial ends, please consider upgrading to the Pro version. It has a huge amount of new features, modern design, no ads and many other improvements. + \n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nHope you\'ll like it :) + Please upgrade to the Pro version to enjoy the app to the fullest.\n\nYou just have to pay for it once in a lifetime and if you won\'t be satisfied, you can uninstall it and get a refund.\n\nSee you there :) + + + Your trial expires in %d day. + Your trial expires in %d days. + + + + DEPRECATED: This version of the app is no longer maintained, get the Pro version at https://play.google.com/store/apps/details?id=com.simplemobiletools.xxx.pro + Don\'t forget that if you uninstall any paid app within 2 hours, you will automatically be refunded. If you want a refund anytime later, just contact us at hello@simplemobiletools.com and you will get it. That makes it easy to try it out :) + + + A group of simple, open source Android apps with customizable widgets, without ads and unnecessary permissions. +
    diff --git a/commons/src/main/res/values/styles.xml b/commons/src/main/res/values/styles.xml new file mode 100644 index 000000000..0fc2428af --- /dev/null +++ b/commons/src/main/res/values/styles.xml @@ -0,0 +1,3120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/src/main/res/xml/locale_config.xml b/commons/src/main/res/xml/locale_config.xml new file mode 100644 index 000000000..bec57247e --- /dev/null +++ b/commons/src/main/res/xml/locale_config.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/graphics/app_icon.png b/graphics/app_icon.png index 84db529063c78a9a71ad876ee7e4a528b445917f..f809203abcb811c40fe6eddb28fdc79c41963383 100644 GIT binary patch literal 167892 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 F{{d(+*mVE^ diff --git a/settings.gradle b/settings.gradle index d100c1c8e..c624460ec 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,5 @@ include ':app' //include ':commons' //project(':commons').projectDir = new File('../Simple-Commons/commons') +include ':libraw' +include ':commons'

n7*CEgU1-W ztuK*z<=6QW#gGD|%Fb=Q{NR>1hu6kF>?~UHI@STVF-Xr)RhTpD;6-U-L+*|H$gaKv z&6VD{q`hsVpZO7{bA5PKkK*S%R?YtzZw&kWmT4yL6y-?bxbz(J6Md~LY1rm%V(~Z0CQBseu%wM`|+%P-OyFJ4Xf4Q2c zpV?Ac=zai*<&X12ES}FVU*F1#v+iblnVPJ8$*f?G5BH+Xt$K(wZ*TvmC{6cw zoWxFm69-k)%jC7q0CfQm^RDpotHQdCd-(jxKj$xH`=+dkhl@Fz4JT~t=7r63_jM?ih$$=yBNboA})2vDI1E8SNy z-%;)YjttBGHCnlwcSZ{!Ro?07<4Yg`#@`i9@E+r{;#{4d)o@Tw}bC6+T;EN($LAHfdGdK~oZtcrae-|+j5JNZT> z;HiiP+E)|h92O&78%1X$6K!RDzWdw1^0i9AQ&A1{-g7RcA)R2c3RekC&{6sxB|FyI z?^tV#nqyGQla{S759;#%G@?>X<)^mT#D*($*f?GuPjA4kNi|vt6BjXshN#~`0yRB&+m8i@cob6&g<3k z9;$Aq?_I`Wmd$x0EK=n(ik#zEtI?T&=NX>%40pY}jo+VNW({-A0|c;s35jV<%bf8&V#!E2TDwF^L=!L{m6FF0C&QWC{N=r2!hZu#dH@xUf6yHF*r`+F{Gg4v5Y=vK}w`h8I#f)^wy<*97nW%Oj+p+gcri+Yfnw4hmKN z)W6wM<{FE06;4EHLTCgUQ0fJe8idJH(g-P_52Xj8Ti_MT;(=6_wfC*1=PSRXs}|pL z&9~Gk2(2V~pgx&plG;r7gsGM?8KFg#I-^WNn1+%B#;7pPf_hbAl7CCCfs`m+KrccD zWs4>3R3VMhW`uS}*)BetGYNJ!LW)+hQsdXu9g-JHYAY7ou{TY{o&io@jt0k~QNR%) z?m^P?h{yVmQd}^OL(a+HBazd5cDSb@PTwZ*W^Bi2D*j-%8%GjJB#}fCNhFa(5=kVH dL=s8)^8ZP9qX;~dW*`6n002ovPDHLkV1ncd1?T_( literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_calendar.png b/commons/src/main/res/mipmap-xxhdpi/ic_calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf6edada6dcbf613552eb2fa5e8c3a9cad82576 GIT binary patch literal 7659 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 Z{C^08VMz`6fY<;4002ovPDHLkV1fY-i!%TK literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_camera.png b/commons/src/main/res/mipmap-xxhdpi/ic_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..855d766a8d32f8fe86acc7d7ed074c1237a3ab3d GIT binary patch literal 9929 zcmV;)CN|lLP)8T6M16qD@;SiIC-~HdGU~6F zI18wNJjI8iA|m=gKtT{if{;LfgapV)2qYw(p*!hL_noTh?B5@CyGbD3eQ$Tw?GC^G zuGOrSOV!!C>U`^*v(Fw5^rIjB=tn>L(T{%gqaXd~M?WeD>1_pi16qd#SerNFOqhVv zTA<3Ys1|TsA#Op^^N7d50&u}N4g~|bm{L&iJVSF;oYu|YP1uG{Exy!YdiTjHk9RzQ z6ofhw{nTN$mwD3nnmq>M5`EXEo`N?-s&jX;$uF#!-<0~t~F0xbwRlr5I9 zQ-v%_y%Bae$~N(NJ(pl-HDstGFQC2r3L?cjmOy$LRoMhXjBwa0S$Al?xK(mJfYP@VP|?ZGrlIZ`d= ztFizX*30Vc7GbFvmKot?2i9dAwhw~lcfyo+$P*}gIpa-?IVvo&lw(yH2aH09^|o#Y zKyeZ31-2kOgJFqyJeT?&ulKfUJ;5PKAO*=^!DQd&{UV&EFh`WZ3Q5A4k|KscR$-68 z^Qt^#$9N=B$18{8da2L9?ERr%Wnji(3N}}XvJe=mO6*V|O-B$Y01YZUh0nLs9vkHQ z?CWj4O2r}Z;`Jh8nPI#aVKKrvD5DVU-qtHrC_X~H2=}VbgX!HoD!1bHwpv}G&l4zj zB~#Vr%LYydMgdN5>l86OpdRHx+i-pIJFM?*g*ro@B+!OSNsOyuf-hWvaxpNnw{_|z z>_GULt=ze#iOo}PBH!Bzy%l|qKw8JJoX?pG7pSs`cm9ae6+96hSLJuc=l+4;VOMV} zv_JY3fpXU{%~vi%IFn%i#_DaI`UniL8|8jmxGwok*7deRZRisOYPpJ$j?MY1Tx66Z z4rQw8={=7knAm84n+v$RCo--*VEtPx!&4@>=gp(r6h9IoTnDos9~}I zp*S`Fe?u@DZL*YWlg->Eyzz=s2e`T5aKqp__Et)0#X7L%Dn^RMEdpn%V)v6LWGE_vuW-K_ z{-aVBT1EC*vX?X7wzw8JTfylkPXrJ|!4WvywzxK1$M{N!jhsL&S25DWxJKc8w2u=< zOZ@A@P_PuvHy+otTot_wDAEqq%c;r4_yx*2ea6yiBY^<1Du`7fu{6X}5KAFW5}X9s zF%S#vI2aGq2j9c&eGT37Di|LTz={X$`h_=T^zu`Rq8jLNZ`$Qk@;#a&lND9N^_NjK zFv;ZtS88AJXQ>70A;|EfutrSB8h!*)U5iu=M^Zx}F%aTaNGyd|aj@PTpcODJJIOrq zb<7KQ;AkGPW7xAU#2PdKQ~wfX=PI;u1Nd&QlL%-F5&3pH$M>SL&LZj94VRLrPVy;L zE>W<1|$qkuA~6&mgVHuKZfS=NDN|Q z=Mp>qOUTfvkZVF)ci_MA9R9jLqi;NeHgA7(Wa^D~5X4Mfl1;FC!=?Nz3U7Ys1X7S( zHRl=lI+Zrn+ejleGGHW9I}3Z_BJ8P)k)cz9=?D-hUnSGpK=#R-F^!v0fqY^Fi3MLo zhEGStf~sLi)i7lEkvOwHf$rOezwvLFS0BT?{xrI0GnoDQuTpPC8KlD3##Ym$@awR5 ztV4f{rYo2ii*ctalcQ+ALl}b5re-Ww?OdE0AH^EK0I42>SUn3~RO69f^+%fS{tURS zsDb3{k23J=o3RHB@8m{Bb4{4~7w}%b2lLvK=&rR;Xbs*>Wk0P=o^XE6wJZ;_;ZPr; z=?V_F9c~ik)MCrgzak|dPb`f+>wN4Z&cGTyJ6PLTAq=ppc#WHA{^P|I*8d#@BtDSA z7e7pF{QQzfGtKV7G;G9w^DUd*Y%VO;ZPh$u-mZ_ivF|awBSTh!v;mNkR^s~nXB z+X&OR5$}aNF{|!I8`grFiV#U4r^>HY`FdCzjiIf9tRSA}++u1?v?!Y5)`%Izj{i@r z!%r=aIN`_Hdplkt|I&S^$pPTh&LlD8Y`W9qZKSq_98TBb3InM`M(%u zC;1NW=}4z7CD_;-P)qFHSK!S2I3%h=o2uR>P7Q?@?`6-gJ{+uj6cR_D!@#qC91u1n zxoy*$zx{dK2fvJNeHy%?wHDReR1~<)k8x#n9lLwdRF6g=ts@>wb0)%>5%uGnupDIc zY~rVW2WQ^@L6S9*kq5x+d5zYmeu7BRU`kb!oO>Zwb#16}MFbJSshvywgFnGK`g}-K zht~eVWdg#PF`qLxTuP!RZS{yid5?)|xBwWYQGG88_+U+bFYyn2AA80}BAc$-MS6Mi zYaYORV@2?TSi~kAPh!d`k;=A49!dOt-@;n(pQx1}s?rO^z8a>63&zzjp(kziYy?s+ zP+?I|+v!*U;8bDH{5Rs~{t9d2$%xaV52hrzTc0KK)PJMdAgsn3GMV(E%OE}=Qn?}) zGH^7BQ|fR&@B_5wFjON8R<%@Eq{;<7YNWe2=B{L_fs2XC&!s?Y0M49G5Ig1Cz+V;l zJPGP%$u9o|e#0xl5Aig~ndcH4`>u+}52iGW*xXOzEV>-3#}_@Lk-#xUnBRzA28Vl0IUHc zNuBs5h@~qczcX0rp(Kv~5@zCiA|a3jAvfm~`?fsY%DGrUB*vAhj4oGDDUBocn-P9q z7VoJWG22(78f_^-H9ooL@4$WK@jwwPMr!7{Bo1E`soatwf<0s+>C5y&bwT8tmE}N0aE2XD@;z7Mrbgq3_)RGYg00H&&2>yJ=iagi!2=6wz?Jv!h^p#}5Oz4*J=MP`JUd<&U>-Gte@1+fBMQgc6!GiG*W7Vl*u zdE}YIj`;|AO<=+wg@!sV?=R<;lHXAFa>k2rnnbbhlN^k5!hd2Nc094k@4=q?@3@)@ zMxpxExQ~4syj^Wd5A z2IpemE-oh}s3Zbu9hN%GRhSccW`zN3{Cw`3Pp@EDBx_2d^9divQ~4 zp-*F``3#zAox)*e2U#LRQad*B*SKZp19&6w73 zi*sdH+(lv2zlvK14zWp#NKF4=s4}8}*l`j^EG9l>5ypqS7wWe)7>kqkLP;Lok_hB@ zj7B+@FiWr~fQ^0hN3kcp=Ya52aZ;q_e4N;X6Ue(l!GOQsGoMYFzVZ^`8Mk$v`8n3kQzUn~+w zoL*Lpb8kaLh#j_o*u>+(axeyR#p$dk7Ka8Y(&H>j3pgujL2TeCl+mHmM{KOxxmaW7 zb$Cg9$|=MrFCxGCUJ9NEyVhf`x|8_WW4kR@)!@Fil>F*@!4zYWtr+&G8F)L_1o6p- z3e?B08H+ecw9talU^=rLuzJu}qKpza68KYB*LF!Dy^N}i#e6ixvnLd!Y9!9l{}!a( zbnw+%HRDJf`x(5g&*L?`LOx$Wm*0Us{cN0x?=D70l?StDGufs8jo-LwzaI;<{P~JQ zi#)WYTKM3;nRIG2n9dSTP-&q%AH51O73S+@RCSfn+9iRq35F1ydJ`&S%xtXj3p-7{ z35Mx~BxanA|M>L)6j~d}K7A`yL#JZZj44}gVdLL%Uwtxo@$D~H(d?dXJVhVDTZqy& z65$jxhq^NwDGRa*hCt^8>U0gHAVxWYu#Zf#Z0t$zMyk6efRz|Pdg14>YHHi(_S}ZY z$!~bH>;<*SG?H2V8~m1ogaKP2{Yfy88LxtWZty)E@T}Tn>ui`&j_Atc(D?{-BXQZu z8QoT)Bcz7}`#vRxhgyRtQ1$Mw(DL9_sGG&?t0(*1Z-|Ybk3D>92@79E3mLLc{RDU8 z6TwqQwN|!bB#t_b?5T?bQ=tr4HDgH~_ZcJ|1VL({ncOqC;qQ5^%X>B7LUz^N z_zjgQsqAiEM)sLsR76%AoMBUNM$R~>3ExJdat8uc1|{>1=4c!b#6g&%3YkLDcUEGXB2>F}=YFvc38ZycwlZ3wsziBRLqUcg163ot zHMC1CMQZN9V^xm|(#dVeuf7lW^<^E#44KRxS|7gw&Fl)i?Ul$u7r@PsS#~QX(-^%# z04I(!aypWz>5w2wu(0+GC9z1M%2q~q<`?U11hV{KLn%DBv}Iw9oQ|ZsnE@>pPVF(I z=3LNj{`-5kkbU}>n3jY4$?`AWgSYM3UMcWYSo;u#S00NzAP$NFJ%cA8$CSc1WPj;8-@J&=3g}tHv5}B-q{0?Gigq>bTDmo4g3c0(|mo?j!fY z?+U(jwJdK(%dbez0VAYH-+b7&+otcA7XKF}w7RKBmfm|VOwERS~PT?ewczA1aagrqG zeHyE}=qK~@5Ds`Ir6_>=Z|~pcbTR2;IpAXq(Os5~x2w zgm_2yb!Oiu5eAj7N++;WK^6EA5udP-)UlrdCxt3#>u$`R*ZK^3+F=Uhp1X_u`bQ$2 zRjovI(5u}L(ng{KHXDUOS<|s4-XVcJkGMd%X_wPm`Q=9?qD#?F;G(m(VQ@ z0w&Wy_KBO&Ttufa35b*E)(F&w_I;w_nn)lmrsG(!4n@Vl(lCR_fT&iq_Rz_s=YOj2 zjXH0ESm17XCP*WS3YOF3k7s}DOqE!y^O>q+gx((!?Z}E{lbroA;#1xqRQ2jj%d0a8 zpdOheH{fnx)!W*13RTD!4!R~f039!)!63MyYGu60c4Wnlkvj1UScAs*S^fYZ;O*KF zc7aZeJI4uMMYb82ir{HEnr*x zPL?tq69_!92(`D>%|anuPQDdZJWX=u`8Z>biBwL>P{2U)m~%-l{5+}IAA6J7`F&)c zx$VFdqaMO<*wiC4{vgQO-64=?XhsRo11LZtQ<3x;t7Z(T1^JMnX=O30DAFqB@S0UnML4+-Cjt)aUJ0wt5oL1GI zmBD`-+#F;YBP|vM#UT7C?;}2;;}FkE!AjMTntgtIg?lSmLu%pY+iOm1ejmA)9>CkR zuEz^%&F{l+ek0WV7vHcuKcM5>u+9R?Jh8&H!nDwew(N+UKmb-vEs5FZV^u|03$#m! zg)@34@o678;OE2*$hN_b<#~vEgFHn;w zv-GF9TRM*I?h>l_dp6@|_J%g#ijc*kz9HUmfJlb~np=x+EA>i<3u)t_yVgU#^DK(6 zAh9H=d7r`>IJ#G+vH0}Uh)-Vhwo-W_f-`0giDS-g&oI$!GudZuYd>D0T&S90F`jD* z?|V_Qs_d9s+YJIq9mW^7OBcD(<-+V(jkfOW`ofT451&fvxQhsC*i}fV0Sfq~oEb-|dq#`6zK;op2|3VNU(6M6JBafnL(HF2%0|RS+-*#Fb zyB>e%+Opq|-?W9oD@#z*RW^I+5NLAg+!F7UK)D1vHB15t;Jf(i{t{Y~rNA06g4CSz zusSHfG9g)yv8R|Q` zpwk_L>LIjdcCrFEAvBc)%+_U?h7Cx1SjB4cIJL8I#>^tW=HWJPLNrL!keqXVkfT*X zZ`y;#lRWAy+}EE*TX%z>C%60;q>lY8c1>-`V)HNF3x!Om27_x@>Fw#_pvFWNH>5r!jy{X(5B+z^m0nd9ZQaGb2d^Nv{Pv)_hJn##~VCCG2u%AT7S;_uxODuE1~I{F9vt+Nx$x{3!(3LJF_^6Tf9=sN_*-NcgPj z>bScuy(XzVjR;G_Q!Ri@#aCjVL@3|pQB5^Q+AUXe{gC4t}#;5SgKPhbZdk>%HExH8dxtAVwOV`mDrB!JaUIyw3HPKL!#6av> zpCDE{C$wfO0ufsO_6=C~aPUv3io}s0ES|5?{dvS0b~vedpQL5?CQN=WWE#jka~rYg zi*W|My~>K__EK2)2xi}oZp%CvH0bM>OVYWNiwvx@VT*=IAV3>8VYWVvJ^7SFram)( zyL}bemA?lQobKa{K9b}y=OR5ku3MZWi5VXv|MFibta~^Z3f@>r;pGRg=Y1N99hm3o z)xU)M>Jsonp1xo!7Hdnnu%yTl&tW^lGZLm-1EA1~_w4PM-RmmiU=0JNbvLd5{65;U z9SGbd>Eka6?O05!x|XWlc`@IxAHE$9mReQZ}Tt^zdkoI~3I?|%Jyax3nBGpkh3T;jjK9{*>03X%S^b&w4Q)L1-vnv#ww;8z048@$2xL4hg35Rr0I; zfGGq!`}WYuBxjw6m8_1&0EnfCPd}a5*jYiEj)42>6J(yciR?4K#N-;n4|5V4avA9vu{$0l=X{JSd=f`4Zr`ES zY!eta)U{9XbcP)TpKsTdnU+{~0!Z4h9_3yws}5EPD83MV<5|2XufsHN>l5oCZP`Wc z`QKvpy#atVU>K?S7a@s(JulT)0wkU$arC)Z1BwgvXey8RmU3_2V|}?dmQ5h}KKpFp zFGA;WBHf0c$E>{{_nDveiM^r1<|l)iK57uLh)-Tb{P2@2r+|XLdt;DO7ad>g4g6)w zO{JOc`=eVaXo;QtU6trckLH{4pZEcVr8i-6`+998GA+AkdGIPsOCtiP|WnSNY4BavGK=s%iG=^`S~?}4#<-aH&E;?*x|cef7Bl+bm!)7 zC&4Da!+PLnK-U2)-GK${+lsg3dlZ)6R`F5DedBp@EADDf6SjtoCo${1k^;QKKz{wh zwEXRxc)Qm2pqILU;v2)y$NZRe-EE>rNwBtXr%{eq;bbCsOhM7+EqH&s9L+WmKlWm* zn%aYgHiQX(-wv|Neu}?)L!d`|AgSXn#u+suQn>&ozmNQj_tEm_%kZ0bfECSJUBDP+ z3GmyVw9})W*wVyivA7f19lBW$!Bl2}WeWJqZY2B2)p+$UMm`!9*8P>jy1#<&f@Kk# zu#n`;k3=dHf`ehQPu)Vx!&hTkb|7|ihMq!$!kw)JUhPRcJtEMQo5;I1_oLh&X`c#6 zp&5PY_hjz71aI4l$VBab(p=cM<%BY zzH)zSf%~T1)bU|*rJ%=iL3JIwZQ(kEwP_z#+HKa1>>H=)^L2y0YaRTO2d>v8>* zn>hFpM`a+C#YFO(tP|l@B*bu!gFpl<3u2jivVZ>$Ee~FS_r{7)s-CGDy!zGTp1%wA zgF1tf9vT#dN`+f4I}m7swbs&G*!QPP$!~h1A|bsh>@kL)PxujQ!e}qF&&v4xPK4a77R0?q@+D|~vCU!cCXmnXq_=qU%X9vI`HtvkuByo=n6_aIfnNK8D5#EcK&j6NEB&{%L%!Dgg@w{s1x z|M(V|Trm1n4s$R0&6qbif+a)B!~0-_!azUkn|A{B_Gu!l`0G3i8{QAc49J`AZDL;i)k zXS}c)Xk!;yD%*~@%Oxj*|#-_6v*xi&aKbyL%j@Y zwEd8|UWK9t{*>R%rzYMWa>4lh5cy-aT*XMSxK`kNRjMKCOY5p z0cf+%x;ky<9fx4#`9-xld1z4ZI-1VjsZe~QJdn@w zxrw(#6fyc1RCK`IQ^%mV$CrUiqPEVUJ&Cj9>Fk{ZWv>T6Y23#3$J`mMOKE>pe8$$x zsLCezvp#)%G&A(y|U!fOG)IaInM}RqXIkDZPr=N zJ+x{Nbp;6??N#67n;DNgdm5V2O&xj%3X-{+xmbKdl#`=&z-qC8Ri^L`A(4_7cr4>m zH{r)T6G=c{3FvjBv*`*Bk2_pu;KL|GqFxsr^46K63VT$!$2WX$T!@a*?x5ER1c8O- z*qpD*MMgOyN)jo-n&?m^kt%C_pZ{_5{I*h-R%hrF1ZqR>8m9TmWe8^yIAWvOGiqBC z9Xcd33JpfNUzF==uP?27SS8S>2n4Y2N`_lDXNqvXDvOBFk9J5{XNs@Nl41b-ePM*5 zhKW8$Ab<^*k{DOR1YfuS1N8JKaHg3VQ;EChzC5(~p>)1nu@(rY3C zx41xF>iK*-@3Fo+RWf=DhZKR@pdk4=Ci^b$2NomD78tBbvL|G!6p0ja0*$JyH1JT) z@W^j&U}IgG#hv;B4oL#-kL=})SBJS+oP=_$!nooT*X?5&qL|K##|P{X*kY9BzVf)6 zy%V!kR1=tf|F+h$`J)|o;B$})wez{{en zOZsdZG>GO>OX>Dyydwy7FciK1LoDS8V{wMU9F!V_YM=@wEs)d>ro2+EGgS~Ft4bDV z6`=`e@_kl{&HWTuyT_%m(q8gP;T=n$HYf;nB$^?e%rio5#(P4orHn)vB}&RDBM`=+ zB!K}c46-1tO3YU%__&@=MxjZALx{5oThy>ypw+Ud_mv%@Y;y~2u^j5XJ!B@_PQJIC zoRz{mo7{)M$F^r*nkdY=} zB%m!Az--)zJ98#(Z-y$@P%GeOg{XlF&m$TE1CRylx@0V*B1%TV^DJFeQF=FmHxoR- zN(*)*?`tG*&@+&N&_aw9@ou5fI81kxW`#zeS%kP%CW&FHwZx53r7%vQN|lHJ2w4jW z1AA2IMM$A+F~Uw2lE8Mc?C^!{5ueRbWd{``X(273Bl`rx#X-wJdMQ=O7!6jKZ{RG2 zBY`@BI#sGfh@-?+hW`u%5(-IyUWHDeQ(%RKdyKL!o@Te)Nbm6PYV_ftU?2tIa%wY% zX3sF+2=7!lPGJc!afHch6L>=4Nvo`JE$gC|?OadS!62Oucm_&b#WW)vZk6{S9IG%5 zr5PbI(zLw^N>+sJz!sFJ6dn;+S$Qp6Mw+zY;DBTx1xbH}S-!(xV>lD#2$Tk(f)c2t z(4iy|b|b6=?sKyIPwbm)I1nY$=zrM#perMgjucMYu(jU&LHCNeh{grfFY{ItJ1!7@rb8U=5!TI9WNkCC)$)$O=4!)Cn63M&Xm*-hV#R;i9(Y= z+CpV@go{x=tYF5Nr+iRBa+2um$|#@L7AnJ9D-;IO3y354(}xlb(jJD0tW>`m8=T10^_COkg4L8=o?b)Y?M*sdMW-HLW^Mtj=9Pl8Q@ z_FHH)+_^Gdgk`fcbOJvw_4Fmb#hzsxg5?g8Ai^BR8bzT`QbeLqH3>6r1~Oqjruit$ zgxOF#6;n4AqSc5QWRat_sGmZ+ThY!kHVOtI$0g(VkW`od5~=Z-k)$qO7-u zk5+%3Ri&J~q%Svl6*H{iU$J~}#3heHUqPsudm3iOahT@AF-?n*ih8IRhZq-R_++Z} zA>D-|{T}y89rVKwL)pYZO4Z+gQF3zm`pGrIBJL zQIf!qJj>O!B`QoSnGNJPd|cr?AYQ6DhXSdejkDkbIEy}tnY0jMb%-gS9@)#BkxHCt zOE67~aSr=`_%Hnq|Ha>;tuKIjBf>-~#DVi1hnInWFU6cCxeaY$cEaPgD2ql+b&0`Q za5nDoU&J&m4s4oHV1NLiih3z*$40yrx8Xl^Gh|aEBZ(AMc(E$NhoptqhCAJ`Z=th= z2G`>nl+TovdHS54NF`?K65J)9#aVDR5Uz?E4*Jxa-SQOP6F1?ne*jW@fw7!s=;@=WSy(4L+6UE9#!UD)0>G|`S`65wZ16mcRDi6ilPoT>>( z<#wF!Un*VKI<;oQra* zmTQ-&0!|EP;fIO5`%0v75yd`no9aXp?fAPll700d{OxP-+h4(UyoP3az~&DwOW!|k z6jL_?r(qsW(|n?{--DSrA5%2}scaau?ImsuGw%$djf=@XaTEU2KZHzIS(r${K{-`D z&IPU=>O4axHMx{o3XdpE9qJrKK>@c4=g^N6Ie8hTZhBEF%l5XB-SQ0CSO0{+?RorN z8?aql(QNw70l$H!%yF0IG@LjtQr(EtFdet~5ZpN@6PbP-X593mjCh;eL-z3;6ZLK{ zn&e zvjhALszEopVcXjp@RT6nM3KsII1?8TJ>+cS$6SE8gWoG)lO1HA`x)M!u7*@wDPo+1 zg22sjmoE;bMc2!3a1U_`l6tK6URCBLL%?E5{Xm{{1U8>-MxXtgDoVNe;a@2 z>OkN0T^3d(xc|HYB8v93l702h_^qpPCd|cDP09r|_fLR`AR;&u=Ap3~?AGTY+a0Am*~ zGB5oe&GrNje+0uq>SytHttY$TDZ~w!L)?nOx>E#a!e5~R_VpFur$c2T0fRCnd4+i;_TAc`wR@ zqRA@;3RF!Xvg8ZMq=gK`r~Zx?>An9eq*wk7)Ef=;H~EnZ7i3?4ki-L5kbUJ(14l!|4Z=85jK{KLXKA3wT<2f zmyvz#R^AMQkmF8mPgJ3mOq13#<-6@qtrBp!zi))pER18EDj0`C?WKP&$HdnT6@;Z6o>k&17HwQ;Cb(1yu)C7jhrXeL~rPAmF#IBC-5m@!QwGQH-`9n2I{$ z@4gg`){yo0$@P{J$^-}AO$#-H89u07SlXizSb|a+%C|h{j5v$V#w_@7K?_*3DH0Fg zK>F$1g5+ZfX>ghjrRHNl#?;Szld+**isZxJBKhZ=kP<6!RiEtI2k3Po)SP=85^u{%Jk6ob}7iXIk+c$sqirC zlYQlnq@MZ-YO|$RTgHWG4W@EDrfR|)pLjhI38&Cf1jK>NOZSj|?!VCjww#C%JMZ~G zZZ^&#ABAXD-eES?L2~(b$iDW-=!)@_2qIwHUL^6qU&r6QA-_FjB1GSD7S7~DP#Z{~ zj4io)A5l0)FB!PLeLx0E)-hh-_+lfJgN1tF%y~Cv;(~(Z58lSdNUypB)y#q8Z50cF z?8fC}*8DF25D`pmGqJKIAa$D1m^tV=c+YZrWS3v_F`JS;Q8; zA90+$QpW=6oMBxONn|*Siwg&i3o}q96-GFE_@v}PG=`aR3`FyX95mfc>d7C2J&0A; zJ`gOK)pz6X&cEwMjDtJ%D5UbuT1J744}K{OYs1k@Dcn7`AOoc%Oj4*HCK>rr-H4fd zc)=mw>(7wg{P^33d4M3m*uD;L<72_L={#_o7vt1TdCTvu=Dah8Cx}$3PxlmVQdN+F zJj-;TuF#m_z|_wQc8}(PW_rnPSdQ)99u^6s7MkiL`|6+2#IC$!Ozjk$ro~_)Z{ZZH zL7YenY!Vm*>NMbi{50hIgSKFt;FO&FzV&cmV#ve=NW4C8?8hee;B8$AUMdt4Ml;mU z;%#4z?cSN!rI(6vxKoZq-2HDYvIO3l9lD!eg+p`hnDqUkkOVS5G>e9`*WIZIzC8uJ zFYVre-}Xu%#@|jVEC;{ib-dR6P3Xmm;7pim@!K~9iu~=!L6GytUcq*4 z%|9kmiK(B)U>=es=i*a@N)sl;>+)-%ybKgk>d?X#_>dt$?G&gOmv@Nm+=}16{%zfs zTm&@H7I>lg3~4bq`a!*=f|7?qalMku0*mXh<%1`%vjsLb)gevx-o$r4qideBrA12It9P;iJ% zb-XRz_kE!nNFi+g;yH=e!(bbP=CId08-R&Ksgi8|bVh#b+E9UzU&jmw#vldMms%f9 z>=}aFaB#vV_7sdrn~J)iFJ!UvDy03KJ(TBBt1!-({OOGR637riLkc2_fLlO2s)cOs z*sHg*3d=#WiJ$>hKDZT#3~iVBUhgblq(G?>GXxce#UZpUJOWN3qfdj9)iD7Sz|R)c zGh!mc>YBDUV!fXw6rwp^*e?pM8t&H9fo2~~qDLSS&$&gEpRosgR5I+!`n|!%eY~@Q zX3ft)E>?vCa&wp{un#JbP~lY24he3I*n;;HU3fY~b7_NeGLaK4C}9F=J^WYoChx58 zcY=?bzfLWGGS!lWkj~#!ExeOd3?@>AjuIgx#=)I(B-J1OH!4qEiqp7gZ-=t7tRJZ? ztfIV3F2p>1?DfvxxW7b>7xs(1RJlq@pra&I?F+S#&L5r^F+rBzm@=yi1-1Lnev4r0 zXAytTrPTiI@2EWGa?H5dfD<~6rm~@6&QQ~xxo#h&L7#VK0fY`$$s13}FM*Vd5Yj~a7-P_2#^gFa?|1EO%Hh^lFMdhi>sQS?Nh#qnd60Hq1NU0e~ z1HmIzlL|(fHPu-X6}HdPWPDIdw`%@2!1);nJS9Kp4G%ur+g5Od#Os4{%`!?L?b$){ zp>NXjyU&w(^&!+2*smU~B0B$cs?WNS$}_LSZCW(w^gvN?BAA-Sf;Ho|rwt0kiH3?? zQChmo&uJGYo`ayc{ z{yhG!^?7%TiW9-qPNw3xi>N#QK`P(73{yK5D2?h>1*vMp)HLPyvQ)91n}g=)A;4F* zB@1YxybP4;rdMD`C{zKqYX{n!|7284w#i`BTNm>02e#e&3cC4tfGuuILzQ5;X zpoZ~eRPtXqY;>#P0h%;$^;KGhnTBEPOp#!$JozxSz(0%)7NI(Az{Ep3ezW{r^wNtL5`s{xvGXHcW z-cUp%1i@*Tj??tcyd%_l`0X3e#O|;jPZDLjvx?;?Ub=(+PBNj~}=G`auay+}}HnOgCmZ1 z?k*`+eaLm?^4Hyu-SJ{U%hG8&gxKNd1s9FR8ll`9)NC*5HFwi_>*@5|brIfgJ2+Op-Y72QXrT#EC}eXb=a4FhZeAfh*VK={6$0- zysva^xI#u?IPWIA_5p0?=7J{&se(KC2r5s#5-E`TQtOj_?P0PT9uIBLoPa0r$h@2L zN1*#KC=x_@Ng;oqk>MiSgTMMtv}1FA8bmPFjl@sbucITbRc4E`+s%89TT(zsfqHa6DjG5U|^y$6NW+!a+GPM5Zqx ze!@Q?(VEe($_4`kEL0r+31W*r5}XiS0ND+XkzI2SN`6~vxDa^V_XoCrV2}({6=kz3 z&kI98U%Vg$z{7jud)RF&3lDXpR2+X16(@Wq2*@4iOk^TN5BnIEfBm(BZH^&GrS#tO zMKlv$!wG?m!gF4dL1kzMt3|sE{22S0`XBl?)%VE>zt8m|x8(25kONx^JuH_FR6xJ^# zfbQ9d_vnpzi`(}?1ZUiID&Kbv6-zEc+?vtto#nR5#18prAU&rZJ@7%onI2M4-a>Zk zv!EJow-RBuZ~5P1E-8wEB2iWYFG`q^7y+!0ef43oPktYp8sNks5uEyQA0%2O`G zR5ypSLt>av3pjCN$DU8+8P^9ro(GUT>Ssx>{%vraXEqgTMS_4uS+lK^RmEIa)QZ}K{7Sp*G~kA#Brw|M`Y%)*yL{f_D!H(K;Q@_ z@&mQ%;7(gY_4}_Qe&QF9%JI4L;|pBprOB+mgT(!pqrJNd$B{}vrYId*pG)Td8%62K zqFXwAF;fm7P~3}gFyp2ZnR^Oi4E~qNwj4R{}*c&|M|?}JOR?XQH*Jmd~+xvSFWC*ORsxC+#w8R)tv zNL+Oijw&Y+RuAbu2$1f=Zg~dNv>4Mcd%z|FB7%uk6PbPt?$jetwfMW%1^cGT#Y75- zOJvSTRG#)P#Ft!%88@x4r?vN5#cNwf&+VVWZ(S2U^8{!EzB~Tg6h5qMKNwO|nJ=Bp z>#pT6Ab-JbsUSeM2XFoVLPY~IVJ()l{DGO`OJsm}u1?q)wo=yw@J0``3Sm-LbY@%!4Wqba(RI zn^p{*``Q;nCNHs!6V&n`60#J^K`l@_4QI*ch#q?prodL0{lTWY@wTqSd+pD7+g9T3 zSdZ=8f~IqoD*Zd86v|oUe)fe7BvOH?os2VK7H;!lxN}Y+GWBRo^~B=t&(D%x^=ncO zUyrx#g|aaZ(CcS8t?4^FIh2csOroBHlX?f=x5@=WoulYA6||xr=lCxXJN80MRdFu~ zKr_AAgV8$pM%r1favV^ zVCrWgl??@tD=$P-dev`8Ja|RW(pR-?>QPr8BghkE_6$jmI`a8LQMDu)y1dGh_B z3Mw&}_da6p`V#Jp69;Eoyk(v@{CrLB#&&K+6T7jA-Dsj6&GrV-a8<;KAdz_BJ;fW4 z%6gpIDM;0XV80K2s<6mMpo+I+6{#n0A-&>ffix_W5rg;dm6j`J`!!~h@JK|V()lA5-YBuY=0>smE$pe=WeMD_Ijz` zufR=$HoD>t=zb3t>SxGqdV<7*SK+<>Y|t;Md}<4YZVSImWq4&c^9-BZ6*Kne`9h zx4wY-DNOaGz-}3WeN;*WJ+Irzu6uywqc@Ry_q874^7N4kdcnc|_-&GGeOD?{3B0^f>9~e@^z*$IwI@ zia(O+6%V+dESFCFPH`!Vd?@K{^e*FQQGTGx5#{pA`mom~%JueBOK>XmgxN$Feh_!+ zk+{u^F*Qv=_p=grfmQ3H=`L)~4s6@YWM6-V%$oc0wmu&aVul&CEDct89v3x#yL7v3 zN_snb4o+r1AMoM7l#tHZD71c#i847R63sD^aWK^raq1@HG#!FF^%$J-vvHahVyY$$ zDzd%5#Z-eM8T_4V@ON**+xjft)@QMu+pyi+(M%@r@<)Lwrb@5+e6sP|{I-RI%BhLAv#Wo`iizBFh`=i~=>aFM6%z2R)r!Gw0UQcUlSURue5uRgV^wzb`if z!2nG3Hi9ZYNx@gA-w;m2)X-k6f~1x*(<;A2I3}!h2B2Z@84zz%Jd;lFk*PNm+R4SC z?THc4_%&?6@Hr#=fnZNrS%rZR#E4>UuE??61dJRqR{5is;d5a!50v3V(#o~0R9FT) zG7@jEZ)b7TdHWo{YL(>*OPgLVzCf&4lqZ9J4o>zR9N{V7S2(I1Yrchsw~0-p%1V>v zqVcb@LVg|c7A(r_FLZvHd2WoQDCZzy9q5}MZ;2C?n}9H(BrV*bmVX&;g0vWvHBofk zg-$5E77tBAZ|7pWdRl1RW)K;KRUibebnJfgwN?n1sgdy zyfanO3jdbs=GqxQ2(foT9*me2*NcgzYWcVoz6>m&%+jdO#m{&LtR%9)TF>&WrWC)B zK{SI310&{`$jzi*Y~$y?&qV@{657#HdDbUTWl?8D>T!mPl)~d#%V*YB@w1U)9vCHd zWY01V70W*%{0&NdIV0EoOF<3lEubw9?IVUbIMg`tqOj>dZN+v zU{rZkl{-=XyYWU|7-@R?V>CS{AjqL{IkhR5L#^;-fz!226^^4W*r@ml58!h{x65B< zUr(2e64LrG>KLd$^lz!?naqbpxX1{Ht5O}deKg`sq^JlzR(Z}Uw<9y0KUi8q9FCP|1mAQ`9+dI|BKDwY`Kc!VXu0+gmw zCTdHSfX!9DCQ(`y)&k3Ycv3rfYP7iIL%{*fKz(Svl&V@oy+&CqL0aTcg|mSAQq14S zL}`DB&CZk#3-=;CFP1fq@IoR>`?T+da2{=$aZoVOzR-(_rK)JQh6Ms=sNpCh)LW%S zl-gXOe^HeP`|dk?>i~R&1ki=jBe2`TGrrFQX<_ZmGL~4B69**&^+8)O8#fZ2*-TYJ zn1M1`46`vbt7V)Dvn5b@6LYGs;PcqaL>7EYt3sPVt17RF&|!p4S=j7awr4Gyn>VxP zKrx1gii4Vg_6NNk=auESb7Q#4YU-Ud)t*b0DPkjJ$^%d7$yyTX(bJJ)Pt+kh_hvGq vEzmcHF^pjhV;I92#xRC4jA0C8IGFH%ygSiy-_<-k00000NkvXXu0mjfHsl7* literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_contacts.png b/commons/src/main/res/mipmap-xxhdpi/ic_contacts.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8ba6fe24e6b5542f3ed8ac37c98c14c34ffe8e GIT binary patch literal 6363 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 literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_dialer.png b/commons/src/main/res/mipmap-xxhdpi/ic_dialer.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8e4a9b42dbac4df90fbf86708f05593a33f4ae GIT binary patch literal 6849 zcmV;y8b0NTP)m5_u45=g=j#sni%h+zmK zpwJS!KWaA)O=u7r86FZ6q@N`hpi&oyzU3sqCS#GD>B#&h86=skRbzP9!OHt zozB^-|F~5eA$98x=MFV|`S1sD&fc4Qepzb|Yp(?(j4;9oBaAS@2qTOz!U!W&4ypD4 zs)2&A0Q1f`+^JFA&IaNUpHYD8XNZUp3xtSgaIgqq)sV4DQkAslkg-Zn(xP5QsO z@mKA@p8E(vwg2BL&9D%Vf^5Br`lcqvslx;Vdj-M-g}qQ(L}*di2Z)JMZ=pqm`rdyQ z1s~`UVW&bTkU-gHV517%R@orRHVm6wVQt1?YyH7&m2-!_poX-7^eP&Y5oRfzp~_TX zJkW+vFHolt2i(#-A^{{3dVp;TJ5bg*!fyngj=HRtc5KQ0)F4AfK)MhwF@|xzWuoJ7 zFmR5-u>wt19-5D`26z~F*%jW2xU8q0P64g**h*&53rH^^nrPrCYnX#D*T4Y^lL*7I zgo&aE9l$%li$-`}Ezi{5$ogsztrP~WfbQ+^92o@vPf7-17qC{8 z2d&4W^{{0yy1Cl_v3En;iFBrz?7Ez#%4Y?RP>57}Tp_RpSf-YTY>E|4cd(s7;@$>@ zfD|OPgsFkDK;Uc@4r6Et=g(wa+-8BNjN#$vCZ3cB$W(h+15xt=(yM9dHk>Jj%LJw? z)Kz;-TO83C)x4iWxS;A`<4SY7Qg^-&W7(uH_EZ5)c>T9nTK42tD=rO8gTHv!+Q3wTs+ zW_z`VWU4&?fS$2@5ySUU&P00u8sVd4f0ywJwC$DC|>JO=kXgjfl&n2pS9T+_# zoPzLyr|?-)cMC69>sX{}AFTUoX5nxh!f7bZhyC5NI?>dIbM{z6+Sj1o^TMMQQ_)XhAZ^z zjH+ngmFlQhJm(_ZuFBpcE-PfRE3^RkX`RnPxrH5-=(ZvsQ5WF!Ok=(n9#j}xi9Uxh zs&KcYxwZaQHk7-winy?zY0SrPhbm(#(cdsf1kT6fT3uBB-@EJ_|V;! z7;t0RKXXAEbjXJw=SS9^De!}yG?$IJmCkZ?RaOC|+nMS6Jgjg)=#4i|!I^pr(mEZ~ zLibkex|gu)e+zyx^zH^J)(F=n9qwsqXJ8Avekb9ba1Cbf zS>W|XcUT|o*nt1agZMAr4XKK*W^0+P2<>${`JQ~6RM?G|Wf`4lXEJb?z{yC6^Q?yP zxW`^j~=Xf>j=F2jP z)__X|PSgCODGu%Rm_CWSzaW6I8)O9U~ zhTVMV0!l6694zN+h;ckJ<{%=Uc>wp&zd@pndlb)KJRhkiGWQx};xU6Gu($#!Oft%n z&MU*+MhQ(o3etHsC;D(pXkn+0hnapl(ZBf#X7U`w%|ATIj6ImhCvQi_&m0j^FA8Tl zF|N{f8p3KbGy(No!#LyeRg}qLO`6Tr)9_Bc6*Kn00jOG|GPLuprinyOy8|=kppu$#r=Ny1>wJ9N5fK3*w21IO!g6Jy zeC&>EInF5eX*MB2=`>Ctdd`n96J{1{c|MF72WR}@XwPS?&3n8$+?ij&O#E2M;_1WGk0Cne3Y;l(@hu~kNDx)dZ63pE z+FqIlN)}MkaE8MCu;x9|JQ?S}Grsk)C!lfw9rL?m<&Ov8m_C6{!>(hsb!QJ;*;%9yvt!pDQA|iwE31C5KjTDK3IB*Uy zBebImiF|C5N#JP#)l z$G5}Rov9KNIJqNQ_=>Dx0i_$*&nl;*L<@blU&J7zCgpWd8Y+=`A}3r)?63t0Spf}8 zcP0qR(VoW{g}z#_fc$`uqZ}Bj`x1jRj)zEPQ~!tvCe}>k6H9PgrvMCFcc$6zdEthI zg>48IEFdv_87bUX<{m`^8peVXo>42P`_}!59Qn5x#{(F)?o5@bqsMY$A@39)2zVda4vMe5qJLGo2V#1J`j0dCvWKbh5G>duV9Ul$VYk@pwVg?PZ{wHy}$#UPGX z+4;|h@#=9K#{9)WYcLG=i7Xu6oz6e&N8SQTwKB!RQN;~wpiwwrys|W%H$fVk?)r#W zGM3?X?6I#1N9X%+UIJ1OE6haLr}%LVK$T-G?5_9mcf7a9=*8jW&O~VxVP3}-wB_@B zUIJQo88Hk;ptO`Wynav%wtD#^)dpl%K1R^f|8?@=vN}^i6poA4v2Q-l=Ov)lI!23f z7(#jcj196kORGfY^~XrB_&=!4eY17Atj+|+2XJ^k&*mi{fho2CzgRFfgQmLB3g6?h zU0X;#eKV=Y|A9=;uDsqEChp9!%ITWN#nb!*WH>?yFXrbX1ZlK;D+HBuV|Ld%l20xs z`Rr|^x(dsLGSuCfX7{EKq6xm}|I30}CZ&|Ufj{PYZa@L)WyBN8%+N-*$4)HTu?|glA<@P% zbrGPQ8%h8EUr4=lAN~hxOTI7W_gbN-GxS6x&>)6`DOEt}7*iBlLmSy1QRv{P=~ax(gd?G@ zx><#X#Mzm$*N*-A4=~FuAf*MVY{fv`_DAfd6=;dSx*0nIZ{Opqz9bs#?o5OxFX;aQ zMNR>U5=YB)0^bkXy@g=iatKN*SZwOs@b>=%ZmgmPbdL;XccwzzH1xmSGmr~wLMmK# zGSh>7@A>T6SP6*Z;U4s9+%eN@qA15;b!VzHm}LJN7{~&RLMvbN*1oe0``!zsyRlJ| zh@Nr-UZgfkuMS3cW}q?S7U{xNh>KLA+;))0f93nxNW~Hm5!}fqAp6bc)da6Uf~LAkZp)0G zO7w)QFkZN~vP;Fc;McY#>W*mt8ptUiYuKq!z1m6E$A9%-3Eq3YW0$t2$xLPX8aXD3gzCIh~UorB9X)X8mG*$*M(BE z?o3Ih#lG=4cJsBOqG*#Cz=0Pgzef=a#JFLGvP?$XWdV%DX-hR6{Y4j8k}>dZsG};8;P(#^ytOnG zE7X@WI(o{Dcw?rAFuFbC2t>voN^JkRL?_O~t8d9$NL4;N+pfynxgN-AyQLl5b1kb- zEM=;%S}=YR|M@#HV-G=EbB62YjTw6o(RtTk|KH{K-Qjv{w`n}_IhW%ea5{J~@Y87L z2GYyFOY*hHu>QdNw7voXcon`fq{_B+v#1J(<>ZZ1&^=aJ_<`bwak8$koiKF5S| z`$9x;#vFviN5h8Y1gY+l+jJu_yhG2W{_F?v4*m>M--d~|VCvhD=E-;mo{5Pz;jeyX zz_c;|7C^Huuu>v&3_tf4^NU>13}{ul(!3*-r)YiA1Zn)&{*~a5zX)wYEpC+Pk)Ox= z_(gxp)>%LjU9KmoOU ziw=a<;S4E6y0?&isvX_ACbT9c+DP=+ONkx%c^s$kVvYj1&69|qdK0mezJbJZXT%XN zMr__9qKBM~nEd*y;AUgmTHYGyp#cRXprZU-sKMgLAG}Lu=@rn zC$$r4-aGG=O4-lOl($CRJn+;dFT1(q1RRAqP+ED!vJj-OTi?Wto{Ef}5n8TkiPYmx zn1w_e(M_)qq(X@q|6G7EmMn z&^w7|2YNOy!AFy9P|Hhb|A9qSrE3%EWmlk^Ukhzg4ZW7=xJ!wj`!B@ypNr!~_qgHc zwoS#Ib}BfNx{v(kK{H_6+Tz|*eZY% z!I^y#k@+{5CB;jhFg4YI-S#%>Cvf*YKGZrNs!HY$Kc(mAm*DR#>?qQa(lVu~@|H3D zUEM$NQa;b;eLOMgP7)}O7B{R45~K-!doTVgKME!EcC&%+oCQnZt2PJP$8Sfg%{n0-yp0i^u4Okv5w5LD+u0uVNi-lL@@Pj z)P3?MydokG3Ozd$;la`0Dr}`)c+FIgRSM77?4Hnv&>gGEEV~lB?zhz*O3}Fc%_Dlu zMVKP4XXm{-Q`RVj&v6SD(5QAk!19Pl|EXVV4PEylsh@laKcqmkisQzJeC&K;Gykrr z$jN~=8wJuTJl>Py%|hEQDoCs|&9f-a6!UJ?*!CuwrI!<|e!AKtDHsvKL>r0Cy_)F0 zvx`a|nrpLBVT%h-w%tm>SAdHW(74;_R=7*(|Hfi1qTAji{lwSE{BbE-#R7N5Vwxrp zowo#MRB=a={kbzyUWg`nrkIF}!h>FVx$!wRX67&nI0C7WaMyh3-i%%SYt%%uC+8&w zk5wAeFdpq(kH7wvqVgwM%?il*^8xJkI*&8uCJL*0)i<7EUV`2eTf>iq8VoiYh|Uf8 zzgkTC#qVIdw-2s)QM3Vf%z+rM_+9oscLt;d{#n}DRBT%%S&o>)atx136*G7gi=?~A zJaZ$dr*Fs>yBjnJxN#^k2X=2(khj(6ky6?zX%x~d3!HzX(o-srHVPK~!_td>hNeP%rp1Z_vWj*j62BQ_CHyCU43X+d~ ziS&wxvB_OE?b5X81A@)3VN1MR=@^!o43EkqrS0dHEFb~h-px`G{(q@$RSOYd<0~YV zUPa=GE1?RNe)7eC?*-DUo-HYE!+~9%;f|&|C@q&VA=W`nE@6KQKU6q|TDgQ+0IJy) zid8Us9YXZv>v1Q~LF!sVKW#5+eCcldRZr9P7wTg0tr|6r{-I@IgD|I_MxLL zs}b%-**qxcLjq23*-C%YN_u{JA<1P|VK@8^wbeaG)8tOlzrCOCf4`t4@c_ONewGgS zL0DredLQV+eDi7ahS{v~BeaNeTt$l1l>sAJv+O6k$!vTLS@%3@GnkhB!KI){nGtpI!g-(b>OwA!&NQc%6;Fx5X$mv^jyp1s(gwXx(;0keeSF;y^0Yqty75} zeIeeo`Iy#e;6%zQCe0-9S3gVgnOpEzJ&kWmyLn-RT~U{F8g3w@s(x8Qvp~DEXfAIU zJ&nHqJalhH8pa`!hHQ1jki%Iuv4iwW_mX_-dNLbU zVEegFlrI9iJmJo!o5FKleU!yQ)H}SMP`-t7H???|EKeK*9=(BCfc4X)-v1r`rj) zZBQ-hC(-Wh*j?`ty#FHUm%oSq!CGus8=8u`4i9-zu5KvdxFQ#26_A1?mhd%Iu0^Q5 zWP}9}^u^Tl^WPl-MKFzH@x~m0j+%@#?Ty5mFp&l%QimcCq_N2kNOfR4HzC{JAhYES zG_eC~!&|-zSb<+_n)BN3EMFXZStq#ysxIH{Nz;UICG=l9vDR@+ws>rRA_^2h(T>g7 z&dpeT7BOyij^uc~SDpp60UD$s@UyEsvh9Vu@1c(2Wuq(_RYvhZnJrKs+K$_kVWGgS zD&&7}x5n6gbyjl;!F%b=rn1z7%bRW`+-tgf?yoZF0-T-$`3B0x!01Z#TMn#+R1SAm zEd&B1EH?pPXuhp7xh*SptEpKo{Vo4q(3k?nar1^k1vImMQ0)$Os!nxl&R*(Q;R9V z%wdp)gycFqD;81Kitw0Yxwn!_^n9o}0YUG)XfYFwaH$o}R?EJFZKYPSB~lb2Vc-RU zJ6h5_Eq79L!P+$`pgy#nx}?u+t9$|Y;&2j?z-vah-}o$TzP)xYZ`QPc`p|YvBExLp zautq4*=sO}si4)Fq9Sw~cvplU?%c$EQy#31YLU4Z6awl)ucEOh!d&1SQI1n#GJ{}_ zl!qni5aAU^_?ZJw{Ld(FwYM`UGGYxX0rkGFq`oQ6VX7P=aJVYR0S6$2lL5SV0)?$ccup)UlRhh= zF29R=td~LJrgAZ41k{Hvz+ndQ&J+_JVG4$i181nRj|h!q0}IP(ozi5}rfddY5W`a% z@Os>``kgL1rhc1rO_t6ok|8IcJ)t19(~?LrO$^f!CR=4cU?R|r5CcXDxT-`1Vwx42 zE7|w02pNSWS%G8(dK9_@(yF|t!UiL(G0I9@)=3$N5~8% v>oUR!BaAS@2qTOz!U!XbFv18U3@QE_X+%oya~8c>00000NkvXXu0mjfnkP3> literal 0 HcmV?d00001 diff --git a/commons/src/main/res/mipmap-xxhdpi/ic_draw.png b/commons/src/main/res/mipmap-xxhdpi/ic_draw.png new file mode 100644 index 0000000000000000000000000000000000000000..f223ef0b37a296d1d4bed0eab415edee1a271930 GIT binary patch literal 9824 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