Part of #145. Fourteen files across seven feature areas that had no namespace yet: the things create/edit modals and their history, the chore history detail and edit modals, the activity feed, the points view and its redemption modal, the project view with its selector and icon picker, the label view, the advanced filter builder and the timer edit modal. Seven new namespaces registered in `src/i18n/config.js` in one change rather than one per PR, so the `ns:` array is touched once and my other extraction PRs cannot conflict with this one. Namespaces stay feature-scoped as described in #145; if you'd rather fold any of these into `common` or `chores`, say which and I'll rework it. Dictionaries: `history` 57 keys, `points` 50, `timer` 25, `projects` 16, `things` 14, `filters` 13, `labels` 5. English only — no translations, no behaviour change. Every t() value is checked against this branch's base: the string must appear character-for-character in the code it replaces (226 call sites). Three values in `UserPoints` are matched loosely and worth naming. The base builds the leaderboard heading and subtitle around a ternary — `{mode === 'points' ? 'Points' : 'Tasks'} Leaderboard` and `Rankings based on {…} during the selected time period` — so neither full sentence exists contiguously in the source. Each key holds exactly what one branch renders. The sentences are kept whole rather than split around the ternary, since a sentence assembled from fragments cannot be reordered by a translator.
90 lines
2.2 KiB
JSON
90 lines
2.2 KiB
JSON
{
|
|
"edit": {
|
|
"title": "Edit History",
|
|
"completedDate": "Completed Date",
|
|
"note": "Note",
|
|
"additionalNotes": "Additional Notes",
|
|
"deleteTitle": "Delete History",
|
|
"deleteMessage": "Are you sure you want to delete this history?"
|
|
},
|
|
"status": {
|
|
"inProgress": "In Progress",
|
|
"completed": "Completed",
|
|
"skipped": "Skipped",
|
|
"pendingApproval": "Pending Approval",
|
|
"rejected": "Rejected",
|
|
"missed": "Missed",
|
|
"rescheduled": "Rescheduled",
|
|
"scheduled": "Scheduled"
|
|
},
|
|
"badge": {
|
|
"onTime": "On Time",
|
|
"onTimeLabel": "On time"
|
|
},
|
|
"detail": {
|
|
"title": "Activity Detail",
|
|
"openTask": "Open Task",
|
|
"editEntry": "Edit Entry",
|
|
"performedBy": "Performed by",
|
|
"assignedTo": "Assigned to",
|
|
"lastUpdated": "Last updated",
|
|
"duration": "Duration",
|
|
"pointsEarned": "Points earned",
|
|
"points_one": "{{count}} pt",
|
|
"points_other": "{{count}} pts",
|
|
"note": "Note"
|
|
},
|
|
"charts": {
|
|
"noData": "No data available",
|
|
"noLabels": "No Labels",
|
|
"unassigned": "Unassigned",
|
|
"unknownTask": "Unknown Task",
|
|
"late": "Late",
|
|
"status": {
|
|
"title": "Status",
|
|
"description": "Completed tasks status"
|
|
},
|
|
"due": {
|
|
"title": "Due Date",
|
|
"description": "Current tasks due date"
|
|
},
|
|
"priority": {
|
|
"title": "Priority",
|
|
"description": "Tasks by priority"
|
|
},
|
|
"labels": {
|
|
"title": "Labels",
|
|
"description": "Tasks by labels"
|
|
},
|
|
"labelsDuration": {
|
|
"title": "Labels (time)",
|
|
"description": "Time spent by labels (hours)"
|
|
},
|
|
"tasksTime": {
|
|
"title": "Tasks (time)",
|
|
"description": "Time spent by individual tasks (hours)"
|
|
},
|
|
"assigneeBreakdown": {
|
|
"title": "by Assignee",
|
|
"description": "Tasks grouped by assignee"
|
|
}
|
|
},
|
|
"filter": {
|
|
"status": "Status",
|
|
"pending": "Pending",
|
|
"labels": "Labels",
|
|
"hasNotes": "Has Notes",
|
|
"hasPoints": "Has Points",
|
|
"timePeriod": "Time Period",
|
|
"user": "User"
|
|
},
|
|
"period": {
|
|
"days_one": "{{count}} Day",
|
|
"days_other": "{{count}} Days",
|
|
"allTime": "All Time"
|
|
},
|
|
"activities": {
|
|
"title": "Activities"
|
|
}
|
|
}
|