Files in content: the person's images and sounds as asset rows synced like
all content, their files kept by hash on each device, uploaded after each
sync, downloaded on demand and checked against their hash
(core/asset/AssetRepository). Rich text names them as asset:<id> URLs, in
the editor's image block and an audio block of ours; any other URL is never
fetched. Sounds play through audioplayers, one at a time. Content holding
only an image or a sound isn't blank, and lists show it as such.
The Anki import ("Import from Anki" under Add material): .apkg and .colpkg
packages in all three formats Anki has written, read on an isolate of their
own. Modern packages compress everything with zstd in frames that don't
record their size, which pure_zstd v1.0.0 refuses; our fork decodes them.
Fields become rich text by a converter of our own (lines, lists, formatting,
images, sounds, cloze deletions hidden on the front). One card per note,
the files first, studysets as chosen (flatten, sub-studysets, or tags by
subdeck), the notes' tags, and, if wanted, the review history, which FSRS
replays: the first template's reviews to the card's schedule, a reversed
note type's second to the reverse one.
Imported cards say where they came from in their first revision (card
schema 3); the dashboard doesn't count them as written. The test fixtures
are exported by Anki itself (tool/anki/make_fixtures.py).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
1339 lines
30 KiB
Dart
1339 lines
30 KiB
Dart
// ignore: unused_import
|
|
import 'package:intl/intl.dart' as intl;
|
|
|
|
import 'app_localizations.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
|
|
/// The translations for English (`en`).
|
|
class AppLocalizationsEn extends AppLocalizations {
|
|
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
|
|
|
@override
|
|
String get appTitle => 'Halkyon Learn';
|
|
|
|
@override
|
|
String get shellTabHome => 'Home';
|
|
|
|
@override
|
|
String get shellTabLibrary => 'Library';
|
|
|
|
@override
|
|
String get shellTabExplore => 'Explore';
|
|
|
|
@override
|
|
String get shellTabProfile => 'Profile';
|
|
|
|
@override
|
|
String get homeTitle => 'Home';
|
|
|
|
@override
|
|
String get libraryTitle => 'Library';
|
|
|
|
@override
|
|
String get libraryNewStudyset => 'New studyset';
|
|
|
|
@override
|
|
String get libraryEmpty => 'No studysets yet';
|
|
|
|
@override
|
|
String get libraryUnreadable => 'Couldn\'t read your studysets.';
|
|
|
|
@override
|
|
String get libraryArchivedSection => 'Archived';
|
|
|
|
@override
|
|
String get librarySearchTooltip => 'Search';
|
|
|
|
@override
|
|
String get librarySearchHint => 'Search studysets';
|
|
|
|
@override
|
|
String get librarySearchClearTooltip => 'Clear query';
|
|
|
|
@override
|
|
String get librarySearchCloseTooltip => 'Close search';
|
|
|
|
@override
|
|
String get librarySearchNoMatches => 'No studysets match your search';
|
|
|
|
@override
|
|
String get libraryStudysetArchived => 'Studyset archived';
|
|
|
|
@override
|
|
String get libraryStudysetUnarchived => 'Studyset unarchived';
|
|
|
|
@override
|
|
String get libraryStudysetDeleted => 'Studyset deleted';
|
|
|
|
@override
|
|
String get libraryDeleteTitle => 'Delete studyset?';
|
|
|
|
@override
|
|
String get libraryDeleteMessage =>
|
|
'It is deleted with everything inside it and all their cards, on all your devices. You can undo this for a few seconds.';
|
|
|
|
@override
|
|
String get libraryDeleteConfirm => 'Delete';
|
|
|
|
@override
|
|
String get studysetSheetCreateTitle => 'Create studyset';
|
|
|
|
@override
|
|
String get studysetSheetEditTitle => 'Edit studyset';
|
|
|
|
@override
|
|
String get studysetSheetCreate => 'Create';
|
|
|
|
@override
|
|
String get studysetSheetSave => 'Save';
|
|
|
|
@override
|
|
String get studysetSheetTitleLabel => 'Title';
|
|
|
|
@override
|
|
String get studysetSheetSecondaryLabel => 'Secondary title';
|
|
|
|
@override
|
|
String get studysetSheetSecondaryHelper =>
|
|
'Shown as a small label above the title.';
|
|
|
|
@override
|
|
String get studysetSheetColor => 'Color';
|
|
|
|
@override
|
|
String get studysetSheetDiscardTitle => 'Discard changes?';
|
|
|
|
@override
|
|
String get studysetSheetDiscardMessage =>
|
|
'You have unsaved changes to this studyset. Discard them and close the form?';
|
|
|
|
@override
|
|
String get studysetSheetDiscardConfirm => 'Discard';
|
|
|
|
@override
|
|
String paletteColorName(String name) {
|
|
String _temp0 = intl.Intl.selectLogic(
|
|
name,
|
|
{
|
|
'carrot': 'Carrot',
|
|
'cerise': 'Cerise',
|
|
'cobalt': 'Cobalt',
|
|
'copper': 'Copper',
|
|
'enzian': 'Enzian',
|
|
'fern': 'Fern',
|
|
'forest': 'Forest',
|
|
'ocean': 'Ocean',
|
|
'olive': 'Olive',
|
|
'pacific': 'Pacific',
|
|
'pickle': 'Pickle',
|
|
'pine': 'Pine',
|
|
'pink': 'Pink',
|
|
'plum': 'Plum',
|
|
'purple': 'Purple',
|
|
'reef': 'Reef',
|
|
'sahara': 'Sahara',
|
|
'slateblue': 'Slate blue',
|
|
'soil': 'Soil',
|
|
'strawberry': 'Strawberry',
|
|
'other': '$name',
|
|
},
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String colorPickerLabel(String color) {
|
|
return 'Color: $color';
|
|
}
|
|
|
|
@override
|
|
String studysetCountFlashcards(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count flashcards',
|
|
one: '1 flashcard',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get studysetNoContent => 'No content yet';
|
|
|
|
@override
|
|
String get studysetActionReview => 'Review';
|
|
|
|
@override
|
|
String get studysetActionStudy => 'Study';
|
|
|
|
@override
|
|
String get studysetActionAdd => 'Add content';
|
|
|
|
@override
|
|
String get studysetArchived => 'Archived';
|
|
|
|
@override
|
|
String get studysetStar => 'Star';
|
|
|
|
@override
|
|
String get studysetUnstar => 'Unstar';
|
|
|
|
@override
|
|
String get studysetOptions => 'Options';
|
|
|
|
@override
|
|
String get studysetMenuEdit => 'Edit';
|
|
|
|
@override
|
|
String get studysetMenuArchive => 'Archive';
|
|
|
|
@override
|
|
String get studysetMenuUnarchive => 'Unarchive';
|
|
|
|
@override
|
|
String get studysetMenuDelete => 'Delete';
|
|
|
|
@override
|
|
String get studysetMenuMove => 'Move to…';
|
|
|
|
@override
|
|
String get studysetTabFlashcards => 'Flashcards';
|
|
|
|
@override
|
|
String get studysetFlashcardsEmpty => 'No flashcards yet';
|
|
|
|
@override
|
|
String get studysetFlashcardsEmptyHint => 'Add some to start studying.';
|
|
|
|
@override
|
|
String get studysetAddMaterial => 'Add material';
|
|
|
|
@override
|
|
String get studysetCreateFlashcards => 'Create flashcards';
|
|
|
|
@override
|
|
String get studysetStudy => 'Study';
|
|
|
|
@override
|
|
String studysetLearnCount(int count) {
|
|
return 'Learn $count';
|
|
}
|
|
|
|
@override
|
|
String get studysetOpenTopics => 'Show topics';
|
|
|
|
@override
|
|
String get studysetTopics => 'Topics';
|
|
|
|
@override
|
|
String get studysetAllTopics => 'All topics';
|
|
|
|
@override
|
|
String get studysetNewSubStudyset => 'New sub-studyset';
|
|
|
|
@override
|
|
String get studysetSubStudysetsEmpty => 'No sub-studysets yet.';
|
|
|
|
@override
|
|
String get studysetSubStudysetsEmptyHint =>
|
|
'Break this studyset into milestones or lessons.';
|
|
|
|
@override
|
|
String get studysetReorder => 'Reorder';
|
|
|
|
@override
|
|
String get studysetReorderDone => 'Done';
|
|
|
|
@override
|
|
String get studysetDragToReorder => 'Drag to reorder';
|
|
|
|
@override
|
|
String get studysetMoveTitle => 'Move studyset to';
|
|
|
|
@override
|
|
String get studysetMoveTopLevel => 'Top level';
|
|
|
|
@override
|
|
String get studysetMoveCurrent => 'Where it is now';
|
|
|
|
@override
|
|
String get studysetMoveConfirm => 'Move';
|
|
|
|
@override
|
|
String get studysetMoveShowInside => 'Show what is inside';
|
|
|
|
@override
|
|
String get studysetMoveHideInside => 'Hide what is inside';
|
|
|
|
@override
|
|
String studysetMoved(String destination) {
|
|
return 'Moved to $destination.';
|
|
}
|
|
|
|
@override
|
|
String get studysetReadMore => 'Read more';
|
|
|
|
@override
|
|
String get studysetDescriptionTitle => 'Description';
|
|
|
|
@override
|
|
String get studysetDescriptionEditTitle => 'Edit description';
|
|
|
|
@override
|
|
String get studysetDescriptionSave => 'Save';
|
|
|
|
@override
|
|
String get studysetSheetDescription => 'Description';
|
|
|
|
@override
|
|
String get studysetSheetDescriptionAdd => 'Add a description';
|
|
|
|
@override
|
|
String get studysetSheetInheritColor => 'Same color as the studyset it is in';
|
|
|
|
@override
|
|
String get exploreTitle => 'Explore';
|
|
|
|
@override
|
|
String get exploreEmpty => 'Studysets that others share will appear here.';
|
|
|
|
@override
|
|
String get profileTitle => 'Profile';
|
|
|
|
@override
|
|
String get profileSettingsTooltip => 'Settings';
|
|
|
|
@override
|
|
String get profileIdentified => 'Your progress is kept with your account.';
|
|
|
|
@override
|
|
String get profileAnonymous =>
|
|
'Progress is saved on this device. Sign in to keep it.';
|
|
|
|
@override
|
|
String get profileSignInWithGitHub => 'Sign in with GitHub';
|
|
|
|
@override
|
|
String get profileSignInFailed => 'Couldn\'t sign in with GitHub.';
|
|
|
|
@override
|
|
String get profileContinueInBrowser => 'Continue in your browser.';
|
|
|
|
@override
|
|
String get profileSwitchTitle => 'Switch to your GitHub account?';
|
|
|
|
@override
|
|
String get profileSwitchMessage =>
|
|
'This GitHub account already has progress from another device. The studysets on this device can\'t be combined with it yet: if you switch, they are deleted.';
|
|
|
|
@override
|
|
String get profileSwitchStay => 'Stay anonymous';
|
|
|
|
@override
|
|
String get profileSwitchConfirm => 'Switch';
|
|
|
|
@override
|
|
String get settingsTitle => 'Settings';
|
|
|
|
@override
|
|
String get settingsAccount => 'Account';
|
|
|
|
@override
|
|
String get settingsSignOut => 'Sign out';
|
|
|
|
@override
|
|
String get settingsSignOutTitle => 'Sign out?';
|
|
|
|
@override
|
|
String get settingsSignOutAnonymousMessage =>
|
|
'This account can\'t be signed into again, so signing out deletes it with its progress.';
|
|
|
|
@override
|
|
String get settingsDeleteAccount => 'Delete account';
|
|
|
|
@override
|
|
String get settingsDeleteTitle => 'Delete your account?';
|
|
|
|
@override
|
|
String get settingsDeleteMessage =>
|
|
'Everything you have, your studysets, cards and reviews, is deleted on the server and on all your devices. This can\'t be undone.';
|
|
|
|
@override
|
|
String get settingsAbout => 'About Halkyon Learn';
|
|
|
|
@override
|
|
String get tagsReadFailed => 'Couldn\'t read the tags.';
|
|
|
|
@override
|
|
String get tagPickerTitle => 'Tags';
|
|
|
|
@override
|
|
String get tagPickerManage => 'Manage tags';
|
|
|
|
@override
|
|
String get tagPickerSearchLabel => 'Search or create a tag';
|
|
|
|
@override
|
|
String tagPickerCreate(String name) {
|
|
return 'Create \"$name\"';
|
|
}
|
|
|
|
@override
|
|
String get tagSheetCreateTitle => 'Create tag';
|
|
|
|
@override
|
|
String get tagSheetEditTitle => 'Edit tag';
|
|
|
|
@override
|
|
String get tagSheetNameLabel => 'Name';
|
|
|
|
@override
|
|
String get tagSheetNameHelper => 'Stored and displayed in lowercase.';
|
|
|
|
@override
|
|
String tagSheetNameExists(String name) {
|
|
return 'The tag \'$name\' exists already.';
|
|
}
|
|
|
|
@override
|
|
String tagSheetNameMerges(String name) {
|
|
return 'There is a tag \'$name\' already: saving merges this one into it.';
|
|
}
|
|
|
|
@override
|
|
String get tagSheetColor => 'Color';
|
|
|
|
@override
|
|
String get tagSheetCreate => 'Create';
|
|
|
|
@override
|
|
String get tagSheetSave => 'Save';
|
|
|
|
@override
|
|
String get tagManageTitle => 'Manage tags';
|
|
|
|
@override
|
|
String get tagManageEmpty => 'No tags yet. Add one below.';
|
|
|
|
@override
|
|
String get tagManageAdd => 'Add tag';
|
|
|
|
@override
|
|
String tagManageRow(String name, int count) {
|
|
return '$name ($count)';
|
|
}
|
|
|
|
@override
|
|
String get tagManageEdit => 'Edit tag';
|
|
|
|
@override
|
|
String get tagManageDelete => 'Delete tag';
|
|
|
|
@override
|
|
String tagDeleteTitle(String name) {
|
|
return 'Delete the tag \'$name\'?';
|
|
}
|
|
|
|
@override
|
|
String tagDeleteMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'It is removed from $count flashcards, on all your devices.',
|
|
one: 'It is removed from 1 flashcard, on all your devices.',
|
|
zero: 'It isn\'t on any flashcards.',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get tagDeleteConfirm => 'Delete';
|
|
|
|
@override
|
|
String tagDeleted(String name) {
|
|
return 'Deleted the tag \'$name\'';
|
|
}
|
|
|
|
@override
|
|
String get studySettingsTitle => 'Session settings';
|
|
|
|
@override
|
|
String get studySettingsFilterByTags => 'Filter by tags';
|
|
|
|
@override
|
|
String get studySettingsFilterHint =>
|
|
'Study only the flashcards with any of the tags chosen.';
|
|
|
|
@override
|
|
String get studySettingsNoTags =>
|
|
'No tags yet. Add tags to your flashcards to filter them here.';
|
|
|
|
@override
|
|
String get studySettingsReset => 'Reset';
|
|
|
|
@override
|
|
String get studySettingsSave => 'Save';
|
|
|
|
@override
|
|
String get cardTagsLabel => 'Tags';
|
|
|
|
@override
|
|
String get cardTagsAdd => 'Add tags';
|
|
|
|
@override
|
|
String get cardTagsEdit => 'Edit tags';
|
|
|
|
@override
|
|
String get cardFilterTooltip => 'Filter';
|
|
|
|
@override
|
|
String get cardFilterTitle => 'Filter';
|
|
|
|
@override
|
|
String get cardFilterTag => 'Tag';
|
|
|
|
@override
|
|
String get cardFilterAllTags => 'All tags';
|
|
|
|
@override
|
|
String get cardFilterNoTags => 'None of these flashcards has a tag yet.';
|
|
|
|
@override
|
|
String get cardFilterClear => 'Clear all';
|
|
|
|
@override
|
|
String get cardFilterApply => 'Apply';
|
|
|
|
@override
|
|
String get cardFilterNothing => 'No flashcards have this tag.';
|
|
|
|
@override
|
|
String get cardListMore => 'More';
|
|
|
|
@override
|
|
String get cardListManageTags => 'Manage tags';
|
|
|
|
@override
|
|
String get composerTitle => 'Create flashcards';
|
|
|
|
@override
|
|
String composerTitleFor(String title) {
|
|
return 'Create flashcards for \"$title\"';
|
|
}
|
|
|
|
@override
|
|
String get composerSaving => 'Saving…';
|
|
|
|
@override
|
|
String get composerSaveFailed => 'Save failed — retry';
|
|
|
|
@override
|
|
String get composerAllSaved => 'All changes saved';
|
|
|
|
@override
|
|
String get composerNewFlashcard => 'New flashcard';
|
|
|
|
@override
|
|
String get composerCollapseStack => 'Collapse stack';
|
|
|
|
@override
|
|
String get composerExpandStack => 'Expand stack';
|
|
|
|
@override
|
|
String get composerStatusSaving => 'Saving';
|
|
|
|
@override
|
|
String get composerStatusSaved => 'Saved';
|
|
|
|
@override
|
|
String get composerStatusFailed => 'Save failed';
|
|
|
|
@override
|
|
String get composerSaveFailedInline => 'Save failed.';
|
|
|
|
@override
|
|
String get composerRetry => 'Retry';
|
|
|
|
@override
|
|
String get composerEmptyPane => 'Add a flashcard to get started.';
|
|
|
|
@override
|
|
String get composerKindFlashcard => 'Flashcard';
|
|
|
|
@override
|
|
String get composerKindVocabulary => 'Vocabulary';
|
|
|
|
@override
|
|
String get composerKindMatching => 'Matching';
|
|
|
|
@override
|
|
String get composerKindMap => 'Map';
|
|
|
|
@override
|
|
String get composerLabelFront => 'Front';
|
|
|
|
@override
|
|
String get composerLabelQuestion => 'Question';
|
|
|
|
@override
|
|
String get composerLabelExpression => 'Expression';
|
|
|
|
@override
|
|
String get composerLabelPrompt => 'Prompt';
|
|
|
|
@override
|
|
String get composerLabelBack => 'Back';
|
|
|
|
@override
|
|
String get composerLabelAnswers => 'Answers';
|
|
|
|
@override
|
|
String get composerLabelAnswer => 'Answer';
|
|
|
|
@override
|
|
String get composerPlaceholderFront => 'Add question';
|
|
|
|
@override
|
|
String get composerPlaceholderExpression => 'Add expression';
|
|
|
|
@override
|
|
String get composerPlaceholderPrompt => 'Add prompt';
|
|
|
|
@override
|
|
String get composerAddAnswer => 'Add answer';
|
|
|
|
@override
|
|
String get composerCorrectAnswer => 'Correct answer';
|
|
|
|
@override
|
|
String get composerWrongAnswer => 'Wrong answer';
|
|
|
|
@override
|
|
String get composerRemoveAnswer => 'Remove answer';
|
|
|
|
@override
|
|
String composerPin(String field) {
|
|
return 'Pin $field: keep it for the next card';
|
|
}
|
|
|
|
@override
|
|
String composerUnpin(String field) {
|
|
return 'Unpin $field: clear it for the next card';
|
|
}
|
|
|
|
@override
|
|
String get composerTags => 'Tags';
|
|
|
|
@override
|
|
String get composerAddTags => 'Add tags';
|
|
|
|
@override
|
|
String get composerMoreActions => 'More actions';
|
|
|
|
@override
|
|
String get composerDuplicate => 'Duplicate';
|
|
|
|
@override
|
|
String get composerClearFields => 'Clear fields';
|
|
|
|
@override
|
|
String get composerDelete => 'Delete';
|
|
|
|
@override
|
|
String get composerDeleteTitle => 'Delete this flashcard?';
|
|
|
|
@override
|
|
String get composerDeleteDraftMessage =>
|
|
'The draft will be removed from this session. It has not been saved.';
|
|
|
|
@override
|
|
String get composerDeleteSavedMessage =>
|
|
'The flashcard will be removed from the studyset, on all your devices.';
|
|
|
|
@override
|
|
String composerDiscardTitle(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'Discard unsaved flashcards?',
|
|
one: 'Discard unsaved flashcard?',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String composerDiscardMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other:
|
|
'$count flashcards haven\'t been saved yet. Leaving now will discard them.',
|
|
one: '1 flashcard hasn\'t been saved yet. Leaving now will discard it.',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get composerDiscardConfirm => 'Discard';
|
|
|
|
@override
|
|
String get composerConflict =>
|
|
'This flashcard was changed differently on two devices. Choose the version to keep of each part below.';
|
|
|
|
@override
|
|
String get composerKeepThis => 'Keep this';
|
|
|
|
@override
|
|
String get vocabularyReading => 'Reading';
|
|
|
|
@override
|
|
String get vocabularyReadingHint => 'Kana reading';
|
|
|
|
@override
|
|
String get vocabularyMeanings => 'Meanings';
|
|
|
|
@override
|
|
String get vocabularyPrimaryMeaningHint => 'Primary meaning';
|
|
|
|
@override
|
|
String get vocabularyMeaningHint => 'Meaning';
|
|
|
|
@override
|
|
String get vocabularyAddMeaning => 'Add meaning';
|
|
|
|
@override
|
|
String get vocabularyRemoveMeaning => 'Remove meaning';
|
|
|
|
@override
|
|
String get matchingCategories => 'Categories';
|
|
|
|
@override
|
|
String get matchingCategoriesHint =>
|
|
'The drop-zone cards learners drag items onto. Each category needs at least one item, so a card can\'t have more categories than items.';
|
|
|
|
@override
|
|
String matchingCategory(int number) {
|
|
return 'Category $number';
|
|
}
|
|
|
|
@override
|
|
String get matchingAddCategory => 'Add category';
|
|
|
|
@override
|
|
String get matchingAddCategoryBlocked =>
|
|
'Add an item first: a card can\'t have more categories than items';
|
|
|
|
@override
|
|
String get matchingRemoveCategory => 'Remove category';
|
|
|
|
@override
|
|
String get matchingMinCategories => 'At least two categories required';
|
|
|
|
@override
|
|
String get matchingItems => 'Items';
|
|
|
|
@override
|
|
String get matchingItemsHint =>
|
|
'The draggable items. Assign every item to its correct category: an unassigned item can never be placed right.';
|
|
|
|
@override
|
|
String matchingItem(int number) {
|
|
return 'Item $number';
|
|
}
|
|
|
|
@override
|
|
String get matchingAddItem => 'Add item';
|
|
|
|
@override
|
|
String get matchingUnassigned => 'Unassigned';
|
|
|
|
@override
|
|
String get matchingRemoveItem => 'Remove item';
|
|
|
|
@override
|
|
String get matchingMinItems => 'At least two items required';
|
|
|
|
@override
|
|
String get cardTileOptions => 'Options';
|
|
|
|
@override
|
|
String get cardTileEdit => 'Edit';
|
|
|
|
@override
|
|
String get cardTileDelete => 'Delete';
|
|
|
|
@override
|
|
String get cardTileUntitled => 'Untitled';
|
|
|
|
@override
|
|
String get cardTileConflict => 'Changed on two devices';
|
|
|
|
@override
|
|
String get studyClose => 'Close session';
|
|
|
|
@override
|
|
String get studyBackFirstOn =>
|
|
'Showing the back of cards first: tap to revert';
|
|
|
|
@override
|
|
String get studyBackFirstOff => 'Show the back of cards first';
|
|
|
|
@override
|
|
String get studyShowAnswer => 'Show answer';
|
|
|
|
@override
|
|
String get studyCheck => 'Check';
|
|
|
|
@override
|
|
String get studyRatingBad => 'Bad';
|
|
|
|
@override
|
|
String get studyRatingOk => 'OK';
|
|
|
|
@override
|
|
String get studyRatingGood => 'Good';
|
|
|
|
@override
|
|
String get studyRatingPerfect => 'Perfect';
|
|
|
|
@override
|
|
String get studyNothingTitle => 'Nothing to study right now';
|
|
|
|
@override
|
|
String get studyNothingBody => 'Come back later when more cards are due.';
|
|
|
|
@override
|
|
String studyNextDue(String interval) {
|
|
return 'The next card is due in $interval.';
|
|
}
|
|
|
|
@override
|
|
String get studyDone => 'Done';
|
|
|
|
@override
|
|
String get studyRoundDone => 'Round complete';
|
|
|
|
@override
|
|
String get studyContinue => 'Continue learning';
|
|
|
|
@override
|
|
String get studyPrevious => 'Previous card';
|
|
|
|
@override
|
|
String get studyNext => 'Next card';
|
|
|
|
@override
|
|
String get studyReading => 'Reading';
|
|
|
|
@override
|
|
String get studyMeanings => 'Meanings';
|
|
|
|
@override
|
|
String get studyPlaceItems =>
|
|
'Drag each item onto its category, or tap an item and then a category.';
|
|
|
|
@override
|
|
String studyMinutes(int count) {
|
|
return '$count min';
|
|
}
|
|
|
|
@override
|
|
String studyHours(int count) {
|
|
return '$count h';
|
|
}
|
|
|
|
@override
|
|
String studyDays(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count days',
|
|
one: '1 day',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String studyMonths(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count months',
|
|
one: '1 month',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String studyYears(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count years',
|
|
one: '1 year',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String studyFilteredBy(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'Narrowed to $count tags',
|
|
one: 'Narrowed to 1 tag',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get studySettingsCardsPerRound => 'Cards per round';
|
|
|
|
@override
|
|
String get studySettingsNewPerDay => 'New cards per day';
|
|
|
|
@override
|
|
String get studySettingsNewPerDayHint =>
|
|
'How many never-studied cards each studyset starts a day. Due reviews are never limited.';
|
|
|
|
@override
|
|
String get studySettingsUnlimited => 'Unlimited';
|
|
|
|
@override
|
|
String get studySettingsSortBy => 'Sort by';
|
|
|
|
@override
|
|
String get studySettingsLearnMode => 'Learn mode';
|
|
|
|
@override
|
|
String get studyModeSpaced => 'Spaced repetition';
|
|
|
|
@override
|
|
String get studyModeSpacedHint =>
|
|
'Due cards on their schedules; ratings move them.';
|
|
|
|
@override
|
|
String get studyModeCram => 'Cram';
|
|
|
|
@override
|
|
String get studyModeCramHint =>
|
|
'Walk every card without touching the schedules.';
|
|
|
|
@override
|
|
String get studySortOldestFirst => 'Oldest first';
|
|
|
|
@override
|
|
String get studySortRandom => 'Random';
|
|
|
|
@override
|
|
String get studySortNewestFirst => 'Newest first';
|
|
|
|
@override
|
|
String get studyFewer => 'Fewer';
|
|
|
|
@override
|
|
String get studyMore => 'More';
|
|
|
|
@override
|
|
String get studysetMenuReset => 'Reset progress';
|
|
|
|
@override
|
|
String get studysetResetTitle => 'Reset progress?';
|
|
|
|
@override
|
|
String get studysetResetMessage =>
|
|
'Every flashcard in it, and in the studysets inside it, starts afresh as new, on all your devices. Your study history stays. You can undo this for a few seconds.';
|
|
|
|
@override
|
|
String get studysetResetConfirm => 'Reset';
|
|
|
|
@override
|
|
String get studysetResetDone => 'Progress reset';
|
|
|
|
@override
|
|
String get mapUnknown => 'This map needs a newer version of the app.';
|
|
|
|
@override
|
|
String get mapPickRegion =>
|
|
'Tap the region that answers the question; pinch or scroll to zoom.';
|
|
|
|
@override
|
|
String get mapNonePicked => 'No region picked yet';
|
|
|
|
@override
|
|
String get composerPlaceholderQuestion => 'Add question';
|
|
|
|
@override
|
|
String get composerLabelRegion => 'Answer';
|
|
|
|
@override
|
|
String get homeStreakTooltip => 'Study streak';
|
|
|
|
@override
|
|
String get homeArrange => 'Arrange widgets';
|
|
|
|
@override
|
|
String get homeDone => 'Done';
|
|
|
|
@override
|
|
String get homeDragToReorder => 'Drag to reorder';
|
|
|
|
@override
|
|
String homeShowWidget(String label) {
|
|
return 'Show $label';
|
|
}
|
|
|
|
@override
|
|
String homeHideWidget(String label) {
|
|
return 'Hide $label';
|
|
}
|
|
|
|
@override
|
|
String get homeAllHidden => 'All widgets are hidden';
|
|
|
|
@override
|
|
String get homeAllHiddenHint => 'Long-press here to bring some back.';
|
|
|
|
@override
|
|
String get homeWidgetGoal => 'Study goal';
|
|
|
|
@override
|
|
String get homeWidgetWeek => 'Week overview';
|
|
|
|
@override
|
|
String get homeWidgetActivity => 'Activity heatmap';
|
|
|
|
@override
|
|
String get homeActivityTitle => 'Your activity';
|
|
|
|
@override
|
|
String streakDays(num count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count day streak',
|
|
one: '1 day streak',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get streakStart => 'Study today to start your streak.';
|
|
|
|
@override
|
|
String get streakGrow =>
|
|
'Keep it going: study at least once a day to grow your streak.';
|
|
|
|
@override
|
|
String get streakFirstDay =>
|
|
'Review some cards today to light the first day.';
|
|
|
|
@override
|
|
String get streakComeBack => 'Come back tomorrow to keep your streak.';
|
|
|
|
@override
|
|
String get streakKeepAlive => 'Study today to keep your streak alive.';
|
|
|
|
@override
|
|
String get goalEditTitle => 'Edit study goal';
|
|
|
|
@override
|
|
String get goalSetTitle => 'Set a study goal';
|
|
|
|
@override
|
|
String get goalDescriptionDaily =>
|
|
'Review a number of flashcards each day. Every card you rate counts.';
|
|
|
|
@override
|
|
String get goalDescriptionWeekly =>
|
|
'Review a number of flashcards each week, from Monday. Every card you rate counts.';
|
|
|
|
@override
|
|
String get goalPeriod => 'Period';
|
|
|
|
@override
|
|
String get goalPerDay => 'Per day';
|
|
|
|
@override
|
|
String get goalPerWeek => 'Per week';
|
|
|
|
@override
|
|
String get goalCardsPerDay => 'Cards per day';
|
|
|
|
@override
|
|
String get goalCardsPerWeek => 'Cards per week';
|
|
|
|
@override
|
|
String get goalSave => 'Save goal';
|
|
|
|
@override
|
|
String get goalRemove => 'Remove goal';
|
|
|
|
@override
|
|
String get goalEmptySubtitle =>
|
|
'Review a set number of cards each day or week.';
|
|
|
|
@override
|
|
String get goalDailyHeadline => 'Daily goal';
|
|
|
|
@override
|
|
String get goalWeeklyHeadline => 'Weekly goal';
|
|
|
|
@override
|
|
String goalProgressToday(int reviewed, int target) {
|
|
return '$reviewed of $target cards today';
|
|
}
|
|
|
|
@override
|
|
String goalProgressThisWeek(int reviewed, int target) {
|
|
return '$reviewed of $target cards this week';
|
|
}
|
|
|
|
@override
|
|
String get goalMet => 'Goal met: nice work!';
|
|
|
|
@override
|
|
String goalRemaining(int count) {
|
|
return '$count to go';
|
|
}
|
|
|
|
@override
|
|
String get weekToday => 'Today';
|
|
|
|
@override
|
|
String get weekPreviousDay => 'Previous day';
|
|
|
|
@override
|
|
String get weekNextDay => 'Next day';
|
|
|
|
@override
|
|
String get weekRestDay => 'Rest day';
|
|
|
|
@override
|
|
String weekDueCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count cards due',
|
|
one: '1 card due',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get heatmapLess => 'Less';
|
|
|
|
@override
|
|
String get heatmapMore => 'More';
|
|
|
|
@override
|
|
String heatmapTotal(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count activities in the last year',
|
|
one: '1 activity in the last year',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String heatmapDay(int count, String date) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count activities',
|
|
one: '1 activity',
|
|
zero: 'Nothing',
|
|
);
|
|
return '$_temp0 · $date';
|
|
}
|
|
|
|
@override
|
|
String get commonCancel => 'Cancel';
|
|
|
|
@override
|
|
String get commonClose => 'Close';
|
|
|
|
@override
|
|
String get commonUndo => 'Undo';
|
|
|
|
@override
|
|
String get commonTryAgain => 'Try again';
|
|
|
|
@override
|
|
String get sessionUnreachable => 'Couldn\'t reach the server.';
|
|
|
|
@override
|
|
String get notFoundGone =>
|
|
'This no longer exists. It may have been deleted on another device.';
|
|
|
|
@override
|
|
String get fileImage => 'Image';
|
|
|
|
@override
|
|
String get fileSound => 'Sound';
|
|
|
|
@override
|
|
String get fileImageUnavailable =>
|
|
'This image isn\'t on this device yet. It shows once it\'s uploaded and you\'re online.';
|
|
|
|
@override
|
|
String get fileFromElsewhere => 'Files from the web aren\'t shown.';
|
|
|
|
@override
|
|
String get filePlaySound => 'Play sound';
|
|
|
|
@override
|
|
String get fileStopSound => 'Stop sound';
|
|
|
|
@override
|
|
String get fileSoundUnavailable =>
|
|
'This sound isn\'t on this device yet. It plays once it\'s uploaded and you\'re online.';
|
|
|
|
@override
|
|
String get ankiImportMenu => 'Import from Anki';
|
|
|
|
@override
|
|
String get ankiImportFileType => 'Anki decks';
|
|
|
|
@override
|
|
String get ankiImportTitle => 'Import Anki deck';
|
|
|
|
@override
|
|
String get ankiImportOptionsTitle => 'How should subdecks be imported?';
|
|
|
|
@override
|
|
String get ankiImportReading => 'Reading the deck…';
|
|
|
|
@override
|
|
String ankiImportSummary(int cards) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
cards,
|
|
locale: localeName,
|
|
other: '$cards cards.',
|
|
one: '1 card.',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String ankiImportSummaryDecks(int cards, int decks) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
cards,
|
|
locale: localeName,
|
|
other: '$cards cards',
|
|
one: '1 card',
|
|
);
|
|
return '$_temp0 across $decks subdecks.';
|
|
}
|
|
|
|
@override
|
|
String get ankiImportModeFlatten => 'Flatten into this studyset';
|
|
|
|
@override
|
|
String get ankiImportModeFlattenSubtitle =>
|
|
'Import every card here and ignore the subdecks.';
|
|
|
|
@override
|
|
String get ankiImportModeSubStudysets => 'Recreate as sub-studysets';
|
|
|
|
@override
|
|
String get ankiImportModeSubStudysetsSubtitle =>
|
|
'Mirror the subdeck tree: each subdeck becomes a nested studyset.';
|
|
|
|
@override
|
|
String get ankiImportModeTag => 'Tag cards by subdeck';
|
|
|
|
@override
|
|
String get ankiImportModeTagSubtitle =>
|
|
'Keep every card here, tagged with each subdeck it came from.';
|
|
|
|
@override
|
|
String get ankiImportProgress => 'Import study progress';
|
|
|
|
@override
|
|
String get ankiImportProgressSubtitle =>
|
|
'Bring Anki\'s review history over: cards continue where they left off. New cards stay new.';
|
|
|
|
@override
|
|
String ankiImportMedia(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'Include media ($count files)',
|
|
one: 'Include media (1 file)',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get ankiImportMediaSubtitle =>
|
|
'Keep the deck\'s images and sounds on the cards.';
|
|
|
|
@override
|
|
String get ankiImportRunning => 'Importing…';
|
|
|
|
@override
|
|
String get ankiImportConfirm => 'Import';
|
|
|
|
@override
|
|
String get ankiImportNotAPackage =>
|
|
'This isn\'t an Anki deck. In Anki, export a deck as an .apkg file and import that.';
|
|
|
|
@override
|
|
String get ankiImportNewerFormat =>
|
|
'This deck comes from a newer Anki than this app knows. Export it again with “Support older Anki versions”.';
|
|
|
|
@override
|
|
String get ankiImportUnreadable => 'This deck is damaged and can\'t be read.';
|
|
|
|
@override
|
|
String get ankiImportBrokeOff =>
|
|
'The import broke off. The cards it brought in so far stay.';
|
|
|
|
@override
|
|
String ankiImported(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'Imported $count flashcards from Anki.',
|
|
one: 'Imported 1 flashcard from Anki.',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String ankiImportedSubStudysets(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'Imported $count cards into sub-studysets.',
|
|
one: 'Imported 1 card into sub-studysets.',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String ankiImportedTagged(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'Imported $count cards, tagged by subdeck.',
|
|
one: 'Imported 1 card, tagged by subdeck.',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String ankiImportFilesSkipped(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count media files couldn\'t be imported.',
|
|
one: '1 media file couldn\'t be imported.',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
}
|