${defaultPattern} from your "Cloze Patterns"',
CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'Add/remove the ${defaultPattern} from your "Cloze Patterns"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'Add/remove the ${defaultPattern} from your "Cloze Patterns"',
CLOZE_PATTERNS: "Cloze Patterns",
CLOZE_PATTERNS_DESC: 'Enter cloze patterns separated by newlines. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Separator for inline flashcards",
FIX_SEPARATORS_MANUALLY_WARNING: "Note that after changing this you have to manually edit any flashcards you already have.",
INLINE_REVERSED_CARDS_SEPARATOR: "Separator for inline reversed flashcards",
MULTILINE_CARDS_SEPARATOR: "Separator for multiline flashcards",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator for multiline reversed flashcards",
MULTILINE_CARDS_END_MARKER: "Characters denoting the end of clozes and multiline flashcards",
NOTES: "Notes",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
TAGS_TO_REVIEW: "Tags to review",
TAGS_TO_REVIEW_DESC: "Enter tags separated by spaces or newlines i.e. #review #tag2 #tag3.",
NOTE_TAGS_TO_IGNORE: "Tags to ignore",
NOTE_TAGS_TO_IGNORE_DESC: "Enter tags separated by spaces or newlines. Notes containing any of these tags will be excluded from note review.",
OPEN_RANDOM_NOTE: "Open a random note for review",
OPEN_RANDOM_NOTE_DESC: "When you turn this off, notes are ordered by importance (PageRank).",
AUTO_NEXT_NOTE: "Open next note automatically after a review",
MAX_N_DAYS_REVIEW_QUEUE: "Maximum number of days to display on note review panel",
MIN_ONE_DAY: "The number of days must be at least 1.",
VALID_NUMBER_WARNING: "Please provide a valid number.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
STATUS_BAR_SETTINGS: "Status Bar",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide all status messages in Obsidian's status bar",
SHOW_CARD_STATUS_BAR_ITEM: "Show card status bar item",
SHOW_CARD_STATUS_BAR_ITEM_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_NOTE_STATUS_BAR_ITEM: "Show note status bar item",
SHOW_NOTE_STATUS_BAR_ITEM_DESC: "Turn this off to hide the note's review status in Obsidian's status bar",
SHOW_UPDATE_AVAILABLE_STATUS_BAR_ITEM: "Show update available status bar item",
SHOW_UPDATE_AVAILABLE_STATUS_BAR_ITEM_DESC: "Turn this off to hide the update available status bar item & to stop the fetching of the newest version number",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Enable the review options in the file menu (e.g. Review: Easy, Good, Hard)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "If you disable the review options in the file menu, you can review your notes using the plugin commands and, if you defined them, the associated command hotkeys.",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deck trees should be initially displayed as expanded",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Turn this off to collapse nested decks in the same card. Useful if you have cards which belong to many decks in the same file.",
ALGORITHM: "Algorithm",
CHECK_ALGORITHM_WIKI: 'For more information, check the algorithm details.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
SWITCH_TO_FSRS_ALGORITHM: "Switch flashcard algorithm to FSRS?",
CONFIRM_FSRS_ALGORITHM_SWITCH: "Switching to FSRS may cause unforseen data loss, as it is still not tested enough! Switching changes how flashcard scheduling data is formatted as cards are reviewed. this means that rewritten cards in the FSRS format, will require a lot more parameters and thus a longer, more intrusive, scheduling data comment. There is best effort backwards compatibility for the scheduling comments, in case you might want to switch back to OSR. This means your scheduling data will be rewritten to the OSR format once you review a card with OSR enabled.",
BASE_EASE: "Base ease",
BASE_EASE_DESC: "minimum = 130, preferrably approximately 250.",
BASE_EASE_MIN_WARNING: "The base ease must be at least 130.",
LAPSE_INTERVAL_CHANGE: "Interval change when you review a flashcard/note as hard",
LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.",
EASY_BONUS: "Easy Bonus",
EASY_BONUS_DESC: "The easy bonus allows you to set the difference in intervals between answering Good and Easy on a flashcard/note (minimum = 100%).",
EASY_BONUS_MIN_WARNING: "The easy bonus must be at least 100.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Maximum interval in days",
MAX_INTERVAL_DESC: "Allows you to place an upper limit on the interval (default = 100 years).",
MAX_INTERVAL_MIN_WARNING: "The maximum interval must be at least 1 day.",
MAX_LINK_CONTRIB: "Maximum link contribution",
MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.",
LOGGING: "Logging",
DISPLAY_SCHEDULING_DEBUG_INFO: "Show the scheduler's debugging information on the developer console",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
USE_CUSTOM_HOTKEYS: "Use custom hotkeys",
USE_CUSTOM_HOTKEYS_DESC: "Enable custom hotkeys for the review cards commands. The default hotkeys wont be active after enabling this. Custom hotkeys can only be used when using the 'Open in new tab' option.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Notes Review Queue",
CLOSE: "Close",
NEW: "New",
YESTERDAY: "Yesterday",
TODAY: "Today",
TOMORROW: "Tomorrow",
// stats-modal.tsx
STATS_TITLE: "Statistics",
MONTH: "Month",
QUARTER: "Quarter",
YEAR: "Year",
LIFETIME: "Lifetime",
FORECAST: "Forecast",
FORECAST_DESC: "The number of cards due in the future",
SCHEDULED: "Scheduled",
DAYS: "Days",
NUMBER_OF_CARDS: "Number of cards",
REVIEWS_PER_DAY: "Average: ${avg} reviews/day",
INTERVALS: "Intervals",
INTERVALS_DESC: "Delays until reviews are shown again",
COUNT: "Count",
INTERVALS_SUMMARY: "Average interval: ${avg}, Longest interval: ${longest}",
EASES: "Eases",
EASES_SUMMARY: "Average ease: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Card Types",
CARD_TYPES_DESC: "This includes buried cards as well, if any",
CARD_TYPE_NEW: "New",
CARD_TYPE_YOUNG: "Young",
CARD_TYPE_MATURE: "Mature",
CARD_TYPES_SUMMARY: "Total cards: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on any note to open it for review. To rate a review click on the 3 dots next to the note.",
NOTE_REVIEW_QUEUE_EMPTY_HINT: "There are no notes to review. To add some notes, add the tag 'review' in one of your notes.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > Scheduling > Delete
DELETE_SCHEDULING_DATA_IN_NOTES: "Delete Scheduling Data in Notes",
DELETE_SCHEDULING_DATA_IN_NOTES_DESC: "Delete scheduling data from all notes.",
DELETE_SCHEDULING_DATA_IN_CARDS: "Delete Scheduling Data in Cards",
DELETE_SCHEDULING_DATA_IN_CARDS_DESC: "Delete scheduling data from all cards.",
CONFIRM_SCHEDULING_DATA_IN_NOTES_DELETION: "Are you sure you want to delete all scheduling data from your notes? This action cannot be undone.",
CONFIRM_SCHEDULING_DATA_IN_CARDS_DELETION: "Are you sure you want to delete all scheduling data from your cards? This action cannot be undone.",
SCHEDULING_DATA_IN_NOTES_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_IN_CARDS_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.',
OPEN_MENU: "Open menu",
DELETE_NOTE_SCHEDULING_DATA_IN_NOTE: "Delete note scheduling data in note",
CONFIRM_NOTE_SCHEDULING_DATA_IN_NOTE_DELETION: "Are you sure you want to delete note scheduling data in this note?",
NOTE_SCHEDULING_DATA_IN_NOTE_DELETION_IN_PROGRESS: "Deleting note scheduling data in note...",
DELETE_SCHEDULING_DATA_OF_CARDS_IN_NOTE: "Delete scheduling data of cards in note",
CONFIRM_SCHEDULING_DATA_OF_CARDS_IN_NOTE_DELETION: "Are you sure you want to delete scheduling data of cards in note?",
SCHEDULING_DATA_OF_CARDS_IN_NOTE_DELETION_IN_PROGRESS: "Deleting scheduling data of cards in note...",
DELETE_TAGS_WHEN_DELETING_SCHEDULING_DATA: "Delete tags when deleting scheduling data",
DELETE_TAGS_WHEN_DELETING_SCHEDULING_DATA_DESC: "Delete tags when deleting scheduling data",
ENABLE_FILE_MENU_DELETE_BUTTON: "Enable file menu delete button",
ENABLE_FILE_MENU_DELETE_BUTTON_DESC: "Enables the delete button in the file menu for scheduling data",
DATA_PAGE_NAME: "Data",
GROUP_RESET_SETTINGS: "Reset settings",
GROUP_RESET_SETTINGS_DESC: "Reset all settings to their default values",
RESET_SETTINGS: "Reset settings",
CONFIRM_RESET_SETTINGS: "Are you sure you want to reset all settings to their default values?",
RESET_SETTINGS_CONFIRMATION: "Resetting all settings to their default values...",
DATE_FORMAT_FOR_NOTE_REVIEW_QUEUE: "Date format for note review queue",
DATE_FORMAT_FOR_NOTE_REVIEW_QUEUE_DESC: 'Date format for note review queue (see moment.js for details). It only updates, once the note review queue is reopened.',
MIGRATE_TO_FOLDER: "Migrate to folder",
CONFIRM_MIGRATE_TO_FOLDER: "Are you sure you want to migrate to folder storage?",
MIGRATING_TO_FOLDER: "Migrating to folder storage...",
USE_CALLOUTS_FOR_SCHEDULING_COMMENTS: "Use callouts for scheduling comments",
USE_CALLOUTS_FOR_SCHEDULING_COMMENTS_DESC: "Use the sr metadata callout for scheduling comments instead of regular comments by default. This will hide away the scheduling comments in a callout which looks like an empty line in the editor.",
MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT_BUTTON: "Migrate",
MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT_DESC: "Migrating will put the scheduling comments into a sr metadata callout. This callout is designed to hide away the scheduling comments.",
CONFIRM_MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT: "Migrating will modify all your cards. Please back them up first in case you want to revert the migration later or in case it breaks your cards because of a bug. Are you sure you want to migrate scheduling comments to sr metadata callouts?",
MIGRATING_SCHEDULING_COMMENTS_TO_CALLOUT: "Migrating scheduling comments to sr metadata callouts...",
MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT: "Migrate scheduling comments to sr metadata callout",
DEFAULT_LOCALE_NAME: "- Obsidian's Default -",
LANGUAGE_SETTINGS: "Language Settings",
LANGUAGE_SETTINGS_DESC: "Select the language you want to use for the plugin interface. This will only fully take effect after restarting Obsidian.",
DEBUG_LOG: "Debug Log",
COPY: "Copy",
NO_DECKS_TO_REVIEW: "There are no decks with cards to review. Make sure you have created some flashcards by adding the tag 'flashcards' to a note and then add cards to it (see plugin page for details on that). In case you did all that and still don't see any decks here, then it will probably caused by a bug in the plugin. There is a known bug that happens when one reviews the cards very fast, then the system bugs out and the decks are not shown. Please try again to open the deck list after a few seconds."
};
var en_default = en;
// src/lang/locale-manager.ts
var import_obsidian = require("obsidian");
// src/lang/locale/af.ts
var af = {
...en_default,
language: "af",
languageName: "Afrikaans"
};
var af_default = af;
// src/lang/locale/ar.ts
var ar = {
...en_default,
language: "ar",
languageName: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
// flashcard-modal.tsx
DECKS: "\u0627\u0644\u0631\u064F\u0632\u0645\u064E\u0627\u062A",
DUE_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u064F\u0633\u062A\u062D\u0642\u0629",
NEW_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u062C\u062F\u064A\u062F\u0629",
TOTAL_CARDS: "\u0625\u062C\u0645\u0627\u0644\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
BACK: "\u0631\u062C\u0648\u0639",
EDIT_CARD: "\u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
RESET_CARD_PROGRESS: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645\u0652 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
HARD: "\u0635\u0639\u0628",
GOOD: "\u062C\u064A\u062F",
EASY: "\u0633\u0647\u0644",
SHOW_ANSWER: "\u0623\u0638\u0647\u0650\u0631 \u0627\u0644\u0625\u062C\u0627\u0628\u0629",
CARD_PROGRESS_RESET: ".\u062A\u0645\u0651\u064E\u062A \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
SAVE: "\u062D\u0641\u0638",
CANCEL: "\u0625\u0644\u063A\u0627\u0621",
NO_INPUT: ".\u0644\u0645 \u064A\u062A\u0650\u0645 \u062A\u0642\u062F\u064A\u0645 \u0623\u064A \u0645\u064F\u062F\u062E\u0644\u0627\u062A",
CURRENT_EASE_HELP_TEXT: ":\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629",
CURRENT_INTERVAL_HELP_TEXT: ":\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0627\u0644\u062D\u0627\u0644\u064A",
CARD_GENERATED_FROM: "${notePath} :\u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646",
// main.ts
OPEN_NOTE_FOR_REVIEW: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
REVIEW_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
REVIEW_DIFFICULTY_FILE_MENU: "${difficulty} :\u0645\u0631\u0627\u062C\u0639\u0629",
REVIEW_NOTE_DIFFICULTY_CMD: "${difficulty} \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640",
CRAM_ALL_CARDS: "\u062D\u062F\u062F \u0631\u064F\u0632\u0645\u064E\u0629 \u0644\u0644\u062D\u0634\u0631",
REVIEW_ALL_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A",
REVIEW_CARDS_IN_NOTE: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629",
CRAM_CARDS_IN_NOTE: "\u0623\u062D\u0634\u0631 \u062C\u0645\u064A\u0639 \u0628\u0637\u0627\u0642\u0627\u062A \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629",
VIEW_STATS: "\u0639\u0631\u0636 \u0627\u0644\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A",
STATUS_BAR: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 ${dueFlashcardsCount},\u0645\u0644\u0627\u062D\u0638\u0627\u062A ${dueNotesCount}:\u0645\u0631\u0627\u062C\u0639\u0629",
SYNC_TIME_TAKEN: "${t}ms \u0627\u0633\u062A\u063A\u0631\u0627\u0642 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629",
NOTE_IN_IGNORED_FOLDER: ".\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u064A\u062A\u0645 \u062D\u0641\u0638\u0647\u0627 \u0636\u0645\u0646 \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0630\u064A \u062A\u0645 \u062A\u062C\u0627\u0647\u0644\u0647 (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)",
PLEASE_TAG_NOTE: ".\u064A\u0631\u062C\u0649 \u0648\u0636\u0639 \u0648\u0633\u0645 \u0639\u0644\u0649 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0628\u0634\u0643\u0644 \u0645\u0646\u0627\u0633\u0628 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629 (\u0641\u064A \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)",
RESPONSE_RECEIVED: ".\u0627\u0633\u062A\u064F\u0644\u0645\u062A \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629",
NO_DECK_EXISTS: "${deckName} \u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u064F\u0632\u0645\u064E\u0629",
ALL_CAUGHT_UP: "\u{1F606} \u0644\u0642\u062F \u062A\u0645 \u0627\u0644\u0642\u0628\u0636 \u0639\u0644\u064A\u0643\u0645 \u062C\u0645\u064A\u0639\u0627 \u0627\u0644\u0622\u0646",
// scheduling.ts
DAYS_STR_IVL: "\u064A\u0648\u0645/\u0623\u064A\u0627\u0645 ${interval}",
MONTHS_STR_IVL: "\u0634\u0647\u0631/\u0623\u0634\u0647\u0631 ${interval}",
YEARS_STR_IVL: "\u0633\u0646\u0629/\u0633\u0646\u0648\u0627\u062A ${interval}",
DAYS_STR_IVL_MOBILE: "\u064A${interval}",
MONTHS_STR_IVL_MOBILE: "\u0634${interval}",
YEARS_STR_IVL_MOBILE: "\u0633${interval}",
// settings.ts
CHECK_WIKI: '.wiki \u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u060C \u062A\u062D\u0642\u0642 \u0645\u0646',
FOLDERS_TO_IGNORE: "\u0645\u062C\u0644\u062F\u0627\u062A \u0644\u062A\u062C\u0627\u0647\u0644\u0647\u0627",
FLASHCARDS: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
FLASHCARD_EASY_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0633\u0647\u0644",
FLASHCARD_GOOD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u062C\u064A\u062F",
FLASHCARD_HARD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0635\u0639\u0628",
FLASHCARD_EASY_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0633\u0647\u0644',
FLASHCARD_GOOD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u062C\u064A\u062F',
FLASHCARD_HARD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0635\u0639\u0628',
FLASHCARD_TAGS: "\u0648\u064F\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
FLASHCARD_TAGS_DESC: "#2\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u064F\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u0623\u0633\u0637\u0631 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A# \u0631\u0632\u0645\u06293# \u0631\u0632\u0645\u0629",
CONVERT_FOLDERS_TO_DECKS: "\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u062C\u0644\u062F\u0627\u062A \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u0623\u0635\u0644\u064A\u0629 \u0648 \u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629\u061F",
CONVERT_FOLDERS_TO_DECKS_DESC: ".\u0647\u0630\u0627 \u0647\u0648 \u0628\u062F\u064A\u0644 \u0644\u062E\u064A\u0627\u0631 \u0648\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0623\u0639\u0644\u0627\u0647",
INLINE_SCHEDULING_COMMENTS: "\u062D\u0641\u0638 \u062A\u0639\u0644\u064A\u0642 \u0627\u0644\u062C\u062F\u0648\u0644\u0629 \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u0633\u0637\u0631 \u0645\u062B\u0644 \u0627\u0644\u0633\u0637\u0631 \u0627\u0644\u0623\u062E\u064A\u0631 \u0644\u0644\u0628\u0637\u0627\u0642\u0629 \u061F",
INLINE_SCHEDULING_COMMENTS_DESC: "\u0644\u0627 \u062A\u0643\u0633\u0631 \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 HTML \u0633\u064A\u0624\u062F\u064A \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0627 \u0625\u0644\u0649 \u062C\u0639\u0644 \u062A\u0639\u0644\u064A\u0642\u0627\u062A",
BURY_SIBLINGS_TILL_NEXT_DAY: "\u0623\u062E\u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u062D\u062A\u0649 \u0627\u0644\u064A\u0648\u0645 \u0627\u0644\u062A\u0627\u0644\u064A",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "cloze deletions : \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u0647\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u0646\u0641\u0633 \u0646\u0635 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0643\u0640",
SHOW_CARD_CONTEXT: "\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0633\u064A\u0627\u0642 \u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A\u061F",
CARD_MODAL_HEIGHT_PERCENT: "\u0646\u0633\u0628\u0629 \u0627\u0631\u062A\u0641\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
CARD_MODAL_SIZE_PERCENT_DESC: "\u064A\u062C\u0628 \u0636\u0628\u0637\u0647\u0627 \u0639\u0644\u0649 100 \u066A \u0639\u0644\u0649 \u0627\u0644\u0647\u0627\u062A\u0641 \u0627\u0644\u0645\u062D\u0645\u0648\u0644 \u0623\u0648 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0635\u0648\u0631 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u064B\u0627",
RESET_DEFAULT: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A",
CARD_MODAL_WIDTH_PERCENT: "\u0646\u0633\u0628\u0629 \u0639\u0631\u0636 \u0627\u0644\u0628\u0637\u0627\u0642\u0629",
RANDOMIZE_CARD_ORDER: "\u062A\u0631\u062A\u064A\u0628 \u0628\u0637\u0627\u0642\u0629 \u0639\u0634\u0648\u0627\u0626\u064A \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629\u061F",
DISABLE_CLOZE_CARDS: "\u061Fcloze \u062A\u0639\u0637\u064A\u0644 \u0628\u0637\u0627\u0642\u0627\u062A",
INLINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0636\u0645\u0646\u0629",
FIX_SEPARATORS_MANUALLY_WARNING: "\u0636\u0639 \u0641\u064A \u062D\u0633\u0627\u0628\u0643 \u0623\u0646\u0647 \u0628\u0639\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u060C \u064A\u062C\u0628 \u0639\u0644\u064A\u0643 \u062A\u0639\u062F\u064A\u0644 \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u0644\u062F\u064A\u0643 \u0628\u0627\u0644\u0641\u0639\u0644 \u064A\u062F\u0648\u064A\u064B\u0627",
INLINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u0636\u0645\u0646\u0629",
MULTILINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629",
MULTILINE_CARDS_END_MARKER: "\u0627\u0644\u0623\u062D\u0631\u0641 \u0627\u0644\u062A\u064A \u062A\u062F\u0644 \u0639\u0644\u0649 \u0646\u0647\u0627\u064A\u0629 \u0627\u0644\u0643\u0644\u0648\u0632\u0627\u062A \u0648\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u062A\u0639\u0644\u0645 \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629 \u0627\u0644\u0623\u0633\u0637\u0631",
NOTES: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A",
REVIEW_PANE_ON_STARTUP: "\u062A\u0645\u0643\u064A\u0646 \u062C\u0632\u0621 \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0639\u0646\u062F \u0628\u062F\u0621 \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
TAGS_TO_REVIEW: "\u0648\u0633\u0648\u0645 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
TAGS_TO_REVIEW_DESC: "#\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u062E\u0637\u0648\u0637 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A : \u0645\u0631\u0627\u062C\u0639\u0629# \u0648\u0633\u06452# \u0648\u0633\u06453",
OPEN_RANDOM_NOTE: "\u0627\u0641\u062A\u062D \u0645\u0644\u0627\u062D\u0638\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
OPEN_RANDOM_NOTE_DESC: "(Pagerank) \u0639\u0646\u062F \u062A\u0639\u0637\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u060C\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0633\u064A\u062A\u0645 \u062A\u0631\u062A\u064A\u0628\u064F\u0647\u0627 \u062D\u0633\u0628 \u0627\u0644\u0623\u0647\u0645\u064A\u0629",
AUTO_NEXT_NOTE: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 \u0628\u0639\u062F \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "\u0641\u0639\u0651\u0644 \u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641 (\u0645\u062B\u0627\u0644: \u0645\u0631\u0627\u062C\u0639\u0629: \u0633\u0647\u0644\u060C \u062C\u064A\u062F\u060C \u0635\u0639\u0628)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u0625\u0630\u0627 \u0642\u0645\u062A \u0628\u062A\u0639\u0637\u064A\u0644 \u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641\u060C \u064A\u0645\u0643\u0646\u0643 \u0645\u0631\u0627\u062C\u0639\u0629 \u0645\u0644\u0627\u062D\u0638\u0627\u062A\u0643 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0623\u0648\u0627\u0645\u0631 \u0627\u0644\u0625\u0636\u0627\u0641\u0629 \u0648\u0625\u0630\u0627 \u0643\u0646\u062A \u0642\u062F \u062D\u062F\u062F\u062A\u0647\u0627\u060C \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u0627\u062E\u062A\u0635\u0627\u0631 \u0627\u0644\u0645\u0631\u062A\u0628\u0637\u0629.",
MAX_N_DAYS_REVIEW_QUEUE: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 \u0627\u0644\u062A\u064A \u064A\u062C\u0628 \u0639\u0631\u0636\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u062D\u0629 \u0627\u0644\u064A\u0645\u0646\u0649",
MIN_ONE_DAY: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 1 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644",
VALID_NUMBER_WARNING: "\u064A\u0631\u062C\u0649 \u062A\u0642\u062F\u064A\u0645 \u0631\u0642\u0645 \u0635\u0627\u0644\u062D",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0634\u062C\u0631\u064A \u0644\u0644\u0631\u064F\u0632\u0645 \u0645\u0648\u0633\u0639 \u0628\u062D\u064A\u062B \u062A\u0637\u0647\u0631 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629 \u0643\u0644\u0647\u0627",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: " \u0639\u0637\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0644\u0637\u064A \u0627\u0644\u0631\u064F\u0632\u0645 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644\u0629 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 , \u0645\u0641\u064A\u062F \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0646\u062A\u0645\u064A \u0625\u0644\u0649 \u0627\u0644\u0639\u062F\u064A\u062F \u0645\u0646 \u0627\u0644\u0631\u064F\u0632\u0645 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0645\u0644\u0641",
ALGORITHM: "\u062E\u0648\u0627\u0631\u0632\u0645\u064A\u0629",
CHECK_ALGORITHM_WIKI: 'algorithm details :\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u062A\u062D\u0642\u0642 \u0645\u0646',
BASE_EASE: "\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629",
BASE_EASE_DESC: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 130 \u060C \u0648\u064A\u0641\u0636\u0644 \u062D\u0648\u0627\u0644\u064A 250.",
BASE_EASE_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629 130 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.",
LAPSE_INTERVAL_CHANGE: "\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u064A\u062A\u063A\u064A\u0631 \u0639\u0646\u062F \u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 \u0635\u0639\u0628\u0629",
EASY_BONUS: "\u0645\u0643\u0627\u0641\u0623\u0629 \u0633\u0647\u0644\u0629",
EASY_BONUS_DESC: "\u062A\u062A\u064A\u062D \u0644\u0643 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 \u0636\u0628\u0637 \u0627\u0644\u0641\u0631\u0642 \u0641\u064A \u0627\u0644\u0641\u0648\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0628\u064A\u0646 \u0627\u0644\u0631\u062F \u0627\u0644\u062C\u064A\u062F \u0648\u0627\u0644\u0633\u0647\u0644 \u0639\u0644\u0649 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 (\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 100 \u066A).",
EASY_BONUS_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 100 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.",
MAX_INTERVAL_DESC: "\u064A\u062A\u064A\u062D \u0644\u0643 \u0648\u0636\u0639 \u062D\u062F \u0623\u0639\u0644\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A (\u0627\u0641\u062A\u0631\u0627\u0636\u064A = 100 \u0639\u0627\u0645).",
MAX_INTERVAL_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u0645\u062F\u0629 \u064A\u0648\u0645 \u0648\u0627\u062D\u062F \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.",
MAX_LINK_CONTRIB: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0627\u0631\u062A\u0628\u0627\u0637",
MAX_LINK_CONTRIB_DESC: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0644\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0645\u0631\u062C\u062D\u0629 \u0644\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0645\u0631\u062A\u0628\u0637\u0629 \u0628\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0623\u0648\u0644\u064A\u0629.",
LOGGING: "\u062A\u0633\u062C\u064A\u0644",
DISPLAY_SCHEDULING_DEBUG_INFO: "\u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0635\u062D\u064A\u062D \u0639\u0644\u0649 \u0648\u062D\u062F\u0629 \u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u0637\u0648\u0631",
// sidebar.ts
NOTES_REVIEW_QUEUE: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629",
CLOSE: "\u0623\u063A\u0644\u0642",
NEW: "\u062C\u062F\u064A\u062F",
YESTERDAY: "\u0627\u0644\u0628\u0627\u0631\u062D\u0629",
TODAY: "\u0627\u0644\u064A\u0648\u0645",
TOMORROW: "\u0627\u0644\u063A\u062F",
// stats-modal.tsx
STATS_TITLE: "\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A",
MONTH: "\u0634\u0647\u0631",
QUARTER: "\u0631\u0628\u0639 \u0627\u0644\u0633\u0646\u0629",
YEAR: "\u0633\u0646\u0629",
LIFETIME: "",
FORECAST: "",
FORECAST_DESC: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 \u0641\u064A \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644",
SCHEDULED: "\u0627\u0644\u0645\u0642\u0631\u0631",
DAYS: "\u0623\u064A\u0627\u0645",
NUMBER_OF_CARDS: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
REVIEWS_PER_DAY: "\u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A/\u0627\u0644\u064A\u0648\u0645 ${avg} :\u0645\u062A\u0648\u0633\u0637",
INTERVALS: "\u0641\u0648\u0627\u0635\u0644 \u0632\u0645\u0646\u064A\u0629",
INTERVALS_DESC: "\u0627\u0644\u062A\u0623\u062E\u064A\u0631 \u062D\u062A\u0649 \u064A\u062A\u0645 \u0639\u0631\u0636 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A \u0645\u0631\u0629 \u0623\u062E\u0631\u0649",
COUNT: "\u0639\u062F\u062F",
INTERVALS_SUMMARY: "${longest} : \u0623\u0637\u0648\u0644 \u0641\u0627\u0635\u0644 \u0632\u0645\u0646\u064A ,${avg} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A",
EASES: "\u0627\u0644\u0633\u0647\u0648\u0644\u0629",
EASES_SUMMARY: "${avgEase} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0633\u0647\u0648\u0644\u0629",
EASE: "Ease",
CARD_TYPES: "\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
CARD_TYPES_DESC: "\u0648\u0647\u0630\u0627 \u064A\u0634\u0645\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0643\u0630\u0644\u0643 \u060C \u0625\u0646 \u0648\u062C\u062F\u062A",
CARD_TYPE_NEW: "\u062C\u062F\u064A\u062F\u0629",
CARD_TYPE_YOUNG: "\u0635\u063A\u064A\u0631\u0629",
CARD_TYPE_MATURE: "\u0646\u0627\u0636\u062C\u0629",
CARD_TYPES_SUMMARY: " ${totalCardsCount} :\u0625\u062C\u0645\u0627\u0644\u064A \u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var ar_default = ar;
// src/lang/locale/bn.ts
var bn = {
...en_default,
language: "bn",
languageName: "Bengali"
};
var bn_default = bn;
// src/lang/locale/cz.ts
var cz = {
...en_default,
language: "cz",
languageName: "\u010Ce\u0161tina",
// flashcard-modal.tsx
DECKS: "Bal\xED\u010Dky",
DUE_CARDS: "Karti\u010Dky po term\xEDnu",
NEW_CARDS: "Nov\xE9 karti\u010Dky",
TOTAL_CARDS: "Karti\u010Dek celkem",
BACK: "Back",
SKIP: "Skip",
EDIT_CARD: "Edit Card",
RESET_CARD_PROGRESS: "Vynulovat pokrok karti\u010Dky",
HARD: "T\u011B\u017Ek\xE9",
GOOD: "Dobr\xE9",
EASY: "Jednoduch\xE9",
SHOW_ANSWER: "Uk\xE1zat odpov\u011B\u010F",
CARD_PROGRESS_RESET: "Pokrok karti\u010Dky byl vynulov\xE1n.",
SAVE: "Save",
CANCEL: "Cancel",
NO_INPUT: "No input provided.",
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
CARD_GENERATED_FROM: "Generated from: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Otev\u0159\xEDt pozn\xE1mku k revizi",
REVIEW_CARDS: "Pozn\xE1mek k revizi",
REVIEW_DIFFICULTY_FILE_MENU: "Revize: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Ozna\u010Dit pozn\xE1mku jako ${difficulty}",
REVIEW_ALL_CARDS: "Revidovat karti\u010Dky ve v\u0161ech pozn\xE1mk\xE1ch",
CRAM_ALL_CARDS: "Select a deck to cram",
REVIEW_CARDS_IN_NOTE: "Revidovat karti\u010Dky v t\xE9to pozn\xE1mce.",
CRAM_CARDS_IN_NOTE: "Cram karti\u010Dky v t\xE9to pozn\xE1mce.",
VIEW_STATS: "Uk\xE1zat statistiky",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "Revize: ${dueNotesCount} pozn\xE1mek, ${dueFlashcardsCount} karti\u010Dek po term\xEDnu",
SYNC_TIME_TAKEN: "Synchronizace trvala ${t}ms",
NOTE_IN_IGNORED_FOLDER: "Pozn\xE1mka je ulo\u017Eena v ignorovan\xE9 slo\u017Ece (zkontrolujte nastaven\xED).",
PLEASE_TAG_NOTE: "Pros\xEDm ozna\u010Dne pozn\xE1mku odpov\xEDdaj\xEDc\xEDm tagem pro revizi (v nastaven\xED).",
RESPONSE_RECEIVED: "Odpov\u011B\u010F p\u0159ijata.",
NO_DECK_EXISTS: "Neexistuje \u017E\xE1dn\xFD bal\xED\u010Dek pro ${deckName}",
ALL_CAUGHT_UP: "V\u0161e zrevidov\xE1no",
// scheduling.ts
DAYS_STR_IVL: "${interval} den/dn\xED",
MONTHS_STR_IVL: "${interval} m\u011Bs\xEDc(\u016F)",
YEARS_STR_IVL: "${interval} rok(\u016F)",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}r",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na wiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "Ignorovan\xE9 slo\u017Eky",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Karti\u010Dky",
FLASHCARD_EASY_LABEL: "Easy Button Text",
FLASHCARD_GOOD_LABEL: "Good Button Text",
FLASHCARD_HARD_LABEL: "Hard Button Text",
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "Tag pro karti\u010Dky",
FLASHCARD_TAGS_DESC: "Zadete tagy ood\u011Blen\xE9 mezerou nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad. #karti\u010Dky #bal\xED\u010Dke2 #bal\xED\u010Dek3.",
CONVERT_FOLDERS_TO_DECKS: "P\u0159ev\xE9st slo\u017Eky na bal\xED\u010Dky a podbal\xED\u010Dky?",
CONVERT_FOLDERS_TO_DECKS_DESC: "Toto je alternativa k tag\u016Fm karti\u010Dek viz nastaven\xED v\xFD\u0161e.",
INLINE_SCHEDULING_COMMENTS: "Ulo\u017Eit pl\xE1novac\xED koment\xE1\u0159 na stejn\xFD \u0159\xE1dek jako posledn\xED polo\u017Eka karti\u010Dky?",
INLINE_SCHEDULING_COMMENTS_DESC: "Zapnut\xED t\xE9to volby zp\u016Fsob\xED, \u017Ee HTML koment\xE1\u0159e nebudou rozb\xEDjet form\xE1tov\xE1n\xED list\u016F.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Odlo\u017Eit p\u0159\xEDbuzn\xE9 karti\u010Dky na dal\u0161\xED den?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "P\u0159\xEDbuzn\xE9 karti\u010Dky jsou karti\u010Dky generovan\xE9 z textu stejn\xE9 pozn\xE1mky nap\u0159\xEDklad cloze smaz\xE1n\xED",
SHOW_CARD_CONTEXT: "Uk\xE1zat kontext v karti\u010Dce?",
SHOW_CARD_CONTEXT_DESC: "nap\u0159\xEDklad Titulek > Nadpis1 > Podnadpis > ... > Podnadpis",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "V\xFD\u0161ka karti\u010Dek v procentech",
CARD_MODAL_SIZE_PERCENT_DESC: "M\u011Blo by b\xFDt nastaveno na 100% na mobilu nebo kdy\u017E pou\u017E\xEDv\xE1te velk\xE9 obr\xE1zky",
RESET_DEFAULT: "Resetovat v\xFDchoz\xED nastaven\xED",
CARD_MODAL_WIDTH_PERCENT: "\u0160\xED\u0159ka karti\u010Dek v procentech",
RANDOMIZE_CARD_ORDER: "N\xE1hodn\u011B zm\u011Bnit po\u0159ad\xED karti\u010Dek b\u011Bhem revize?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
REVIEW_DECK_ORDER: "Order decks are displayed during review",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
DISABLE_CLOZE_CARDS: "Vypnout cloze karti\u010Dky?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "P\u0159ev\xE9st ==zv\xFDrazn\u011Bn\xED== na clozes?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'P\u0159idat/odstranit ${defaultPattern} z va\u0161ich "Cloze vzor\u016F"',
CONVERT_BOLD_TEXT_TO_CLOZES: "P\u0159ev\xE9st **tu\u010Dn\xFD text** na clozes?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'P\u0159idat/odstranit ${defaultPattern} z va\u0161ich "Cloze vzor\u016F"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "P\u0159ev\xE9st {{slo\u017Een\xE9 z\xE1vorky}} na clozes?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'P\u0159idat/odstranit ${defaultPattern} z va\u0161ich "Cloze vzor\u016F"',
CLOZE_PATTERNS: "Cloze vzory",
CLOZE_PATTERNS_DESC: 'Zadejte cloze vzory odd\u011Blen\xE9 od\u0159\xE1dkov\xE1n\xEDm. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro inline karti\u010Dky",
FIX_SEPARATORS_MANUALLY_WARNING: "Pozor. Jakmile toto zm\u011Bn\xEDte, budete muset ru\u010Dn\u011B upravit v\u0161echny existuj\xEDc\xED karti\u010Dky.",
INLINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro oto\u010Den\xE9 inline karti\u010Dky",
MULTILINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkov\xE9 karti\u010Dky",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkove oto\u010Den\xE9 karti\u010Dky",
MULTILINE_CARDS_END_MARKER: "Znaky ozna\u010Duj\xEDc\xED konec clozes a v\xEDce\u0159\xE1dkov\xFDch flash karet",
NOTES: "Pozn\xE1mky",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
TAGS_TO_REVIEW: "Tag pro revizi",
TAGS_TO_REVIEW_DESC: "Zadejte tagy odd\u011Blen\xE9 mezerami nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad #review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "Otev\u0159\xEDt n\xE1hodnou pozn\xE1mku pro revizi",
OPEN_RANDOM_NOTE_DESC: "Pokud toto vypnete, pozn\xE1mky budou \u0159azeny dle d\u016Fle\u017Eitosti (PageRank).",
AUTO_NEXT_NOTE: "Otev\u0159\xEDt automaticky dal\u0161\xED pozn\xE1mku po dokon\u010Den\xED revize",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Povolte mo\u017Enosti revize v nab\xEDdce souboru (nap\u0159. Revize: Jednoduch\xE9, Dobr\xE9, T\u011B\u017Ek\xE9)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Pokud v nab\xEDdce souboru zak\xE1\u017Eete mo\u017Enosti revize, m\u016F\u017Eete sv\xE9 pozn\xE1mky revidovat pomoc\xED p\u0159\xEDkaz\u016F pluginu a, pokud jste je definovali, pomoc\xED p\u0159i\u0159azen\xFDch kl\xE1vesov\xFDch zkratek.",
MAX_N_DAYS_REVIEW_QUEUE: "Maxim\xE1ln\xED po\u010Det dn\xED zobrazen\xFDch v prav\xE9m panelu",
MIN_ONE_DAY: "Po\u010Det dn\xED mus\xED b\xFDt minim\xE1ln\u011B 1.",
VALID_NUMBER_WARNING: "Pros\xEDm zadejte validn\xED \u010D\xEDslo.",
UI: "P\u0159edvolby u\u017Eivatelsk\xE9ho rozhran\xED",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Stromy bal\xED\u010Dky by m\u011Bly b\xFDt zpo\u010D\xE1tku zobrazeny jako rozbalen\xE9",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Vypn\u011Bte toto, chcete-li sbalit vno\u0159en\xE9 bal\xED\u010Dky na stejn\xE9 kart\u011B. To je u\u017Eite\u010Dn\xE9, pokud m\xE1te karti\u010Dky, kter\xE9 pat\u0159\xED k mnoha bal\xED\u010Dk\u016Fm ve stejn\xE9m souboru.",
ALGORITHM: "Algoritmus",
CHECK_ALGORITHM_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na popis algoritmu.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Z\xE1kladn\xED slo\u017Eitost",
BASE_EASE_DESC: "minimum = 130, nejl\xE9pe p\u0159ibli\u017En\u011B 250.",
BASE_EASE_MIN_WARNING: "Z\xE1kladn\xED slo\u017Eitost mus\xED b\xFDt minim\xE1ln\u011B 130.",
LAPSE_INTERVAL_CHANGE: "Zm\u011Bna intervalu pokud karti\u010Dku/pozn\xE1mku ozna\u010D\xEDte jako slo\u017Eitou",
LAPSE_INTERVAL_CHANGE_DESC: "nov\xFD_inteval = star\xFD_interval * zm\u011Bna_intevalu / 100.",
EASY_BONUS: "Bonus pro jednoduch\xE9",
EASY_BONUS_DESC: "Tento bonus umo\u017E\u0148uje nastavit rozd\xEDl intervalu mezi jednoduch\xFDmi a dobr\xFDmi karti\u010Dkami/pozn\xE1mkami (minimum = 100%).",
EASY_BONUS_MIN_WARNING: "Bonus pro jednoduchost mus\xED b\xFDt minim\xE1ln\u011B 100.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Maximum interval in days",
MAX_INTERVAL_DESC: "Umo\u017E\u0148uje nastavit horn\xED limit pro interval (defaultn\u011B = 100 let).",
MAX_INTERVAL_MIN_WARNING: "Maxim\xE1ln\xED interval mus\xED b\xFDt alespo\u0148 1 den.",
MAX_LINK_CONTRIB: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bv\u011Bk prolinkov\xE1n\xED",
MAX_LINK_CONTRIB_DESC: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bvek v\xE1\u017Een\xE9 slo\u017Eitosti prolinkovan\xFDch pozn\xE1mek pou\u017Eit\xFD pro ur\u010Den\xED po\u010D\xE1te\u010Dn\xED slo\u017Eitosti.",
LOGGING: "Zaznamen\xE1v\xE1m",
DISPLAY_SCHEDULING_DEBUG_INFO: "Zobrazit informace pro lad\u011Bn\xED na v\xFDvoj\xE1\u0159sk\xE9 konzoli",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Fronta pozn\xE1mek k revizi",
CLOSE: "Uzav\u0159en\xE9",
NEW: "Nov\xE9",
YESTERDAY: "V\u010Dera",
TODAY: "Dnes",
TOMORROW: "Z\xEDtra",
// stats-modal.tsx
STATS_TITLE: "Statistiky",
MONTH: "M\u011Bs\xEDc",
QUARTER: "\u010Ctvrtlet\xED",
YEAR: "Rok",
LIFETIME: "Celkov\u011B",
FORECAST: "P\u0159edpov\u011B\u010F",
FORECAST_DESC: "Celkov\xFD po\u010Det karti\u010Dek, kter\xFDm vypr\u0161\xED term\xEDn",
SCHEDULED: "Napl\xE1nov\xE1no",
DAYS: "Dn\xED",
NUMBER_OF_CARDS: "Po\u010Det karti\u010Dek",
REVIEWS_PER_DAY: "Pr\u016Fm\u011Br: ${avg} revize/den",
INTERVALS: "Intervaly",
INTERVALS_DESC: "Doba, za kterou bude znovu zobrazeno k revize",
COUNT: "Po\u010Det",
INTERVALS_SUMMARY: "Pr\u016Fm\u011Brn\xFD interval: ${avg}, Nejdel\u0161\xED interval: ${longest}",
EASES: "Slo\u017Eitost",
EASES_SUMMARY: "Pr\u016Fm\u011Brn\xE1 slo\u017Eitost: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Typy karti\u010Dek",
CARD_TYPES_DESC: "Obsahuje i odlo\u017Een\xE9 karti\u010Dky (pokud existuj\xED)",
CARD_TYPE_NEW: "Nov\xE1",
CARD_TYPE_YOUNG: "Mlad\xE1",
CARD_TYPE_MATURE: "Dosp\u011Bl\xE1",
CARD_TYPES_SUMMARY: "Karti\u010Dek celkem: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var cz_default = cz;
// src/lang/locale/da.ts
var dn = {
...en_default,
language: "da",
languageName: "Dansk"
};
var da_default = dn;
// src/lang/locale/de.ts
var de = {
...en_default,
language: "de",
languageName: "Deutsch",
// flashcard-modal.tsx
DECKS: "Stapel",
DUE_CARDS: "Anstehende Karten",
NEW_CARDS: "Neue Karten",
TOTAL_CARDS: "Alle Karten",
BACK: "Zur\xFCck",
SKIP: "\xDCberspringen",
EDIT_CARD: "Karte bearbeiten",
RESET_CARD_PROGRESS: "Kartenfortschritt zur\xFCcksetzten",
HARD: "Schwer",
GOOD: "Gut",
EASY: "Einfach",
SHOW_ANSWER: "Zeige Antwort",
CARD_PROGRESS_RESET: "Kartenfortschritt wurde zur\xFCckgesetzt.",
SAVE: "Speichern",
CANCEL: "Abbrechen",
NO_INPUT: "Keine Eingabe erhalten.",
CURRENT_EASE_HELP_TEXT: "Aktuelle Schwierigkeit: ",
CURRENT_INTERVAL_HELP_TEXT: "Aktueller Intervall: ",
CARD_GENERATED_FROM: "Erstellt von: ${notePath}",
VIEW_CARD_INFO: "Karteninformationen anzeigen",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Notiz zur Wiederholung \xF6ffnen",
REVIEW_CARDS: "Lernkarten wiederholen",
REVIEW_DIFFICULTY_FILE_MENU: "Notizen wiederholen als: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Notizen wiederholen als: ${difficulty}",
REVIEW_ALL_CARDS: "Alle Lernkarten wiederholen",
CRAM_ALL_CARDS: "W\xE4hle ein Stapel zum pauken",
REVIEW_CARDS_IN_NOTE: "Lernkarten in dieser Notiz wiederholen",
CRAM_CARDS_IN_NOTE: "Lernkarten in dieser Notiz pauken.",
VIEW_STATS: "Statistiken anzeigen",
OPEN_REVIEW_QUEUE_VIEW: "\xD6ffne \xDCberpr\xFCfungswarteschlage in der Seitenleiste",
STATUS_BAR: "Wiederholung: ${dueNotesCount} Notiz(en), ${dueFlashcardsCount} Karte(n) anstehend",
SYNC_TIME_TAKEN: "Synchronisierung dauerte ${t}ms",
NOTE_IN_IGNORED_FOLDER: "Notiz befindet sich in einem ausgeschlossenen Ordner (siehe Einstellungen).",
PLEASE_TAG_NOTE: "Bitte die Notiz f\xFCr Wiederholungen entsprechend taggen (siehe Einstellungen).",
RESPONSE_RECEIVED: "Antwort erhalten.",
NO_DECK_EXISTS: "Kein Stapel f\xFCr ${deckName} gefunden.",
ALL_CAUGHT_UP: "Yuhu! Alles geschafft! :D.",
// scheduling.ts
DAYS_STR_IVL: "${interval} Tag(e)",
MONTHS_STR_IVL: "${interval} Monat(e)",
YEARS_STR_IVL: "${interval} Jahr(e)",
DAYS_STR_IVL_MOBILE: "${interval}t",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}j",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Ordner",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Helfen",
CHECK_WIKI: 'Weitere Informationen gibt es im Wiki (english).',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "Ausgeschlossene Ordner",
FOLDERS_TO_IGNORE_DESC: "Geben Sie Pfad- oder Globalemuster in separaten Zeilen an, z.B. Templates/Scripts oder **/*.excalidraw.md. Diese Einstellung gilt f\xFCr Flashcards und Notizen.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Lernkarten",
FLASHCARD_EASY_LABEL: "Einfach Knopf Text",
FLASHCARD_GOOD_LABEL: "Gut Knopf Text",
FLASHCARD_HARD_LABEL: "Schwer Knopf Text",
FLASHCARD_GOOD_DESC: 'Passe die Beschriftung f\xFCr "Gut" Knopf an',
FLASHCARD_EASY_DESC: 'Passe die Beschriftung f\xFCr "Einfach" Knopf an',
FLASHCARD_HARD_DESC: 'Passe die Beschriftung f\xFCr "Schwer" Knopf an',
REVIEW_BUTTON_DELAY: "Druckknopfverz\xF6gerung (ms)",
REVIEW_BUTTON_DELAY_DESC: "F\xFCgt den \xDCberpr\xFCfungsschaltfl\xE4chen (\u201EEinfach\u201C, \u201EGut\u201C, \u201ESchwer\u201C, \u201EAntwort anzeigen\u201C) eine Verz\xF6gerung hinzu, bevor sie erneut gedr\xFCckt werden k\xF6nnen.",
FLASHCARD_TAGS: "Lernkarten Tags",
FLASHCARD_TAGS_DESC: "Mehrere Tags mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angeben. Bsp. #karte #stapel2 #stapel3.",
CONVERT_FOLDERS_TO_DECKS: "Ordner in Stapel und Substapel umwandeln?",
CONVERT_FOLDERS_TO_DECKS_DESC: 'Eine Alternative zur oberen "Lernkarten Tags" Option.',
INLINE_SCHEDULING_COMMENTS: "Den Fortschritt in der gleichen Zeile wie die letzte Zeile einer Lernkartei speichern?",
INLINE_SCHEDULING_COMMENTS_DESC: "Wenn aktiviert, wird der HTML Kommentar die umgebende Liste nicht aufbrechen.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Verwandte Karten auf den n\xE4chsten Tag verlegen?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Verwandte Karten sind aus der gleichen Karte generiert worden (z.B. L\xFCckentextkarten oder beidseitige Karten).",
SHOW_CARD_CONTEXT: "Kontext in den Karten anzeigen?",
SHOW_CARD_CONTEXT_DESC: "Bsp. Titel > \xDCberschrift 1 > Sektion > ... > Untersektion",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Zeige n\xE4chsten Review-Zeit in den Review-Buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "H\xF6he der Lernkartei in Prozent",
CARD_MODAL_SIZE_PERCENT_DESC: "Auf kleinen Bildschirmen (z.B. Smartphones) oder bei sehr grossen Bildern sollte dieser Wert auf 100% gesetzt werden.",
RESET_DEFAULT: "Standardeinstellung wiederherstellen",
CARD_MODAL_WIDTH_PERCENT: "Breite einer Lernkarte in Prozent",
RANDOMIZE_CARD_ORDER: "W\xE4hrend der Wiederhoung die Reihenfolge zuf\xE4llig mischen?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Reihenfolge der Karten innerhalb eines Stapels w\xE4hrend der Wiederholung",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentielle Reihenfolge innerhalb eines Stapels (Alle neuen Karten zuerst)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentielle Reihenfolge innerhalb eines Stapels (Alle f\xE4lligen Karten zuerst)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Zuf\xE4llige Reihenfolge innerhalb eines Stapels (Alle neuen Karten zuerst)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Zuf\xE4llige Reihenfolge innerhalb eines Stapels (Alle f\xE4lligen Karten zuerst)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Zuf\xE4llige Karte von zuf\xE4lligem Stapel",
REVIEW_DECK_ORDER: "Reihenfolge der Stapel w\xE4hrend der Wiederholung",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentielle Reihenfolge (sobald alle Karten im vorherigen Stapel wiederholt wurden)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Zuf\xE4llige Reihenfolge (sobald alle Karten im vorherigen Stapel wiederholt wurden)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Zuf\xE4llige Karte von zuf\xE4lligem Stapel",
DISABLE_CLOZE_CARDS: "L\xFCckentextkarten deaktivieren?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Konvertiere L\xFCckentext zu Eingabefelder",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Ersetze L\xFCckentext mit Eingabefeldern, wenn L\xFCckentextkarten angezeigt werden.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "==Hervorgehobenen== Text in L\xFCckentextkarten umwandeln?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'F\xFCge/entferne das ${defaultPattern} zu deinen "L\xFCckentextmuster" hinzu',
CONVERT_BOLD_TEXT_TO_CLOZES: "**Fettgedruckten** Text in L\xFCckentextkarten umwandeln?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'F\xFCge/entferne das ${defaultPattern} zu deinen "L\xFCckentextmuster" hinzu',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{Geschweifte Klammern}} Text in L\xFCckentextkarten umwandeln?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'F\xFCge/entferne das ${defaultPattern} zu deinen "L\xFCckentextmuster" hinzu',
CLOZE_PATTERNS: "L\xFCckentextmuster",
CLOZE_PATTERNS_DESC: 'Geben Sie L\xFCckentextmuster durch Zeilenumbr\xFCche getrennt ein. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige Lernkarten",
FIX_SEPARATORS_MANUALLY_WARNING: "Wenn diese Einstellung ge\xE4ndert wird, dann m\xFCssen die entsprechenden Lernkarten manuell angepasst werden.",
INLINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige beidseitige Lernkarten",
MULTILINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige Lernkarten",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige beidseitige Lernkarten",
MULTILINE_CARDS_END_MARKER: "Zeichen, die das Ende von L\xFCckentexten und mehrzeiligen Flashcards kennzeichnen",
NOTES: "Notizen",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "\xD6ffne \xDCberpr\xFCfungswarteschlage beim start",
TAGS_TO_REVIEW: "Zu wiederholende Tags",
TAGS_TO_REVIEW_DESC: "Mehrere Tags k\xF6nnen mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angegeben werden. Bsp. #karte #tag1 #tag2.",
OPEN_RANDOM_NOTE: "Zuf\xE4llige Karten wiederholen",
OPEN_RANDOM_NOTE_DESC: "Wenn dies deaktiviert wird, dann werden die Notizen nach Wichtigkeit wiederholt (PageRank).",
AUTO_NEXT_NOTE: "Nach einer Wiederholung automatisch die n\xE4chste Karte \xF6ffnen",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Aktiviere die \xDCberpr\xFCfungsoptionen im Dateimen\xFC (z. B. Notizen wiederholen als: Einfach, Gut, Schwer)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Wenn du die \xDCberpr\xFCfungsoptionen im Dateimen\xFC deaktivierst, kannst du deine Notizen mit den Plugin-Befehlen und, falls definiert, den zugeh\xF6rigen Tastenkombinationen \xFCberpr\xFCfen.",
MAX_N_DAYS_REVIEW_QUEUE: "Maximale Anzahl anstehender Notizen, die im rechten Fensterbereich angezeigt werden",
MIN_ONE_DAY: "Anzahl der Tage muss mindestens 1 sein.",
VALID_NUMBER_WARNING: "Bitte eine g\xFCltige Zahl eingeben.",
UI: "User Interface",
OPEN_IN_TAB: "\xD6ffne im neuen Tab",
OPEN_IN_TAB_DESC: "Schalte dies aus, um die Notizen in einem Modalfenster zu \xF6ffnen",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Stapelverzeichnis soll beim \xF6ffnen erweitert angezeigt werden",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Deaktivieren Sie dies, um verschachtelte Stapel in derselben Karte zu reduzieren. N\xFCtzlich, wenn Sie Karten haben, die zu vielen Stapeln in derselben Datei geh\xF6ren.",
ALGORITHM: "Algorithmus",
CHECK_ALGORITHM_WIKI: 'Weiterf\xFChrende Informationen: Implementierung des Algorithmus (english).',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Basis der Schwierigkeit",
BASE_EASE_DESC: "Minimum ist 130. Empfohlen wird ca. 250.",
BASE_EASE_MIN_WARNING: "Basis der Schwierigkeit muss mindestens 130 sein.",
LAPSE_INTERVAL_CHANGE: "Anpassungsfaktor des Intervalls wenn eine Notiz / Karte 'Schwer' abgeschlossen wird",
LAPSE_INTERVAL_CHANGE_DESC: "neuesIntervall = altesIntervall * anpassungsfaktor / 100.",
EASY_BONUS: "Einfachheit-Bonus",
EASY_BONUS_DESC: "Der Einfachheit-Bonus gibt an um welchen Faktor (in Prozent) das Intervall l\xE4nger sein soll, wenn eine Notiz / Karte 'Einfach' statt 'Gut' abgeschlossen wird. Minimum ist 100%.",
EASY_BONUS_MIN_WARNING: "Der Einfachheit-Bonus muss mindestens 100 sein.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Maximale Intervall in Tagen",
MAX_INTERVAL_DESC: "Das maximale Intervall (in Tagen) f\xFCr Wiederholungen. Standard sind 100 Jahre.",
MAX_INTERVAL_MIN_WARNING: "Das maximale Interall muss mindestens ein Tag sein.",
MAX_LINK_CONTRIB: "Maximaler Einfluss von Links",
MAX_LINK_CONTRIB_DESC: "Maximaler Einfluss der Einfachheiten verlinkter Notizen zur gewichteten initialen Einfachheit einer neuen Lernkarte.",
LOGGING: "Protokollierung",
DISPLAY_SCHEDULING_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen",
DISPLAY_PARSER_DEBUG_INFO: "Informationen zum parser Debugging in der Entwicklerkonsole anzeigen",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung",
CLOSE: "Schliessen",
NEW: "Neu",
YESTERDAY: "Gestern",
TODAY: "Heute",
TOMORROW: "Morgen",
// stats-modal.tsx
STATS_TITLE: "Statistiken",
MONTH: "Monat",
QUARTER: "Quartal",
YEAR: "Jahr",
LIFETIME: "Lebenslang",
FORECAST: "Prognose",
FORECAST_DESC: "Anzahl der k\xFCnftig anstehenden Karten",
SCHEDULED: "Anstehend",
DAYS: "Tage",
NUMBER_OF_CARDS: "Anzahl der Karten",
REVIEWS_PER_DAY: "Durchschnitt: ${avg} Wiederholungen/Tag",
INTERVALS: "Intervalle",
INTERVALS_DESC: "Intervalle bis Wiederholungen anstehen",
COUNT: "Anzahl",
INTERVALS_SUMMARY: "Durchschnittliches Intervall: ${avg}, L\xE4ngstes Intervall: ${longest}",
EASES: "Schwierigkeit",
EASES_SUMMARY: "Durchschnittliche Schwierigkeit: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Kategorisierung",
CARD_TYPES_DESC: "Verlegte Karten eingeschlossen",
CARD_TYPE_NEW: "Neu",
CARD_TYPE_YOUNG: "Jung",
CARD_TYPE_MATURE: "Ausgereift",
CARD_TYPES_SUMMARY: "Insgesamt ${totalCardsCount} Karten",
SEARCH: "Suche",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Einstellungen",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Klicke auf die 3 Punkte neben der Notiz, um das Review-Men\xFC zu \xF6ffnen.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Stapel zum Wiederholung \xF6ffnen",
UPDATE_AVAILABLE: "Update verf\xFCgbar",
// Statistics
PERIOD_TITLE: "Zeitraum",
PERIOD_DESC: "Zeitraum, in dem die Diagramme angezeigt werden",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var de_default = de;
// src/lang/locale/en-gb.ts
var enGB = {
...en_default,
language: "en-gb",
languageName: "British English"
};
var en_gb_default = enGB;
// src/lang/locale/es.ts
var es = {
...en_default,
language: "es",
languageName: "Espa\xF1ol",
// flashcard-modal.tsx
DECKS: "Mazos",
DUE_CARDS: "Tarjetas Vencidas",
NEW_CARDS: "Tarjetas Nuevas",
TOTAL_CARDS: "Tarjetas Totales",
BACK: "Atr\xE1s",
SKIP: "Saltar",
EDIT_CARD: "Editar Tarjeta",
RESET_CARD_PROGRESS: "Reiniciar progreso de la tarjeta",
HARD: "Dif\xEDcil",
GOOD: "Bien",
EASY: "F\xE1cil",
SHOW_ANSWER: "Mostrar Respuesta",
CARD_PROGRESS_RESET: "El progreso de la tarjeta se ha reiniciado.",
SAVE: "Guardar",
CANCEL: "Cancelar",
NO_INPUT: "Se ha prove\xEDdo entrada.",
CURRENT_EASE_HELP_TEXT: "Facilidad Actual: ",
CURRENT_INTERVAL_HELP_TEXT: "Intervalo Actual: ",
CARD_GENERATED_FROM: "Generado Desde: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Abrir nota para revisi\xF3n",
REVIEW_CARDS: "Revisar Tarjetas",
REVIEW_DIFFICULTY_FILE_MENU: "Revisar: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Revisar nota como ${difficulty}",
CRAM_ALL_CARDS: "Selecciona un mazo a memorizar",
REVIEW_ALL_CARDS: "Revisar tarjetas de todas las notas",
REVIEW_CARDS_IN_NOTE: "Revisar tarjetas en esta nota",
CRAM_CARDS_IN_NOTE: "Memorizar tarjetas en esta nota",
VIEW_STATS: "Ver estad\xEDsticas",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "Revisar: ${dueNotesCount} nota(s), ${dueFlashcardsCount} tarjetas vencidas",
SYNC_TIME_TAKEN: "La sincronizaci\xF3n tom\xF3 ${t} milisegundos",
NOTE_IN_IGNORED_FOLDER: "La nota est\xE1 guardada en un directorio ignorado (revisa los ajustes).",
PLEASE_TAG_NOTE: "Por favor etiquete apropiadamente la nota para revisi\xF3n (en los ajustes).",
RESPONSE_RECEIVED: "Respuesta Recibida",
NO_DECK_EXISTS: "No existen mazos para: ${deckName}",
ALL_CAUGHT_UP: "\xA1Est\xE1s al d\xEDa! \u{1F603}",
// scheduling.ts
DAYS_STR_IVL: "${interval} d\xEDa(s)",
MONTHS_STR_IVL: "${interval} mes(es)",
YEARS_STR_IVL: "${interval} a\xF1o(s)",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}a",
// settings.ts
SETTINGS_HEADER: "Extensi\xF3n de Repetici\xF3n Espaciada",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: 'Para m\xE1s informaci\xF3n revisa la wiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "Directorios a ignorar",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Tarjetas de Memorizaci\xF3n",
FLASHCARD_EASY_LABEL: "Texto del bot\xF3n: F\xE1cil",
FLASHCARD_GOOD_LABEL: "Texto del bot\xF3n: Bien",
FLASHCARD_HARD_LABEL: "Texto del bot\xF3n: Dif\xEDcil",
FLASHCARD_EASY_DESC: "Personalize la etiqueta para el bot\xF3n: F\xE1cil",
FLASHCARD_GOOD_DESC: "Personalize la etiqueta para el bot\xF3n: Bien",
FLASHCARD_HARD_DESC: "Personalize la etiqueta para el bot\xF3n: Dif\xEDcil",
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "Etiquetas de las Tarjetas de Memorizaci\xF3n",
FLASHCARD_TAGS_DESC: "Escriba las etiquetas separadas por espacios o saltos de l\xEDnea, por ejemplo, #memorizar #mazo2 #mazo3",
CONVERT_FOLDERS_TO_DECKS: "\xBFConvertir directorios a mazos y submazos?",
CONVERT_FOLDERS_TO_DECKS_DESC: "Esta es una opci\xF3n alternativa a las etiquetas de las Tarjetas de Memorizaci\xF3n.",
INLINE_SCHEDULING_COMMENTS: "\xBFGuardar el comentario para programaci\xF3n de las tarjetas en la \xFAltima l\xEDnea?",
INLINE_SCHEDULING_COMMENTS_DESC: "Activar esto har\xE1 que los comentarios HTML no rompan el formato de las listas.",
BURY_SIBLINGS_TILL_NEXT_DAY: "\xBFEnterrar tarjetas hermanas hasta el siguiente d\xEDa?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Los hermanos son tarjetas generadas del mismo texto de la tarjeta, por ejemplo, deletreos de huecos (cloze deletions en ingl\xE9s)",
SHOW_CARD_CONTEXT: "\xBFMostrar contexto en las tarjetas?",
SHOW_CARD_CONTEXT_DESC: "Por Ejemplo: T\xEDtulo > Cabecera > Sub-Cabecera > ... > Sub-Cabecera",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "Porcentaje de la altura de las tarjetas de memoria",
CARD_MODAL_SIZE_PERCENT_DESC: "Deber\xEDa ser establecido en 100% si tienes im\xE1genes grandes",
RESET_DEFAULT: "Reiniciar a la configuraci\xF3n por defecto",
CARD_MODAL_WIDTH_PERCENT: "Porcentaje del ancho de las tarjetas de memoria",
RANDOMIZE_CARD_ORDER: "\xBFAleatorizar el orden de las tarjetas para revisi\xF3n?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
REVIEW_DECK_ORDER: "Order decks are displayed during review",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
DISABLE_CLOZE_CARDS: "\xBFDeshabilitar deletreo de huecos en las tarjetas?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "\xBFConvertir ==resaltados== a deletreo de huecos?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'A\xF1adir/eliminar el ${defaultPattern} de tus "Patrones de Deletreo de Huecos"',
CONVERT_BOLD_TEXT_TO_CLOZES: "\xBFConvertir **texto en negrita** a deletreo de huecos?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'A\xF1adir/eliminar el ${defaultPattern} de tus "Patrones de Deletreo de Huecos"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\xBFConvertir {{llaves rizadas}} a deletreo de huecos?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'A\xF1adir/eliminar el ${defaultPattern} de tus "Patrones de Deletreo de Huecos"',
CLOZE_PATTERNS: "Patrones de deletreo de huecos",
CLOZE_PATTERNS_DESC: 'Escriba los patrones de deletreo de huecos separados por saltos de l\xEDnea. . Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Separador de tarjetas de memorizaci\xF3n en l\xEDnea",
FIX_SEPARATORS_MANUALLY_WARNING: "Note que despu\xE9s de cambiar este ajuste, tendr\xE1 que cambiar manualmente todas las notas que tenga.",
INLINE_REVERSED_CARDS_SEPARATOR: "Separador de tarjetas de memorizaci\xF3n para tarjetas de notas invertidas",
MULTILINE_CARDS_SEPARATOR: "Separador para tarjetas de memorizaci\xF3n multil\xEDnea",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para tarjetas de memorizaci\xF3n multil\xEDnea invertidas",
MULTILINE_CARDS_END_MARKER: "Caracteres que denotan el fin de los clozes y tarjetas did\xE1cticas de varias l\xEDneas",
NOTES: "Notes",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Activar panel de revisi\xF3n de notas al arrancar",
TAGS_TO_REVIEW: "Etiquetas a revisar",
TAGS_TO_REVIEW_DESC: "Escriba las etiquetas separadas por espacios o saltos de l\xEDneas, por ejemplo, #revisi\xF3n #etiqueta2 #etiqueta3.",
OPEN_RANDOM_NOTE: "Abrir una nota al azar para revisar",
OPEN_RANDOM_NOTE_DESC: "Cuando deshabilita esto, las notas son ordenadas por importancia (Algoritmo PageRank).",
AUTO_NEXT_NOTE: "Abrir la siguiente nota autom\xE1ticamente despu\xE9s de una revisi\xF3n",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Habilita las opciones de revisi\xF3n en el men\xFA Archivo (por ejemplo: Revisar: F\xE1cil, Bien, Dif\xEDcil)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Si desactivas las opciones de revisi\xF3n en el men\xFA Archivo, puedes revisar tus notas usando los comandos del plugin y, si los definiste, las teclas r\xE1pidas asociadas.",
MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de d\xEDas a mostrar en el panel derecho.",
MIN_ONE_DAY: "El n\xFAmero de d\xEDas debe ser al menos uno.",
VALID_NUMBER_WARNING: "Por favor especifique un n\xFAmero v\xE1lido.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Los \xE1rboles de mazos deber\xEDan ser expandidos al inicio.",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desactiva esto para contraer mazos anidados en la misma tarjeta. \xDAtil si tienes tarjetas que pertenecen a muchos mazos en el mismo archivo.",
ALGORITHM: "Algoritmo",
CHECK_ALGORITHM_WIKI: 'Para m\xE1s informaci\xF3n, revisa la implementaci\xF3n del algoritmo.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Base ease",
BASE_EASE_DESC: "El m\xEDnimo es 130, es preferible que est\xE9 aproximado a 250.",
BASE_EASE_MIN_WARNING: "La facilidad base de las tarjetas debe ser al menos 130.",
LAPSE_INTERVAL_CHANGE: "El intervalo cambiar\xE1 cuando se revise una tarjeta o nota como Dif\xEDcil.",
LAPSE_INTERVAL_CHANGE_DESC: "NuevoInterval = ViejoIntervalo * CambioDeIntervalo / 100.",
EASY_BONUS: "Bonificaci\xF3n para F\xE1cil",
EASY_BONUS_DESC: "La bonificaci\xF3n para F\xE1cil te permite establecer la diferencia entre intervalos al responder Bien y F\xE1cil en las tarjetas o notas (m\xEDnimo = 100%).",
EASY_BONUS_MIN_WARNING: "El bono de facilidad debe ser al menos 100.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Intervalo m\xE1ximo en d\xEDas",
MAX_INTERVAL_DESC: "Te permite establecer un l\xEDmite mayor en el intervalo (por defecto es de 100 a\xF1os).",
MAX_INTERVAL_MIN_WARNING: "El intervalo m\xE1ximo debe ser de al menos un d\xEDa.",
MAX_LINK_CONTRIB: "Contribuci\xF3n m\xE1xima de las notas vinculadas.",
MAX_LINK_CONTRIB_DESC: "Contribuci\xF3n m\xE1xima de la facilidad ponderada de las notas vinculadas a la facilidad inicial.",
LOGGING: "Registro",
DISPLAY_SCHEDULING_DEBUG_INFO: "\xBFMostrar informaci\xF3n de depuraci\xF3n en la consola de desarrollador",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Cola de notas a revisar",
CLOSE: "Cerrar",
NEW: "Nuevo",
YESTERDAY: "Ayer",
TODAY: "Hoy",
TOMORROW: "Ma\xF1ana",
// stats-modal.tsx
STATS_TITLE: "Estad\xEDsticas",
MONTH: "Mes",
QUARTER: "Trimestre o Cuatrimestre",
// En Inglés: Quarter.
YEAR: "A\xF1o",
LIFETIME: "Tiempo de Vida",
FORECAST: "Pron\xF3stico",
FORECAST_DESC: "El n\xFAmero de tarjetas vencidas en el futuro",
SCHEDULED: "Programado",
DAYS: "D\xEDas",
NUMBER_OF_CARDS: "N\xFAmero de tarjetas",
REVIEWS_PER_DAY: "Carga: ${avg} Revisiones por d\xEDa",
INTERVALS: "Intervalos",
INTERVALS_DESC: "Retrasos hasta que las revisiones se muestren de nuevo",
COUNT: "Conteo",
INTERVALS_SUMMARY: "Intervalo de carga: ${avg}, Intervalo mayor: ${longest}",
EASES: "Facilidad",
EASES_SUMMARY: "Carga de Facilidad: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Tipos de tarjetas",
CARD_TYPES_DESC: "Esto incluye tambi\xE9n a las tarjetas enterradas, si las hay",
CARD_TYPE_NEW: "Nueva",
CARD_TYPE_YOUNG: "Joven",
CARD_TYPE_MATURE: "Madura",
CARD_TYPES_SUMMARY: "Tarjetas Totales: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var es_default = es;
// src/lang/locale/fr.ts
var fr = {
...en_default,
language: "fr",
languageName: "Fran\xE7ais",
// flashcard-modal.tsx
DECKS: "Paquets",
DUE_CARDS: "Cartes dues",
NEW_CARDS: "Nouvelles cartes",
TOTAL_CARDS: "Total de cartes",
BACK: "Pr\xE9c\xE9dent",
SKIP: "Sauter",
EDIT_CARD: "Modifier la carte",
RESET_CARD_PROGRESS: "Remettre \xE0 z\xE9ro le niveau de cette carte",
HARD: "Difficile",
GOOD: "Correct",
EASY: "Facile",
SHOW_ANSWER: "Montrer la r\xE9ponse",
CARD_PROGRESS_RESET: "Le niveau de la carte a \xE9t\xE9 remis \xE0 z\xE9ro.",
SAVE: "Sauvegarder",
CANCEL: "Annuler",
NO_INPUT: "Pas de contenu.",
CURRENT_EASE_HELP_TEXT: "Facilit\xE9 actuelle : ",
CURRENT_INTERVAL_HELP_TEXT: "Intervalle actuel : ",
CARD_GENERATED_FROM: "G\xE9n\xE9r\xE9 depuis : ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Ouvrir une note \xE0 apprendre",
REVIEW_CARDS: "Apprendre les flashcards",
REVIEW_DIFFICULTY_FILE_MENU: "Apprentissage : ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Difficult\xE9 de la r\xE9vision : ${difficulty}",
CRAM_ALL_CARDS: "Choisir un deck \xE0 r\xE9viser",
REVIEW_ALL_CARDS: "Apprendre les flashcards dans toutes les notes",
REVIEW_CARDS_IN_NOTE: "Apprendre les flashcards dans cette note",
CRAM_CARDS_IN_NOTE: "R\xE9viser les flashcards dans cette note",
VIEW_STATS: "Voir les statistiques",
OPEN_REVIEW_QUEUE_VIEW: "Ouvrir la file d'attente des notes \xE0 apprendre dans la barre verticale",
STATUS_BAR: "Apprentissage : ${dueNotesCount} note(s), ${dueFlashcardsCount} carte(s) dues",
SYNC_TIME_TAKEN: "Synchronis\xE9 en ${t}ms",
NOTE_IN_IGNORED_FOLDER: "La note est dans un dossier ignor\xE9 (voir param\xE8tres).",
PLEASE_TAG_NOTE: "Ajoutez le bon tag \xE0 la note pour l'apprendre (dans les param\xE8tres).",
RESPONSE_RECEIVED: "R\xE9ponse enregistr\xE9e.",
NO_DECK_EXISTS: "Pas de paquet sous le nom ${deckName}",
ALL_CAUGHT_UP: "Bravo, vous \xEAtes \xE0 jour !",
// scheduling.ts
DAYS_STR_IVL: "${interval} jour(s)",
MONTHS_STR_IVL: "${interval} mois(s)",
YEARS_STR_IVL: "${interval} an(s)",
DAYS_STR_IVL_MOBILE: "${interval}j",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}a",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Dossiers",
GROUP_FLASHCARD_REVIEW: "Apprentissage des flashcards",
GROUP_FLASHCARD_SEPARATORS: "S\xE9parateurs de flashcards",
GROUP_DATA_STORAGE: "Stockage des informations de planification",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contribuer",
CHECK_WIKI: 'Pour plus d\'informations, visitez le wiki.',
GITHUB_DISCUSSIONS: 'Visitez les discussions pour des questions-r\xE9ponses, des retours ou une discussion g\xE9n\xE9raliste.',
GITHUB_ISSUES: 'Cr\xE9ez un ticket sur GitHub si vous trouvez un bug ou voulez demander une fonctionnalit\xE9.',
GITHUB_SOURCE_CODE: 'Code source du projet disponible sur GitHub',
CODE_CONTRIBUTION_INFO: 'Information sur les contributions au code',
TRANSLATION_CONTRIBUTION_INFO: 'Informations sur la traduction du plugin dans votre langue',
FOLDERS_TO_IGNORE: "Dossiers \xE0 ignorer",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Flashcards",
FLASHCARD_EASY_LABEL: "Bouton Facile",
FLASHCARD_GOOD_LABEL: "Bouton Correct",
FLASHCARD_HARD_LABEL: "Bouton Difficile",
FLASHCARD_EASY_DESC: "Changez le texte du bouton Facile",
FLASHCARD_GOOD_DESC: "Changez le texte du bouton Correct",
FLASHCARD_HARD_DESC: "Changez le texte du bouton Difficile",
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "Tags des flashcards",
FLASHCARD_TAGS_DESC: "Entrez les tags s\xE9par\xE9s par un espace ou une ligne i.e. #flashcards #paquet2 #paquet3.",
CONVERT_FOLDERS_TO_DECKS: "Convertir les dossiers en paquets et sous-paquets ?",
CONVERT_FOLDERS_TO_DECKS_DESC: "Ceci est une alternative aux tags de flashcards pr\xE9sent\xE9s ci-dessus.",
INLINE_SCHEDULING_COMMENTS: "Sauvegarder le commentaire de planification dans la derni\xE8re ligne de la flashcard ?",
INLINE_SCHEDULING_COMMENTS_DESC: "Activer ceci emp\xEAche les commentaires HTML de casser la mise en page des listes.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Enterrer les cartes s\u0153urs jusqu'au lendemain ?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Les cartes s\u0153urs sont les cartes g\xE9n\xE9r\xE9es depuis le m\xEAme texte, par exemple pour les textes \xE0 trous",
SHOW_CARD_CONTEXT: "Montrer le contexte dans les cartes ?",
SHOW_CARD_CONTEXT_DESC: "ex. Titre de la note > Titre 1 > Sous-titre > ... > Sous-titre",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "Pourcentage de hauteur de la flashcard",
CARD_MODAL_SIZE_PERCENT_DESC: "Devrait \xEAtre 100% sur mobile ou en cas de grandes images",
RESET_DEFAULT: "R\xE9initialiser les param\xE8tres",
CARD_MODAL_WIDTH_PERCENT: "Pourcentage de largeur de la flashcard",
RANDOMIZE_CARD_ORDER: "Apprendre les cartes dans un ordre al\xE9atoire ?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Ordre d'affichage des cartes d'un paquet pendant les r\xE9visions",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Dans l'ordre du paquet (Nouvelles cartes d'abord)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Dans l'ordre du paquet (Cartes dues d'abord)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Al\xE9atoirement dans le paquet (Nouvelles cartes d'abord)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Al\xE9atoirement dans le paquet (Cartes dues d'abord)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Carte au hasard dans un paquet au hasard",
REVIEW_DECK_ORDER: "Ordre d'affichage des paquets pendant les r\xE9visions",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "S\xE9quentiel (quand toutes les cartes du paquet pr\xE9c\xE9dent sont apprises)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Al\xE9atoire (quand toutes les cartes du paquet pr\xE9c\xE9dent sont apprises)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Carte au hasard dans un paquet au hasard",
DISABLE_CLOZE_CARDS: "D\xE9sactiver les textes \xE0 trous ?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "Convertir ==soulignages== en trous ?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'Ajouter/supprimer le ${defaultPattern} de vos "Cloze Patterns"',
CONVERT_BOLD_TEXT_TO_CLOZES: "Convertir **gras** en trous ?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'Ajouter/supprimer le ${defaultPattern} de vos "Cloze Patterns"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convertir {{crochets}} en trous ?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'Ajouter/supprimer le ${defaultPattern} de vos "Cloze Patterns"',
CLOZE_PATTERNS: "Cloze Patterns",
CLOZE_PATTERNS_DESC: 'Enter cloze patterns separated by newlines. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "S\xE9parateur pour flashcards en une ligne",
FIX_SEPARATORS_MANUALLY_WARNING: "Apr\xE8s avoir chang\xE9 ce r\xE9glage, vous devrez manuellement mettre \xE0 jour toutes vos flashcards.",
INLINE_REVERSED_CARDS_SEPARATOR: "S\xE9parateur pour flashcards invers\xE9es en une ligne",
MULTILINE_CARDS_SEPARATOR: "S\xE9parateur pour flashcards en plusieurs lignes",
MULTILINE_REVERSED_CARDS_SEPARATOR: "S\xE9parateur pour flashcards invers\xE9es en plusieurs lignes",
MULTILINE_CARDS_END_MARKER: "Caract\xE8res de fin de textes \xE0 trous ou de flashcards en plusieurs lignes",
NOTES: "Notes",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Montrer le module d'apprentissage des notes au d\xE9marrage",
TAGS_TO_REVIEW: "Tags \xE0 apprendre",
TAGS_TO_REVIEW_DESC: "Entrez les tags s\xE9par\xE9s par un espace ou une ligne i.e. #review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "Ouvrir une note \xE0 apprendre au hasard",
OPEN_RANDOM_NOTE_DESC: "Si vous d\xE9sactivez cette option, les notes sont tri\xE9es par importance (PageRank).",
AUTO_NEXT_NOTE: "Ouvrir la prochaine note automatiquement apr\xE8s un apprentissage",
MAX_N_DAYS_REVIEW_QUEUE: "Jours maximum affich\xE9s dans la barre de droite",
MIN_ONE_DAY: "Le nombre de jours doit \xEAtre au moins 1.",
VALID_NUMBER_WARNING: "Entrez un nombre valide.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Enable the review options in the file menu (e.g. Review: Easy, Good, Hard)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "If you disable the review options in the file menu, you can review your notes using the plugin commands and, if you defined them, the associated command hotkeys.",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Les dossiers de paquets devraient initialement tous \xEAtre ouverts",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "D\xE9sactivez pour r\xE9duire les paquets dans la m\xEAme carte. Ce r\xE9glage est utile si vous avez des cartes qui appartiennent \xE0 beaucoup de paquets \xE0 la fois.",
ALGORITHM: "Algorithme",
CHECK_ALGORITHM_WIKI: `Pour en savoir plus, lisez l'impl\xE9mentation de l'algorithme.`,
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Facilit\xE9 de base",
BASE_EASE_DESC: "minimum = 130, recommand\xE9 = vers 250.",
BASE_EASE_MIN_WARNING: "La facilit\xE9 de base doit \xEAtre sup\xE9rieure \xE0 130.",
LAPSE_INTERVAL_CHANGE: "Changement d'intervalle quand vous indiquez qu'une flashcard/note a \xE9t\xE9 difficile",
LAPSE_INTERVAL_CHANGE_DESC: "nouvelIntervalle = ancienIntervalle * changementIntervalle / 100.",
EASY_BONUS: "Bonus Facile",
EASY_BONUS_DESC: "Le bonus Facile vous permet d'augmenter l'intervalle entre une r\xE9ponse Correct et une r\xE9ponse Facile sur une flashcard/note (minimum = 100%).",
EASY_BONUS_MIN_WARNING: "Le bonus Facile doit \xEAtre au moins 100.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Intervalle maximum (en jours)",
MAX_INTERVAL_DESC: "Vous permet de mettre une limite maximale sur l'intervalle (par d\xE9faut, 100 ans).",
MAX_INTERVAL_MIN_WARNING: "L'intervalle maximum doit \xEAtre au moins 1 jour.",
MAX_LINK_CONTRIB: "Contribution maximum des liens",
MAX_LINK_CONTRIB_DESC: "Contribution maximum de la facilit\xE9 pond\xE9r\xE9e des notes li\xE9es \xE0 la facilit\xE9 initiale.",
LOGGING: "Logging",
DISPLAY_SCHEDULING_DEBUG_INFO: "Afficher les informations de d\xE9bogage dans la console de d\xE9veloppement",
DISPLAY_PARSER_DEBUG_INFO: "Afficher les informations de d\xE9bogage pour le parser dans la console de d\xE9veloppement",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Cartes \xE0 apprendre",
CLOSE: "Fermer",
NEW: "Nouveau",
YESTERDAY: "Hier",
TODAY: "Aujourd'hui",
TOMORROW: "Demain",
// stats-modal.tsx
STATS_TITLE: "Statistiques",
MONTH: "Mois",
QUARTER: "Trimestre",
YEAR: "Ann\xE9e",
LIFETIME: "Toujours",
FORECAST: "Pr\xE9visions",
FORECAST_DESC: "Le nombre de cartes dues dans le futur",
SCHEDULED: "Planifi\xE9",
DAYS: "Jours",
NUMBER_OF_CARDS: "Nombre de cartes",
REVIEWS_PER_DAY: "Moyenne : ${avg} apprentissages / jour",
INTERVALS: "Intervalles",
INTERVALS_DESC: "Dur\xE9e avant de remontrer une carte",
COUNT: "Total",
INTERVALS_SUMMARY: "Intervalle moyen : ${avg}. Intervalle maximum: ${longest}",
EASES: "Facilit\xE9",
EASES_SUMMARY: "Facilit\xE9 moyenne : ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Types de cartes",
CARD_TYPES_DESC: "Ceci inclut les cartes enterr\xE9es, s'il y en a",
CARD_TYPE_NEW: "Nouvelles",
CARD_TYPE_YOUNG: "En cours d'apprentissage",
CARD_TYPE_MATURE: "Matures",
CARD_TYPES_SUMMARY: "Total de cartes : ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var fr_default = fr;
// src/lang/locale/hi.ts
var hi = {
...en_default,
language: "hi",
languageName: "\u0939\u093F\u0928\u094D\u0926\u0940"
};
var hi_default = hi;
// src/lang/locale/id.ts
var id = {
...en_default,
language: "id",
languageName: "Bahasa Indonesia"
};
var id_default = id;
// src/lang/locale/it.ts
var it = {
...en_default,
language: "it",
languageName: "Italiano",
// flashcard-modal.tsx
DECKS: "Mazzi",
DUE_CARDS: "Schede da fare",
NEW_CARDS: "Schede nuove",
TOTAL_CARDS: "Schede totali",
BACK: "Indietro",
SKIP: "Salta",
EDIT_CARD: "Modifica scheda",
RESET_CARD_PROGRESS: "Ripristina i progressi della scheda",
HARD: "Difficile",
GOOD: "Buono",
EASY: "Facile",
SHOW_ANSWER: "Mostra risposta",
CARD_PROGRESS_RESET: "I progressi della scheda sono stati ripristinati",
SAVE: "Salva",
CANCEL: "Cancella",
NO_INPUT: "Non \xE8 stato provvisto alcun input",
CURRENT_EASE_HELP_TEXT: "Difficolt\xE0 attuale: ",
CURRENT_INTERVAL_HELP_TEXT: "Intervallo attuale: ",
CARD_GENERATED_FROM: "Generato da: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Apri una nota per rivisita",
REVIEW_CARDS: "Rivisita schede",
REVIEW_DIFFICULTY_FILE_MENU: "Rivisita: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Revisita note come ${difficulty}",
CRAM_ALL_CARDS: "Seleziona un mazzo da memorizzare",
REVIEW_ALL_CARDS: "Seleziona schede da rivedere",
REVIEW_CARDS_IN_NOTE: "Rivedi schede in questa nota",
CRAM_CARDS_IN_NOTE: "Memorizza schede in questa nota",
VIEW_STATS: "Vedi statistiche",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "Da rivedere: ${dueNotesCount} scheda/e, ${dueFlashcardsCount} schede in ritardo",
SYNC_TIME_TAKEN: "Sincronizzato in ${t}ms",
NOTE_IN_IGNORED_FOLDER: "La nota \xE8 salvata in una cartella ignorata (rivedi le impostazioni).",
PLEASE_TAG_NOTE: "Per favore etichetta la nota appropriatamente per la revisione (nelle impostazioni).",
RESPONSE_RECEIVED: "Risposta ricevuta.",
NO_DECK_EXISTS: "Non esistono mazzi per ${deckName}",
ALL_CAUGHT_UP: "Sei al passo! :D.",
// scheduling.ts
DAYS_STR_IVL: "${interval} giorno/i",
MONTHS_STR_IVL: "${interval} mese/i",
YEARS_STR_IVL: "${interval} anno/i",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}y",
// settings.ts
SETTINGS_HEADER: "Plugin per ripetizione spaziata",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: 'Per maggiori informazioni, rivolgersi alla wiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "Cartelle da ignorare",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Schede",
FLASHCARD_EASY_LABEL: "Testo del bottone facile",
FLASHCARD_GOOD_LABEL: "Testo del bottone buono",
FLASHCARD_HARD_LABEL: "Testo del bottone difficile",
FLASHCARD_EASY_DESC: 'Personalizza il testo per il pulsante "Facile"',
FLASHCARD_GOOD_DESC: 'Personalizza il testo per il pulsante "Buono"',
FLASHCARD_HARD_DESC: 'Personalizza il testo per il pulsante "Difficile"',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "Etichette delle schede",
FLASHCARD_TAGS_DESC: "Inserire etichette separate da spazi o a capi, per esempio #flashcards #deck2 #deck3.",
CONVERT_FOLDERS_TO_DECKS: "Trasformare cartelle in mazzi e sotto-mazzi?",
CONVERT_FOLDERS_TO_DECKS_DESC: "Questa \xE8 un'alternativa all'opzione delle etichette delle schede sopra.",
INLINE_SCHEDULING_COMMENTS: "Salvare il commento per l'orario sulla stessa linea dell'ultimna linea della scheda?",
INLINE_SCHEDULING_COMMENTS_DESC: "Attivando quest'impostazione far\xF2 s\xEC che i commento HTML non rompino la formattazione delle liste.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Sotterrare schede sorelle fino al giorno dopo?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Le schede sorelle sono schede generate dallo stesso testo della scheda, per esempio i.e. cloze deletions",
SHOW_CARD_CONTEXT: "Mostrare contesto nelle schede?",
SHOW_CARD_CONTEXT_DESC: "per esempio, Titolo > Intestazione 1 > Sottotitolo 1 > ... > Sottotitolo",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "Percentuale altezza schede",
CARD_MODAL_SIZE_PERCENT_DESC: "Dovrebbe essere 100% se sei su telefono o se hai immagini molto grandi",
RESET_DEFAULT: "Reimposta alle impostazioni iniziali",
CARD_MODAL_WIDTH_PERCENT: "Percentuale di larghezza delle schede",
RANDOMIZE_CARD_ORDER: "Rendere casuale l'ordine delle schede durante la revisione?",
REVIEW_CARD_ORDER_WITHIN_DECK: "L'ordine in cui le schede saranno visualizzate all'interno del mazzo",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequenzialmente dentro il mazzo (prima schede nuove)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequenzialmente dentro il mazzo (prima schede in ritardo)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "A caso dentro il mazzo (prima schede nuove)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "A caso dentro il mazzo (prima schede in ritardo)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Scheda a caso da mazzo a caso",
REVIEW_DECK_ORDER: "L'ordine in cui i mazzi vengono mostrati durante la revisione",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequenzialmente (quando le schede nel mazzo precedente saranno state riviste)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "A caso (quando le schede nel mazzo precedente saranno state riviste)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Scheda a caso da mazzo a caso",
DISABLE_CLOZE_CARDS: "Disabilita schede con spazi da riempire?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "Convertire ==testo evidenziato== in spazi da riempire?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'Aggiungi/rimuovi ${defaultPattern} dai tuoi "Modelli per spazi da riempire"',
CONVERT_BOLD_TEXT_TO_CLOZES: "Convertire **testo in grassetto** in spazi da riempire",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'Aggiungi/rimuovi ${defaultPattern} dai tuoi "Modelli per spazi da riempire"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convertire {{parentesi graffe}} in spazi da riempire?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'Aggiungi/rimuovi ${defaultPattern} dai tuoi "Modelli per spazi da riempire"',
CLOZE_PATTERNS: "Modelli di spazi da riempire",
CLOZE_PATTERNS_DESC: 'Inserisci i modelli di spazi da riempire separati da a capo. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Separatore per schede sulla stessa riga",
FIX_SEPARATORS_MANUALLY_WARNING: "Si avvisa che dopo aver cambiato questo dovrai manualmente modificare le schede che hai gi\xE0.",
INLINE_REVERSED_CARDS_SEPARATOR: "Separatore per schede all'incontrario sulla stessa riga",
MULTILINE_CARDS_SEPARATOR: "Separatore per schede su pi\xF9 righe",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separatore per schede all'incontrario su pi\xF9 righe",
MULTILINE_CARDS_END_MARKER: "Caratteri che denotano la fine di carte con spazi da riempiere e carte multilinea",
NOTES: "Note",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Abilita il pannello di revisione note all'avvio",
TAGS_TO_REVIEW: "Etichette da rivedere",
TAGS_TO_REVIEW_DESC: "Inserisci le etichette separate da spazi o a capi, tipo #review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "Apri una nota a caso per revisione",
OPEN_RANDOM_NOTE_DESC: "Quando lo disabiliti, le note saranno ordinate per importanza (PageRank).",
AUTO_NEXT_NOTE: "Apri la prossima nota automaticamente dopo la revisione",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Abilita le opzioni di revisione nel menu File (es.: Rivisita: Facile, Buono, Difficile)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Se disabiliti le opzioni di revisione nel menu File, puoi rivedere le tue note utilizzando i comandi del plugin e, se li hai definiti, le scorciatoie da tastiera associate.",
MAX_N_DAYS_REVIEW_QUEUE: "Numero di giorni massimi da visualizzare nel pannello di destra",
MIN_ONE_DAY: "Il numero di giorni deve essere almeno 1.",
VALID_NUMBER_WARNING: "Per favore, mettere un numero valido.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Alberti di mazzi dovrebbero essere inizialmente visualizzate come espansi",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Disabilitami per collassare mazzi annidati nella stessa scheda. Utile se hai schede che appartengono a pi\xF9 mazzi nello stesso file.",
ALGORITHM: "Algoritmo",
CHECK_ALGORITHM_WIKI: "Per maggiori informazioni, visita l'implementazione dell'algoritmo.",
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Difficolt\xE0 base",
BASE_EASE_DESC: "mino = 130, preferibilmente circa 250.",
BASE_EASE_MIN_WARNING: "La difficolt\xE0 base deve essere di almeno 130.",
LAPSE_INTERVAL_CHANGE: "L'intervallo cambier\xE0 segnando una scheda / nota come difficile",
LAPSE_INTERVAL_CHANGE_DESC: "Intervallo nuovo = intervallo vecchio * cambio intervallo / 100.",
EASY_BONUS: "Bonus facilit\xE0",
EASY_BONUS_DESC: "Il bonus facilit\xE0 ti permette di impostare le differenze negli intervalli tra il rispondere Buono e Facile su una scheda o nota (minimo 100%).",
EASY_BONUS_MIN_WARNING: "Il bonus facilit\xE0 deve essere di almeno 100.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Intervallo massimo in giorni",
MAX_INTERVAL_DESC: "Ti permette di mettere un limite massimo all'intervallo (default 100 anni).",
MAX_INTERVAL_MIN_WARNING: "L'intervallo massimo deve essere di almeno 1 giorno.",
MAX_LINK_CONTRIB: "Contributo massimo delle note collegate",
MAX_LINK_CONTRIB_DESC: "Contributo massimo della difficolt\xE0 pasata delle note collegate alla difficolt\xE0 iniziale.",
LOGGING: "Registrando",
DISPLAY_SCHEDULING_DEBUG_INFO: "Visualizza informazione di debug sulla console per sviluppatori",
DISPLAY_PARSER_DEBUG_INFO: "Visualizza informazione di debug riguardanti il parser sulla console per sviluppatori",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Coda di note da rivedere",
CLOSE: "Chiusi",
NEW: "Nuovo/a",
YESTERDAY: "Ieri",
TODAY: "Oggi",
TOMORROW: "Domani",
// stats-modal.tsx
STATS_TITLE: "Statistiche",
MONTH: "Mese",
QUARTER: "Trimestre",
YEAR: "Anno",
LIFETIME: "Per tutta la vita",
FORECAST: "Previsione",
FORECAST_DESC: "Il numero di schede che saranno in ritardo in futuro",
SCHEDULED: "Programmate",
DAYS: "Giorni",
NUMBER_OF_CARDS: "Numero di schede",
REVIEWS_PER_DAY: "Media: ${avg} revisioni/giorno",
INTERVALS: "Intervalli",
INTERVALS_DESC: "Ritardi finch\xE9 le revisioni saranno visualizzate di nuovo",
COUNT: "Conta",
INTERVALS_SUMMARY: "Intervallo medio: ${avg}, Intervallo massimo: ${longest}",
EASES: "Difficolt\xE0",
EASES_SUMMARY: "Difficolt\xE0 media: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Tipi di schede",
CARD_TYPES_DESC: "Include eventuali schede sepolte",
CARD_TYPE_NEW: "Nuove",
CARD_TYPE_YOUNG: "Giovani",
CARD_TYPE_MATURE: "Mature",
CARD_TYPES_SUMMARY: "Schede tottali: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var it_default = it;
// src/lang/locale/ja.ts
var ja = {
...en_default,
language: "ja",
languageName: "\u65E5\u672C\u8A9E",
// flashcard-modal.tsx
DECKS: "\u30C7\u30C3\u30AD",
DUE_CARDS: "\u671F\u65E5\u306E\u30AB\u30FC\u30C9",
NEW_CARDS: "\u65B0\u898F\u306E\u30AB\u30FC\u30C9",
TOTAL_CARDS: "\u30AB\u30FC\u30C9\u5408\u8A08",
BACK: "Back",
SKIP: "Skip",
EDIT_CARD: "Edit Card",
RESET_CARD_PROGRESS: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u3092\u30EA\u30BB\u30C3\u30C8",
HARD: "Hard",
GOOD: "Good",
EASY: "Easy",
SHOW_ANSWER: "\u89E3\u7B54\u3092\u8868\u793A",
CARD_PROGRESS_RESET: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u304C\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F\u3002",
SAVE: "Save",
CANCEL: "Cancel",
NO_INPUT: "No input provided.",
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
CARD_GENERATED_FROM: "Generated from: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u30CE\u30FC\u30C8\u3092\u958B\u304F",
REVIEW_CARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u30EC\u30D3\u30E5\u30FC",
REVIEW_DIFFICULTY_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "\u30CE\u30FC\u30C8\u3092${difficulty}\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
REVIEW_ALL_CARDS: "\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C8\u304B\u3089\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
CRAM_ALL_CARDS: "Select a deck to cram",
REVIEW_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
CRAM_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u8A70\u3081\u8FBC\u307F\u5B66\u7FD2\u3059\u308B",
VIEW_STATS: "\u7D71\u8A08\u3092\u95B2\u89A7\u3059\u308B",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "\u30EC\u30D3\u30E5\u30FC: ${dueNotesCount}\u30CE\u30FC\u30C8, ${dueFlashcardsCount}\u30AB\u30FC\u30C9\u304C\u671F\u65E5",
SYNC_TIME_TAKEN: "\u540C\u671F\u306B${t}ms\u304B\u304B\u308A\u307E\u3057\u305F\u3002",
NOTE_IN_IGNORED_FOLDER: "\u30CE\u30FC\u30C8\u304C\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u306B\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002",
PLEASE_TAG_NOTE: "\u30EC\u30D3\u30E5\u30FC\u3092\u884C\u3046\u306B\u306F\u30CE\u30FC\u30C8\u306B\u5BFE\u3057\u3066\u6B63\u3057\u304F\u30BF\u30B0\u4ED8\u3051\u3057\u3066\u304F\u3060\u3055\u3044(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002",
RESPONSE_RECEIVED: "\u7B54\u3048\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002",
NO_DECK_EXISTS: "${deckName}\u306B\u306F\u30C7\u30C3\u30AD\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002",
ALL_CAUGHT_UP: "\u4ECA\u65E5\u306E\u8AB2\u984C\u3092\u3059\u3079\u3066\u9054\u6210\u3057\u307E\u3057\u305F :D",
// scheduling.ts
DAYS_STR_IVL: "${interval}\u65E5\u5F8C",
MONTHS_STR_IVL: "${interval}\u6708\u5F8C",
YEARS_STR_IVL: "${interval}\u5E74\u5F8C",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}y",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306Fwiki\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9",
FLASHCARD_EASY_LABEL: "Easy Button Text",
FLASHCARD_GOOD_LABEL: "Good Button Text",
FLASHCARD_HARD_LABEL: "Hard Button Text",
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0",
FLASHCARD_TAGS_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#flashcards #deck2 #deck3"',
CONVERT_FOLDERS_TO_DECKS: "\u30D5\u30A9\u30EB\u30C0\u3092\u30C7\u30C3\u30AD\u3068\u30B5\u30D6\u30C7\u30C3\u30AD\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
CONVERT_FOLDERS_TO_DECKS_DESC: "\u3053\u308C\u306F\u4E0A\u8A18\u306E\u30BF\u30B0\u3092\u4F7F\u7528\u3057\u305F\u30C7\u30C3\u30AD\u69CB\u7BC9\u306E\u4EE3\u66FF\u3068\u306A\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3059\u3002",
INLINE_SCHEDULING_COMMENTS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6700\u7D42\u884C\u3068\u540C\u4E00\u306E\u884C\u306B\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u30B3\u30E1\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F",
INLINE_SCHEDULING_COMMENTS_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001HTML\u30B3\u30E1\u30F3\u30C8\u306B\u3088\u3063\u3066Markdown\u306E\u30EA\u30B9\u30C8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u304C\u5D29\u308C\u306A\u304F\u306A\u308A\u307E\u3059\u3002",
BURY_SIBLINGS_TILL_NEXT_DAY: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u307E\u3067\u30B7\u30D6\u30EA\u30F3\u30B0\u3092\u5EF6\u671F\u3057\u307E\u3059\u304B\uFF1F",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u30B7\u30D6\u30EA\u30F3\u30B0\u306F\u540C\u4E00\u306E\u30AB\u30FC\u30C9\u30C6\u30AD\u30B9\u30C8\u304B\u3089\u751F\u6210\u3055\u308C\u305F\u30AB\u30FC\u30C9\u3001\u3064\u307E\u308A\u7A74\u57CB\u3081\u554F\u984C\u306E\u6D3E\u751F\u30AB\u30FC\u30C9\u3067\u3059\u3002",
SHOW_CARD_CONTEXT: "\u30AB\u30FC\u30C9\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F",
SHOW_CARD_CONTEXT_DESC: "\uFF62\u30BF\u30A4\u30C8\u30EB > \u898B\u51FA\u3057 1 > \u526F\u898B\u51FA\u3057 > ... > \u526F\u898B\u51FA\u3057\uFF63\u306E\u8868\u793A\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u6C7A\u3081\u307E\u3059\u3002",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u7E26\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8",
CARD_MODAL_SIZE_PERCENT_DESC: "\u30E2\u30D0\u30A4\u30EB\u7248\u3001\u307E\u305F\u306F\u975E\u5E38\u306B\u5927\u304D\u306A\u30B5\u30A4\u30BA\u306E\u753B\u50CF\u304C\u3042\u308B\u5834\u5408\u306B\u306F100%\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002",
RESET_DEFAULT: "\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u306B\u30EA\u30BB\u30C3\u30C8\u3059\u308B",
CARD_MODAL_WIDTH_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6A2A\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8",
RANDOMIZE_CARD_ORDER: "\u30EC\u30D3\u30E5\u30FC\u4E2D\u306E\u30AB\u30FC\u30C9\u306E\u9806\u756A\u3092\u30E9\u30F3\u30C0\u30E0\u306B\u3057\u307E\u3059\u304B\uFF1F",
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
REVIEW_DECK_ORDER: "Order decks are displayed during review",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
DISABLE_CLOZE_CARDS: "\u7A74\u57CB\u3081\u30AB\u30FC\u30C9\u3092\u7121\u52B9\u5316\u3057\u307E\u3059\u304B\uFF1F",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "==\u30CF\u30A4\u30E9\u30A4\u30C8==\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001\u300C\u7A74\u57CB\u3081\u30D1\u30BF\u30FC\u30F3\u300D\u306B${defaultPattern}\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3059\u3002",
CONVERT_BOLD_TEXT_TO_CLOZES: "**\u30DC\u30FC\u30EB\u30C9\u4F53**\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001\u300C\u7A74\u57CB\u3081\u30D1\u30BF\u30FC\u30F3\u300D\u306B${defaultPattern}\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3059\u3002",
CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{\u4E2D\u62EC\u5F27}}\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001\u300C\u7A74\u57CB\u3081\u30D1\u30BF\u30FC\u30F3\u300D\u306B${defaultPattern}\u304C\u8FFD\u52A0\u3055\u308C\u307E\u3059\u3002",
CLOZE_PATTERNS: "\u7A74\u57CB\u3081\u30D1\u30BF\u30FC\u30F3",
CLOZE_PATTERNS_DESC: '\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u7A74\u57CB\u3081\u30D1\u30BF\u30FC\u30F3\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002 Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
FIX_SEPARATORS_MANUALLY_WARNING: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3059\u308B\u5834\u5408\u306B\u306F\u3001\u4F5C\u6210\u6E08\u307F\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u624B\u52D5\u3067\u7DE8\u96C6\u3057\u76F4\u3059\u5FC5\u8981\u304C\u3042\u308B\u3053\u3068\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
INLINE_REVERSED_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
MULTILINE_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC",
MULTILINE_CARDS_END_MARKER: "\u30AF\u30ED\u30FC\u30BA\u3068\u8907\u6570\u884C\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u7D42\u308F\u308A\u3092\u793A\u3059\u6587\u5B57",
NOTES: "\u30CE\u30FC\u30C8",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
TAGS_TO_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0",
TAGS_TO_REVIEW_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#review #tag2 #tag3"',
OPEN_RANDOM_NOTE: "\u30E9\u30F3\u30C0\u30E0\u306B\u30CE\u30FC\u30C8\u3092\u958B\u3044\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B",
OPEN_RANDOM_NOTE_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u308B\u72B6\u614B\u3067\u306F\u3001\u30CE\u30FC\u30C8\u306F\u91CD\u8981\u5EA6(\u30DA\u30FC\u30B8\u30E9\u30F3\u30AF)\u306B\u3088\u308B\u9806\u756A\u3067\u8868\u793A\u3055\u308C\u307E\u3059\u3002",
AUTO_NEXT_NOTE: "\u30EC\u30D3\u30E5\u30FC\u5F8C\u306B\u6B21\u306E\u30CE\u30FC\u30C8\u3092\u81EA\u52D5\u7684\u306B\u958B\u304F",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "\u30D5\u30A1\u30A4\u30EB\u30E1\u30CB\u30E5\u30FC\u3067\u30EC\u30D3\u30E5\u30FC\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u4F8B: Easy, Good, Hard\uFF09",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u30D5\u30A1\u30A4\u30EB\u30E1\u30CB\u30E5\u30FC\u3067\u30EC\u30D3\u30E5\u30FC\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3057\u305F\u5834\u5408\u3001\u30D7\u30E9\u30B0\u30A4\u30F3\u30B3\u30DE\u30F3\u30C9\u3084\u3001\u8A2D\u5B9A\u3057\u3066\u3044\u308B\u5834\u5408\u306F\u5BFE\u5FDC\u3059\u308B\u30DB\u30C3\u30C8\u30AD\u30FC\u3092\u4F7F\u7528\u3057\u3066\u30E1\u30E2\u3092\u30EC\u30D3\u30E5\u30FC\u3067\u304D\u307E\u3059\u3002",
MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u30D1\u30CD\u30EB\u306B\u8868\u793A\u3059\u308B\u6700\u5927\u306E\u65E5\u6570",
MIN_ONE_DAY: "\u65E5\u6570\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
VALID_NUMBER_WARNING: "\u6709\u52B9\u306A\u6570\u5B57\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u30C7\u30C3\u30AD \u30C4\u30EA\u30FC\u306F\u6700\u521D\u306F\u5C55\u958B\u3057\u3066\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u3053\u308C\u3092\u30AA\u30D5\u306B\u3059\u308B\u3068\u3001\u540C\u3058\u30AB\u30FC\u30C9\u5185\u306E\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30C7\u30C3\u30AD\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u307E\u3059\u3002\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u306B\u591A\u304F\u306E\u30C7\u30C3\u30AD\u306B\u5C5E\u3059\u308B\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u4FBF\u5229\u3067\u3059\u3002",
ALGORITHM: "\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0",
CHECK_ALGORITHM_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u5B9F\u88C5\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055",
BASE_EASE_DESC: "\u6700\u5C0F\u5024\u306F130\u3067\u3059\u304C\u3001 \u9069\u6B63\u5024\u306F\u304A\u304A\u3088\u305D250\u3067\u3059\u3002",
BASE_EASE_MIN_WARNING: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055\u306B\u306F130\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
LAPSE_INTERVAL_CHANGE: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3057\u305F\u969B\u306E\u9593\u9694\u5909\u66F4",
LAPSE_INTERVAL_CHANGE_DESC: '"\u65B0\u3057\u3044\u9593\u9694 = \u4EE5\u524D\u306E\u9593\u9694 * \u9593\u9694\u5909\u66F4 / 100" \u3068\u3057\u3066\u8A08\u7B97\u3055\u308C\u307E\u3059\u3002',
EASY_BONUS: "Easy\u30DC\u30FC\u30CA\u30B9",
EASY_BONUS_DESC: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u3088\u3063\u3066\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u306B\u304A\u3051\u308B\u9593\u9694\u306E\u5DEE\u5206\u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059(\u6700\u5C0F\u5024 = 100%)\u3002",
EASY_BONUS_MIN_WARNING: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u306F100\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Maximum interval in days",
MAX_INTERVAL_DESC: "\u9593\u9694\u306B\u4E0A\u9650\u5024\u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8\u5024 = 100\u5E74)\u3002",
MAX_INTERVAL_MIN_WARNING: "\u9593\u9694\u306E\u6700\u5927\u5024\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
MAX_LINK_CONTRIB: "\u30EA\u30F3\u30AF\u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u306E\u6700\u5927\u5024",
MAX_LINK_CONTRIB_DESC: "\u6700\u521D\u306E\u6613\u3057\u3055\u306B\u5BFE\u3057\u3066\u3001\u30EA\u30F3\u30AF\u3055\u308C\u305F\u30CE\u30FC\u30C8\u306E\u91CD\u307F\u4ED8\u3051\u3055\u308C\u305F\u6613\u3057\u3055\u304C\u5BC4\u4E0E\u3059\u308B\u6700\u5927\u5024\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
LOGGING: "\u30ED\u30B0\u7BA1\u7406",
DISPLAY_SCHEDULING_DEBUG_INFO: "\u30C7\u30D9\u30ED\u30C3\u30D1\u30FC\u30B3\u30F3\u30BD\u30FC\u30EB\u306B\u3066\u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u307E\u3059\u304B",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "\u30CE\u30FC\u30C8\u30EC\u30D3\u30E5\u30FC\u306E\u30AD\u30E5\u30FC",
CLOSE: "\u9589\u3058\u308B",
NEW: "\u65B0\u898F",
YESTERDAY: "\u6628\u65E5",
TODAY: "\u4ECA\u65E5",
TOMORROW: "\u660E\u65E5",
// stats-modal.tsx
STATS_TITLE: "\u7D71\u8A08",
MONTH: "Month",
QUARTER: "Quarter",
YEAR: "Year",
LIFETIME: "Lifetime",
FORECAST: "\u4E88\u6E2C",
FORECAST_DESC: "\u5FA9\u7FD2\u671F\u65E5\u304C\u6765\u308B\u30AB\u30FC\u30C9\u306E\u679A\u6570",
SCHEDULED: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u6E08\u307F",
DAYS: "\u65E5",
NUMBER_OF_CARDS: "\u30AB\u30FC\u30C9\u6570",
REVIEWS_PER_DAY: "\u5E73\u5747: ${avg}\u30EC\u30D3\u30E5\u30FC/\u65E5",
INTERVALS: "\u9593\u9694",
INTERVALS_DESC: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u4E88\u5B9A\u65E5",
COUNT: "\u30AB\u30A6\u30F3\u30C8",
INTERVALS_SUMMARY: "\u9593\u9694\u306E\u5E73\u5747\u5024: ${avg}, \u6700\u9577\u306E\u9593\u9694: ${longest}",
EASES: "\u6613\u3057\u3055",
EASES_SUMMARY: "\u6613\u3057\u3055\u306E\u5E73\u5747\u5024: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "\u30AB\u30FC\u30C9\u30BF\u30A4\u30D7",
CARD_TYPES_DESC: "\u5EF6\u671F\u306E\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u306F\u3053\u308C\u306B\u542B\u307E\u308C\u307E\u3059",
CARD_TYPE_NEW: "\u65B0\u898F",
CARD_TYPE_YOUNG: "\u5FA9\u7FD2(\u521D\u671F)",
CARD_TYPE_MATURE: "\u5FA9\u7FD2(\u5F8C\u671F)",
CARD_TYPES_SUMMARY: "\u30AB\u30FC\u30C9\u306E\u5408\u8A08: ${totalCardsCount}\u679A",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var ja_default = ja;
// src/lang/locale/ko.ts
var ko = {
...en_default,
language: "ko",
languageName: "\uD55C\uAD6D\uC5B4",
// flashcard-modal.tsx
DECKS: "\uB371",
DUE_CARDS: "\uB2E4\uC2DC \uBCFC \uCE74\uB4DC\uB4E4",
NEW_CARDS: "\uC0C8\uB85C\uC6B4 \uCE74\uB4DC\uB4E4",
TOTAL_CARDS: "\uC804\uCCB4 \uCE74\uB4DC\uB4E4",
BACK: "Back",
SKIP: "Skip",
EDIT_CARD: "Edit Card",
RESET_CARD_PROGRESS: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.",
HARD: "\uC5B4\uB824\uC6C0(Hard)",
GOOD: "\uC88B\uC74C(Good)",
EASY: "\uC26C\uC6C0(Easy)",
SHOW_ANSWER: "\uC815\uB2F5 \uD655\uC778\uD558\uAE30",
CARD_PROGRESS_RESET: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
SAVE: "Save",
CANCEL: "Cancel",
NO_INPUT: "No input provided.",
CURRENT_EASE_HELP_TEXT: "Current Ease: ",
CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ",
CARD_GENERATED_FROM: "Generated from: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uC5F4\uAE30",
REVIEW_CARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB9AC\uBDF0",
REVIEW_DIFFICULTY_FILE_MENU: "\uB9AC\uBDF0: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "\uB178\uD2B8\uB97C ${difficulty}\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
REVIEW_ALL_CARDS: "\uBAA8\uB4E0 \uB178\uD2B8\uB4E4\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
CRAM_ALL_CARDS: "Select a deck to cram",
REVIEW_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4",
CRAM_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uBCBC\uB77D\uCE58\uAE30\uD569\uB2C8\uB2E4.",
VIEW_STATS: "\uD1B5\uACC4 \uD655\uC778",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "--\uB9AC\uBDF0: ${dueNotesCount} \uB178\uD2B8, ${dueFlashcardsCount} \uCE74\uB4DC \uB0A8\uC558\uC2B5\uB2C8\uB2E4.",
SYNC_TIME_TAKEN: "\uB3D9\uAE30\uD654\uC5D0 ${t}\uBC00\uB9AC\uCD08 \uAC78\uB838\uC2B5\uB2C8\uB2E4",
NOTE_IN_IGNORED_FOLDER: "\uB178\uD2B8\uAC00 \uBB34\uC2DC\uB41C \uD3F4\uB354 \uC544\uB798\uC5D0 \uC800\uC7A5\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)",
PLEASE_TAG_NOTE: "\uB9AC\uBDF0\uB97C \uD558\uAE30\uC704\uD574 \uB178\uD2B8\uC5D0 \uC801\uC808\uD788 \uD0DC\uADF8\uD574\uC8FC\uC138\uC694. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)",
RESPONSE_RECEIVED: "\uC694\uCCAD\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
NO_DECK_EXISTS: "${deckName}\uC774\uB77C\uB294 \uC774\uB984\uC758 \uB371\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
ALL_CAUGHT_UP: "\uBAA8\uB450 \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4. :D",
// scheduling.ts
DAYS_STR_IVL: "${interval} \uC77C \uD6C4",
MONTHS_STR_IVL: "${interval} \uAC1C\uC6D4 \uD6C4",
YEARS_STR_IVL: "${interval} \uB144 \uD6C4",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}y",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, wiki\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "\uBB34\uC2DC\uD560 \uD3F4\uB354\uB4E4",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC",
FLASHCARD_EASY_LABEL: "Easy Button Text",
FLASHCARD_GOOD_LABEL: "Good Button Text",
FLASHCARD_HARD_LABEL: "Hard Button Text",
FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button',
FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button',
FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8",
FLASHCARD_TAGS_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#flashcards #deck2 #deck3'",
CONVERT_FOLDERS_TO_DECKS: "\uD3F4\uB354\uB97C \uB371\uACFC \uC11C\uBE0C\uB371\uC73C\uB85C \uC0AC\uC6A9\uD560\uAE4C\uC694?",
CONVERT_FOLDERS_TO_DECKS_DESC: "\uC774 \uAE30\uB2A5\uC740 \uC704\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8 \uC635\uC158\uC744 \uB300\uCCB4\uD569\uB2C8\uB2E4.",
INLINE_SCHEDULING_COMMENTS: "\uD50C\uB798\uC2DC\uCE74\uB4DC\uC758 \uB9C8\uC9C0\uB9C9 \uC904\uACFC \uB3D9\uC77C\uD55C \uC904\uC5D0 \uC2A4\uCF00\uC904\uB9C1 \uCF54\uBA58\uD2B8\uB97C \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
INLINE_SCHEDULING_COMMENTS_DESC: "\uC774 \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 HTML \uC8FC\uC11D\uC774 \uBAA9\uB85D\uC758 \uD3EC\uB9E4\uD305\uC744 \uBB34\uB108\uD2B8\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Sibling \uCE74\uB4DC\uB97C \uB2E4\uC74C\uB0A0\uAE4C\uC9C0 \uBB3B\uC5B4\uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Sibling \uCE74\uB4DC\uB294 \uB3D9\uC77C\uD55C \uCE74\uB4DC \uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC0DD\uC131\uB41C \uCE74\uB4DC\uC785\uB2C8\uB2E4. i.e. cloze deletions",
SHOW_CARD_CONTEXT: "\uCE74\uB4DC\uC758 \uBB38\uB9E5(context)\uC744 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
SHOW_CARD_CONTEXT_DESC: "\uCE74\uB4DC\uC5D0\uC11C 'Title > Heading 1 > Subheading > ... > Subheading' \uC758 \uD45C\uC2DC\uB97C \uD560\uC9C0 \uC124\uC815\uD569\uB2C8\uB2E4.",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB192\uC774 \uBE44\uC728",
CARD_MODAL_SIZE_PERCENT_DESC: "\uBAA8\uBC14\uC77C \uBC84\uC804 \uD639\uC740 \uB9E4\uC6B0 \uD070 \uC774\uBBF8\uC9C0\uAC00 \uC788\uB294 \uACBD\uC6B0 100%\uB85C \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.",
RESET_DEFAULT: "\uAE30\uBCF8\uAC12\uC73C\uB85C \uCD08\uAE30\uD654",
CARD_MODAL_WIDTH_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB108\uBE44 \uBE44\uC728",
RANDOMIZE_CARD_ORDER: "\uB9AC\uBDF0\uC911\uC778 \uCE74\uB4DC\uC758 \uC21C\uC11C\uB97C \uB79C\uB364\uC73C\uB85C \uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
REVIEW_DECK_ORDER: "Order decks are displayed during review",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
DISABLE_CLOZE_CARDS: "\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uCE74\uB4DC\uB97C \uBE44\uD65C\uC131\uD654\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "==highlights== \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: '"\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uD328\uD134" \uC5D0\uC11C ${defaultPattern} \uB97C \uCD94\uAC00/\uC81C\uAC70\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?',
CONVERT_BOLD_TEXT_TO_CLOZES: "**bolded text** \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: '"\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uD328\uD134" \uC5D0\uC11C ${defaultPattern} \uB97C \uCD94\uAC00/\uC81C\uAC70\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{curly brackets}} \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: '"\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uD328\uD134" \uC5D0\uC11C ${defaultPattern} \uB97C \uCD94\uAC00/\uC81C\uAC70\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?',
CLOZE_PATTERNS: "\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uD328\uD134",
CLOZE_PATTERNS_DESC: '\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uD328\uD134\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC904\uBC14\uAFC8\uC73C\uB85C \uAD6C\uBD84\uD569\uB2C8\uB2E4. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
FIX_SEPARATORS_MANUALLY_WARNING: "\uC8FC\uC758: \uC774 \uC635\uC158\uC744 \uC218\uC815\uD55C \uD6C4\uC5D0\uB294 \uC774\uBBF8 \uC791\uC131\uB41C \uD50C\uB798\uC2DC\uCE74\uB4DC\uB97C \uC218\uB3D9\uC73C\uB85C \uC218\uC815\uD574\uC57C \uD568\uC744 \uC8FC\uC758\uD558\uC2ED\uC2DC\uC624.",
INLINE_REVERSED_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
MULTILINE_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790",
MULTILINE_CARDS_END_MARKER: "\uD074\uB85C\uC988\uC640 \uB2E4\uC911 \uD589 \uD50C\uB798\uC2DC\uCE74\uB4DC\uC758 \uB05D\uC744 \uB098\uD0C0\uB0B4\uB294 \uBB38\uC790",
NOTES: "\uB178\uD2B8",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup",
TAGS_TO_REVIEW: "\uB9AC\uBDF0\uC5D0 \uC0AC\uC6A9\uD560 \uD0DC\uADF8",
TAGS_TO_REVIEW_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#review #tag2 #tag3'",
OPEN_RANDOM_NOTE: "\uB9AC\uBDF0\uB97C \uC704\uD574 \uB79C\uB364 \uB178\uD2B8\uB97C \uC5FD\uB2C8\uB2E4.",
OPEN_RANDOM_NOTE_DESC: "\uC774 \uC635\uC158\uC774 \uAEBC\uC838\uC788\uC73C\uBA74, \uB178\uD2B8\uB294 \uC911\uC694\uB3C4(\uD398\uC774\uC9C0 \uB7AD\uD06C)\uC5D0 \uB530\uB77C \uC815\uB82C\uB429\uB2C8\uB2E4.",
AUTO_NEXT_NOTE: "\uB9AC\uBDF0 \uD6C4\uC5D0 \uB2E4\uC74C \uB178\uD2B8\uB97C \uC790\uB3D9\uC73C\uB85C \uC5FD\uB2C8\uB2E4.",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "\uD30C\uC77C \uBA54\uB274\uC5D0\uC11C \uAC80\uD1A0 \uC635\uC158\uC744 \uD65C\uC131\uD654\uD558\uC138\uC694 (\uC608: \uAC80\uD1A0: \uC26C\uC6C0, \uC88B\uC74C, \uC5B4\uB824\uC6C0)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\uD30C\uC77C \uBA54\uB274\uC5D0\uC11C \uAC80\uD1A0 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654\uD558\uBA74 \uD50C\uB7EC\uADF8\uC778 \uBA85\uB839\uC744 \uC0AC\uC6A9\uD574 \uB178\uD2B8\uB97C \uAC80\uD1A0\uD560 \uC218 \uC788\uC73C\uBA70, \uC815\uC758\uB41C \uACBD\uC6B0\uC5D0\uB294 \uAD00\uB828\uB41C \uB2E8\uCD95\uD0A4\uB3C4 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
MAX_N_DAYS_REVIEW_QUEUE: "\uC624\uB978\uCABD \uD328\uB110\uC5D0 \uD45C\uC2DC\uD560 \uCD5C\uB300 \uC77C\uC218",
MIN_ONE_DAY: "\uC801\uC5B4\uB3C4 1\uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
VALID_NUMBER_WARNING: "\uC720\uD6A8\uD55C \uC22B\uC790\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\uB371 \uD2B8\uB9AC\uB294 \uCC98\uC74C\uC5D0 \uD655\uC7A5\uB41C \uAC83\uC73C\uB85C \uD45C\uC2DC\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\uAC19\uC740 \uCE74\uB4DC\uC5D0 \uC911\uCCA9\uB41C \uB371\uC744 \uC811\uC73C\uB824\uBA74 \uC774 \uC635\uC158\uC744 \uB044\uC2ED\uC2DC\uC624. \uAC19\uC740 \uD30C\uC77C\uC5D0 \uC5EC\uB7EC \uB371\uC5D0 \uC18D\uD55C \uCE74\uB4DC\uAC00 \uC788\uB294 \uACBD\uC6B0 \uC720\uC6A9\uD569\uB2C8\uB2E4.",
ALGORITHM: "\uC54C\uACE0\uB9AC\uC998",
CHECK_ALGORITHM_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, algorithm details\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "\uAE30\uBCF8 ease",
BASE_EASE_DESC: "\uCD5C\uC19F\uAC12 = 130, \uC801\uC815\uCE58\uB294 \uB300\uB7B5 250\uC785\uB2C8\uB2E4.",
BASE_EASE_MIN_WARNING: "\uAE30\uBCF8 ease\uB294 \uC801\uC5B4\uB3C4 130 \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
LAPSE_INTERVAL_CHANGE: "\uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(Hard)\uC73C\uB85C \uB9AC\uBDF0\uD588\uC744 \uB54C\uC758 \uAC04\uACA9 \uBCC0\uACBD",
LAPSE_INTERVAL_CHANGE_DESC: "\uC0C8\uB85C\uC6B4 \uAC04\uACA9 = \uC774\uC804 \uAC04\uACA9 * \uAC04\uACA9\uBCC0\uACBD \uAC12 / 100.",
EASY_BONUS: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4",
EASY_BONUS_DESC: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uC5D0\uC11C \uC88B\uC74C(Good)\uACFC \uC26C\uC6C0(Easy) \uC0AC\uC774\uC758 \uAC04\uACA9 \uCC28\uC774\uB97C \uC124\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uCD5C\uC18C = 100%)",
EASY_BONUS_MIN_WARNING: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uC801\uC5B4\uB3C4 100\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Maximum interval in days",
MAX_INTERVAL_DESC: "\uAC04\uACA9\uC758 \uC0C1\uD55C\uC120\uC744 \uB458 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uAE30\uBCF8\uAC12 = 100\uB144)",
MAX_INTERVAL_MIN_WARNING: "\uCD5C\uB300 \uAC04\uACA9\uC740 \uC801\uC5B4\uB3C4 1\uC77C\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
MAX_LINK_CONTRIB: "\uCD5C\uB300 \uC5F0\uACB0 \uAE30\uC5EC\uB3C4",
MAX_LINK_CONTRIB_DESC: "\uB9C1\uD06C\uB41C \uB178\uD2B8\uC758 \uCD08\uAE30 ease\uC5D0 \uB300\uD55C \uAC00\uC911\uCE58\uAC00 \uC801\uC6A9\uB41C ease\uC758 \uCD5C\uB300 \uAE30\uC5EC\uB3C4\uC785\uB2C8\uB2E4.",
LOGGING: "\uB85C\uAE45",
DISPLAY_SCHEDULING_DEBUG_INFO: "\uB514\uBC84\uAE45 \uC815\uBCF4\uB97C \uAC1C\uBC1C\uC790 \uCF58\uC194\uC5D0 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uB300\uAE30\uC5F4",
CLOSE: "\uB2EB\uAE30",
NEW: "New",
YESTERDAY: "\uC5B4\uC81C",
TODAY: "\uC624\uB298",
TOMORROW: "\uB0B4\uC77C",
// stats-modal.tsx
STATS_TITLE: "\uD1B5\uACC4",
MONTH: "\uC6D4",
QUARTER: "\uBD84\uAE30",
YEAR: "\uB144",
LIFETIME: "\uD3C9\uC0DD",
FORECAST: "\uC608\uCE21",
FORECAST_DESC: "\uC774\uD6C4\uC5D0 \uD559\uC2B5\uD560 \uCE74\uB4DC\uC758 \uC218",
SCHEDULED: "Scheduled",
DAYS: "\uC77C",
NUMBER_OF_CARDS: "\uCE74\uB4DC\uC758 \uC218",
REVIEWS_PER_DAY: "\uD3C9\uADE0: ${avg} \uB9AC\uBDF0/\uC77C",
INTERVALS: "\uAC04\uACA9",
INTERVALS_DESC: "\uB9AC\uBDF0\uB97C \uB2E4\uC2DC \uD560 \uB54C \uAE4C\uC9C0\uC758 \uAE30\uAC04",
COUNT: "Count",
INTERVALS_SUMMARY: "\uD3C9\uADE0 \uAC04\uACA9: ${avg}, \uAC00\uC7A5 \uAE34 \uAC04\uACA9: ${longest}",
EASES: "Eases",
EASES_SUMMARY: "Average ease: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "\uCE74\uB4DC \uD0C0\uC785",
CARD_TYPES_DESC: "\uC5EC\uAE30\uC5D0\uB294 \uBB3B\uC5B4\uB454 \uCE74\uB4DC\uB3C4 \uD3EC\uD568\uB429\uB2C8\uB2E4.",
CARD_TYPE_NEW: "New",
CARD_TYPE_YOUNG: "Young",
CARD_TYPE_MATURE: "Mature",
CARD_TYPES_SUMMARY: "\uC804\uCCB4 \uCE74\uB4DC \uC218: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var ko_default = ko;
// src/lang/locale/mr.ts
var mr = {
...en_default,
language: "mr",
languageName: "Marathi"
};
var mr_default = mr;
// src/lang/locale/nl.ts
var nl = {
...en_default,
language: "nl",
languageName: "Nederlands",
// flashcard-modal.tsx
DECKS: "Stapel",
DUE_CARDS: "Te beoordelen kaarten",
NEW_CARDS: "Nieuwe kaarten",
TOTAL_CARDS: "Totaal aantal kaarten",
BACK: "Terug",
SKIP: "Overslaan",
EDIT_CARD: "Kaart bewerken",
RESET_CARD_PROGRESS: "Voortgang van kaart resetten",
HARD: "Moeilijk",
GOOD: "Goed",
EASY: "Gemakkelijk",
SHOW_ANSWER: "Toon antwoord",
CARD_PROGRESS_RESET: "Voortgang van kaart is gereset.",
SAVE: "Opslaan",
CANCEL: "Annuleren",
NO_INPUT: "Geen invoer opgegeven.",
CURRENT_EASE_HELP_TEXT: "Huidige Moeilijkheid: ",
CURRENT_INTERVAL_HELP_TEXT: "Huidige Interval: ",
CARD_GENERATED_FROM: "Gegenereerd van: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Open een notitie voor beoordeling",
REVIEW_CARDS: "Beoordeel flitskaarten",
REVIEW_DIFFICULTY_FILE_MENU: "Beoordelen: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Beoordeel notitie als ${difficulty}",
CRAM_ALL_CARDS: "Selecteer een stapel om te stampen",
REVIEW_ALL_CARDS: "Beoordeel flitskaarten van alle notities",
REVIEW_CARDS_IN_NOTE: "Beoordeel flitskaarten in deze notitie",
CRAM_CARDS_IN_NOTE: "Stamp flitskaarten in deze notitie",
VIEW_STATS: "Bekijk statistieken",
OPEN_REVIEW_QUEUE_VIEW: "Open notities beoordelingswachtrij in zijbalk",
STATUS_BAR: "Beoordeling: ${dueNotesCount} notitie(s), ${dueFlashcardsCount} kaart(en) te beoordelen",
SYNC_TIME_TAKEN: "Synchronisatie duurde ${t}ms",
NOTE_IN_IGNORED_FOLDER: "Notitie is opgeslagen in een genegeerde map (controleer instellingen).",
PLEASE_TAG_NOTE: "Tag de notitie correct voor beoordeling (in instellingen).",
RESPONSE_RECEIVED: "Reactie ontvangen.",
NO_DECK_EXISTS: "Er bestaat geen stapel voor ${deckName}",
ALL_CAUGHT_UP: "Je bent nu helemaal bij :D.",
// scheduling.ts
DAYS_STR_IVL: "${interval} dag(en)",
MONTHS_STR_IVL: "${interval} maand(en)",
YEARS_STR_IVL: "${interval} jaar",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}j",
// settings.ts
SETTINGS_HEADER: "Gespreide Herhaling",
GROUP_TAGS_FOLDERS: "Tags & Mappen",
GROUP_FLASHCARD_REVIEW: "Flitskaart Beoordeling",
GROUP_FLASHCARD_SEPARATORS: "Flitskaart Scheidingstekens",
GROUP_DATA_STORAGE: "Opslag van planningsgegevens",
GROUP_DATA_STORAGE_DESC: "Kies waar de planningsgegevens worden opgeslagen",
GROUP_FLASHCARDS_NOTES: "Flitskaarten & Notities",
GROUP_CONTRIBUTING: "Bijdragen",
CHECK_WIKI: 'Voor meer informatie, bekijk de wiki.',
GITHUB_DISCUSSIONS: 'Bezoek de discussies sectie voor Q&A hulp, feedback, en algemene discussie.',
GITHUB_ISSUES: 'Meld een probleem hier als je een functieverzoek of een bugrapport hebt.',
GITHUB_SOURCE_CODE: 'De broncode van het project is beschikbaar op GitHub.',
CODE_CONTRIBUTION_INFO: 'Hier lees je hoe je code kunt bijdragen aan de plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Hier lees je hoe je de plugin in een andere taal kunt vertalen.',
FOLDERS_TO_IGNORE: "Mappen om te negeren",
FOLDERS_TO_IGNORE_DESC: "Voer mappaden of globpatronen in op aparte regels, bijvoorbeeld Templates/Scripts of **/*.excalidraw.md. Deze instelling is gemeenschappelijk voor zowel flitskaarten als notities.",
OBSIDIAN_INTEGRATION: "Integratie in Obsidian",
FLASHCARDS: "Flitskaarten",
FLASHCARD_EASY_LABEL: "Gemakkelijk-knoptekst",
FLASHCARD_GOOD_LABEL: "Goed-knoptekst",
FLASHCARD_HARD_LABEL: "Moeilijk-knoptekst",
FLASHCARD_EASY_DESC: 'Pas het label aan voor de "Gemakkelijk" knop',
FLASHCARD_GOOD_DESC: 'Pas het label aan voor de "Goed" knop',
FLASHCARD_HARD_DESC: 'Pas het label aan voor de "Moeilijk" knop',
REVIEW_BUTTON_DELAY: "Vertraging knopindrukken (ms)",
REVIEW_BUTTON_DELAY_DESC: "Voeg een vertraging toe aan de beoordelingsknoppen voordat ze opnieuw kunnen worden ingedrukt.",
FLASHCARD_TAGS: "Flitskaarttags",
FLASHCARD_TAGS_DESC: "Voer tags in, gescheiden door spaties of nieuwe regels, bijvoorbeeld #flitskaarten #stapel2 #stapel3.",
CONVERT_FOLDERS_TO_DECKS: "Converteer mappen naar stapels en substapels",
CONVERT_FOLDERS_TO_DECKS_DESC: "Dit is een alternatief voor de optie flitskaarttags hierboven.",
INLINE_SCHEDULING_COMMENTS: "Planningsopmerking opslaan op dezelfde regel als de laatste regel van de flitskaart?",
INLINE_SCHEDULING_COMMENTS_DESC: "Als u dit inschakelt, wordt de opmaak van de lijst niet verbroken door de HTML-opmerkingen.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Begraaf de broer-/zuskaarten tot de volgende dag",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Broer-/zuskaarten zijn kaarten die zijn gegenereerd uit dezelfde kaarttekst, bijvoorbeeld cloze-deleties",
SHOW_CARD_CONTEXT: "Toon context in kaarten",
SHOW_CARD_CONTEXT_DESC: "Bijv. Titel > Kop 1 > Subkop > ... > Subkop",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Toon volgende herzieningstijd in de beoordelingsknoppen",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Handig om te weten hoe ver in de toekomst je kaarten worden uitgesteld.",
CARD_MODAL_HEIGHT_PERCENT: "Flitskaart hoogtepercentage",
CARD_MODAL_SIZE_PERCENT_DESC: "Moet worden ingesteld op 100% op mobiel of als je zeer grote afbeeldingen hebt",
RESET_DEFAULT: "Reset naar standaard",
CARD_MODAL_WIDTH_PERCENT: "Flitskaart breedtepercentage",
RANDOMIZE_CARD_ORDER: "Flitskaartvolgorde willekeurig tijdens herziening?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Volgorde van kaarten in een stapel tijdens herziening",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Opeenvolgend binnen een stapel (Alle nieuwe kaarten eerst)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Opeenvolgend binnen een stapel (Alle kaarten die aan de beurt zijn eerst)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Willekeurig binnen een stapel (Alle nieuwe kaarten eerst)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Willekeurig binnen een stapel (Alle kaarten die aan de beurt zijn eerst)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Willekeurige kaart uit willekeurige stapel",
REVIEW_DECK_ORDER: "Volgorde waarin stapels worden weergegeven tijdens herziening",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Opeenvolgend (als alle kaarten in de vorige stapel zijn herzien)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Willekeurig (als alle kaarten in de vorige stapel zijn herzien)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Willekeurige kaart uit willekeurige stapel",
DISABLE_CLOZE_CARDS: "Cloze-kaarten uitschakelen?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "Converteer ==highlights== naar clozes",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'Voeg de ${defaultPattern} toe aan/verwijder deze uit uw "Cloze-patronen"',
CONVERT_BOLD_TEXT_TO_CLOZES: "Converteer **vetgedrukte tekst** naar clozes",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'Voeg de ${defaultPattern} toe aan/verwijder deze uit uw "Cloze-patronen"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Converteer {{accolades}} naar clozes",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'Voeg de ${defaultPattern} toe aan/verwijder deze uit uw "Cloze-patronen"',
CLOZE_PATTERNS: "Cloze-patronen",
CLOZE_PATTERNS_DESC: 'Voer cloze-patronen in, gescheiden door nieuwe regels. Raadpleeg de wiki voor meer informatie.',
INLINE_CARDS_SEPARATOR: "Scheidingsteken voor inline flitskaarten",
FIX_SEPARATORS_MANUALLY_WARNING: "Houd er rekening mee dat u na het wijzigen hiervan handmatig alle flitskaarten die u al hebt, moet bewerken.",
INLINE_REVERSED_CARDS_SEPARATOR: "Scheidingsteken voor inline omgekeerde flitskaarten",
MULTILINE_CARDS_SEPARATOR: "Scheidingsteken voor meerregelige flitskaarten",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Scheidingsteken voor meerregelige omgekeerde flitskaarten",
MULTILINE_CARDS_END_MARKER: "Tekens die het einde van clozes en meerregelige flitskaarten aangeven",
NOTES: "Notities",
NOTE: "Notitie",
REVIEW_PANE_ON_STARTUP: "Notitiebeoordelingsvenster inschakelen bij opstarten",
TAGS_TO_REVIEW: "Tags om te beoordelen",
TAGS_TO_REVIEW_DESC: "Voer tags in, gescheiden door spaties of nieuwe regels, bijv. #review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "Open een willekeurige notitie voor beoordeling",
OPEN_RANDOM_NOTE_DESC: "Wanneer u dit uitschakelt, worden notities geordend op belangrijkheid (PageRank).",
AUTO_NEXT_NOTE: "Open automatisch de volgende notitie na een beoordeling",
MAX_N_DAYS_REVIEW_QUEUE: "Maximum aantal dagen om weer te geven in het notitiebeoordelingspaneel",
MIN_ONE_DAY: "Het aantal dagen moet minimaal 1 zijn.",
VALID_NUMBER_WARNING: "Geef een geldig getal op.",
UI: "Gebruikersinterface",
OPEN_IN_TAB: "Open in nieuw tabblad",
OPEN_IN_TAB_DESC: "Schakel dit uit om de plugin in een modaal venster te openen",
SHOW_STATUS_BAR: "Statusbalk weergeven",
SHOW_STATUS_BAR_DESC: "Schakel dit uit om de beoordelingsstatus van de flitskaart te verbergen in de statusbalk van Obsidian",
SHOW_RIBBON_ICON: "Pictogram weergeven in de lintbalk",
SHOW_RIBBON_ICON_DESC: "Schakel dit uit om het pictogram van de plugin in de lintbalk van Obsidian te verbergen",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Schakel de beoordelingsopties in het bestandsmenu in (bijv. Beoordelen: Gemakkelijk, Goed, Moeilijk)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Schakel deze optie uit om uw notities te beoordelen met behulp van de plugin-opdrachten en, indien gedefinieerd, de bijbehorende sneltoetsen voor opdrachten.",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Stapelstructuren: Vouw substapels aanvankelijk uit",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Schakel dit uit om geneste stapels in dezelfde kaart samen te vouwen. Handig als je kaarten hebt die tot meerdere stapels in hetzelfde bestand behoren.",
ALGORITHM: "Algoritme",
CHECK_ALGORITHM_WIKI: 'Voor meer informatie, bekijk de algoritmedetails.',
SM2_OSR_VARIANT: "OSR's variant van SM-2",
BASE_EASE: "Basisgemak",
BASE_EASE_DESC: "minimum = 130, bij voorkeur ongeveer 250.",
BASE_EASE_MIN_WARNING: "Het basisgemak moet minimaal 130 zijn.",
LAPSE_INTERVAL_CHANGE: "Intervalwijziging wanneer u een flitskaart/notitie als moeilijk beoordeelt",
LAPSE_INTERVAL_CHANGE_DESC: "nieuwInterval = oudInterval * intervalWijziging / 100.",
EASY_BONUS: "Gemakkelijk Bonus",
EASY_BONUS_DESC: "De Gemakkelijk Bonus stelt u in staat het verschil in intervallen in te stellen tussen het beantwoorden van Goed en Gemakkelijk op een flitskaart/notitie (minimum = 100%).",
EASY_BONUS_MIN_WARNING: "De Gemakkelijk Bonus moet minimaal 100 zijn.",
LOAD_BALANCE: "Schakel load balancer in",
LOAD_BALANCE_DESC: `Het interval wordt iets aangepast, zodat het aantal beoordelingen per dag consistenter is.
Het is vergelijkbaar met Anki's fuzz, maar in plaats van willekeurig te zijn, kiest het de dag met het minste aantal beoordelingen.
Het is uitgeschakeld voor kleine intervallen.`,
MAX_INTERVAL: "Maximum interval in dagen",
MAX_INTERVAL_DESC: "Hiermee kunt u een bovengrens voor het interval instellen (standaard = 100 jaar).",
MAX_INTERVAL_MIN_WARNING: "Het maximale interval moet minimaal 1 dag zijn.",
MAX_LINK_CONTRIB: "Maximale linkbijdrage",
MAX_LINK_CONTRIB_DESC: "Maximale bijdrage van de gewogen gemak van gekoppelde notities aan het initi\xEBle gemak.",
LOGGING: "Loggen",
DISPLAY_SCHEDULING_DEBUG_INFO: "Toon de foutopsporingsinformatie van de planner op de ontwikkelaarsconsole",
DISPLAY_PARSER_DEBUG_INFO: "Toon de foutopsporingsinformatie van de parser op de ontwikkelaarsconsole",
SCHEDULING: "Plannen",
EXPERIMENTAL: "Experimenteel",
HELP: "Help",
STORE_IN_NOTES: "In de notities",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Notities beoordelingswachtrij",
CLOSE: "Sluiten",
NEW: "Nieuw",
YESTERDAY: "Gisteren",
TODAY: "Vandaag",
TOMORROW: "Morgen",
// stats-modal.tsx
STATS_TITLE: "Statistieken",
MONTH: "Maand",
QUARTER: "Kwartaal",
YEAR: "Jaar",
LIFETIME: "Levensduur",
FORECAST: "Voorspelling",
FORECAST_DESC: "Het aantal kaarten dat in de toekomst aan de beurt is",
SCHEDULED: "Gepland",
DAYS: "Dagen",
NUMBER_OF_CARDS: "Aantal kaarten",
REVIEWS_PER_DAY: "Gemiddeld: ${avg} beoordelingen/dag",
INTERVALS: "Intervallen",
INTERVALS_DESC: "Vertragingen totdat beoordelingen opnieuw worden weergegeven",
COUNT: "Aantal",
INTERVALS_SUMMARY: "Gemiddeld interval: ${avg}, Langste interval: ${longest}",
EASES: "Gemakken",
EASES_SUMMARY: "Gemiddeld gemak: ${avgEase}",
EASE: "Gemak",
CARD_TYPES: "Kaarttypen",
CARD_TYPES_DESC: "Dit omvat ook begraven kaarten, indien aanwezig",
CARD_TYPE_NEW: "Nieuw",
CARD_TYPE_YOUNG: "Jong",
CARD_TYPE_MATURE: "Volwassen",
CARD_TYPES_SUMMARY: "Totaal aantal kaarten: ${totalCardsCount}",
SEARCH: "Zoeken",
PREVIOUS: "Vorige",
NEXT: "Volgende",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var nl_default = nl;
// src/lang/locale/no.ts
var no = {
...en_default,
language: "no",
languageName: "Norsk"
};
var no_default = no;
// src/lang/locale/pl.ts
var pl = {
...en_default,
// flashcard-modal.tsx
language: "pl",
languageName: "Polski",
DECKS: "Talie",
DUE_CARDS: "Fiszki z terminem",
NEW_CARDS: "Nowe fiszki",
TOTAL_CARDS: "Wszystkie karty",
BACK: "Wstecz",
SKIP: "Pomi\u0144",
EDIT_CARD: "Edytuj kart\u0119",
RESET_CARD_PROGRESS: "Zresetuj post\u0119p karty",
HARD: "Trudne",
GOOD: "\u015Arednio Trudne",
EASY: "\u0141atwe",
SHOW_ANSWER: "Poka\u017C odpowied\u017A",
CARD_PROGRESS_RESET: "Post\u0119p karty zosta\u0142 zresetowany.",
SAVE: "Zapisz",
CANCEL: "Anuluj",
NO_INPUT: "Nie wprowadzono warto\u015Bci.",
CURRENT_EASE_HELP_TEXT: "Aktualna \u0142atwo\u015B\u0107: ",
CURRENT_INTERVAL_HELP_TEXT: "Aktualny interwa\u0142: ",
CARD_GENERATED_FROM: "Wygenerowano z: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Otw\xF3rz notatk\u0119 do przegl\u0105du",
REVIEW_CARDS: "Przegl\u0105daj fiszki",
REVIEW_DIFFICULTY_FILE_MENU: "Przegl\u0105daj: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Przegl\u0105daj notatk\u0119 jako ${difficulty}",
CRAM_ALL_CARDS: "Wybierz tali\u0119 do intensywnego uczenia",
REVIEW_ALL_CARDS: "Przegl\u0105daj fiszki ze wszystkich notatek",
REVIEW_CARDS_IN_NOTE: "Przegl\u0105daj fiszki w tej notatce",
CRAM_CARDS_IN_NOTE: "Intensywne uczenie fiszek w tej notatce",
VIEW_STATS: "Wy\u015Bwietl statystyki",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "Przegl\u0105daj: ${dueNotesCount} notatek, ${dueFlashcardsCount} fiszek z terminem",
SYNC_TIME_TAKEN: "Synchronizacja zaj\u0119\u0142a ${t}ms",
NOTE_IN_IGNORED_FOLDER: "Notatka jest zapisana w folderze zignorowanym (sprawd\u017A ustawienia).",
PLEASE_TAG_NOTE: "Prosz\u0119 odpowiednio otagowa\u0107 notatk\u0119 do przegl\u0105du (w ustawieniach).",
RESPONSE_RECEIVED: "Otrzymano odpowied\u017A.",
NO_DECK_EXISTS: "Nie istnieje talia o nazwie ${deckName}",
ALL_CAUGHT_UP: "Jeste\u015B teraz na bie\u017C\u0105co :D.",
// scheduling.ts
DAYS_STR_IVL: "${interval} dni",
MONTHS_STR_IVL: "${interval} miesi\u0119cy",
YEARS_STR_IVL: "${interval} lata",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}r",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: 'Aby uzyska\u0107 wi\u0119cej informacji, sprawd\u017A wiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "Foldery do zignorowania",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Fiszki",
FLASHCARD_EASY_LABEL: "Tekst przycisku \u0141atwe",
FLASHCARD_GOOD_LABEL: "Tekst przycisku \u015Arednio trudne",
FLASHCARD_HARD_LABEL: "Tekst przycisku Trudne",
FLASHCARD_EASY_DESC: 'Dostosuj etykiet\u0119 dla przycisku "\u0141atwe"',
FLASHCARD_GOOD_DESC: 'Dostosuj etykiet\u0119 dla przycisku "\u015Arednio trudne"',
FLASHCARD_HARD_DESC: 'Dostosuj etykiet\u0119 dla przycisku "Trudne"',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "Tagi fiszek",
FLASHCARD_TAGS_DESC: "Wprowad\u017A tagi oddzielone spacj\u0105 lub nowymi liniami, np. #fiszki #talia2 #talia3.",
CONVERT_FOLDERS_TO_DECKS: "Czy konwertowa\u0107 foldery na talie i podtalie?",
CONVERT_FOLDERS_TO_DECKS_DESC: "Jest to alternatywa dla opcji tag\xF3w fiszek powy\u017Cej.",
INLINE_SCHEDULING_COMMENTS: "Czy zachowa\u0107 komentarz harmonogramowania w tej samej linii co ostatnia linia fiszki?",
INLINE_SCHEDULING_COMMENTS_DESC: "W\u0142\u0105czenie tej opcji sprawi, \u017Ce komentarze HTML nie b\u0119d\u0105 przerywa\u0107 formatowania listy.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Czy ukrywa\u0107 karty rodze\u0144stwa do nast\u0119pnego dnia?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Rodze\u0144stwo to karty wygenerowane z tego samego tekstu karty, np. usuni\u0119cia zamaskowane",
SHOW_CARD_CONTEXT: "Czy pokazywa\u0107 kontekst na kartach?",
SHOW_CARD_CONTEXT_DESC: "np. Tytu\u0142 > Nag\u0142\xF3wek 1 > Podnag\u0142\xF3wek > ... > Podnag\u0142\xF3wek",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "Procentowa wysoko\u015B\u0107 fiszki",
CARD_MODAL_SIZE_PERCENT_DESC: "Powinno by\u0107 ustawione na 100% na urz\u0105dzeniach mobilnych lub gdy masz bardzo du\u017Ce obrazy",
RESET_DEFAULT: "Zresetuj do domy\u015Blnych",
CARD_MODAL_WIDTH_PERCENT: "Procentowa szeroko\u015B\u0107 fiszki",
RANDOMIZE_CARD_ORDER: "Czy losowa\u0107 kolejno\u015B\u0107 kart podczas przegl\u0105du?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Kolejno\u015B\u0107 kart w talii wy\u015Bwietlana podczas przegl\u0105dania",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Kolejno w ramach talii (Najpierw wszystkie nowe karty)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Kolejno w ramach talii (Najpierw wszystkie karty z terminem)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Losowo w ramach talii (Najpierw wszystkie nowe karty)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Losowo w ramach talii (Najpierw wszystkie karty z terminem)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Losowa karta z losowej talii",
REVIEW_DECK_ORDER: "Kolejno\u015B\u0107 talii wy\u015Bwietlana podczas przegl\u0105dania",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Kolejno (gdy wszystkie karty w poprzedniej talii przegl\u0105dni\u0119te)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Losowo (gdy wszystkie karty w poprzedniej talii przegl\u0105dni\u0119te)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Losowa karta z losowej talii",
DISABLE_CLOZE_CARDS: "Wy\u0142\u0105czy\u0107 karty zamaskowane?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "Konwertowa\u0107 ==pod\u015Bwietlenia== na karty zamaskowane?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'Dodaj/usu\u0144 ${defaultPattern} z "Wzory kart zamaskowanych"',
CONVERT_BOLD_TEXT_TO_CLOZES: "Konwertowa\u0107 pogrubiony tekst na karty zamaskowane?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'Dodaj/usu\u0144 ${defaultPattern} z "Wzory kart zamaskowanych"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Konwertowa\u0107 {{klamry}} na karty zamaskowane?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'Dodaj/usu\u0144 ${defaultPattern} z "Wzory kart zamaskowanych"',
CLOZE_PATTERNS: "Wzory kart zamaskowanych",
CLOZE_PATTERNS_DESC: 'Wprowad\u017A wzory kart zamaskowanych oddzielone nowymi liniami. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Separator dla kart zamaskowanych w linii",
FIX_SEPARATORS_MANUALLY_WARNING: "Pami\u0119taj, \u017Ce po zmianie tego musisz r\u0119cznie edytowa\u0107 wszystkie karty zamaskowane, kt\xF3re ju\u017C masz.",
INLINE_REVERSED_CARDS_SEPARATOR: "Separator dla kart zamaskowanych odwr\xF3conych w linii",
MULTILINE_CARDS_SEPARATOR: "Separator dla kart zamaskowanych wieloliniowych",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator dla kart zamaskowanych odwr\xF3conych wieloliniowych",
MULTILINE_CARDS_END_MARKER: "Caracteres que denotam o fim de clozes e flashcards multilineares",
NOTES: "Notatki",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "W\u0142\u0105czy\u0107 panel przegl\u0105du notatek przy starcie",
TAGS_TO_REVIEW: "Tagi do przegl\u0105du",
TAGS_TO_REVIEW_DESC: "Wprowad\u017A tagi oddzielone spacj\u0105 lub nowymi liniami, np. #przegl\u0105d #tag2 #tag3.",
OPEN_RANDOM_NOTE: "Otw\xF3rz losow\u0105 notatk\u0119 do przegl\u0105du",
OPEN_RANDOM_NOTE_DESC: "Po wy\u0142\u0105czeniu tej opcji notatki s\u0105 uporz\u0105dkowane wed\u0142ug istotno\u015Bci (PageRank).",
AUTO_NEXT_NOTE: "Automatycznie otwiera\u0107 nast\u0119pn\u0105 notatk\u0119 po przegl\u0105dzie",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Wy\u0142\u0105czy\u0107 opcje przegl\u0105du w menu pliku, tj. Przegl\u0105daj: \u0141atwe Dobrze Trudne",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Je\u015Bli wy\u0142\u0105czysz opcje przegl\u0105du w menu Plik, mo\u017Cesz przegl\u0105da\u0107 swoje notatki za pomoc\u0105 polece\u0144 wtyczki i, je\u015Bli je zdefiniowa\u0142e\u015B, przypisanych skr\xF3t\xF3w klawiszowych.",
MAX_N_DAYS_REVIEW_QUEUE: "Maksymalna liczba dni do wy\u015Bwietlenia w panelu prawym",
MIN_ONE_DAY: "Liczba dni musi wynosi\u0107 co najmniej 1.",
VALID_NUMBER_WARNING: "Podaj prawid\u0142ow\u0105 liczb\u0119.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Podtalie powinny by\u0107 pocz\u0105tkowo wy\u015Bwietlane rozszerzone",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Wy\u0142\u0105cz to, aby zwin\u0105\u0107 zagnie\u017Cd\u017Cone talie w tej samej karcie. Przydatne, je\u015Bli karty nale\u017C\u0105 do wielu talii w tym samym pliku.",
ALGORITHM: "Algorytm",
CHECK_ALGORITHM_WIKI: 'Aby uzyska\u0107 wi\u0119cej informacji, sprawd\u017A implementacj\u0119 algorytmu.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Podstawowa \u0142atwo\u015B\u0107",
BASE_EASE_DESC: "minimum = 130, preferowana warto\u015B\u0107 to oko\u0142o 250.",
BASE_EASE_MIN_WARNING: "Podstawowa \u0142atwo\u015B\u0107 musi wynosi\u0107 co najmniej 130.",
LAPSE_INTERVAL_CHANGE: "Zmiana interwa\u0142u podczas przegl\u0105dania fiszki/notatki jako trudne",
LAPSE_INTERVAL_CHANGE_DESC: "nowyInterwa\u0142 = staryInterwa\u0142 * zmianaInterwa\u0142u / 100.",
EASY_BONUS: "Bonus za \u0142atwe",
EASY_BONUS_DESC: "Bonus za \u0142atwe pozwala ustawi\u0107 r\xF3\u017Cnic\u0119 w interwa\u0142ach mi\u0119dzy odpowiedziami \u015Arednio trudne i \u0141atwe na fiszce/notatce (minimum = 100%).",
EASY_BONUS_MIN_WARNING: "Bonus za \u0142atwe musi wynosi\u0107 co najmniej 100.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Maksymalny interwa\u0142 w dniach",
MAX_INTERVAL_DESC: "Pozwala na ustawienie g\xF3rnego limitu interwa\u0142u (domy\u015Blnie = 100 lat).",
MAX_INTERVAL_MIN_WARNING: "Maksymalny interwa\u0142 musi wynosi\u0107 co najmniej 1 dzie\u0144.",
MAX_LINK_CONTRIB: "Maksymalny wk\u0142ad \u0142\u0105cza",
MAX_LINK_CONTRIB_DESC: "Maksymalny wk\u0142ad wa\u017Conej \u0142atwo\u015Bci po\u0142\u0105czonych notatek do pocz\u0105tkowej \u0142atwo\u015Bci.",
LOGGING: "Logowanie",
DISPLAY_SCHEDULING_DEBUG_INFO: "Wy\u015Bwietl informacje debugowania w konsoli deweloperskiej",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Kolejka przegl\u0105du notatek",
CLOSE: "Zamknij",
NEW: "Nowe",
YESTERDAY: "Wczoraj",
TODAY: "Dzisiaj",
TOMORROW: "Jutro",
// stats-modal.tsx
STATS_TITLE: "Statystyki",
MONTH: "Miesi\u0105c",
QUARTER: "Kwarta\u0142",
YEAR: "Rok",
LIFETIME: "Ca\u0142e \u017Cycie",
FORECAST: "Prognoza",
FORECAST_DESC: "Liczba kart z terminem w przysz\u0142o\u015Bci",
SCHEDULED: "Zaplanowane",
DAYS: "Dni",
NUMBER_OF_CARDS: "Liczba kart",
REVIEWS_PER_DAY: "\u015Arednio: ${avg} przegl\u0105d\xF3w/dzie\u0144",
INTERVALS: "Interwa\u0142y",
INTERVALS_DESC: "Op\xF3\u017Anienia przed ponownym pokazaniem przegl\u0105d\xF3w",
COUNT: "Liczba",
INTERVALS_SUMMARY: "\u015Aredni interwa\u0142: ${avg}, Najd\u0142u\u017Cszy interwa\u0142: ${longest}",
EASES: "\u0141atwo\u015Bci",
EASES_SUMMARY: "\u015Arednia \u0142atwo\u015B\u0107: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Typy kart",
CARD_TYPES_DESC: "Obejmuje tak\u017Ce ukryte karty, je\u015Bli takie s\u0105",
CARD_TYPE_NEW: "Nowe",
CARD_TYPE_YOUNG: "M\u0142ode",
CARD_TYPE_MATURE: "Stare",
CARD_TYPES_SUMMARY: "\u0141\u0105czna liczba kart: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var pl_default = pl;
// src/lang/locale/pt.ts
var pt = {
...en_default,
language: "pt",
languageName: "Portugu\xEAs"
};
var pt_default = pt;
// src/lang/locale/pt-br.ts
var ptBR = {
...en_default,
language: "pt-br",
languageName: "Portugu\xEAs do Brasil",
// flashcard-modal.tsx
DECKS: "Baralhos",
DUE_CARDS: "Cartas para Colocar em Dia",
NEW_CARDS: "Novas Cartas",
TOTAL_CARDS: "Total de Cartas",
BACK: "Voltar",
SKIP: "Pular",
EDIT_CARD: "Editar Cart\xE3o",
RESET_CARD_PROGRESS: "Reiniciar o Progresso da Carta",
HARD: "Dif\xEDcil",
GOOD: "OK",
EASY: "F\xE1cil",
SHOW_ANSWER: "Mostrar Resposta",
CARD_PROGRESS_RESET: "O Progresso da Carta foi reiniciado",
SAVE: "Salvar",
CANCEL: "Cancelar",
NO_INPUT: "Nenhuma entrada fornecida.",
CURRENT_EASE_HELP_TEXT: "Facilidade atual: ",
CURRENT_INTERVAL_HELP_TEXT: "Intervalo atual: ",
CARD_GENERATED_FROM: "Gerada a partir de: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "Abrir uma nota para revisar",
REVIEW_CARDS: "Revisar flashcards",
REVIEW_DIFFICULTY_FILE_MENU: "Revis\xE3o: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Revisar nota como ${difficulty}",
REVIEW_ALL_CARDS: "Revisar flashcards de todas as notas",
CRAM_ALL_CARDS: "Selecione um baralho para revisar",
REVIEW_CARDS_IN_NOTE: "Revisar flashcards nessa nota",
CRAM_CARDS_IN_NOTE: "Revisar todas as flashcards nessa nota",
VIEW_STATS: "Ver estat\xEDsticas",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "Revis\xE3o: ${dueNotesCount} nota(s), ${dueFlashcardsCount} Carta(s) para colocar em dia",
SYNC_TIME_TAKEN: "Sincroniza\xE7\xE3o levou ${t}ms",
NOTE_IN_IGNORED_FOLDER: "Nota \xE9 salva na pasta ignorada (cheque as configura\xE7\xF5es).",
PLEASE_TAG_NOTE: "Por favor etiquete a nota apropriadamente para revisar (nas configura\xE7\xF5es).",
RESPONSE_RECEIVED: "Resposta recebida.",
NO_DECK_EXISTS: "Nenhum baralho existe para ${deckName}",
ALL_CAUGHT_UP: "Voc\xEA colocou tudo em dia agora :D.",
// scheduling.ts
DAYS_STR_IVL: "${interval} dia(s)",
MONTHS_STR_IVL: "${interval} m\xEAs(es)",
YEARS_STR_IVL: "${interval} ano(s)",
DAYS_STR_IVL_MOBILE: "${interval}d",
MONTHS_STR_IVL_MOBILE: "${interval}m",
YEARS_STR_IVL_MOBILE: "${interval}a",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: 'Para mais informa\xE7\xF5es, cheque a wiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "Pastas para ignorar",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Flashcards",
FLASHCARD_EASY_LABEL: "Texto do Bot\xE3o de F\xE1cil",
FLASHCARD_GOOD_LABEL: "Texto do Bot\xE3o de OK",
FLASHCARD_HARD_LABEL: "Texto do Bot\xE3o de Dif\xEDcil",
FLASHCARD_EASY_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "F\xE1cil"',
FLASHCARD_GOOD_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "OK"',
FLASHCARD_HARD_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "Dif\xEDcil"',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "Etiquetas dos Flashcards",
FLASHCARD_TAGS_DESC: "Insira etiquetas separadas por espa\xE7os ou quebras de linha ex: #flashcards #baralho2 #baralho3.",
CONVERT_FOLDERS_TO_DECKS: "Converter pastas para baralhos e sub-baralhos?",
CONVERT_FOLDERS_TO_DECKS_DESC: "Isso \xE9 uma alternativa para a op\xE7\xE3o de etiqueta dos Flashcards em cima.",
INLINE_SCHEDULING_COMMENTS: "Salvar coment\xE1rios de agendamento na mesma linha que a \xFAltima linha do flashcard?",
INLINE_SCHEDULING_COMMENTS_DESC: "Ligar isso vai fazer com que os coment\xE1rios em HTML n\xE3o quebrem a formata\xE7\xE3o de listas.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Enterrar cartas irm\xE3s at\xE9 o pr\xF3ximo dia?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Cartas irm\xE3s s\xE3o geradas pelo texto da mesma carta ex: omiss\xE3o de palavras",
SHOW_CARD_CONTEXT: "Mostrar contexto nas cartas?",
SHOW_CARD_CONTEXT_DESC: "ex: T\xEDtulo > Cabe\xE7alho 1 > Subcabe\xE7alho > ... > Subcabe\xE7alho",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "Porcentagem da Altura do Flashcard",
CARD_MODAL_SIZE_PERCENT_DESC: "Deveria estar configurado em 100% em dispositivos m\xF3veis ou se voc\xEA tem imagens muito grandes",
RESET_DEFAULT: "Reiniciar para a pr\xE9-defini\xE7\xE3o",
CARD_MODAL_WIDTH_PERCENT: "Porcentagem de Largura do Flashcard",
RANDOMIZE_CARD_ORDER: "Aleatorizar a ordem das cartas durante a revis\xE3o?",
REVIEW_CARD_ORDER_WITHIN_DECK: "Order cards in a deck are displayed during review",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "Sequentially within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "Sequentially within a deck (All due cards first)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Randomly within a deck (All new cards first)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Randomly within a deck (All due cards first)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
REVIEW_DECK_ORDER: "Order decks are displayed during review",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "Sequentially (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Randomly (once all cards in previous deck reviewed)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Random card from random deck",
DISABLE_CLOZE_CARDS: "Desabilitar cartas que usam omiss\xE3o de palavras?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "Converter ==marca-texto== em omiss\xF5es?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: 'Adiciona/remove o ${defaultPattern} dos seus "Padr\xF5es de Omiss\xE3o"',
CONVERT_BOLD_TEXT_TO_CLOZES: "Converter **texto em negrito** em omiss\xF5es?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: 'Adiciona/remove o ${defaultPattern} dos seus "Padr\xF5es de Omiss\xE3o"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "Converter {{chaves}} em omiss\xF5es?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: 'Adiciona/remove o ${defaultPattern} dos seus "Padr\xF5es de Omiss\xE3o"',
CLOZE_PATTERNS: "Padr\xF5es de Omiss\xE3o",
CLOZE_PATTERNS_DESC: 'Entre os padr\xF5es de omiss\xE3o separados por quebras de linha. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Separador para flashcards inline",
FIX_SEPARATORS_MANUALLY_WARNING: "Note que depois de mudar isso voc\xEA vai ter que manualmente mudar quaisquer flashcards que voc\xEA tenha.",
INLINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards inline reversos",
MULTILINE_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas",
MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas reversos",
MULTILINE_CARDS_END_MARKER: "Caracteres que denotam o fim de clozes e flashcards multilinha",
NOTES: "Notas",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Habilitar painel de revis\xE3o de notas na inicializa\xE7\xE3o",
TAGS_TO_REVIEW: "Etiquetas para revisar",
TAGS_TO_REVIEW_DESC: "Insira etiquetas separadas por espa\xE7os ou quebra de linhas ex: #revisar #etiqueta2 #etiqueta3.",
OPEN_RANDOM_NOTE: "Abrir uma nota aleat\xF3ria para revisar",
OPEN_RANDOM_NOTE_DESC: "Quando voc\xEA desabilitar isso, as notas v\xE3o ser ordenadas por import\xE2ncia (PageRank).",
AUTO_NEXT_NOTE: "Abrir a pr\xF3xima nota automaticamente depois de uma revis\xE3o",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Ative as op\xE7\xF5es de revis\xE3o no menu Arquivo (ex.: Revis\xE3o: F\xE1cil, OK, Dif\xEDcil)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Se voc\xEA desativar as op\xE7\xF5es de revis\xE3o no menu Arquivo, poder\xE1 revisar suas anota\xE7\xF5es usando os comandos do plugin e, se os tiver definido, as teclas de atalho associadas.",
MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de dias para exibir no painel direito",
MIN_ONE_DAY: "O n\xFAmero de dias deve ser pelo menos 1.",
VALID_NUMBER_WARNING: "Por favor Insira um n\xFAmero v\xE1lido.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\xC1rvores de baralhos devem inicialmente ser exibidas como expandidas",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desabilite isso para colapsar baralhos que est\xE3o um dentro do outro na mesma carta. \xDAtil se voc\xEA tem cartas que pertencem a muitos baralhos em um mesmo arquivo.",
ALGORITHM: "Algor\xEDtmo",
CHECK_ALGORITHM_WIKI: 'Para mais informa\xE7\xF5es, cheque a implementa\xE7\xE3o do algor\xEDtmo.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Facilidade base",
BASE_EASE_DESC: "m\xEDnimo = 130, preferivelmente por volta de 250.",
BASE_EASE_MIN_WARNING: "A facilidade base deve ser pelo menos 130.",
LAPSE_INTERVAL_CHANGE: "Mudan\xE7a de intervalo quando voc\xEA revisa um(a) flashcard/nota como dif\xEDcil",
LAPSE_INTERVAL_CHANGE_DESC: "novoIntervalo = velhoIntervalo * mudancaIntervalo / 100.",
EASY_BONUS: "B\xF4nus de F\xE1cil",
EASY_BONUS_DESC: "O b\xF4nus de f\xE1cil te permite mudar a difer\xEAncia entre intervalos de responder OK e F\xE1cil em um(a) flashcard/nota (m\xEDnimo = 100%).",
EASY_BONUS_MIN_WARNING: "O b\xF4nus de f\xE1cil deve ser pelo menos 100.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Intervalo m\xE1ximo em dias",
MAX_INTERVAL_DESC: "Te permite colocar um limite m\xE1ximo no intervalo (pr\xE9-defini\xE7\xE3o = 100 anos).",
MAX_INTERVAL_MIN_WARNING: "O intervalo m\xE1ximo deve ser pelo menos 1 dia.",
MAX_LINK_CONTRIB: "Contribui\xE7\xE3o M\xE1xima de Links",
MAX_LINK_CONTRIB_DESC: "Contribui\xE7\xE3o m\xE1xima da facilidade ponderada das notas linkadas \xE0 facilidade inicial.",
LOGGING: "Logging",
DISPLAY_SCHEDULING_DEBUG_INFO: "Mostrar informa\xE7\xE3o de debugging no console de desenvolvimento",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar",
CLOSE: "Fechar",
NEW: "Novo",
YESTERDAY: "Ontem",
TODAY: "Hoje",
TOMORROW: "Amanh\xE3",
// stats-modal.tsx
STATS_TITLE: "Estat\xEDsticas",
MONTH: "M\xEAs",
QUARTER: "Trimestre",
YEAR: "Ano",
LIFETIME: "Tempo Total",
FORECAST: "Previs\xE3o",
FORECAST_DESC: "O n\xFAmero de cartas a serem colocadas em dia no futuro",
SCHEDULED: "Agendado",
DAYS: "Dias",
NUMBER_OF_CARDS: "N\xFAmero de cartas",
REVIEWS_PER_DAY: "M\xE9dia: ${avg} revis\xF5es/dia",
INTERVALS: "Intervalos",
INTERVALS_DESC: "Atrasos at\xE9 que as revis\xF5es sejam exibidas de novo",
COUNT: "Contagem",
INTERVALS_SUMMARY: "Intervalo em m\xE9dia: ${avg}, Maior intervalo: ${longest}",
EASES: "Facilidades",
EASES_SUMMARY: "Facilidade em m\xE9dia: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Tipos de Cartas",
CARD_TYPES_DESC: "Isso tamb\xE9m inclui cartas enterradas, caso existam",
CARD_TYPE_NEW: "Novo",
CARD_TYPE_YOUNG: "Jovem",
CARD_TYPE_MATURE: "Amadurecido",
CARD_TYPES_SUMMARY: "Total de cartas: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var pt_br_default = ptBR;
// src/lang/locale/ro.ts
var ro = {
...en_default,
language: "ro",
languageName: "Rom\xE2n\u0103"
};
var ro_default = ro;
// src/lang/locale/ru.ts
var ru = {
...en_default,
language: "ru",
languageName: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439",
// flashcard-modal.tsx
DECKS: "\u041A\u043E\u043B\u043E\u0434\u044B",
DUE_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
NEW_CARDS: "\u041D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
TOTAL_CARDS: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
BACK: "\u041D\u0430\u0437\u0430\u0434",
SKIP: "\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u044C",
EDIT_CARD: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0443",
RESET_CARD_PROGRESS: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
HARD: "\u0421\u043B\u043E\u0436\u043D\u043E",
GOOD: "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E",
EASY: "\u041B\u0435\u0433\u043A\u043E",
SHOW_ANSWER: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u0442\u0432\u0435\u0442",
CARD_PROGRESS_RESET: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
SAVE: "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C",
CANCEL: "\u041E\u0442\u043C\u0435\u043D\u0430",
NO_INPUT: "\u041F\u0443\u0441\u0442\u043E\u0439 \u0432\u0432\u043E\u0434.",
CURRENT_EASE_HELP_TEXT: "\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441: ",
CURRENT_INTERVAL_HELP_TEXT: "\u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B: ",
CARD_GENERATED_FROM: "\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E \u0438\u0437: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F",
REVIEW_CARDS: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
REVIEW_DIFFICULTY_FILE_MENU: "\u0418\u0437\u0443\u0447\u0435\u043D\u0438\u0435: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A ${difficulty}",
CRAM_ALL_CARDS: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u043A\u043E\u043B\u043E\u0434\u0435",
REVIEW_ALL_CARDS: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043E \u0432\u0441\u0435\u0445 \u0437\u0430\u043C\u0435\u0442\u043A\u0430\u0445",
REVIEW_CARDS_IN_NOTE: "\u0418\u0437\u0443\u0447\u0430\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435",
CRAM_CARDS_IN_NOTE: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435",
VIEW_STATS: "\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443",
OPEN_REVIEW_QUEUE_VIEW: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u0447\u0435\u0440\u0435\u0434\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043D\u0430 \u0431\u043E\u043A\u043E\u0432\u043E\u0439 \u043F\u0430\u043D\u0435\u043B\u0438",
STATUS_BAR: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C: ${dueNotesCount} \u0437\u0430\u043C\u0435\u0442\u043E\u043A, ${dueFlashcardsCount} \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
SYNC_TIME_TAKEN: "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0437\u0430\u043D\u044F\u043B\u0430 ${t}\u043C\u0441",
NOTE_IN_IGNORED_FOLDER: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u0432 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u0443\u044E \u043F\u0430\u043F\u043A\u0443 (\u0441\u043C. \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).",
PLEASE_TAG_NOTE: "\u0414\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u043F\u043E\u043C\u0435\u0442\u044C\u0442\u0435 \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0442\u0435\u0433\u043E\u043C (\u0441\u043C. \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).",
RESPONSE_RECEIVED: "\u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0435\u043D.",
NO_DECK_EXISTS: "\u041D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0440\u043E\u0432\u043D\u044F ${deckName}",
ALL_CAUGHT_UP: "\u041C\u043E\u043B\u043E\u0434\u0435\u0446! \u0422\u044B \u0441\u043F\u0440\u0430\u0432\u0438\u043B\u0441\u044F \u0438 \u0434\u043E\u0448\u0435\u043B \u0434\u043E \u043A\u043E\u043D\u0446\u0430! :D",
// scheduling.ts
DAYS_STR_IVL: "${interval} \u0434\u043D\u0435\u0439",
MONTHS_STR_IVL: "${interval} \u043C\u0435\u0441\u044F\u0446\u0435\u0432",
YEARS_STR_IVL: "${interval} \u0433\u043E\u0434\u043E\u0432",
DAYS_STR_IVL_MOBILE: "${interval}\u0434.",
MONTHS_STR_IVL_MOBILE: "${interval}\u043C.",
YEARS_STR_IVL_MOBILE: "${interval}\u0433.",
// settings.ts
SETTINGS_HEADER: "Spaced Repetition",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: '\u0414\u043B\u044F \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043F\u043E\u0441\u0435\u0442\u0438\u0442\u0435: wiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u0430\u043F\u043A\u0438",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
FLASHCARD_EASY_LABEL: '\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 "\u041B\u0435\u0433\u043A\u043E"',
FLASHCARD_GOOD_LABEL: '\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E"',
FLASHCARD_HARD_LABEL: '\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 "\u0421\u043B\u043E\u0436\u043D\u043E"',
FLASHCARD_EASY_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041B\u0435\u0433\u043A\u043E"',
FLASHCARD_GOOD_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E"',
FLASHCARD_HARD_DESC: '\u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u044F\u0440\u043B\u044B\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0421\u043B\u043E\u0436\u043D\u043E"',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "\u0422\u0435\u0433\u0438 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
FLASHCARD_TAGS_DESC: "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0442\u0435\u0433\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 Enter-\u043E\u043C \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: #flashcards #deck2 #deck3.",
CONVERT_FOLDERS_TO_DECKS: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0438 \u0432 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043F\u043E\u0434\u0443\u0440\u043E\u0432\u043D\u0438?",
CONVERT_FOLDERS_TO_DECKS_DESC: "\u042D\u0442\u043E \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u0430 \u043E\u043F\u0438\u0441\u0430\u043D\u043D\u043E\u043C\u0443 \u0432\u044B\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u0443 \u0442\u0435\u0433\u043E\u0432 \u0444\u043B\u044D\u0448-\u043A\u0430\u0440\u0442",
INLINE_SCHEDULING_COMMENTS: "\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438?",
INLINE_SCHEDULING_COMMENTS_DESC: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0439 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u0434\u0435\u043B\u0430\u0435\u0442 \u0442\u0430\u043A, \u0447\u0442\u043E HTML \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043B\u043E\u043C\u0430\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u043F\u0438\u0441\u043A\u0430.",
BURY_SIBLINGS_TILL_NEXT_DAY: "\u041F\u0440\u044F\u0442\u0430\u0442\u044C \u0440\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0434\u043E \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u0434\u043D\u044F?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u0420\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 - \u0442\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u044B \u0438\u0437 \u043E\u0434\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430, \u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438 ([...])",
SHOW_CARD_CONTEXT: "\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 (\u0443\u0440\u043E\u0432\u0435\u043D\u044C) \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430\u0445 (\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F)?",
SHOW_CARD_CONTEXT_DESC: "\u043F\u0440\u0438\u043C\u0435\u0440: Title > Heading 1 > Subheading > ... > Subheading",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "\u0412\u044B\u0441\u043E\u0442\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445",
CARD_MODAL_SIZE_PERCENT_DESC: "\u0415\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435\u0441\u044C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u043E\u043C, \u0432\u044B\u0441\u0442\u0430\u0432\u044C\u0442\u0435 100%. \u0418\u043D\u0430\u0447\u0435 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043E\u0433\u0440\u043E\u043C\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",
RESET_DEFAULT: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E-\u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E",
CARD_MODAL_WIDTH_PERCENT: "\u0428\u0438\u0440\u0438\u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445",
RANDOMIZE_CARD_ORDER: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F?",
REVIEW_CARD_ORDER_WITHIN_DECK: "\u041F\u043E\u0440\u044F\u0434\u043E\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442 \u043A\u043E\u043B\u043E\u0434\u044B \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u043E \u0432\u043D\u0443\u0442\u0440\u0438 \u043A\u043E\u043B\u043E\u0434\u044B (\u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u0432\u0441\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0435 \u043A\u0430\u0440\u0442\u044B)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430 \u0438\u0437 \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u043E\u0439 \u043A\u043E\u043B\u043E\u0434\u044B",
REVIEW_DECK_ORDER: "\u041F\u043E\u0440\u044F\u0434\u043E\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043A\u043E\u043B\u043E\u0434 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E (\u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u0432\u0441\u0435\u0445 \u043A\u0430\u0440\u0442 \u0438\u0437 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u043A\u043E\u043B\u043E\u0434\u044B)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u043E (\u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u0432\u0441\u0435\u0445 \u043A\u0430\u0440\u0442 \u0438\u0437 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u043A\u043E\u043B\u043E\u0434\u044B)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430 \u0438\u0437 \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u043E\u0439 \u043A\u043E\u043B\u043E\u0434\u044B",
DISABLE_CLOZE_CARDS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u044B \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C ==\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442== \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0443\u0434\u0430\u043B\u0438\u0442\u044C ${defaultPattern} \u0432 \u0432\u0430\u0448\u0438 "\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043E\u0432"',
CONVERT_BOLD_TEXT_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C **\u0436\u0438\u0440\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442** \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0443\u0434\u0430\u043B\u0438\u0442\u044C ${defaultPattern} \u0432 \u0432\u0430\u0448\u0438 "\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043E\u0432"',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C {{\u0444\u0438\u0433\u0443\u0440\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438}} \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438 (\u043F\u0440\u0438\u043C\u0435\u0440: [...])?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C/\u0443\u0434\u0430\u043B\u0438\u0442\u044C ${defaultPattern} \u0432 \u0432\u0430\u0448\u0438 "\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043E\u0432"',
CLOZE_PATTERNS: "\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043E\u0432",
CLOZE_PATTERNS_DESC: '\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0448\u0430\u0431\u043B\u043E\u043D\u044B \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u043E\u0432, \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u043F\u0435\u0440\u0435\u0432\u043E\u0434\u0430\u043C\u0438 \u0441\u0442\u0440\u043E\u043A. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
FIX_SEPARATORS_MANUALLY_WARNING: "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u041F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E \u0432\u0430\u043C \u043F\u0440\u0438\u0434\u0451\u0442\u0441\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438",
INLINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
MULTILINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
MULTILINE_CARDS_END_MARKER: "\u0421\u0438\u043C\u0432\u043E\u043B\u044B, \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0449\u0438\u0435 \u043A\u043E\u043D\u0435\u0446 \u043A\u043B\u043E\u0437\u043E\u0432 \u0438 \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
NOTES: "\u0417\u0430\u043C\u0435\u0442\u043A\u0438",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u044B",
TAGS_TO_REVIEW: "\u0422\u0435\u0433\u0438 \u0434\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F",
TAGS_TO_REVIEW_DESC: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u0433\u0438, \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 Enter-\u0430\u043C\u0438 \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u0430\u043C\u0438, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: #review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F",
OPEN_RANDOM_NOTE_DESC: "\u0415\u0441\u043B\u0438 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C, \u0442\u043E \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043E\u0442\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u044B \u043F\u043E \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u0438 (PageRank).",
AUTO_NEXT_NOTE: "\u041F\u043E\u0441\u043B\u0435 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043E\u0431\u0437\u043E\u0440\u0430 \u0432 \u043C\u0435\u043D\u044E \u0424\u0430\u0439\u043B (\u0442.\u0435.: \u0418\u0437\u0443\u0447\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E, \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E, \u0421\u043B\u043E\u0436\u043D\u043E)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u0415\u0441\u043B\u0438 \u0432\u044B \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043E\u0431\u0437\u043E\u0440\u0430 \u0432 \u043C\u0435\u043D\u044E \u0424\u0430\u0439\u043B, \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u0441\u043C\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044C \u0441\u0432\u043E\u0438 \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043E\u043C\u0430\u043D\u0434 \u043F\u043B\u0430\u0433\u0438\u043D\u0430 \u0438, \u0435\u0441\u043B\u0438 \u0432\u044B \u0438\u0445 \u0437\u0430\u0434\u0430\u043B\u0438, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u0433\u043E\u0440\u044F\u0447\u0438\u0445 \u043A\u043B\u0430\u0432\u0438\u0448.",
MAX_N_DAYS_REVIEW_QUEUE: "\u041D\u0430\u0438\u0431\u043E\u043B\u044C\u0448\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0441\u043F\u0440\u0430\u0432\u0430",
MIN_ONE_DAY: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.",
VALID_NUMBER_WARNING: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0435\u0435 \u0447\u0438\u0441\u043B\u043E.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u0414\u0435\u0440\u0435\u0432\u044C\u044F \u043A\u043E\u043B\u043E\u0434 \u0434\u043E\u043B\u0436\u043D\u044B \u0438\u0437\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0435",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440, \u0447\u0442\u043E\u0431\u044B \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043A\u043E\u043B\u043E\u0434\u044B \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435. \u041F\u043E\u043B\u0435\u0437\u043D\u043E, \u0435\u0441\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043A\u0430\u0440\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0440\u0438\u043D\u0430\u0434\u043B\u0435\u0436\u0430\u0442 \u043C\u043D\u043E\u0433\u0438\u043C \u043A\u043E\u043B\u043E\u0434\u0430\u043C \u0432 \u043E\u0434\u043D\u043E\u043C \u0444\u0430\u0439\u043B\u0435.",
ALGORITHM: "\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C",
CHECK_ALGORITHM_WIKI: '\u0417\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044C \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "\u0411\u0430\u0437\u043E\u0432\u0430\u044F \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C",
BASE_EASE_DESC: "\u043C\u0438\u043D\u0438\u043C\u0443\u043C = 130, \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u043A\u043E\u043B\u043E 250.",
BASE_EASE_MIN_WARNING: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043C\u0438\u043D\u0438\u043C\u0443\u043C 130.",
LAPSE_INTERVAL_CHANGE: '\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0430 \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 "\u0421\u043B\u043E\u0436\u043D\u043E" \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438/\u0437\u0430\u043C\u0435\u0442\u043A\u0438',
LAPSE_INTERVAL_CHANGE_DESC: "\u043D\u043E\u0432\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A = \u0441\u0442\u0430\u0440\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A * \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 / 100.",
EASY_BONUS: "\u041B\u0435\u0433\u043A\u043E: \u0431\u043E\u043D\u0443\u0441",
EASY_BONUS_DESC: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u043D\u0438\u0446\u0443 \u0432 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430\u0445 \u043C\u0435\u0436\u0434\u0443 \u043E\u0442\u0432\u0435\u0442\u0430\u043C\u0438 \u0425\u043E\u0440\u043E\u0448\u043E \u0438 \u041B\u0435\u0433\u043A\u043E \u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435/\u0437\u0430\u043C\u0435\u0442\u043A\u0435 (\u043C\u0438\u043D. = 100%).",
EASY_BONUS_MIN_WARNING: '\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 "\u041B\u0435\u0433\u043A\u043E" \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 100.',
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0432 \u0434\u043D\u044F\u0445",
MAX_INTERVAL_DESC: "\u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C \u0432\u0435\u0440\u0445\u043D\u044E\u044E \u0433\u0440\u0430\u043D\u0438\u0446\u0443 \u043D\u0430 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E = 100 \u043B\u0435\u0442).",
MAX_INTERVAL_MIN_WARNING: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.",
MAX_LINK_CONTRIB: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0441\u0432\u044F\u0437\u0438 (\u0441\u0441\u044B\u043B\u043A\u0438)",
MAX_LINK_CONTRIB_DESC: '\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0441\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438" \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u0432 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C".',
LOGGING: "\u0416\u0443\u0440\u043D\u0430\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435",
DISPLAY_SCHEDULING_DEBUG_INFO: "\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043D\u0430 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435",
CLOSE: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C",
NEW: "\u041D\u043E\u0432\u044B\u0435",
YESTERDAY: "\u0412\u0447\u0435\u0440\u0430\u0448\u043D\u0438\u0435",
TODAY: "\u0421\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0435",
TOMORROW: "\u0417\u0430\u0432\u0442\u0440\u0430\u0448\u043D\u0438\u0435",
// stats-modal.tsx
STATS_TITLE: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430",
MONTH: "\u041C\u0435\u0441\u044F\u0446",
QUARTER: "\u041A\u0432\u0430\u0440\u0442\u0430\u043B",
YEAR: "\u0413\u043E\u0434",
LIFETIME: "\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F",
FORECAST: "\u041F\u0440\u043E\u0433\u043D\u043E\u0437",
FORECAST_DESC: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0445 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F",
SCHEDULED: "\u0417\u0430\u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043E",
DAYS: "\u0414\u043D\u0438",
NUMBER_OF_CARDS: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
REVIEWS_PER_DAY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: ${avg} \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0439 \u0432 \u0434\u0435\u043D\u044C",
INTERVALS: "\u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u044B",
INTERVALS_DESC: "\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0434\u043E \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F",
COUNT: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E",
INTERVALS_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${avg}, \u0421\u0430\u043C\u044B\u0439 \u0434\u043B\u0438\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${longest}",
EASES: "\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u044F",
EASES_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441\u0430: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "\u0422\u0438\u043F\u044B \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A",
CARD_TYPES_DESC: "\u0412\u043A\u043B\u044E\u0447\u0430\u044F \u0441\u043F\u0440\u044F\u0442\u0430\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u0442\u0430\u043A\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0442.",
CARD_TYPE_NEW: "\u041D\u043E\u0432\u044B\u0445",
CARD_TYPE_YOUNG: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0435\u043C\u044B\u0445",
CARD_TYPE_MATURE: "\u0418\u0437\u0443\u0447\u0435\u043D\u043D\u044B\u0445",
CARD_TYPES_SUMMARY: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var ru_default = ru;
// src/lang/locale/sw.ts
var sw = {
...en_default,
language: "sw",
languageName: "Kiswahili"
};
var sw_default = sw;
// src/lang/locale/ta.ts
var ta = {
...en_default,
language: "ta",
languageName: "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD"
};
var ta_default = ta;
// src/lang/locale/te.ts
var te = {
...en_default,
language: "te",
languageName: "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41"
};
var te_default = te;
// src/lang/locale/th.ts
var th = {
...en_default,
language: "th",
languageName: "\u0E20\u0E32\u0E29\u0E32\u0E44\u0E17\u0E22"
};
var th_default = th;
// src/lang/locale/tr.ts
var tr = {
...en_default,
language: "tr",
languageName: "T\xFCrk\xE7e",
// flashcard-modal.tsx
DECKS: "Desteler",
DUE_CARDS: "G\xFCncel Kartlar",
NEW_CARDS: "Yeni Kartlar",
TOTAL_CARDS: "Toplam Kartlar",
BACK: "Geri",
SKIP: "Atla",
EDIT_CARD: "Kart\u0131 D\xFCzenle",
RESET_CARD_PROGRESS: "Kart\u0131n ilerlemesini s\u0131f\u0131rla",
HARD: "Zor",
GOOD: "Orta",
EASY: "Kolay",
SHOW_ANSWER: "Cevab\u0131 G\xF6ster",
CARD_PROGRESS_RESET: "Kart\u0131n ilerlemesi s\u0131f\u0131rland\u0131.",
SAVE: "Kaydet",
CANCEL: "\u0130ptal",
NO_INPUT: "Girdi sa\u011Flanmad\u0131.",
CURRENT_EASE_HELP_TEXT: "Mevcut Kolayl\u0131k: ",
CURRENT_INTERVAL_HELP_TEXT: "Mevcut Aral\u0131k: ",
CARD_GENERATED_FROM: "${notePath} kayna\u011F\u0131ndan olu\u015Fturuldu.",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "G\xF6zden ge\xE7irmek i\xE7in bir not a\xE7",
REVIEW_CARDS: "Flash kartlar\u0131 g\xF6zden ge\xE7ir",
REVIEW_DIFFICULTY_FILE_MENU: "G\xF6zden Ge\xE7ir: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "Notu ${difficulty} derecesiyle g\xF6zden ge\xE7ir",
CRAM_ALL_CARDS: "T\xFCm destelerden yo\u011Fun tekrar yap",
REVIEW_ALL_CARDS: "T\xFCm notlardaki flash kartlar\u0131 g\xF6zden ge\xE7ir",
REVIEW_CARDS_IN_NOTE: "Bu nottaki flash kartlar\u0131 g\xF6zden ge\xE7ir",
CRAM_CARDS_IN_NOTE: "Bu nottaki flash kartlar\u0131 yo\u011Fun tekrar yap",
VIEW_STATS: "\u0130statistikleri g\xF6r\xFCnt\xFCle",
OPEN_REVIEW_QUEUE_VIEW: "Kenar \xE7ubu\u011Funda Not G\xF6zden Ge\xE7irme S\u0131ras\u0131n\u0131 a\xE7",
STATUS_BAR: "G\xF6zden Ge\xE7ir: ${dueNotesCount} not, ${dueFlashcardsCount} kart g\xFCncel",
SYNC_TIME_TAKEN: "Senkronizasyon ${t}ms s\xFCrd\xFC",
NOTE_IN_IGNORED_FOLDER: "Not, d\u0131\u015Flanan klas\xF6rde kay\u0131tl\u0131 (ayarlar\u0131 kontrol edin).",
PLEASE_TAG_NOTE: "L\xFCtfen g\xF6zden ge\xE7irmek i\xE7in notu uygun \u015Fekilde etiketleyin (ayarlar i\xE7inde).",
RESPONSE_RECEIVED: "Yan\u0131t al\u0131nd\u0131.",
NO_DECK_EXISTS: "${deckName} ad\u0131nda bir deste yok",
ALL_CAUGHT_UP: "\u{1F3C6} \u015Eampiyon gibi bitirdin! \u{1F604}",
// scheduling.ts
DAYS_STR_IVL: "${interval} g\xFCn",
MONTHS_STR_IVL: "${interval} ay",
YEARS_STR_IVL: "${interval} y\u0131l",
DAYS_STR_IVL_MOBILE: "${interval}g",
MONTHS_STR_IVL_MOBILE: "${interval}a",
YEARS_STR_IVL_MOBILE: "${interval}y",
// settings.ts
SETTINGS_HEADER: "Aral\u0131kl\u0131 Tekrar",
GROUP_TAGS_FOLDERS: "Etiketler ve Klas\xF6rler",
GROUP_FLASHCARD_REVIEW: "Flash Kartlar\u0131 G\xF6zden Ge\xE7irme",
GROUP_FLASHCARD_SEPARATORS: "Flash Kart Ay\u0131r\u0131c\u0131lar\u0131",
GROUP_DATA_STORAGE: "Planlama Verilerinin Saklanmas\u0131",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flash Kartlar ve Notlar",
GROUP_CONTRIBUTING: "Katk\u0131da Bulunma",
CHECK_WIKI: 'Daha fazla bilgi i\xE7in wiki sayfas\u0131na g\xF6z at\u0131n.',
GITHUB_DISCUSSIONS: 'Soru-cevap, geri bildirim ve genel tart\u0131\u015Fmalar i\xE7in tart\u0131\u015Fmalar b\xF6l\xFCm\xFCne g\xF6z at\u0131n.',
GITHUB_ISSUES: 'Bir \xF6zellik iste\u011Finiz ya da hata bildiriminiz varsa buradan bildirin.',
GITHUB_SOURCE_CODE: 'Proje kaynak koduna GitHub \xFCzerinden ula\u015Fabilirsiniz.',
CODE_CONTRIBUTION_INFO: 'Kod katk\u0131lar\u0131 hakk\u0131nda bilgi al\u0131n.',
TRANSLATION_CONTRIBUTION_INFO: 'Eklentiyi kendi dilinize \xE7evirmek hakk\u0131nda bilgi i\xE7in \xE7eviri katk\u0131lar\u0131 sayfas\u0131n\u0131 ziyaret edin.',
FOLDERS_TO_IGNORE: "Yoksay\u0131lan Klas\xF6rler",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "Flash Kartlar",
FLASHCARD_EASY_LABEL: "Kolay Butonu Metni",
FLASHCARD_GOOD_LABEL: "Orta Butonu Metni",
FLASHCARD_HARD_LABEL: "Zor Butonu Metni",
FLASHCARD_EASY_DESC: '"Kolay" butonunun metnini \xF6zelle\u015Ftirin',
FLASHCARD_GOOD_DESC: '"Orta" butonunun metnini \xF6zelle\u015Ftirin',
FLASHCARD_HARD_DESC: '"Zor" butonunun metnini \xF6zelle\u015Ftirin',
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "Flash Kart Etiketleri",
FLASHCARD_TAGS_DESC: "Etiketleri bo\u015Fluklar veya yeni sat\u0131rlarla ay\u0131rarak girin, \xF6rne\u011Fin: #flashcards #deck2 #deck3.",
CONVERT_FOLDERS_TO_DECKS: "Klas\xF6rleri destelere ve alt destelere d\xF6n\xFC\u015Ft\xFCr?",
CONVERT_FOLDERS_TO_DECKS_DESC: "Bu, yukar\u0131daki Flash Kart etiketleri se\xE7ene\u011Fine bir alternatiftir.",
INLINE_SCHEDULING_COMMENTS: "Planlama yorumunu flash kart\u0131n son sat\u0131r\u0131yla ayn\u0131 sat\u0131ra kaydet?",
INLINE_SCHEDULING_COMMENTS_DESC: "Bunu a\xE7mak, HTML yorumlar\u0131n\u0131n liste bi\xE7imlendirmesini bozmamas\u0131n\u0131 sa\u011Flar.",
BURY_SIBLINGS_TILL_NEXT_DAY: "Karde\u015F kartlar\u0131 bir sonraki g\xFCne kadar gizle?",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Karde\u015F kartlar, ayn\u0131 kart metninden \xFCretilen kartlard\u0131r (\xF6rne\u011Fin gizlemeler).",
SHOW_CARD_CONTEXT: "Kartlarda ba\u011Flam\u0131 g\xF6ster?",
SHOW_CARD_CONTEXT_DESC: "\xD6rne\u011Fin: Ba\u015Fl\u0131k > Ba\u015Fl\u0131k 1 > Alt Ba\u015Fl\u0131k > ... > Alt Ba\u015Fl\u0131k",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "Flash Kart Y\xFCkseklik Y\xFCzdesi",
CARD_MODAL_SIZE_PERCENT_DESC: "Mobilde veya \xE7ok b\xFCy\xFCk resimleriniz varsa %100 olarak ayarlay\u0131n.",
RESET_DEFAULT: "Varsay\u0131lana s\u0131f\u0131rla",
CARD_MODAL_WIDTH_PERCENT: "Flash Kart Geni\u015Flik Y\xFCzdesi",
RANDOMIZE_CARD_ORDER: "\u0130nceleme s\u0131ras\u0131nda kart s\u0131ras\u0131n\u0131 rastgele yap?",
REVIEW_CARD_ORDER_WITHIN_DECK: "\u0130nceleme s\u0131ras\u0131nda bir destede kartlar\u0131n g\xF6r\xFCnt\xFClenme s\u0131ras\u0131",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "S\u0131ral\u0131 olarak (\xF6nce t\xFCm yeni kartlar)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "S\u0131ral\u0131 olarak (\xF6nce t\xFCm g\xFCncel kartlar)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "Rastgele olarak (\xF6nce t\xFCm yeni kartlar)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "Rastgele olarak (\xF6nce t\xFCm g\xFCncel kartlar)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "Rastgele desteden rastgele kart",
REVIEW_DECK_ORDER: "\u0130nceleme s\u0131ras\u0131nda destelerin g\xF6r\xFCnt\xFClenme s\u0131ras\u0131",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "S\u0131ral\u0131 olarak (\xD6nceki destedeki t\xFCm kartlar g\xF6zden ge\xE7irildikten sonra)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "Rastgele olarak (\xD6nceki destedeki t\xFCm kartlar g\xF6zden ge\xE7irildikten sonra)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "Rastgele desteden rastgele kart",
DISABLE_CLOZE_CARDS: "Gizli kartlar\u0131 devre d\u0131\u015F\u0131 b\u0131rak?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "==Vurgulanan== metni gizli kartlara d\xF6n\xFC\u015Ft\xFCr?",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: '"Cloze Patterns"den ${defaultPattern \xF6\u011Fesini ekleyin/kald\u0131r\u0131n',
CONVERT_BOLD_TEXT_TO_CLOZES: "**Kal\u0131n metni** gizli kartlara d\xF6n\xFC\u015Ft\xFCr?",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: '"Cloze Patterns"den ${defaultPattern \xF6\u011Fesini ekleyin/kald\u0131r\u0131n',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{K\u0131v\u0131rc\u0131k parantezleri}} gizli kartlara d\xF6n\xFC\u015Ft\xFCr?",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: '"Cloze Patterns"den ${defaultPattern \xF6\u011Fesini ekleyin/kald\u0131r\u0131n',
CLOZE_PATTERNS: "Cloze Patterns",
CLOZE_PATTERNS_DESC: 'Enter cloze patterns separated by newlines. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "Sat\u0131r i\xE7i flash kartlar i\xE7in ay\u0131r\u0131c\u0131",
FIX_SEPARATORS_MANUALLY_WARNING: "Bunu de\u011Fi\u015Ftirdikten sonra mevcut flash kartlar\u0131n\u0131z\u0131 manuel olarak d\xFCzenlemeniz gerekti\u011Fini unutmay\u0131n.",
INLINE_REVERSED_CARDS_SEPARATOR: "Sat\u0131r i\xE7i ters flash kartlar i\xE7in ay\u0131r\u0131c\u0131",
MULTILINE_CARDS_SEPARATOR: "\xC7ok sat\u0131rl\u0131 flash kartlar i\xE7in ay\u0131r\u0131c\u0131",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\xC7ok sat\u0131rl\u0131 ters flash kartlar i\xE7in ay\u0131r\u0131c\u0131",
MULTILINE_CARDS_END_MARKER: "Gizli kartlar ve \xE7ok sat\u0131rl\u0131 flash kartlar\u0131n sonunu belirten karakterler",
NOTES: "Notlar",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "Ba\u015Flang\u0131\xE7ta not inceleme panelini etkinle\u015Ftir",
TAGS_TO_REVIEW: "G\xF6zden ge\xE7irilecek etiketler",
TAGS_TO_REVIEW_DESC: "Etiketleri bo\u015Fluklar veya yeni sat\u0131rlarla ay\u0131rarak girin, \xF6rne\u011Fin: #review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "G\xF6zden ge\xE7irmek i\xE7in rastgele bir not a\xE7",
OPEN_RANDOM_NOTE_DESC: "Bunu kapatt\u0131\u011F\u0131n\u0131zda, notlar \xF6nem s\u0131ras\u0131na g\xF6re s\u0131ralan\u0131r (PageRank).",
AUTO_NEXT_NOTE: "Bir incelemeden sonra otomatik olarak bir sonraki notu a\xE7",
MAX_N_DAYS_REVIEW_QUEUE: "Sa\u011F panelde g\xF6sterilecek maksimum g\xFCn say\u0131s\u0131",
MIN_ONE_DAY: "G\xFCn say\u0131s\u0131 en az 1 olmal\u0131d\u0131r.",
VALID_NUMBER_WARNING: "L\xFCtfen ge\xE7erli bir say\u0131 girin.",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "Enable the review options in the file menu (e.g. Review: Easy, Good, Hard)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "If you disable the review options in the file menu, you can review your notes using the plugin commands and, if you defined them, the associated command hotkeys.",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deste a\u011Fa\xE7lar\u0131 ba\u015Flang\u0131\xE7ta geni\u015Fletilmi\u015F olarak g\xF6sterilmeli mi",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Bunu kapat\u0131n, ayn\u0131 dosyada bir\xE7ok desteye ait kartlar\u0131n\u0131z varsa i\xE7 i\xE7e desteleri daraltmak i\xE7in kullan\u0131\u015Fl\u0131d\u0131r.",
ALGORITHM: "Algoritma",
CHECK_ALGORITHM_WIKI: 'Daha fazla bilgi i\xE7in algoritma uygulamas\u0131na g\xF6z at\u0131n.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "Temel kolayl\u0131k",
BASE_EASE_DESC: "minimum = 130, tercihen yakla\u015F\u0131k 250.",
BASE_EASE_MIN_WARNING: "Temel kolayl\u0131k en az 130 olmal\u0131d\u0131r.",
LAPSE_INTERVAL_CHANGE: "Bir flash kart\u0131/notu zor olarak inceledi\u011Finizde aral\u0131k de\u011Fi\u015Fikli\u011Fi",
LAPSE_INTERVAL_CHANGE_DESC: "yeniAral\u0131k = eskiAral\u0131k * aral\u0131kDe\u011Fi\u015Fikli\u011Fi / 100.",
EASY_BONUS: "Kolayl\u0131k Bonusu",
EASY_BONUS_DESC: "Kolayl\u0131k bonusu, bir flash kart\u0131/notu \u0130yi ve Kolay yan\u0131tlad\u0131\u011F\u0131n\u0131zda aral\u0131klardaki fark\u0131 ayarlaman\u0131za olanak tan\u0131r (minimum = %100).",
EASY_BONUS_MIN_WARNING: "Kolayl\u0131k bonusu en az %100 olmal\u0131d\u0131r.",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "Maksimum aral\u0131k (g\xFCn)",
MAX_INTERVAL_DESC: "Aral\u0131\u011Fa bir \xFCst s\u0131n\u0131r koyman\u0131za olanak tan\u0131r (varsay\u0131lan = 100 y\u0131l).",
MAX_INTERVAL_MIN_WARNING: "Maksimum aral\u0131k en az 1 g\xFCn olmal\u0131d\u0131r.",
MAX_LINK_CONTRIB: "Maksimum ba\u011Flant\u0131 katk\u0131s\u0131",
MAX_LINK_CONTRIB_DESC: "Ba\u011Flant\u0131l\u0131 notlar\u0131n a\u011F\u0131rl\u0131kl\u0131 kolayl\u0131k de\u011Ferinin ba\u015Flang\u0131\xE7 kolayl\u0131\u011F\u0131na maksimum katk\u0131s\u0131.",
LOGGING: "Kay\u0131t tutma",
DISPLAY_SCHEDULING_DEBUG_INFO: "Geli\u015Ftirici konsolunda hata ay\u0131klama bilgilerini g\xF6ster",
DISPLAY_PARSER_DEBUG_INFO: "Ayr\u0131\u015Ft\u0131r\u0131c\u0131 i\xE7in hata ay\u0131klama bilgilerini geli\u015Ftirici konsolunda g\xF6ster",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "Not \u0130nceleme S\u0131ras\u0131",
CLOSE: "Kapat",
NEW: "Yeni",
YESTERDAY: "D\xFCn",
TODAY: "Bug\xFCn",
TOMORROW: "Yar\u0131n",
// stats-modal.tsx
STATS_TITLE: "\u0130statistikler",
MONTH: "Ay",
QUARTER: "\xC7eyrek",
YEAR: "Y\u0131l",
LIFETIME: "\xD6m\xFCr Boyu",
FORECAST: "Tahmin",
FORECAST_DESC: "Gelecekte incelemeye al\u0131nacak kartlar\u0131n say\u0131s\u0131",
SCHEDULED: "Planlanm\u0131\u015F",
DAYS: "G\xFCnler",
NUMBER_OF_CARDS: "Kart Say\u0131s\u0131",
REVIEWS_PER_DAY: "Ortalama: ${avg} inceleme/g\xFCn",
INTERVALS: "Aral\u0131klar",
INTERVALS_DESC: "\u0130ncelemelerin tekrar g\xF6sterilme gecikmeleri",
COUNT: "Say\u0131",
INTERVALS_SUMMARY: "Ortalama aral\u0131k: ${avg}, En uzun aral\u0131k: ${longest}",
EASES: "Kolayl\u0131klar",
EASES_SUMMARY: "Ortalama kolayl\u0131k: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "Kart T\xFCrleri",
CARD_TYPES_DESC: "Bu, g\xF6m\xFCl\xFC kartlar\u0131 da i\xE7erir (varsa)",
CARD_TYPE_NEW: "Yeni",
CARD_TYPE_YOUNG: "Gen\xE7",
CARD_TYPE_MATURE: "Olgun",
CARD_TYPES_SUMMARY: "Toplam kart: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var tr_default = tr;
// src/lang/locale/uk.ts
var uk = {
...en_default,
language: "uk",
languageName: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",
// flashcard-modal.tsx
DECKS: "\u041A\u043E\u043B\u043E\u0434\u0438 \u043A\u0430\u0440\u0442\u043E\u043A",
DUE_CARDS: "\u041A\u0430\u0440\u0442\u043A\u0438 \u0434\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",
NEW_CARDS: "\u041D\u043E\u0432\u0456 \u043A\u0430\u0440\u0442\u043A\u0438",
TOTAL_CARDS: "\u0423\u0441\u044C\u043E\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u043A",
BACK: "\u041D\u0430\u0437\u0430\u0434",
SKIP: "\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u0438",
EDIT_CARD: "\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u043A\u0443",
RESET_CARD_PROGRESS: "\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u043F\u0440\u043E\u0433\u0440\u0435\u0441 \u043A\u0430\u0440\u0442\u043A\u0438",
HARD: "\u0412\u0430\u0436\u043A\u043E",
GOOD: "\u0414\u043E\u0431\u0440\u0435",
EASY: "\u041B\u0435\u0433\u043A\u043E",
SHOW_ANSWER: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C",
CARD_PROGRESS_RESET: "\u041F\u0440\u043E\u0433\u0440\u0435\u0441 \u043A\u0430\u0440\u0442\u043A\u0438 \u0441\u043A\u0438\u043D\u0443\u0442\u043E.",
SAVE: "\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438",
CANCEL: "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
NO_INPUT: "\u0414\u0430\u043D\u0456 \u043D\u0435 \u0432\u0432\u0435\u0434\u0435\u043D\u043E.",
CURRENT_EASE_HELP_TEXT: "\u041F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u043A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043B\u0435\u0433\u043A\u043E\u0441\u0442\u0456: ",
CURRENT_INTERVAL_HELP_TEXT: "\u041F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B: ",
CARD_GENERATED_FROM: "\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u0437: ${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043D\u043E\u0442\u0430\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",
REVIEW_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u043A\u0438",
REVIEW_DIFFICULTY_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438: ${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u043D\u043E\u0442\u0430\u0442\u043A\u0443 \u044F\u043A ${difficulty}",
CRAM_ALL_CARDS: "\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u043A\u043E\u043B\u043E\u0434\u0443 \u0434\u043B\u044F \u0456\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E\u0433\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",
REVIEW_ALL_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u043A\u0438 \u0437 \u0443\u0441\u0456\u0445 \u043D\u043E\u0442\u0430\u0442\u043E\u043A",
REVIEW_CARDS_IN_NOTE: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u043A\u0438 \u0432 \u0446\u0456\u0439 \u043D\u043E\u0442\u0430\u0442\u0446\u0456",
CRAM_CARDS_IN_NOTE: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u043A\u0438 \u0446\u0456\u0454\u0457 \u043D\u043E\u0442\u0430\u0442\u043A\u0438",
VIEW_STATS: "\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443",
OPEN_REVIEW_QUEUE_VIEW: "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0447\u0435\u0440\u0433\u0443 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043A\u0430\u0440\u0442\u043E\u043A \u0443 \u0431\u0456\u0447\u043D\u0456\u0439 \u043F\u0430\u043D\u0435\u043B\u0456",
STATUS_BAR: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F: \u043D\u043E\u0442\u0430\u0442\u043E\u043A \u2014 ${dueNotesCount}, \u043A\u0430\u0440\u0442\u043E\u043A \u2014 ${dueFlashcardsCount}",
SYNC_TIME_TAKEN: "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0430\u0446\u0456\u044F: ${t} \u043C\u0441",
NOTE_IN_IGNORED_FOLDER: "\u041D\u043E\u0442\u0430\u0442\u043A\u0443 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043E \u0432 \u043F\u0440\u043E\u0456\u0433\u043D\u043E\u0440\u043E\u0432\u0430\u043D\u0456\u0439 \u0442\u0435\u0446\u0456 (\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F).",
PLEASE_TAG_NOTE: "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043F\u043E\u0437\u043D\u0430\u0447\u0442\u0435 \u043D\u043E\u0442\u0430\u0442\u043A\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0438\u043C\u0438 \u0442\u0435\u0433\u0430\u043C\u0438 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F (\u0443 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\u0445).",
RESPONSE_RECEIVED: "\u0412\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E.",
NO_DECK_EXISTS: "\u041A\u043E\u043B\u043E\u0434\u0438 \xAB${deckName}\xBB \u043D\u0435 \u0456\u0441\u043D\u0443\u0454",
ALL_CAUGHT_UP: "\u0427\u0443\u0434\u043E\u0432\u043E! \u0423\u0441\u0456 \u043A\u0430\u0440\u0442\u043A\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043E :D",
// scheduling.ts
DAYS_STR_IVL: "${interval} \u0434\u043D.",
MONTHS_STR_IVL: "${interval} \u043C\u0456\u0441.",
YEARS_STR_IVL: "${interval} \u0440.",
DAYS_STR_IVL_MOBILE: "${interval}\u0434",
MONTHS_STR_IVL_MOBILE: "${interval}\u043C",
YEARS_STR_IVL_MOBILE: "${interval}\u0440",
// settings.ts
SETTINGS_HEADER: "\u041F\u043B\u0430\u0433\u0456\u043D Spaced Repetition \u0434\u043B\u044F Obsidian",
GROUP_TAGS_FOLDERS: "\u0422\u0435\u0433\u0438 \u0442\u0430 \u0442\u0435\u043A\u0438",
GROUP_FLASHCARD_REVIEW: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043A\u0430\u0440\u0442\u043E\u043A",
GROUP_FLASHCARD_SEPARATORS: "\u0420\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0438\u043A\u0438 \u043A\u0430\u0440\u0442\u043E\u043A",
GROUP_DATA_STORAGE: "\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u043D\u043D\u044F \u0434\u0430\u043D\u0438\u0445 \u043F\u043B\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
GROUP_DATA_STORAGE_DESC: "\u041E\u0431\u0435\u0440\u0456\u0442\u044C, \u0434\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u0434\u0430\u043D\u0456 \u043F\u043B\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
GROUP_FLASHCARDS_NOTES: "\u041A\u0430\u0440\u0442\u043A\u0438 \u0442\u0430 \u043D\u043E\u0442\u0430\u0442\u043A\u0438",
GROUP_CONTRIBUTING: "\u0412\u043D\u0435\u0441\u043E\u043A \u0443 \u043F\u0440\u043E\u0454\u043A\u0442",
CHECK_WIKI: '\u0414\u043B\u044F \u0434\u043E\u043A\u043B\u0430\u0434\u043D\u0456\u0448\u043E\u0457 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0457 \u043F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u044C\u0442\u0435 wiki.',
GITHUB_DISCUSSIONS: '\u0412\u0456\u0434\u0432\u0456\u0434\u0430\u0439\u0442\u0435 \u0440\u043E\u0437\u0434\u0456\u043B discussions \u0434\u043B\u044F \u0437\u0430\u043F\u0438\u0442\u0430\u043D\u044C \u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0435\u0439, \u0432\u0456\u0434\u0433\u0443\u043A\u0456\u0432 \u0442\u0430 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0431\u0433\u043E\u0432\u043E\u0440\u0435\u043D\u043D\u044F.',
GITHUB_ISSUES: '\u0421\u0442\u0432\u043E\u0440\u0456\u0442\u044C \u0437\u0432\u0435\u0440\u043D\u0435\u043D\u043D\u044F \u0442\u0443\u0442, \u044F\u043A\u0449\u043E \u043C\u0430\u0454\u0442\u0435 \u0437\u0430\u043F\u0438\u0442 \u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0456\u044E \u0430\u0431\u043E \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0443.',
GITHUB_SOURCE_CODE: '\u0412\u0438\u0445\u0456\u0434\u043D\u0438\u0439 \u043A\u043E\u0434 \u043F\u0440\u043E\u0454\u043A\u0442\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u043D\u0430 GitHub.',
CODE_CONTRIBUTION_INFO: '\u041E\u0441\u044C \u044F\u043A \u0437\u0440\u043E\u0431\u0438\u0442\u0438 \u0432\u043D\u0435\u0441\u043E\u043A \u0443 \u043A\u043E\u0434 \u043F\u043B\u0430\u0433\u0456\u043D\u0430.',
TRANSLATION_CONTRIBUTION_INFO: '\u041E\u0441\u044C \u044F\u043A \u043F\u0435\u0440\u0435\u043A\u043B\u0430\u0441\u0442\u0438 \u043F\u043B\u0430\u0433\u0456\u043D \u043D\u0430 \u0456\u043D\u0448\u0443 \u043C\u043E\u0432\u0443.',
FOLDERS_TO_IGNORE: "\u0422\u0435\u043A\u0438 \u0434\u043B\u044F \u0456\u0433\u043D\u043E\u0440\u0443\u0432\u0430\u043D\u043D\u044F",
FOLDERS_TO_IGNORE_DESC: "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u0448\u043B\u044F\u0445\u0438 \u0442\u0435\u043A \u0430\u0431\u043E glob-\u0448\u0430\u0431\u043B\u043E\u043D\u0438 \u0432 \u043E\u043A\u0440\u0435\u043C\u0438\u0445 \u0440\u044F\u0434\u043A\u0430\u0445, \u043D\u0430\u043F\u0440. Templates/Scripts \u0430\u0431\u043E **/*.excalidraw.md. \u0426\u0435 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043F\u0456\u043B\u044C\u043D\u0435 \u0434\u043B\u044F \u043A\u0430\u0440\u0442\u043E\u043A \u0456 \u043D\u043E\u0442\u0430\u0442\u043E\u043A.",
OBSIDIAN_INTEGRATION: "\u0406\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u044F \u0437 Obsidian",
FLASHCARDS: "\u041A\u0430\u0440\u0442\u043A\u0438",
FLASHCARD_EASY_LABEL: "\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 \xAB\u041B\u0435\u0433\u043A\u043E\xBB",
FLASHCARD_GOOD_LABEL: "\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 \xAB\u0414\u043E\u0431\u0440\u0435\xBB",
FLASHCARD_HARD_LABEL: "\u0422\u0435\u043A\u0441\u0442 \u043A\u043D\u043E\u043F\u043A\u0438 \xAB\u0412\u0430\u0436\u043A\u043E\xBB",
FLASHCARD_EASY_DESC: "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0439\u0442\u0435 \u043F\u0456\u0434\u043F\u0438\u0441 \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 \xAB\u041B\u0435\u0433\u043A\u043E\xBB",
FLASHCARD_GOOD_DESC: "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0439\u0442\u0435 \u043F\u0456\u0434\u043F\u0438\u0441 \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 \xAB\u0414\u043E\u0431\u0440\u0435\xBB",
FLASHCARD_HARD_DESC: "\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0439\u0442\u0435 \u043F\u0456\u0434\u043F\u0438\u0441 \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 \xAB\u0412\u0430\u0436\u043A\u043E\xBB",
REVIEW_BUTTON_DELAY: "\u0417\u0430\u0442\u0440\u0438\u043C\u043A\u0430 \u043D\u0430\u0442\u0438\u0441\u043A\u0430\u043D\u043D\u044F \u043A\u043D\u043E\u043F\u043A\u0438 (\u043C\u0441)",
REVIEW_BUTTON_DELAY_DESC: "\u0414\u043E\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u0443 \u0434\u043E \u043A\u043D\u043E\u043F\u043E\u043A \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u0457\u0445 \u043C\u043E\u0436\u043D\u0430 \u0431\u0443\u0434\u0435 \u043D\u0430\u0442\u0438\u0441\u043D\u0443\u0442\u0438 \u0437\u043D\u043E\u0432\u0443.",
FLASHCARD_TAGS: "\u0422\u0435\u0433\u0438 \u043A\u0430\u0440\u0442\u043E\u043A",
FLASHCARD_TAGS_DESC: "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u0442\u0435\u0433\u0438, \u0440\u043E\u0437\u0434\u0456\u043B\u0435\u043D\u0456 \u043F\u0440\u043E\u0431\u0456\u043B\u0430\u043C\u0438 \u0430\u0431\u043E \u043D\u043E\u0432\u0438\u043C\u0438 \u0440\u044F\u0434\u043A\u0430\u043C\u0438 (\u043D\u0430\u043F\u0440. #flashcards #deck2 #deck3).",
CONVERT_FOLDERS_TO_DECKS: "\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0442\u0438 \u0442\u0435\u043A\u0438 \u043D\u0430 \u043A\u043E\u043B\u043E\u0434\u0438",
CONVERT_FOLDERS_TO_DECKS_DESC: "\u0426\u0435 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u0438\u0439 \u0432\u0430\u0440\u0456\u0430\u043D\u0442 \u0434\u043E \u0442\u0435\u0433\u0456\u0432 \u043A\u0430\u0440\u0442\u043E\u043A \u0432\u0438\u0449\u0435.",
INLINE_SCHEDULING_COMMENTS: "\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043A\u043E\u043C\u0435\u043D\u0442\u0430\u0440 \u043F\u043B\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F \u0432 \u0442\u043E\u043C\u0443 \u0436 \u0440\u044F\u0434\u043A\u0443, \u0449\u043E \u0439 \u043E\u0441\u0442\u0430\u043D\u043D\u0456\u0439 \u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442\u043A\u0438?",
INLINE_SCHEDULING_COMMENTS_DESC: "\u0423\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043D\u044F \u0446\u044C\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u043D\u0435 \u0434\u0430\u0441\u0442\u044C HTML-\u043A\u043E\u043C\u0435\u043D\u0442\u0430\u0440\u044F\u043C \u043B\u0430\u043C\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043F\u0438\u0441\u043A\u0456\u0432.",
BURY_SIBLINGS_TILL_NEXT_DAY: "\u0412\u0456\u0434\u043A\u043B\u0430\u0434\u0430\u0442\u0438 \u0441\u043F\u043E\u0440\u0456\u0434\u043D\u0435\u043D\u0456 \u043A\u0430\u0440\u0442\u043A\u0438 \u0434\u043E \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0434\u043D\u044F",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u0421\u043F\u043E\u0440\u0456\u0434\u043D\u0435\u043D\u0456 \u2014 \u0446\u0435 \u043A\u0430\u0440\u0442\u043A\u0438, \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u0456 \u0437 \u043E\u0434\u043D\u043E\u0433\u043E \u0439 \u0442\u043E\u0433\u043E \u0441\u0430\u043C\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0443, \u043D\u0430\u043F\u0440. cloze-\u0432\u0438\u043B\u0443\u0447\u0435\u043D\u043D\u044F",
SHOW_CARD_CONTEXT: "\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0443 \u043A\u0430\u0440\u0442\u043A\u0430\u0445",
SHOW_CARD_CONTEXT_DESC: "\u043D\u0430\u043F\u0440. \u041D\u0430\u0437\u0432\u0430 > \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 1 > \u041F\u0456\u0434\u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A > ... > \u041F\u0456\u0434\u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0441 \u0434\u043E \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0430\u0445",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "\u041A\u043E\u0440\u0438\u0441\u043D\u043E \u0437\u043D\u0430\u0442\u0438, \u043D\u0430\u0441\u043A\u0456\u043B\u044C\u043A\u0438 \u0434\u0430\u043B\u0435\u043A\u043E \u0432 \u043C\u0430\u0439\u0431\u0443\u0442\u043D\u0454 \u0432\u0456\u0434\u0441\u0443\u0432\u0430\u044E\u0442\u044C\u0441\u044F \u0432\u0430\u0448\u0456 \u043A\u0430\u0440\u0442\u043A\u0438.",
CARD_MODAL_HEIGHT_PERCENT: "\u0412\u0456\u0434\u0441\u043E\u0442\u043E\u043A \u0432\u0438\u0441\u043E\u0442\u0438 \u043A\u0430\u0440\u0442\u043A\u0438",
CARD_MODAL_SIZE_PERCENT_DESC: "\u0414\u043B\u044F \u043C\u043E\u0431\u0456\u043B\u044C\u043D\u0438\u0445 \u0430\u0431\u043E \u044F\u043A\u0449\u043E \u043C\u0430\u0454\u0442\u0435 \u0434\u0443\u0436\u0435 \u0432\u0435\u043B\u0438\u043A\u0456 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F, \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0456\u0442\u044C 100%",
RESET_DEFAULT: "\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u0434\u043E \u0442\u0438\u043F\u043E\u0432\u0438\u0445",
CARD_MODAL_WIDTH_PERCENT: "\u0412\u0456\u0434\u0441\u043E\u0442\u043E\u043A \u0448\u0438\u0440\u0438\u043D\u0438 \u043A\u0430\u0440\u0442\u043A\u0438",
RANDOMIZE_CARD_ORDER: "\u041F\u0435\u0440\u0435\u043C\u0456\u0448\u0443\u0432\u0430\u0442\u0438 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442\u043E\u043A \u043F\u0456\u0434 \u0447\u0430\u0441 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F?",
REVIEW_CARD_ORDER_WITHIN_DECK: "\u041F\u043E\u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442\u043E\u043A \u0443 \u043A\u043E\u043B\u043E\u0434\u0456",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0456\u0434\u043E\u0432\u043D\u043E \u0432 \u043C\u0435\u0436\u0430\u0445 \u043A\u043E\u043B\u043E\u0434\u0438 (\u0441\u043F\u043E\u0447\u0430\u0442\u043A\u0443 \u0432\u0441\u0456 \u043D\u043E\u0432\u0456 \u043A\u0430\u0440\u0442\u043A\u0438)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0456\u0434\u043E\u0432\u043D\u043E \u0432 \u043C\u0435\u0436\u0430\u0445 \u043A\u043E\u043B\u043E\u0434\u0438 (\u0441\u043F\u043E\u0447\u0430\u0442\u043A\u0443 \u0432\u0441\u0456 \u0434\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "\u0412\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u043E \u0432 \u043C\u0435\u0436\u0430\u0445 \u043A\u043E\u043B\u043E\u0434\u0438 (\u0441\u043F\u043E\u0447\u0430\u0442\u043A\u0443 \u0432\u0441\u0456 \u043D\u043E\u0432\u0456 \u043A\u0430\u0440\u0442\u043A\u0438)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "\u0412\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u043E \u0432 \u043C\u0435\u0436\u0430\u0445 \u043A\u043E\u043B\u043E\u0434\u0438 (\u0441\u043F\u043E\u0447\u0430\u0442\u043A\u0443 \u0432\u0441\u0456 \u0434\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "\u0412\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u0430 \u043A\u0430\u0440\u0442\u043A\u0430 \u0437 \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u043E\u0457 \u043A\u043E\u043B\u043E\u0434\u0438",
REVIEW_DECK_ORDER: "\u041F\u043E\u0440\u044F\u0434\u043E\u043A \u0432\u0456\u0434\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u043A\u043E\u043B\u043E\u0434 \u043F\u0456\u0434 \u0447\u0430\u0441 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "\u041F\u043E\u0441\u043B\u0456\u0434\u043E\u0432\u043D\u043E (\u043F\u0456\u0441\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u0432\u0441\u0456\u0445 \u043A\u0430\u0440\u0442\u043E\u043A \u0443 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u043A\u043E\u043B\u043E\u0434\u0456)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "\u0412\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u043E (\u043F\u0456\u0441\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u0432\u0441\u0456\u0445 \u043A\u0430\u0440\u0442\u043E\u043A \u0443 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u043A\u043E\u043B\u043E\u0434\u0456)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "\u0412\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u0430 \u043A\u0430\u0440\u0442\u043A\u0430 \u0437 \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u043E\u0457 \u043A\u043E\u043B\u043E\u0434\u0438",
DISABLE_CLOZE_CARDS: "\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438 cloze-\u043A\u0430\u0440\u0442\u043A\u0438?",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0442\u0438 ==\u0432\u0438\u0434\u0456\u043B\u0435\u043D\u043D\u044F== \u043D\u0430 cloze",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: "\u0414\u043E\u0434\u0430\u0439\u0442\u0435/\u0432\u0438\u0434\u0430\u043B\u0456\u0442\u044C ${defaultPattern} \u0443 \u0432\u0430\u0448\u0438\u0445 cloze-\u0448\u0430\u0431\u043B\u043E\u043D\u0430\u0445",
CONVERT_BOLD_TEXT_TO_CLOZES: "\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0442\u0438 **\u0436\u0438\u0440\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442** \u043D\u0430 cloze",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: "\u0414\u043E\u0434\u0430\u0439\u0442\u0435/\u0432\u0438\u0434\u0430\u043B\u0456\u0442\u044C ${defaultPattern} \u0443 \u0432\u0430\u0448\u0438\u0445 cloze-\u0448\u0430\u0431\u043B\u043E\u043D\u0430\u0445",
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0442\u0438 {{\u0444\u0456\u0433\u0443\u0440\u043D\u0456 \u0434\u0443\u0436\u043A\u0438}} \u043D\u0430 cloze",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: "\u0414\u043E\u0434\u0430\u0439\u0442\u0435/\u0432\u0438\u0434\u0430\u043B\u0456\u0442\u044C ${defaultPattern} \u0443 \u0432\u0430\u0448\u0438\u0445 cloze-\u0448\u0430\u0431\u043B\u043E\u043D\u0430\u0445",
CLOZE_PATTERNS: "Cloze-\u0448\u0430\u0431\u043B\u043E\u043D\u0438",
CLOZE_PATTERNS_DESC: '\u0412\u0432\u0435\u0434\u0456\u0442\u044C cloze-\u0448\u0430\u0431\u043B\u043E\u043D\u0438, \u0440\u043E\u0437\u0434\u0456\u043B\u0435\u043D\u0456 \u043D\u043E\u0432\u0438\u043C\u0438 \u0440\u044F\u0434\u043A\u0430\u043C\u0438. \u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u044C\u0442\u0435 wiki \u0434\u043B\u044F \u0434\u043E\u0432\u0456\u0434\u043A\u0438.',
INLINE_CARDS_SEPARATOR: "\u0420\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0438\u043A \u0434\u043B\u044F \u0440\u044F\u0434\u043A\u043E\u0432\u0438\u0445 \u043A\u0430\u0440\u0442\u043E\u043A",
FIX_SEPARATORS_MANUALLY_WARNING: "\u041F\u0456\u0441\u043B\u044F \u0437\u043C\u0456\u043D\u0438 \u0446\u044C\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0432\u0440\u0443\u0447\u043D\u0443 \u0432\u0456\u0434\u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u043D\u0430\u044F\u0432\u043D\u0456 \u043A\u0430\u0440\u0442\u043A\u0438.",
INLINE_REVERSED_CARDS_SEPARATOR: "\u0420\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0438\u043A \u0434\u043B\u044F \u0440\u044F\u0434\u043A\u043E\u0432\u0438\u0445 \u0434\u0432\u043E\u0431\u0456\u0447\u043D\u0438\u0445 \u043A\u0430\u0440\u0442\u043E\u043A",
MULTILINE_CARDS_SEPARATOR: "\u0420\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0438\u043A \u0434\u043B\u044F \u0431\u0430\u0433\u0430\u0442\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u0438\u0445 \u043A\u0430\u0440\u0442\u043E\u043A",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0420\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0438\u043A \u0434\u043B\u044F \u0431\u0430\u0433\u0430\u0442\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u0438\u0445 \u0434\u0432\u043E\u0431\u0456\u0447\u043D\u0438\u0445 \u043A\u0430\u0440\u0442\u043E\u043A",
MULTILINE_CARDS_END_MARKER: "\u0421\u0438\u043C\u0432\u043E\u043B\u0438, \u0449\u043E \u043F\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442\u044C \u043A\u0456\u043D\u0435\u0446\u044C cloze \u0442\u0430 \u0431\u0430\u0433\u0430\u0442\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u0438\u0445 \u043A\u0430\u0440\u0442\u043E\u043A",
NOTES: "\u041D\u043E\u0442\u0430\u0442\u043A\u0438",
NOTE: "\u041D\u043E\u0442\u0430\u0442\u043A\u0430",
REVIEW_PANE_ON_STARTUP: "\u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043D\u043E\u0442\u0430\u0442\u043E\u043A \u043F\u0456\u0434 \u0447\u0430\u0441 \u0437\u0430\u043F\u0443\u0441\u043A\u0443",
TAGS_TO_REVIEW: "\u0422\u0435\u0433\u0438 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",
TAGS_TO_REVIEW_DESC: "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u0442\u0435\u0433\u0438, \u0440\u043E\u0437\u0434\u0456\u043B\u0435\u043D\u0456 \u043F\u0440\u043E\u0431\u0456\u043B\u0430\u043C\u0438 \u0430\u0431\u043E \u043D\u043E\u0432\u0438\u043C\u0438 \u0440\u044F\u0434\u043A\u0430\u043C\u0438, \u043D\u0430\u043F\u0440. #review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u0443 \u043D\u043E\u0442\u0430\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",
OPEN_RANDOM_NOTE_DESC: "\u041A\u043E\u043B\u0438 \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E, \u043D\u043E\u0442\u0430\u0442\u043A\u0438 \u0432\u043F\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u0443\u044E\u0442\u044C\u0441\u044F \u0437\u0430 \u0432\u0430\u0436\u043B\u0438\u0432\u0456\u0441\u0442\u044E (PageRank).",
AUTO_NEXT_NOTE: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0443 \u043D\u043E\u0442\u0430\u0442\u043A\u0443 \u043F\u0456\u0441\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F",
MAX_N_DAYS_REVIEW_QUEUE: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0434\u043D\u0456\u0432 \u0443 \u043F\u0430\u043D\u0435\u043B\u0456 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043D\u043E\u0442\u0430\u0442\u043E\u043A",
MIN_ONE_DAY: "\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0434\u043D\u0456\u0432 \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 \u0449\u043E\u043D\u0430\u0439\u043C\u0435\u043D\u0448\u0435 1.",
VALID_NUMBER_WARNING: "\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u0435 \u0447\u0438\u0441\u043B\u043E.",
UI: "\u0406\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441",
OPEN_IN_TAB: "\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432 \u043D\u043E\u0432\u0456\u0439 \u0432\u043A\u043B\u0430\u0434\u0446\u0456",
OPEN_IN_TAB_DESC: "\u0412\u0438\u043C\u043A\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0442\u0438 \u043F\u043B\u0430\u0433\u0456\u043D \u0443 \u043C\u043E\u0434\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0432\u0456\u043A\u043D\u0456",
SHOW_STATUS_BAR: "\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0440\u044F\u0434\u043E\u043A \u0441\u0442\u0430\u043D\u0443",
SHOW_STATUS_BAR_DESC: "\u0412\u0438\u043C\u043A\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u0441\u0442\u0430\u043D \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043A\u0430\u0440\u0442\u043E\u043A \u0443 \u0440\u044F\u0434\u043A\u0443 \u0441\u0442\u0430\u043D\u0443 Obsidian",
SHOW_RIBBON_ICON: "\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0456\u043A\u043E\u043D\u043A\u0443 \u043D\u0430 \u0441\u0442\u0440\u0456\u0447\u0446\u0456",
SHOW_RIBBON_ICON_DESC: "\u0412\u0438\u043C\u043A\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u0456\u043A\u043E\u043D\u043A\u0443 \u043F\u043B\u0430\u0433\u0456\u043D\u0430 \u0437\u0456 \u0441\u0442\u0440\u0456\u0447\u043A\u0438 Obsidian",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "\u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u0432 \u043C\u0435\u043D\u044E \u0444\u0430\u0439\u043B\u0443 (\u043D\u0430\u043F\u0440. \u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438: \u041B\u0435\u0433\u043A\u043E, \u0414\u043E\u0431\u0440\u0435, \u0412\u0430\u0436\u043A\u043E)",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u042F\u043A\u0449\u043E \u0432\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u0432 \u043C\u0435\u043D\u044E \u0444\u0430\u0439\u043B\u0443, \u0432\u0438 \u0437\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044E\u0432\u0430\u0442\u0438 \u043D\u043E\u0442\u0430\u0442\u043A\u0438 \u0437\u0430 \u0434\u043E\u043F\u043E\u043C\u043E\u0433\u043E\u044E \u043A\u043E\u043C\u0430\u043D\u0434 \u043F\u043B\u0430\u0433\u0456\u043D\u0430 \u0442\u0430, \u044F\u043A\u0449\u043E \u043D\u0430\u043B\u0430\u0448\u0442\u043E\u0432\u0430\u043D\u0456, \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0438\u0445 \u0433\u0430\u0440\u044F\u0447\u0438\u0445 \u043A\u043B\u0430\u0432\u0456\u0448.",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u0414\u0435\u0440\u0435\u0432\u043E \u043A\u043E\u043B\u043E\u0434 \u0441\u043F\u043E\u0447\u0430\u0442\u043A\u0443 \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 \u0440\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438\u043C",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u0412\u0438\u043C\u043A\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u043A\u043B\u0430\u0434\u0435\u043D\u0456 \u043A\u043E\u043B\u043E\u0434\u0438 \u0432 \u0442\u0456\u0439 \u0441\u0430\u043C\u0456\u0439 \u043A\u0430\u0440\u0442\u0446\u0456. \u041A\u043E\u0440\u0438\u0441\u043D\u043E, \u044F\u043A\u0449\u043E \u0432\u0430\u0448\u0456 \u043A\u0430\u0440\u0442\u043A\u0438 \u043D\u0430\u043B\u0435\u0436\u0430\u0442\u044C \u0434\u043E \u0431\u0430\u0433\u0430\u0442\u044C\u043E\u0445 \u043A\u043E\u043B\u043E\u0434 \u0432 \u043E\u0434\u043D\u043E\u043C\u0443 \u0444\u0430\u0439\u043B\u0456.",
ALGORITHM: "\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C",
CHECK_ALGORITHM_WIKI: '\u0414\u043B\u044F \u0434\u043E\u043A\u043B\u0430\u0434\u043D\u0456\u0448\u043E\u0457 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0457 \u043F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u044C\u0442\u0435 \u0434\u0435\u0442\u0430\u043B\u0456 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0443.',
SM2_OSR_VARIANT: "\u0412\u0430\u0440\u0456\u0430\u043D\u0442 SM-2 \u0432\u0456\u0434 OSR",
BASE_EASE: "\u0411\u0430\u0437\u043E\u0432\u0430 \u043B\u0435\u0433\u043A\u0456\u0441\u0442\u044C",
BASE_EASE_DESC: "\u043C\u0456\u043D\u0456\u043C\u0443\u043C = 130, \u0431\u0430\u0436\u0430\u043D\u043E \u043F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u043E 250.",
BASE_EASE_MIN_WARNING: "\u0411\u0430\u0437\u043E\u0432\u0430 \u043B\u0435\u0433\u043A\u0456\u0441\u0442\u044C \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 \u0449\u043E\u043D\u0430\u0439\u043C\u0435\u043D\u0448\u0435 130.",
LAPSE_INTERVAL_CHANGE: "\u0417\u043C\u0456\u043D\u0430 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0443 \u043F\u0440\u0438 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456 \xAB\u0412\u0430\u0436\u043A\u043E\xBB \u0434\u043B\u044F \u043A\u0430\u0440\u0442\u043A\u0438/\u043D\u043E\u0442\u0430\u0442\u043A\u0438",
LAPSE_INTERVAL_CHANGE_DESC: "\u043D\u043E\u0432\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B = \u0441\u0442\u0430\u0440\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B \xD7 \u0437\u043C\u0456\u043D\u0430 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0443 / 100.",
EASY_BONUS: "\u0411\u043E\u043D\u0443\u0441 \xAB\u041B\u0435\u0433\u043A\u043E\xBB",
EASY_BONUS_DESC: "\u0411\u043E\u043D\u0443\u0441 \xAB\u041B\u0435\u0433\u043A\u043E\xBB \u0434\u0430\u0454 \u0437\u043C\u043E\u0433\u0443 \u0437\u0430\u0434\u0430\u0442\u0438 \u0440\u0456\u0437\u043D\u0438\u0446\u044E \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0456\u0432 \u043C\u0456\u0436 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044F\u043C\u0438 \xAB\u0414\u043E\u0431\u0440\u0435\xBB \u0456 \xAB\u041B\u0435\u0433\u043A\u043E\xBB \u0434\u043B\u044F \u043A\u0430\u0440\u0442\u043A\u0438/\u043D\u043E\u0442\u0430\u0442\u043A\u0438 (\u043C\u0456\u043D\u0456\u043C\u0443\u043C = 100%).",
EASY_BONUS_MIN_WARNING: "\u0411\u043E\u043D\u0443\u0441 \xAB\u041B\u0435\u0433\u043A\u043E\xBB \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 \u0449\u043E\u043D\u0430\u0439\u043C\u0435\u043D\u0448\u0435 100.",
LOAD_BALANCE: "\u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u0431\u0430\u043B\u0430\u043D\u0441\u0443\u0432\u0430\u043D\u043D\u044F \u043D\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F",
LOAD_BALANCE_DESC: `\u041D\u0435\u0437\u043D\u0430\u0447\u043D\u043E \u043A\u043E\u0440\u0438\u0433\u0443\u0454 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B, \u0449\u043E\u0431 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u044C \u043D\u0430 \u0434\u0435\u043D\u044C \u0431\u0443\u043B\u0430 \u0431\u0456\u043B\u044C\u0448 \u0440\u0456\u0432\u043D\u043E\u043C\u0456\u0440\u043D\u043E\u044E.
\u0426\u0435 \u044F\u043A fuzz \u0432 Anki, \u0430\u043B\u0435 \u0437\u0430\u043C\u0456\u0441\u0442\u044C \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u043E\u0441\u0442\u0456 \u043E\u0431\u0438\u0440\u0430\u0454\u0442\u044C\u0441\u044F \u0434\u0435\u043D\u044C \u0437 \u043D\u0430\u0439\u043C\u0435\u043D\u0448\u043E\u044E \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044E \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u044C.
\u0414\u043B\u044F \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0445 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0456\u0432 \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E.`,
MAX_INTERVAL: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u0443 \u0434\u043D\u044F\u0445",
MAX_INTERVAL_DESC: "\u0414\u043E\u0437\u0432\u043E\u043B\u044F\u0454 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0435\u0440\u0445\u043D\u044E \u043C\u0435\u0436\u0443 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0443 (\u0442\u0438\u043F\u043E\u0432\u043E = 100 \u0440\u043E\u043A\u0456\u0432).",
MAX_INTERVAL_MIN_WARNING: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u043C\u0430\u0454 \u0431\u0443\u0442\u0438 \u0449\u043E\u043D\u0430\u0439\u043C\u0435\u043D\u0448\u0435 1 \u0434\u0435\u043D\u044C.",
MAX_LINK_CONTRIB: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0432\u043D\u0435\u0441\u043E\u043A \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C",
MAX_LINK_CONTRIB_DESC: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0438\u0439 \u0432\u043D\u0435\u0441\u043E\u043A \u0437\u0432\u0430\u0436\u0435\u043D\u043E\u0457 \u043B\u0435\u0433\u043A\u043E\u0441\u0442\u0456 \u043F\u043E\u0432'\u044F\u0437\u0430\u043D\u0438\u0445 \u043D\u043E\u0442\u0430\u0442\u043E\u043A \u0443 \u043F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0443 \u043B\u0435\u0433\u043A\u0456\u0441\u0442\u044C.",
LOGGING: "\u0416\u0443\u0440\u043D\u0430\u043B\u044E\u0432\u0430\u043D\u043D\u044F",
DISPLAY_SCHEDULING_DEBUG_INFO: "\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043D\u0430\u043B\u0430\u0433\u043E\u0434\u0436\u0443\u0432\u0430\u043B\u044C\u043D\u0443 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044E \u043F\u043B\u0430\u043D\u0443\u0432\u0430\u043B\u044C\u043D\u0438\u043A\u0430 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u0456 \u0440\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A\u0430",
DISPLAY_PARSER_DEBUG_INFO: "\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043D\u0430\u043B\u0430\u0433\u043E\u0434\u0436\u0443\u0432\u0430\u043B\u044C\u043D\u0443 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044E \u043F\u0430\u0440\u0441\u0435\u0440\u0430 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u0456 \u0440\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A\u0430",
SCHEDULING: "\u041F\u043B\u0430\u043D\u0443\u0432\u0430\u043D\u043D\u044F",
EXPERIMENTAL: "\u0415\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0430\u043B\u044C\u043D\u0435",
HELP: "\u0414\u043E\u0432\u0456\u0434\u043A\u0430",
STORE_IN_NOTES: "\u0423 \u043D\u043E\u0442\u0430\u0442\u043A\u0430\u0445",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "\u0427\u0435\u0440\u0433\u0430 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043D\u043E\u0442\u0430\u0442\u043E\u043A",
CLOSE: "\u0417\u0430\u043A\u0440\u0438\u0442\u0438",
NEW: "\u041D\u043E\u0432\u0456",
YESTERDAY: "\u0412\u0447\u043E\u0440\u0430",
TODAY: "\u0421\u044C\u043E\u0433\u043E\u0434\u043D\u0456",
TOMORROW: "\u0417\u0430\u0432\u0442\u0440\u0430",
// stats-modal.tsx
STATS_TITLE: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430",
MONTH: "\u041C\u0456\u0441\u044F\u0446\u044C",
QUARTER: "\u041A\u0432\u0430\u0440\u0442\u0430\u043B",
YEAR: "\u0420\u0456\u043A",
LIFETIME: "\u0417\u0430 \u0432\u0435\u0441\u044C \u0447\u0430\u0441",
FORECAST: "\u041F\u0440\u043E\u0433\u043D\u043E\u0437",
FORECAST_DESC: "\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u043A, \u0449\u043E \u0431\u0443\u0434\u0443\u0442\u044C \u0434\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u0432 \u043C\u0430\u0439\u0431\u0443\u0442\u043D\u044C\u043E\u043C\u0443",
SCHEDULED: "\u0417\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u043E",
DAYS: "\u0414\u043D\u0456",
NUMBER_OF_CARDS: "\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u043A",
REVIEWS_PER_DAY: "\u0421\u0435\u0440\u0435\u0434\u043D\u0454: ${avg} \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u044C/\u0434\u0435\u043D\u044C",
INTERVALS: "\u0406\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0438",
INTERVALS_DESC: "\u0417\u0430\u0442\u0440\u0438\u043C\u043A\u0438, \u043F\u0456\u0441\u043B\u044F \u044F\u043A\u0438\u0445 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u043D\u044F \u043F\u043E\u043A\u0430\u0437\u0443\u044E\u0442\u044C\u0441\u044F \u0437\u043D\u043E\u0432\u0443",
COUNT: "\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C",
INTERVALS_SUMMARY: "\u0421\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B: ${avg}, \u043D\u0430\u0439\u0434\u043E\u0432\u0448\u0438\u0439 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B: ${longest}",
EASES: "\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442\u0438 \u043B\u0435\u0433\u043A\u043E\u0441\u0442\u0456",
EASES_SUMMARY: "\u0421\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u043A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u043B\u0435\u0433\u043A\u043E\u0441\u0442\u0456: ${avgEase}",
EASE: "\u041B\u0435\u0433\u043A\u0456\u0441\u0442\u044C",
CARD_TYPES: "\u0422\u0438\u043F\u0438 \u043A\u0430\u0440\u0442\u043E\u043A",
CARD_TYPES_DESC: "\u0412\u043A\u043B\u044E\u0447\u0430\u0454 \u0442\u0430\u043A\u043E\u0436 \u0432\u0456\u0434\u043A\u043B\u0430\u0434\u0435\u043D\u0456 \u043A\u0430\u0440\u0442\u043A\u0438, \u044F\u043A\u0449\u043E \u0454",
CARD_TYPE_NEW: "\u041D\u043E\u0432\u0456",
CARD_TYPE_YOUNG: "\u041C\u043E\u043B\u043E\u0434\u0456",
CARD_TYPE_MATURE: "\u0417\u0440\u0456\u043B\u0456",
CARD_TYPES_SUMMARY: "\u0423\u0441\u044C\u043E\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u043A: ${totalCardsCount}",
SEARCH: "\u041F\u043E\u0448\u0443\u043A",
PREVIOUS: "\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456\u0439",
NEXT: "\u041D\u0430\u0441\u0442\u0443\u043F\u043D\u0438\u0439",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var uk_default = uk;
// src/lang/locale/ur.ts
var ur = {
...en_default,
language: "ur",
languageName: "\u0627\u0631\u062F\u0648"
};
var ur_default = ur;
// src/lang/locale/vi.ts
var vi = {
...en_default,
language: "vi",
languageName: "Ti\u1EBFng Vi\u1EC7t"
};
var vi_default = vi;
// src/lang/locale/zh-cn.ts
var zhCN = {
...en_default,
language: "zh-cn",
languageName: "\u7B80\u4F53\u4E2D\u6587",
// flashcard-modal.tsx
DECKS: "\u5361\u7EC4",
DUE_CARDS: "\u5230\u671F\u5361\u7247",
NEW_CARDS: "\u65B0\u5361\u7247",
TOTAL_CARDS: "\u5168\u90E8\u5361\u7247",
BACK: "\u8FD4\u56DE",
SKIP: "\u7565\u8FC7",
EDIT_CARD: "\u7F16\u8F91\u5361\u7247",
RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247",
HARD: "\u8F83\u96BE",
GOOD: "\u8BB0\u5F97",
EASY: "\u7B80\u5355",
SHOW_ANSWER: "\u663E\u793A\u7B54\u6848",
CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002",
SAVE: "\u4FDD\u5B58",
CANCEL: "\u53D6\u6D88",
NO_INPUT: "\u6CA1\u6709\u63D0\u4F9B\u8F93\u5165\u3002",
CURRENT_EASE_HELP_TEXT: "\u76EE\u524D\u638C\u63E1\u7A0B\u5EA6\uFF1A",
CURRENT_INTERVAL_HELP_TEXT: "\u76EE\u524D\u95F4\u9694\uFF1A",
CARD_GENERATED_FROM: "\u751F\u6210\u81EA\uFF1A${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "\u6253\u5F00\u4E00\u4E2A\u7B14\u8BB0\u5F00\u59CB\u590D\u4E60",
REVIEW_CARDS: "\u590D\u4E60\u5361\u7247",
REVIEW_DIFFICULTY_FILE_MENU: "\u590D\u4E60\uFF1A${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "\u6807\u8BB0\u4E3A\u201C${difficulty}\u201D",
REVIEW_ALL_CARDS: "\u590D\u4E60\u6240\u6709\u7B14\u8BB0\u4E2D\u7684\u5361\u7247",
CRAM_ALL_CARDS: "\u9009\u62E9\u8981\u96C6\u4E2D\u590D\u4E60\u7684\u5361\u7EC4",
REVIEW_CARDS_IN_NOTE: "\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247",
CRAM_CARDS_IN_NOTE: "\u96C6\u4E2D\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247",
VIEW_STATS: "\u67E5\u770B\u6570\u636E",
OPEN_REVIEW_QUEUE_VIEW: "\u5728\u4FA7\u8FB9\u680F\u4E2D\u6253\u5F00\u7B14\u8BB0\u590D\u4E60\u961F\u5217",
STATUS_BAR: "\u590D\u4E60: ${dueNotesCount} \u7B14\u8BB0, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F",
SYNC_TIME_TAKEN: "\u540C\u6B65\u65F6\u95F4 ${t}ms",
NOTE_IN_IGNORED_FOLDER: "\u7B14\u8BB0\u4FDD\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F84\u4E2D\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002",
PLEASE_TAG_NOTE: "\u8BF7\u5C06\u9700\u8981\u590D\u4E60\u7684\u7B14\u8BB0\u4E2D\u52A0\u5165\u6B63\u786E\u7684\u6807\u7B7E\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002",
RESPONSE_RECEIVED: "\u53CD\u9988\u5DF2\u6536\u5230",
NO_DECK_EXISTS: "\u6CA1\u6709 ${deckName} \u5361\u7EC4",
ALL_CAUGHT_UP: "\u90FD\u590D\u4E60\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01",
REVIEW_REMINDER_NOTICE: "\u95EA\u5361\u5DF2\u7ECF\u53EF\u4EE5\u590D\u4E60\u4E86\u3002\u56DE\u5230 Obsidian \u7EE7\u7EED\u5B66\u4E60\u3002",
// scheduling.ts
DAYS_STR_IVL: "${interval}\u5929",
MONTHS_STR_IVL: "${interval}\u6708",
YEARS_STR_IVL: "${interval}\u5E74",
DAYS_STR_IVL_MOBILE: "${interval}\u5929",
MONTHS_STR_IVL_MOBILE: "${interval}\u6708",
YEARS_STR_IVL_MOBILE: "${interval}\u5E74",
// settings.ts
SETTINGS_HEADER: "\u95F4\u9694\u91CD\u590D\u63D2\u4EF6",
GROUP_TAGS_FOLDERS: "\u6807\u7B7E\u548C\u6587\u4EF6\u5939",
GROUP_FLASHCARD_REVIEW: "\u95EA\u5361\u590D\u4E60",
GROUP_FLASHCARD_SEPARATORS: "\u95EA\u5B58\u5361\u5206\u9694\u7B26",
GROUP_DATA_STORAGE: "\u5B58\u50A8\u8BA1\u5212\u6570\u636E",
GROUP_DATA_STORAGE_DESC: "\u9009\u62E9\u5B58\u50A8\u8BA1\u5212\u6570\u636E\u4F4D\u7F6E",
GROUP_FLASHCARDS_NOTES: "\u95EA\u5361\u548C\u7B14\u8BB0",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FBwiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u6587\u4EF6\u5939",
FOLDERS_TO_IGNORE_DESC: "\u5728\u5355\u72EC\u4E00\u884C\u4E2D\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84\u6216\u5168\u5C40\u6A21\u5F0F\uFF0C\u4F8B\u5982 Templates/Scripts \u6216 .excalidraw.md\u3002\u6B64\u8BBE\u7F6E\u5BF9\u95EA\u5B58\u5361\u548C\u7B14\u8BB0\u90FD\u901A\u7528\u3002",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "\u5361\u7247",
FLASHCARD_EASY_LABEL: "\u201C\u7B80\u5355\u201D\u6309\u94AE\u6587\u672C",
FLASHCARD_GOOD_LABEL: "\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u6587\u672C",
FLASHCARD_HARD_LABEL: "\u201C\u8F83\u96BE\u201D\u6309\u94AE\u6587\u672C",
FLASHCARD_EASY_DESC: "\u81EA\u5B9A\u4E49\u201C\u7B80\u5355\u201D\u6309\u94AE\u7684\u6807\u7B7E",
FLASHCARD_GOOD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u7684\u6807\u7B7E",
FLASHCARD_HARD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8F83\u96BE\u201D\u6309\u94AE\u7684\u6807\u7B7E",
REVIEW_BUTTON_DELAY: "\u6309\u94AE\u6309\u4E0B\u5EF6\u8FDF\uFF08\u6BEB\u79D2\uFF09",
REVIEW_BUTTON_DELAY_DESC: "\u5728\u518D\u6B21\u6309\u4E0B\u590D\u4E60\u6309\u94AE\u524D\u589E\u52A0\u5EF6\u8FDF\u3002",
FLASHCARD_TAGS: "\u5361\u7247\u6807\u7B7E",
FLASHCARD_TAGS_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.",
CONVERT_FOLDERS_TO_DECKS: "\u5C06\u6587\u4EF6\u5939\u5185\u5BB9\u8F6C\u6362\u4E3A\u5361\u7247\u7EC4\u548C\u5B50\u5361\u7247\u7EC4",
CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9009\u9879\u4E3A\u5361\u7247\u6807\u7B7E\u9009\u9879\u7684\u66FF\u4EE3\u9009\u9879\u3002",
INLINE_SCHEDULING_COMMENTS: "\u5C06\u8BA1\u5212\u91CD\u590D\u65E5\u671F\u4FDD\u5B58\u5728\u5361\u7247\u6700\u540E\u4E00\u884C\u7684\u540C\u4E00\u884C",
INLINE_SCHEDULING_COMMENTS_DESC: "HTML\u6CE8\u91CA\u4E0D\u518D\u7834\u574F\u5217\u8868\u683C\u5F0F",
BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C06\u5173\u8054\u5361\u7247\u9690\u85CF\u81F3\u4E0B\u4E00\u5929",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u5173\u8054\u5361\u7247\u662F\u6765\u81EA\u540C\u4E00\u5361\u7247\u7684\u4E0D\u540C\u5F62\u5F0F\uFF0C \u4F8B\u5982\uFF1A\u5B8C\u5F62\u586B\u7A7A\u5361\u7247",
SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u663E\u793A\u4E0A\u4E0B\u6587",
SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6807\u9898 > \u526F\u6807\u9898 > \u5C0F\u6807\u9898 > ... > \u5C0F\u6807\u9898",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "\u5C06\u4E0B\u6B21\u590D\u4E60\u65F6\u95F4\u663E\u793A\u5728\u590D\u4E60\u6309\u94AE",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "\u4E86\u89E3\u4F60\u7684\u5361\u7247\u88AB\u63A8\u8FDF\u4E86\u591A\u4E45\u5BF9\u4F60\u5F88\u6709\u7528",
CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4",
CARD_MODAL_SIZE_PERCENT_DESC: "\u8BF7\u5728\u79FB\u52A8\u7AEF\u4F7F\u7528\u5E76\u9700\u8981\u6D4F\u89C8\u8F83\u5927\u56FE\u7247\u65F6\u8BBE\u4E3A100%",
RESET_DEFAULT: "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4",
CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BBD\u5EA6\u767E\u5206\u6BD4",
RANDOMIZE_CARD_ORDER: "\u590D\u4E60\u65F6\u968F\u673A\u663E\u793A\u5361\u7247\uFF1F",
REVIEW_CARD_ORDER_WITHIN_DECK: "\u590D\u4E60\u65F6\u5361\u7247\u7EC4\u5185\u7684\u5361\u7247\u6392\u5E8F",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "\u5361\u7247\u7EC4\u5185\u987A\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u4F18\u5148)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "\u5361\u7247\u7EC4\u5185\u987A\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u4F18\u5148)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "\u5361\u7247\u7EC4\u5185\u4E71\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u4F18\u5148)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "\u5361\u7247\u7EC4\u5185\u4E71\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u4F18\u5148)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "\u5361\u7247\u7EC4\u53CA\u5361\u7247\u90FD\u4E71\u5E8F",
REVIEW_DECK_ORDER: "\u590D\u4E60\u65F6\u5361\u7247\u7EC4\u7684\u6392\u5E8F",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "\u987A\u5E8F (\u5728\u524D\u4E00\u5361\u7247\u7EC4\u5185\u5361\u7247\u90FD\u590D\u4E60\u5B8C\u540E)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "\u4E71\u5E8F (\u5728\u524D\u4E00\u5361\u7247\u7EC4\u5185\u5361\u7247\u90FD\u590D\u4E60\u5B8C\u540E)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "\u5361\u7247\u7EC4\u53CA\u5361\u7247\u90FD\u4E71\u5E8F",
REVIEW_REMINDERS: "\u590D\u4E60\u63D0\u9192",
REVIEW_REMINDERS_DESC: "\u5B9A\u671F\u68C0\u67E5\u662F\u5426\u6709\u65B0\u7684\u6216\u5230\u671F\u7684\u95EA\u5361\uFF0C\u5E76\u5728\u53EF\u4EE5\u590D\u4E60\u65F6\u63D0\u9192\u4F60\u3002",
REVIEW_REMINDER_CHECK_ON_STARTUP: "\u542F\u52A8\u540E\u7ACB\u5373\u68C0\u67E5",
REVIEW_REMINDER_CHECK_ON_STARTUP_DESC: "\u5728 Obsidian \u5E03\u5C40\u5C31\u7EEA\u540E\u7ACB\u5373\u6267\u884C\u4E00\u6B21\u68C0\u67E5\uFF0C\u4E0D\u7B49\u5F85\u9996\u6B21\u5468\u671F\u89E6\u53D1\u3002",
REVIEW_REMINDER_INTERVAL: "\u63D0\u9192\u95F4\u9694\uFF08\u5206\u949F\uFF09",
REVIEW_REMINDER_INTERVAL_DESC: "\u6BCF N \u5206\u949F\u68C0\u67E5\u4E00\u6B21\u3002\u6700\u5C0F 1 \u5206\u949F\uFF0C\u6700\u5927 1440 \u5206\u949F\u3002",
REVIEW_REMINDER_INTERVAL_MIN_WARNING: "\u63D0\u9192\u95F4\u9694\u5FC5\u987B\u662F 1 \u5230 1440 \u4E4B\u95F4\u7684\u6570\u5B57\u3002",
REVIEW_REMINDER_MESSAGE: "\u63D0\u9192\u6D88\u606F",
REVIEW_REMINDER_MESSAGE_DESC: "\u53EF\u9009\u7684\u81EA\u5B9A\u4E49\u63D0\u9192\u6587\u6848\u3002\u7559\u7A7A\u65F6\u4F7F\u7528\u9ED8\u8BA4\u6D88\u606F\u3002",
REVIEW_REMINDER_AUTO_OPEN: "\u81EA\u52A8\u6253\u5F00\u590D\u4E60",
REVIEW_REMINDER_AUTO_OPEN_DESC: "\u542F\u7528\u540E\uFF0C\u63D0\u9192\u89E6\u53D1\u65F6\u4F1A\u76F4\u63A5\u6253\u5F00\u73B0\u6709\u7684\u95EA\u5361\u590D\u4E60\u754C\u9762\u3002",
REVIEW_REMINDER_SHOW_NOTICE: "\u63D0\u9192\u65F6\u663E\u793A\u901A\u77E5",
REVIEW_REMINDER_SHOW_NOTICE_DESC: "\u63D0\u9192\u89E6\u53D1\u65F6\u663E\u793A\u4E00\u4E2A\u4E34\u65F6\u901A\u77E5\u3002",
REVIEW_REMINDER_PLAY_SOUND: "\u63D0\u9192\u65F6\u64AD\u653E\u58F0\u97F3",
REVIEW_REMINDER_PLAY_SOUND_DESC: "\u63D0\u9192\u89E6\u53D1\u65F6\u64AD\u653E\u4E00\u6BB5\u7B80\u77ED\u63D0\u793A\u97F3\u3002",
REVIEW_REMINDER_BOUNCE_DOCK: "\u63D0\u9192\u65F6\u5F39\u8DF3 Dock \u56FE\u6807",
REVIEW_REMINDER_BOUNCE_DOCK_DESC: "\u5728\u684C\u9762\u7AEF\uFF0C\u63D0\u9192\u89E6\u53D1\u65F6\u5F39\u8DF3 Dock \u56FE\u6807\u3002",
DISABLE_CLOZE_CARDS: "\u4E0D\u8FDB\u884C\u5B8C\u5F62\u586B\u7A7A",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C06 ==\u9AD8\u4EAE== \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: '\u6DFB\u52A0/\u5220\u9664 "\u5B8C\u5F62\u586B\u7A7A\u6A21\u5F0F" \u4E2D\u7684 ${defaultPattern}',
CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C06 **\u7C97\u4F53** \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: '\u6DFB\u52A0/\u5220\u9664 "\u5B8C\u5F62\u586B\u7A7A\u6A21\u5F0F" \u4E2D\u7684 ${defaultPattern}',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C06 {{\u5927\u62EC\u53F7}} \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: '\u6DFB\u52A0/\u5220\u9664 "\u5B8C\u5F62\u586B\u7A7A\u6A21\u5F0F" \u4E2D\u7684 ${defaultPattern}',
CLOZE_PATTERNS: "\u5B8C\u5F62\u586B\u7A7A\u6A21\u5F0F",
CLOZE_PATTERNS_DESC: '\u8F93\u5165\u4EE5\u6362\u884C\u7B26\u5206\u9694\u7684\u5B8C\u5F62\u586B\u7A7A\u6A21\u5F0F. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "\u5355\u884C\u5361\u7247\u7684\u5206\u9694\u7B26",
FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9009\u9879\u540E\u4F60\u5C06\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u7B26\u3002",
INLINE_REVERSED_CARDS_SEPARATOR: "\u5355\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26",
MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u7B26",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26",
MULTILINE_CARDS_END_MARKER: "\u8868\u793A\u586B\u7A7A\u548C\u591A\u884C\u95EA\u5361\u7ED3\u675F\u7684\u5B57\u7B26",
NOTES: "\u7B14\u8BB0",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "\u542F\u52A8\u65F6\u5F00\u542F\u7B14\u8BB0\u590D\u4E60\u7A97\u683C",
TAGS_TO_REVIEW: "\u590D\u4E60\u6807\u7B7E",
TAGS_TO_REVIEW_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "\u590D\u4E60\u968F\u673A\u7B14\u8BB0",
OPEN_RANDOM_NOTE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\uFF0C\u7B14\u8BB0\u5C06\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002",
AUTO_NEXT_NOTE: "\u590D\u4E60\u540E\u81EA\u52A8\u6253\u5F00\u4E0B\u4E00\u4E2A\u7B14\u8BB0",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "\u8BF7\u5728\u6587\u4EF6\u83DC\u5355\u4E2D\u542F\u7528\u590D\u4E60\u9009\u9879\uFF08\u4F8B\u5982\uFF1A\u590D\u4E60\uFF1A\u7B80\u5355\u3001\u826F\u597D\u3001\u56F0\u96BE",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u5982\u679C\u60A8\u5728\u6587\u4EF6\u83DC\u5355\u4E2D\u7981\u7528\u590D\u4E60\u9009\u9879\uFF0C\u60A8\u53EF\u4EE5\u4F7F\u7528\u63D2\u4EF6\u547D\u4EE4\u6765\u590D\u4E60\u7B14\u8BB0\uFF0C\u5982\u679C\u60A8\u5B9A\u4E49\u4E86\u76F8\u5173\u5FEB\u6377\u952E\uFF0C\u4E5F\u53EF\u4EE5\u4F7F\u7528\u5B83\u4EEC\u3002",
MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u8FB9\u680F\u4E2D\u663E\u793A\u7684\u6700\u5927\u5929\u6570",
MIN_ONE_DAY: "\u5929\u6570\u6700\u5C0F\u503C\u4E3A1",
VALID_NUMBER_WARNING: "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u6570\u5B57\u3002",
UI: "User Interface",
OPEN_IN_TAB: "\u5728\u65B0\u6807\u7B7E\u6253\u5F00",
OPEN_IN_TAB_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u53EF\u5728\u6A21\u5F0F\u7A97\u53E3\u4E2D\u6253\u5F00\u63D2\u4EF6",
SHOW_STATUS_BAR: "\u663E\u793A\u5728\u72B6\u6001\u680F",
SHOW_STATUS_BAR_DESC: "\u5C06\u6B64\u5173\u95ED\u4EE5\u9690\u85CF Obsidian \u72B6\u6001\u680F\u4E2D\u7684\u5361\u7247\u590D\u4E60\u72B6\u6001\u3002",
SHOW_RIBBON_ICON: "\u5728\u529F\u80FD\u533A\u4E2D\u663E\u793A\u56FE\u6807",
SHOW_RIBBON_ICON_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u53EF\u9690\u85CF Obsidian \u529F\u80FD\u533A\u680F\u4E2D\u7684\u63D2\u4EF6\u56FE\u6807",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u9ED8\u8BA4\u5728\u5217\u8868\u4E2D\u5C55\u5F00\u5D4C\u5957\u5B50\u724C\u7EC4",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u53EF\u6298\u53E0\u540C\u4E00\u5F20\u5361\u7247\u4E2D\u7684\u5D4C\u5957\u724C\u7EC4\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C5E\u4E8E\u540C\u4E00\u6587\u4EF6\u4E2D\u7684\u8BB8\u591A\u5957\u724C\uFF0C\u5219\u5F88\u6709\u7528\u3002",
ALGORITHM: "\u7B97\u6CD5",
CHECK_ALGORITHM_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB\u7B97\u6CD5\u5B9E\u73B0.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6",
BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u8350\u503C\u7EA6250.",
BASE_EASE_MIN_WARNING: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u4E3A130\u3002",
LAPSE_INTERVAL_CHANGE: "\u5C06\u590D\u4E60\u65F6\u6807\u6CE8\u4E3A\u201C\u8F83\u96BE\u201D\u7684\u5361\u7247\u6216\u7B14\u8BB0\u590D\u4E60\u95F4\u9694\u7F29\u77ED",
LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u590D\u4E60\u95F4\u9694 = \u539F\u590D\u4E60\u95F4\u9694 * \u95F4\u9694\u6539\u53D8\u7CFB\u6570 / 100.",
EASY_BONUS: "\u7B80\u5355\u5956\u52B1",
EASY_BONUS_DESC: "\u7B80\u5355\u5956\u52B1\u8BBE\u5B9A\u201C\u8BB0\u5F97\u201D\u548C\u201C\u7B80\u5355\u201D\u5361\u7247\u6216\u7B14\u8BB0\u7684\u590D\u4E60\u95F4\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002",
EASY_BONUS_MIN_WARNING: "\u7B80\u5355\u5956\u52B1\u81F3\u5C11\u4E3A100\u3002",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "\u6700\u5927\u95F4\u9694\uFF08\u5929\uFF09",
MAX_INTERVAL_DESC: "\u8BBE\u5B9A\u590D\u4E60\u7684\u6700\u5927\u95F4\u9694\u65F6\u95F4\uFF08\u9ED8\u8BA4\u503C100\u5E74\uFF09\u3002",
MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u95F4\u9694\u81F3\u5C11\u4E3A1\u5929",
MAX_LINK_CONTRIB: "\u6700\u5927\u94FE\u63A5\u6536\u76CA",
MAX_LINK_CONTRIB_DESC: "\u94FE\u63A5\u7B14\u8BB0\u7684\u52A0\u6743\u638C\u63E1\u7A0B\u5EA6\u5BF9\u539F\u59CB\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5927\u8D21\u732E\u3002",
LOGGING: "\u8BB0\u5F55\u4E2D",
DISPLAY_SCHEDULING_DEBUG_INFO: "\u5728\u5F00\u53D1\u8005\u63A7\u5236\u53F0\u4E2D\u663E\u793A\u8C03\u8BD5\u4FE1\u606F",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "\u7B14\u8BB0\u590D\u4E60\u5E8F\u5217",
CLOSE: "\u4E34\u8FD1",
NEW: "\u65B0",
YESTERDAY: "\u6628\u5929",
TODAY: "\u4ECA\u5929",
TOMORROW: "\u660E\u5929",
// stats-modal.tsx
STATS_TITLE: "\u6570\u636E",
MONTH: "\u6708",
QUARTER: "\u5B63",
YEAR: "\u5E74",
LIFETIME: "\u5168\u90E8",
FORECAST: "\u9884\u671F",
FORECAST_DESC: "\u5C06\u8981\u5230\u671F\u7684\u5361\u7247\u6570\u91CF",
SCHEDULED: "\u5DF2\u6392\u671F",
DAYS: "\u5929",
NUMBER_OF_CARDS: "\u5361\u7247\u6570\u91CF",
REVIEWS_PER_DAY: "\u5E73\u5747: \u590D\u4E60${avg} /\u5929",
INTERVALS: "\u95F4\u9694",
INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u590D\u4E60\u7684\u65F6\u95F4\u95F4\u9694",
COUNT: "\u8BA1\u6570",
INTERVALS_SUMMARY: "\u5E73\u5747\u95F4\u9694\u65F6\u95F4: ${avg}, \u6700\u957F\u95F4\u9694\u65F6\u95F4: ${longest}",
EASES: "\u638C\u63E1\u7A0B\u5EA6",
EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "\u5361\u7247\u7C7B\u578B",
CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C06\u663E\u793A\u9690\u85CF\u7684\u5361\u7247",
CARD_TYPE_NEW: "\u65B0",
CARD_TYPE_YOUNG: "\u8F83\u65B0",
CARD_TYPE_MATURE: "\u719F\u6089",
CARD_TYPES_SUMMARY: "\u603B\u5361\u7247\u6570: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var zh_cn_default = zhCN;
// src/lang/locale/zh-tw.ts
var zhTW = {
...en_default,
language: "zh-tw",
languageName: "\u7E41\u9AD4\u4E2D\u6587",
// flashcard-modal.tsx
DECKS: "\u724C\u7D44",
DUE_CARDS: "\u5230\u671F\u5361\u7247",
NEW_CARDS: "\u65B0\u5361\u7247",
TOTAL_CARDS: "\u5168\u90E8\u5361\u7247",
BACK: "\u8FD4\u56DE",
SKIP: "\u7565\u904E",
EDIT_CARD: "\u7DE8\u8F2F\u5361\u7247",
RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247",
HARD: "\u8F03\u96E3",
GOOD: "\u8A18\u5F97",
EASY: "\u7C21\u55AE",
SHOW_ANSWER: "\u986F\u793A\u7B54\u6848",
CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002",
SAVE: "\u5132\u5B58",
CANCEL: "\u53D6\u6D88",
NO_INPUT: "\u6C92\u6709\u63D0\u4F9B\u8F38\u5165\u3002",
CURRENT_EASE_HELP_TEXT: "\u76EE\u524D\u638C\u63E1\u7A0B\u5EA6\uFF1A",
CURRENT_INTERVAL_HELP_TEXT: "\u76EE\u524D\u9593\u9694\u6642\u9593\uFF1A",
CARD_GENERATED_FROM: "\u751F\u6210\u81EA\uFF1A${notePath}",
VIEW_CARD_INFO: "View Card Info",
// main.ts
OPEN_NOTE_FOR_REVIEW: "\u6253\u958B\u4E00\u500B\u7B46\u8A18\u958B\u59CB\u5FA9\u7FD2",
REVIEW_CARDS: "\u5FA9\u7FD2\u5361\u7247",
REVIEW_DIFFICULTY_FILE_MENU: "\u5FA9\u7FD2\uFF1A${difficulty}",
REVIEW_NOTE_DIFFICULTY_CMD: "\u6A19\u8A18\u70BA\u300C${difficulty}\u300D",
REVIEW_CARDS_IN_NOTE: "\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247",
CRAM_ALL_CARDS: "\u9078\u64C7\u8981\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u7684\u724C\u7D44",
REVIEW_ALL_CARDS: "\u5FA9\u7FD2\u6240\u6709\u7B46\u8A18\u4E2D\u7684\u5361\u7247",
CRAM_CARDS_IN_NOTE: "\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247",
VIEW_STATS: "\u6AA2\u8996\u6578\u64DA",
OPEN_REVIEW_QUEUE_VIEW: "Open Notes Review Queue in sidebar",
STATUS_BAR: "\u5FA9\u7FD2: ${dueNotesCount} \u7B46\u8A18, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F",
SYNC_TIME_TAKEN: "\u540C\u6B65\u6642\u9593 ${t}ms",
NOTE_IN_IGNORED_FOLDER: "\u7B46\u8A18\u5132\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F91\u4E2D\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002",
PLEASE_TAG_NOTE: "\u8ACB\u5C07\u9700\u8981\u5FA9\u7FD2\u7684\u7B46\u8A18\u4E2D\u52A0\u5165\u6B63\u78BA\u7684\u6A19\u7C64\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002",
RESPONSE_RECEIVED: "\u56DE\u994B\u5DF2\u6536\u5230",
NO_DECK_EXISTS: "\u6C92\u6709 ${deckName} \u724C\u7D44",
ALL_CAUGHT_UP: "\u90FD\u5FA9\u7FD2\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01",
// scheduling.ts
DAYS_STR_IVL: "${interval}\u5929",
MONTHS_STR_IVL: "${interval}\u6708",
YEARS_STR_IVL: "${interval}\u5E74",
DAYS_STR_IVL_MOBILE: "${interval}\u5929",
MONTHS_STR_IVL_MOBILE: "${interval}\u6708",
YEARS_STR_IVL_MOBILE: "${interval}\u5E74",
// settings.ts
SETTINGS_HEADER: "\u9593\u9694\u91CD\u8907\u5916\u639B",
GROUP_TAGS_FOLDERS: "Tags & Folders",
GROUP_FLASHCARD_REVIEW: "Flashcard Review",
GROUP_FLASHCARD_SEPARATORS: "Flashcard Separators",
GROUP_DATA_STORAGE: "Storage of Scheduling Data",
GROUP_DATA_STORAGE_DESC: "Choose where to store the scheduling data",
GROUP_FLASHCARDS_NOTES: "Flashcards & Notes",
GROUP_CONTRIBUTING: "Contributing",
CHECK_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078wiki.',
GITHUB_DISCUSSIONS: 'Visit the discussions section for Q&A help, feedback, and general discussion.',
GITHUB_ISSUES: 'Raise an issue here if you have a feature request or a bug report.',
GITHUB_SOURCE_CODE: 'The project\'s source code is available on GitHub.',
CODE_CONTRIBUTION_INFO: 'Here\'s how to contribute code to the plugin.',
TRANSLATION_CONTRIBUTION_INFO: 'Here\'s how to translate the plugin to another language.',
FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u8CC7\u6599\u593E",
FOLDERS_TO_IGNORE_DESC: "Enter folder paths or glob patterns on separate lines e.g. Templates/Scripts or **/*.excalidraw.md. This setting is common to both flashcards and notes.",
OBSIDIAN_INTEGRATION: "Integration into Obsidian",
FLASHCARDS: "\u5361\u7247",
FLASHCARD_EASY_LABEL: "\u7C21\u55AE\u6309\u9215\u6587\u5B57",
FLASHCARD_GOOD_LABEL: "\u8A18\u5F97\u6309\u9215\u6587\u5B57",
FLASHCARD_HARD_LABEL: "\u8F03\u96E3\u6309\u9215\u6587\u5B57",
FLASHCARD_EASY_DESC: "\u81EA\u8A02\u300C\u7C21\u55AE\u300D\u6309\u9215\u7684\u6A19\u7C64",
FLASHCARD_GOOD_DESC: "\u81EA\u8A02\u300C\u8A18\u5F97\u300D\u6309\u9215\u7684\u6A19\u7C64",
FLASHCARD_HARD_DESC: "\u81EA\u8A02\u300C\u8F03\u96E3\u300D\u6309\u9215\u7684\u6A19\u7C64",
REVIEW_BUTTON_DELAY: "Button Press Delay (ms)",
REVIEW_BUTTON_DELAY_DESC: "Add a delay to the review buttons before they can be pressed again.",
FLASHCARD_TAGS: "\u5361\u7247\u6A19\u7C64",
FLASHCARD_TAGS_DESC: "\u8F38\u5165\u6A19\u7C64\uFF08\u7528\u7A7A\u767D\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.",
CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C07\u8CC7\u6599\u593E\u5167\u5BB9\u8F49\u63DB\u70BA\u724C\u7D44\u548C\u5B50\u724C\u7D44\uFF1F",
CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9078\u9805\u70BA\u5361\u7247\u6A19\u7C64\u9078\u9805\u7684\u66FF\u4EE3\u9078\u9805\u3002",
INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C07\u8A08\u5283\u91CD\u8907\u6642\u9593\u5132\u5B58\u5728\u5361\u7247\u6700\u5F8C\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F",
INLINE_SCHEDULING_COMMENTS_DESC: "\u52FE\u9078\u5F8CHTML\u8A3B\u89E3\u4E0D\u6703\u7834\u58DE\u5217\u8868\u683C\u5F0F\u554F\u984C\u3002",
BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C07\u53CD\u8F49\u5361\u7247\u96B1\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F",
BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u53CD\u8F49\u5361\u7247\u7531\u540C\u4E00\u5361\u7247\u6587\u5B57\u7522\u751F\uFF0C\u4F8B\u5982\uFF1A\u586B\u7A7A\u514B\u6F0F\u5B57",
SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u986F\u793A\u4E0A\u4E0B\u6587\uFF1F",
SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6A19\u984C > \u526F\u6A19\u984C > \u5C0F\u6A19\u984C > ... > \u5C0F\u6A19\u984C",
SHOW_INTERVAL_IN_REVIEW_BUTTONS: "Show next review time in the review buttons",
SHOW_INTERVAL_IN_REVIEW_BUTTONS_DESC: "Useful to know how far in the future your cards are being pushed.",
CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4",
CARD_MODAL_SIZE_PERCENT_DESC: "\u5728\u79FB\u52D5\u7AEF\u6216\u9700\u8981\u8F03\u5927\u5716\u7247\u6642\u61C9\u8A2D\u5B9A\u70BA100%",
RESET_DEFAULT: "\u91CD\u7F6E\u70BA\u9810\u8A2D\u503C",
CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BEC\u5EA6\u767E\u5206\u6BD4",
RANDOMIZE_CARD_ORDER: "\u5FA9\u7FD2\u6642\u96A8\u6A5F\u986F\u793A\u5361\u7247\uFF1F",
REVIEW_CARD_ORDER_WITHIN_DECK: "\u5FA9\u7FD2\u6642\u724C\u7D44\u5167\u7684\u5361\u7247\u6392\u5E8F",
REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL: "\u724C\u7D44\u5167\u9806\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u512A\u5148)",
REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL: "\u724C\u7D44\u5167\u9806\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u512A\u5148)",
REVIEW_CARD_ORDER_NEW_FIRST_RANDOM: "\u724C\u7D44\u5167\u4E82\u5E8F (\u5168\u90E8\u65B0\u5361\u7247\u512A\u5148)",
REVIEW_CARD_ORDER_DUE_FIRST_RANDOM: "\u724C\u7D44\u5167\u4E82\u5E8F (\u5168\u90E8\u5230\u671F\u5361\u7247\u512A\u5148)",
REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD: "\u724C\u7D44\u53CA\u5361\u7247\u90FD\u4E82\u5E8F",
REVIEW_DECK_ORDER: "\u5FA9\u7FD2\u6642\u724C\u7D44\u7684\u6392\u5E8F",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL: "\u9806\u5E8F (\u5728\u524D\u4E00\u724C\u7D44\u5167\u5361\u7247\u90FD\u5FA9\u7FD2\u5B8C\u5F8C)",
REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM: "\u4E82\u5E8F (\u5728\u524D\u4E00\u724C\u7D44\u5167\u5361\u7247\u90FD\u5FA9\u7FD2\u5B8C\u5F8C)",
REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD: "\u724C\u7D44\u53CA\u5361\u7247\u90FD\u4E82\u5E8F",
DISABLE_CLOZE_CARDS: "\u505C\u7528\u586B\u7A7A\u514B\u6F0F\u5B57\u5361\u7247\uFF1F",
CONVERT_CLOZE_PATTERNS_TO_INPUTS: "Convert cloze patterns to input fields",
CONVERT_CLOZE_PATTERNS_TO_INPUTS_DESC: "Replace cloze patterns with input fields when reviewing cloze cards.",
CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C07 ==\u9AD8\u4EAE== \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F",
CONVERT_HIGHLIGHTS_TO_CLOZES_DESC: '\u5728 "\u586B\u7A7A\u514B\u6F0F\u5B57\u6A21\u5F0F" \u4E2D\u52A0\u5165/\u79FB\u9664 ${defaultPattern}',
CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C07 **\u7C97\u9AD4** \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F",
CONVERT_BOLD_TEXT_TO_CLOZES_DESC: '\u5728 "\u586B\u7A7A\u514B\u6F0F\u5B57\u6A21\u5F0F" \u4E2D\u52A0\u5165/\u79FB\u9664 ${defaultPattern}',
CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C07 {{\u5927\u62EC\u865F}} \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F",
CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC: '\u5728 "\u586B\u7A7A\u514B\u6F0F\u5B57\u6A21\u5F0F" \u4E2D\u52A0\u5165/\u79FB\u9664 ${defaultPattern}',
CLOZE_PATTERNS: "\u586B\u7A7A\u514B\u6F0F\u5B57\u6A21\u5F0F",
CLOZE_PATTERNS_DESC: '\u8F38\u5165\u4EE5\u63DB\u884C\u7B26\u5206\u9694\u7684\u586B\u7A7A\u514B\u6F0F\u5B57\u6A21\u5F0F. Check the wiki for guidance.',
INLINE_CARDS_SEPARATOR: "\u55AE\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9078\u9805\u5F8C\u4F60\u5C07\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u5B57\u5143\u3002",
INLINE_REVERSED_CARDS_SEPARATOR: "\u55AE\u884C\u53CD\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143",
MULTILINE_CARDS_END_MARKER: "\u8868\u793A\u586B\u7A7A\u548C\u591A\u884C\u95EA\u5361\u7ED3\u675F\u7684\u5B57\u7B26",
NOTES: "\u7B46\u8A18",
NOTE: "Note",
REVIEW_PANE_ON_STARTUP: "\u555F\u52D5\u6642\u958B\u555F\u7B46\u8A18\u5FA9\u7FD2\u7A97\u683C",
TAGS_TO_REVIEW: "\u5FA9\u7FD2\u6A19\u7C64",
TAGS_TO_REVIEW_DESC: "\u8F38\u5165\u6A19\u7C64\uFF0C\u7528\u7A7A\u683C\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.",
OPEN_RANDOM_NOTE: "\u5FA9\u7FD2\u96A8\u6A5F\u7B46\u8A18",
OPEN_RANDOM_NOTE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\uFF0C\u7B46\u8A18\u5C07\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002",
AUTO_NEXT_NOTE: "\u5FA9\u7FD2\u5F8C\u81EA\u52D5\u6253\u958B\u4E0B\u4E00\u500B\u7B46\u8A18",
ENABLE_FILE_MENU_REVIEW_OPTIONS: "\u8ACB\u5728\u6A94\u6848\u9078\u55AE\u4E2D\u555F\u7528\u6AA2\u8996\u9078\u9805\uFF08\u4F8B\u5982\uFF1A\u6AA2\u8996\uFF1A\u7C21\u55AE\u3001\u8A18\u5F97\u3001\u8F03\u96E3\uFF09",
ENABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u5982\u679C\u60A8\u5728\u6A94\u6848\u9078\u55AE\u4E2D\u505C\u7528\u6AA2\u8996\u9078\u9805\uFF0C\u60A8\u53EF\u4EE5\u4F7F\u7528\u63D2\u4EF6\u6307\u4EE4\u6AA2\u8996\u7B46\u8A18\uFF0C\u5982\u679C\u6709\u8A2D\u5B9A\uFF0C\u4E5F\u53EF\u4EE5\u4F7F\u7528\u76F8\u95DC\u7684\u5FEB\u6377\u9375\u3002",
MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u908A\u9762\u677F\u986F\u793A\u7684\u6700\u5927\u5929\u6578",
MIN_ONE_DAY: "\u5929\u6578\u6700\u5C0F\u503C\u70BA1",
VALID_NUMBER_WARNING: "\u8ACB\u8F38\u5165\u6709\u6548\u7684\u6578\u5B57\u3002",
UI: "User Interface",
OPEN_IN_TAB: "Open in new tab",
OPEN_IN_TAB_DESC: "Turn this off to open the plugin in a modal window",
SHOW_STATUS_BAR: "Show status bar",
SHOW_STATUS_BAR_DESC: "Turn this off to hide the flashcard's review status in Obsidian's status bar",
SHOW_RIBBON_ICON: "Show icon in the ribbon bar",
SHOW_RIBBON_ICON_DESC: "Turn this off to hide the plugin icon from Obsidian's ribbon bar",
INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u724C\u7D44\u6A39\u6700\u521D\u61C9\u986F\u793A\u70BA\u5C55\u958B",
INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\u53EF\u647A\u758A\u540C\u4E00\u5F35\u5361\u7247\u4E2D\u7684\u5DE2\u72C0\u724C\u7D44\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C6C\u65BC\u540C\u4E00\u6A94\u6848\u4E2D\u7684\u8A31\u591A\u5957\u724C\uFF0C\u5247\u5F88\u6709\u7528\u3002",
ALGORITHM: "\u6F14\u7B97\u6CD5",
CHECK_ALGORITHM_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078\u7B97\u6CD5\u5BE6\u73FE.',
SM2_OSR_VARIANT: "OSR's variant of SM-2",
BASE_EASE: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6",
BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u85A6\u503C\u7D04250.",
BASE_EASE_MIN_WARNING: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u70BA130\u3002",
LAPSE_INTERVAL_CHANGE: "\u5C07\u5FA9\u7FD2\u6642\u6A19\u8A3B\u70BA\u300C\u8F03\u96E3\u300D\u7684\u5361\u7247\u6216\u7B46\u8A18\u5FA9\u7FD2\u9593\u9694\u7E2E\u77ED",
LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u5FA9\u7FD2\u9593\u9694 = \u539F\u5FA9\u7FD2\u9593\u9694 * \u9593\u9694\u6539\u8B8A\u4FC2\u6578 / 100.",
EASY_BONUS: "\u7C21\u55AE\u734E\u52F5",
EASY_BONUS_DESC: "\u7C21\u55AE\u734E\u52F5\u8A2D\u5B9A\u300C\u8A18\u5F97\u300D\u548C\u300C\u7C21\u55AE\u300D\u5361\u7247\u6216\u7B46\u8A18\u7684\u5FA9\u7FD2\u9593\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002",
EASY_BONUS_MIN_WARNING: "\u7C21\u55AE\u734E\u52F5\u81F3\u5C11\u70BA100\u3002",
LOAD_BALANCE: "Enable load balancer",
LOAD_BALANCE_DESC: `Slightly tweaks the interval so that the number of reviews per day is more consistent.
It's like Anki's fuzz but instead of being random, it picks the day with the least amount of reviews.
It's turned off for small intervals.`,
MAX_INTERVAL: "\u6700\u5927\u9593\u9694\uFF08\u5929\uFF09",
MAX_INTERVAL_DESC: "\u8A2D\u5B9A\u5FA9\u7FD2\u7684\u6700\u5927\u9593\u9694\u6642\u9593\uFF08\u9810\u8A2D\u503C100\u5E74\uFF09\u3002",
MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u9593\u9694\u81F3\u5C11\u70BA1\u5929",
MAX_LINK_CONTRIB: "\u6700\u5927\u93C8\u63A5\u8CA2\u737B",
MAX_LINK_CONTRIB_DESC: "\u93C8\u63A5\u7B46\u8A18\u7684\u52A0\u6B0A\u638C\u63E1\u7A0B\u5EA6\u5C0D\u539F\u59CB\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5927\u8CA2\u737B\u3002",
LOGGING: "\u8A18\u9304\u4E2D",
DISPLAY_SCHEDULING_DEBUG_INFO: "\u5728\u958B\u767C\u8005\u63A7\u5236\u53F0\u4E2D\u986F\u793A\u9664\u932F\u8CC7\u8A0A",
DISPLAY_PARSER_DEBUG_INFO: "Show the parser's debugging information on the developer console",
SCHEDULING: "Scheduling",
EXPERIMENTAL: "Experimental",
HELP: "Help",
STORE_IN_NOTES: "In the notes",
DELETE_SCHEDULING_DATA_ALL: "Delete Scheduling Data",
DELETE_SCHEDULING_DATA_ALL_DESC: "Delete scheduling data from all notes and flashcards.",
DELETE: "Delete",
CONFIRM_SCHEDULING_DATA_ALL_DELETION: "Are you sure you want to delete all scheduling data from your notes and flashcards? This action cannot be undone.",
CONFIRM: "Confirm",
SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS: "Scheduling data deletion in progress...",
SCHEDULING_DATA_HAS_BEEN_DELETED: "Scheduling data has been deleted from all notes and flashcards.",
// sidebar.ts
NOTES_REVIEW_QUEUE: "\u7B46\u8A18\u5FA9\u7FD2\u5E8F\u5217",
CLOSE: "\u81E8\u8FD1",
NEW: "\u65B0",
YESTERDAY: "\u6628\u5929",
TODAY: "\u4ECA\u5929",
TOMORROW: "\u660E\u5929",
// stats-modal.tsx
STATS_TITLE: "\u7D71\u8A08",
MONTH: "\u6708",
QUARTER: "\u5B63",
YEAR: "\u5E74",
LIFETIME: "\u5168\u90E8",
FORECAST: "\u9810\u6E2C",
FORECAST_DESC: "\u5C07\u8981\u5230\u671F\u7684\u5361\u7247\u6578\u91CF",
SCHEDULED: "\u5DF2\u6392\u7A0B",
DAYS: "\u5929",
NUMBER_OF_CARDS: "\u5361\u7247\u6578\u91CF",
REVIEWS_PER_DAY: "\u5E73\u5747: \u5FA9\u7FD2${avg} /\u5929",
INTERVALS: "\u9593\u9694",
INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u5FA9\u7FD2\u7684\u6642\u9593\u9593\u9694",
COUNT: "\u8A08\u6578",
INTERVALS_SUMMARY: "\u5E73\u5747\u9593\u9694\u6642\u9593: ${avg}, \u6700\u9577\u9593\u9694\u6642\u9593: ${longest}",
EASES: "\u638C\u63E1\u7A0B\u5EA6",
EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}",
EASE: "Ease",
CARD_TYPES: "\u5361\u7247\u578B\u5225",
CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C07\u986F\u793A\u96B1\u85CF\u7684\u5361\u7247",
CARD_TYPE_NEW: "\u65B0",
CARD_TYPE_YOUNG: "\u8F03\u65B0",
CARD_TYPE_MATURE: "\u719F\u6089",
CARD_TYPES_SUMMARY: "\u7E3D\u5361\u7247\u6578: ${totalCardsCount}",
SEARCH: "Search",
PREVIOUS: "Previous",
NEXT: "Next",
// settings.ts
SETTINGS_TAB_HEADING: "Settings",
MAIN_SETTINGS_PAGE: "MAIN_SETTINGS",
// NoteReviewQueue.ts
NOTE_REVIEW_QUEUE_HINT: "Click on the 3 dots next to the note to open the review menu.",
// StatusBarManager.ts
OPEN_DECK_FOR_REVIEW: "Open deck for review",
UPDATE_AVAILABLE: "Update available",
// Statistics
PERIOD_TITLE: "Period",
PERIOD_DESC: "Period of time to display in the charts",
// Card controls reset button
DELETE_SCHEDULING_DATA_OF_CURRENT_CARD: "Delete card scheduling data?",
CONFIRM_SCHEDULING_DATA_DELETION_OF_CURRENT_CARD: "Are you sure you want to delete the scheduling data from your current card? This action cannot be undone.",
SCHEDULING_DATA_DELETION_IN_PROGRESS_OF_CURRENT_CARD: "Deleting the cards scheduling data...",
// Settings > Scheduling
START_OF_DAY: "Start of day",
START_OF_DAY_DESC: "The time at which the day begins (Format: HH:MM:SS, Default: 00:00:00)",
INVALID_START_OF_DAY_WARNING: "Invalid format for start of day",
// Settings > main-page
INFO: "Info",
// Card responses
AGAIN: "Again",
// Settings > info
CHECK_ROADMAP: 'Check out the roadmap for upcoming features.',
CHECK_DEV_NEWS: 'Check out the dev news for the latest development news.'
};
var zh_tw_default = zhTW;
// src/lang/locale-manager.ts
var LocaleManagerInstance = class _LocaleManagerInstance {
static getInstance() {
if (!_LocaleManagerInstance.instance) {
throw new Error("there is no QuestionDataStore instance.");
}
return _LocaleManagerInstance.instance;
}
};
var LocaleManager = class {
// The locale map
constructor() {
this.loadedLocale = import_obsidian.moment.locale();
this.currentLocale = this.loadedLocale;
this.localeMap = {
af: af_default,
ar: ar_default,
bn: bn_default,
cs: cz_default,
da: da_default,
de: de_default,
en: en_default,
"en-gb": en_gb_default,
es: es_default,
fr: fr_default,
hi: hi_default,
id: id_default,
it: it_default,
ja: ja_default,
ko: ko_default,
mr: mr_default,
nl: nl_default,
nn: no_default,
pl: pl_default,
pt: pt_default,
"pt-br": pt_br_default,
ro: ro_default,
ru: ru_default,
sw: sw_default,
ta: ta_default,
te: te_default,
th: th_default,
tr: tr_default,
uk: uk_default,
ur: ur_default,
vi: vi_default,
"zh-cn": zh_cn_default,
"zh-tw": zh_tw_default
};
}
/**
* Gets the current translation.
*/
currentTranslation() {
const currentLocale = LocaleManagerInstance.getInstance().currentLocale;
const currentLocaleMap = this.localeMap[currentLocale];
if (!currentLocaleMap) {
console.warn(`SRS error: Locale ${currentLocale} not found.`);
}
return currentLocaleMap;
}
/**
* Gets the current locale name.
*/
currentLocaleName() {
return this.currentTranslation().languageName;
}
/**
* Gets the current locale code.
*/
currentLocaleCode() {
return this.currentTranslation().language;
}
/**
* Gets the list of available locales.
*/
getLocaleOptionsList() {
return Object.keys(this.localeMap).map((locale) => ({
language: locale,
languageName: this.localeMap[locale].languageName
}));
}
};
// src/lang/helpers.ts
LocaleManagerInstance.instance = new LocaleManager();
function insertParameters(translation, params) {
const names2 = Object.keys(params);
const vals = Object.values(params);
function replaceNamesWithValues(translation2, names3, vals2) {
let result = translation2;
for (let i2 = 0; i2 < names3.length; i2++) {
const name = names3[i2];
const value = `${vals2[i2]}`;
result = result.replace("${" + name + "}", value);
}
return result;
}
return replaceNamesWithValues(translation, names2, vals);
}
function t(translationKey, params) {
const currentLocale = LocaleManagerInstance.getInstance().currentLocale;
const currentLocaleMap = LocaleManagerInstance.getInstance().currentTranslation();
const translation = currentLocale && currentLocaleMap[translationKey] || en_default[translationKey];
if (params) {
return insertParameters(translation, params);
}
return translation;
}
function tHTML(translationKey, params) {
return parseHTMLTags(t(translationKey, params)).map(
(translationElement) => translationElement.element
);
}
function parseHTMLTags(translation) {
const resultArray = [];
for (let currentPosition = 0; currentPosition < translation.length; currentPosition++) {
const anchorPosition = translation.indexOf(" currentPosition) {
const startOfText = resultArray.length === 0 ? 0 : resultArray[resultArray.length - 1].end + 1;
const endOfText = noTagsFound ? translation.length - 1 : relevantPosition - 1;
resultArray.push(createTranslationTextElement(translation, startOfText, endOfText));
if (noTagsFound) break;
}
if (handleAnchorFirst) {
const linkRegex = /is 1 or more portions //is 1 or more portions // is any portion other than ., .., '', or ** //
is . or '' // // **/.. is *brutal* for filesystem walking performance, because // it effectively resets the recursive walk each time it occurs, // and ** cannot be reduced out by a .. pattern part like a regexp // or most strings (other than .., ., and '') can be. // // /**/..//
/
-> { /..//
/
, /**//
/
} // // -> /// //../
-> /// **/**/ -> **/ // // **/*/ -> */**/ <== not valid because ** doesn't follow // this WOULD be allowed if ** did follow symlinks, or * didn't firstPhasePreProcess(globParts) { let didSomething = false; do { didSomething = false; for (let parts of globParts) { let gs = -1; while (-1 !== (gs = parts.indexOf("**", gs + 1))) { let gss = gs; while (parts[gss + 1] === "**") { gss++; } if (gss > gs) { parts.splice(gs + 1, gss - gs); } let next = parts[gs + 1]; const p2 = parts[gs + 2]; const p22 = parts[gs + 3]; if (next !== "..") continue; if (!p2 || p2 === "." || p2 === ".." || !p22 || p22 === "." || p22 === "..") { continue; } didSomething = true; parts.splice(gs, 1); const other = parts.slice(0); other[gs] = "**"; globParts.push(other); gs--; } if (!this.preserveMultipleSlashes) { for (let i2 = 1; i2 < parts.length - 1; i2++) { const p2 = parts[i2]; if (i2 === 1 && p2 === "" && parts[0] === "") continue; if (p2 === "." || p2 === "") { didSomething = true; parts.splice(i2, 1); i2--; } } if (parts[0] === "." && parts.length === 2 && (parts[1] === "." || parts[1] === "")) { didSomething = true; parts.pop(); } } let dd = 0; while (-1 !== (dd = parts.indexOf("..", dd + 1))) { const p2 = parts[dd - 1]; if (p2 && p2 !== "." && p2 !== ".." && p2 !== "**") { didSomething = true; const needDot = dd === 1 && parts[dd + 1] === "**"; const splin = needDot ? ["."] : []; parts.splice(dd - 1, 2, ...splin); if (parts.length === 0) parts.push(""); dd -= 2; } } } } while (didSomething); return globParts; } // second phase: multi-pattern dedupes // { /*/, //
} -> /*/// { /, /} -> /// { /**/, /} -> /**/// // { /**/, /**//
} -> /**/// ^-- not valid because ** doens't follow symlinks secondPhasePreProcess(globParts) { for (let i2 = 0; i2 < globParts.length - 1; i2++) { for (let j2 = i2 + 1; j2 < globParts.length; j2++) { const matched = this.partsMatch(globParts[i2], globParts[j2], !this.preserveMultipleSlashes); if (matched) { globParts[i2] = []; globParts[j2] = matched; break; } } } return globParts.filter((gs) => gs.length); } partsMatch(a2, b2, emptyGSMatch = false) { let ai = 0; let bi = 0; let result = []; let which = ""; while (ai < a2.length && bi < b2.length) { if (a2[ai] === b2[bi]) { result.push(which === "b" ? b2[bi] : a2[ai]); ai++; bi++; } else if (emptyGSMatch && a2[ai] === "**" && b2[bi] === a2[ai + 1]) { result.push(a2[ai]); ai++; } else if (emptyGSMatch && b2[bi] === "**" && a2[ai] === b2[bi + 1]) { result.push(b2[bi]); bi++; } else if (a2[ai] === "*" && b2[bi] && (this.options.dot || !b2[bi].startsWith(".")) && b2[bi] !== "**") { if (which === "b") return false; which = "a"; result.push(a2[ai]); ai++; bi++; } else if (b2[bi] === "*" && a2[ai] && (this.options.dot || !a2[ai].startsWith(".")) && a2[ai] !== "**") { if (which === "a") return false; which = "b"; result.push(b2[bi]); ai++; bi++; } else { return false; } } return a2.length === b2.length && result; } parseNegate() { if (this.nonegate) return; const pattern = this.pattern; let negate = false; let negateOffset = 0; for (let i2 = 0; i2 < pattern.length && pattern.charAt(i2) === "!"; i2++) { negate = !negate; negateOffset++; } if (negateOffset) this.pattern = pattern.slice(negateOffset); this.negate = negate; } // set partial to true to test if, for example, // "/a/b" matches the start of "/*/b/*/d" // Partial means, if you run out of file before you run // out of pattern, then that's fine, as long as all // the parts match. matchOne(file, pattern, partial = false) { let fileStartIndex = 0; let patternStartIndex = 0; if (this.isWindows) { const fileDrive = typeof file[0] === "string" && /^[a-z]:$/i.test(file[0]); const fileUNC = !fileDrive && file[0] === "" && file[1] === "" && file[2] === "?" && /^[a-z]:$/i.test(file[3]); const patternDrive = typeof pattern[0] === "string" && /^[a-z]:$/i.test(pattern[0]); const patternUNC = !patternDrive && pattern[0] === "" && pattern[1] === "" && pattern[2] === "?" && typeof pattern[3] === "string" && /^[a-z]:$/i.test(pattern[3]); const fdi = fileUNC ? 3 : fileDrive ? 0 : void 0; const pdi = patternUNC ? 3 : patternDrive ? 0 : void 0; if (typeof fdi === "number" && typeof pdi === "number") { const [fd, pd] = [ file[fdi], pattern[pdi] ]; if (fd.toLowerCase() === pd.toLowerCase()) { pattern[pdi] = fd; patternStartIndex = pdi; fileStartIndex = fdi; } } } const { optimizationLevel = 1 } = this.options; if (optimizationLevel >= 2) { file = this.levelTwoFileOptimize(file); } if (pattern.includes(GLOBSTAR)) { return __privateMethod(this, _Minimatch_instances, matchGlobstar_fn).call(this, file, pattern, partial, fileStartIndex, patternStartIndex); } return __privateMethod(this, _Minimatch_instances, matchOne_fn).call(this, file, pattern, partial, fileStartIndex, patternStartIndex); } braceExpand() { return braceExpand(this.pattern, this.options); } parse(pattern) { assertValidPattern(pattern); const options = this.options; if (pattern === "**") return GLOBSTAR; if (pattern === "") return ""; let m2; let fastTest = null; if (m2 = pattern.match(starRE)) { fastTest = options.dot ? starTestDot : starTest; } else if (m2 = pattern.match(starDotExtRE)) { fastTest = (options.nocase ? options.dot ? starDotExtTestNocaseDot : starDotExtTestNocase : options.dot ? starDotExtTestDot : starDotExtTest)(m2[1]); } else if (m2 = pattern.match(qmarksRE)) { fastTest = (options.nocase ? options.dot ? qmarksTestNocaseDot : qmarksTestNocase : options.dot ? qmarksTestDot : qmarksTest)(m2); } else if (m2 = pattern.match(starDotStarRE)) { fastTest = options.dot ? starDotStarTestDot : starDotStarTest; } else if (m2 = pattern.match(dotStarRE)) { fastTest = dotStarTest; } const re = AST.fromGlob(pattern, this.options).toMMPattern(); if (fastTest && typeof re === "object") { Reflect.defineProperty(re, "test", { value: fastTest }); } return re; } makeRe() { if (this.regexp || this.regexp === false) return this.regexp; const set2 = this.set; if (!set2.length) { this.regexp = false; return this.regexp; } const options = this.options; const twoStar = options.noglobstar ? star2 : options.dot ? twoStarDot : twoStarNoDot; const flags = new Set(options.nocase ? ["i"] : []); let re = set2.map((pattern) => { const pp = pattern.map((p2) => { if (p2 instanceof RegExp) { for (const f2 of p2.flags.split("")) flags.add(f2); } return typeof p2 === "string" ? regExpEscape2(p2) : p2 === GLOBSTAR ? GLOBSTAR : p2._src; }); pp.forEach((p2, i2) => { const next = pp[i2 + 1]; const prev = pp[i2 - 1]; if (p2 !== GLOBSTAR || prev === GLOBSTAR) { return; } if (prev === void 0) { if (next !== void 0 && next !== GLOBSTAR) { pp[i2 + 1] = "(?:\\/|" + twoStar + "\\/)?" + next; } else { pp[i2] = twoStar; } } else if (next === void 0) { pp[i2 - 1] = prev + "(?:\\/|\\/" + twoStar + ")?"; } else if (next !== GLOBSTAR) { pp[i2 - 1] = prev + "(?:\\/|\\/" + twoStar + "\\/)" + next; pp[i2 + 1] = GLOBSTAR; } }); const filtered = pp.filter((p2) => p2 !== GLOBSTAR); if (this.partial && filtered.length >= 1) { const prefixes = []; for (let i2 = 1; i2 <= filtered.length; i2++) { prefixes.push(filtered.slice(0, i2).join("/")); } return "(?:" + prefixes.join("|") + ")"; } return filtered.join("/"); }).join("|"); const [open, close] = set2.length > 1 ? ["(?:", ")"] : ["", ""]; re = "^" + open + re + close + "$"; if (this.partial) { re = "^(?:\\/|" + open + re.slice(1, -1) + close + ")$"; } if (this.negate) re = "^(?!" + re + ").+$"; try { this.regexp = new RegExp(re, [...flags].join("")); } catch (e2) { this.regexp = false; } return this.regexp; } slashSplit(p2) { if (this.preserveMultipleSlashes) { return p2.split("/"); } else if (this.isWindows && /^\/\/[^/]+/.test(p2)) { return ["", ...p2.split(/\/+/)]; } else { return p2.split(/\/+/); } } match(f2, partial = this.partial) { this.debug("match", f2, this.pattern); if (this.comment) { return false; } if (this.empty) { return f2 === ""; } if (f2 === "/" && partial) { return true; } const options = this.options; if (this.isWindows) { f2 = f2.split("\\").join("/"); } const ff = this.slashSplit(f2); this.debug(this.pattern, "split", ff); const set2 = this.set; this.debug(this.pattern, "set", set2); let filename = ff[ff.length - 1]; if (!filename) { for (let i2 = ff.length - 2; !filename && i2 >= 0; i2--) { filename = ff[i2]; } } for (const pattern of set2) { let file = ff; if (options.matchBase && pattern.length === 1) { file = [filename]; } const hit = this.matchOne(file, pattern, partial); if (hit) { if (options.flipNegate) { return true; } return !this.negate; } } if (options.flipNegate) { return false; } return this.negate; } static defaults(def) { return minimatch.defaults(def).Minimatch; } }; _Minimatch_instances = new WeakSet(); matchGlobstar_fn = function(file, pattern, partial, fileIndex, patternIndex) { const firstgs = pattern.indexOf(GLOBSTAR, patternIndex); const lastgs = pattern.lastIndexOf(GLOBSTAR); const [head, body, tail] = partial ? [ pattern.slice(patternIndex, firstgs), pattern.slice(firstgs + 1), [] ] : [ pattern.slice(patternIndex, firstgs), pattern.slice(firstgs + 1, lastgs), pattern.slice(lastgs + 1) ]; if (head.length) { const fileHead = file.slice(fileIndex, fileIndex + head.length); if (!__privateMethod(this, _Minimatch_instances, matchOne_fn).call(this, fileHead, head, partial, 0, 0)) { return false; } fileIndex += head.length; patternIndex += head.length; } let fileTailMatch = 0; if (tail.length) { if (tail.length + fileIndex > file.length) return false; let tailStart = file.length - tail.length; if (__privateMethod(this, _Minimatch_instances, matchOne_fn).call(this, file, tail, partial, tailStart, 0)) { fileTailMatch = tail.length; } else { if (file[file.length - 1] !== "" || fileIndex + tail.length === file.length) { return false; } tailStart--; if (!__privateMethod(this, _Minimatch_instances, matchOne_fn).call(this, file, tail, partial, tailStart, 0)) { return false; } fileTailMatch = tail.length + 1; } } if (!body.length) { let sawSome = !!fileTailMatch; for (let i3 = fileIndex; i3 < file.length - fileTailMatch; i3++) { const f2 = String(file[i3]); sawSome = true; if (f2 === "." || f2 === ".." || !this.options.dot && f2.startsWith(".")) { return false; } } return partial || sawSome; } const bodySegments = [[[], 0]]; let currentBody = bodySegments[0]; let nonGsParts = 0; const nonGsPartsSums = [0]; for (const b2 of body) { if (b2 === GLOBSTAR) { nonGsPartsSums.push(nonGsParts); currentBody = [[], 0]; bodySegments.push(currentBody); } else { currentBody[0].push(b2); nonGsParts++; } } let i2 = bodySegments.length - 1; const fileLength = file.length - fileTailMatch; for (const b2 of bodySegments) { b2[1] = fileLength - (nonGsPartsSums[i2--] + b2[0].length); } return !!__privateMethod(this, _Minimatch_instances, matchGlobStarBodySections_fn).call(this, file, bodySegments, fileIndex, 0, partial, 0, !!fileTailMatch); }; // return false for "nope, not matching" // return null for "not matching, cannot keep trying" matchGlobStarBodySections_fn = function(file, bodySegments, fileIndex, bodyIndex, partial, globStarDepth, sawTail) { const bs = bodySegments[bodyIndex]; if (!bs) { for (let i2 = fileIndex; i2 < file.length; i2++) { sawTail = true; const f2 = file[i2]; if (f2 === "." || f2 === ".." || !this.options.dot && f2.startsWith(".")) { return false; } } return sawTail; } const [body, after] = bs; while (fileIndex <= after) { const m2 = __privateMethod(this, _Minimatch_instances, matchOne_fn).call(this, file.slice(0, fileIndex + body.length), body, partial, fileIndex, 0); if (m2 && globStarDepth < this.maxGlobstarRecursion) { const sub = __privateMethod(this, _Minimatch_instances, matchGlobStarBodySections_fn).call(this, file, bodySegments, fileIndex + body.length, bodyIndex + 1, partial, globStarDepth + 1, sawTail); if (sub !== false) { return sub; } } const f2 = file[fileIndex]; if (f2 === "." || f2 === ".." || !this.options.dot && f2.startsWith(".")) { return false; } fileIndex++; } return partial || null; }; matchOne_fn = function(file, pattern, partial, fileIndex, patternIndex) { let fi; let pi; let pl2; let fl; for (fi = fileIndex, pi = patternIndex, fl = file.length, pl2 = pattern.length; fi < fl && pi < pl2; fi++, pi++) { this.debug("matchOne loop"); let p2 = pattern[pi]; let f2 = file[fi]; this.debug(pattern, p2, f2); if (p2 === false || p2 === GLOBSTAR) { return false; } let hit; if (typeof p2 === "string") { hit = f2 === p2; this.debug("string match", p2, f2, hit); } else { hit = p2.test(f2); this.debug("pattern match", p2, f2, hit); } if (!hit) return false; } if (fi === fl && pi === pl2) { return true; } else if (fi === fl) { return partial; } else if (pi === pl2) { return fi === fl - 1 && file[fi] === ""; } else { throw new Error("wtf?"); } }; minimatch.AST = AST; minimatch.Minimatch = Minimatch; minimatch.escape = escape; minimatch.unescape = unescape; // src/utils/fs.ts function isSupportedFileType(path2) { return path2.split(".").pop().toLowerCase() === "md"; } function pathMatchesPattern(path2, pattern) { return path2.startsWith(pattern) || minimatch(path2, pattern); } // src/data/settings.ts var DEFAULT_SETTINGS = { // flashcards flashcardTags: ["#flashcards"], flashcardTagsToIgnore: [], convertFoldersToDecks: false, burySiblingCards: false, flashcardCardOrder: "DueFirstRandom", flashcardDeckOrder: "PrevDeckComplete_Sequential", convertClozePatternsToInputs: false, convertHighlightsToClozes: true, convertBoldTextToClozes: false, convertCurlyBracketsToClozes: false, clozePatterns: ["==[123;;]answer[;;hint]=="], singleLineCardSeparator: "::", singleLineReversedCardSeparator: ":::", multilineCardSeparator: "?", multilineReversedCardSeparator: "??", multilineCardEndMarker: "", editLaterTag: void 0, enableReviewReminders: false, reviewReminderIntervalMinutes: 5, reviewReminderCheckOnStartup: false, reviewReminderMessage: "", reviewReminderAutoOpen: true, reviewReminderShowNotice: true, reviewReminderPlaySound: true, reviewReminderBounceDock: true, randomizeCardOrder: void 0, // notes enableNoteReviewPaneOnStartup: true, tagsToReview: ["#review"], noteTagsToIgnore: [], noteFoldersToIgnore: ["**/*.excalidraw.md"], openRandomNote: false, autoNextNote: false, disableFileMenuReviewOptions: void 0, showFileMenuReviewOptions: true, deleteTagsOnSchedulingDataDeletion: false, maxNDaysNotesReviewQueue: 365, // UI settings showRibbonIcon: true, showStatusBar: true, showCardStatusBarItem: true, showNoteStatusBarItem: true, showUpdateAvailableStatusBarItem: true, initiallyExpandAllSubdecksInTree: true, showContextInCards: true, showIntervalInReviewButtons: true, flashcardHeightPercentage: 60, flashcardWidthPercentage: 60, flashcardHeightPercentageMobile: 100, flashcardWidthPercentageMobile: 100, flashcardAgainText: t("AGAIN"), flashcardEasyText: t("EASY"), flashcardGoodText: t("GOOD"), flashcardHardText: t("HARD"), reviewButtonDelay: 0, showDeleteButtonInCardView: false, showDeleteButtonInFileMenu: false, openViewInNewTab: false, openViewInNewTabMobile: false, useCustomHotkeys: false, useCalloutsForSchedulingComments: false, // algorithm algorithm: "SM-2-OSR" /* SM_2_OSR */, baseEase: 250, lapsesIntervalChange: 0.5, easyBonus: 1.3, loadBalance: true, maximumInterval: 36525, maxLinkFactor: 1, fsrsDesiredRetention: 0.9, startOfDay: "00:00:00", // storage dataStore: "NOTES" /* NOTES */, cardCommentOnSameLine: false, scheduleDataVaultLocation: "Spaced Repetition", // logging showSchedulingDebugMessages: false, showParserDebugMessages: false, preferredDateFormatForNoteReviewQueue: "MMM DD YYYY", preferredLocale: "-" }; function upgradeSettings(settings) { if (settings.randomizeCardOrder !== null && settings.randomizeCardOrder !== void 0 && (settings.flashcardCardOrder === null || settings.flashcardCardOrder === void 0) && (settings.flashcardDeckOrder === null || settings.flashcardDeckOrder === void 0)) { settings.flashcardCardOrder = settings.randomizeCardOrder ? "DueFirstRandom" : "DueFirstSequential"; settings.flashcardDeckOrder = "PrevDeckComplete_Sequential"; settings.randomizeCardOrder = void 0; } if (settings.clozePatterns === null || settings.clozePatterns === void 0) { settings.clozePatterns = []; if (settings.convertHighlightsToClozes) settings.clozePatterns.push("==[123;;]answer[;;hint]=="); if (settings.convertBoldTextToClozes) settings.clozePatterns.push("**[123;;]answer[;;hint]**"); if (settings.convertCurlyBracketsToClozes) settings.clozePatterns.push("{{[123;;]answer[;;hint]}}"); } if (settings.disableFileMenuReviewOptions !== void 0) { settings.disableFileMenuReviewOptions = void 0; } if (settings.editLaterTag) { settings.editLaterTag = void 0; } if (settings.scheduleDataVaultLocation === null || settings.scheduleDataVaultLocation === void 0 || settings.scheduleDataVaultLocation.trim() === "") { settings.scheduleDataVaultLocation = DEFAULT_SETTINGS.scheduleDataVaultLocation; } if (settings.fsrsDesiredRetention === null || settings.fsrsDesiredRetention === void 0) { settings.fsrsDesiredRetention = DEFAULT_SETTINGS.fsrsDesiredRetention; } if (settings.enableReviewReminders === null || settings.enableReviewReminders === void 0) { settings.enableReviewReminders = DEFAULT_SETTINGS.enableReviewReminders; } if (settings.reviewReminderIntervalMinutes === null || settings.reviewReminderIntervalMinutes === void 0 || settings.reviewReminderIntervalMinutes < 1) { settings.reviewReminderIntervalMinutes = DEFAULT_SETTINGS.reviewReminderIntervalMinutes; } if (settings.reviewReminderCheckOnStartup === null || settings.reviewReminderCheckOnStartup === void 0) { settings.reviewReminderCheckOnStartup = DEFAULT_SETTINGS.reviewReminderCheckOnStartup; } if (settings.reviewReminderMessage === null || settings.reviewReminderMessage === void 0) { settings.reviewReminderMessage = DEFAULT_SETTINGS.reviewReminderMessage; } if (settings.reviewReminderAutoOpen === null || settings.reviewReminderAutoOpen === void 0) { settings.reviewReminderAutoOpen = DEFAULT_SETTINGS.reviewReminderAutoOpen; } if (settings.reviewReminderShowNotice === null || settings.reviewReminderShowNotice === void 0) { settings.reviewReminderShowNotice = DEFAULT_SETTINGS.reviewReminderShowNotice; } if (settings.reviewReminderPlaySound === null || settings.reviewReminderPlaySound === void 0) { settings.reviewReminderPlaySound = DEFAULT_SETTINGS.reviewReminderPlaySound; } if (settings.reviewReminderBounceDock === null || settings.reviewReminderBounceDock === void 0) { settings.reviewReminderBounceDock = DEFAULT_SETTINGS.reviewReminderBounceDock; } } var SettingsUtil = class _SettingsUtil { static isFlashcardTag(settings, tag) { return _SettingsUtil.isTagInList(settings.flashcardTags, tag); } static isPathInFoldersToIgnore(settings, path2) { return settings.noteFoldersToIgnore.some((folder) => pathMatchesPattern(path2, folder)); } static isAnyTagANoteReviewTag(settings, tags) { for (const tag of tags) { if (settings.tagsToReview.some( (tagToReview) => this.isSubTagContainedInTag(tagToReview, tag) )) { return true; } } return false; } static isAnyTagIgnoredForFlashcards(settings, tags) { return tags.some((tag) => _SettingsUtil.isTagInList(settings.flashcardTagsToIgnore, tag)); } static isAnyTagIgnoredForNotes(settings, tags) { return tags.some((tag) => _SettingsUtil.isTagInList(settings.noteTagsToIgnore, tag)); } // Given a list of tags, return the subset that is in settings.tagsToReview static filterForNoteReviewTag(settings, tags) { const result = []; for (const tagToReview of settings.tagsToReview) { if (tags.some((tag) => this.isSubTagContainedInTag(tagToReview, tag))) { result.push(tagToReview); } } return result; } /** * Checks if the tag is in the tagList. * * @param tagList - The list of tags to check. * @param tag - The tag to check. * @param exactMatch - Whether to match the tag exactly or if it should be a sub tag. * @returns true if the tag is in the tagList, false otherwise. */ static isTagInList(tagList, tag, exactMatch = false) { for (const tagFromList of tagList) { if (exactMatch) { if (tagFromList === tag) { return true; } } else { if (this.isSubTagContainedInTag(tagFromList, tag)) { return true; } } } return false; } /** * Checks if the subTag is contained in the tag. * * @param tag - The tag to check. * @param subTag - The subTag to check. * @returns true if the subTag is contained in the tag, false otherwise. */ static isSubTagContainedInTag(tag, subTag) { if (tag === subTag || subTag.startsWith(tag + "/")) { return true; } return false; } }; // src/ui/obsidian-ui-components/content-container/settings-page/settings-page.tsx var import_obsidian19 = require("obsidian"); var SettingsPage = class { constructor(pageContainerEl, plugin, settingsManager, dataManager, pageType, applySettingsUpdate, display, openPage, scrollListener) { this.plugin = plugin; this.settingsManager = settingsManager; this.dataManager = dataManager; this.pageType = pageType; this.display = display; this.applySettingsUpdate = applySettingsUpdate; this.openPage = openPage; this.scrollListener = scrollListener; this.pageContainerEl = pageContainerEl; this.pageContainerEl.addClass("sr-settings-page"); this.pageContainerEl.addClass("sr-is-hidden"); this.pageHeaderEl = this.pageContainerEl.createDiv(); this.pageHeaderEl.addClass("sr-settings-page-header"); this.pageHeaderEl.addEventListener("click", () => { this.backToMainPage(); }); if (pageType === "main-page") this.pageHeaderEl.addClass("sr-is-hidden"); this.backButton = new import_obsidian19.ButtonComponent(this.pageHeaderEl); this.backButton.setClass("sr-settings-page-back-button"); this.backButton.setClass("clickable-icon"); this.backButton.setIcon("chevron-left"); this.backButton.onClick(() => { this.backToMainPage(); }); this.titleWrapperEl = this.pageHeaderEl.createDiv(); this.titleWrapperEl.addClass("sr-settings-page-title-wrapper"); this.titleIconEl = this.titleWrapperEl.createDiv(); this.titleIconEl.addClass("sr-settings-page-title-icon"); (0, import_obsidian19.setIcon)(this.titleIconEl, getPageIcon(pageType)); this.titleEl = this.titleWrapperEl.createDiv(); this.titleEl.addClass("sr-settings-page-title"); this.titleEl.setText(getPageName(pageType)); this.containerEl = this.pageContainerEl.createDiv(); this.containerEl.addClass("sr-settings-page-content"); this.containerEl.addEventListener("scroll", (_2) => { this.scrollListener(this.containerEl.scrollTop); }); } /** * Scrolls to the specified position. */ scrollTo(scrollPosition) { this.containerEl.scrollTo({ top: scrollPosition, behavior: "auto" }); } /** * Gets the SettingsPage type. */ getPageType() { return this.pageType; } /** * Destroys the SettingsPage. Run any cleanup code here. */ destroy() { this.removeScrollListener(); } /** * Removes the scroll listener from the SettingsPage. */ removeScrollListener() { this.containerEl.removeEventListener("scroll", (_2) => { this.scrollListener(this.containerEl.scrollTop); }); } /** * Adds the scroll listener to the SettingsPage. */ addScrollListener() { this.containerEl.addEventListener("scroll", (_2) => { this.scrollListener(this.containerEl.scrollTop); }); } /** * Shows the SettingsPage. */ show() { if (this.pageContainerEl.hasClass("sr-is-hidden")) { this.pageContainerEl.removeClass("sr-is-hidden"); this.addScrollListener(); if (this.render) this.render(); } } /** * Hides the SettingsPage. */ hide() { if (!this.pageContainerEl.hasClass("sr-is-hidden")) { this.pageContainerEl.addClass("sr-is-hidden"); this.removeScrollListener(); } } /** * Backs to the main page. */ backToMainPage() { this.openPage("main-page"); } }; // src/ui/obsidian-ui-components/content-container/settings-page/data-page.tsx var DataPage = class extends SettingsPage { constructor(pageContainerEl, plugin, settingsManager, dataManager, pageType, applySettingsUpdate, display, openPage, scrollListener) { super( pageContainerEl, plugin, settingsManager, dataManager, pageType, applySettingsUpdate, display, openPage, scrollListener ); const dataStorageGroup = new import_obsidian20.SettingGroup(this.containerEl).setHeading( t("GROUP_DATA_STORAGE") ); dataStorageGroup.addSetting((setting) => { setting.setName(t("INLINE_SCHEDULING_COMMENTS")).setDesc(t("INLINE_SCHEDULING_COMMENTS_DESC")).addToggle( (toggle) => toggle.setValue(this.settingsManager.settings.cardCommentOnSameLine).onChange(async (value) => { this.settingsManager.settings.cardCommentOnSameLine = value; await this.settingsManager.save(); }) ); }).addSetting((setting) => { setting.setName(t("USE_CALLOUTS_FOR_SCHEDULING_COMMENTS")).setDesc(t("USE_CALLOUTS_FOR_SCHEDULING_COMMENTS_DESC")).addToggle( (toggle) => toggle.setValue( this.settingsManager.settings.useCalloutsForSchedulingComments ).onChange(async (value) => { this.settingsManager.settings.useCalloutsForSchedulingComments = value; await this.settingsManager.save(); }) ); }).addSetting((setting) => { setting.setName(t("MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT")).setDesc(t("MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT_DESC")).addButton((button) => { button.setButtonText(t("MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT_BUTTON")).setClass("mod-warning").onClick(() => { new ConfirmationModal( this.plugin.app, t("MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT"), t("CONFIRM_MIGRATE_SCHEDULING_COMMENTS_TO_CALLOUT"), t("MIGRATING_SCHEDULING_COMMENTS_TO_CALLOUT"), async () => { await DataStore.instance.fileModifier.migrateCommentsToCallouts(); this.display(); } ).open(); }); }); }); new import_obsidian20.SettingGroup(this.containerEl).setHeading(t("DELETE_SCHEDULING_DATA_ALL")).addSetting((setting) => { setting.setName(t("DELETE_TAGS_WHEN_DELETING_SCHEDULING_DATA")).setDesc(t("DELETE_TAGS_WHEN_DELETING_SCHEDULING_DATA_DESC")).addToggle( (toggle) => toggle.setValue( this.settingsManager.settings.deleteTagsOnSchedulingDataDeletion ).onChange(async (value) => { this.settingsManager.settings.deleteTagsOnSchedulingDataDeletion = value; await this.settingsManager.save(); }) ); }).addSetting((setting) => { setting.setName(t("DELETE_SCHEDULING_DATA_ALL")).setDesc(t("DELETE_SCHEDULING_DATA_ALL_DESC")).addButton((button) => { button.setButtonText(t("DELETE")).setClass("mod-warning").onClick(() => { new ConfirmationModal( this.plugin.app, t("DELETE_SCHEDULING_DATA_ALL"), t("CONFIRM_SCHEDULING_DATA_ALL_DELETION"), t("SCHEDULING_DATA_ALL_DELETION_IN_PROGRESS"), async () => { const settings = this.settingsManager.settings; await DataStore.instance.fileModifier.deleteAllSchedulingData( settings.deleteTagsOnSchedulingDataDeletion, settings.flashcardTags, settings.tagsToReview ); } ).open(); }); }); }).addSetting((setting) => { setting.setName(t("DELETE_SCHEDULING_DATA_IN_NOTES")).setDesc(t("DELETE_SCHEDULING_DATA_IN_NOTES_DESC")).addButton((button) => { button.setButtonText(t("DELETE")).setClass("mod-warning").onClick(() => { new ConfirmationModal( this.plugin.app, t("DELETE_SCHEDULING_DATA_IN_NOTES"), t("CONFIRM_SCHEDULING_DATA_IN_NOTES_DELETION"), t("SCHEDULING_DATA_IN_NOTES_DELETION_IN_PROGRESS"), async () => { await DataStore.instance.fileModifier.deleteAllSchedulingDataInNotes( this.settingsManager.settings.deleteTagsOnSchedulingDataDeletion, this.settingsManager.settings.tagsToReview ); } ).open(); }); }); }).addSetting((setting) => { setting.setName(t("DELETE_SCHEDULING_DATA_IN_CARDS")).setDesc(t("DELETE_SCHEDULING_DATA_IN_CARDS_DESC")).addButton((button) => { button.setButtonText(t("DELETE")).setClass("mod-warning").onClick(() => { new ConfirmationModal( this.plugin.app, t("DELETE_SCHEDULING_DATA_IN_CARDS"), t("CONFIRM_SCHEDULING_DATA_IN_CARDS_DELETION"), t("SCHEDULING_DATA_IN_CARDS_DELETION_IN_PROGRESS"), async () => { await DataStore.instance.fileModifier.deleteAllSchedulingDataInCards( this.settingsManager.settings.deleteTagsOnSchedulingDataDeletion, this.settingsManager.settings.flashcardTags ); } ).open(); }); }); }); new import_obsidian20.SettingGroup(this.containerEl).setHeading(t("GROUP_RESET_SETTINGS")).addSetting((setting) => { setting.setName(t("GROUP_RESET_SETTINGS")).setDesc(t("GROUP_RESET_SETTINGS_DESC")).addButton((button) => { button.setButtonText(t("RESET_SETTINGS")).setClass("mod-warning").onClick(() => { new ConfirmationModal( this.plugin.app, t("RESET_SETTINGS"), t("CONFIRM_RESET_SETTINGS"), t("RESET_SETTINGS_CONFIRMATION"), async () => { await this.settingsManager.saveSettings(DEFAULT_SETTINGS); this.display(); } ).open(); }); }); }); } }; // src/ui/obsidian-ui-components/content-container/settings-page/flashcards-page.tsx var import_obsidian21 = require("obsidian"); var FlashcardsPage = class extends SettingsPage { constructor(pageContainerEl, plugin, settingsManager, dataManager, pageType, didReadMultilineEndMarkerWarning, applySettingsUpdate, display, openPage, scrollListener, changeMultilineEndMarkerWarningState) { super( pageContainerEl, plugin, settingsManager, dataManager, pageType, applySettingsUpdate, display, openPage, scrollListener ); new import_obsidian21.SettingGroup(this.containerEl).setHeading(t("GROUP_TAGS_FOLDERS")).addSetting((setting) => { setting.setName(t("FLASHCARD_TAGS")).setDesc(t("FLASHCARD_TAGS_DESC")).addTextArea( (text) => text.setValue(this.settingsManager.settings.flashcardTags.join(" ")).onChange((value) => { applySettingsUpdate(async () => { this.settingsManager.settings.flashcardTags = value.split(/\s+/); await this.settingsManager.save(); }); }) ); }).addSetting((setting) => { setting.setName(t("CONVERT_FOLDERS_TO_DECKS")).setDesc(t("CONVERT_FOLDERS_TO_DECKS_DESC")).addToggle( (toggle) => toggle.setValue(this.settingsManager.settings.convertFoldersToDecks).onChange(async (value) => { this.settingsManager.settings.convertFoldersToDecks = value; await this.settingsManager.save(); }) ); }).addSetting((setting) => { setting.setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")).setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")).addToggle( (toggle) => toggle.setValue(this.settingsManager.settings.burySiblingCards).onChange(async (value) => { this.settingsManager.settings.burySiblingCards = value; await this.settingsManager.save(); }) ); }).addSetting((setting) => { setting.setName(t("FLASHCARD_TAGS_TO_IGNORE")).setDesc(t("FLASHCARD_TAGS_TO_IGNORE_DESC")).addTextArea( (text) => text.setValue(this.settingsManager.settings.flashcardTagsToIgnore.join(" ")).onChange((value) => { applySettingsUpdate(async () => { this.settingsManager.settings.flashcardTagsToIgnore = value.split(/\s+/).filter((v2) => v2); await this.settingsManager.save(); }); }) ); }).addSetting((setting) => { setting.setName(t("FOLDERS_TO_IGNORE")).setDesc(t("FOLDERS_TO_IGNORE_DESC")).addTextArea( (text) => text.setValue(this.settingsManager.settings.noteFoldersToIgnore.join("\n")).onChange((value) => { this.applySettingsUpdate(async () => { this.settingsManager.settings.noteFoldersToIgnore = value.split(/\n+/).map((v2) => v2.trim()).filter((v2) => v2); await this.settingsManager.save(); }); }) ); }); new import_obsidian21.SettingGroup(this.containerEl).setHeading(t("GROUP_FLASHCARD_REVIEW")).addSetting((setting) => { setting.setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")).setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")).addToggle( (toggle) => toggle.setValue(this.settingsManager.settings.burySiblingCards).onChange(async (value) => { this.settingsManager.settings.burySiblingCards = value; await this.settingsManager.save(); }) ); }).addSetting((setting) => { setting.setName(t("REVIEW_CARD_ORDER_WITHIN_DECK")).addDropdown( (dropdown) => dropdown.addOptions({ NewFirstSequential: t("REVIEW_CARD_ORDER_NEW_FIRST_SEQUENTIAL"), DueFirstSequential: t("REVIEW_CARD_ORDER_DUE_FIRST_SEQUENTIAL"), NewFirstRandom: t("REVIEW_CARD_ORDER_NEW_FIRST_RANDOM"), DueFirstRandom: t("REVIEW_CARD_ORDER_DUE_FIRST_RANDOM"), EveryCardRandomDeckAndCard: t("REVIEW_CARD_ORDER_RANDOM_DECK_AND_CARD") }).setValue(this.settingsManager.settings.flashcardCardOrder).onChange(async (value) => { this.settingsManager.settings.flashcardCardOrder = value; await this.settingsManager.save(); this.display(); }) ); }).addSetting((setting) => { const deckOrderEnabled = this.settingsManager.settings.flashcardCardOrder !== "EveryCardRandomDeckAndCard"; setting.setName(t("REVIEW_DECK_ORDER")).addDropdown( (dropdown) => dropdown.addOptions( deckOrderEnabled ? { // eslint-disable-next-line camelcase PrevDeckComplete_Sequential: t( "REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_SEQUENTIAL" ), // eslint-disable-next-line camelcase PrevDeckComplete_Random: t( "REVIEW_DECK_ORDER_PREV_DECK_COMPLETE_RANDOM" ) } : { EveryCardRandomDeckAndCard: t( "REVIEW_DECK_ORDER_RANDOM_DECK_AND_CARD" ) } ).setValue( deckOrderEnabled ? this.settingsManager.settings.flashcardDeckOrder : "EveryCardRandomDeckAndCard" ).setDisabled(!deckOrderEnabled).onChange(async (value) => { this.settingsManager.settings.flashcardDeckOrder = value; await this.settingsManager.save(); }) ); }); new import_obsidian21.SettingGroup(this.containerEl).setHeading(t("GROUP_FLASHCARD_SEPARATORS")).addSetting((setting) => { const convertHighlightsToClozesEl = setting.setName( t("CONVERT_HIGHLIGHTS_TO_CLOZES") ); const elements = tHTML( "CONVERT_HIGHLIGHTS_TO_CLOZES_DESC", { defaultPattern: "==[123;;]answer[;;hint]==" } ); setting.descEl.empty(); for (let i2 = 0; i2 < elements.length; i2++) { setting.descEl.append(elements[i2]); } convertHighlightsToClozesEl.addToggle( (toggle) => toggle.setValue(this.settingsManager.settings.convertHighlightsToClozes).onChange(async (value) => { const defaultHightlightPattern = "==[123;;]answer[;;hint]=="; const clozePatternSet = new Set( this.settingsManager.settings.clozePatterns ); if (value) { clozePatternSet.add(defaultHightlightPattern); } else { clozePatternSet.delete(defaultHightlightPattern); } this.settingsManager.settings.clozePatterns = [...clozePatternSet]; this.settingsManager.settings.convertHighlightsToClozes = value; await this.settingsManager.save(); this.display(); }) ); }).addSetting((setting) => { const convertBoldTextToClozesEl = setting.setName(t("CONVERT_BOLD_TEXT_TO_CLOZES")); const elements = tHTML("CONVERT_BOLD_TEXT_TO_CLOZES_DESC", { defaultPattern: "**[123;;]answer[;;hint]**" }); setting.descEl.empty(); for (let i2 = 0; i2 < elements.length; i2++) { setting.descEl.append(elements[i2]); } convertBoldTextToClozesEl.addToggle( (toggle) => toggle.setValue(this.settingsManager.settings.convertBoldTextToClozes).onChange(async (value) => { const defaultBoldPattern = "**[123;;]answer[;;hint]**"; const clozePatternSet = new Set( this.settingsManager.settings.clozePatterns ); if (value) { clozePatternSet.add(defaultBoldPattern); } else { clozePatternSet.delete(defaultBoldPattern); } this.settingsManager.settings.clozePatterns = [...clozePatternSet]; this.settingsManager.settings.convertBoldTextToClozes = value; await this.settingsManager.save(); this.display(); }) ); }).addSetting((setting) => { const convertCurlyBracketsToClozesEl = setting.setName( t("CONVERT_CURLY_BRACKETS_TO_CLOZES") ); const elements = tHTML( "CONVERT_CURLY_BRACKETS_TO_CLOZES_DESC", { defaultPattern: "{{[123;;]answer[;;hint]}}" } ); setting.descEl.empty(); for (let i2 = 0; i2 < elements.length; i2++) { setting.descEl.append(elements[i2]); } convertCurlyBracketsToClozesEl.addToggle( (toggle) => toggle.setValue(this.settingsManager.settings.convertCurlyBracketsToClozes).onChange(async (value) => { const defaultCurlyBracketsPattern = "{{[123;;]answer[;;hint]}}"; const clozePatternSet = new Set( this.settingsManager.settings.clozePatterns ); if (value) { clozePatternSet.add(defaultCurlyBracketsPattern); } else { clozePatternSet.delete(defaultCurlyBracketsPattern); } this.settingsManager.settings.clozePatterns = [...clozePatternSet]; this.settingsManager.settings.convertCurlyBracketsToClozes = value; await this.settingsManager.save(); this.display(); }) ); }).addSetting((setting) => { const clozePatterns = setting.setName(t("CLOZE_PATTERNS")); const elements = tHTML("CLOZE_PATTERNS_DESC", { docsUrl: "https://stephenmwangi.com/obsidian-spaced-repetition/flashcards/cloze-cards/#cloze-types" }); setting.descEl.empty(); for (let i2 = 0; i2 < elements.length; i2++) { setting.descEl.append(elements[i2]); } clozePatterns.addTextArea( (text) => text.setPlaceholder( "Example:\n==[123;;]answer[;;hint]==\n**[123;;]answer[;;hint]**\n{{[123;;]answer[;;hint]}}" ).setValue(this.settingsManager.settings.clozePatterns.join("\n")).onChange((value) => { applySettingsUpdate(async () => { const defaultHightlightPattern = "==[123;;]answer[;;hint]=="; const defaultBoldPattern = "**[123;;]answer[;;hint]**"; const defaultCurlyBracketsPattern = "{{[123;;]answer[;;hint]}}"; const clozePatternSet = new Set( value.split(/\n+/).map((v2) => v2.trim()).filter((v2) => v2) ); if (clozePatternSet.has(defaultHightlightPattern)) { this.settingsManager.settings.convertHighlightsToClozes = true; } else { this.settingsManager.settings.convertHighlightsToClozes = false; } if (clozePatternSet.has(defaultBoldPattern)) { this.settingsManager.settings.convertBoldTextToClozes = true; } else { this.settingsManager.settings.convertBoldTextToClozes = false; } if (clozePatternSet.has(defaultCurlyBracketsPattern)) { this.settingsManager.settings.convertCurlyBracketsToClozes = true; } else { this.settingsManager.settings.convertCurlyBracketsToClozes = false; } this.settingsManager.settings.clozePatterns = [...clozePatternSet]; await this.settingsManager.save(); }); }) ); }).addSetting((setting) => { setting.setName(t("INLINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addExtraButton((button) => { button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { this.settingsManager.settings.singleLineCardSeparator = DEFAULT_SETTINGS.singleLineCardSeparator; await this.settingsManager.save(); this.display(); }); }).addText( (text) => text.setValue(this.settingsManager.settings.singleLineCardSeparator).onChange((value) => { applySettingsUpdate(async () => { this.settingsManager.settings.singleLineCardSeparator = value; await this.settingsManager.save(); }); }) ); }).addSetting((setting) => { setting.setName(t("INLINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addExtraButton((button) => { button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { this.settingsManager.settings.singleLineReversedCardSeparator = DEFAULT_SETTINGS.singleLineReversedCardSeparator; await this.settingsManager.save(); this.display(); }); }).addText( (text) => text.setValue(this.settingsManager.settings.singleLineReversedCardSeparator).onChange((value) => { applySettingsUpdate(async () => { this.settingsManager.settings.singleLineReversedCardSeparator = value; await this.settingsManager.save(); }); }) ); }).addSetting((setting) => { setting.setName(t("MULTILINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addExtraButton((button) => { button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { this.settingsManager.settings.multilineCardSeparator = DEFAULT_SETTINGS.multilineCardSeparator; await this.settingsManager.save(); this.display(); }); }).addText( (text) => text.setValue(this.settingsManager.settings.multilineCardSeparator).onChange((value) => { applySettingsUpdate(async () => { this.settingsManager.settings.multilineCardSeparator = value; await this.settingsManager.save(); }); }) ); }).addSetting((setting) => { setting.setName(t("MULTILINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addExtraButton((button) => { button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { this.settingsManager.settings.multilineReversedCardSeparator = DEFAULT_SETTINGS.multilineReversedCardSeparator; await this.settingsManager.save(); this.display(); }); }).addText( (text) => text.setValue(this.settingsManager.settings.multilineReversedCardSeparator).onChange((value) => { applySettingsUpdate(async () => { this.settingsManager.settings.multilineReversedCardSeparator = value; await this.settingsManager.save(); }); }) ); }).addSetting((setting) => { setting.setName(t("MULTILINE_CARDS_END_MARKER")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")); if (didReadMultilineEndMarkerWarning) { setting.addExtraButton((button) => { button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { this.settingsManager.settings.multilineCardEndMarker = DEFAULT_SETTINGS.multilineCardEndMarker; await this.settingsManager.save(); this.display(); }); }).addText( (text) => text.setValue(this.settingsManager.settings.multilineCardEndMarker).onChange((value) => { applySettingsUpdate(async () => { this.settingsManager.settings.multilineCardEndMarker = value; await this.settingsManager.save(); }); }) ); } else { setting.addButton((button) => { button.setButtonText("Unlock Setting").setClass("mod-warning").onClick(() => { new ConfirmationModal( this.plugin.app, "Please read!", "Please only change this setting if you already added the characters denoting the end marker to all your multiline / cloze cards. Else you might loose your scheduling data!", "Unlocking setting.", () => { changeMultilineEndMarkerWarningState(true); } ).open(); }); }); } }); } }; // src/ui/obsidian-ui-components/content-container/settings-page/main-page.tsx var import_obsidian22 = require("obsidian"); // src/data/debug-logger.ts var DebugLogger = class { constructor() { this.debugInfoLog = []; this.debugErrorLog = []; this.debugWarningLog = []; } /** * Logs a message of the specified type. */ log(message, type) { switch (type) { case "info": this.debugInfoLog.push(message); break; case "error": this.debugErrorLog.push(message); break; case "warning": this.debugWarningLog.push(message); break; } } /** * Clears the log of all types. */ emptyLogs() { this.debugInfoLog = []; this.debugErrorLog = []; this.debugWarningLog = []; } /** * Clears the log of the specified type. */ emptyLog(type) { switch (type) { case "info": this.debugInfoLog = []; break; case "error": this.debugErrorLog = []; break; case "warning": this.debugWarningLog = []; break; } } getLog(type) { switch (type) { case "info": return this.debugInfoLog.join("\n"); case "error": return this.debugErrorLog.join("\n"); case "warning": return this.debugWarningLog.join("\n"); } } getAllLogs() { return this.getLog("info") + "\n" + this.getLog("error") + "\n" + this.getLog("warning"); } }; var _DebugLoggerInstance = class _DebugLoggerInstance { static getInstance() { if (!_DebugLoggerInstance.instance) { _DebugLoggerInstance.instance = new DebugLogger(); } return _DebugLoggerInstance.instance; } }; _DebugLoggerInstance.instance = null; var DebugLoggerInstance = _DebugLoggerInstance; // src/parser.ts var import_clozecraft = __toESM(require_dist()); var debugParser = false; function setDebugParser(value) { debugParser = value; } var ParsedQuestionInfo = class { constructor(cardType, text, firstLineNum, lastLineNum) { this.cardType = cardType; this.text = text; this.firstLineNum = firstLineNum; this.lastLineNum = lastLineNum; } isQuestionLineNum(lineNum) { return lineNum >= this.firstLineNum && lineNum <= this.lastLineNum; } }; function markerInsideCodeBlock(text, marker, markerIndex) { let goingBack = markerIndex - 1, goingForward = markerIndex + marker.length; let backTicksBefore = 0, backTicksAfter = 0; while (goingBack >= 0) { if (text[goingBack] === "`") backTicksBefore++; goingBack--; } while (goingForward < text.length) { if (text[goingForward] === "`") backTicksAfter++; goingForward++; } return backTicksBefore % 2 === 1 && backTicksAfter % 2 === 1; } function hasInlineMarker(text, marker) { if (marker.length === 0) return false; const markerIdx = text.indexOf(marker); if (markerIdx === -1) return false; return !markerInsideCodeBlock(text, marker, markerIdx); } function parse(text, options) { if (debugParser) { console.log("Text to parse:\n<<<" + text + ">>>"); } const inlineSeparators = [ { separator: options.singleLineCardSeparator, type: 0 /* SingleLineBasic */ }, { separator: options.singleLineReversedCardSeparator, type: 1 /* SingleLineReversed */ } ]; inlineSeparators.sort((a2, b2) => b2.separator.length - a2.separator.length); const cards = []; let cardText = ""; let cardType = null; let firstLineNo = 0, lastLineNo; const clozecrafter = new import_clozecraft.ClozeCrafter(options.clozePatterns); const lines = text.replaceAll("\r\n", "\n").split("\n"); for (let i2 = 0; i2 < lines.length; i2++) { const currentLine = lines[i2], currentTrimmed = lines[i2].trim(); if (currentLine.startsWith("")) i2++; i2++; continue; } const isEmptyLine = currentTrimmed.length === 0; const hasMultilineCardEndMarker = options.multilineCardEndMarker && currentTrimmed === options.multilineCardEndMarker; if ( // We've probably reached the end of a card isEmptyLine && !options.multilineCardEndMarker || // Empty line & we're not picking up any card isEmptyLine && cardType === null || // We've reached the end of a multi line card & // we're using custom end markers hasMultilineCardEndMarker ) { if (cardType) { lastLineNo = i2 - 1; cards.push( new ParsedQuestionInfo(cardType, cardText.trimEnd(), firstLineNo, lastLineNo) ); cardType = null; } cardText = ""; firstLineNo = i2 + 1; continue; } if (cardText.length > 0) { cardText += "\n"; } cardText += currentLine.trimEnd(); for (const { separator, type } of inlineSeparators) { if (hasInlineMarker(currentLine, separator)) { cardType = type; break; } } if (cardType === 0 /* SingleLineBasic */ || cardType === 1 /* SingleLineReversed */) { cardText = currentLine; firstLineNo = i2; if (i2 + 1 < lines.length && lines[i2 + 1].startsWith("/gm; const matches = data.matchAll(srCommentWithinMetadataRegex); let index = 0; for (const match2 of matches) { if (!match2[0].startsWith("> comment, such as: // // // However, not all sibling cards may have been reviewed. Therefore we need a method of indicating that a particular card // has not been reviewed, and should be considered "new" // This is done by using this magic value for the date _RepItemScheduleInfoOsr.dummyDueDateForNewCard = "2000-01-01"; var RepItemScheduleInfoOsr = _RepItemScheduleInfoOsr; // src/data/data-store/notes-data-store/note-data-store-algorithm-osr.ts var NoteDataStoreAlgorithmOsr = class { constructor(settings) { this.settings = settings; } questionFormatScheduleAsHtmlComment(question) { let accumulatedSchedules = ""; for (let i2 = 0; i2 < question.cards.length; i2++) { const card = question.cards[i2]; accumulatedSchedules += this.formatCardSchedule(card); } return SR_HTML_COMMENT_BEGIN + accumulatedSchedules + SR_HTML_COMMENT_END; } /** * Formats a card's scheduling information as a comment. * * It will return either the existing scheduling information or a default value if the card has no scheduling information. * * @param {Card} card - The card. * @returns {string} - The formatted card schedule. */ formatCardSchedule(card) { if (card.hasSchedule && card.scheduleInfo) { return card.scheduleInfo.formatScheduleAsSRHtmlComment(); } return `!${RepItemScheduleInfoOsr.dummyDueDateForNewCard},${RepItemScheduleInfoOsr.initialInterval},${this.settings.baseEase}`; } }; // src/scheduling/algorithms/fsrs/fsrs-helpers.ts var import_moment5 = __toESM(require_moment()); // node_modules/.pnpm/ts-fsrs@5.4.1/node_modules/ts-fsrs/dist/index.mjs var FSRSError = class _FSRSError extends Error { constructor(message = "FSRS Error") { var _a2; super(message); this.name = "FSRSError"; (_a2 = Error.captureStackTrace) == null ? void 0 : _a2.call(Error, this, _FSRSError); } }; var FSRSValidationError = class _FSRSValidationError extends FSRSError { constructor(message) { var _a2; super(message); this.name = "FSRSValidationError"; (_a2 = Error.captureStackTrace) == null ? void 0 : _a2.call(Error, this, _FSRSValidationError); } }; var State = /* @__PURE__ */ ((State2) => { State2[State2["New"] = 0] = "New"; State2[State2["Learning"] = 1] = "Learning"; State2[State2["Review"] = 2] = "Review"; State2[State2["Relearning"] = 3] = "Relearning"; return State2; })(State || {}); var Rating = /* @__PURE__ */ ((Rating2) => { Rating2[Rating2["Manual"] = 0] = "Manual"; Rating2[Rating2["Again"] = 1] = "Again"; Rating2[Rating2["Hard"] = 2] = "Hard"; Rating2[Rating2["Good"] = 3] = "Good"; Rating2[Rating2["Easy"] = 4] = "Easy"; return Rating2; })(Rating || {}); var TypeConvert = class _TypeConvert { static card(card) { return { ...card, state: _TypeConvert.state(card.state), due: _TypeConvert.time(card.due), last_review: card.last_review ? _TypeConvert.time(card.last_review) : void 0 }; } static rating(value) { if (typeof value === "string") { const firstLetter = value.charAt(0).toUpperCase(); const restOfString = value.slice(1).toLowerCase(); const ret = Rating[`${firstLetter}${restOfString}`]; if (ret === void 0) { throw new FSRSValidationError(`Invalid rating:[${value}]`); } return ret; } else if (typeof value === "number") { return value; } throw new FSRSValidationError(`Invalid rating:[${value}]`); } static state(value) { if (typeof value === "string") { const firstLetter = value.charAt(0).toUpperCase(); const restOfString = value.slice(1).toLowerCase(); const ret = State[`${firstLetter}${restOfString}`]; if (ret === void 0) { throw new FSRSValidationError(`Invalid state:[${value}]`); } return ret; } else if (typeof value === "number") { return value; } throw new FSRSValidationError(`Invalid state:[${value}]`); } static time(value) { if (value instanceof Date) { return value; } const date = new Date(value); if (typeof value === "object" && value !== null && !Number.isNaN(Date.parse(value) || +date)) { return date; } else if (typeof value === "string") { const timestamp = Date.parse(value); if (!Number.isNaN(timestamp)) { return new Date(timestamp); } else { throw new FSRSValidationError(`Invalid date:[${value}]`); } } else if (typeof value === "number") { return new Date(value); } throw new FSRSValidationError(`Invalid date:[${value}]`); } static review_log(log) { return { ...log, due: _TypeConvert.time(log.due), rating: _TypeConvert.rating(log.rating), state: _TypeConvert.state(log.state), review: _TypeConvert.time(log.review) }; } }; Date.prototype.scheduler = function(t3, isDay) { return date_scheduler(this, t3, isDay); }; Date.prototype.diff = function(pre, unit) { return date_diff(this, pre, unit); }; Date.prototype.format = function() { return formatDate2(this); }; Date.prototype.dueFormat = function(last_review, unit, timeUnit) { return show_diff_message(this, last_review, unit, timeUnit); }; function date_scheduler(now2, t3, isDay) { return new Date( isDay ? TypeConvert.time(now2).getTime() + t3 * 24 * 60 * 60 * 1e3 : TypeConvert.time(now2).getTime() + t3 * 60 * 1e3 ); } function date_diff(now2, pre, unit) { if (!now2 || !pre) { throw new FSRSValidationError("Invalid date"); } const diff = TypeConvert.time(now2).getTime() - TypeConvert.time(pre).getTime(); let r2 = 0; switch (unit) { case "days": r2 = Math.floor(diff / (24 * 60 * 60 * 1e3)); break; case "minutes": r2 = Math.floor(diff / (60 * 1e3)); break; } return r2; } function formatDate2(dateInput) { const date = TypeConvert.time(dateInput); const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hours = date.getHours(); const minutes = date.getMinutes(); const seconds = date.getSeconds(); return `${year}-${padZero(month)}-${padZero(day)} ${padZero(hours)}:${padZero( minutes )}:${padZero(seconds)}`; } function padZero(num) { return num < 10 ? `0${num}` : `${num}`; } var TIMEUNIT = [60, 60, 24, 31, 12]; var TIMEUNITFORMAT = ["second", "min", "hour", "day", "month", "year"]; function show_diff_message(due, last_review, unit, timeUnit = TIMEUNITFORMAT) { due = TypeConvert.time(due); last_review = TypeConvert.time(last_review); if (timeUnit.length !== TIMEUNITFORMAT.length) { timeUnit = TIMEUNITFORMAT; } let diff = due.getTime() - last_review.getTime(); let i2 = 0; diff /= 1e3; for (i2 = 0; i2 < TIMEUNIT.length; i2++) { if (diff < TIMEUNIT[i2]) { break; } else { diff /= TIMEUNIT[i2]; } } return `${Math.floor(diff)}${unit ? timeUnit[i2] : ""}`; } var Grades = Object.freeze([ Rating.Again, Rating.Hard, Rating.Good, Rating.Easy ]); var FUZZ_RANGES = [ { start: 2.5, end: 7, factor: 0.15 }, { start: 7, end: 20, factor: 0.1 }, { start: 20, end: Infinity, factor: 0.05 } ]; function get_fuzz_range(interval, elapsed_days, maximum_interval) { let delta = 1; for (const range2 of FUZZ_RANGES) { delta += range2.factor * Math.max(Math.min(interval, range2.end) - range2.start, 0); } interval = Math.min(interval, maximum_interval); let min_ivl = Math.max(2, Math.round(interval - delta)); const max_ivl = Math.min(Math.round(interval + delta), maximum_interval); if (interval > elapsed_days) { min_ivl = Math.max(min_ivl, elapsed_days + 1); } min_ivl = Math.min(min_ivl, max_ivl); return { min_ivl, max_ivl }; } function clamp(value, min, max) { return Math.min(Math.max(value, min), max); } function roundTo(num, decimals) { const factor = 10 ** decimals; return Math.round(num * factor) / factor; } function dateDiffInDays(last, cur) { const utc1 = Date.UTC( last.getUTCFullYear(), last.getUTCMonth(), last.getUTCDate() ); const utc2 = Date.UTC( cur.getUTCFullYear(), cur.getUTCMonth(), cur.getUTCDate() ); return Math.floor( (utc2 - utc1) / 864e5 /** 1000 * 60 * 60 * 24*/ ); } var ConvertStepUnitToMinutes = (step) => { const unit = step.slice(-1); const value = parseInt(step.slice(0, -1), 10); if (Number.isNaN(value) || !Number.isFinite(value) || value < 0) { throw new FSRSValidationError(`Invalid step value: ${step}`); } switch (unit) { case "m": return value; case "h": return value * 60; case "d": return value * 1440; default: throw new FSRSValidationError( `Invalid step unit: ${step}, expected m/h/d` ); } }; var BasicLearningStepsStrategy = (params, state, cur_step) => { const learning_steps = state === State.Relearning || state === State.Review ? params.relearning_steps : params.learning_steps; const steps_length = learning_steps.length; if (steps_length === 0 || cur_step >= steps_length) return {}; const firstStep = learning_steps[0]; const toMinutes = ConvertStepUnitToMinutes; const getAgainInterval = () => { return toMinutes(firstStep); }; const getHardInterval = () => { if (steps_length === 1) return Math.round(toMinutes(firstStep) * 1.5); const nextStep = learning_steps[1]; return Math.round((toMinutes(firstStep) + toMinutes(nextStep)) / 2); }; const getStepInfo = (index) => { if (index < 0 || index >= steps_length) { return null; } else { return learning_steps[index]; } }; const getGoodMinutes = (step) => { return toMinutes(step); }; const result = {}; const step_info = getStepInfo(Math.max(0, cur_step)); if (state === State.Review) { result[Rating.Again] = { scheduled_minutes: toMinutes(step_info), next_step: 0 }; return result; } else { result[Rating.Again] = { scheduled_minutes: getAgainInterval(), next_step: 0 }; result[Rating.Hard] = { scheduled_minutes: getHardInterval(), next_step: cur_step }; const next_info = getStepInfo(cur_step + 1); if (next_info) { const nextMin = getGoodMinutes(next_info); if (nextMin) { result[Rating.Good] = { scheduled_minutes: Math.round(nextMin), next_step: cur_step + 1 }; } } } return result; }; function DefaultInitSeedStrategy() { const time = this.review_time.getTime(); const reps = this.current.reps; const mul = this.current.difficulty * this.current.stability; return `${time}_${reps}_${mul}`; } var StrategyMode = /* @__PURE__ */ ((StrategyMode2) => { StrategyMode2["SCHEDULER"] = "Scheduler"; StrategyMode2["LEARNING_STEPS"] = "LearningSteps"; StrategyMode2["SEED"] = "Seed"; return StrategyMode2; })(StrategyMode || {}); var AbstractScheduler = class { // init constructor(card, now2, algorithm, strategies) { __publicField(this, "last"); __publicField(this, "current"); __publicField(this, "review_time"); __publicField(this, "next", /* @__PURE__ */ new Map()); __publicField(this, "algorithm"); __publicField(this, "strategies"); __publicField(this, "elapsed_days", 0); this.algorithm = algorithm; this.last = TypeConvert.card(card); this.current = TypeConvert.card(card); this.review_time = TypeConvert.time(now2); this.strategies = strategies; this.init(); } checkGrade(grade) { if (!Number.isFinite(grade) || grade < 1 || grade > 4) { throw new FSRSValidationError(`Invalid grade "${grade}",expected 1-4`); } } init() { const { state, last_review } = this.current; let interval = 0; if (state !== State.New && last_review) { interval = dateDiffInDays(last_review, this.review_time); } this.current.last_review = this.review_time; this.elapsed_days = interval; this.current.elapsed_days = interval; this.current.reps += 1; let seed_strategy = DefaultInitSeedStrategy; if (this.strategies) { const custom_strategy = this.strategies.get(StrategyMode.SEED); if (custom_strategy) { seed_strategy = custom_strategy; } } this.algorithm.seed = seed_strategy.call(this); } preview() { return { [Rating.Again]: this.review(Rating.Again), [Rating.Hard]: this.review(Rating.Hard), [Rating.Good]: this.review(Rating.Good), [Rating.Easy]: this.review(Rating.Easy), [Symbol.iterator]: this.previewIterator.bind(this) }; } *previewIterator() { for (const grade of Grades) { yield this.review(grade); } } review(grade) { const { state } = this.last; let item; this.checkGrade(grade); switch (state) { case State.New: item = this.newState(grade); break; case State.Learning: case State.Relearning: item = this.learningState(grade); break; case State.Review: item = this.reviewState(grade); break; } return item; } buildLog(rating) { const { last_review, due, elapsed_days } = this.last; return { rating, state: this.current.state, due: last_review || due, stability: this.current.stability, difficulty: this.current.difficulty, elapsed_days: this.elapsed_days, last_elapsed_days: elapsed_days, scheduled_days: this.current.scheduled_days, learning_steps: this.current.learning_steps, review: this.review_time }; } }; var Alea = class { constructor(seed) { __publicField(this, "c"); __publicField(this, "s0"); __publicField(this, "s1"); __publicField(this, "s2"); const mash = Mash(); this.c = 1; this.s0 = mash(" "); this.s1 = mash(" "); this.s2 = mash(" "); if (seed == null) seed = Date.now(); this.s0 -= mash(seed); if (this.s0 < 0) this.s0 += 1; this.s1 -= mash(seed); if (this.s1 < 0) this.s1 += 1; this.s2 -= mash(seed); if (this.s2 < 0) this.s2 += 1; } next() { const t3 = 2091639 * this.s0 + this.c * 23283064365386963e-26; this.s0 = this.s1; this.s1 = this.s2; this.c = t3 | 0; this.s2 = t3 - this.c; return this.s2; } set state(state) { this.c = state.c; this.s0 = state.s0; this.s1 = state.s1; this.s2 = state.s2; } get state() { return { c: this.c, s0: this.s0, s1: this.s1, s2: this.s2 }; } }; function Mash() { let n2 = 4022871197; return function mash(data) { data = String(data); for (let i2 = 0; i2 < data.length; i2++) { n2 += data.charCodeAt(i2); let h3 = 0.02519603282416938 * n2; n2 = h3 >>> 0; h3 -= n2; h3 *= n2; n2 = h3 >>> 0; h3 -= n2; n2 += h3 * 4294967296; } return (n2 >>> 0) * 23283064365386963e-26; }; } function alea(seed) { const xg = new Alea(seed); const prng = () => xg.next(); prng.int32 = () => xg.next() * 4294967296 | 0; prng.double = () => prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; prng.state = () => xg.state; prng.importState = (state) => { xg.state = state; return prng; }; return prng; } var version2 = "5.4.1"; var default_request_retention = 0.9; var default_maximum_interval = 36500; var default_enable_fuzz = false; var default_enable_short_term = true; var default_learning_steps = Object.freeze([ "1m", "10m" ]); var default_relearning_steps = Object.freeze([ "10m" ]); var FSRSVersion = `v${version2} using FSRS-6.0`; var S_MIN = 1e-3; var INIT_S_MAX = 100; var FSRS5_DEFAULT_DECAY = 0.5; var FSRS6_DEFAULT_DECAY = 0.1542; var default_w = Object.freeze([ 0.212, 1.2931, 2.3065, 8.2956, 6.4133, 0.8334, 3.0194, 1e-3, 1.8722, 0.1666, 0.796, 1.4835, 0.0614, 0.2629, 1.6483, 0.6014, 1.8729, 0.5425, 0.0912, 0.0658, FSRS6_DEFAULT_DECAY ]); var W17_W18_Ceiling = 2; var CLAMP_PARAMETERS = (w17_w18_ceiling, enable_short_term = default_enable_short_term) => [ [S_MIN, INIT_S_MAX], [S_MIN, INIT_S_MAX], [S_MIN, INIT_S_MAX], [S_MIN, INIT_S_MAX], [1, 10], [1e-3, 4], [1e-3, 4], [1e-3, 0.75], [0, 4.5], [0, 0.8], [1e-3, 3.5], [1e-3, 5], [1e-3, 0.25], [1e-3, 0.9], [0, 4], [0, 1], [1, 6], [0, w17_w18_ceiling], [0, w17_w18_ceiling], [ enable_short_term ? 0.01 : 0, 0.8 ], [0.1, 0.8] ]; var clipParameters = (parameters, numRelearningSteps, enableShortTerm = default_enable_short_term) => { const clip = CLAMP_PARAMETERS(W17_W18_Ceiling, enableShortTerm).slice( 0, parameters.length ); if (Math.max(0, numRelearningSteps) > 1) { const w11 = clamp(parameters[11] || 0, clip[11][0], clip[11][1]); const w13 = clamp(parameters[13] || 0, clip[13][0], clip[13][1]); const w14 = clamp(parameters[14] || 0, clip[14][0], clip[14][1]); const value = -(Math.log(w11) + Math.log(Math.pow(2, w13) - 1) + w14 * 0.3) / numRelearningSteps; const w17_w18_ceiling = clamp( roundTo(Math.sqrt(Math.max(value, 0)), 8), 0.01, W17_W18_Ceiling ); if (clip[17]) clip[17] = [clip[17][0], w17_w18_ceiling]; if (clip[18]) clip[18] = [clip[18][0], w17_w18_ceiling]; } return clip.map( ([min, max], index) => clamp(parameters[index] || 0, min, max) ); }; var migrateParameters = (parameters, numRelearningSteps = 0, enableShortTerm = default_enable_short_term) => { if (parameters === void 0) { return [...default_w]; } switch (parameters.length) { case 21: return clipParameters( Array.from(parameters), numRelearningSteps, enableShortTerm ); case 19: console.debug("[FSRS-6]auto fill w from 19 to 21 length"); return clipParameters( Array.from(parameters), numRelearningSteps, enableShortTerm ).concat([0, FSRS5_DEFAULT_DECAY]); case 17: { const w2 = clipParameters( Array.from(parameters), numRelearningSteps, enableShortTerm ); w2[4] = +(w2[5] * 2 + w2[4]).toFixed(8); w2[5] = +(Math.log(w2[5] * 3 + 1) / 3).toFixed(8); w2[6] = +(w2[6] + 0.5).toFixed(8); console.debug("[FSRS-6]auto fill w from 17 to 21 length"); return w2.concat([0, 0, 0, FSRS5_DEFAULT_DECAY]); } default: console.warn("[FSRS]Invalid parameters length, using default parameters"); return [...default_w]; } }; var generatorParameters = (props) => { var _a2, _b; const learning_steps = Array.isArray(props == null ? void 0 : props.learning_steps) ? props.learning_steps : default_learning_steps; const relearning_steps = Array.isArray(props == null ? void 0 : props.relearning_steps) ? props.relearning_steps : default_relearning_steps; const enable_short_term = (_a2 = props == null ? void 0 : props.enable_short_term) != null ? _a2 : default_enable_short_term; const w2 = migrateParameters( props == null ? void 0 : props.w, relearning_steps.length, enable_short_term ); return { request_retention: (props == null ? void 0 : props.request_retention) || default_request_retention, maximum_interval: (props == null ? void 0 : props.maximum_interval) || default_maximum_interval, w: w2, enable_fuzz: (_b = props == null ? void 0 : props.enable_fuzz) != null ? _b : default_enable_fuzz, enable_short_term, learning_steps, relearning_steps }; }; function createEmptyCard(now2, afterHandler) { const emptyCard = { due: now2 ? TypeConvert.time(now2) : /* @__PURE__ */ new Date(), stability: 0, difficulty: 0, elapsed_days: 0, scheduled_days: 0, reps: 0, lapses: 0, learning_steps: 0, state: State.New, last_review: void 0 }; if (afterHandler && typeof afterHandler === "function") { return afterHandler(emptyCard); } else { return emptyCard; } } var computeDecayFactor = (decayOrParams) => { const decay = typeof decayOrParams === "number" ? -decayOrParams : -decayOrParams[20]; const factor = Math.exp(Math.pow(decay, -1) * Math.log(0.9)) - 1; return { decay, factor: roundTo(factor, 8) }; }; function forgetting_curve(decayOrParams, elapsed_days, stability) { const { decay, factor } = computeDecayFactor(decayOrParams); return roundTo(Math.pow(1 + factor * elapsed_days / stability, decay), 8); } var FSRSAlgorithm = class { constructor(params) { __publicField(this, "param"); __publicField(this, "intervalModifier"); __publicField(this, "_seed"); /** * The formula used is : * $$R(t,S) = (1 + \text{FACTOR} \times \frac{t}{9 \cdot S})^{\text{DECAY}}$$ * @param {number} elapsed_days t days since the last review * @param {number} stability Stability (interval when R=90%) * @return {number} r Retrievability (probability of recall) */ __publicField(this, "forgetting_curve"); this.param = new Proxy( generatorParameters(params), this.params_handler_proxy() ); this.intervalModifier = this.calculate_interval_modifier( this.param.request_retention ); this.forgetting_curve = forgetting_curve.bind(this, this.param.w); } get interval_modifier() { return this.intervalModifier; } set seed(seed) { this._seed = seed; } /** * @see https://github.com/open-spaced-repetition/fsrs4anki/wiki/The-Algorithm#fsrs-5 * * The formula used is: $$I(r,s) = (r^{\frac{1}{DECAY}} - 1) / FACTOR \times s$$ * @param request_retention 0 1) { throw new FSRSValidationError( "Requested retention rate should be in the range (0,1]" ); } const { decay, factor } = computeDecayFactor(this.param.w); return roundTo((Math.pow(request_retention, 1 / decay) - 1) / factor, 8); } /** * Get the parameters of the algorithm. */ get parameters() { return this.param; } /** * Set the parameters of the algorithm. * @param params Partial */ set parameters(params) { this.update_parameters(params); } params_handler_proxy() { const _this = this; return { set: function(target, prop, value) { if (prop === "request_retention" && Number.isFinite(value)) { _this.intervalModifier = _this.calculate_interval_modifier( Number(value) ); } else if (prop === "w") { value = migrateParameters( value, target.relearning_steps.length, target.enable_short_term ); _this.forgetting_curve = forgetting_curve.bind(this, value); _this.intervalModifier = _this.calculate_interval_modifier( Number(target.request_retention) ); } Reflect.set(target, prop, value); return true; } }; } update_parameters(params) { const _params = generatorParameters(params); for (const key in _params) { const paramKey = key; this.param[paramKey] = _params[paramKey]; } } /** * The formula used is : * $$ S_0(G) = w_{G-1}$$ * $$S_0 = \max \lbrace S_0,0.1\rbrace $$ * @param g Grade (rating at Anki) [1.again,2.hard,3.good,4.easy] * @return Stability (interval when R=90%) */ init_stability(g2) { return Math.max(this.param.w[g2 - 1], 0.1); } /** * The formula used is : * $$D_0(G) = w_4 - e^{(G-1) \cdot w_5} + 1 $$ * $$D_0 = \min \lbrace \max \lbrace D_0(G),1 \rbrace,10 \rbrace$$ * where the $$D_0(1)=w_4$$ when the first rating is good. * * @param {Grade} g Grade (rating at Anki) [1.again,2.hard,3.good,4.easy] * @return {number} Difficulty $$D \in [1,10]$$ */ init_difficulty(g2) { const w2 = this.param.w; const d2 = w2[4] - Math.exp((g2 - 1) * w2[5]) + 1; return roundTo(d2, 8); } /** * If fuzzing is disabled or ivl is less than 2.5, it returns the original interval. * @param {number} ivl - The interval to be fuzzed. * @param {number} elapsed_days t days since the last review * @return {number} - The fuzzed interval. **/ apply_fuzz(ivl, elapsed_days) { if (!this.param.enable_fuzz || ivl < 2.5) return Math.round(ivl); const generator = alea(this._seed); const fuzz_factor = generator(); const { min_ivl, max_ivl } = get_fuzz_range( ivl, elapsed_days, this.param.maximum_interval ); return Math.floor(fuzz_factor * (max_ivl - min_ivl + 1) + min_ivl); } /** * @see The formula used is : {@link FSRSAlgorithm.calculate_interval_modifier} * @param {number} s - Stability (interval when R=90%) * @param {number} elapsed_days t days since the last review */ next_interval(s2, elapsed_days) { const newInterval = Math.min( Math.max(1, Math.round(s2 * this.intervalModifier)), this.param.maximum_interval ); return this.apply_fuzz(newInterval, elapsed_days); } /** * @see https://github.com/open-spaced-repetition/fsrs4anki/issues/697 */ linear_damping(delta_d, old_d) { return roundTo(delta_d * (10 - old_d) / 9, 8); } /** * The formula used is : * $$\text{delta}_d = -w_6 \cdot (g - 3)$$ * $$\text{next}_d = D + \text{linear damping}(\text{delta}_d , D)$$ * $$D^\prime(D,R) = w_7 \cdot D_0(4) +(1 - w_7) \cdot \text{next}_d$$ * @param {number} d Difficulty $$D \in [1,10]$$ * @param {Grade} g Grade (rating at Anki) [1.again,2.hard,3.good,4.easy] * @return {number} $$\text{next}_D$$ */ next_difficulty(d2, g2) { const delta_d = -this.param.w[6] * (g2 - 3); const next_d = d2 + this.linear_damping(delta_d, d2); return clamp( this.mean_reversion(this.init_difficulty(Rating.Easy), next_d), 1, 10 ); } /** * The formula used is : * $$w_7 \cdot \text{init} +(1 - w_7) \cdot \text{current}$$ * @param {number} init $$w_2 : D_0(3) = w_2 + (R-2) \cdot w_3= w_2$$ * @param {number} current $$D - w_6 \cdot (R - 2)$$ * @return {number} difficulty */ mean_reversion(init, current) { const w2 = this.param.w; return roundTo(w2[7] * init + (1 - w2[7]) * current, 8); } /** * The formula used is : * $$S^\prime_r(D,S,R,G) = S\cdot(e^{w_8}\cdot (11-D)\cdot S^{-w_9}\cdot(e^{w_{10}\cdot(1-R)}-1)\cdot w_{15}(\text{if} G=2) \cdot w_{16}(\text{if} G=4)+1)$$ * @param {number} d Difficulty D \in [1,10] * @param {number} s Stability (interval when R=90%) * @param {number} r Retrievability (probability of recall) * @param {Grade} g Grade (Rating[0.again,1.hard,2.good,3.easy]) * @return {number} S^\prime_r new stability after recall */ next_recall_stability(d2, s2, r2, g2) { const w2 = this.param.w; const hard_penalty = Rating.Hard === g2 ? w2[15] : 1; const easy_bound = Rating.Easy === g2 ? w2[16] : 1; return roundTo( clamp( s2 * (1 + Math.exp(w2[8]) * (11 - d2) * Math.pow(s2, -w2[9]) * (Math.exp((1 - r2) * w2[10]) - 1) * hard_penalty * easy_bound), S_MIN, 36500 ), 8 ); } /** * The formula used is : * $$S^\prime_f(D,S,R) = w_{11}\cdot D^{-w_{12}}\cdot ((S+1)^{w_{13}}-1) \cdot e^{w_{14}\cdot(1-R)}$$ * enable_short_term = true : $$S^\prime_f \in \min \lbrace \max \lbrace S^\prime_f,0.01\rbrace, \frac{S}{e^{w_{17} \cdot w_{18}}} \rbrace$$ * enable_short_term = false : $$S^\prime_f \in \min \lbrace \max \lbrace S^\prime_f,0.01\rbrace, S \rbrace$$ * @param {number} d Difficulty D \in [1,10] * @param {number} s Stability (interval when R=90%) * @param {number} r Retrievability (probability of recall) * @return {number} S^\prime_f new stability after forgetting */ next_forget_stability(d2, s2, r2) { const w2 = this.param.w; return roundTo( clamp( w2[11] * Math.pow(d2, -w2[12]) * (Math.pow(s2 + 1, w2[13]) - 1) * Math.exp((1 - r2) * w2[14]), S_MIN, 36500 ), 8 ); } /** * The formula used is : * $$S^\prime_s(S,G) = S \cdot e^{w_{17} \cdot (G-3+w_{18})}$$ * @param {number} s Stability (interval when R=90%) * @param {Grade} g Grade (Rating[0.again,1.hard,2.good,3.easy]) */ next_short_term_stability(s2, g2) { const w2 = this.param.w; const sinc = Math.pow(s2, -w2[19]) * Math.exp(w2[17] * (g2 - 3 + w2[18])); const maskedSinc = g2 >= Rating.Hard ? Math.max(sinc, 1) : sinc; return roundTo(clamp(s2 * maskedSinc, S_MIN, 36500), 8); } /** * Calculates the next state of memory based on the current state, time elapsed, and grade. * * @param memory_state - The current state of memory, which can be null. * @param t - The time elapsed since the last review. * @param {Rating} g Grade (Rating[0.Manual,1.Again,2.Hard,3.Good,4.Easy]) * @param r - Optional retrievability value. If not provided, it will be calculated. * @returns The next state of memory with updated difficulty and stability. */ next_state(memory_state, t3, g2, r2) { const { difficulty: d2, stability: s2 } = memory_state != null ? memory_state : { difficulty: 0, stability: 0 }; if (t3 < 0) { throw new FSRSValidationError(`Invalid delta_t "${t3}"`); } if (g2 < 0 || g2 > 4) { throw new FSRSValidationError(`Invalid grade "${g2}"`); } if (d2 === 0 && s2 === 0) { return { difficulty: clamp(this.init_difficulty(g2), 1, 10), stability: this.init_stability(g2) }; } if (g2 === 0) { return { difficulty: d2, stability: s2 }; } if (d2 < 1 || s2 < S_MIN) { throw new FSRSValidationError( `Invalid memory state { difficulty: ${d2}, stability: ${s2} }` ); } const w2 = this.param.w; r2 = typeof r2 === "number" ? r2 : this.forgetting_curve(t3, s2); let new_s; if (t3 === 0 && this.param.enable_short_term) { new_s = this.next_short_term_stability(s2, g2); } else if (g2 === 1) { const s_after_fail = this.next_forget_stability(d2, s2, r2); let [w_17, w_18] = [0, 0]; if (this.param.enable_short_term) { w_17 = w2[17]; w_18 = w2[18]; } const next_s_min = s2 / Math.exp(w_17 * w_18); new_s = clamp(roundTo(next_s_min, 8), S_MIN, s_after_fail); } else { new_s = this.next_recall_stability(d2, s2, r2, g2); } const new_d = this.next_difficulty(d2, g2); return { difficulty: new_d, stability: new_s }; } }; var BasicScheduler = class extends AbstractScheduler { constructor(card, now2, algorithm, strategies) { super(card, now2, algorithm, strategies); __publicField(this, "learningStepsStrategy"); let learningStepStrategy = BasicLearningStepsStrategy; if (this.strategies) { const custom_strategy = this.strategies.get(StrategyMode.LEARNING_STEPS); if (custom_strategy) { learningStepStrategy = custom_strategy; } } this.learningStepsStrategy = learningStepStrategy; } getLearningInfo(card, grade) { var _a2, _b, _c, _d; const parameters = this.algorithm.parameters; card.learning_steps = card.learning_steps || 0; const steps_strategy = this.learningStepsStrategy( parameters, card.state, card.learning_steps ); const scheduled_minutes = Math.max( 0, (_b = (_a2 = steps_strategy[grade]) == null ? void 0 : _a2.scheduled_minutes) != null ? _b : 0 ); const next_steps = Math.max(0, (_d = (_c = steps_strategy[grade]) == null ? void 0 : _c.next_step) != null ? _d : 0); return { scheduled_minutes, next_steps }; } /** * @description This function applies the learning steps based on the current card's state and grade. */ applyLearningSteps(nextCard, grade, to_state) { const { scheduled_minutes, next_steps } = this.getLearningInfo( this.current, grade ); if (scheduled_minutes > 0 && scheduled_minutes < 1440) { nextCard.learning_steps = next_steps; nextCard.scheduled_days = 0; nextCard.state = to_state; nextCard.due = date_scheduler( this.review_time, Math.round(scheduled_minutes), false /** true:days false: minute */ ); } else { nextCard.state = State.Review; if (scheduled_minutes >= 1440) { nextCard.learning_steps = next_steps; nextCard.due = date_scheduler( this.review_time, Math.round(scheduled_minutes), false /** true:days false: minute */ ); nextCard.scheduled_days = Math.floor(scheduled_minutes / 1440); } else { nextCard.learning_steps = 0; const interval = this.algorithm.next_interval( nextCard.stability, this.elapsed_days ); nextCard.scheduled_days = interval; nextCard.due = date_scheduler(this.review_time, interval, true); } } } newState(grade) { const exist = this.next.get(grade); if (exist) { return exist; } const next = this.next_ds(this.elapsed_days, grade); this.applyLearningSteps(next, grade, State.Learning); const item = { card: next, log: this.buildLog(grade) }; this.next.set(grade, item); return item; } learningState(grade) { const exist = this.next.get(grade); if (exist) { return exist; } const next = this.next_ds(this.elapsed_days, grade); this.applyLearningSteps( next, grade, this.last.state /** Learning or Relearning */ ); const item = { card: next, log: this.buildLog(grade) }; this.next.set(grade, item); return item; } reviewState(grade) { const exist = this.next.get(grade); if (exist) { return exist; } const interval = this.elapsed_days; const retrievability = this.algorithm.forgetting_curve( interval, this.current.stability ); const next_again = this.next_ds(interval, Rating.Again, retrievability); const next_hard = this.next_ds(interval, Rating.Hard, retrievability); const next_good = this.next_ds(interval, Rating.Good, retrievability); const next_easy = this.next_ds(interval, Rating.Easy, retrievability); this.next_interval(next_hard, next_good, next_easy, interval); this.next_state(next_hard, next_good, next_easy); this.applyLearningSteps(next_again, Rating.Again, State.Relearning); next_again.lapses += 1; const item_again = { card: next_again, log: this.buildLog(Rating.Again) }; const item_hard = { card: next_hard, log: super.buildLog(Rating.Hard) }; const item_good = { card: next_good, log: super.buildLog(Rating.Good) }; const item_easy = { card: next_easy, log: super.buildLog(Rating.Easy) }; this.next.set(Rating.Again, item_again); this.next.set(Rating.Hard, item_hard); this.next.set(Rating.Good, item_good); this.next.set(Rating.Easy, item_easy); return this.next.get(grade); } /** * Review next_ds */ next_ds(t3, g2, r2) { const next_state = this.algorithm.next_state( { difficulty: this.current.difficulty, stability: this.current.stability }, t3, g2, r2 ); const card = TypeConvert.card(this.current); card.difficulty = next_state.difficulty; card.stability = next_state.stability; return card; } /** * Review next_interval */ next_interval(next_hard, next_good, next_easy, interval) { let hard_interval, good_interval; hard_interval = this.algorithm.next_interval(next_hard.stability, interval); good_interval = this.algorithm.next_interval(next_good.stability, interval); hard_interval = Math.min(hard_interval, good_interval); good_interval = Math.max(good_interval, hard_interval + 1); const easy_interval = Math.max( this.algorithm.next_interval(next_easy.stability, interval), good_interval + 1 ); next_hard.scheduled_days = hard_interval; next_hard.due = date_scheduler(this.review_time, hard_interval, true); next_good.scheduled_days = good_interval; next_good.due = date_scheduler(this.review_time, good_interval, true); next_easy.scheduled_days = easy_interval; next_easy.due = date_scheduler(this.review_time, easy_interval, true); } /** * Review next_state */ next_state(next_hard, next_good, next_easy) { next_hard.state = State.Review; next_hard.learning_steps = 0; next_good.state = State.Review; next_good.learning_steps = 0; next_easy.state = State.Review; next_easy.learning_steps = 0; } }; var LongTermScheduler = class extends AbstractScheduler { newState(grade) { const exist = this.next.get(grade); if (exist) { return exist; } this.current.scheduled_days = 0; this.current.elapsed_days = 0; const first_interval = 0; const next_again = this.next_ds(first_interval, Rating.Again); const next_hard = this.next_ds(first_interval, Rating.Hard); const next_good = this.next_ds(first_interval, Rating.Good); const next_easy = this.next_ds(first_interval, Rating.Easy); this.next_interval( next_again, next_hard, next_good, next_easy, first_interval ); this.next_state(next_again, next_hard, next_good, next_easy); this.update_next(next_again, next_hard, next_good, next_easy); return this.next.get(grade); } next_ds(t3, g2, r2) { const next_state = this.algorithm.next_state( { difficulty: this.current.difficulty, stability: this.current.stability }, t3, g2, r2 ); const card = TypeConvert.card(this.current); card.difficulty = next_state.difficulty; card.stability = next_state.stability; return card; } /** * @see https://github.com/open-spaced-repetition/ts-fsrs/issues/98#issuecomment-2241923194 */ learningState(grade) { return this.reviewState(grade); } reviewState(grade) { const exist = this.next.get(grade); if (exist) { return exist; } const interval = this.elapsed_days; const retrievability = this.algorithm.forgetting_curve( interval, this.current.stability ); const next_again = this.next_ds(interval, Rating.Again, retrievability); const next_hard = this.next_ds(interval, Rating.Hard, retrievability); const next_good = this.next_ds(interval, Rating.Good, retrievability); const next_easy = this.next_ds(interval, Rating.Easy, retrievability); this.next_interval(next_again, next_hard, next_good, next_easy, interval); this.next_state(next_again, next_hard, next_good, next_easy); next_again.lapses += 1; this.update_next(next_again, next_hard, next_good, next_easy); return this.next.get(grade); } /** * Review/New next_interval */ next_interval(next_again, next_hard, next_good, next_easy, interval) { let again_interval, hard_interval, good_interval, easy_interval; again_interval = this.algorithm.next_interval( next_again.stability, interval ); hard_interval = this.algorithm.next_interval(next_hard.stability, interval); good_interval = this.algorithm.next_interval(next_good.stability, interval); easy_interval = this.algorithm.next_interval(next_easy.stability, interval); again_interval = Math.min(again_interval, hard_interval); hard_interval = Math.max(hard_interval, again_interval + 1); good_interval = Math.max(good_interval, hard_interval + 1); easy_interval = Math.max(easy_interval, good_interval + 1); next_again.scheduled_days = again_interval; next_again.due = date_scheduler(this.review_time, again_interval, true); next_hard.scheduled_days = hard_interval; next_hard.due = date_scheduler(this.review_time, hard_interval, true); next_good.scheduled_days = good_interval; next_good.due = date_scheduler(this.review_time, good_interval, true); next_easy.scheduled_days = easy_interval; next_easy.due = date_scheduler(this.review_time, easy_interval, true); } /** * Review/New next_state */ next_state(next_again, next_hard, next_good, next_easy) { next_again.state = State.Review; next_again.learning_steps = 0; next_hard.state = State.Review; next_hard.learning_steps = 0; next_good.state = State.Review; next_good.learning_steps = 0; next_easy.state = State.Review; next_easy.learning_steps = 0; } update_next(next_again, next_hard, next_good, next_easy) { const item_again = { card: next_again, log: this.buildLog(Rating.Again) }; const item_hard = { card: next_hard, log: super.buildLog(Rating.Hard) }; const item_good = { card: next_good, log: super.buildLog(Rating.Good) }; const item_easy = { card: next_easy, log: super.buildLog(Rating.Easy) }; this.next.set(Rating.Again, item_again); this.next.set(Rating.Hard, item_hard); this.next.set(Rating.Good, item_good); this.next.set(Rating.Easy, item_easy); } }; var Reschedule = class { /** * Creates an instance of the `Reschedule` class. * @param fsrs - An instance of the FSRS class used for scheduling. */ constructor(fsrs2) { __publicField(this, "fsrs"); this.fsrs = fsrs2; } /** * Replays a review for a card and determines the next review date based on the given rating. * @param card - The card being reviewed. * @param reviewed - The date the card was reviewed. * @param rating - The grade given to the card during the review. * @returns A `RecordLogItem` containing the updated card and review log. */ replay(card, reviewed, rating) { return this.fsrs.next(card, reviewed, rating); } /** * Processes a manual review for a card, allowing for custom state, stability, difficulty, and due date. * @param card - The card being reviewed. * @param state - The state of the card after the review. * @param reviewed - The date the card was reviewed. * @param elapsed_days - The number of days since the last review. * @param stability - (Optional) The stability of the card. * @param difficulty - (Optional) The difficulty of the card. * @param due - (Optional) The due date for the next review. * @returns A `RecordLogItem` containing the updated card and review log. * @throws Will throw an error if the state or due date is not provided when required. */ handleManualRating(card, state, reviewed, elapsed_days, stability, difficulty, due) { if (typeof state === "undefined") { throw new FSRSValidationError( "reschedule: state is required for manual rating" ); } let log; let next_card; if (state === State.New) { log = { rating: Rating.Manual, state, due: due != null ? due : reviewed, stability: card.stability, difficulty: card.difficulty, elapsed_days, last_elapsed_days: card.elapsed_days, scheduled_days: card.scheduled_days, learning_steps: card.learning_steps, review: reviewed }; next_card = createEmptyCard(reviewed); next_card.last_review = reviewed; } else { if (typeof due === "undefined") { throw new FSRSValidationError( "reschedule: due is required for manual rating" ); } const scheduled_days = date_diff(due, reviewed, "days"); log = { rating: Rating.Manual, state: card.state, due: card.last_review || card.due, stability: card.stability, difficulty: card.difficulty, elapsed_days, last_elapsed_days: card.elapsed_days, scheduled_days: card.scheduled_days, learning_steps: card.learning_steps, review: reviewed }; next_card = { ...card, state, due, last_review: reviewed, stability: stability || card.stability, difficulty: difficulty || card.difficulty, elapsed_days, scheduled_days, reps: card.reps + 1 }; } return { card: next_card, log }; } /** * Reschedules a card based on its review history. * * @param current_card - The card to be rescheduled. * @param reviews - An array of review history objects. * @returns An array of record log items representing the rescheduling process. */ reschedule(current_card, reviews) { const collections = []; let cur_card = createEmptyCard(current_card.due); for (const review of reviews) { let item; review.review = TypeConvert.time(review.review); if (review.rating === Rating.Manual) { let interval = 0; if (cur_card.state !== State.New && cur_card.last_review) { interval = date_diff(review.review, cur_card.last_review, "days"); } item = this.handleManualRating( cur_card, review.state, review.review, interval, review.stability, review.difficulty, review.due ? TypeConvert.time(review.due) : void 0 ); } else { item = this.replay(cur_card, review.review, review.rating); } collections.push(item); cur_card = item.card; } return collections; } calculateManualRecord(current_card, now2, record_log_item, update_memory) { if (!record_log_item) { return null; } const { card: reschedule_card, log } = record_log_item; const cur_card = TypeConvert.card(current_card); if (cur_card.due.getTime() === reschedule_card.due.getTime()) { return null; } cur_card.scheduled_days = date_diff( reschedule_card.due, cur_card.due, "days" ); return this.handleManualRating( cur_card, reschedule_card.state, TypeConvert.time(now2), log.elapsed_days, update_memory ? reschedule_card.stability : void 0, update_memory ? reschedule_card.difficulty : void 0, reschedule_card.due ); } }; function applyAfterHandler(value, afterHandler) { return typeof afterHandler === "function" ? afterHandler(value) : value; } var FSRS = class extends FSRSAlgorithm { constructor(param) { super(param); __publicField(this, "strategyHandler", /* @__PURE__ */ new Map()); __publicField(this, "Scheduler"); const { enable_short_term } = this.parameters; this.Scheduler = enable_short_term ? BasicScheduler : LongTermScheduler; } params_handler_proxy() { const _this = this; return { set: function(target, prop, value) { if (prop === "request_retention" && Number.isFinite(value)) { _this.intervalModifier = _this.calculate_interval_modifier( Number(value) ); } else if (prop === "enable_short_term") { _this.Scheduler = value === true ? BasicScheduler : LongTermScheduler; } else if (prop === "w") { value = migrateParameters( value, target.relearning_steps.length, target.enable_short_term ); _this.forgetting_curve = forgetting_curve.bind(this, value); _this.intervalModifier = _this.calculate_interval_modifier( Number(target.request_retention) ); } Reflect.set(target, prop, value); return true; } }; } useStrategy(mode, handler) { this.strategyHandler.set(mode, handler); return this; } clearStrategy(mode) { if (mode) { this.strategyHandler.delete(mode); } else { this.strategyHandler.clear(); } return this; } getScheduler(card, now2) { const schedulerStrategy = this.strategyHandler.get( StrategyMode.SCHEDULER ); const Scheduler = schedulerStrategy || this.Scheduler; const instance = new Scheduler(card, now2, this, this.strategyHandler); return instance; } /** * Display the collection of cards and logs for the four scenarios after scheduling the card at the current time. * @param card Card to be processed * @param now Current time or scheduled time * @param afterHandler Convert the result to another type. (Optional) * @example * ```typescript * const card: Card = createEmptyCard(new Date()); * const f = fsrs(); * const recordLog = f.repeat(card, new Date()); * ``` * @example * ```typescript * interface RevLogUnchecked * extends Omit { * cid: string; * due: Date | number; * state: StateType; * review: Date | number; * rating: RatingType; * } * * interface RepeatRecordLog { * card: CardUnChecked; //see method: createEmptyCard * log: RevLogUnchecked; * } * * function repeatAfterHandler(recordLog: RecordLog) { * const record: { [key in Grade]: RepeatRecordLog } = {} as { * [key in Grade]: RepeatRecordLog; * }; * for (const grade of Grades) { * record[grade] = { * card: { * ...(recordLog[grade].card as Card & { cid: string }), * due: recordLog[grade].card.due.getTime(), * state: State[recordLog[grade].card.state] as StateType, * last_review: recordLog[grade].card.last_review * ? recordLog[grade].card.last_review!.getTime() * : null, * }, * log: { * ...recordLog[grade].log, * cid: (recordLog[grade].card as Card & { cid: string }).cid, * due: recordLog[grade].log.due.getTime(), * review: recordLog[grade].log.review.getTime(), * state: State[recordLog[grade].log.state] as StateType, * rating: Rating[recordLog[grade].log.rating] as RatingType, * }, * }; * } * return record; * } * const card: Card = createEmptyCard(new Date(), cardAfterHandler); //see method: createEmptyCard * const f = fsrs(); * const recordLog = f.repeat(card, new Date(), repeatAfterHandler); * ``` */ repeat(card, now2, afterHandler) { const instance = this.getScheduler(card, now2); const recordLog = instance.preview(); return applyAfterHandler(recordLog, afterHandler); } /** * Display the collection of cards and logs for the card scheduled at the current time, after applying a specific grade rating. * @param card Card to be processed * @param now Current time or scheduled time * @param grade Rating of the review (Again, Hard, Good, Easy) * @param afterHandler Convert the result to another type. (Optional) * @example * ```typescript * const card: Card = createEmptyCard(new Date()); * const f = fsrs(); * const recordLogItem = f.next(card, new Date(), Rating.Again); * ``` * @example * ```typescript * interface RevLogUnchecked * extends Omit { * cid: string; * due: Date | number; * state: StateType; * review: Date | number; * rating: RatingType; * } * * interface NextRecordLog { * card: CardUnChecked; //see method: createEmptyCard * log: RevLogUnchecked; * } * function nextAfterHandler(recordLogItem: RecordLogItem) { const recordItem = { card: { ...(recordLogItem.card as Card & { cid: string }), due: recordLogItem.card.due.getTime(), state: State[recordLogItem.card.state] as StateType, last_review: recordLogItem.card.last_review ? recordLogItem.card.last_review!.getTime() : null, }, log: { ...recordLogItem.log, cid: (recordLogItem.card as Card & { cid: string }).cid, due: recordLogItem.log.due.getTime(), review: recordLogItem.log.review.getTime(), state: State[recordLogItem.log.state] as StateType, rating: Rating[recordLogItem.log.rating] as RatingType, }, }; return recordItem } * const card: Card = createEmptyCard(new Date(), cardAfterHandler); //see method: createEmptyCard * const f = fsrs(); * const recordLogItem = f.repeat(card, new Date(), Rating.Again, nextAfterHandler); * ``` */ next(card, now2, grade, afterHandler) { const instance = this.getScheduler(card, now2); const g2 = TypeConvert.rating(grade); if (g2 === Rating.Manual) { throw new FSRSValidationError("Cannot review a manual rating"); } const recordLogItem = instance.review(g2); return applyAfterHandler(recordLogItem, afterHandler); } /** * Get the retrievability of the card * @param card Card to be processed * @param now Current time or scheduled time * @param format default:true , Convert the result to another type. (Optional) * @returns The retrievability of the card,if format is true, the result is a string, otherwise it is a number */ get_retrievability(card, now2, format = true) { const processedCard = TypeConvert.card(card); now2 = now2 ? TypeConvert.time(now2) : /* @__PURE__ */ new Date(); const t3 = processedCard.state !== State.New ? Math.max(date_diff(now2, processedCard.last_review, "days"), 0) : 0; const r2 = processedCard.state !== State.New ? this.forgetting_curve(t3, +processedCard.stability.toFixed(8)) : 0; return format ? `${(r2 * 100).toFixed(2)}%` : r2; } /** * * @param card Card to be processed * @param log last review log * @param afterHandler Convert the result to another type. (Optional) * @example * ```typescript * const now = new Date(); * const f = fsrs(); * const emptyCardFormAfterHandler = createEmptyCard(now); * const repeatFormAfterHandler = f.repeat(emptyCardFormAfterHandler, now); * const { card, log } = repeatFormAfterHandler[Rating.Hard]; * const rollbackFromAfterHandler = f.rollback(card, log); * ``` * * @example * ```typescript * const now = new Date(); * const f = fsrs(); * const emptyCardFormAfterHandler = createEmptyCard(now, cardAfterHandler); //see method: createEmptyCard * const repeatFormAfterHandler = f.repeat(emptyCardFormAfterHandler, now, repeatAfterHandler); //see method: fsrs.repeat() * const { card, log } = repeatFormAfterHandler[Rating.Hard]; * const rollbackFromAfterHandler = f.rollback(card, log, cardAfterHandler); * ``` */ rollback(card, log, afterHandler) { const processedCard = TypeConvert.card(card); const processedLog = TypeConvert.review_log(log); if (processedLog.rating === Rating.Manual) { throw new FSRSValidationError("Cannot rollback a manual rating"); } let last_due; let last_review; let last_lapses; switch (processedLog.state) { case State.New: last_due = processedLog.due; last_review = void 0; last_lapses = 0; break; case State.Learning: case State.Relearning: case State.Review: last_due = processedLog.review; last_review = processedLog.due; last_lapses = processedCard.lapses - (processedLog.rating === Rating.Again && processedLog.state === State.Review ? 1 : 0); break; } const prevCard = { ...processedCard, due: last_due, stability: processedLog.stability, difficulty: processedLog.difficulty, elapsed_days: processedLog.last_elapsed_days, scheduled_days: processedLog.scheduled_days, reps: Math.max(0, processedCard.reps - 1), lapses: Math.max(0, last_lapses), learning_steps: processedLog.learning_steps, state: processedLog.state, last_review }; return applyAfterHandler(prevCard, afterHandler); } /** * * @param card Card to be processed * @param now Current time or scheduled time * @param reset_count Should the review count information(reps,lapses) be reset. (Optional) * @param afterHandler Convert the result to another type. (Optional) * @example * ```typescript * const now = new Date(); * const f = fsrs(); * const emptyCard = createEmptyCard(now); * const scheduling_cards = f.repeat(emptyCard, now); * const { card, log } = scheduling_cards[Rating.Hard]; * const forgetCard = f.forget(card, new Date(), true); * ``` * * @example * ```typescript * interface RepeatRecordLog { * card: CardUnChecked; //see method: createEmptyCard * log: RevLogUnchecked; //see method: fsrs.repeat() * } * * function forgetAfterHandler(recordLogItem: RecordLogItem): RepeatRecordLog { * return { * card: { * ...(recordLogItem.card as Card & { cid: string }), * due: recordLogItem.card.due.getTime(), * state: State[recordLogItem.card.state] as StateType, * last_review: recordLogItem.card.last_review * ? recordLogItem.card.last_review!.getTime() * : null, * }, * log: { * ...recordLogItem.log, * cid: (recordLogItem.card as Card & { cid: string }).cid, * due: recordLogItem.log.due.getTime(), * review: recordLogItem.log.review.getTime(), * state: State[recordLogItem.log.state] as StateType, * rating: Rating[recordLogItem.log.rating] as RatingType, * }, * }; * } * const now = new Date(); * const f = fsrs(); * const emptyCardFormAfterHandler = createEmptyCard(now, cardAfterHandler); //see method: createEmptyCard * const repeatFormAfterHandler = f.repeat(emptyCardFormAfterHandler, now, repeatAfterHandler); //see method: fsrs.repeat() * const { card } = repeatFormAfterHandler[Rating.Hard]; * const forgetFromAfterHandler = f.forget(card, date_scheduler(now, 1, true), false, forgetAfterHandler); * ``` */ forget(card, now2, reset_count = false, afterHandler) { const processedCard = TypeConvert.card(card); now2 = TypeConvert.time(now2); const scheduled_days = processedCard.state === State.New ? 0 : date_diff(now2, processedCard.due, "days"); const forget_log = { rating: Rating.Manual, state: processedCard.state, due: processedCard.due, stability: processedCard.stability, difficulty: processedCard.difficulty, elapsed_days: 0, last_elapsed_days: processedCard.elapsed_days, scheduled_days, learning_steps: processedCard.learning_steps, review: now2 }; const forget_card = { ...processedCard, due: now2, stability: 0, difficulty: 0, elapsed_days: 0, scheduled_days: 0, reps: reset_count ? 0 : processedCard.reps, lapses: reset_count ? 0 : processedCard.lapses, learning_steps: 0, state: State.New, last_review: processedCard.last_review }; const recordLogItem = { card: forget_card, log: forget_log }; return applyAfterHandler(recordLogItem, afterHandler); } /** * Reschedules the current card and returns the rescheduled collections and reschedule item. * * @template T - The type of the record log item. * @param {CardInput | Card} current_card - The current card to be rescheduled. * @param {Array } reviews - The array of FSRSHistory objects representing the reviews. * @param {Partial >} options - The optional reschedule options. * @returns {IReschedule } - The rescheduled collections and reschedule item. * * @example * ```typescript * const f = fsrs() * const grades: Grade[] = [Rating.Good, Rating.Good, Rating.Good, Rating.Good] * const reviews_at = [ * new Date(2024, 8, 13), * new Date(2024, 8, 13), * new Date(2024, 8, 17), * new Date(2024, 8, 28), * ] * * const reviews: FSRSHistory[] = [] * for (let i = 0; i < grades.length; i++) { * reviews.push({ * rating: grades[i], * review: reviews_at[i], * }) * } * * const results_short = scheduler.reschedule( * createEmptyCard(), * reviews, * { * skipManual: false, * } * ) * console.log(results_short) * ``` */ reschedule(current_card, reviews = [], options = {}) { const { recordLogHandler, reviewsOrderBy, skipManual = true, now: now2 = /* @__PURE__ */ new Date(), update_memory_state: updateMemoryState = false } = options; if (reviewsOrderBy && typeof reviewsOrderBy === "function") { reviews.sort(reviewsOrderBy); } if (skipManual) { reviews = reviews.filter((review) => review.rating !== Rating.Manual); } const rescheduleSvc = new Reschedule(this); const collections = rescheduleSvc.reschedule( options.first_card || createEmptyCard(), reviews ); const len = collections.length; const cur_card = TypeConvert.card(current_card); const manual_item = rescheduleSvc.calculateManualRecord( cur_card, now2, len ? collections[len - 1] : void 0, updateMemoryState ); return { collections: typeof recordLogHandler === "function" ? collections.map(recordLogHandler) : collections, reschedule_item: manual_item ? applyAfterHandler(manual_item, recordLogHandler) : null }; } }; var fsrs = (params) => { return new FSRS(params || {}); }; // src/scheduling/algorithms/fsrs/fsrs-helpers.ts var FSRS_COMMENT_PREFIX = "fsrs"; var LEGACY_MIN_EASE = 130; var LEGACY_MAX_EASE = 370; function buildFsrsParameters(settings) { return { ["request_retention"]: settings.fsrsDesiredRetention, ["maximum_interval"]: settings.maximumInterval, ["enable_short_term"]: true }; } function reviewResponseToFsrsGrade(response) { switch (response) { case 3 /* Again */: return Rating.Again; case 2 /* Hard */: return Rating.Hard; case 1 /* Good */: return Rating.Good; case 0 /* Easy */: return Rating.Easy; default: throw new Error(`Unsupported FSRS response: ${response}`); } } function easeToDifficulty(ease) { if (ease === null || ease === void 0) { return 5.5; } const clampedEase = clamp2(ease, LEGACY_MIN_EASE, LEGACY_MAX_EASE); const normalized = (clampedEase - LEGACY_MIN_EASE) / (LEGACY_MAX_EASE - LEGACY_MIN_EASE); return clamp2(10 - normalized * 9, 1, 10); } function difficultyToEase(difficulty) { const clampedDifficulty = clamp2(difficulty, 1, 10); const normalized = (10 - clampedDifficulty) / 9; return Math.round(LEGACY_MIN_EASE + normalized * (LEGACY_MAX_EASE - LEGACY_MIN_EASE)); } function sm2ScheduleToFsrsCard(schedule, now2) { var _a2; const interval = Math.max(1, Math.round((_a2 = schedule == null ? void 0 : schedule.interval) != null ? _a2 : 1)); const due = (schedule == null ? void 0 : schedule.dueDate) ? schedule.dueDate.clone() : now2.clone(); const lastReview = due.clone().subtract(interval, "d"); return { due: due.toDate(), stability: Math.max(0.1, interval), difficulty: easeToDifficulty(schedule == null ? void 0 : schedule.latestEase), ["elapsed_days"]: Math.max(0, now2.diff(lastReview, "days")), ["scheduled_days"]: interval, ["learning_steps"]: 0, reps: Math.max(1, Math.round(Math.log2(interval + 1))), lapses: 0, state: State.Review, ["last_review"]: lastReview.toDate() }; } function formatFsrsTimestamp(date) { return date ? date.toDate().toISOString() : "-"; } function parseFsrsTimestamp(input) { return input === "-" ? null : (0, import_moment5.default)(input); } function clamp2(value, min, max) { return Math.min(max, Math.max(min, value)); } // src/scheduling/algorithms/fsrs/rep-item-schedule-info-fsrs.ts var import_moment6 = __toESM(require_moment()); var RepItemScheduleInfoFsrs = class _RepItemScheduleInfoFsrs extends RepItemScheduleInfo { constructor(dueDate, interval, difficulty, stability, state, reps, lapses, learningSteps, lastReview) { super( "FSRS" /* FSRS */, dueDate, interval, difficultyToEase(difficulty), dueDate && globalDateProvider.now ? globalDateProvider.now.valueOf() - dueDate.valueOf() : 0 ); this.difficulty = difficulty; this.stability = stability; this.state = state; this.reps = reps; this.lapses = lapses; this.learningSteps = learningSteps; this.lastReview = lastReview; } /** * Creates a RepItemScheduleInfoFsrs object from a Card or CardInput object. * * NOTE: The fsrs library uses cards as the basic unit of scheduling, so we need to convert the Card or CardInput object to a RepItemScheduleInfoFsrs object. * * @param {Card | CardInput} card - The Card or CardInput object. * @returns {RepItemScheduleInfoFsrs} - The RepItemScheduleInfoFsrs object. */ static fromFsrsCard(card) { return new _RepItemScheduleInfoFsrs( (0, import_moment6.default)(card.due), card.scheduled_days, card.difficulty, card.stability, card.state, card.reps, card.lapses, card.learning_steps, card.last_review ? (0, import_moment6.default)(card.last_review) : null ); } /** * Converts the RepItemScheduleInfoFsrs object to a CardInput object for use with the fsrs library. * * @param {Moment} [now] - The current date and time. Defaults to the current date and time. * @returns {CardInput} - The CardInput object. */ toFsrsCardInput(now2 = globalDateProvider.now) { const lastReview = this.lastReview ? this.lastReview.clone() : now2.clone(); return { due: this.dueDate.toDate(), stability: this.stability, difficulty: this.difficulty, ["elapsed_days"]: Math.max(0, now2.diff(lastReview, "days")), ["scheduled_days"]: this.interval, ["learning_steps"]: this.learningSteps, reps: this.reps, lapses: this.lapses, state: this.state, ["last_review"]: this.lastReview ? this.lastReview.toDate() : null }; } /** * Checks if the repetition item is short term. * * @returns {boolean} - True if the repetition item is short term, false otherwise. */ isShortTerm() { return this.interval < 1; } /** * Formats the scheduling information for the repetition item as a string for HTML comments. * * @returns {string} - The formatted scheduling information. */ formatScheduleAsSRHtmlComment() { return `!${FSRS_COMMENT_PREFIX},${formatFsrsTimestamp(this.dueDate)},${this.interval},${this.stability},${this.difficulty},${this.state},${this.reps},${this.lapses},${this.learningSteps},${formatFsrsTimestamp(this.lastReview)}`; } /** * Formats the scheduling information for the repetition item as a JSON string. * * @returns {string} - The formatted scheduling information. */ serializeSchedule() { const serializedData = { dueDate: formatFsrsTimestamp(this.dueDate), interval: this.interval, stability: this.stability, difficulty: this.difficulty, state: this.state, reps: this.reps, lapses: this.lapses, learningSteps: this.learningSteps, lastReview: formatFsrsTimestamp(this.lastReview) }; return { algorithm: "FSRS" /* FSRS */, scheduleData: serializedData }; } }; // src/utils/comment-parser.ts var CommentParser = class { static parseMultiScheduleComment(comment) { const segments = comment.split("!").map((segment) => segment.trim()).filter((segment) => segment.length > 0).map((segment) => this.parseScheduleSegment(segment)).filter((info) => info !== null); return segments; } static parseScheduleSegment(segment) { if (segment.startsWith(FSRS_COMMENT_PREFIX + ",")) { const fields = segment.split(","); const [ _algorithm, dueDateStr2, intervalStr2, stabilityStr, difficultyStr, stateStr, repsStr, lapsesStr, learningStepsStr, lastReviewStr ] = fields; const parsedDueDate = parseFsrsTimestamp(dueDateStr2); if (!parsedDueDate) { return null; } return new RepItemScheduleInfoFsrs( parsedDueDate, parseFloat(intervalStr2), parseFloat(difficultyStr), parseFloat(stabilityStr), parseInt(stateStr), parseInt(repsStr), parseInt(lapsesStr), parseInt(learningStepsStr), parseFsrsTimestamp(lastReviewStr) ); } const [dueDateStr, intervalStr, easeStr] = segment.split(","); return this.parseSM2Schedule(dueDateStr, parseInt(intervalStr), parseInt(easeStr)); } static parseSM2Schedule(dueDateStr, interval, ease) { const dueDate = DateUtil.dateStrToMoment(dueDateStr); if (dueDate === null || formatDate(dueDate.unix(), PREFERRED_DATE_FORMAT) === RepItemScheduleInfoOsr.dummyDueDateForNewCard) { return null; } const delayBeforeReviewTicks = dueDate.valueOf() - globalDateProvider.today.valueOf(); return new RepItemScheduleInfoOsr(dueDate, interval, ease, delayBeforeReviewTicks); } }; // src/data/data-store/notes-data-store/notes-data-store.ts var NotesDataStore = class { constructor(settings, scheduleDeleter) { this.storageType = "NOTES" /* NOTES */; this.settings = settings; this.fileModifier = scheduleDeleter; this.isStructureInitialized = Promise.resolve(true); } /** * Creates scheduling information from a question text and its storage info. * * @param originalQuestionText * @param _ * @returns */ createSchedule(originalQuestionText, _2) { var _a2, _b; const schedulingComment = (_a2 = originalQuestionText.match(//m)) == null ? void 0 : _a2[1]; if (schedulingComment) { return (_b = CommentParser.parseMultiScheduleComment(schedulingComment)) != null ? _b : []; } const sm2MultiScheduling = [...originalQuestionText.matchAll(MULTI_SCHEDULING_EXTRACTOR)]; if (sm2MultiScheduling.length > 0) { return sm2MultiScheduling.map( (match2) => CommentParser.parseSM2Schedule( match2[1], parseInt(match2[2]), parseInt(match2[3]) ) ).filter((info) => info !== null); } const result = []; const scheduling = [...originalQuestionText.matchAll(SM2_SCHEDULE_INFO_EXTRACTOR)]; for (const match2 of scheduling) { const dueDateStr = match2[1]; const interval = parseInt(match2[2]); const ease = parseInt(match2[3]); const parsedSchedule = CommentParser.parseSM2Schedule(dueDateStr, interval, ease); if (parsedSchedule) { result.push(parsedSchedule); } } return result; } /** * Removes scheduling information from a question text. * * @param questionText * @returns */ removeScheduleInfo(questionText) { return questionText.replace(//gm, ""); } /** * Writes scheduling information to the data store. * * @param question * @returns */ async writeSchedule(question) { await this.write(question); } /** * Writes a question to the data store. * * @param question * @returns */ async write(question) { const fileText = await question.note.file.read(); const newText = question.updateQuestionWithinNoteText(fileText, this.settings); await question.note.file.write(newText); question.hasChanged = false; } /** * Deletes a question from the data store. * * @param question * @returns */ async delete(question) { const fileText = await question.note.file.read(); const originalText = question.questionText.original; const newText = MultiLineTextFinder.findAndReplace(fileText, originalText, ""); if (newText) { await question.note.file.write(newText); } } }; // src/data/data-structures/card/questions/question-postponement-list.ts var QuestionPostponementList = class { constructor(pluginDataManager, settings, list) { this.pluginDataManager = pluginDataManager; this.settings = settings; this.list = list; } /** * Clears the list of postponed questions if the date has changed since the last time the list was cleared. This ensures that questions are only postponed for one day. * * @param {PluginData} data - The plugin data containing the bury date and list. * @returns {Promise } - A promise that resolves when the list is cleared if it's a new day. */ async clearIfNewDay(data) { const now2 = window.moment(Date.now()); const todayDate = now2.format("YYYY-MM-DD"); const isNewDay = todayDate !== data.buryDate; if (isNewDay) { data.buryDate = todayDate; this.clear(); await this.write(); } } /** * Clears the list of postponed questions. */ clear() { this.list.splice(0); } /** * Adds a question to the list of postponed questions. * * @param {Question} question - The question to add. */ add(question) { if (!this.includes(question)) this.list.push(question.questionText.textHash); } /** * Checks if a question is in the list of postponed questions. * * @param {Question} question - The question to check. * @returns {boolean} - True if the question is in the list, false otherwise. */ includes(question) { return this.list.includes(question.questionText.textHash); } /** * Writes the list of postponed questions to the plugin data. * * @returns {Promise } - A promise that resolves when the list is written. */ async write() { if (this.pluginDataManager === null) return; await this.pluginDataManager.savePluginData(); } }; // src/data/data-structures/file/note-file.ts var import_moment7 = __toESM(require_moment()); var SRNoteTFile = class extends SRTFile { constructor(vault, metadataCache, fileManager, file) { super(vault, metadataCache, fileManager, file); } /** * Gets the scheduling information for the note. * * @returns {Promise } - A promise that resolves with the scheduling information for the note. */ async getNoteSchedule() { const frontmatter = await this.getFrontmatter(); const srInterval = frontmatter.get("sr-interval"); const srEase = frontmatter.get("sr-ease"); const srDue = frontmatter.get("sr-due"); if (!(srInterval && srEase && srDue)) return null; const dueDate = (0, import_moment7.default)(srDue, ALLOWED_DATE_FORMATS); const interval = parseFloat(srInterval); const ease = parseFloat(srEase); return new RepItemScheduleInfoOsr(dueDate, interval, ease); } /** * Sets the scheduling information for the note. * * @param {RepItemScheduleInfo} repItemScheduleInfo - The scheduling information for the note. * @returns {Promise } - A promise that resolves when the scheduling information is set. */ async setNoteSchedule(repItemScheduleInfo) { const scheduleInfo = repItemScheduleInfo; const dueString = formatDate(scheduleInfo.dueDateAsUnix, PREFERRED_DATE_FORMAT); const interval = scheduleInfo.interval; const ease = scheduleInfo.latestEase; await this.fileManager.processFrontMatter(this.tfile, (frontmatter) => { frontmatter["sr-due"] = dueString; frontmatter["sr-interval"] = interval; frontmatter["sr-ease"] = ease; }); } /** * Gets the note ID from the frontmatter. * * @returns {Promise } - A promise that resolves with the note ID from the frontmatter, or null if not found. */ async getNoteId() { var _a2; const frontmatter = await this.getFrontmatter(); return (_a2 = frontmatter == null ? void 0 : frontmatter.get("sr-id")) != null ? _a2 : null; } /** * Gets or creates the note ID from the frontmatter. * * @returns {Promise } - A promise that resolves with the note ID from the frontmatter, or a new one if not found. */ async getOrCreateNoteId() { const existing = await this.getNoteId(); if (existing) return existing; const id2 = crypto.randomUUID(); await this.fileManager.processFrontMatter(this.tfile, (frontmatter) => { frontmatter["sr-id"] = id2; }); return id2; } /** * Gets the question context for a given line number. * * @param {number} cardLine - The line number of the card. * @returns {string[]} - An array of strings representing the question context. */ getQuestionContext(cardLine) { const fileCachedData = this.metadataCache.getFileCache(this.file) || {}; const headings = fileCachedData.headings || []; const stack = []; for (const heading of headings) { if (heading.position.start.line > cardLine) { break; } while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) { stack.pop(); } stack.push(heading); } const result = []; for (const headingObj of stack) { headingObj.heading = headingObj.heading.replace(/\[\^\d+\]/gm, "").trim(); result.push(headingObj.heading); } return result; } }; // src/scheduling/algorithms/osr/srs-algorithm-osr.ts var import_moment8 = __toESM(require_moment()); // src/note/note-ease-list.ts var NoteEaseList = class { constructor(settings) { this.dict = {}; this.settings = settings; } get baseEase() { return this.settings.baseEase; } hasEaseForPath(path2) { return Object.prototype.hasOwnProperty.call(this.dict, path2); } getEaseByPath(path2) { let ease = null; if (this.hasEaseForPath(path2)) { ease = Math.round(this.dict[path2]); } return ease; } setEaseForPath(path2, ease) { this.dict[path2] = ease; } }; // src/scheduling/algorithms/osr/srs-algorithm-osr.ts var SRAlgorithmOsr = class _SRAlgorithmOsr { constructor(settings) { this.algorithmType = "SM-2-OSR" /* SM_2_OSR */; this.settings = settings; this.noteEaseList = new NoteEaseList(settings); } static get initialInterval() { return 1; } /** * Calculates the new schedule for a note. * * @param {string} notePath - The note path. * @param {OsrNoteGraph} osrNoteGraph - The OSR note graph. * @param {ReviewResponse} response - The review response. * @param {DueDateHistogram} dueDateNoteHistogram - The due date note histogram. * @returns {RepItemScheduleInfo} - The new schedule for the note. */ noteCalcNewSchedule(notePath, osrNoteGraph, response, dueDateNoteHistogram) { const noteLinkStat = osrNoteGraph.calcNoteLinkStat( notePath, this.noteEaseList ); const linkContribution = this.settings.maxLinkFactor * Math.min(1, Math.log(noteLinkStat.totalLinkCount + 0.5) / Math.log(64)); let ease = (1 - linkContribution) * this.settings.baseEase + (noteLinkStat.totalLinkCount > 0 ? linkContribution * noteLinkStat.linkTotal / noteLinkStat.linkPGTotal : linkContribution * this.settings.baseEase); const easeByPath = this.noteEaseList.getEaseByPath(notePath); if (this.noteEaseList.hasEaseForPath(notePath) && easeByPath) { ease = (ease + easeByPath) / 2; } const interval = _SRAlgorithmOsr.initialInterval; ease = Math.round(ease); const result = this.calcSchedule( interval, ease, 0, response, dueDateNoteHistogram ); result.dueDate = (0, import_moment8.default)(globalDateProvider.today.add(result.interval, "d")); return result; } /** * Called when a note is loaded. * * @param {string} path - The note path. * @param {Note} note - The note. * @param {number} noteEase - The note ease. * @returns {void} */ noteOnLoadedNote(path2, note, noteEase) { const flashcardsInNoteAvgEase = note !== null ? _SRAlgorithmOsr.calculateFlashcardAvgEase(note.questionList, this.settings) : null; const ease = flashcardsInNoteAvgEase && noteEase ? (flashcardsInNoteAvgEase + noteEase) / 2 : flashcardsInNoteAvgEase ? flashcardsInNoteAvgEase : noteEase; if (ease) { this.noteEaseList.setEaseForPath(path2, ease); } } /** * Calculates the average ease for a list of questions. * * @param {Question[]} questionList - The list of questions. * @param {SRSettings} settings - The settings object. * @returns {number} - The average ease for the list of questions. */ static calculateFlashcardAvgEase(questionList, settings) { let totalEase = 0; let scheduledCount = 0; questionList.forEach((question) => { question.cards.filter((card) => card.hasSchedule).forEach((card) => { if (card.scheduleInfo !== null) { totalEase += card.scheduleInfo.latestEase; scheduledCount++; } }); }); let result = 0; if (scheduledCount > 0) { const flashcardsInNoteAvgEase = totalEase / scheduledCount; const flashcardContribution = Math.min( 1, Math.log(scheduledCount + 0.5) / Math.log(64) ); result = flashcardsInNoteAvgEase * flashcardContribution + settings.baseEase * (1 - flashcardContribution); } return result; } /** * Calculates the updated schedule for a note. * * @param {string} notePath - The note path. * @param {RepItemScheduleInfo} noteSchedule - The note schedule. * @param {ReviewResponse} response - The review response. * @param {DueDateHistogram} dueDateNoteHistogram - The due date note histogram. * @returns {RepItemScheduleInfo} - The updated schedule for the note. */ noteCalcUpdatedSchedule(notePath, noteSchedule, response, dueDateNoteHistogram) { const noteScheduleOsr = noteSchedule; const temp = this.calcSchedule( noteScheduleOsr.interval, noteScheduleOsr.latestEase, noteScheduleOsr.delayedBeforeReviewTicks, response, dueDateNoteHistogram ); const interval = temp.interval; const ease = temp.latestEase; const dueDate = (0, import_moment8.default)(globalDateProvider.today.add(interval, "d")); this.noteEaseList.setEaseForPath(notePath, ease); return new RepItemScheduleInfoOsr(dueDate, interval, ease); } /** * Calculates the scheduling information for a note. * * @param {RepItemScheduleInfoOsr} schedule - The scheduling information for the note. * @param {ReviewResponse} response - The review response. * @param {DueDateHistogram} dueDateHistogram - The due date histogram. * @returns {RepItemScheduleInfoOsr} - The scheduling information for the note. */ calcSchedule(interval, latestEase, delayedBeforeReview, response, dueDateHistogram) { const temp = osrSchedule( response, interval, latestEase, delayedBeforeReview, this.settings, dueDateHistogram ); return new RepItemScheduleInfoOsr(globalDateProvider.today, temp.interval, temp.ease); } /** * Gets the reset schedule for a card. * * @returns {RepItemScheduleInfo} - The reset schedule for a card. */ cardGetResetSchedule() { const interval = _SRAlgorithmOsr.initialInterval; const ease = this.settings.baseEase; const dueDate = globalDateProvider.today; return new RepItemScheduleInfoOsr(dueDate, interval, ease); } /** * Gets the new schedule for a card. * * @param {ReviewResponse} response - The review response. * @param {string} notePath - The note path. * @param {DueDateHistogram} dueDateFlashcardHistogram - The due date flashcard histogram. * @returns {RepItemScheduleInfo} - The new schedule for a card. */ cardGetNewSchedule(response, notePath, dueDateFlashcardHistogram) { let initialEase = this.settings.baseEase; const noteEase = this.noteEaseList.getEaseByPath(notePath); if (this.noteEaseList.hasEaseForPath(notePath) && noteEase !== null) { initialEase = Math.round(noteEase); } const delayBeforeReview = 0; const schedObj = osrSchedule( response, _SRAlgorithmOsr.initialInterval, initialEase, delayBeforeReview, this.settings, dueDateFlashcardHistogram ); const interval = schedObj.interval; const ease = schedObj.ease; const dueDate = globalDateProvider.today.add(interval, "d"); return new RepItemScheduleInfoOsr(dueDate, interval, ease, delayBeforeReview); } /** * Calculates the updated schedule for a card. * * @param {ReviewResponse} response - The review response. * @param {RepItemScheduleInfo} cardSchedule - The card schedule. * @param {DueDateHistogram} dueDateFlashcardHistogram - The due date flashcard histogram. * @returns {RepItemScheduleInfo} - The updated schedule for a card. */ cardCalcUpdatedSchedule(response, cardSchedule, dueDateFlashcardHistogram) { const cardScheduleOsr = cardSchedule; const schedObj = osrSchedule( response, cardScheduleOsr.interval, cardSchedule.latestEase, cardSchedule.delayedBeforeReviewTicks, this.settings, dueDateFlashcardHistogram ); const interval = schedObj.interval; const ease = schedObj.ease; const dueDate = globalDateProvider.today.add(interval, "d"); const delayBeforeReview = 0; return new RepItemScheduleInfoOsr(dueDate, interval, ease, delayBeforeReview); } /** * Gets the note stats. * * @returns {INoteEaseList} - The note stats. */ noteStats() { return this.noteEaseList; } }; // src/scheduling/algorithms/fsrs/sr-algorithm-fsrs.ts var SrsAlgorithmFsrs = class { constructor(settings) { this.algorithmType = "FSRS" /* FSRS */; this.noteDelegate = new SRAlgorithmOsr(settings); this.scheduler = fsrs(buildFsrsParameters(settings)); } noteOnLoadedNote(path2, note, noteEase) { this.noteDelegate.noteOnLoadedNote(path2, note, noteEase); } noteCalcNewSchedule(notePath, osrNoteGraph, response, dueDateNoteHistogram) { return this.noteDelegate.noteCalcNewSchedule( notePath, osrNoteGraph, response, dueDateNoteHistogram ); } noteCalcUpdatedSchedule(notePath, noteSchedule, response, dueDateNoteHistogram) { return this.noteDelegate.noteCalcUpdatedSchedule( notePath, noteSchedule, response, dueDateNoteHistogram ); } noteStats() { return this.noteDelegate.noteStats(); } cardGetResetSchedule() { const now2 = globalDateProvider.now.toDate(); const emptyCard = createEmptyCard(now2); emptyCard.state = State.New; emptyCard["scheduled_days"] = 0; emptyCard["learning_steps"] = 0; emptyCard.due = now2; emptyCard["last_review"] = void 0; return RepItemScheduleInfoFsrs.fromFsrsCard(emptyCard); } cardGetNewSchedule(response, _notePath, _dueDateFlashcardHistogram) { const now2 = globalDateProvider.now.toDate(); const recordLog = this.scheduler.next( createEmptyCard(now2), now2, reviewResponseToFsrsGrade(response) ); return RepItemScheduleInfoFsrs.fromFsrsCard(recordLog.card); } cardCalcUpdatedSchedule(response, schedule, _dueDateFlashcardHistogram) { const now2 = globalDateProvider.now; const card = schedule instanceof RepItemScheduleInfoFsrs ? schedule.toFsrsCardInput(now2) : sm2ScheduleToFsrsCard(schedule, now2); const recordLog = this.scheduler.next( card, now2.toDate(), reviewResponseToFsrsGrade(response) ); return RepItemScheduleInfoFsrs.fromFsrsCard(recordLog.card); } }; // src/scheduling/algorithms/osr/obsidian-vault-notelink-info-finder.ts var ObsidianVaultNoteLinkInfoFinder = class { // Reference to the Obsidian MetadataCache constructor(metadataCache) { this.metadataCache = metadataCache; } /** * Returns the resolved target links for a note path. * * @param {string} path - The note path. * @returns {Record } - The resolved target links for the note path. */ getResolvedTargetLinksForNotePath(path2) { return this.metadataCache.resolvedLinks[path2]; } }; // src/data/data-manager.ts var DataManager = class { constructor(plugin, pluginDataManager, settingsManager) { // TODO: Refactor so that the plugin data manager and the settings manager are separate from the data manager this._osrCore = null; this._syncLock = false; this.plugin = plugin; this.pluginDataManager = pluginDataManager; this.settingsManager = settingsManager; } /** * Checks if the data has been loaded. */ isDataLoaded() { return this.pluginDataManager.isLoaded; } /** * Checks if the OSR app core has been loaded. */ isOsrCoreLoaded() { return this._osrCore !== null; } // TODO: Remove once everything is migrated to the settings manager and plugin data manager get data() { return this.pluginDataManager.pluginData; } set data(data) { this.pluginDataManager.pluginData = data; } get osrCore() { if (this._osrCore === null) throw new Error("SR plugin or OSR core not initialized!!!"); return this._osrCore; } set osrCore(osrCore) { this._osrCore = osrCore; } get syncLock() { return this._syncLock; } /** * Loads the plugin data from the data.json from the plugin's folder. */ loadData() { this.setupDataStoreAndAlgorithmInstances(this.settingsManager.settings); } /** * Initializes the OSR app core. * * @param {NoteReviewQueue} noteReviewQueue - The note review queue. * @param {() => void} onOsrVaultDataChanged - A callback function that is called when the OSR vault data changes. * @returns {Promise } - A promise that resolves when the OSR app core is initialized. */ async initOSRCore(noteReviewQueue, onOsrVaultDataChanged) { const questionPostponementList = new QuestionPostponementList( this.pluginDataManager, this.settingsManager.settings, this.pluginDataManager.pluginData.buryList ); await questionPostponementList.clearIfNewDay(this.pluginDataManager.pluginData); this.osrCore = new OsrCore( questionPostponementList, new ObsidianVaultNoteLinkInfoFinder(this.plugin.app.metadataCache), this.settingsManager.settings, onOsrVaultDataChanged, noteReviewQueue, this.plugin.getObsidianRtlSetting() ); } async loadVault() { if (this._syncLock) { return; } this._syncLock = true; try { this.osrCore.loadInitialStateOfCore(); const notes = this.plugin.app.vault.getMarkdownFiles(); for (const noteFile of notes) { if (SettingsUtil.isPathInFoldersToIgnore( this.settingsManager.settings, noteFile.path )) continue; const file = this.createSRNoteTFile(noteFile); await this.osrCore.processFile(file); } await this.osrCore.finalizeLoad(); } finally { this._syncLock = false; } } /** * Creates a SRNoteTFile object from a note file. * * @param {TFile} note - The note file. * @returns {SRNoteTFile} - The SRNoteTFile object. */ createSRNoteTFile(note) { return new SRNoteTFile( this.plugin.app.vault, this.plugin.app.metadataCache, this.plugin.app.fileManager, note ); } /** * Sets up the data store and algorithm instances based on the settings. * * @param {SRSettings} settings - The settings object. */ setupDataStoreAndAlgorithmInstances(settings) { switch (settings.dataStore) { case "NOTES" /* NOTES */: DataStore.instance = new NotesDataStore( settings, new NoteDataFileModifier(this.plugin) ); DataStoreAlgorithm.instance = new NoteDataStoreAlgorithmOsr(settings); break; } SRAlgorithm.instance = settings.algorithm === "FSRS" /* FSRS */ ? new SrsAlgorithmFsrs(settings) : new SRAlgorithmOsr(settings); } /** * Synchronizes the data with the Obsidian vault. * * @returns {Promise } - A promise that resolves when the synchronization is complete. */ async sync() { if (this.osrCore === null) throw new Error("OSR app core not initialized!!!"); if (this.syncLock) { return; } const now2 = window.moment(Date.now()); this.osrCore.defaultTextDirection = this.plugin.getObsidianRtlSetting(); await this.loadVault(); if (this.settingsManager.settings.showSchedulingDebugMessages) { console.log(`SR: ${t("DECKS")}`, this.osrCore.reviewableDeckTree); console.log( "SR: " + t("SYNC_TIME_TAKEN", { t: Date.now() - now2.valueOf() }) ); } } /** * Loads a note from the Obsidian vault. * * @param {TFile} noteFile - The note file. * @returns {Promise } - A promise that resolves with the loaded note or null if not found. */ async loadNote(noteFile) { const loader = new NoteFileLoader(this.settingsManager.settings); const srFile = this.createSRNoteTFile(noteFile); const folderTopicPath = TopicPath.getFolderPathFromFilename( srFile, this.settingsManager.settings ); const note = await loader.load( this.createSRNoteTFile(noteFile), this.plugin.getObsidianRtlSetting(), folderTopicPath ); if (note && note.hasChanged) { await note.writeNoteFile(this.settingsManager.settings); } return note; } /** * Saves the review response for a note. * * @param {TFile} note - The note file. * @param {ReviewResponse} response - The review response. * @returns {Promise } - A promise that resolves when the review response is saved. */ async saveNoteReviewResponse(note, response) { if (this.osrCore === null) throw new Error("OSR app core not initialized!!!"); if (this.plugin.nextNoteReviewHandler === null) throw new Error("Next note review handler not initialized!!!"); const noteSrTFile = this.createSRNoteTFile(note); if (SettingsUtil.isPathInFoldersToIgnore(this.settingsManager.settings, note.path)) { new import_obsidian36.Notice(t("NOTE_IN_IGNORED_FOLDER")); return; } const tags = noteSrTFile.getAllTagsFromCache(); if (!SettingsUtil.isAnyTagANoteReviewTag(this.settingsManager.settings, tags)) { new import_obsidian36.Notice(t("PLEASE_TAG_NOTE")); return; } await this.osrCore.saveNoteReviewResponse( noteSrTFile, response, this.settingsManager.settings ); new import_obsidian36.Notice(t("RESPONSE_RECEIVED")); if (this.settingsManager.settings.autoNextNote) { await this.plugin.nextNoteReviewHandler.autoReviewNextNote(); } } /** * Saves the plugin data. * * @returns {Promise } - A promise that resolves when the plugin data is saved. */ async savePluginData() { try { await this.pluginDataManager.savePluginData(); } catch (error) { console.warn("DataManager: Error saving plugin data", error); } } }; // src/data/plugin-data.ts var DEFAULT_DATA = { settings: DEFAULT_SETTINGS, buryDate: "", buryList: [], historyDeck: null, scheduleData: { version: 1, noteSchedules: {}, cardSchedules: {} } }; // src/data/plugin-data-manager.ts var PluginDataError = class extends Error { constructor(message) { super(message); this.name = "PluginDataError"; } }; var PluginDataManager = class { constructor(plugin) { this._pluginData = null; this.plugin = plugin; } get isLoaded() { return this.pluginData !== null; } get pluginData() { if (this._pluginData === null) throw new PluginDataError( "Cant access the plugin data, as the plugin data is not yet loaded!!" ); return this._pluginData; } set pluginData(pluginData) { this._pluginData = pluginData; } /** * Loads the plugin data from the data.json from the plugin's folder. */ async loadData() { const loadedData = await this.plugin.loadData(); if (loadedData == null ? void 0 : loadedData.settings) upgradeSettings(loadedData.settings); this._pluginData = Object.assign({}, DEFAULT_DATA, loadedData); this._pluginData.settings = Object.assign({}, DEFAULT_SETTINGS, this._pluginData.settings); setDebugParser(this._pluginData.settings.showParserDebugMessages); } /** * Saves the plugin data. * * @returns {Promise } - A promise that resolves when the plugin data is saved. * @throws {Error} - Throws an error if the plugin data is not loaded. */ async savePluginData() { if (this.pluginData === null) throw new PluginDataError("Cant save plugin data, as the data is not yet loaded!!"); await this.plugin.saveData(this.pluginData); } /** * Writes the settings to the plugin data. * * @param {SRSettings} settings - The settings to write. * @returns {Promise } - A promise that resolves when the settings are written. * @throws {Error} - Throws an error if the plugin data is not loaded. */ async writeSettings(settings) { if (this.pluginData === null) throw new PluginDataError( "Cant write settings, as the plugin data is not yet loaded!!" ); this.pluginData.settings = settings; await this.savePluginData(); } }; // src/data/settings-manager.ts var SettingsManager = class { constructor(settings, writeSettings) { this._settings = settings; this.writeSettings = writeSettings; } get settings() { return this._settings; } /** * Saves the settings. * * @param {SRSettings} settings - The settings to save. * @returns {Promise } - A promise that resolves when the settings are saved. */ async saveSettings(settings) { this._settings = settings; try { await this.writeSettings(this._settings); } catch (error) { console.warn(error); } } async save() { await this.saveSettings(this._settings); } }; // src/note/next-note-review-handler.ts var import_obsidian38 = require("obsidian"); // src/ui/obsidian-ui-components/modals/review-deck-selection-modal.tsx var import_obsidian37 = require("obsidian"); var ReviewDeckSelectionModal = class extends import_obsidian37.FuzzySuggestModal { constructor(app, deckKeys) { super(app); this.deckKeys = []; this.deckKeys = deckKeys; } getItems() { return this.deckKeys; } getItemText(item) { return item; } onChooseItem(deckKey, _2) { this.close(); this.submitCallback(deckKey); } }; // src/note/next-note-review-handler.ts var NextNoteReviewHandler = class { constructor(app, settings, noteReviewQueue) { this._lastSelectedReviewDeck = null; this.app = app; this.settings = settings; this._noteReviewQueue = noteReviewQueue; } get lastSelectedReviewDeck() { return this._lastSelectedReviewDeck; } get noteReviewQueue() { return this._noteReviewQueue; } async autoReviewNextNote() { if (this.settings.autoNextNote) { if (!this._lastSelectedReviewDeck) { const reviewDeckKeys = this._noteReviewQueue.reviewDeckNameList; if (reviewDeckKeys.length > 0) this._lastSelectedReviewDeck = reviewDeckKeys[0]; else { new import_obsidian38.Notice(t("ALL_CAUGHT_UP")); return; } } await this.reviewNextNote(this._lastSelectedReviewDeck); } } async reviewNextNoteModal() { const reviewDeckNames = this._noteReviewQueue.reviewDeckNameList; if (reviewDeckNames.length === 1) { await this.reviewNextNote(reviewDeckNames[0]); } else { const deckSelectionModal = new ReviewDeckSelectionModal(this.app, reviewDeckNames); deckSelectionModal.submitCallback = (deckKey) => { void this.reviewNextNote(deckKey); }; deckSelectionModal.open(); } } async reviewNextNote(deckKey) { if (!this._noteReviewQueue.reviewDeckNameList.contains(deckKey)) { new import_obsidian38.Notice(t("NO_DECK_EXISTS", { deckName: deckKey })); return; } this._lastSelectedReviewDeck = deckKey; const deck = this._noteReviewQueue.reviewDecks.get(deckKey); if (!deck) { new import_obsidian38.Notice(t("NO_DECK_EXISTS", { deckName: deckKey })); return; } const notefile = deck.determineNextNote(this.settings.openRandomNote); if (notefile) { await this.openNote(deckKey, notefile.tfile); } else { new import_obsidian38.Notice(t("ALL_CAUGHT_UP")); } } async openNote(deckName, file) { this._lastSelectedReviewDeck = deckName; await this.app.workspace.getLeaf().openFile(file); } }; // src/note/note-review-deck.ts var SchedNote = class { constructor(note, dueUnix) { this.note = note; this.dueUnix = dueUnix; } isDue(todayUnix) { return this.dueUnix <= todayUnix; } }; var NoteReviewDeck = class { constructor(name) { this._newNotes = []; this._scheduledNotes = []; this._dueNotesCount = 0; this._deckName = name; this._activeFolders = /* @__PURE__ */ new Set([this._deckName, t("TODAY")]); } get deckName() { return this._deckName; } get newNotes() { return this._newNotes; } get scheduledNotes() { return this._scheduledNotes; } get dueNotesCount() { return this._dueNotesCount; } get activeFolders() { return this._activeFolders; } calcDueNotesCount(todayUnix) { this._dueNotesCount = 0; this.scheduledNotes.forEach((scheduledNote) => { if (scheduledNote.isDue(todayUnix)) { this._dueNotesCount++; } }); } sortNotesByDateAndImportance(pageranks) { this._newNotes = this.newNotes.sort( (a2, b2) => (pageranks[b2.path] || 0) - (pageranks[a2.path] || 0) ); this._scheduledNotes = this.scheduledNotes.sort((a2, b2) => { const result = a2.dueUnix - b2.dueUnix; if (result !== 0) { return result; } return (pageranks[b2.note.path] || 0) - (pageranks[a2.note.path] || 0); }); } determineNextNote(openRandomNote) { const todayUnix = globalDateProvider.today.valueOf(); const dueNotes = this.scheduledNotes.filter((note) => note.isDue(todayUnix)); if (dueNotes.length > 0) { const index = openRandomNote ? globalRandomNumberProvider.getInteger(0, dueNotes.length - 1) : 0; return dueNotes[index].note; } if (this.newNotes.length > 0) { const index = openRandomNote ? globalRandomNumberProvider.getInteger(0, this.newNotes.length - 1) : 0; return this.newNotes[index]; } return null; } }; // src/note/note-review-queue.ts var NoteReviewQueue = class { get reviewDecks() { return this._reviewDecks; } get dueNotesCount() { return this._dueNotesCount; } get reviewDeckNameList() { return [...this._reviewDecks.keys()]; } init() { this._reviewDecks = /* @__PURE__ */ new Map(); } calcDueNotesCount(todayUnix) { this._dueNotesCount = 0; this._reviewDecks.forEach((reviewDeck) => { reviewDeck.calcDueNotesCount(todayUnix); this._dueNotesCount += reviewDeck.dueNotesCount; }); } addNoteToQueue(noteFile, noteSchedule, matchedNoteTags) { for (const matchedNoteTag of matchedNoteTags) { if (!this.reviewDecks.has(matchedNoteTag)) { this.reviewDecks.set(matchedNoteTag, new NoteReviewDeck(matchedNoteTag)); } } if (noteSchedule === null) { for (const matchedNoteTag of matchedNoteTags) { const matchedDeck = this.reviewDecks.get(matchedNoteTag); if (matchedDeck === void 0) continue; matchedDeck.newNotes.push(noteFile); } } else { for (const matchedNoteTag of matchedNoteTags) { const matchedDeck = this.reviewDecks.get(matchedNoteTag); if (matchedDeck === void 0) continue; matchedDeck.scheduledNotes.push( new SchedNote(noteFile, noteSchedule.dueDateAsUnix) ); } } } updateScheduleInfo(note, scheduleInfo) { for (const reviewDeck of this.reviewDecks.values()) { const isNewNoteInDeck = reviewDeck.newNotes.some( (newNote) => newNote.path === note.path ); const isScheduledNoteInDeck = reviewDeck.scheduledNotes.some( (scheduledNote) => scheduledNote.note.path === note.path ); const isInDeck = isNewNoteInDeck || isScheduledNoteInDeck; if (!isInDeck) continue; if (isNewNoteInDeck) { const indexOfNote = reviewDeck.newNotes.findIndex( (newNote) => newNote.path === note.path ); reviewDeck.newNotes.splice(indexOfNote, 1); reviewDeck.scheduledNotes.push(new SchedNote(note, scheduleInfo.dueDate.valueOf())); } else if (isScheduledNoteInDeck) { const scheduledNote = reviewDeck.scheduledNotes.find( (scheduledNote2) => scheduledNote2.note.path === note.path ); if (scheduledNote !== void 0) scheduledNote.dueUnix = scheduleInfo.dueDate.valueOf(); } break; } } }; // src/scheduling/reminder-manager.ts var ReminderManager = class { constructor(plugin, uiManager, dataManager) { this.reviewReminderTimer = null; this.isReviewReminderChecking = false; this.plugin = plugin; this.uiManager = uiManager; this.dataManager = dataManager; } /** * Restarts the periodic review-reminder loop once the plugin is fully initialized. * * The reminder feature depends on loaded settings, synced review data, and a ready UI. * Running it earlier risks duplicate startup checks or reminders based on stale state. */ restartReviewReminders() { this.stopReviewReminders(); this.startReviewReminders(); } /** * Starts the periodic review-reminder loop once the plugin is fully initialized. * * The reminder feature depends on loaded settings, synced review data, and a ready UI. * Running it earlier risks duplicate startup checks or reminders based on stale state. */ startReviewReminders() { if (!this.plugin.isInitialized || !this.dataManager.data.settings.enableReviewReminders) { return; } if (this.dataManager.data.settings.reviewReminderCheckOnStartup) { void this.checkReviewReminders(); } const intervalMinutes = Math.min( Math.max(this.dataManager.data.settings.reviewReminderIntervalMinutes, 1), 1440 ); this.reviewReminderTimer = window.setInterval( () => { void this.checkReviewReminders(); }, intervalMinutes * 60 * 1e3 ); } /** * Stops the reminder interval and clears the in-flight guard. * * The guard is reset here as well so that disabling and immediately re-enabling reminders * never leaves the scheduler stuck in a "currently checking" state. */ stopReviewReminders() { if (this.reviewReminderTimer !== null) { window.clearInterval(this.reviewReminderTimer); this.reviewReminderTimer = null; } this.isReviewReminderChecking = false; } /** * Performs a single reminder check. * * We intentionally short-circuit when SR is already open, the user is editing text, or a * sync is already running. In those states, a reminder would be either redundant or * disruptive, and auto-opening review would compete with the user's current context. */ async checkReviewReminders() { if (!this.plugin.isInitialized || !this.plugin.isDataManagerLoaded() || !this.dataManager.isOsrCoreLoaded() || this.isReviewReminderChecking || !this.dataManager.data.settings.enableReviewReminders) { return; } if (this.uiManager.uiState !== 0 /* Closed */ || this.uiManager.isSRInFocus) { return; } if (this.isUserEditingText() || this.dataManager.syncLock) { return; } this.isReviewReminderChecking = true; try { await this.dataManager.sync(); const remainingDeckTree = this.dataManager.osrCore.remainingDeckTree; if (remainingDeckTree === null) { return; } const reviewCardCount = remainingDeckTree.getDistinctRepItemCount( 2 /* AnyItem */, true ); if (reviewCardCount <= 0 || this.uiManager.uiState !== 0 /* Closed */ || this.uiManager.isSRInFocus || this.isUserEditingText()) { return; } await this.uiManager.notifyReviewReminder(); if (this.dataManager.data.settings.reviewReminderAutoOpen) { await this.uiManager.openDeckContainer(1 /* Review */); } } finally { this.isReviewReminderChecking = false; } } /** * Detects whether the user is actively typing in Obsidian. * * The reminder flow uses this to avoid stealing focus or opening review while the user is in * a text field, contenteditable surface, or CodeMirror-backed editor. */ isUserEditingText() { const activeElement = activeDocument.activeElement; if (activeElement === null) { return false; } if (activeElement.instanceOf(HTMLTextAreaElement) || activeElement.instanceOf(HTMLInputElement)) { return true; } if (activeElement.instanceOf(HTMLElement)) { return activeElement.isContentEditable || activeElement.closest(".cm-editor, .markdown-source-view") !== null; } return false; } }; // src/main.ts var SRPlugin = class extends import_obsidian39.Plugin { constructor() { super(...arguments); this._uiManager = null; this._dataManager = null; this._nextNoteReviewHandler = null; this._commandManager = null; this._reminderManager = null; this.isInitialized = false; } async onload() { try { const pluginDataManager = new PluginDataManager(this); await pluginDataManager.loadData(); const settingsManager = new SettingsManager( pluginDataManager.pluginData.settings, async (settings) => { await pluginDataManager.writeSettings(settings); } ); this.dataManager = new DataManager(this, pluginDataManager, settingsManager); const uiManager = new UIManager2(this, settingsManager); this.uiManager = uiManager; this.commandManager = new CommandManager(this, settingsManager, uiManager); this.app.workspace.onLayoutReady(async () => { this.dataManager.loadData(); if (settingsManager.settings.preferredLocale !== "-") { LocaleManagerInstance.getInstance().currentLocale = settingsManager.settings.preferredLocale; } const noteReviewQueue = new NoteReviewQueue(); this._nextNoteReviewHandler = new NextNoteReviewHandler( this.app, settingsManager.settings, noteReviewQueue ); await this.dataManager.initOSRCore(noteReviewQueue, async () => { await this.onOsrVaultDataChanged(); }); await this.uiManager.onLayoutReady(); this.commandManager.onLayoutReady(); this._reminderManager = new ReminderManager(this, this.uiManager, this.dataManager); this.isInitialized = true; this._reminderManager.restartReviewReminders(); }); } catch (error) { if (error instanceof PluginDataError || error instanceof Error) { console.warn("SRPlugin: Error in onLoad", error.message); DebugLoggerInstance.getInstance().log( "SRPlugin: Error in onLoad: " + error.message, "error" ); } else { console.warn("SRPlugin: Error in onLoad"); DebugLoggerInstance.getInstance().log("SRPlugin: Error in onLoad", "error"); } } } get reminderManager() { if (this._reminderManager === null) throw new Error("Reminder manager not initialized!!!"); return this._reminderManager; } get uiManager() { if (this._uiManager === null) throw new Error("UI manager not initialized!!!"); return this._uiManager; } set uiManager(uiManager) { this._uiManager = uiManager; } get nextNoteReviewHandler() { if (this._nextNoteReviewHandler === null) throw new Error("Next note review handler not initialized!!!"); return this._nextNoteReviewHandler; } get commandManager() { if (this._commandManager === null) throw new Error("Command manager not initialized!!!"); return this._commandManager; } set commandManager(commandManager) { this._commandManager = commandManager; } isUiManagerLoaded() { return this._uiManager !== null; } get dataManager() { if (this._dataManager === null) throw new Error("Data manager not initialized!!!"); return this._dataManager; } set dataManager(dataManager) { this._dataManager = dataManager; } isDataManagerLoaded() { return this._dataManager !== null; } onunload() { this.reminderManager.stopReviewReminders(); this.app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).forEach((leaf) => leaf.detach()); this.uiManager.destroy(); this.commandManager.onunload(); } addCustomHotkeys() { this.commandManager.addCustomHotkeys(); } removeCustomHotkeys() { this.commandManager.removeCustomHotkeys(); } /** * Gets the text direction setting for the current Obsidian instance. */ getObsidianRtlSetting() { return activeDocument.body.hasClass("mod-rtl") ? 2 /* Rtl */ : 1 /* Ltr */; } /** * Called when the OSR app core's data has changed. * * Anything that needs to be updated in the UI because of this change should be done here. */ async onOsrVaultDataChanged() { await this.uiManager.updateStatusBar(); if (this.dataManager.data.settings.enableNoteReviewPaneOnStartup) { this.uiManager.sidebarManager.redraw(); } } }; /*! Bundled license information: moment/moment.js: (*! moment.js *) (*! version : 2.30.1 *) (*! authors : Tim Wood, Iskren Chernev, Moment.js contributors *) (*! license : MIT *) (*! momentjs.com *) @kurkle/color/dist/color.esm.js: (*! * @kurkle/color v0.3.4 * https://github.com/kurkle/color#readme * (c) 2024 Jukka Kurkela * Released under the MIT License *) chart.js/dist/chunks/helpers.dataset.js: chart.js/dist/chart.js: (*! * Chart.js v4.5.1 * https://www.chartjs.org * (c) 2025 Chart.js Contributors * Released under the MIT License *) ts-fsrs/dist/index.mjs: ts-fsrs/dist/index.mjs: ts-fsrs/dist/index.mjs: (* istanbul ignore next -- @preserve *) */ /* nosourcemap */