halkyon/apps/todo/halkyon_todo_flutter/lib/l10n/app_en.arb

1468 lines
48 KiB
Text
Raw Normal View History

{
"@@locale": "en",
"appTitle": "Halkyon Todo",
"@appTitle": {
"description": "The app's name: the window's title, and where halkyon_app's texts name the app."
},
"launchProduct": "Todo",
"@launchProduct": {
"description": "The app's word in its wordmark, under \"Halkyon\"."
},
"instanceFirstStartSubtitle": "Choose the instance to keep your tasks on. Someone runs each one; you can add others later.",
"accountTitle": "Account",
"accountDeleteMessage": "Your account is deleted on the server and on all your devices. This can't be undone.",
"aboutTitle": "About Halkyon Todo",
"shellTabToday": "Today",
"shellTabUpcoming": "Upcoming",
"shellTabInbox": "Inbox",
"todayCount": "{count, plural, =1{1 task} other{{count} tasks}}",
"@todayCount": {
"description": "Under Today's title: how many tasks are overdue or due today.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"browseProfile": "Profile",
"browseProfileHint": "Your account, how you sign in and your public profile",
"shellTabBrowse": "Browse",
"settingsTitle": "Settings",
"settingsVersion": "Version {version} (build {build})",
"@settingsVersion": {
"placeholders": {
"version": {
"type": "String"
},
"build": {
"type": "String"
}
}
},
"clear": "Clear",
"colorLabel": "Colour",
"dateTitle": "Date",
"dateNextWeek": "Next week",
"dateWeekend": "This weekend",
"datePick": "Pick a day",
"dateTime": "Time",
"dateNone": "No date",
"dateNoneYet": "No date",
"dayToday": "Today",
"dayTomorrow": "Tomorrow",
"dayYesterday": "Yesterday",
"dayHeadingNamed": "{date} · {name}",
"@dayHeadingNamed": {
"placeholders": {
"date": {
"type": "String"
},
"name": {
"type": "String"
}
}
},
"deadlineOn": "Deadline {day}",
"@deadlineOn": {
"placeholders": {
"day": {
"type": "String"
}
}
},
"deadlineNone": "No deadline",
"keysMissing": "This device can't save: it doesn't hold your account's keys. Sign in with your password or recovery phrase to add them.",
perf(todo): ticks, drags and the chosen tasks show at once, written in one go What a person does to their tasks shows before the device has sealed and kept it (Flutter's optimistic state): TodoCubit.showing shows a change on the tasks at once and on every state read while its write runs; where the write fails, the tasks show as they are again at once and a snack bar says so (the keys missing, or "That wasn't saved"), through writeTasks. A task's check, a task dragged to a day, an hour or a place in its project, Reschedule, and the selection's date, labels, priority, deadline, move, complete and delete go through it; Undo stays where it was, offered once the write is kept. The chosen tasks were written one at a time, each write opening every task again (SealedRows.all decrypts all of them), so deleting a hundred opened them a hundred times. TaskRepository now reads once and writes together: updateAll, completeAll, deleteAll, move, place and restore, the automatic reminder asked once, and SealedRows.updateAll seals all of them before writing any (KeysMissing leaves none written) and fires one change, so the screen reads once after. What a write changes is worked out by pure functions shared by the repository and the screen (movedTo, placedAt, completedContent, withSubTasks in task_views.dart). Whats-New: Ticking, moving and changing tasks, many at once too, shows at once. Whats-New-De: Abhaken, Verschieben und Ändern von Aufgaben, auch vieler auf einmal, zeigt sich sofort. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-07 22:57:29 +01:00
"tasksNotSaved": "That wasn't saved, so your tasks are as they were. Try again.",
"@tasksNotSaved": {
"description": "A snack bar after a change to tasks, shown at once, could not be kept on the device and was taken back."
},
"filtersLabelsTitle": "Filters & labels",
"filtersLabelsHint": "Views of your tasks, kept",
"filtersTitle": "My filters",
"filtersNone": "No filters yet.",
"filterAdd": "New filter",
"filterEdit": "Edit filter",
"filterDelete": "Delete filter",
"filterDeleteTitle": "Delete the filter?",
"filterName": "Name",
"filterDescription": "Description",
"filterQuery": "Query",
"filterQueryHint": "today & p1",
"filterFavorite": "Add to favourites",
"filterUnfavorite": "Remove from favourites",
"filterPreviewEmpty": "Nothing matches yet.",
"filterNothing": "No tasks in this filter at the moment.",
"filterHelp": "today, tomorrow, overdue, no date, 7 days, p1 to p4, #Project, ##Project with its sub-projects, /Section, @label, search: word. Combine them with & (and), | (or), ! (not) and parentheses; * stands for anything in a name.",
"filterMenu": "Filter menu",
"labelMenu": "Label menu",
"labelNothing": "No open tasks have this label.",
"labelEditEntry": "Edit label",
"filterMatches": "{count, plural, =1{1 task matches} other{{count} tasks match}}",
"@filterMatches": {
"description": "The filter editor's preview.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"filterNotRead": "Not understood near “{near}”",
"@filterNotRead": {
"description": "The filter editor when its query cannot be read.",
"placeholders": {
"near": {
"type": "String"
}
}
},
"filterNotReadEnd": "This query ends too soon",
"@filterNotReadEnd": {
"description": "The filter editor when its query stops before it is complete."
},
"commentShowAll": "Show all",
"commentReact": "Add a reaction",
"commentReactionRemove": "Remove {emoji}",
"commentNone": "Add relevant notes, links or anything else here.",
"@commentReactionRemove": {
"placeholders": {
"emoji": {
"type": "String"
}
}
},
"emojiSearch": "Search emoji",
"emojiNone": "No emoji found",
"emojiRecent": "Recently used",
"emojiSmileys": "Smileys & people",
"emojiAnimals": "Animals & nature",
"emojiFoods": "Food & drink",
"emojiActivities": "Activities",
"emojiTravel": "Travel & places",
"emojiObjects": "Objects",
"emojiSymbols": "Symbols",
"emojiFlags": "Flags",
"commentsTitle": "Comments",
"commentAdd": "Add a comment",
"commentSend": "Send comment",
"commentMenu": "Comment menu",
"commentEdit": "Edit comment",
"commentCopy": "Copy text",
"commentDelete": "Delete comment",
"commentDeleteTitle": "Delete the comment?",
"commentEdited": "{when}, edited",
"@commentEdited": {
"description": "When a comment was written, once it was changed.",
"placeholders": {
"when": {
"type": "String"
}
}
},
"reportingTitle": "Reporting",
"reportingHint": "Goals, streaks and what you've done",
"reportingDaily": "Daily",
"reportingWeekly": "Weekly",
"reportingHistory": "History",
"reportingLast7Days": "Done in the last 7 days",
"reportingLast4Weeks": "Done in the last 4 weeks",
"historyProject": "Project",
"historyAllProjects": "All projects",
"historyNothing": "Nothing done yet.",
"goalsDaily": "Tasks a day",
"goalsWeekly": "Tasks a week",
"goalsDaysOff": "Days off",
"goalsVacation": "Vacation",
"goalsVacationHint": "Streaks wait until you're back",
"goalsEdit": "Edit goals",
"goalsDailyTitle": "Daily goal",
"goalsWeeklyTitle": "Weekly goal",
"goalsDailyStreak": "Daily streak",
"goalsWeeklyStreak": "Weekly streak",
"goalsOnVacation": "On vacation",
"goalsProgress": "{done} of {goal} tasks",
"@goalsProgress": {
"placeholders": {
"done": {
"type": "int"
},
"goal": {
"type": "int"
}
}
},
"goalsLongest": "Longest: {length} ({from} to {to})",
"@goalsLongest": {
"placeholders": {
"length": {
"type": "String"
},
"from": {
"type": "String"
},
"to": {
"type": "String"
}
}
},
"goalsDays": "{count, plural, =1{1 day} other{{count} days}}",
"@goalsDays": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"goalsWeeks": "{count, plural, =1{1 week} other{{count} weeks}}",
"@goalsWeeks": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"reportingTasks": "{count, plural, =1{1 task} other{{count} tasks}}",
"@reportingTasks": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"goalsReached": "Daily goal reached: {count, plural, =1{1 task} other{{count} tasks}} done today.",
"@goalsReached": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"labelsTitle": "Labels",
"labelsNone": "No labels yet.",
"labelsNoneSet": "No labels",
"labelsCount": "{count, plural, =1{1 label} other{{count} labels}}",
"@labelsCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"labelAdd": "New label",
"labelEdit": "Edit label",
"labelDelete": "Delete label",
"labelDeleteTitle": "Delete the label?",
"labelDeleteMessage": "\"{name}\" is taken off every task that has it.",
"@labelDeleteMessage": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"nameLabel": "Name",
"save": "Save",
"overdue": "Overdue",
"reschedule": "Reschedule",
"priorityTitle": "Priority",
"priority1": "Priority 1",
"priority2": "Priority 2",
"priority3": "Priority 3",
"priority4": "No priority",
"projectsTitle": "Projects",
"projectsNone": "No projects of your own yet.",
feat(todo): a project's editor as Todoist's Add project, with sub-projects and favourites Adding or editing a project was a dialog of a name and a colour. It is now a screen of its own on a phone (a dialog where sheets are dialogs), as Todoist's Add project: the name counted to 120, a description, the colour, the parent project, a Favourite switch and the layout, Display's pictures. All of it lives in the project's sealed payload, the schema still 1, no server model or migration; the payload now keeps fields it doesn't know, as a task's does. A new project starts with the layout picked, and Display's Reset all returns to that default rather than to List. Browse lists sub-projects indented and folding under their parents, and the favourites in a group above; a project is never offered as its own ancestor, and a parent's deletion takes its sub-projects, naming them first, as Todoist's. ADR 0033, D28. Whats-New: Add project and Edit project are a screen of their own, with a description, a parent project, Favourite and the layout. Whats-New: Browse lists sub-projects under their parents and your favourite projects at the top. Whats-New: Reset all in Display returns to the layout the project was made with. Whats-New-De: „Projekt hinzufügen“ und „Projekt bearbeiten“ sind eine eigene Seite, mit Beschreibung, übergeordnetem Projekt, Favorit und Layout. Whats-New-De: „Übersicht“ zeigt Unterprojekte unter ihren Projekten und deine Favoriten oben. Whats-New-De: „Alles zurücksetzen“ in der Anzeige kehrt zum Layout zurück, mit dem das Projekt angelegt wurde. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-04 20:56:34 +01:00
"projectAdd": "Add project",
"projectEdit": "Edit project",
"projectDelete": "Delete project",
"projectDeleteTitle": "Delete the project?",
"projectDeleteMessage": "\"{name}\" is deleted with its sections and tasks, on all your devices.",
"@projectDeleteMessage": {
"placeholders": {
"name": {
"type": "String"
}
}
},
feat(todo): quick add's keys, sub-projects' colours, a task's menu on a right click, and the completed tasks deleted at once The developer's list of 9 Nov 2026, Todo's part: - Quick add: the down arrow and Tab move into the description, with its cursor (halkyon_editor's fix); Escape closes the projects or labels suggested first, then closes quick add, what was typed discarded; the project's chip shows the project's colour. - A project without a colour of its own shows its parent's, the nearest ancestor's with one (colorOfProject, TodoCubit.colorOf), wherever a project's colour shows; the project editor's "Same colour as its parent" keeps it so, and the parent picker shows each project in its colour. A project of its own always has one. - The task pane's x closes it, always; Close left the ⋮ menu. - A task's row opens its menu on a right click: Mark as done, Date, Move to, Labels, Priority, Deadline, Duplicate and Delete, the selection's actions for that one task. - Delete completed tasks, in the ⋮ of the Inbox, Today, Upcoming and a project, with Undo: the tasks leave the list at once and are deleted once the snack bar goes without its Undo (halkyon_ui's showUndoSnackBar gains onKept). Whats-New: Quick add: the arrow keys and Tab reach the description, and Escape closes it without saving. Whats-New-De: Schnell hinzufügen: Pfeiltasten und Tab erreichen die Beschreibung, und Escape schließt es, ohne zu speichern. Whats-New: Sub-projects take their parent's colour unless they have their own. Whats-New-De: Unterprojekte übernehmen die Farbe ihres übergeordneten Projekts, wenn sie keine eigene haben. Whats-New: A right click on a task opens its menu, with Move to and more; Delete completed tasks clears a list, with Undo. Whats-New-De: Ein Rechtsklick auf eine Aufgabe öffnet ihr Menü, mit Verschieben nach und mehr; Erledigte Aufgaben löschen räumt eine Liste auf, mit Rückgängig. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-09 23:12:43 +01:00
"projectInheritColor": "Same colour as its parent",
"@projectInheritColor": {
"description": "In a sub-project's editor: whether it shows in its parent's colour rather than one of its own (the developer's review, 9 Nov 2026)."
},
feat(todo): a project's editor as Todoist's Add project, with sub-projects and favourites Adding or editing a project was a dialog of a name and a colour. It is now a screen of its own on a phone (a dialog where sheets are dialogs), as Todoist's Add project: the name counted to 120, a description, the colour, the parent project, a Favourite switch and the layout, Display's pictures. All of it lives in the project's sealed payload, the schema still 1, no server model or migration; the payload now keeps fields it doesn't know, as a task's does. A new project starts with the layout picked, and Display's Reset all returns to that default rather than to List. Browse lists sub-projects indented and folding under their parents, and the favourites in a group above; a project is never offered as its own ancestor, and a parent's deletion takes its sub-projects, naming them first, as Todoist's. ADR 0033, D28. Whats-New: Add project and Edit project are a screen of their own, with a description, a parent project, Favourite and the layout. Whats-New: Browse lists sub-projects under their parents and your favourite projects at the top. Whats-New: Reset all in Display returns to the layout the project was made with. Whats-New-De: „Projekt hinzufügen“ und „Projekt bearbeiten“ sind eine eigene Seite, mit Beschreibung, übergeordnetem Projekt, Favorit und Layout. Whats-New-De: „Übersicht“ zeigt Unterprojekte unter ihren Projekten und deine Favoriten oben. Whats-New-De: „Alles zurücksetzen“ in der Anzeige kehrt zum Layout zurück, mit dem das Projekt angelegt wurde. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-04 20:56:34 +01:00
"projectParent": "Parent project",
"@projectParent": {
"description": "A project's editor (ADR 0033, D28), as Todoist's Add project."
},
"projectNoParent": "No parent",
"projectFavorite": "Favourite",
"favoritesTitle": "Favourites",
"projectSubProjectsHide": "Hide sub-projects",
"projectSubProjectsShow": "Show sub-projects",
"projectDeleteWithSubProjects": "\"{name}\" is deleted with its sub-projects {subProjects}, and their sections and tasks, on all your devices.",
"@projectDeleteWithSubProjects": {
"description": "Deleting a project with sub-projects (ADR 0033, D28): subProjects their names, separated by commas.",
"placeholders": {
"name": {
"type": "String"
},
"subProjects": {
"type": "String"
}
}
},
"projectEmptyTitle": "Nothing to do here",
"projectEmptyHint": "Add a task with the + button.",
"projectGone": "This project was deleted.",
"projectMenu": "More",
"projectPickTitle": "Project",
"sectionAdd": "Add section",
"sectionEdit": "Rename section",
"sectionDelete": "Delete section",
"sectionDeleteTitle": "Delete the section?",
"sectionDeleteMessage": "\"{name}\" is deleted with its tasks.",
"@sectionDeleteMessage": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"sectionMenu": "Section",
"subTasks": "Sub-tasks",
"subTasksDone": "Sub-tasks {done}/{count}",
"@subTasksDone": {
"placeholders": {
"done": {
"type": "int"
},
"count": {
"type": "int"
}
}
},
"subTaskAdd": "Add sub-task",
"taskTitle": "Task",
"taskAddTitle": "Add task",
"taskAdd": "Add",
"taskAddOn": "Add a task on {day}",
"@taskAddOn": {
"placeholders": {
"day": {
"type": "String"
}
}
},
"taskTitleHint": "Task name",
"taskDescription": "Description",
"taskDescriptionHint": "Description",
"taskComplete": "Mark as done",
"taskReopen": "Mark as not done",
"taskCompleted": "Task done",
"taskDelete": "Delete task",
"taskDeleteTitle": "Delete the task?",
"taskDeleteMessage": "\"{title}\" is deleted on all your devices.",
"@taskDeleteMessage": {
"placeholders": {
"title": {
"type": "String"
}
}
},
"taskDeleteWithSubTasks": "\"{title}\" is deleted with its {count, plural, =1{sub-task} other{{count} sub-tasks}}, on all your devices.",
"@taskDeleteWithSubTasks": {
"placeholders": {
"title": {
"type": "String"
},
"count": {
"type": "int"
}
}
},
"taskGone": "This task was deleted.",
"todayEmptyTitle": "Nothing due today",
"todayEmptyHint": "Tasks dated today, and those overdue, show here.",
"lockedRows": "{count, plural, =1{1 item doesn't open on this device.} other{{count} items don't open on this device.}}",
"@lockedRows": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"inboxMissingTitle": "No Inbox yet",
"inboxMissingHint": "Your Inbox comes with the next sync, or once this device holds your account's keys.",
"repeatTitle": "Repeat",
"repeatNone": "Doesn't repeat",
"repeatCustom": "Custom",
"repeatEveryDay": "{count, plural, =1{Every day} other{Every {count} days}}",
"@repeatEveryDay": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"repeatEveryWeek": "{count, plural, =1{Every week} other{Every {count} weeks}}",
"@repeatEveryWeek": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"repeatEveryMonth": "{count, plural, =1{Every month} other{Every {count} months}}",
"@repeatEveryMonth": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"repeatEveryYear": "{count, plural, =1{Every year} other{Every {count} years}}",
"@repeatEveryYear": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"repeatWeekdays": "Every weekday",
"repeatOn": "{rule} on {on}",
"@repeatOn": {
"placeholders": {
"rule": {
"type": "String"
},
"on": {
"type": "String"
}
}
},
"repeatMonthDay": "day {day}",
"@repeatMonthDay": {
"placeholders": {
"day": {
"type": "int"
}
}
},
"repeatMonthWeek": "the {nth, select, 1{first} 2{second} 3{third} 4{fourth} other{last}} {weekday}",
"@repeatMonthWeek": {
"placeholders": {
"nth": {
"type": "String"
},
"weekday": {
"type": "String"
}
}
},
"repeatFromCompletion": "{rule}, from when it's done",
"@repeatFromCompletion": {
"placeholders": {
"rule": {
"type": "String"
}
}
},
"repeatUntil": "{rule}, until {day}",
"@repeatUntil": {
"placeholders": {
"rule": {
"type": "String"
},
"day": {
"type": "String"
}
}
},
"repeatLeft": "{rule}, {count, plural, =0{this time only} =1{once more} other{{count} more times}}",
"@repeatLeft": {
"placeholders": {
"rule": {
"type": "String"
},
"count": {
"type": "int"
}
}
},
"repeatEvery": "Every",
"repeatUnitDays": "Days",
"repeatUnitWeeks": "Weeks",
"repeatUnitMonths": "Months",
"repeatUnitYears": "Years",
"repeatCountFromCompletion": "Count from when it's done",
"repeatCountFromCompletionHint": "Not from its date: done late, it comes again as long after.",
"repeatEnds": "Ends",
"repeatEndsNever": "Never",
"repeatEndsOn": "On a day",
"repeatEndsAfter": "{count, plural, =1{After once} other{After {count} times}}",
"@repeatEndsAfter": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"remindersTitle": "Reminders",
"remindersNone": "No reminders",
"reminderAtTime": "At its time",
"reminderMinutesBefore": "{count, plural, =1{1 minute before} other{{count} minutes before}}",
"@reminderMinutesBefore": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"reminderHoursBefore": "{count, plural, =1{1 hour before} other{{count} hours before}}",
"@reminderHoursBefore": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"reminderDaysBefore": "{count, plural, =1{1 day before} other{{count} days before}}",
"@reminderDaysBefore": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"reminderDue": "Due at {time}",
"@reminderDue": {
"placeholders": {
"time": {
"type": "String"
}
}
},
"remindersChannel": "Task reminders",
"remindersNotAllowed": "Notifications are off for Halkyon Todo: reminders show once you allow them in the system's settings.",
"remindersOnThisDevice": "Reminders come on each of your devices that opens your tasks.",
"reminderBody": "Reminder",
"remindersAtTimes": "At a time of their own",
"reminderAddTime": "Remind at a time",
"reminderRemove": "Remove the reminder",
"durationTitle": "Duration",
"durationNone": "No duration",
"durationHours": "{hours} h",
"@durationHours": {
"placeholders": {
"hours": {
"type": "int"
}
}
},
"durationMinutes": "{minutes} min",
"@durationMinutes": {
"placeholders": {
"minutes": {
"type": "int"
}
}
},
"durationHoursMinutes": "{hours} h {minutes} min",
"@durationHoursMinutes": {
"placeholders": {
"hours": {
"type": "int"
},
"minutes": {
"type": "int"
}
}
},
"weekPrevious": "Previous week",
"weekNext": "Following week",
"searchTitle": "Search",
"searchHint": "Search tasks and projects",
"searchEmpty": "Find a task by the words in its title, its description or its labels. Search runs on this device: your instance can't read your tasks.",
"searchNone": "Nothing found for “{query}”.",
"@searchNone": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchProjects": "Projects",
"searchTasks": "Tasks",
"taskMore": "Task options",
"taskAddedOn": "Added on {when}",
"@taskAddedOn": {
"placeholders": {
"when": {
"type": "String"
}
}
},
"taskDuplicate": "Duplicate",
"taskDuplicated": "Task duplicated",
"subTasksHideDone": "Hide done sub-tasks",
"subTasksShowDone": "Show done sub-tasks",
"taskPath": "Where the task is",
"weekToday": "Back to today",
"monthPrevious": "Previous month",
"monthNext": "Following month",
"monthShow": "Show the whole month",
"monthHide": "Show one week",
"selectTasks": "Select tasks",
"selectionCount": "{count, plural, =0{Select tasks} =1{1 task selected} other{{count} tasks selected}}",
"@selectionCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectionEnd": "Stop selecting",
"selectionDate": "Date",
"selectionMove": "Move to",
"selectionLabels": "Labels",
"selectionPriority": "Priority",
"selectionMore": "More",
"selectionDelete": "{count, plural, =1{Delete 1 task} other{Delete {count} tasks}}",
"@selectionDelete": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectionDeleteTitle": "Delete the tasks?",
"selectionDeleteMessage": "{count, plural, =1{1 task is deleted with its sub-tasks, on all your devices.} other{{count} tasks are deleted with their sub-tasks, on all your devices.}}",
"@selectionDeleteMessage": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectionDuplicate": "{count, plural, =1{Duplicate 1 task} other{Duplicate {count} tasks}}",
"@selectionDuplicate": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectionComplete": "{count, plural, =1{Complete 1 task} other{Complete {count} tasks}}",
"@selectionComplete": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectionDeadline": "Deadline",
"tasksCompleted": "{count, plural, =1{Task done} other{{count} tasks done}}",
"@tasksCompleted": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"swipeSelect": "Select",
"swipeDate": "Date",
"tasksMenu": "More",
"quickAddMore": "More",
"@quickAddMore": {
"description": "Quick add's + menu, holding Description and Deadline (ADR 0033, D15)."
},
"quickAddTokenHint": "Tap a highlighted word, or press Backspace right after it, to keep it as text.",
"@quickAddTokenHint": {
"description": "Below quick add's title while it has tokens recognised (D15)."
},
"quickAddSpeak": "Dictate the task",
"@quickAddSpeak": {
"description": "Tooltip of quick add's microphone, shown while the title is empty (D29)."
},
"quickAddStopListening": "Stop listening",
"@quickAddStopListening": {
"description": "Tooltip of quick add's microphone while it listens (D29)."
},
"quickAddSpeechUnavailable": "This device can't listen now. Check that the app may use the microphone and that speech recognition is on.",
"@quickAddSpeechUnavailable": {
"description": "Shown when quick add's microphone can't listen, as with the microphone refused (D29)."
},
"deadlineTitle": "Deadline",
"@deadlineTitle": {
"description": "Quick add's deadline chip and menu entry (D15)."
},
"orderChanged": "Order changed",
"@orderChanged": {
"description": "Snack bar after a task was dragged into another place (ADR 0033, D16)."
},
"addTaskCancel": "Drop here to cancel",
"@addTaskCancel": {
"description": "The × left in the add button's place while it is dragged (D16)."
},
"taskMovedTo": "Moved to {day}",
"@taskMovedTo": {
"description": "Snack bar after a task was dragged onto another day in Upcoming (ADR 0033, D16).",
"placeholders": {
"day": {
"type": "String"
}
}
},
"display": "Display",
"@display": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayCompleted": "Completed tasks",
"@displayCompleted": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displaySort": "Sort",
"@displaySort": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayGrouping": "Grouping",
"@displayGrouping": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displaySorting": "Sorting",
"@displaySorting": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayFilter": "Filter",
"@displayFilter": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayDeadline": "Deadline",
"@displayDeadline": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayLabel": "Label",
"@displayLabel": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayReset": "Reset all",
"@displayReset": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayDone": "Done",
"@displayDone": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayAll": "All",
"@displayAll": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayAny": "Any",
"@displayAny": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"groupingNone": "None",
"@groupingNone": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"groupingDate": "Date",
"@groupingDate": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"groupingDeadline": "Deadline",
"@groupingDeadline": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"groupingAdded": "Added date",
"@groupingAdded": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"groupingPriority": "Priority",
"@groupingPriority": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"groupingLabel": "Label",
"@groupingLabel": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"sortingManual": "Manual",
"@sortingManual": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"sortingName": "Name",
"@sortingName": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"sortingDate": "Date",
"@sortingDate": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"sortingDeadline": "Deadline",
"@sortingDeadline": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"sortingAdded": "Added date",
"@sortingAdded": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"sortingPriority": "Priority",
"@sortingPriority": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"rangeToday": "Today",
"@rangeToday": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"rangeThisWeek": "This week",
"@rangeThisWeek": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"rangeNext7": "Next 7 days",
"@rangeNext7": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"rangeThisMonth": "This month",
"@rangeThisMonth": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"rangeNext30": "Next 30 days",
"@rangeNext30": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"rangeNoDate": "No date",
"@rangeNoDate": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"rangeNoDeadline": "No deadline",
"@rangeNoDeadline": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"viewNothingTitle": "Nothing matches",
"@viewNothingTitle": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"viewNothingHint": "This view's filters leave out every task here. Display changes them.",
"@viewNothingHint": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displaySave": "Save",
"@displaySave": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"displayCancel": "Cancel",
"@displayCancel": {
"description": "A project's Display sheet and what it shows (ADR 0033, D17)."
},
"groupNoLabel": "No label",
"@groupNoLabel": {
"description": "A project's group of tasks without a label (ADR 0033, D17)."
},
"layoutTitle": "Layout",
"@layoutTitle": {
"description": "A project's layout in its Display, and its board's columns (ADR 0033, D17)."
},
"layoutList": "List",
"@layoutList": {
"description": "A project's layout in its Display, and its board's columns (ADR 0033, D17)."
},
"taskColumnDescription": "Description",
"taskColumnCreated": "Created",
"tableColumns": "Columns",
"tableDetails": "Task details",
"tableSubTasks": "Sub-tasks",
"tableReminders": "Reminders",
"tableFilter": "Filter",
"tableSortUp": "Sort ascending",
"tableSortDown": "Sort descending",
"tableMoveLeft": "Move left",
"tableMoveRight": "Move right",
"tableHide": "Hide column",
"layoutTable": "Table",
"taskColumnTask": "Task",
"taskColumnDate": "Date",
"taskColumnDeadline": "Deadline",
"layoutBoard": "Board",
"@layoutBoard": {
"description": "A project's layout in its Display, and its board's columns (ADR 0033, D17)."
},
"boardNoSection": "(No section)",
"@boardNoSection": {
"description": "A project's layout in its Display, and its board's columns (ADR 0033, D17)."
},
"layoutCalendar": "Calendar",
"@layoutCalendar": {
"description": "A project's Calendar layout and its Display (ADR 0033, D17)."
},
"displayOccurrences": "Future occurrences",
"@displayOccurrences": {
"description": "A project's Calendar layout and its Display (ADR 0033, D17)."
},
"calendarNoDate": "No date",
"@calendarNoDate": {
"description": "A project's Calendar layout and its Display (ADR 0033, D17)."
},
"calendarNoDateEmpty": "Every task here has a date",
"@calendarNoDateEmpty": {
"description": "A project's Calendar layout and its Display (ADR 0033, D17)."
},
"calendarNoDateHint": "Tasks of this project without a date show here.",
"@calendarNoDateHint": {
"description": "A project's Calendar layout and its Display (ADR 0033, D17)."
},
"taskLater": "A later time of a repeating task",
"@taskLater": {
"description": "A project's Calendar layout and its Display (ADR 0033, D17)."
},
"sortingSmart": "Smart",
"@sortingSmart": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"layoutAgenda": "Agenda",
"@layoutAgenda": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"layoutThreeDay": "3-day",
"@layoutThreeDay": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"displayColoring": "Colouring",
"@displayColoring": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"coloringProject": "Project",
"@coloringProject": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"allDay": "All day",
"@allDay": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"daysPrevious": "Earlier days",
"@daysPrevious": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"daysNext": "Later days",
"@daysNext": {
"description": "Upcoming's Display and its 3-day grid (ADR 0033, D17)."
},
"settingsTasks": "Tasks",
"@settingsTasks": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"weekStartTitle": "Start the week on",
"@weekStartTitle": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"weekStartLanguage": "As the language has it",
"@weekStartLanguage": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"resetSubTasksTitle": "Reset sub-tasks",
"@resetSubTasksTitle": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"resetSubTasksHint": "Open them again when a recurring task is done",
"@resetSubTasksHint": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"completionSoundTitle": "Sound when done",
"@completionSoundTitle": {
"description": "Settings of tasks, on a desktop alone: whether a short chime plays as a task is marked done (decided 10 Nov 2026)."
},
"completionSoundHint": "A short chime as a task is marked done",
"@completionSoundHint": {
"description": "Explains completionSoundTitle."
},
"automaticReminderTitle": "Automatic reminder",
"@automaticReminderTitle": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"automaticReminderHint": "For a task given a time, unless it has reminders of its own",
"@automaticReminderHint": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"automaticReminderNone": "None",
"@automaticReminderNone": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"snoozeTitle": "When snoozed",
"@snoozeTitle": {
"description": "Settings of tasks and reminders (ADR 0033, D4)."
},
"snoozeMinutes": "{count, plural, =1{1 minute} other{{count} minutes}}",
"@snoozeMinutes": {
"description": "Settings of tasks and reminders (ADR 0033, D4).",
"placeholders": {
"count": {
"type": "int"
}
}
},
"reminderSnooze": "Snooze {count} min",
"@reminderSnooze": {
"description": "Settings of tasks and reminders (ADR 0033, D4).",
"placeholders": {
"count": {
"type": "int"
}
}
},
"notificationsOffTitle": "Notifications are off",
"@notificationsOffTitle": {
"description": "Settings' Reminders while notifications are off and reminders are planned (ADR 0033, D31)."
},
"notificationsOffHint": "Reminders can't show until Halkyon Todo may notify you.",
"@notificationsOffHint": {
"description": "Settings' Reminders while notifications are off and reminders are planned (ADR 0033, D31)."
},
"notificationsTurnOn": "Turn on",
"@notificationsTurnOn": {
"description": "Settings' Reminders while notifications are off and reminders are planned (ADR 0033, D31)."
},
"monthMore": "{count} more",
"@monthMore": {
"description": "A project's Calendar as a month on wide windows (ADR 0033, D17): a day's tasks that don't fit.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"dayHeadingPattern": "EEEE, d MMM",
"@dayHeadingPattern": {
"description": "intl's DateFormat pattern of a day's heading in Today and Upcoming, as Todoist's (\"Tuesday, 3 Nov\"): EEEE the weekday, d the day, MMM the short month."
},
"overdueHide": "Hide what is overdue",
feat(todo): Today laid out as a calendar, planned from its Plan by dragging, as Todoist's desktop Today (ADR 0033, D30) The developer asked for Todoist's desktop Today planning: a day of hours and a Plan beside it, tasks dragged from it onto an hour. Today gets a Display, its layout alone (List or Calendar), kept in the person's sealed settings row as Upcoming's (`TodayView`, the payload's `today`, schema still 1). Its Calendar is one day of `HourGrid`; *Plan: n* in its app bar shows or hides the Plan (`PlanPanel`): Overdue with Reschedule, To plan (today's without a time) and Time-blocked (today's with one), each folding with its count, narrowed for the session by *All projects*' Filter by project (a search and a box a project, a sub-project with its parents' path). A row dropped on an hour is moved to today at that time, its duration kept; a block dropped on the Plan loses its time; both undone from the snack bar, through `moveTask`. From a medium width of Today's own on the Plan stands beside the day, shown or hidden as remembered; on a phone it is a sheet over the day's foot (the developer's choice, over the Plan on wide windows alone and over a strip above the day), part of the screen rather than a modal route, so that the day behind it takes the drop, and it lowers to its heading while one of its rows is held. Whats-New: Today's Display offers a Calendar layout: today's hours, with a Plan of what is overdue, to plan and time-blocked, whose tasks you drag onto an hour. Whats-New-De: Die Anzeige von Heute bietet das Layout Kalender: die Stunden des Tages, mit einem Plan aus Überfälligem, Zu planen und Eingeplant, dessen Aufgaben du auf eine Stunde ziehst. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-04 22:39:38 +01:00
"overdueShow": "Show what is overdue",
"paneResize": "Resize",
feat(todo): Today laid out as a calendar, planned from its Plan by dragging, as Todoist's desktop Today (ADR 0033, D30) The developer asked for Todoist's desktop Today planning: a day of hours and a Plan beside it, tasks dragged from it onto an hour. Today gets a Display, its layout alone (List or Calendar), kept in the person's sealed settings row as Upcoming's (`TodayView`, the payload's `today`, schema still 1). Its Calendar is one day of `HourGrid`; *Plan: n* in its app bar shows or hides the Plan (`PlanPanel`): Overdue with Reschedule, To plan (today's without a time) and Time-blocked (today's with one), each folding with its count, narrowed for the session by *All projects*' Filter by project (a search and a box a project, a sub-project with its parents' path). A row dropped on an hour is moved to today at that time, its duration kept; a block dropped on the Plan loses its time; both undone from the snack bar, through `moveTask`. From a medium width of Today's own on the Plan stands beside the day, shown or hidden as remembered; on a phone it is a sheet over the day's foot (the developer's choice, over the Plan on wide windows alone and over a strip above the day), part of the screen rather than a modal route, so that the day behind it takes the drop, and it lowers to its heading while one of its rows is held. Whats-New: Today's Display offers a Calendar layout: today's hours, with a Plan of what is overdue, to plan and time-blocked, whose tasks you drag onto an hour. Whats-New-De: Die Anzeige von Heute bietet das Layout Kalender: die Stunden des Tages, mit einem Plan aus Überfälligem, Zu planen und Eingeplant, dessen Aufgaben du auf eine Stunde ziehst. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-04 22:39:38 +01:00
"planButton": "Plan: {count}",
"@planButton": {
"description": "Today's app bar in its Calendar layout (ADR 0033, D30, as Todoist's): shows or hides the Plan, counting the tasks it holds.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"planTitle": "Plan",
"@planTitle": {
"description": "Today's Plan beside or below its day of hours (ADR 0033, D30)."
},
"planShow": "Show the Plan",
"@planShow": {
"description": "Tooltip of Today's Plan button while the Plan is hidden (ADR 0033, D30)."
},
"planHide": "Hide the Plan",
"@planHide": {
"description": "Tooltip of Today's Plan button and the Plan's close button while it shows (ADR 0033, D30)."
},
"planNoDate": "No date",
feat(todo): Today laid out as a calendar, planned from its Plan by dragging, as Todoist's desktop Today (ADR 0033, D30) The developer asked for Todoist's desktop Today planning: a day of hours and a Plan beside it, tasks dragged from it onto an hour. Today gets a Display, its layout alone (List or Calendar), kept in the person's sealed settings row as Upcoming's (`TodayView`, the payload's `today`, schema still 1). Its Calendar is one day of `HourGrid`; *Plan: n* in its app bar shows or hides the Plan (`PlanPanel`): Overdue with Reschedule, To plan (today's without a time) and Time-blocked (today's with one), each folding with its count, narrowed for the session by *All projects*' Filter by project (a search and a box a project, a sub-project with its parents' path). A row dropped on an hour is moved to today at that time, its duration kept; a block dropped on the Plan loses its time; both undone from the snack bar, through `moveTask`. From a medium width of Today's own on the Plan stands beside the day, shown or hidden as remembered; on a phone it is a sheet over the day's foot (the developer's choice, over the Plan on wide windows alone and over a strip above the day), part of the screen rather than a modal route, so that the day behind it takes the drop, and it lowers to its heading while one of its rows is held. Whats-New: Today's Display offers a Calendar layout: today's hours, with a Plan of what is overdue, to plan and time-blocked, whose tasks you drag onto an hour. Whats-New-De: Die Anzeige von Heute bietet das Layout Kalender: die Stunden des Tages, mit einem Plan aus Überfälligem, Zu planen und Eingeplant, dessen Aufgaben du auf eine Stunde ziehst. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-04 22:39:38 +01:00
"planToPlan": "To plan",
"@planToPlan": {
"description": "Today's Plan (ADR 0033, D30): the group of today's tasks without a time, to be given one."
},
"planTimeBlocked": "Time-blocked",
"@planTimeBlocked": {
"description": "Today's Plan (ADR 0033, D30, Todoist's word): the group of today's tasks with a time."
},
"planEmpty": "Nothing to plan",
"@planEmpty": {
"description": "Today's Plan (ADR 0033, D30) while it holds no task."
},
"planDropHint": "Drop here to take its time away",
"@planDropHint": {
"description": "Today's Plan (ADR 0033, D30) while a block of the day is dragged over it."
},
"planGroupHide": "Hide {group}",
"@planGroupHide": {
"description": "Tooltip folding a group of Today's Plan (ADR 0033, D30).",
"placeholders": {
"group": {
"type": "String"
}
}
},
"planGroupShow": "Show {group}",
"@planGroupShow": {
"description": "Tooltip unfolding a group of Today's Plan (ADR 0033, D30).",
"placeholders": {
"group": {
"type": "String"
}
}
},
"planAllProjects": "All projects",
"@planAllProjects": {
"description": "Today's Plan's project filter (ADR 0033, D30) while it keeps every project, and the button putting it back."
},
"planProjectsCount": "{count, plural, =1{1 project} other{{count} projects}}",
"@planProjectsCount": {
"description": "Today's Plan's project filter (ADR 0033, D30) while it keeps several projects.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"planFilterTitle": "Filter by project",
"@planFilterTitle": {
"description": "Today's Plan's project filter (ADR 0033, D30): its search field's hint and its name."
},
"locationTitle": "Location",
"@locationTitle": {
"description": "Quick add's + menu and its button (ADR 0033, D32)."
},
"locationAdd": "Add location",
"@locationAdd": {
"description": "A task's Where, and the picker's button."
},
"locationWhere": "Where",
"@locationWhere": {
"description": "The heading of a task's places."
},
"locationAnyOf": "Any of these",
"@locationAnyOf": {
"description": "Under a task's Where, with several places: they are alternatives."
},
"locationSearchHint": "City or district, then the name",
"@locationSearchHint": {
"description": "The location picker's search field."
},
"locationSearchAny": "Search for a place",
"@locationSearchAny": {
"description": "Quick add, as + is typed."
},
"locationSearchFor": "Search for “{query}”",
"@locationSearchFor": {
"description": "Quick add, as +something is typed.",
"placeholders": {
"query": {
"type": "String"
}
}
},
"locationSearchUnavailable": "Search isn't available here. Move the map and tap to place a pin.",
"@locationSearchUnavailable": {
"description": "The location picker without a place search."
},
"locationSearchFailed": "The search didn't work. Try again.",
"@locationSearchFailed": {
"description": "The location picker after a failed search."
},
"locationNoResults": "Nothing found",
"@locationNoResults": {
"description": "The location picker, a search without results."
},
"locationRecent": "Recent",
"@locationRecent": {
"description": "The location picker's places of the person's tasks."
},
"locationNearby": "Or choose a nearby place",
"@locationNearby": {
"description": "Above the places around the pin in the location picker."
},
2026-11-06 00:12:01 +01:00
"locationNearbyFailed": "Couldn't look up what's around here",
"@locationNearbyFailed": {
"description": "The location picker when asking what is around the pin failed."
},
"locationTryAgain": "Try again",
"@locationTryAgain": {
"description": "Beside the location picker's message that asking what is around the pin failed."
},
"locationPickHint": "Zoom in and move the map to a spot",
"@locationPickHint": {
"description": "The location picker's sheet while the map is too far out for a spot."
},
"locationNorth": "Point north",
"@locationNorth": {
"description": "The location picker's compass, turning the map back to north."
},
"locationKind": "{kind, select, city{City} town{Town} village{Village} hamlet{Hamlet} isolated_dwelling{Isolated dwelling} locality{Locality} suburb{District} neighbourhood{Neighbourhood} residential{Street} house{Address} supermarket{Supermarket} convenience{Shop} bakery{Bakery} butcher{Butcher} chemist{Chemist} pharmacy{Pharmacy} doctors{Doctor} dentist{Dentist} hospital{Hospital} restaurant{Restaurant} cafe{Café} fast_food{Fast food} bar{Bar} pub{Pub} fuel{Petrol station} bank{Bank} post_office{Post office} school{School} kindergarten{Nursery} library{Library} station{Station} bus_stop{Bus stop} hotel{Hotel} park{Park} other{}}",
"@locationKind": {
"description": "What a place found is, from OpenStreetMap's value; empty for any other.",
"placeholders": {
"kind": {
"type": "String"
}
}
},
"locationZoomIn": "Zoom in",
"@locationZoomIn": {
"description": "The location picker's button zooming the map in."
},
"locationZoomOut": "Zoom out",
"@locationZoomOut": {
"description": "The location picker's button zooming the map out."
},
"locationPin": "Pinned place",
"@locationPin": {
"description": "The name of a pin placed by hand where nothing names the spot."
},
"locationName": "Name",
"@locationName": {
"description": "The name field of a pin placed by hand."
},
"locationMine": "My position",
"@locationMine": {
"description": "The map's button."
},
"locationRemindNone": "No reminder",
"@locationRemindNone": {
"description": "A location's reminder."
},
"locationRemindArrive": "On arriving",
"@locationRemindArrive": {
"description": "A location's reminder."
},
"locationRemindLeave": "On leaving",
"@locationRemindLeave": {
"description": "A location's reminder."
},
"locationRemove": "Remove",
"@locationRemove": {
"description": "A task's location's menu."
},
"locationWatching": "Watching your places",
"locationWatchingChannel": "Places watched",
"locationAccessTitle": "Allow location all the time",
"@locationAccessTitle": {
"description": "Before asking for the position in the background."
},
"locationAccessHint": "To remind you when you arrive or leave, Halkyon Todo needs your position while it is closed too. It stays on this device. Next, choose “Allow all the time”.",
"@locationAccessHint": {
"description": "Before asking for the position in the background."
},
"locationAccessGo": "Continue",
"@locationAccessGo": {
"description": "Before asking for the position in the background."
},
"locationOffTitle": "Location is off for reminders",
"@locationOffTitle": {
"description": "Settings' Reminders while places are planned and may not be watched."
},
"locationOffHint": "Reminders at a place need “Allow all the time”.",
"@locationOffHint": {
"description": "Settings' Reminders while places are planned and may not be watched."
},
"locationArrived": "You're at {name}",
"@locationArrived": {
"description": "A reminder on arriving, below the task's title.",
"placeholders": {
"name": {
"type": "String"
}
}
},
"locationLeft": "You've left {name}",
"@locationLeft": {
"description": "A reminder on leaving, below the task's title.",
"placeholders": {
"name": {
"type": "String"
}
}
feat(todo): quick add's keys, sub-projects' colours, a task's menu on a right click, and the completed tasks deleted at once The developer's list of 9 Nov 2026, Todo's part: - Quick add: the down arrow and Tab move into the description, with its cursor (halkyon_editor's fix); Escape closes the projects or labels suggested first, then closes quick add, what was typed discarded; the project's chip shows the project's colour. - A project without a colour of its own shows its parent's, the nearest ancestor's with one (colorOfProject, TodoCubit.colorOf), wherever a project's colour shows; the project editor's "Same colour as its parent" keeps it so, and the parent picker shows each project in its colour. A project of its own always has one. - The task pane's x closes it, always; Close left the ⋮ menu. - A task's row opens its menu on a right click: Mark as done, Date, Move to, Labels, Priority, Deadline, Duplicate and Delete, the selection's actions for that one task. - Delete completed tasks, in the ⋮ of the Inbox, Today, Upcoming and a project, with Undo: the tasks leave the list at once and are deleted once the snack bar goes without its Undo (halkyon_ui's showUndoSnackBar gains onKept). Whats-New: Quick add: the arrow keys and Tab reach the description, and Escape closes it without saving. Whats-New-De: Schnell hinzufügen: Pfeiltasten und Tab erreichen die Beschreibung, und Escape schließt es, ohne zu speichern. Whats-New: Sub-projects take their parent's colour unless they have their own. Whats-New-De: Unterprojekte übernehmen die Farbe ihres übergeordneten Projekts, wenn sie keine eigene haben. Whats-New: A right click on a task opens its menu, with Move to and more; Delete completed tasks clears a list, with Undo. Whats-New-De: Ein Rechtsklick auf eine Aufgabe öffnet ihr Menü, mit Verschieben nach und mehr; Erledigte Aufgaben löschen räumt eine Liste auf, mit Rückgängig. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-09 23:12:43 +01:00
},
"tasksDeleteCompleted": "Delete completed tasks",
"@tasksDeleteCompleted": {
"description": "A list's menu: deletes its done tasks, with an Undo (the developer's review, 9 Nov 2026)."
},
"tasksCompletedDeleted": "{count, plural, =1{1 completed task deleted} other{{count} completed tasks deleted}}",
"@tasksCompletedDeleted": {
"description": "The snack bar after Delete completed tasks, with its Undo.",
"placeholders": {
"count": {
"type": "int"
}
}
},
"projectCalendarTitle": "Linked calendar",
"@projectCalendarTitle": {
"description": "The project's editor: the calendar linked to it, whose events show beside its tasks (ADR 0033, D39)."
},
"projectCalendarAddress": "Calendar address (iCal)",
"@projectCalendarAddress": {
"description": "The project's editor: the field for the calendar's feed address (ADR 0033, D39)."
},
"projectCalendarHelp": "Its events show beside this project's tasks, read-only. Each of your devices fetches it itself.",
"@projectCalendarHelp": {
"description": "The project's editor, below the calendar's address (ADR 0033, D39)."
},
"projectCalendarInvalid": "An address starting with https:// or webcal://",
"@projectCalendarInvalid": {
"description": "The project's editor: an address no feed can be fetched from (ADR 0033, D39)."
},
"eventFromCalendar": "From {project}'s calendar",
"@eventFromCalendar": {
"description": "An event's details: which project's calendar it comes from (ADR 0033, D39).",
"placeholders": {
"project": {
"type": "String"
}
}
feat(todo): the weather: a forecast on days, tasks tied to it, the days that fit (ADR 0033, D40) A task can need weather: dry, sunny, calm and a temperature range (not freezing, warm, or from and to as typed), set from Weather in its details (a chip beside Priority, then a row of its own once it needs any) and kept in its sealed payload (`weather`, schema stays 1). Where its day's forecast misses any of it, its row carries a mark and its details say what is missing; nothing moves and its reminder stays. Its date picker lists the coming days the forecast fits, at its time or from 8:00 to 20:00 without one. The forecast is for the place set in Settings' new Weather card, kept in the sealed settings; else, for a task with a place, its first place. The device's location is never read for it. `ForecastCubit` asks the instance for each place (`InstanceWeather`, rounded to about a kilometre) as it comes, as the app opens, hourly and on a pull, and holds the answers in memory alone. With a place in Settings, each day's heading in Today and Upcoming shows its sky and temperatures, the 3-day grid its icon. Settings says where the instance gives no forecasts, and credits Open-Meteo as its licence asks. Whats-New: A task can need dry, sunny, calm or mild weather: it is marked when the forecast doesn't fit, and its date picker shows the days that do; days show the forecast for the place set in Settings. Whats-New-De: Eine Aufgabe kann trockenes, sonniges, windstilles oder mildes Wetter brauchen: Sie wird markiert, wenn die Vorhersage nicht passt, und ihre Datumsauswahl zeigt die passenden Tage; die Tage zeigen die Vorhersage für den Ort aus den Einstellungen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-10 14:51:52 +01:00
},
"weatherTitle": "Weather",
"@weatherTitle": {
"description": "A task's weather it needs, in its details and the sheet choosing it (ADR 0033, D40)."
},
"weatherNeedDry": "Dry",
"@weatherNeedDry": {
"description": "A task needs no rain or snow over its hours (D40)."
},
"weatherNeedSunny": "Sunny",
"@weatherNeedSunny": {
"description": "A task needs a clear or partly cloudy sky (D40)."
},
"weatherNeedCalm": "Calm",
"@weatherNeedCalm": {
"description": "A task needs little wind (D40)."
},
"weatherTemperature": "Temperature",
"@weatherTemperature": {
"description": "The temperatures a task needs (D40)."
},
"weatherAnyTemperature": "Any",
"@weatherAnyTemperature": {
"description": "No temperature needed (D40)."
},
"weatherNotFreezing": "Not freezing",
"@weatherNotFreezing": {
"description": "From 1 °C on (D40)."
},
"weatherWarm": "Warm",
"@weatherWarm": {
"description": "From 18 °C on (D40)."
},
"weatherOwnRange": "From … to …",
"@weatherOwnRange": {
"description": "Temperatures typed (D40)."
},
"weatherFromLabel": "From",
"@weatherFromLabel": {
"description": "The lowest temperature typed, in °C (D40)."
},
"weatherToLabel": "To",
"@weatherToLabel": {
"description": "The highest temperature typed, in °C (D40)."
},
"weatherFrom": "from {degrees} °C",
"@weatherFrom": {
"description": "A task needs at least this temperature (D40).",
"placeholders": {
"degrees": {
"type": "String"
}
}
},
"weatherUpTo": "up to {degrees} °C",
"@weatherUpTo": {
"description": "A task needs at most this temperature (D40).",
"placeholders": {
"degrees": {
"type": "String"
}
}
},
"weatherBetween": "{low}–{high} °C",
"@weatherBetween": {
"description": "A range of temperatures (D40).",
"placeholders": {
"low": {
"type": "String"
},
"high": {
"type": "String"
}
}
},
"weatherDone": "Done",
"@weatherDone": {
"description": "Closes the sheet of a task's weather, keeping what was chosen (D40)."
},
"weatherFits": "The forecast fits",
"@weatherFits": {
"description": "Under a task's weather where its day's forecast gives what it needs (D40)."
},
"weatherDoesNotFit": "The forecast doesn't fit: {missed}",
"@weatherDoesNotFit": {
"description": "Under a task's weather, and its row's mark, where its day's forecast doesn't give what it needs (D40).",
"placeholders": {
"missed": {
"type": "String"
}
}
},
"weatherMiss": "{need, select, dry{rain} sunny{clouds} temperature{temperature} calm{wind} other{weather}}",
"@weatherMiss": {
"description": "What of the weather a task needs its forecast misses (D40).",
"placeholders": {
"need": {
"type": "String"
}
}
},
"weatherConditions": "{conditions, select, clear{Clear} partlyCloudy{Partly cloudy} cloudy{Overcast} fog{Fog} drizzle{Drizzle} rain{Rain} freezingRain{Freezing rain} snow{Snow} rainShowers{Showers} snowShowers{Snow showers} thunderstorm{Thunderstorm} other{Weather}}",
"@weatherConditions": {
"description": "A day's sky by its forecast, from Open-Meteo's weather code (D40).",
"placeholders": {
"conditions": {
"type": "String"
}
}
},
"weatherFittingDays": "Days the weather fits",
"@weatherFittingDays": {
"description": "The date picker's days whose forecast gives what the task needs (D40)."
},
"weatherNoFittingDay": "No day of the forecast fits",
"@weatherNoFittingDay": {
"description": "The date picker, where no day of the forecast fits (D40)."
},
"weatherSettings": "Weather",
"@weatherSettings": {
"description": "Settings' group of the forecast (D40)."
},
"weatherPlace": "Place of the forecast",
"@weatherPlace": {
"description": "Settings: the place days' forecasts and tasks' weather are for (D40)."
},
"weatherPlaceNone": "None: each task's own place",
"@weatherPlaceNone": {
"description": "Settings, where no place is set (D40)."
},
"weatherPlaceHelp": "Days show this place's forecast, and tasks tied to the weather are judged by it. Your device's location is never used for it.",
"@weatherPlaceHelp": {
"description": "Settings, below the place of the forecast (D40)."
},
"weatherPlaceRemove": "Remove the place",
"@weatherPlaceRemove": {
"description": "Settings: takes the place of the forecast away (D40)."
},
"weatherOff": "This instance gives no forecasts.",
"@weatherOff": {
"description": "Settings, where the instance's operator switched the weather off (D40)."
},
"weatherBy": "Weather data by Open-Meteo.com",
"@weatherBy": {
"description": "The credit Open-Meteo's licence asks for next to its data (D40)."
feat(todo,app): files attached to tasks and comments Halkyon's ADR 0043, D1, D3, D5 and D8: any file up to 100 MB, attached to a task's description or to a comment, sealed as everything of Todo's. Server: the attachment table, synced and sealed as the others, with the sealed file's hash readable for the store; todoFiles hands halkyon_base its rows, readable by their space's members, and takes sealed files alone; the files no attachment names go daily. Its tests hold downloads to the row's space, refuse a readable file and prune what no live row names. Migration attachments: CREATE TABLE "attachment" with its indexes and the foreign key to its space, cascading as every synced table's. App: AttachmentRepository seals each file for its row, keeps it sealed and opened in the person's folder, uploads it after each sync and fetches it as it shows, both held back by Without files on mobile data but for a file tapped. Under the description and a comment's text, a row of them: pictures as thumbnails opening full-size, other files as chips opening in the system's app, else saved; the paperclip beside the description and in the comment's composer adds them, the composer holding them until it is sent. A task deleted takes its files and its comments' along, a comment its own. halkyon_app opens a file in the system's app (FileOpener): on Android through its plugin and a FileProvider of its own class, sharing the cache's halkyon_opened/ folder alone; on the desktop as a file: URI. Whats-New: Attach files to a task's description or a comment with the paperclip: pictures show as thumbnails, other files open in their app. Whats-New-De: Hänge mit der Büroklammer Dateien an die Beschreibung einer Aufgabe oder an einen Kommentar: Bilder erscheinen als Vorschau, andere Dateien öffnen sich in ihrer App. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-11 01:17:22 +01:00
},
"attachmentAdd": "Attach files",
"@attachmentAdd": {"description": "The paperclip button adding files to a task's description or a comment."},
"attachmentAnyFile": "Any file",
"@attachmentAnyFile": {"description": "The file type offered in the dialog picking files to attach."},
"attachmentTooLarge": "{name} is larger than 100 MB.",
"@attachmentTooLarge": {"description": "Said when a file picked to attach is too large.", "placeholders": {"name": {"type": "String"}}},
"attachmentNotAdded": "{name} wasn't attached.",
"@attachmentNotAdded": {"description": "Said when a file couldn't be attached (no keys on this device, or it failed).", "placeholders": {"name": {"type": "String"}}},
"attachmentDownload": "Download",
"@attachmentDownload": {"description": "The tooltip of an attachment not on this device yet, fetched when tapped."},
"attachmentUnavailable": "This file can't be fetched right now. Are you online?",
"@attachmentUnavailable": {"description": "Said when an attachment couldn't be downloaded."},
"attachmentSave": "Save a copy",
"@attachmentSave": {"description": "The menu entry saving an attachment where the person chooses."},
"attachmentRemove": "Remove",
"@attachmentRemove": {"description": "The menu entry removing an attachment, and the button removing a file picked for a comment before it is sent."},
"attachmentRemoveTitle": "Remove this file?",
"@attachmentRemoveTitle": {"description": "The title of the question before an attachment is removed."},
"attachmentMenu": "File options",
"@attachmentMenu": {"description": "The tooltip of an attachment's menu."},
"attachmentSizeKb": "{size} KB",
"@attachmentSizeKb": {"description": "An attachment's size in kilobytes.", "placeholders": {"size": {"type": "int"}}},
"attachmentSizeMb": "{size} MB",
"@attachmentSizeMb": {"description": "An attachment's size in megabytes, with one decimal.", "placeholders": {"size": {"type": "String"}}}
}