Part of #145. Sixteen files that were left out of my earlier PRs because my branch also carried unrelated changes in them. Those are stripped here: each file is your current `develop` version with the string extraction applied on top, nothing else. Covered: the chore action hook and its toasts, activities and smart-insight cards, the chore toolbar, chore history and its card, saved filters, the timer details view, project and label modals, the notification picker, the pending badge, the sync status indicator, the SSE settings and hook, and the profile avatar menu. All namespaces already exist, so `src/i18n/config.js` is untouched. Keys added: 83 `chores`, 31 `common`, 10 `timer`, 9 `history`, 6 `labels`, 5 `projects`, 2 `filters`, 1 `settings`. English only — no translations, no behaviour change. Every t() value is checked to appear character-for-character in the code it replaces, or to match the value already in your dictionary for the same key: 221 call sites, no mismatches. Five files from the same batch are deliberately left out. They build translated labels in module-level constant tables, where the hook cannot be called — `FilterBar`, `RepeatSection`, `RepeatPickerField`, `FilterBuilderContent` and `AdvancedOptionsSection`. Those need the key to travel as data and be resolved inside the component, which is a design change rather than an extraction, so it deserves its own PR.
189 lines
6.5 KiB
JSON
189 lines
6.5 KiB
JSON
{
|
|
"save": "Save",
|
|
"cancel": "Cancel",
|
|
"delete": "Delete",
|
|
"edit": "Edit",
|
|
"close": "Close",
|
|
"confirm": "Confirm",
|
|
"loading": "Loading...",
|
|
"error": "Error",
|
|
"success": "Success",
|
|
"warning": "Warning",
|
|
"refresh": "Refresh",
|
|
"copy": "Copy",
|
|
"copied": "Copied!",
|
|
"settings": "Settings",
|
|
"yes": "Yes",
|
|
"no": "No",
|
|
"back": "Back",
|
|
"backToCalendar": "Back to Calendar",
|
|
"logout": "Logout",
|
|
"version": "Version",
|
|
"navigation": {
|
|
"search": "Search",
|
|
"allTasks": "All Tasks",
|
|
"archived": "Archived",
|
|
"things": "Things",
|
|
"labels": "Labels",
|
|
"projects": "Projects",
|
|
"filters": "Filters",
|
|
"activities": "Activities",
|
|
"points": "Points",
|
|
"settings": "Settings",
|
|
"reportBug": "Report a Bug"
|
|
},
|
|
"search": {
|
|
"title": "Search",
|
|
"placeholder": "Search Donetick",
|
|
"inputAriaLabel": "Search tasks, history, projects, labels and settings",
|
|
"deviceNote": "Searching content available on this device",
|
|
"escape": "Esc",
|
|
"recent": "Recent",
|
|
"empty": {
|
|
"title": "No direct matches",
|
|
"subtitle": "You can still filter the task list with this search."
|
|
},
|
|
"groups": {
|
|
"tasks": "Tasks",
|
|
"history": "Notes",
|
|
"projects": "Projects",
|
|
"labels": "Labels",
|
|
"people": "People",
|
|
"settings": "Settings",
|
|
"actions": "Quick actions"
|
|
},
|
|
"actions": {
|
|
"quickAction": "Quick action",
|
|
"navigation": "Navigation",
|
|
"createTask": "Create a task",
|
|
"viewAllTasks": "View all tasks",
|
|
"viewArchivedTasks": "View archived tasks",
|
|
"openSettings": "Open settings",
|
|
"filterTasks": "Show tasks matching “{{query}}”",
|
|
"filterTasksSubtitle": "Filter the task list"
|
|
},
|
|
"footer": {
|
|
"navigate": "Navigate",
|
|
"open": "Open",
|
|
"results_one": "{{count}} result",
|
|
"results_other": "{{count}} results",
|
|
"typeToSearch": "Type to search"
|
|
}
|
|
},
|
|
"feedback": {
|
|
"later": "Maybe later",
|
|
"sentiment": {
|
|
"title": "How's Donetick working for you?",
|
|
"subtitle": "Your answer helps us decide what to build next.",
|
|
"options": {
|
|
"love": "Love it",
|
|
"okay": "It's okay",
|
|
"issues": "Having issues"
|
|
}
|
|
},
|
|
"categories": {
|
|
"bugs": "Bugs",
|
|
"missingFeature": "Missing feature",
|
|
"tooComplicated": "Too complicated",
|
|
"slow": "Slow",
|
|
"notifications": "Notifications",
|
|
"ai": "AI",
|
|
"other": "Other"
|
|
},
|
|
"details": {
|
|
"title": "What could we improve?",
|
|
"messageLabel": "Tell us more",
|
|
"messagePlaceholder": "What happened, or what would make this better?",
|
|
"contextNote": "We'll include your app version, device and platform so we can reproduce issues.",
|
|
"submit": "Send feedback",
|
|
"contextNoteSelfHosted": "You're on a self-hosted instance, so nothing is sent from your server — we'll open a pre-filled GitHub issue you can review and edit first.",
|
|
"submitSelfHosted": "Continue to GitHub"
|
|
},
|
|
"review": {
|
|
"title": "Glad you're enjoying it!",
|
|
"subtitle": "A rating or a star helps other people find Donetick.",
|
|
"github": "Star on GitHub",
|
|
"appStore": "Rate on the App Store",
|
|
"playStore": "Rate on Google Play"
|
|
},
|
|
"thanks": {
|
|
"title": "Thanks for the feedback",
|
|
"subtitle": "We read every response and it shapes what we work on next."
|
|
},
|
|
"github": {
|
|
"title": "Report it on GitHub",
|
|
"subtitle": "We've filled in an issue with your notes and version details. Nothing has been sent yet — review it and post when you're ready.",
|
|
"open": "Open the issue"
|
|
}
|
|
},
|
|
"done": "Done",
|
|
"clearAll": "Clear all",
|
|
"upload": {
|
|
"quotaTitle": "Storage Quota Exceeded",
|
|
"quotaMessage": "You have exceeded your quota for uploading files.",
|
|
"tooLargeTitle": "File Too Large",
|
|
"tooLargeMessage": "The file you are trying to upload is too large.",
|
|
"deniedTitle": "Permission Denied",
|
|
"deniedMessage": "You do not have permission to upload files."
|
|
},
|
|
"getStarted": "Get Started!",
|
|
"imageLoadFailed": "Failed to load image.",
|
|
"typeHere": "Type in here…",
|
|
"summaryOfChores": "This is a summary of your chores",
|
|
"loadingOffline": "You are offline",
|
|
"loadingOfflineSub": "This not available while offline. Please check your internet connection and try again.",
|
|
"loadingSlow": "This is taking longer than usual. There might be an issue.",
|
|
"navigateBack": "Navigate Back",
|
|
"bottomNav": "Bottom Navigation",
|
|
"profile": "Profile",
|
|
"autocompletePlaceholder": "Type here...",
|
|
"errorScreen": {
|
|
"title": "Something went wrong",
|
|
"fallback": "An unexpected error occurred. Try reloading — it usually fixes it.",
|
|
"tryAgain": "Try again",
|
|
"home": "Home",
|
|
"login": "Login",
|
|
"hideDetails": "Hide error details",
|
|
"showDetails": "Show error details",
|
|
"copyToClipboard": "Copy to clipboard",
|
|
"copied": "Error details copied to clipboard"
|
|
},
|
|
"userMenu": {
|
|
"actAsAnother": "Act as another user",
|
|
"stopImpersonating": "Stop Impersonating",
|
|
"returnToAccount": "Return to your account",
|
|
"accountPrefs": "Account & preferences",
|
|
"invitePeople": "Invite People",
|
|
"addMembers": "Add members to your circle",
|
|
"sidePanelSettings": "Side Panel Settings"
|
|
},
|
|
"realtime": {
|
|
"newTaskTitle": "New Task Created",
|
|
"connected": "You are now receiving real-time as they happen.",
|
|
"errorTitle": "Real-time Error",
|
|
"parseTitle": "Message Error",
|
|
"parseMessage": "Failed to parse server message",
|
|
"disabledTitle": "Connection Temporarily Disabled",
|
|
"failedTitle": "Connection Failed",
|
|
"stateConnectionError": "Connection error occurred",
|
|
"stateAuthExpired": "Authentication expired - refreshing token...",
|
|
"stateTokenRefreshed": "Token refreshed - reconnecting...",
|
|
"stateRefreshInProgress": "Token refresh in progress - reconnecting soon...",
|
|
"stateSessionExpired": "Session expired - please log in again",
|
|
"stateAuthFailed": "Authentication failed - please log in again",
|
|
"stateAuthError": "Authentication error - please log in again",
|
|
"stateTimeout": "Connection timeout - reconnecting...",
|
|
"connectErrorTitle": "Connection Error",
|
|
"connectErrorMessage": "Failed to establish real-time connection. Please try again."
|
|
},
|
|
"removeAll": "Remove all",
|
|
"apply": "Apply",
|
|
"cancelAll": "Cancel all",
|
|
"sync": {
|
|
"aria": "Open sync and network status",
|
|
"allSynced": "All changes synced",
|
|
"willSync": "Will sync when back online",
|
|
"cancelAll": "Cancel All"
|
|
}
|
|
}
|