- Added new localization keys for project management, settings, and onboarding views. - Updated labels and placeholders in project modal, password change modal, and backup/restore modal for better clarity. - Improved user feedback messages for password mismatch and backup creation failures. - Enhanced the timer details view with localized strings for active work, sessions, and distribution. - Refined the due date picker modal with localized quick date and time options. - Updated photo task modal and scan panel to include localized text for better accessibility. - Ensured consistent use of translation function for all user-facing strings.
460 lines
18 KiB
JSON
460 lines
18 KiB
JSON
{
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"delete": "Delete",
|
||
"edit": "Edit",
|
||
"close": "Close",
|
||
"confirm": "Confirm",
|
||
"loading": "Loading...",
|
||
"error": "Error",
|
||
"success": "Success",
|
||
"warning": "Warning",
|
||
"colors": {
|
||
"Salmon": "Salmon",
|
||
"Teal": "Teal",
|
||
"Sky Blue": "Sky Blue",
|
||
"Grape": "Grape",
|
||
"Sunshine": "Sunshine",
|
||
"Coral": "Coral",
|
||
"Lavender": "Lavender",
|
||
"Rose": "Rose",
|
||
"Charcoal": "Charcoal",
|
||
"Sienna": "Sienna",
|
||
"Mint": "Mint",
|
||
"Amber": "Amber",
|
||
"Cobalt": "Cobalt",
|
||
"Emerald": "Emerald",
|
||
"Peach": "Peach",
|
||
"Ocean": "Ocean",
|
||
"Mustard": "Mustard",
|
||
"Ruby": "Ruby",
|
||
"Periwinkle": "Periwinkle",
|
||
"Turquoise": "Turquoise",
|
||
"Lime": "Lime",
|
||
"Blush": "Blush",
|
||
"Ash": "Ash",
|
||
"Sand": "Sand"
|
||
},
|
||
"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 an Issue"
|
||
},
|
||
"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.",
|
||
"actionsSubtitle": "No view or action matches. Press backspace to search everything."
|
||
},
|
||
"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",
|
||
"createLabel": "Create a label",
|
||
"createProject": "Create a project",
|
||
"createFilter": "Create a filter",
|
||
"viewAllTasks": "View all tasks",
|
||
"viewArchivedTasks": "View archived tasks",
|
||
"viewThings": "View things",
|
||
"viewLabels": "View labels",
|
||
"viewProjects": "View projects",
|
||
"viewFilters": "View filters",
|
||
"viewActivities": "View activities",
|
||
"viewPoints": "View points",
|
||
"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",
|
||
"slashHint": "/ to jump to a view"
|
||
},
|
||
"modes": {
|
||
"actions": {
|
||
"label": "Go to",
|
||
"placeholder": "Jump to a view or action"
|
||
}
|
||
}
|
||
},
|
||
"policyUpdate": {
|
||
"title": "We've updated our Privacy Policy and Terms",
|
||
"subtitle": "Please take a moment to review them. By continuing to use Donetick, you accept the updated documents.",
|
||
"readPrivacy": "Privacy Policy",
|
||
"readTerms": "Terms",
|
||
"acknowledge": "Got it"
|
||
},
|
||
"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.",
|
||
"plusFeatureTitle": "Plus Feature",
|
||
"plusFeatureMessage": "Image uploads are not available in the Basic plan. Upgrade to Plus to add images to your content.",
|
||
"upgradeTitle": "Upgrade Required",
|
||
"upgradeMessage": "Image uploads are only available for Plus accounts.",
|
||
"failedTitle": "Upload Failed",
|
||
"failedMessage": "Failed to upload image.",
|
||
"processingMessage": "An error occurred while processing the image."
|
||
},
|
||
"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",
|
||
"planFree": "Free",
|
||
"planPlus": "Plus",
|
||
"planPlusExpiring": "Plus (expires soon)",
|
||
"switchUser": "Switch User",
|
||
"impersonateUser": "Impersonate User",
|
||
"switchToLight": "Switch to Light",
|
||
"switchToDark": "Switch to Dark",
|
||
"unlockPremium": "Unlock premium features",
|
||
"impersonating": "Impersonating",
|
||
"toggleThemeAppearance": "Toggle theme appearance",
|
||
"upgradeToPlus": "Upgrade to Plus"
|
||
},
|
||
"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"
|
||
},
|
||
"attachments": "Attachments",
|
||
"fileNumbered": "File {{index}}",
|
||
"onboarding": {
|
||
"sources": {
|
||
"speak": "Speak",
|
||
"snap": "Snap",
|
||
"type": "Type"
|
||
},
|
||
"capture": {
|
||
"voiceCaption": "Dates, labels and points from your words",
|
||
"deviceCaption": "Read on your device",
|
||
"typeCaption": "#labels @people *points as you type",
|
||
"trashTitle": "♻️ Take out the trash",
|
||
"trashDue": "Due tomorrow",
|
||
"trashRepeat": "Every Monday",
|
||
"homeLabel": "Home",
|
||
"vehicleTitle": "🚗 Vehicle Registration Renewal",
|
||
"vehicleDue": "Due Aug 3",
|
||
"acTitle": "💨 Change the AC filter",
|
||
"acDue": "Due Fri",
|
||
"acRepeat": "Every 3 months"
|
||
},
|
||
"schedule": {
|
||
"fromDueDate": "Reschedule from due date",
|
||
"fromCompletionDate": "Reschedule from completion date",
|
||
"due": "Due",
|
||
"done": "Done",
|
||
"next": "Next"
|
||
},
|
||
"nfc": {
|
||
"tagOnWasher": "Tag on the washer",
|
||
"tapToOpen": "Tap to open",
|
||
"swapFilter": "Swap the washer filter",
|
||
"done": "Done",
|
||
"skip": "Skip",
|
||
"startTimer": "Start timer",
|
||
"waitingApproval": "{{name}} marked it done · waiting on you",
|
||
"approve": "Approve",
|
||
"reject": "Reject",
|
||
"completed": "Completed",
|
||
"note": "Used the delicate cycle — filter needs a clean next time.",
|
||
"metaJustNow": "Just now · ★ 5 pts",
|
||
"metaLastWeek": "Last week · ★ 5 pts"
|
||
},
|
||
"circle": {
|
||
"kitchenTitle": "Kitchen deep clean",
|
||
"kitchenDue": "Due Sat",
|
||
"kitchenRepeat": "Every week",
|
||
"takesTurns": "Takes turns"
|
||
},
|
||
"turns": {
|
||
"binsTitle": "🗑️ Take bins to the curb",
|
||
"binsDue": "Due Tomorrow",
|
||
"binsRepeat": "Every week",
|
||
"completed": "Completed",
|
||
"metaJustNow": "Just now · ★ 5 pts"
|
||
},
|
||
"widget": {
|
||
"schoolForms": "School forms",
|
||
"takeOutTrash": "Take out the trash",
|
||
"waterPlants": "Water the plants",
|
||
"today": "Today",
|
||
"left": "{{count}} left"
|
||
},
|
||
"reminders": {
|
||
"trashTitle": "Take out the trash",
|
||
"trashBody": "Due in 30 minutes · Bin night",
|
||
"finishedTitle": "Amalie finished Kitchen deep clean",
|
||
"finishedBody": "Your turn is next Saturday"
|
||
},
|
||
"things": {
|
||
"waterBill": "Water bill",
|
||
"acFilter": "AC filter",
|
||
"trashDay": "Trash day",
|
||
"dogMedicine": "Dog's medicine",
|
||
"whoseTurn": "Whose turn to cook",
|
||
"monthly": "Monthly",
|
||
"everyThreeMonths": "Every 3 months",
|
||
"everyMonday": "Every Monday",
|
||
"daily": "Daily",
|
||
"weekly": "Weekly",
|
||
"tagBills": "Bills",
|
||
"tagHome": "Home",
|
||
"tagPets": "Pets",
|
||
"tagCooking": "Cooking"
|
||
},
|
||
"slides": {
|
||
"problemTitle": "Stop forgetting the little things",
|
||
"problemBody": "Donetick remembers the last time it happened, and when it's due next. So nobody else has to.",
|
||
"captureTitle": "Add it before you forget it",
|
||
"captureBody": "Type it, say it out loud, or snap a photo. Donetick fills in the due date, priority, labels, and who's on it.",
|
||
"scheduleTitle": "It comes back exactly when it should",
|
||
"scheduleBody": "Every week, every 3 months, or a month after you actually did it. Finishing late doesn't throw the rest of the year off.",
|
||
"circleTitle": "Everyone gets a turn, No more arguing",
|
||
"circleBody": "Rotate in the order you pick, or at random. Donetick remembers who went last, so turns stay fair.",
|
||
"remindersTitle": "A nudge right when it matters & Widgets!",
|
||
"remindersBody": "Get a reminder before something's due, or send a heads-up when someone forgets theirs. Today's list sits on your home screen too."
|
||
},
|
||
"carousel": {
|
||
"skip": "Skip",
|
||
"ariaLabel": "What you can do with Donetick",
|
||
"goToStep": "Go to step {{number}}",
|
||
"slidePosition": "{{index}} of {{total}}",
|
||
"turnOnReminders": "Turn on reminders",
|
||
"notNow": "Not now",
|
||
"next": "Next"
|
||
},
|
||
"heardAbout": {
|
||
"title": "Where'd you hear about Donetick?",
|
||
"subtitle": "Helps us know what's working. Totally optional.",
|
||
"detailPlaceholder": "Tell us where",
|
||
"continue": "Continue",
|
||
"skip": "Skip",
|
||
"sources": {
|
||
"appStore": "App Store / Google Play",
|
||
"reddit": "Reddit or a forum",
|
||
"friend": "Friend or family",
|
||
"video": "YouTube or TikTok",
|
||
"search": "Search engine",
|
||
"other": "Something else"
|
||
}
|
||
},
|
||
"privacy": {
|
||
"title": "Help us improve Donetick",
|
||
"subtitle": "Your server, your data. Both of these are off from this point unless you turn them on.",
|
||
"crashReportsLabel": "Share crash reports",
|
||
"crashReportsDescription": "When Donetick crashes, send us the error and what led to it (device, app version, the screen you were on) no task content. It's how we catch bugs that never show up in our own testing and ship fixes faster.",
|
||
"analyticsLabel": "Share anonymous usage analytics",
|
||
"analyticsDescription": "Send anonymous usage events which features get used, which get ignored so we know what to build next instead of guessing. No task content, no personal data, nothing tied back to you."
|
||
}
|
||
},
|
||
"errorReport": {
|
||
"titleBug": "Report an issue",
|
||
"titleCrash": "Report this problem",
|
||
"subtitleBug": "Tell us what went wrong and we’ll attach the technical details for you.",
|
||
"subtitleCrash": "A sentence about what you were doing turns this into something we can actually fix.",
|
||
"labelBug": "What went wrong?",
|
||
"labelCrash": "What were you doing?",
|
||
"placeholderBug": "e.g. Completing a chore from the list doesn’t update the due date",
|
||
"placeholderCrash": "e.g. I tapped a chore in My Chores and the screen went blank",
|
||
"email": "Email",
|
||
"emailOptional": "(optional — only if you want a reply)",
|
||
"emailPlaceholder": "you@example.com",
|
||
"showWhatGetsSent": "Show what gets sent",
|
||
"hideWhatGetsSent": "Hide what gets sent",
|
||
"copyDiagnostics": "Copy diagnostics",
|
||
"collecting": "Collecting diagnostics…",
|
||
"privacyNote": "No chore names, notes or attachments are included.",
|
||
"send": "Send report",
|
||
"cancel": "Cancel",
|
||
"notNow": "Not now",
|
||
"sentTitle": "Report sent",
|
||
"sentBody": "Thanks! this goes straight to the people who can fix it.",
|
||
"reference": "Reference",
|
||
"copyReference": "Copy reference",
|
||
"done": "Done",
|
||
"githubTitle": "Finish on GitHub",
|
||
"githubBody": "Nothing has been sent. We've filled in an issue with your notes and the diagnostics — review it and post when you're happy with it.",
|
||
"openIssue": "Open pre-filled issue",
|
||
"copied": "Copied",
|
||
"copyInstead": "Copy details instead",
|
||
"close": "Close"
|
||
},
|
||
"circleSetup": {
|
||
"inviteTitle": "Bring your squad in",
|
||
"inviteSubtitle": "Everyone who joins your Circle sees the same chores, takes their own turn, and stays in sync automatically.",
|
||
"joinTitle": "Join a circle",
|
||
"joinSubtitle": "Enter the code you were given and we'll send a request to join — the circle owner just needs to approve it.",
|
||
"loadingCode": "Loading…",
|
||
"copyCodeAria": "Copy circle code",
|
||
"copyLinkInstead": "Copy invite link instead",
|
||
"continue": "Continue",
|
||
"joinInstead": "Join an existing circle instead",
|
||
"codePlaceholder": "Enter code",
|
||
"joinButton": "Join Circle",
|
||
"back": "Back",
|
||
"codeCopied": "Code copied to clipboard",
|
||
"linkCopied": "Link copied to clipboard",
|
||
"requestSentTitle": "Request Sent",
|
||
"requestSentBody": "Your join request has been sent! The circle owner will need to approve it before you can see their chores. You'll get a notification once you're in.",
|
||
"alreadyMember": "You are already a member of this circle",
|
||
"joinFailed": "Failed to join circle"
|
||
},
|
||
"joinCircle": {
|
||
"title": "You're invited to join a circle",
|
||
"incompleteTitle": "Invite link is incomplete",
|
||
"incompleteSubtitle": "This invite link is missing a code. Ask the person who invited you to send a new link.",
|
||
"goToDonetick": "Go to Donetick",
|
||
"signedOutSubtitle": "Sign in or create a Donetick account to continue. We'll send your join request once you're signed in.",
|
||
"signIn": "Sign in",
|
||
"createAccount": "Create an account",
|
||
"sendingTitle": "Sending your request",
|
||
"sendingSubtitle": "Sending your request…",
|
||
"greetingSubtitle": "Hi {{name}}. Send a request to share this circle's chores with its members.",
|
||
"adminReviewNote": "A circle admin will review your request before you get access.",
|
||
"sendRequest": "Send join request",
|
||
"requestSentTitle": "Request sent",
|
||
"requestSentBody": "Your request has been sent. A circle admin will need to approve it before you can access the circle and its chores. We'll notify you when it's approved.",
|
||
"gotIt": "Got it",
|
||
"alreadyMember": "You are already a member of this circle",
|
||
"joinFailed": "Failed to join circle",
|
||
"requestError": "Could not send your join request. Please try again."
|
||
}
|
||
}
|