- {t('dashboard.profile.joined', undefined, 'Joined')}
+ {t('common.joined', undefined, 'Joined')}
{createdAt ? formatDate(createdAt) : '—'}
diff --git a/src/components/Pages/ErrorBoundary/RouteErrorBoundary.tsx b/src/components/Pages/ErrorBoundary/RouteErrorBoundary.tsx
index c85c21fd3..780a3dd7f 100644
--- a/src/components/Pages/ErrorBoundary/RouteErrorBoundary.tsx
+++ b/src/components/Pages/ErrorBoundary/RouteErrorBoundary.tsx
@@ -197,7 +197,7 @@ const GenericError = ({ error, reset }: { error: Error; reset?: () => void }) =>
-
- {t('exploreChallenges.challengeList.actionMenu.openMenu', undefined, 'Open menu')}
-
+ {t('common.openMenu', undefined, 'Open menu')}
@@ -37,11 +35,7 @@ export const ChallengeActionMenu = memo(({ challenge }: { challenge: Challenge }
className="flex cursor-pointer items-center gap-2"
>
- {t(
- 'exploreChallenges.challengeList.actionMenu.startChallenge',
- undefined,
- 'Start challenge'
- )}
+ {t('common.startChallenge', undefined, 'Start challenge')}
)}
@@ -52,11 +46,7 @@ export const ChallengeActionMenu = memo(({ challenge }: { challenge: Challenge }
className="flex cursor-pointer items-center gap-2"
>
- {t(
- 'exploreChallenges.challengeList.actionMenu.viewChallenge',
- undefined,
- 'View challenge'
- )}
+ {t('common.viewChallenge', undefined, 'View challenge')}
- {t('exploreChallenges.challengeList.actionMenu.copyUrl', undefined, 'Copy URL')}
+ {t('common.copyUrl', undefined, 'Copy URL')}
diff --git a/src/components/Pages/ExploreChallengesPage/ChallengeList/ChallengesTableView.tsx b/src/components/Pages/ExploreChallengesPage/ChallengeList/ChallengesTableView.tsx
index 398cbdf5e..afaac028a 100644
--- a/src/components/Pages/ExploreChallengesPage/ChallengeList/ChallengesTableView.tsx
+++ b/src/components/Pages/ExploreChallengesPage/ChallengeList/ChallengesTableView.tsx
@@ -23,9 +23,7 @@ export const ChallengesTableView = () => {
-
- {t('exploreChallenges.challengeList.table.name', undefined, 'Name')}
-
+ {t('common.name', undefined, 'Name')}
{t('exploreChallenges.challengeList.table.author', undefined, 'Author')}
@@ -50,14 +48,12 @@ export const ChallengesTableView = () => {
{t('exploreChallenges.challengeList.table.contributors', undefined, 'Contributors')}
- {t('exploreChallenges.challengeList.table.priority', undefined, 'Priority')}
-
-
- {t('exploreChallenges.challengeList.table.difficulty', undefined, 'Difficulty')}
+ {t('common.priority', undefined, 'Priority')}
- {t('exploreChallenges.challengeList.table.status', undefined, 'Status')}
+ {t('common.difficulty', undefined, 'Difficulty')}
+ {t('common.status', undefined, 'Status')}
{t('exploreChallenges.challengeList.table.location', undefined, 'Location')}
diff --git a/src/components/Pages/ExploreChallengesPage/ChallengeList/ListFooter.tsx b/src/components/Pages/ExploreChallengesPage/ChallengeList/ListFooter.tsx
index 10dcc0271..ef919d594 100644
--- a/src/components/Pages/ExploreChallengesPage/ChallengeList/ListFooter.tsx
+++ b/src/components/Pages/ExploreChallengesPage/ChallengeList/ListFooter.tsx
@@ -20,10 +20,10 @@ export const ListFooter = () => {
{isFetchingNextPage ? (
<>
- {t('exploreChallenges.challengeList.footer.loading', undefined, 'Loading...')}
+ {t('common.loading2', undefined, 'Loading...')}
>
) : (
- t('exploreChallenges.challengeList.footer.loadMore', undefined, 'Load More')
+ t('common.loadMore', undefined, 'Load More')
)}
@@ -35,11 +35,7 @@ export const ListFooter = () => {
- {t(
- 'exploreChallenges.challengeList.footer.endOfList',
- undefined,
- "You've reached the end of the list"
- )}
+ {t('common.youveReachedTheEndOfTheList', undefined, "You've reached the end of the list")}
{t(
diff --git a/src/components/Pages/ExploreChallengesPage/ChallengeList/index.tsx b/src/components/Pages/ExploreChallengesPage/ChallengeList/index.tsx
index ce4d816bf..e135316fd 100644
--- a/src/components/Pages/ExploreChallengesPage/ChallengeList/index.tsx
+++ b/src/components/Pages/ExploreChallengesPage/ChallengeList/index.tsx
@@ -25,9 +25,7 @@ export const ChallengeList = () => {
isLoadingState ? 'opacity-100' : 'pointer-events-none opacity-0'
)}
>
-
+
{showErrorState ? (
@@ -47,7 +45,7 @@ export const ChallengeList = () => {
{error?.message ||
t(
- 'exploreChallenges.challengeList.errorDescription',
+ 'common.unexpectedErrorTryAgain',
undefined,
'An unexpected error occurred. Please try again.'
)}
@@ -60,7 +58,7 @@ export const ChallengeList = () => {
- {t('exploreChallenges.challengeList.emptyTitle', undefined, 'No challenges found')}
+ {t('common.noChallengesFound', undefined, 'No challenges found')}
{t(
diff --git a/src/components/Pages/ExploreChallengesPage/ExploreChallengesResults.tsx b/src/components/Pages/ExploreChallengesPage/ExploreChallengesResults.tsx
index de045a32a..70cf1de05 100644
--- a/src/components/Pages/ExploreChallengesPage/ExploreChallengesResults.tsx
+++ b/src/components/Pages/ExploreChallengesPage/ExploreChallengesResults.tsx
@@ -31,7 +31,7 @@ export const ExploreChallengesResults = () => {
- {t('exploreChallenges.results.tabMap', undefined, 'Map')}
+ {t('common.map', undefined, 'Map')}
diff --git a/src/components/Pages/ExploreChallengesPage/FilterBar/DifficultyFilter.tsx b/src/components/Pages/ExploreChallengesPage/FilterBar/DifficultyFilter.tsx
index 6333b8fc4..3330afb35 100644
--- a/src/components/Pages/ExploreChallengesPage/FilterBar/DifficultyFilter.tsx
+++ b/src/components/Pages/ExploreChallengesPage/FilterBar/DifficultyFilter.tsx
@@ -16,7 +16,7 @@ export const DifficultyFilter = () => {
return (
- {t('exploreChallenges.filterBar.difficulty.label', undefined, 'Difficulty')}
+ {t('common.difficulty', undefined, 'Difficulty')}
setDifficulty(value as DifficultyLevel)}>
@@ -26,15 +26,9 @@ export const DifficultyFilter = () => {
{t('exploreChallenges.filterBar.difficulty.any', undefined, 'Any')}
-
- {t('exploreChallenges.filterBar.difficulty.easy', undefined, 'Easy')}
-
-
- {t('exploreChallenges.filterBar.difficulty.normal', undefined, 'Normal')}
-
-
- {t('exploreChallenges.filterBar.difficulty.expert', undefined, 'Expert')}
-
+ {t('common.easy', undefined, 'Easy')}
+ {t('common.normal', undefined, 'Normal')}
+ {t('common.expert', undefined, 'Expert')}
diff --git a/src/components/Pages/ExploreChallengesPage/FilterBar/SortByFilter.tsx b/src/components/Pages/ExploreChallengesPage/FilterBar/SortByFilter.tsx
index 9a14b3c6b..32d76fac5 100644
--- a/src/components/Pages/ExploreChallengesPage/FilterBar/SortByFilter.tsx
+++ b/src/components/Pages/ExploreChallengesPage/FilterBar/SortByFilter.tsx
@@ -26,20 +26,14 @@ export const SortByFilter = () => {
-
- {t('exploreChallenges.filterBar.sortBy.name', undefined, 'Name')}
-
-
- {t('exploreChallenges.filterBar.sortBy.newest', undefined, 'Newest')}
-
+ {t('common.name', undefined, 'Name')}
+ {t('common.newest', undefined, 'Newest')}
{t('exploreChallenges.filterBar.sortBy.oldest', undefined, 'Oldest')}
-
- {t('exploreChallenges.filterBar.sortBy.popular', undefined, 'Popular')}
-
+ {t('common.popular', undefined, 'Popular')}
- {t('exploreChallenges.filterBar.sortBy.difficulty', undefined, 'Difficulty')}
+ {t('common.difficulty', undefined, 'Difficulty')}
diff --git a/src/components/Pages/ExploreChallengesPage/FilterBar/ViewModeToggle.tsx b/src/components/Pages/ExploreChallengesPage/FilterBar/ViewModeToggle.tsx
index b0392435e..dcb749c7c 100644
--- a/src/components/Pages/ExploreChallengesPage/FilterBar/ViewModeToggle.tsx
+++ b/src/components/Pages/ExploreChallengesPage/FilterBar/ViewModeToggle.tsx
@@ -28,7 +28,7 @@ export const ViewModeToggle = () => {
@@ -36,7 +36,7 @@ export const ViewModeToggle = () => {
diff --git a/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeRecentActivity.tsx b/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeRecentActivity.tsx
index 91b5fc4c4..f78f21230 100644
--- a/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeRecentActivity.tsx
+++ b/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeRecentActivity.tsx
@@ -26,7 +26,7 @@ const statusLabel = (status: number, statusName: string, t: ReturnType
- {t('manageChallengeDetail.recentActivity.title', undefined, 'Recent Activity')}
+ {t('common.recentActivity', undefined, 'Recent Activity')}
{t(
diff --git a/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeTasksExplorer.tsx b/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeTasksExplorer.tsx
index 31f89a988..dfe69db57 100644
--- a/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeTasksExplorer.tsx
+++ b/src/components/Pages/ManagementPages/ManageChallengeDetail/ChallengeTasksExplorer.tsx
@@ -283,7 +283,7 @@ const ChallengeTasksExplorerControls = ({ countLabel }: { countLabel: string })
)}
>
- {t('manageChallengeDetail.tasksExplorer.statusLabel', undefined, 'Status')}
+ {t('common.status', undefined, 'Status')}
{statusDirty ? ' •' : ''}
@@ -323,16 +323,14 @@ const ChallengeTasksExplorerControls = ({ countLabel }: { countLabel: string })
)}
>
- {t('manageChallengeDetail.tasksExplorer.priorityLabel', undefined, 'Priority')}
+ {t('common.priority', undefined, 'Priority')}
{priorityDirty ? ' •' : ''}
-
- {t('manageChallengeDetail.tasksExplorer.priorityLabel', undefined, 'Priority')}
-
+ {t('common.priority', undefined, 'Priority')}
{DEFAULT_PRIORITY_FILTER.map((p) => (
- {t('manageChallengeDetail.tasksExplorer.clearButton', undefined, 'Clear')}
+ {t('common.clear', undefined, 'Clear')}
@@ -488,8 +486,7 @@ export const ChallengeTasksExplorerMain = () => {
const visibleMarkers = filteredMarkers.slice(0, visibleCount)
const statusLabel = (s: number) =>
- TASK_STATUS_LABELS[s] ??
- t('manageChallengeDetail.tasksExplorer.statusFallback', { status: s }, 'Status {status}')
+ TASK_STATUS_LABELS[s] ?? t('common.statusWithStatus', { status: s }, 'Status {status}')
const priorityLabel = (p: number) =>
TASK_PRIORITY_LABEL_IDS[p]
? t(TASK_PRIORITY_LABEL_IDS[p], undefined, TASK_PRIORITY_LABELS[p])
@@ -555,24 +552,18 @@ export const ChallengeTasksExplorerMain = () => {
-
- {t('manageChallengeDetail.tasksExplorer.columnId', undefined, 'ID')}
-
+ {t('common.id', undefined, 'ID')}
- {t('manageChallengeDetail.tasksExplorer.columnStatus', undefined, 'Status')}
+ {t('common.status', undefined, 'Status')}
- {t(
- 'manageChallengeDetail.tasksExplorer.columnPriority',
- undefined,
- 'Priority'
- )}
+ {t('common.priority', undefined, 'Priority')}
{t('manageChallengeDetail.tasksExplorer.columnBundle', undefined, 'Bundle')}
- {t('manageChallengeDetail.tasksExplorer.columnActions', undefined, 'Actions')}
+ {t('common.actions', undefined, 'Actions')}
@@ -643,11 +634,7 @@ export const ChallengeTasksExplorerMain = () => {
to="/manage/task/$taskId"
params={{ taskId: String(marker.id) }}
>
- {t(
- 'manageChallengeDetail.tasksExplorer.viewTask',
- undefined,
- 'View'
- )}
+ {t('common.view', undefined, 'View')}
@@ -679,11 +666,7 @@ export const ChallengeTasksExplorerMain = () => {
type="button"
onClick={scrollToTop}
className="fixed right-6 bottom-6 z-30 flex h-10 w-10 items-center justify-center rounded-full bg-zinc-800 text-white shadow-xl transition-opacity hover:bg-zinc-700 dark:bg-slate-200 dark:text-zinc-900 dark:hover:bg-slate-300"
- aria-label={t(
- 'manageChallengeDetail.tasksExplorer.scrollToTopLabel',
- undefined,
- 'Scroll to top'
- )}
+ aria-label={t('common.scrollToTop', undefined, 'Scroll to top')}
>
diff --git a/src/components/Pages/ManagementPages/ManageChallengeDetail/ManageChallengeDetailContent.tsx b/src/components/Pages/ManagementPages/ManageChallengeDetail/ManageChallengeDetailContent.tsx
index b62591dfd..217e376da 100644
--- a/src/components/Pages/ManagementPages/ManageChallengeDetail/ManageChallengeDetailContent.tsx
+++ b/src/components/Pages/ManagementPages/ManageChallengeDetail/ManageChallengeDetailContent.tsx
@@ -136,11 +136,7 @@ const StatisticsDialogContent = ({
- {t(
- 'manageChallengeDetail.detail.statistics.tasksRemaining',
- undefined,
- 'Tasks remaining'
- )}
+ {t('common.tasksRemaining', undefined, 'Tasks remaining')}
{tasksRemaining}
@@ -161,7 +157,7 @@ const StatisticsDialogContent = ({
- {t('manageChallengeDetail.detail.statistics.created', undefined, 'Created')}
+ {t('common.created', undefined, 'Created')}
{challengeData?.created ? formatDate(new Date(challengeData.created)) : '—'}
@@ -198,9 +194,7 @@ const StatisticsDialogContent = ({
))}
-
- {t('manageChallengeDetail.detail.statistics.total', undefined, 'Total')}
-
+ {t('common.total', undefined, 'Total')}
{stats.total || 0}
@@ -232,20 +226,16 @@ export const ManageChallengeDetailContent = () => {
projectId != null
? [
{
- label: t('managementPages.layout.breadcrumbRoot', undefined, 'create & manage'),
+ label: t('common.createManage', undefined, 'create & manage'),
href: '/manage',
},
{
- label: t('manageChallengeDetail.detail.breadcrumbProjects', undefined, 'projects'),
+ label: t('common.projects2', undefined, 'projects'),
href: '/manage/projects',
},
{ label: String(projectId), href: `/manage/project/${projectId}` },
{
- label: t(
- 'manageChallengeDetail.detail.breadcrumbChallenges',
- undefined,
- 'challenges'
- ),
+ label: t('common.challenges2', undefined, 'challenges'),
href: '/manage/challenges',
},
{ label: challengeId, href: `/manage/challenge/${challengeId}` },
@@ -266,7 +256,7 @@ export const ManageChallengeDetailContent = () => {
- {t('manageChallengeDetail.detail.featuredBadge', undefined, 'Featured')}
+ {t('common.featured', undefined, 'Featured')}
@@ -281,7 +271,7 @@ export const ManageChallengeDetailContent = () => {
•
- {t('manageChallengeDetail.detail.idLabel', { id: challengeId }, 'ID {id}')}
+ {t('common.idNumber', { id: challengeId }, 'ID {id}')}
•
{
id={challengeData.id}
enabled={challengeData.enabled}
onToggle={toggleField('enabled')}
- label={t('manageChallengeDetail.detail.enabledLabel', undefined, 'Enabled')}
+ label={t('common.enabled', undefined, 'Enabled')}
errorMessage={t(
- 'manageChallengeDetail.detail.enabledError',
+ 'common.couldNotUpdateVisibility',
undefined,
'Could not update visibility'
)}
@@ -312,7 +302,7 @@ export const ManageChallengeDetailContent = () => {
id={challengeData.id}
enabled={challengeData.paused}
onToggle={toggleField('paused')}
- label={t('manageChallengeDetail.detail.pausedLabel', undefined, 'Paused')}
+ label={t('common.paused', undefined, 'Paused')}
errorMessage={t(
'manageChallengeDetail.detail.pausedError',
undefined,
@@ -324,7 +314,7 @@ export const ManageChallengeDetailContent = () => {
id={challengeData.id}
enabled={challengeData.featured}
onToggle={toggleField('featured')}
- label={t('manageChallengeDetail.detail.featuredLabel', undefined, 'Featured')}
+ label={t('common.featured', undefined, 'Featured')}
errorMessage={t(
'manageChallengeDetail.detail.featuredError',
undefined,
@@ -353,11 +343,7 @@ export const ManageChallengeDetailContent = () => {
className="w-full justify-start gap-2 rounded-full"
>
- {t(
- 'manageChallengeDetail.detail.browseChallenge',
- undefined,
- 'Browse challenge'
- )}
+ {t('common.browseChallenge', undefined, 'Browse challenge')}
{
>
- {t('manageChallengeDetail.detail.editChallenge', undefined, 'Edit challenge')}
+ {t('common.editChallenge', undefined, 'Edit challenge')}
{
onClick={() => setRebuildOpen(true)}
>
- {t('manageChallengeDetail.detail.rebuildTasks', undefined, 'Rebuild tasks')}
+ {t('common.rebuildTasks', undefined, 'Rebuild tasks')}
)}
@@ -415,16 +401,8 @@ export const ManageChallengeDetailContent = () => {
{!isLoadingChallenge && challengeData?.id && (
}
- label={t(
- 'manageChallengeDetail.detail.recentActivityLabel',
- undefined,
- 'Recent Activity'
- )}
- title={t(
- 'manageChallengeDetail.detail.recentActivityLabel',
- undefined,
- 'Recent Activity'
- )}
+ label={t('common.recentActivity', undefined, 'Recent Activity')}
+ title={t('common.recentActivity', undefined, 'Recent Activity')}
>
@@ -435,16 +413,8 @@ export const ManageChallengeDetailContent = () => {
challengeData.description !== challengeData.blurb && (
}
- label={t(
- 'manageChallengeDetail.detail.descriptionLabel',
- undefined,
- 'Description'
- )}
- title={t(
- 'manageChallengeDetail.detail.descriptionLabel',
- undefined,
- 'Description'
- )}
+ label={t('common.description', undefined, 'Description')}
+ title={t('common.description', undefined, 'Description')}
>
{challengeData.description}
@@ -455,16 +425,8 @@ export const ManageChallengeDetailContent = () => {
{!isLoadingChallenge && challengeData?.instruction && (
}
- label={t(
- 'manageChallengeDetail.detail.instructionsLabel',
- undefined,
- 'Instructions'
- )}
- title={t(
- 'manageChallengeDetail.detail.instructionsLabel',
- undefined,
- 'Instructions'
- )}
+ label={t('common.instructions', undefined, 'Instructions')}
+ title={t('common.instructions', undefined, 'Instructions')}
>
{challengeData.instruction}
diff --git a/src/components/Pages/ManagementPages/ManageChallengeNew/ChallengeForm.tsx b/src/components/Pages/ManagementPages/ManageChallengeNew/ChallengeForm.tsx
index 776372207..4d8cf110d 100644
--- a/src/components/Pages/ManagementPages/ManageChallengeNew/ChallengeForm.tsx
+++ b/src/components/Pages/ManagementPages/ManageChallengeNew/ChallengeForm.tsx
@@ -44,14 +44,7 @@ const makeBaseChallengeFormSchema = (t: T) =>
z.object({
projectId: z
.number()
- .min(
- 1,
- t(
- 'manageChallengeNew.challengeForm.validation.projectRequired',
- undefined,
- 'Please select a project'
- )
- ),
+ .min(1, t('common.pleaseSelectAProject', undefined, 'Please select a project')),
name: z
.string()
.min(
@@ -198,18 +191,12 @@ const ProjectPickerField = ({ value, onChange, open, onOpenChange }: ProjectPick
const label = selectedProject
? `${selectedProject.id} - ${selectedProject.displayName || selectedProject.name}`
: value > 0
- ? t('manageChallengeNew.challengeForm.projectPicker.numbered', { id: value }, 'Project #{id}')
- : t(
- 'manageChallengeNew.challengeForm.projectPicker.placeholder',
- undefined,
- 'Select a project'
- )
+ ? t('common.projectWithId', { id: value }, 'Project #{id}')
+ : t('common.selectAProject', undefined, 'Select a project')
return (
-
- {t('manageChallengeNew.challengeForm.projectPicker.label', undefined, 'Project')}
-
+ {t('common.project', undefined, 'Project')}
{
name="name"
render={({ field }) => (
-
- {t('manageChallengeNew.challengeForm.nameLabel', undefined, 'Name')}
-
+ {t('common.name', undefined, 'Name')}
{
name="description"
render={({ field }) => (
-
- {t('manageChallengeNew.challengeForm.descriptionLabel', undefined, 'Description')}
-
+ {t('common.description', undefined, 'Description')}
@@ -363,7 +349,7 @@ export const ManageChallengesContent = () => {
size="icon"
className="h-9 w-9 shrink-0"
onClick={() => setShowPanel(true)}
- title={t('manageChallenges.content.showPanel', undefined, 'Show panel')}
+ title={t('common.showPanel', undefined, 'Show panel')}
>
@@ -371,27 +357,23 @@ export const ManageChallengesContent = () => {
{
getItemKey={(challenge) => challenge.id ?? crypto.randomUUID()}
emptyState={{
icon: ListChecks,
- title: t(
- 'manageChallenges.content.emptyTitle',
- undefined,
- 'No challenges found'
- ),
+ title: t('common.noChallengesFound', undefined, 'No challenges found'),
description: t(
'manageChallenges.content.emptyDescription',
undefined,
"You haven't created any challenges yet"
),
- actionLabel: t(
- 'manageChallenges.content.createChallenge',
- undefined,
- 'Create Challenge'
- ),
+ actionLabel: t('common.createChallenge', undefined, 'Create Challenge'),
actionTo: '/manage/challenge/new',
}}
/>
@@ -460,11 +434,11 @@ export const ManageChallengesContent = () => {
- {t('manageChallenges.content.deleteChallengeTitle', undefined, 'Delete challenge?')}
+ {t('common.deleteChallenge2', undefined, 'Delete challenge?')}
{t(
- 'manageChallenges.content.deleteChallengeDescription',
+ 'common.deleteChallengeWarning',
undefined,
'This will delete this challenge and all its tasks. This action cannot be undone.'
)}
diff --git a/src/components/Pages/ManagementPages/ManageHome/index.tsx b/src/components/Pages/ManagementPages/ManageHome/index.tsx
index 54ce522f6..ac004640e 100644
--- a/src/components/Pages/ManagementPages/ManageHome/index.tsx
+++ b/src/components/Pages/ManagementPages/ManageHome/index.tsx
@@ -20,7 +20,7 @@ export const ManageHome = () => {
- {t('manageHome.projectsTitle', undefined, 'Projects')}
+ {t('common.projects', undefined, 'Projects')}
{t(
'manageHome.projectsDescription',
@@ -31,7 +31,7 @@ export const ManageHome = () => {
- {t('manageHome.viewProjects', undefined, 'View Projects')}
+ {t('common.viewProjects', undefined, 'View Projects')}
@@ -43,7 +43,7 @@ export const ManageHome = () => {
- {t('manageHome.challengesTitle', undefined, 'Challenges')}
+ {t('common.challenges', undefined, 'Challenges')}
{t(
'manageHome.challengesDescription',
@@ -54,7 +54,7 @@ export const ManageHome = () => {
- {t('manageHome.viewChallenges', undefined, 'View Challenges')}
+ {t('common.viewChallenges', undefined, 'View Challenges')}
@@ -67,7 +67,7 @@ export const ManageHome = () => {
- {t('manageHome.tasksTitle', undefined, 'Tasks')}
+ {t('common.tasks', undefined, 'Tasks')}
{t(
'manageHome.tasksDescription',
@@ -78,7 +78,7 @@ export const ManageHome = () => {
- {t('manageHome.openTaskById', undefined, 'Open task by ID')}
+ {t('common.openTaskById', undefined, 'Open task by ID')}
diff --git a/src/components/Pages/ManagementPages/ManageProjectDetail/ChallengesTableView.tsx b/src/components/Pages/ManagementPages/ManageProjectDetail/ChallengesTableView.tsx
index 8bcdfca8e..74b8b1987 100644
--- a/src/components/Pages/ManagementPages/ManageProjectDetail/ChallengesTableView.tsx
+++ b/src/components/Pages/ManagementPages/ManageProjectDetail/ChallengesTableView.tsx
@@ -63,34 +63,27 @@ export const ChallengesTableView = ({
-
- {t('manageProjectDetail.challengesTable.columnStatus', undefined, 'Status')}
-
+ {t('common.status', undefined, 'Status')}
-
+
-
- {t('manageProjectDetail.challengesTable.columnName', undefined, 'Name')}
-
+ {t('common.name', undefined, 'Name')}
- {t('manageProjectDetail.challengesTable.columnId', undefined, 'ID')}
+ {t('common.id', undefined, 'ID')}
- {t('manageProjectDetail.challengesTable.columnDifficulty', undefined, 'Difficulty')}
+ {t('common.difficulty', undefined, 'Difficulty')}
{t('manageProjectDetail.challengesTable.columnTasksLeft', undefined, 'Tasks Left')}
- {t('manageProjectDetail.challengesTable.columnDescription', undefined, 'Description')}
+ {t('common.description', undefined, 'Description')}
- {t('manageProjectDetail.challengesTable.columnActions', undefined, 'Actions')}
+ {t('common.actions', undefined, 'Actions')}
@@ -112,29 +105,13 @@ export const ChallengesTableView = ({
onClick={() => onTogglePin(challenge.id)}
title={
pinned
- ? t(
- 'manageProjectDetail.challengesTable.unpinChallenge',
- undefined,
- 'Unpin challenge'
- )
- : t(
- 'manageProjectDetail.challengesTable.pinChallenge',
- undefined,
- 'Pin challenge'
- )
+ ? t('common.unpinChallenge', undefined, 'Unpin challenge')
+ : t('common.pinChallenge', undefined, 'Pin challenge')
}
aria-label={
pinned
- ? t(
- 'manageProjectDetail.challengesTable.unpinChallenge',
- undefined,
- 'Unpin challenge'
- )
- : t(
- 'manageProjectDetail.challengesTable.pinChallenge',
- undefined,
- 'Pin challenge'
- )
+ ? t('common.unpinChallenge', undefined, 'Unpin challenge')
+ : t('common.pinChallenge', undefined, 'Pin challenge')
}
>
onToggleEnabled(challenge)}
title={
challenge.enabled
- ? t(
- 'manageProjectDetail.challengesTable.makeNotDiscoverable',
- undefined,
- 'Make not discoverable'
- )
- : t(
- 'manageProjectDetail.challengesTable.makeDiscoverable',
- undefined,
- 'Make discoverable'
- )
+ ? t('common.makeNotDiscoverable', undefined, 'Make not discoverable')
+ : t('common.makeDiscoverable', undefined, 'Make discoverable')
}
aria-label={
challenge.enabled
- ? t(
- 'manageProjectDetail.challengesTable.makeNotDiscoverable',
- undefined,
- 'Make not discoverable'
- )
- : t(
- 'manageProjectDetail.challengesTable.makeDiscoverable',
- undefined,
- 'Make discoverable'
- )
+ ? t('common.makeNotDiscoverable', undefined, 'Make not discoverable')
+ : t('common.makeDiscoverable', undefined, 'Make discoverable')
}
>
{challenge.enabled ? (
@@ -219,11 +180,7 @@ export const ChallengesTableView = ({
- {t(
- 'manageProjectDetail.challengesTable.openMenu',
- undefined,
- 'Open menu'
- )}
+ {t('common.openMenu', undefined, 'Open menu')}
@@ -236,11 +193,7 @@ export const ChallengesTableView = ({
className="flex cursor-pointer items-center gap-2"
>
- {t(
- 'manageProjectDetail.challengesTable.startChallenge',
- undefined,
- 'Start challenge'
- )}
+ {t('common.startChallenge', undefined, 'Start challenge')}
)}
@@ -251,11 +204,7 @@ export const ChallengesTableView = ({
className="flex cursor-pointer items-center gap-2"
>
- {t(
- 'manageProjectDetail.challengesTable.editChallenge',
- undefined,
- 'Edit challenge'
- )}
+ {t('common.editChallenge', undefined, 'Edit challenge')}
- {t(
- 'manageProjectDetail.challengesTable.moveChallenge',
- undefined,
- 'Move challenge'
- )}
+ {t('common.moveChallenge', undefined, 'Move challenge')}
{challenge.id != null && (
- {t(
- 'manageProjectDetail.challengesTable.cloneChallenge',
- undefined,
- 'Clone challenge'
- )}
+ {t('common.cloneChallenge2', undefined, 'Clone challenge')}
)}
{challenge.id != null && (
@@ -292,16 +233,8 @@ export const ChallengesTableView = ({
>
{challenge.isArchived
- ? t(
- 'manageProjectDetail.challengesTable.unarchiveChallenge',
- undefined,
- 'Unarchive challenge'
- )
- : t(
- 'manageProjectDetail.challengesTable.archiveChallenge',
- undefined,
- 'Archive challenge'
- )}
+ ? t('common.unarchiveChallenge', undefined, 'Unarchive challenge')
+ : t('common.archiveChallenge', undefined, 'Archive challenge')}
)}
{challenge.id != null && (
@@ -310,11 +243,7 @@ export const ChallengesTableView = ({
className="flex cursor-pointer items-center gap-2"
>
- {t(
- 'manageProjectDetail.challengesTable.rebuildTasks',
- undefined,
- 'Rebuild tasks'
- )}
+ {t('common.rebuildTasks', undefined, 'Rebuild tasks')}
)}
{challenge.id != null && (
@@ -323,16 +252,8 @@ export const ChallengesTableView = ({
className="flex cursor-pointer items-center gap-2"
>
{challenge.enabled
- ? t(
- 'manageProjectDetail.challengesTable.disableChallenge',
- undefined,
- 'Disable challenge'
- )
- : t(
- 'manageProjectDetail.challengesTable.enableChallenge',
- undefined,
- 'Enable challenge'
- )}
+ ? t('common.disableChallenge', undefined, 'Disable challenge')
+ : t('common.enableChallenge', undefined, 'Enable challenge')}
)}
{challenge.id != null && (
@@ -346,11 +267,7 @@ export const ChallengesTableView = ({
)}
>
- {t(
- 'manageProjectDetail.challengesTable.deleteChallenge',
- undefined,
- 'Delete challenge'
- )}
+ {t('common.deleteChallenge', undefined, 'Delete challenge')}
>
)}
diff --git a/src/components/Pages/ManagementPages/ManageProjectDetail/ManageProjectDetailContent.tsx b/src/components/Pages/ManagementPages/ManageProjectDetail/ManageProjectDetailContent.tsx
index 813b836de..2accd34d4 100644
--- a/src/components/Pages/ManagementPages/ManageProjectDetail/ManageProjectDetailContent.tsx
+++ b/src/components/Pages/ManagementPages/ManageProjectDetail/ManageProjectDetailContent.tsx
@@ -110,13 +110,13 @@ export const ManageProjectDetailContent = () => {
}}
title={
isPinned
- ? t('manageProjectDetail.content.unpinChallenge', undefined, 'Unpin challenge')
- : t('manageProjectDetail.content.pinChallenge', undefined, 'Pin challenge')
+ ? t('common.unpinChallenge', undefined, 'Unpin challenge')
+ : t('common.pinChallenge', undefined, 'Pin challenge')
}
aria-label={
isPinned
- ? t('manageProjectDetail.content.unpinChallenge', undefined, 'Unpin challenge')
- : t('manageProjectDetail.content.pinChallenge', undefined, 'Pin challenge')
+ ? t('common.unpinChallenge', undefined, 'Unpin challenge')
+ : t('common.pinChallenge', undefined, 'Pin challenge')
}
>
{
}}
title={
challenge.enabled
- ? t(
- 'manageProjectDetail.content.makeNotDiscoverable',
- undefined,
- 'Make not discoverable'
- )
- : t('manageProjectDetail.content.makeDiscoverable', undefined, 'Make discoverable')
+ ? t('common.makeNotDiscoverable', undefined, 'Make not discoverable')
+ : t('common.makeDiscoverable', undefined, 'Make discoverable')
}
aria-label={
challenge.enabled
- ? t(
- 'manageProjectDetail.content.makeNotDiscoverable',
- undefined,
- 'Make not discoverable'
- )
- : t('manageProjectDetail.content.makeDiscoverable', undefined, 'Make discoverable')
+ ? t('common.makeNotDiscoverable', undefined, 'Make not discoverable')
+ : t('common.makeDiscoverable', undefined, 'Make discoverable')
}
>
{challenge.enabled ? (
@@ -168,9 +160,7 @@ export const ManageProjectDetailContent = () => {
-
- {t('manageProjectDetail.content.openMenu', undefined, 'Open menu')}
-
+ {t('common.openMenu', undefined, 'Open menu')}
@@ -182,7 +172,7 @@ export const ManageProjectDetailContent = () => {
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjectDetail.content.startChallenge', undefined, 'Start challenge')}
+ {t('common.startChallenge', undefined, 'Start challenge')}
)}
@@ -193,7 +183,7 @@ export const ManageProjectDetailContent = () => {
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjectDetail.content.editChallenge', undefined, 'Edit challenge')}
+ {t('common.editChallenge', undefined, 'Edit challenge')}
{
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjectDetail.content.moveChallenge', undefined, 'Move challenge')}
+ {t('common.moveChallenge', undefined, 'Move challenge')}
{challenge.id != null && (
{
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjectDetail.content.cloneChallenge', undefined, 'Clone challenge')}
+ {t('common.cloneChallenge2', undefined, 'Clone challenge')}
)}
{challenge.id != null && (
@@ -221,16 +211,8 @@ export const ManageProjectDetailContent = () => {
>
{challenge.isArchived
- ? t(
- 'manageProjectDetail.content.unarchiveChallenge',
- undefined,
- 'Unarchive challenge'
- )
- : t(
- 'manageProjectDetail.content.archiveChallenge',
- undefined,
- 'Archive challenge'
- )}
+ ? t('common.unarchiveChallenge', undefined, 'Unarchive challenge')
+ : t('common.archiveChallenge', undefined, 'Archive challenge')}
)}
{challenge.id != null && (
@@ -239,7 +221,7 @@ export const ManageProjectDetailContent = () => {
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjectDetail.content.rebuildTasks', undefined, 'Rebuild tasks')}
+ {t('common.rebuildTasks', undefined, 'Rebuild tasks')}
)}
{challenge.id != null && (
@@ -248,12 +230,8 @@ export const ManageProjectDetailContent = () => {
className="flex cursor-pointer items-center gap-2"
>
{challenge.enabled
- ? t(
- 'manageProjectDetail.content.disableChallenge',
- undefined,
- 'Disable challenge'
- )
- : t('manageProjectDetail.content.enableChallenge', undefined, 'Enable challenge')}
+ ? t('common.disableChallenge', undefined, 'Disable challenge')
+ : t('common.enableChallenge', undefined, 'Enable challenge')}
)}
{challenge.id != null && (
@@ -264,7 +242,7 @@ export const ManageProjectDetailContent = () => {
className="flex cursor-pointer items-center gap-2 text-red-600 focus:text-red-600 dark:text-red-400 dark:focus:text-red-400"
>
- {t('manageProjectDetail.content.deleteChallenge', undefined, 'Delete challenge')}
+ {t('common.deleteChallenge', undefined, 'Delete challenge')}
>
)}
@@ -288,14 +266,14 @@ export const ManageProjectDetailContent = () => {
{project?.featured && (
- {t('manageProjectDetail.content.featuredBadge', undefined, 'Featured')}
+ {t('common.featured', undefined, 'Featured')}
)}
{project?.isArchived && (
- {t('manageProjectDetail.content.archivedBadge', undefined, 'Archived')}
+ {t('common.archived', undefined, 'Archived')}
)}
@@ -313,7 +291,7 @@ export const ManageProjectDetailContent = () => {
•
- {t('manageProjectDetail.content.idLabel', { id: projectId }, 'ID {id}')}
+ {t('common.idNumber', { id: projectId }, 'ID {id}')}
)}
@@ -355,7 +333,7 @@ export const ManageProjectDetailContent = () => {
className="w-full justify-start gap-2 rounded-full"
>
- {t('manageProjectDetail.content.editProject', undefined, 'Edit project')}
+ {t('common.editProject', undefined, 'Edit project')}
{
>
{project?.isArchived
- ? t(
- 'manageProjectDetail.content.unarchiveProject',
- undefined,
- 'Unarchive project'
- )
- : t(
- 'manageProjectDetail.content.archiveProject',
- undefined,
- 'Archive project'
- )}
+ ? t('common.unarchiveProject', undefined, 'Unarchive project')
+ : t('common.archiveProject', undefined, 'Archive project')}
{
className="w-full justify-start gap-2 rounded-full text-red-600 hover:text-red-600 dark:text-red-400 dark:hover:text-red-400"
>
- {t(
- 'manageProjectDetail.content.deleteProject',
- undefined,
- 'Delete project'
- )}
+ {t('common.deleteProject', undefined, 'Delete project')}
>
)}
@@ -441,17 +407,13 @@ export const ManageProjectDetailContent = () => {
<>
- {t(
- 'manageProjectDetail.content.statsChallenges',
- undefined,
- 'Challenges'
- )}
+ {t('common.challenges', undefined, 'Challenges')}
{challengeSummary.total}
- {t('manageProjectDetail.content.statsShown', undefined, 'Shown')}
+ {t('common.shown', undefined, 'Shown')}
{filteredChallenges.length}
@@ -459,11 +421,7 @@ export const ManageProjectDetailContent = () => {
- {t(
- 'manageProjectDetail.content.statsDiscoverable',
- undefined,
- 'Discoverable'
- )}
+ {t('common.discoverable', undefined, 'Discoverable')}
{challengeSummary.enabled}
@@ -472,11 +430,7 @@ export const ManageProjectDetailContent = () => {
- {t(
- 'manageProjectDetail.content.statsTasksRemaining',
- undefined,
- 'Tasks remaining'
- )}
+ {t('common.tasksRemaining', undefined, 'Tasks remaining')}
{challengeSummary.tasksRemaining}
@@ -542,31 +496,23 @@ export const ManageProjectDetailContent = () => {
{
getItemKey={() => ''}
emptyState={{
icon: ListChecks,
- title: t(
- 'manageProjectDetail.content.emptyTitle',
- undefined,
- 'No challenges found'
- ),
+ title: t('common.noChallengesFound', undefined, 'No challenges found'),
description: t(
'manageProjectDetail.content.emptyDescription',
undefined,
@@ -651,11 +593,7 @@ export const ManageProjectDetailContent = () => {
getItemKey={(challenge) => challenge.id ?? crypto.randomUUID()}
emptyState={{
icon: ListChecks,
- title: t(
- 'manageProjectDetail.content.emptyTitle',
- undefined,
- 'No challenges found'
- ),
+ title: t('common.noChallengesFound', undefined, 'No challenges found'),
description: t(
'manageProjectDetail.content.emptyDescription',
undefined,
@@ -705,15 +643,11 @@ export const ManageProjectDetailContent = () => {
- {t(
- 'manageProjectDetail.content.deleteChallengeTitle',
- undefined,
- 'Delete challenge?'
- )}
+ {t('common.deleteChallenge2', undefined, 'Delete challenge?')}
{t(
- 'manageProjectDetail.content.deleteChallengeDescription',
+ 'common.deleteChallengeWarning',
undefined,
'This will delete this challenge and all its tasks. This action cannot be undone.'
)}
@@ -735,7 +669,7 @@ export const ManageProjectDetailContent = () => {
- {t('manageProjectDetail.content.deleteProjectTitle', undefined, 'Delete project?')}
+ {t('common.deleteProject2', undefined, 'Delete project?')}
{t(
diff --git a/src/components/Pages/ManagementPages/ManageProjectNew/ProjectForm.tsx b/src/components/Pages/ManagementPages/ManageProjectNew/ProjectForm.tsx
index 302ea4add..7386723e4 100644
--- a/src/components/Pages/ManagementPages/ManageProjectNew/ProjectForm.tsx
+++ b/src/components/Pages/ManagementPages/ManageProjectNew/ProjectForm.tsx
@@ -197,9 +197,7 @@ export const ProjectForm = ({ project, onSubmit, onCancel }: ProjectFormProps) =
name="description"
render={({ field }) => (
-
- {t('manageProjectNew.projectForm.descriptionLabel', undefined, 'Description')}
-
+ {t('common.description', undefined, 'Description')}
- {t('manageProjectNew.projectForm.enabledLabel', undefined, 'Enabled')}
+ {t('common.enabled', undefined, 'Enabled')}
{t(
@@ -268,7 +266,7 @@ export const ProjectForm = ({ project, onSubmit, onCancel }: ProjectFormProps) =
- {t('manageProjectNew.projectForm.featuredLabel', undefined, 'Featured')}
+ {t('common.featured', undefined, 'Featured')}
{t(
@@ -293,10 +291,10 @@ export const ProjectForm = ({ project, onSubmit, onCancel }: ProjectFormProps) =
{form.formState.isSubmitting
- ? t('manageProjectNew.projectForm.savingButton', undefined, 'Saving...')
+ ? t('common.saving2', undefined, 'Saving...')
: project
? t('manageProjectNew.projectForm.updateButton', undefined, 'Update Project')
- : t('manageProjectNew.projectForm.createButton', undefined, 'Create Project')}
+ : t('common.createProject', undefined, 'Create Project')}
diff --git a/src/components/Pages/ManagementPages/ManageProjectNew/index.tsx b/src/components/Pages/ManagementPages/ManageProjectNew/index.tsx
index 6a60e50d8..0444ec1cd 100644
--- a/src/components/Pages/ManagementPages/ManageProjectNew/index.tsx
+++ b/src/components/Pages/ManagementPages/ManageProjectNew/index.tsx
@@ -35,7 +35,7 @@ export const ManageProjectNew = () => {
return (
{
- {t('manageProjects.content.createProject', undefined, 'Create Project')}
+ {t('common.createProject', undefined, 'Create Project')}
)
@@ -115,13 +115,13 @@ export const ManageProjectsContent = () => {
}}
title={
isPinned
- ? t('manageProjects.content.unpinProject', undefined, 'Unpin project')
- : t('manageProjects.content.pinProject', undefined, 'Pin project')
+ ? t('common.unpinProject', undefined, 'Unpin project')
+ : t('common.pinProject', undefined, 'Pin project')
}
aria-label={
isPinned
- ? t('manageProjects.content.unpinProject', undefined, 'Unpin project')
- : t('manageProjects.content.pinProject', undefined, 'Pin project')
+ ? t('common.unpinProject', undefined, 'Unpin project')
+ : t('common.pinProject', undefined, 'Pin project')
}
>
{
}}
title={
proj.enabled
- ? t(
- 'manageProjects.content.makeNotDiscoverable',
- undefined,
- 'Make not discoverable'
- )
- : t('manageProjects.content.makeDiscoverable', undefined, 'Make discoverable')
+ ? t('common.makeNotDiscoverable', undefined, 'Make not discoverable')
+ : t('common.makeDiscoverable', undefined, 'Make discoverable')
}
aria-label={
proj.enabled
- ? t(
- 'manageProjects.content.makeNotDiscoverable',
- undefined,
- 'Make not discoverable'
- )
- : t('manageProjects.content.makeDiscoverable', undefined, 'Make discoverable')
+ ? t('common.makeNotDiscoverable', undefined, 'Make not discoverable')
+ : t('common.makeDiscoverable', undefined, 'Make discoverable')
}
>
{proj.enabled ? (
@@ -173,9 +165,7 @@ export const ManageProjectsContent = () => {
-
- {t('manageProjects.content.openMenu', undefined, 'Open menu')}
-
+ {t('common.openMenu', undefined, 'Open menu')}
@@ -186,7 +176,7 @@ export const ManageProjectsContent = () => {
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.content.viewProject', undefined, 'View project')}
+ {t('common.viewProject', undefined, 'View project')}
@@ -196,7 +186,7 @@ export const ManageProjectsContent = () => {
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.content.editProject', undefined, 'Edit project')}
+ {t('common.editProject', undefined, 'Edit project')}
@@ -206,7 +196,7 @@ export const ManageProjectsContent = () => {
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.content.addChallenge', undefined, 'Add challenge')}
+ {t('common.addChallenge', undefined, 'Add challenge')}
{projectId != null && (
@@ -215,7 +205,7 @@ export const ManageProjectsContent = () => {
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.content.exportCsv', undefined, 'Export CSV')}
+ {t('common.exportCsv', undefined, 'Export CSV')}
)}
{
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.content.copyUrl', undefined, 'Copy URL')}
+ {t('common.copyUrl', undefined, 'Copy URL')}
{projectId != null && (
{
>
{proj.isArchived
- ? t('manageProjects.content.unarchiveProject', undefined, 'Unarchive project')
- : t('manageProjects.content.archiveProject', undefined, 'Archive project')}
+ ? t('common.unarchiveProject', undefined, 'Unarchive project')
+ : t('common.archiveProject', undefined, 'Archive project')}
)}
{projectId != null && (
@@ -245,7 +235,7 @@ export const ManageProjectsContent = () => {
className="flex cursor-pointer items-center gap-2 text-red-600 focus:text-red-600 dark:text-red-400 dark:focus:text-red-400"
>
- {t('manageProjects.content.deleteProject', undefined, 'Delete project')}
+ {t('common.deleteProject', undefined, 'Delete project')}
)}
@@ -278,7 +268,7 @@ export const ManageProjectsContent = () => {
size="icon"
className="h-8 w-8 shrink-0"
onClick={() => setShowPanel(false)}
- title={t('manageProjects.content.hidePanel', undefined, 'Hide panel')}
+ title={t('common.hidePanel', undefined, 'Hide panel')}
>
@@ -378,7 +368,7 @@ export const ManageProjectsContent = () => {
size="icon"
className="h-9 w-9 shrink-0"
onClick={() => setShowPanel(true)}
- title={t('manageProjects.content.showPanel', undefined, 'Show panel')}
+ title={t('common.showPanel', undefined, 'Show panel')}
>
@@ -386,32 +376,28 @@ export const ManageProjectsContent = () => {
{
- {t('manageProjects.content.noProjectsFound', undefined, 'No projects found')}
+ {t('common.noProjectsFound', undefined, 'No projects found')}
{t(
@@ -465,7 +451,7 @@ export const ManageProjectsContent = () => {
- {t('manageProjects.content.createProject', undefined, 'Create Project')}
+ {t('common.createProject', undefined, 'Create Project')}
@@ -501,21 +487,13 @@ export const ManageProjectsContent = () => {
getItemKey={(proj) => proj.id ?? crypto.randomUUID()}
emptyState={{
icon: FolderKanban,
- title: t(
- 'manageProjects.content.noProjectsFound',
- undefined,
- 'No projects found'
- ),
+ title: t('common.noProjectsFound', undefined, 'No projects found'),
description: t(
'manageProjects.content.noProjectsDescriptionShort',
undefined,
'Get started by creating your first project'
),
- actionLabel: t(
- 'manageProjects.content.createProject',
- undefined,
- 'Create Project'
- ),
+ actionLabel: t('common.createProject', undefined, 'Create Project'),
actionTo: '/manage/project/new',
}}
/>
@@ -536,10 +514,10 @@ export const ManageProjectsContent = () => {
{isFetching ? (
<>
- {t('manageProjects.content.loading', undefined, 'Loading...')}
+ {t('common.loading2', undefined, 'Loading...')}
>
) : (
- t('manageProjects.content.loadMore', undefined, 'Load More')
+ t('common.loadMore', undefined, 'Load More')
)}
@@ -548,7 +526,7 @@ export const ManageProjectsContent = () => {
{t(
- 'manageProjects.content.endOfList',
+ 'common.youveReachedTheEndOfTheList',
undefined,
"You've reached the end of the list"
)}
@@ -566,7 +544,7 @@ export const ManageProjectsContent = () => {
- {t('manageProjects.content.deleteProjectTitle', undefined, 'Delete project?')}
+ {t('common.deleteProject2', undefined, 'Delete project?')}
{t(
diff --git a/src/components/Pages/ManagementPages/ManageProjects/ProjectsTableView.tsx b/src/components/Pages/ManagementPages/ManageProjects/ProjectsTableView.tsx
index 437cbfd33..5c7a4bc97 100644
--- a/src/components/Pages/ManagementPages/ManageProjects/ProjectsTableView.tsx
+++ b/src/components/Pages/ManagementPages/ManageProjects/ProjectsTableView.tsx
@@ -54,29 +54,24 @@ export const ProjectsTableView = ({
-
- {t('manageProjects.table.status', undefined, 'Status')}
-
+ {t('common.status', undefined, 'Status')}
-
+
- {t('manageProjects.table.name', undefined, 'Name')}
+ {t('common.name', undefined, 'Name')}
- {t('manageProjects.table.id', undefined, 'ID')}
+ {t('common.id', undefined, 'ID')}
- {t('manageProjects.table.challenges', undefined, 'Challenges')}
+ {t('common.challenges', undefined, 'Challenges')}
- {t('manageProjects.table.description', undefined, 'Description')}
+ {t('common.description', undefined, 'Description')}
- {t('manageProjects.table.actions', undefined, 'Actions')}
+ {t('common.actions', undefined, 'Actions')}
@@ -97,13 +92,13 @@ export const ProjectsTableView = ({
onClick={() => onTogglePin(project.id as number)}
title={
pinned
- ? t('manageProjects.table.unpinProject', undefined, 'Unpin project')
- : t('manageProjects.table.pinProject', undefined, 'Pin project')
+ ? t('common.unpinProject', undefined, 'Unpin project')
+ : t('common.pinProject', undefined, 'Pin project')
}
aria-label={
pinned
- ? t('manageProjects.table.unpinProject', undefined, 'Unpin project')
- : t('manageProjects.table.pinProject', undefined, 'Pin project')
+ ? t('common.unpinProject', undefined, 'Unpin project')
+ : t('common.pinProject', undefined, 'Pin project')
}
>
) : pinned ? (
@@ -149,7 +144,7 @@ export const ProjectsTableView = ({
- {t('manageProjects.table.openMenu', undefined, 'Open menu')}
+ {t('common.openMenu', undefined, 'Open menu')}
@@ -161,7 +156,7 @@ export const ProjectsTableView = ({
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.table.viewProject', undefined, 'View project')}
+ {t('common.viewProject', undefined, 'View project')}
@@ -171,7 +166,7 @@ export const ProjectsTableView = ({
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.table.editProject', undefined, 'Edit project')}
+ {t('common.editProject', undefined, 'Edit project')}
@@ -181,7 +176,7 @@ export const ProjectsTableView = ({
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.table.addChallenge', undefined, 'Add challenge')}
+ {t('common.addChallenge', undefined, 'Add challenge')}
{onExportCsv && project.id != null && (
@@ -190,7 +185,7 @@ export const ProjectsTableView = ({
className="flex cursor-pointer items-center gap-2"
>
- {t('manageProjects.table.exportCsv', undefined, 'Export CSV')}
+ {t('common.exportCsv', undefined, 'Export CSV')}
)}
- {t('manageProjects.table.copyUrl', undefined, 'Copy URL')}
+ {t('common.copyUrl', undefined, 'Copy URL')}
{onArchiveProject && project.id != null && (
{project.isArchived
- ? t(
- 'manageProjects.table.unarchiveProject',
- undefined,
- 'Unarchive project'
- )
- : t(
- 'manageProjects.table.archiveProject',
- undefined,
- 'Archive project'
- )}
+ ? t('common.unarchiveProject', undefined, 'Unarchive project')
+ : t('common.archiveProject', undefined, 'Archive project')}
)}
{onDeleteProject && project.id != null && (
@@ -235,7 +222,7 @@ export const ProjectsTableView = ({
className="flex cursor-pointer items-center gap-2 text-red-600 focus:text-red-600 dark:text-red-400 dark:focus:text-red-400"
>
- {t('manageProjects.table.deleteProject', undefined, 'Delete project')}
+ {t('common.deleteProject', undefined, 'Delete project')}
)}
diff --git a/src/components/Pages/ManagementPages/ManageTaskDetail/index.tsx b/src/components/Pages/ManagementPages/ManageTaskDetail/index.tsx
index 993cd6c1a..48cf117c1 100644
--- a/src/components/Pages/ManagementPages/ManageTaskDetail/index.tsx
+++ b/src/components/Pages/ManagementPages/ManageTaskDetail/index.tsx
@@ -52,9 +52,7 @@ export const ManageTaskDetail = () => {
const taskIdNum = Number(taskId)
const { data: task, isLoading, isError } = api.task.getTask(taskIdNum)
- useSetPageTitleContext(
- task?.name ?? t('manageTaskDetail.taskNumber', { taskId }, 'Task #{taskId}')
- )
+ useSetPageTitleContext(task?.name ?? t('common.taskWithTaskId', { taskId }, 'Task #{taskId}'))
const challengeId =
task && typeof task.parent === 'number' ? task.parent : (task?.parent as { id?: number })?.id
@@ -68,25 +66,25 @@ export const ManageTaskDetail = () => {
challengeId != null
? [
{
- label: t('manageTaskDetail.breadcrumbs.createManage', undefined, 'create & manage'),
+ label: t('common.createManage', undefined, 'create & manage'),
href: '/manage',
},
...(projectId != null
? [
{
- label: t('manageTaskDetail.breadcrumbs.projects', undefined, 'projects'),
+ label: t('common.projects2', undefined, 'projects'),
href: '/manage/projects',
},
{ label: String(projectId), href: `/manage/project/${projectId}` },
]
: []),
{
- label: t('manageTaskDetail.breadcrumbs.challenges', undefined, 'challenges'),
+ label: t('common.challenges2', undefined, 'challenges'),
href: '/manage/challenges',
},
{ label: String(challengeId), href: `/manage/challenge/${challengeId}` },
{
- label: t('manageTaskDetail.breadcrumbs.tasks', undefined, 'tasks'),
+ label: t('common.tasks2', undefined, 'tasks'),
href: '/manage/tasks',
},
{ label: taskId, href: `/manage/task/${taskId}` },
@@ -99,7 +97,7 @@ export const ManageTaskDetail = () => {
const statusLabel =
task?.status != null
? (TASK_STATUS_LABELS[task.status as keyof typeof TASK_STATUS_LABELS] ??
- t('manageTaskDetail.statusUnknown', undefined, 'Unknown'))
+ t('common.unknown', undefined, 'Unknown'))
: null
const canAccess =
@@ -136,7 +134,7 @@ export const ManageTaskDetail = () => {
- {t('manageTaskDetail.accessDeniedTitle', undefined, 'Access denied')}
+ {t('common.accessDenied', undefined, 'Access denied')}
{t(
@@ -159,7 +157,7 @@ export const ManageTaskDetail = () => {
{/* Header */}
- {task?.name ?? t('manageTaskDetail.taskNumber', { taskId }, 'Task #{taskId}')}
+ {task?.name ?? t('common.taskWithTaskId', { taskId }, 'Task #{taskId}')}
{!isLoading && (
@@ -186,7 +184,7 @@ export const ManageTaskDetail = () => {
- {t('manageTaskDetail.editTask', undefined, 'Edit task')}
+ {t('common.editTask', undefined, 'Edit task')}
{challengeId && (
@@ -201,7 +199,7 @@ export const ManageTaskDetail = () => {
className="w-full justify-start gap-2 rounded-full"
>
- {t('manageTaskDetail.browseChallenge', undefined, 'Browse challenge')}
+ {t('common.browseChallenge', undefined, 'Browse challenge')}
)}
@@ -231,7 +229,7 @@ export const ManageTaskDetail = () => {
- {t('manageTaskDetail.created', undefined, 'Created')}
+ {t('common.created', undefined, 'Created')}
{task?.created ? formatDate(new Date(task.created)) : '—'}
@@ -240,7 +238,7 @@ export const ManageTaskDetail = () => {
- {t('manageTaskDetail.modified', undefined, 'Modified')}
+ {t('common.modified', undefined, 'Modified')}
{task?.modified ? formatDate(new Date(task.modified)) : '—'}
@@ -248,14 +246,14 @@ export const ManageTaskDetail = () => {
- {t('manageTaskDetail.status', undefined, 'Status')}
+ {t('common.status', undefined, 'Status')}
{statusLabel ?? '—'}
{task?.errorTags && (
- {t('manageTaskDetail.mrTags', undefined, 'MR Tags')}
+ {t('common.mrTags', undefined, 'MR Tags')}
{task.errorTags}
@@ -266,8 +264,8 @@ export const ManageTaskDetail = () => {
{task?.instruction && (
}
- label={t('manageTaskDetail.instructions', undefined, 'Instructions')}
- title={t('manageTaskDetail.instructions', undefined, 'Instructions')}
+ label={t('common.instructions', undefined, 'Instructions')}
+ title={t('common.instructions', undefined, 'Instructions')}
>
{task.instruction}
@@ -277,8 +275,8 @@ export const ManageTaskDetail = () => {
}
- label={t('manageTaskDetail.geoJson', undefined, 'GeoJSON')}
- title={t('manageTaskDetail.geoJson', undefined, 'GeoJSON')}
+ label={t('common.geojson', undefined, 'GeoJSON')}
+ title={t('common.geojson', undefined, 'GeoJSON')}
>
{geometryString}
diff --git a/src/components/Pages/ManagementPages/ManageTaskEdit/TaskForm.tsx b/src/components/Pages/ManagementPages/ManageTaskEdit/TaskForm.tsx
index c86578066..41eefea22 100644
--- a/src/components/Pages/ManagementPages/ManageTaskEdit/TaskForm.tsx
+++ b/src/components/Pages/ManagementPages/ManageTaskEdit/TaskForm.tsx
@@ -84,7 +84,7 @@ export const TaskForm = ({ task, onSubmit, onCancel }: TaskFormProps) => {
name="name"
render={({ field }) => (
- {t('manageTaskEdit.form.nameLabel', undefined, 'Name')}
+ {t('common.name', undefined, 'Name')}
{
name="instruction"
render={({ field }) => (
-
- {t('manageTaskEdit.form.instructionsLabel', undefined, 'Instructions')}
-
+ {t('common.instructions', undefined, 'Instructions')}
{
name="geometries"
render={({ field }) => (
- {t('manageTaskEdit.form.geoJsonLabel', undefined, 'GeoJSON')}
+ {t('common.geojson', undefined, 'GeoJSON')}
{
name="status"
render={({ field }) => (
- {t('manageTaskEdit.form.statusLabel', undefined, 'Status')}
+ {t('common.status', undefined, 'Status')}
field.onChange(Number(v))}
value={String(field.value)}
@@ -201,7 +199,7 @@ export const TaskForm = ({ task, onSubmit, onCancel }: TaskFormProps) => {
name="errorTags"
render={({ field }) => (
- {t('manageTaskEdit.form.mrTagsLabel', undefined, 'MR Tags')}
+ {t('common.mrTags', undefined, 'MR Tags')}
{
{form.formState.isSubmitting
- ? t('manageTaskEdit.form.saving', undefined, 'Saving...')
+ ? t('common.saving2', undefined, 'Saving...')
: t('common.save', undefined, 'Save')}
diff --git a/src/components/Pages/ManagementPages/ManageTaskEdit/index.tsx b/src/components/Pages/ManagementPages/ManageTaskEdit/index.tsx
index 58efd7a47..51b7e4d22 100644
--- a/src/components/Pages/ManagementPages/ManageTaskEdit/index.tsx
+++ b/src/components/Pages/ManagementPages/ManageTaskEdit/index.tsx
@@ -75,7 +75,7 @@ export const ManageTaskEdit = () => {
return (
{
- {t('manageTasksOpen.title', undefined, 'Tasks')}
+ {t('common.tasks', undefined, 'Tasks')}
{t(
@@ -53,7 +53,7 @@ export const ManageTasksOpen = () => {
- {t('manageTasksOpen.cardTitle', undefined, 'Open task by ID')}
+ {t('common.openTaskById', undefined, 'Open task by ID')}
{t(
@@ -84,7 +84,7 @@ export const ManageTasksOpen = () => {
{t('manageTasksOpen.viewTask', undefined, 'View task')}
- {t('manageTasksOpen.editTask', undefined, 'Edit task')}
+ {t('common.editTask', undefined, 'Edit task')}
@@ -94,14 +94,14 @@ export const ManageTasksOpen = () => {
{t('manageTasksOpen.orGoTo', undefined, 'Or go to')}{' '}
- {t('manageTasksOpen.projectsLink', undefined, 'Projects')}
+ {t('common.projects', undefined, 'Projects')}
{' '}
{t('manageTasksOpen.or', undefined, 'or')}{' '}
- {t('manageTasksOpen.challengesLink', undefined, 'Challenges')}
+ {t('common.challenges', undefined, 'Challenges')}
{' '}
{t(
'manageTasksOpen.findChallengeHint',
diff --git a/src/components/Pages/ManagementPages/ManagementLayout.tsx b/src/components/Pages/ManagementPages/ManagementLayout.tsx
index a5af03ece..e52313207 100644
--- a/src/components/Pages/ManagementPages/ManagementLayout.tsx
+++ b/src/components/Pages/ManagementPages/ManagementLayout.tsx
@@ -16,11 +16,7 @@ export const ManagementLayout = () => {
diff --git a/src/components/Pages/ManagementPages/MoveChallengeModal/index.tsx b/src/components/Pages/ManagementPages/MoveChallengeModal/index.tsx
index 076bc21aa..2f785017e 100644
--- a/src/components/Pages/ManagementPages/MoveChallengeModal/index.tsx
+++ b/src/components/Pages/ManagementPages/MoveChallengeModal/index.tsx
@@ -59,7 +59,7 @@ export const MoveChallengeModal = () => {
@@ -94,7 +94,7 @@ export const MoveChallengeModal = () => {
{project.id != null && (
- {t('moveChallengeModal.idLabel', { id: project.id }, '(ID: {id})')}
+ {t('common.idNumberParenthetical', { id: project.id }, '(ID: {id})')}
)}
diff --git a/src/components/Pages/ManagementPages/TaskPrioritizationPage/PrioritizationContent.tsx b/src/components/Pages/ManagementPages/TaskPrioritizationPage/PrioritizationContent.tsx
index 3e9958f6b..ca989fc7b 100644
--- a/src/components/Pages/ManagementPages/TaskPrioritizationPage/PrioritizationContent.tsx
+++ b/src/components/Pages/ManagementPages/TaskPrioritizationPage/PrioritizationContent.tsx
@@ -91,7 +91,7 @@ export const PrioritizationContent = ({ challengeId, challengeName }: Props) =>
{t(
- 'taskPrioritizationPage.content.subtitle',
+ 'common.challengeWithChallengeId',
{
name:
challengeName ??
@@ -120,7 +120,7 @@ export const PrioritizationContent = ({ challengeId, challengeName }: Props) =>
aria-disabled={!isDirty || mutation.isPending}
>
{mutation.isPending
- ? t('taskPrioritizationPage.content.saving', undefined, 'Saving…')
+ ? t('common.saving', undefined, 'Saving…')
: t('common.save', undefined, 'Save')}
diff --git a/src/components/Pages/ManagementPages/shared/BulkActionsToolbar/BulkActionsToolbar.tsx b/src/components/Pages/ManagementPages/shared/BulkActionsToolbar/BulkActionsToolbar.tsx
index c173d0e35..42c2a87d1 100644
--- a/src/components/Pages/ManagementPages/shared/BulkActionsToolbar/BulkActionsToolbar.tsx
+++ b/src/components/Pages/ManagementPages/shared/BulkActionsToolbar/BulkActionsToolbar.tsx
@@ -239,8 +239,7 @@ export const BulkActionsToolbar = ({ selectedIds, onClearSelection }: Props) =>
{t('common.delete', undefined, 'Delete')}
- {' '}
- {t('managementPages.bulkActionsToolbar.clearSelection', undefined, 'Clear')}
+ {t('common.clear', undefined, 'Clear')}
setQuery(e.target.value)}
- placeholder={t(
- 'managementPages.bulkActionsToolbar.reassignDialog.searchPlaceholder',
- undefined,
- 'Search OSM username'
- )}
+ placeholder={t('common.searchOsmUsername', undefined, 'Search OSM username')}
className="pl-8"
/>
diff --git a/src/components/Pages/ManagementPages/shared/VisibilityToggle.tsx b/src/components/Pages/ManagementPages/shared/VisibilityToggle.tsx
index 6d7a8c302..86956f9ac 100644
--- a/src/components/Pages/ManagementPages/shared/VisibilityToggle.tsx
+++ b/src/components/Pages/ManagementPages/shared/VisibilityToggle.tsx
@@ -24,8 +24,7 @@ export const VisibilityToggle = ({
const { t } = useIntl()
const switchId = useId()
const resolvedErrorMessage =
- errorMessage ??
- t('managementPages.visibilityToggle.error', undefined, 'Could not update visibility')
+ errorMessage ?? t('common.couldNotUpdateVisibility', undefined, 'Could not update visibility')
const handleChange = async (checked: boolean) => {
try {
await onToggle(id, checked)
diff --git a/src/components/Pages/NotificationsPage/NotificationFilters.tsx b/src/components/Pages/NotificationsPage/NotificationFilters.tsx
index c4516aaaf..c121ed5d4 100644
--- a/src/components/Pages/NotificationsPage/NotificationFilters.tsx
+++ b/src/components/Pages/NotificationsPage/NotificationFilters.tsx
@@ -120,9 +120,7 @@ export const NotificationFilters = () => {
-
+
@@ -130,7 +128,7 @@ export const NotificationFilters = () => {
{filterOptions.tasks.map((taskId: number) => (
- {t('notificationsPage.filters.taskOption', { taskId }, 'Task #{taskId}')}
+ {t('common.taskWithTaskId', { taskId }, 'Task #{taskId}')}
))}
@@ -138,9 +136,7 @@ export const NotificationFilters = () => {
-
+
@@ -175,17 +171,11 @@ export const NotificationFilters = () => {
-
+
- {t('notificationsPage.filters.allChallenges', undefined, 'All Challenges')}
+ {t('common.allChallenges', undefined, 'All Challenges')}
{filterOptions.challenges.map((challengeName: string) => (
diff --git a/src/components/Pages/NotificationsPage/NotificationItem.tsx b/src/components/Pages/NotificationsPage/NotificationItem.tsx
index dc5c00c48..b89a320f0 100644
--- a/src/components/Pages/NotificationsPage/NotificationItem.tsx
+++ b/src/components/Pages/NotificationsPage/NotificationItem.tsx
@@ -59,7 +59,7 @@ export const NotificationItem = ({
const notificationTypeName =
NOTIFICATION_TYPE_NAMES[notification.notificationType] ||
- t('notificationsPage.item.notificationFallback', undefined, 'Notification')
+ t('common.notification', undefined, 'Notification')
const createdDate = new Date(notification.created)
const timeAgo = formatTimeAgo(createdDate)
@@ -214,16 +214,12 @@ export const NotificationItem = ({
onClick={handleLinkClick}
className="truncate font-medium hover:text-blue-600 hover:underline dark:hover:text-blue-400"
title={t(
- 'notificationsPage.item.taskRef',
+ 'common.taskWithTaskId',
{ taskId: notification.taskId },
'Task #{taskId}'
)}
>
- {t(
- 'notificationsPage.item.taskRef',
- { taskId: notification.taskId },
- 'Task #{taskId}'
- )}
+ {t('common.taskWithTaskId', { taskId: notification.taskId }, 'Task #{taskId}')}
>
)}
@@ -239,13 +235,13 @@ export const NotificationItem = ({
onClick={handleLinkClick}
className="truncate font-medium hover:text-blue-600 hover:underline dark:hover:text-blue-400"
title={t(
- 'notificationsPage.item.challengeRef',
+ 'common.challengeWithChallengeId',
{ challengeId: notification.challengeId },
'Challenge #{challengeId}'
)}
>
{t(
- 'notificationsPage.item.challengeRef',
+ 'common.challengeWithChallengeId',
{ challengeId: notification.challengeId },
'Challenge #{challengeId}'
)}
diff --git a/src/components/Pages/NotificationsPage/NotificationThreadDialog.tsx b/src/components/Pages/NotificationsPage/NotificationThreadDialog.tsx
index 1ba6ccbb3..76feea6a3 100644
--- a/src/components/Pages/NotificationsPage/NotificationThreadDialog.tsx
+++ b/src/components/Pages/NotificationsPage/NotificationThreadDialog.tsx
@@ -99,15 +99,15 @@ export const NotificationThreadDialog = ({ onViewAll }: NotificationThreadDialog
{ taskId },
'Notification for Task #{taskId}'
)
- : t('notificationsPage.thread.title.single', undefined, 'Notification')}
+ : t('common.notification', undefined, 'Notification')}
{isThread
? t(
- 'notificationsPage.thread.description.groupedFor',
+ 'common.taskWithTaskId',
{
ref: taskId
- ? t('notificationsPage.item.taskRef', { taskId }, 'Task #{taskId}')
+ ? t('common.taskWithTaskId', { taskId }, 'Task #{taskId}')
: (challengeRef ??
t(
'notificationsPage.thread.description.thisThread',
@@ -181,7 +181,7 @@ export const NotificationThreadDialog = ({ onViewAll }: NotificationThreadDialog
{ taskId },
'Reply on Task #{taskId}…'
)}
- submitLabel={t('notificationsPage.thread.replySubmitLabel', undefined, 'Reply')}
+ submitLabel={t('common.reply', undefined, 'Reply')}
disabled={addCommentMutation.isPending}
/>
@@ -225,7 +225,7 @@ export const NotificationThreadDialog = ({ onViewAll }: NotificationThreadDialog
{onViewAll && (
- {t('notificationsPage.thread.viewAll', undefined, 'View all notifications')}
+ {t('common.viewAllNotifications', undefined, 'View all notifications')}
)}
diff --git a/src/components/Pages/NotificationsPage/NotificationToolbar.tsx b/src/components/Pages/NotificationsPage/NotificationToolbar.tsx
index e24971aa4..ec197c51b 100644
--- a/src/components/Pages/NotificationsPage/NotificationToolbar.tsx
+++ b/src/components/Pages/NotificationsPage/NotificationToolbar.tsx
@@ -23,14 +23,10 @@ export const NotificationToolbar = () => {
setActiveTab(value as 'unread' | 'all')}>
- {t(
- 'notificationsPage.toolbar.unreadTab',
- { count: filteredUnreadCount },
- 'Unread ({count})'
- )}
+ {t('common.unread', { count: filteredUnreadCount }, 'Unread ({count})')}
- {t('notificationsPage.toolbar.allTab', { count: filteredAllCount }, 'All ({count})')}
+ {t('common.all', { count: filteredAllCount }, 'All ({count})')}
@@ -68,7 +64,7 @@ export const NotificationToolbar = () => {
{ count: selectedNotificationIds.size },
'Mark {count} as read'
)
- : t('notificationsPage.toolbar.markAllRead', undefined, 'Mark all as read')}
+ : t('common.markAllAsRead', undefined, 'Mark all as read')}
)}
diff --git a/src/components/Pages/NotificationsPage/NotificationsPageContent.tsx b/src/components/Pages/NotificationsPage/NotificationsPageContent.tsx
index acc35b6f9..c93ab6813 100644
--- a/src/components/Pages/NotificationsPage/NotificationsPageContent.tsx
+++ b/src/components/Pages/NotificationsPage/NotificationsPageContent.tsx
@@ -111,7 +111,7 @@ export const NotificationsPageContent = () => {
{isLoading ? (
- {t('notificationsPage.content.loading', undefined, 'Loading notifications...')}
+ {t('common.loadingNotifications', undefined, 'Loading notifications...')}
) : displayNotifications.length > 0 ? (
@@ -168,20 +168,16 @@ export const NotificationsPageContent = () => {
- {t('notificationsPage.content.upToDate', undefined, "You're all up to date")}
+ {t('common.youreAllUpToDate', undefined, "You're all up to date")}
{activeTab === 'unread'
? t(
- 'notificationsPage.content.noUnread',
+ 'common.noUnreadNotificationsYet',
undefined,
'You have no unread notifications at the moment.'
)
- : t(
- 'notificationsPage.content.noNotifications',
- undefined,
- 'You have no notifications.'
- )}
+ : t('common.noNotificationsYet', undefined, 'You have no notifications.')}
diff --git a/src/components/Pages/ProfilePage/blocks/ReviewStatsBlock.tsx b/src/components/Pages/ProfilePage/blocks/ReviewStatsBlock.tsx
index b201af5a0..c47f71cbf 100644
--- a/src/components/Pages/ProfilePage/blocks/ReviewStatsBlock.tsx
+++ b/src/components/Pages/ProfilePage/blocks/ReviewStatsBlock.tsx
@@ -11,12 +11,12 @@ export const ReviewStatsBlock = () => {
const { data, isLoading, isError } = api.user.metrics(userId, timeRange.monthDuration)
const reviewStatusLabels: Record = {
- '0': t('profilePage.reviewStats.needed', undefined, 'Needed'),
- '1': t('profilePage.reviewStats.approved', undefined, 'Approved'),
- '2': t('profilePage.reviewStats.rejected', undefined, 'Rejected'),
- '3': t('profilePage.reviewStats.assisted', undefined, 'Assisted'),
- '4': t('profilePage.reviewStats.disputed', undefined, 'Disputed'),
- '5': t('profilePage.reviewStats.unnecessary', undefined, 'Unnecessary'),
+ '0': t('common.needed', undefined, 'Needed'),
+ '1': t('common.approved', undefined, 'Approved'),
+ '2': t('common.rejected', undefined, 'Rejected'),
+ '3': t('common.assisted', undefined, 'Assisted'),
+ '4': t('common.disputed', undefined, 'Disputed'),
+ '5': t('common.unnecessary', undefined, 'Unnecessary'),
}
const reviewedTotal = Object.values(data?.reviewedTasks ?? {}).reduce((a, b) => a + b, 0)
@@ -46,7 +46,7 @@ export const ReviewStatsBlock = () => {
{reviewStatusLabels[status] ??
- t('profilePage.reviewStats.statusFallback', { status }, 'Status {status}')}
+ t('common.statusWithStatus', { status }, 'Status {status}')}
{count.toLocaleString()}
diff --git a/src/components/Pages/ProfilePage/blocks/ReviewerStatsBlock.tsx b/src/components/Pages/ProfilePage/blocks/ReviewerStatsBlock.tsx
index a803f65d6..19fbdb0f6 100644
--- a/src/components/Pages/ProfilePage/blocks/ReviewerStatsBlock.tsx
+++ b/src/components/Pages/ProfilePage/blocks/ReviewerStatsBlock.tsx
@@ -11,12 +11,12 @@ export const ReviewerStatsBlock = () => {
const { data, isLoading } = api.user.metrics(userId, timeRange.monthDuration)
const reviewStatusLabels: Record = {
- '0': t('profilePage.reviewerStats.needed', undefined, 'Needed'),
- '1': t('profilePage.reviewerStats.approved', undefined, 'Approved'),
- '2': t('profilePage.reviewerStats.rejected', undefined, 'Rejected'),
- '3': t('profilePage.reviewerStats.assisted', undefined, 'Assisted'),
- '4': t('profilePage.reviewerStats.disputed', undefined, 'Disputed'),
- '5': t('profilePage.reviewerStats.unnecessary', undefined, 'Unnecessary'),
+ '0': t('common.needed', undefined, 'Needed'),
+ '1': t('common.approved', undefined, 'Approved'),
+ '2': t('common.rejected', undefined, 'Rejected'),
+ '3': t('common.assisted', undefined, 'Assisted'),
+ '4': t('common.disputed', undefined, 'Disputed'),
+ '5': t('common.unnecessary', undefined, 'Unnecessary'),
}
const reviewerTotal = Object.values(data?.reviewTasks ?? {}).reduce((a, b) => a + b, 0)
@@ -42,7 +42,7 @@ export const ReviewerStatsBlock = () => {
{reviewStatusLabels[status] ??
- t('profilePage.reviewerStats.statusFallback', { status }, 'Status {status}')}
+ t('common.statusWithStatus', { status }, 'Status {status}')}
{count.toLocaleString()}
diff --git a/src/components/Pages/ProfilePage/blocks/TaskStatsBlock.tsx b/src/components/Pages/ProfilePage/blocks/TaskStatsBlock.tsx
index d5a9965e0..660bc3b3e 100644
--- a/src/components/Pages/ProfilePage/blocks/TaskStatsBlock.tsx
+++ b/src/components/Pages/ProfilePage/blocks/TaskStatsBlock.tsx
@@ -17,7 +17,7 @@ export const TaskStatsBlock = () => {
- {t('profilePage.taskStats.title', undefined, 'Tasks')}
+ {t('common.tasks', undefined, 'Tasks')}
@@ -41,7 +41,7 @@ export const TaskStatsBlock = () => {
{STATUS_LABELS[Number(status)] ??
- t('profilePage.taskStats.statusFallback', { status }, 'Status {status}')}
+ t('common.statusWithStatus', { status }, 'Status {status}')}
{count.toLocaleString()}
diff --git a/src/components/Pages/SuperAdminPages/SuperAdminAnalytics/index.tsx b/src/components/Pages/SuperAdminPages/SuperAdminAnalytics/index.tsx
index f10d22853..563c3b765 100644
--- a/src/components/Pages/SuperAdminPages/SuperAdminAnalytics/index.tsx
+++ b/src/components/Pages/SuperAdminPages/SuperAdminAnalytics/index.tsx
@@ -51,7 +51,7 @@ export const SuperAdminAnalytics = () => {
}
/>
}
description={
@@ -62,7 +62,7 @@ export const SuperAdminAnalytics = () => {
}
/>
}
description={
@@ -225,7 +225,7 @@ export const SuperAdminAnalytics = () => {
{t(
- 'superAdmin.analytics.taskCount',
+ 'common.tasksWithCount',
{ count: Math.floor(Math.random() * 500 + 100) },
'{count} tasks'
)}
@@ -263,7 +263,7 @@ export const SuperAdminAnalytics = () => {
{t(
- 'superAdmin.analytics.taskCount',
+ 'common.tasksWithCount',
{ count: Math.floor(Math.random() * 1000 + 500) },
'{count} tasks'
)}
diff --git a/src/components/Pages/SuperAdminPages/SuperAdminChallenges/index.tsx b/src/components/Pages/SuperAdminPages/SuperAdminChallenges/index.tsx
index 55b683783..598f101ea 100644
--- a/src/components/Pages/SuperAdminPages/SuperAdminChallenges/index.tsx
+++ b/src/components/Pages/SuperAdminPages/SuperAdminChallenges/index.tsx
@@ -80,7 +80,7 @@ const ChallengeCard = ({ challenge }: { challenge: (typeof mockChallenges)[0] })
{challenge.blurb ||
challenge.description ||
- t('superAdminChallenges.card.noDescription', undefined, 'No description available')}
+ t('common.noDescriptionAvailable', undefined, 'No description available')}
{/* Tasks Remaining */}
@@ -88,7 +88,7 @@ const ChallengeCard = ({ challenge }: { challenge: (typeof mockChallenges)[0] })
{challenge.tasksRemaining || 0}
{' '}
- {t('superAdminChallenges.card.tasksRemaining', undefined, 'tasks remaining')}
+ {t('common.tasksRemaining2', undefined, 'tasks remaining')}
{/* Progress Bar */}
@@ -112,7 +112,7 @@ const ChallengeCard = ({ challenge }: { challenge: (typeof mockChallenges)[0] })
- {t('superAdminChallenges.card.view', undefined, 'View')}
+ {t('common.view', undefined, 'View')}
{t('common.edit', undefined, 'Edit')}
@@ -143,7 +143,7 @@ export const SuperAdminChallenges = () => {
- {t('superAdminChallenges.title', undefined, 'All Challenges')}
+ {t('common.allChallenges', undefined, 'All Challenges')}
@@ -156,18 +156,14 @@ export const SuperAdminChallenges = () => {
- {t('superAdminChallenges.createButton', undefined, 'Create New Challenge')}
+ {t('common.createNewChallenge', undefined, 'Create New Challenge')}
@@ -176,7 +172,7 @@ export const SuperAdminChallenges = () => {
- {t('superAdminChallenges.stats.total', undefined, 'Total Challenges')}
+ {t('common.totalChallenges', undefined, 'Total Challenges')}
1,892
@@ -189,7 +185,7 @@ export const SuperAdminChallenges = () => {
- {t('superAdminChallenges.stats.active', undefined, 'Active Challenges')}
+ {t('common.activeChallenges', undefined, 'Active Challenges')}
1,345
@@ -215,13 +211,13 @@ export const SuperAdminChallenges = () => {
- {t('superAdminChallenges.stats.avgCompletion', undefined, 'Avg. Completion')}
+ {t('common.avgCompletion', undefined, 'Avg. Completion')}
58%
- {t('superAdminChallenges.stats.platformAverage', undefined, 'Platform average')}
+ {t('common.platformAverage', undefined, 'Platform average')}
@@ -243,11 +239,11 @@ export const SuperAdminChallenges = () => {
- {t('superAdminChallenges.empty.title', undefined, 'No challenges found')}
+ {t('common.noChallengesFound', undefined, 'No challenges found')}
{t(
- 'superAdminChallenges.empty.description',
+ 'common.tryAdjustingYourSearchQuery',
undefined,
'Try adjusting your search query.'
)}
diff --git a/src/components/Pages/SuperAdminPages/SuperAdminHome/index.tsx b/src/components/Pages/SuperAdminPages/SuperAdminHome/index.tsx
index b4d387616..ea3e4f6d6 100644
--- a/src/components/Pages/SuperAdminPages/SuperAdminHome/index.tsx
+++ b/src/components/Pages/SuperAdminPages/SuperAdminHome/index.tsx
@@ -65,12 +65,10 @@ export const SuperAdminHome = () => {
-
- {t('superAdminHome.cards.projects.title', undefined, 'Projects')}
-
+ {t('common.projects', undefined, 'Projects')}
{t(
- 'superAdminHome.cards.projects.description',
+ 'common.viewManageProjectsSubtitle',
undefined,
'View and manage all projects across the platform'
)}
@@ -78,7 +76,7 @@ export const SuperAdminHome = () => {
- {t('superAdminHome.cards.projects.button', undefined, 'View Projects')}
+ {t('common.viewProjects', undefined, 'View Projects')}
@@ -91,9 +89,7 @@ export const SuperAdminHome = () => {
-
- {t('superAdminHome.cards.challenges.title', undefined, 'Challenges')}
-
+ {t('common.challenges', undefined, 'Challenges')}
{t(
'superAdminHome.cards.challenges.description',
@@ -104,7 +100,7 @@ export const SuperAdminHome = () => {
- {t('superAdminHome.cards.challenges.button', undefined, 'View Challenges')}
+ {t('common.viewChallenges', undefined, 'View Challenges')}
diff --git a/src/components/Pages/SuperAdminPages/SuperAdminPlugins/index.tsx b/src/components/Pages/SuperAdminPages/SuperAdminPlugins/index.tsx
index cb264ce43..e4cc562ef 100644
--- a/src/components/Pages/SuperAdminPages/SuperAdminPlugins/index.tsx
+++ b/src/components/Pages/SuperAdminPages/SuperAdminPlugins/index.tsx
@@ -250,7 +250,7 @@ export const SuperAdminPlugins = () => {
{t(
- 'superAdminPlugins.empty.description',
+ 'common.tryAdjustingYourSearchQuery',
undefined,
'Try adjusting your search query.'
)}
diff --git a/src/components/Pages/SuperAdminPages/SuperAdminProjects/index.tsx b/src/components/Pages/SuperAdminPages/SuperAdminProjects/index.tsx
index 0afc097e5..d3ba9859b 100644
--- a/src/components/Pages/SuperAdminPages/SuperAdminProjects/index.tsx
+++ b/src/components/Pages/SuperAdminPages/SuperAdminProjects/index.tsx
@@ -65,21 +65,21 @@ const ProjectCard = ({ project }: { project: (typeof mockProjects)[0] }) => {
{project.description ||
- t('superAdminProjects.card.noDescription', undefined, 'No description available')}
+ t('common.noDescriptionAvailable', undefined, 'No description available')}
{project.challengeCount} {' '}
- {t('superAdminProjects.card.challenges', undefined, 'challenges')}
+ {t('common.challenges2', undefined, 'challenges')}
{project.completionRate}% {' '}
- {t('superAdminProjects.card.complete', undefined, 'complete')}
+ {t('common.complete', undefined, 'complete')}
- {t('superAdminProjects.card.view', undefined, 'View')}
+ {t('common.view', undefined, 'View')}
{t('common.edit', undefined, 'Edit')}
@@ -115,7 +115,7 @@ export const SuperAdminProjects = () => {
{t(
- 'superAdminProjects.subtitle',
+ 'common.viewManageProjectsSubtitle',
undefined,
'View and manage all projects across the platform'
)}
@@ -123,14 +123,14 @@ export const SuperAdminProjects = () => {
- {t('superAdminProjects.createButton', undefined, 'Create New Project')}
+ {t('common.createNewProject', undefined, 'Create New Project')}
@@ -152,7 +152,7 @@ export const SuperAdminProjects = () => {
- {t('superAdminProjects.stats.active', undefined, 'Active Projects')}
+ {t('common.activeProjects', undefined, 'Active Projects')}
187
@@ -165,7 +165,7 @@ export const SuperAdminProjects = () => {
- {t('superAdminProjects.stats.totalChallenges', undefined, 'Total Challenges')}
+ {t('common.totalChallenges', undefined, 'Total Challenges')}
1,892
@@ -178,13 +178,13 @@ export const SuperAdminProjects = () => {
- {t('superAdminProjects.stats.avgCompletion', undefined, 'Avg. Completion')}
+ {t('common.avgCompletion', undefined, 'Avg. Completion')}
64%
- {t('superAdminProjects.stats.platformAverage', undefined, 'Platform average')}
+ {t('common.platformAverage', undefined, 'Platform average')}
@@ -203,12 +203,10 @@ export const SuperAdminProjects = () => {
-
- {t('superAdminProjects.empty.title', undefined, 'No projects found')}
-
+ {t('common.noProjectsFound', undefined, 'No projects found')}
{t(
- 'superAdminProjects.empty.description',
+ 'common.tryAdjustingYourSearchQuery',
undefined,
'Try adjusting your search query.'
)}
diff --git a/src/components/Pages/SuperAdminPages/SuperAdminUsers/index.tsx b/src/components/Pages/SuperAdminPages/SuperAdminUsers/index.tsx
index 4521aeb5c..8b9987520 100644
--- a/src/components/Pages/SuperAdminPages/SuperAdminUsers/index.tsx
+++ b/src/components/Pages/SuperAdminPages/SuperAdminUsers/index.tsx
@@ -204,12 +204,8 @@ export const SuperAdminUsers = () => {
{t('superAdminUsers.table.columns.score', undefined, 'Score')}
-
- {t('superAdminUsers.table.columns.joined', undefined, 'Joined')}
-
-
- {t('superAdminUsers.table.columns.actions', undefined, 'Actions')}
-
+ {t('common.joined', undefined, 'Joined')}
+ {t('common.actions', undefined, 'Actions')}
@@ -266,7 +262,7 @@ export const SuperAdminUsers = () => {
- {t('superAdminUsers.table.view', undefined, 'View')}
+ {t('common.view', undefined, 'View')}
@@ -286,7 +282,7 @@ export const SuperAdminUsers = () => {
{t(
- 'superAdminUsers.empty.description',
+ 'common.tryAdjustingYourSearchQuery',
undefined,
'Try adjusting your search query.'
)}
diff --git a/src/components/Pages/TaskEditPage/IdEditorView.tsx b/src/components/Pages/TaskEditPage/IdEditorView.tsx
index 7dafa03ba..c1668668f 100644
--- a/src/components/Pages/TaskEditPage/IdEditorView.tsx
+++ b/src/components/Pages/TaskEditPage/IdEditorView.tsx
@@ -388,7 +388,7 @@ export const IdEditorView = ({ onClose }: IdEditorViewProps) => {
type="button"
onClick={handleResetView}
className="flex items-center gap-1.5 whitespace-nowrap rounded-md px-2.5 py-1.5 font-medium text-[11px] text-slate-300 transition-colors hover:bg-slate-700/80 hover:text-white"
- title={t('taskEditPage.idEditor.resetView', undefined, 'Reset view to task location')}
+ title={t('common.resetViewToTaskLocation', undefined, 'Reset view to task location')}
>
{t('taskEditPage.idEditor.reCenter', undefined, 'Re-Center')}
diff --git a/src/components/Pages/TaskEditPage/TaskActionModal.tsx b/src/components/Pages/TaskEditPage/TaskActionModal.tsx
index dc360e4fc..095ea5f74 100644
--- a/src/components/Pages/TaskEditPage/TaskActionModal.tsx
+++ b/src/components/Pages/TaskEditPage/TaskActionModal.tsx
@@ -53,19 +53,19 @@ export const TaskActionModal = ({
const randomId = useId()
const nearbyId = useId()
const STATUS_OPTIONS = [
- { value: 1, label: t('taskEditPage.taskActionModal.status.fixed', undefined, 'Fixed') },
+ { value: 1, label: t('common.fixed', undefined, 'Fixed') },
{
value: 2,
- label: t('taskEditPage.taskActionModal.status.falsePositive', undefined, 'False Positive'),
+ label: t('common.falsePositive', undefined, 'False Positive'),
},
- { value: 3, label: t('taskEditPage.taskActionModal.status.skipped', undefined, 'Skipped') },
+ { value: 3, label: t('common.skipped', undefined, 'Skipped') },
{
value: 5,
- label: t('taskEditPage.taskActionModal.status.alreadyFixed', undefined, 'Already Fixed'),
+ label: t('common.alreadyFixed', undefined, 'Already Fixed'),
},
{
value: 6,
- label: t('taskEditPage.taskActionModal.status.cantComplete', undefined, "Can't Complete"),
+ label: t('common.cantComplete', undefined, "Can't Complete"),
},
]
const [newStatus, setNewStatus] = useState(initialStatus)
@@ -82,8 +82,7 @@ export const TaskActionModal = ({
const { activeBundle, initialBundle } = useTaskBundleContext()
const currentStatus = task.status ?? 0
const currentStatusLabel =
- STATUS_LABELS[currentStatus] ||
- t('taskEditPage.taskActionModal.status.unknown', undefined, 'Unknown')
+ STATUS_LABELS[currentStatus] || t('common.unknown', undefined, 'Unknown')
useEffect(() => {
setNewStatus(initialStatus)
@@ -168,7 +167,7 @@ export const TaskActionModal = ({
} else {
toast.info(
t(
- 'taskEditPage.taskActionModal.toast.noMoreTasks',
+ 'common.noMoreTasksInChallenge',
undefined,
'No more tasks available in this challenge'
)
@@ -179,13 +178,7 @@ export const TaskActionModal = ({
})
}
} catch {
- toast.error(
- t(
- 'taskEditPage.taskActionModal.toast.loadNextFailed',
- undefined,
- 'Failed to load next task'
- )
- )
+ toast.error(t('common.failedToLoadNextTask', undefined, 'Failed to load next task'))
await navigate({
to: '/challenge/$challengeId',
params: { challengeId: String(task.parent) },
@@ -378,7 +371,7 @@ export const TaskActionModal = ({
{isSubmitting
- ? t('taskEditPage.taskActionModal.submitting', undefined, 'Submitting...')
+ ? t('common.submitting', undefined, 'Submitting...')
: t(
'taskEditPage.taskActionModal.completeAndContinue',
undefined,
diff --git a/src/components/Pages/TaskEditPage/TaskActions/NavigationActions.tsx b/src/components/Pages/TaskEditPage/TaskActions/NavigationActions.tsx
index 5a3ef9f0f..b4a6c506e 100644
--- a/src/components/Pages/TaskEditPage/TaskActions/NavigationActions.tsx
+++ b/src/components/Pages/TaskEditPage/TaskActions/NavigationActions.tsx
@@ -59,11 +59,7 @@ export const NavigationActions = ({
await navigate({ to: '/tasks/$taskId', params: { taskId: String(randomTasks[0].id) } })
} else {
toast.info(
- t(
- 'taskEditPage.taskActions.navigation.noMoreTasks',
- undefined,
- 'No more tasks available in this challenge'
- )
+ t('common.noMoreTasksInChallenge', undefined, 'No more tasks available in this challenge')
)
await navigate({
to: '/challenge/$challengeId',
@@ -71,13 +67,7 @@ export const NavigationActions = ({
})
}
} catch {
- toast.error(
- t(
- 'taskEditPage.taskActions.navigation.loadNextFailed',
- undefined,
- 'Failed to load next task'
- )
- )
+ toast.error(t('common.failedToLoadNextTask', undefined, 'Failed to load next task'))
} finally {
setIsLoadingRandom(false)
}
@@ -101,7 +91,7 @@ export const NavigationActions = ({
>
{isLoadingNearby ? : }
{isLoadingNearby
- ? t('taskEditPage.taskActions.navigation.loading', undefined, 'Loading...')
+ ? t('common.loading2', undefined, 'Loading...')
: t('taskEditPage.taskActions.navigation.nearbyTask', undefined, 'Nearby task')}
{isLoadingRandom ? : }
{isLoadingRandom
- ? t('taskEditPage.taskActions.navigation.loading', undefined, 'Loading...')
+ ? t('common.loading2', undefined, 'Loading...')
: t('taskEditPage.taskActions.navigation.randomTask', undefined, 'Random task')}
diff --git a/src/components/Pages/TaskEditPage/TaskActions/SkipButton.tsx b/src/components/Pages/TaskEditPage/TaskActions/SkipButton.tsx
index 4d1a1ce72..48845fa37 100644
--- a/src/components/Pages/TaskEditPage/TaskActions/SkipButton.tsx
+++ b/src/components/Pages/TaskEditPage/TaskActions/SkipButton.tsx
@@ -32,11 +32,7 @@ export const SkipButton = ({ task }: { task: Task }) => {
})
} else {
toast.info(
- t(
- 'taskEditPage.taskActions.skipButton.noMoreTasks',
- undefined,
- 'No more tasks available in this challenge'
- )
+ t('common.noMoreTasksInChallenge', undefined, 'No more tasks available in this challenge')
)
await navigate({
to: '/challenge/$challengeId',
diff --git a/src/components/Pages/TaskEditPage/TaskActions/StartMappingActions.tsx b/src/components/Pages/TaskEditPage/TaskActions/StartMappingActions.tsx
index 0a823abee..591400226 100644
--- a/src/components/Pages/TaskEditPage/TaskActions/StartMappingActions.tsx
+++ b/src/components/Pages/TaskEditPage/TaskActions/StartMappingActions.tsx
@@ -23,11 +23,7 @@ export const StartMappingActions = ({ challengeId }: { challengeId: number }) =>
await navigate({ to: '/tasks/$taskId', params: { taskId: String(randomTasks[0].id) } })
} else {
toast.info(
- t(
- 'taskEditPage.taskActions.startMapping.noMoreTasks',
- undefined,
- 'No more tasks available in this challenge'
- )
+ t('common.noMoreTasksInChallenge', undefined, 'No more tasks available in this challenge')
)
await navigate({
to: '/challenge/$challengeId',
@@ -35,13 +31,7 @@ export const StartMappingActions = ({ challengeId }: { challengeId: number }) =>
})
}
} catch {
- toast.error(
- t(
- 'taskEditPage.taskActions.startMapping.loadNextFailed',
- undefined,
- 'Failed to load next task'
- )
- )
+ toast.error(t('common.failedToLoadNextTask', undefined, 'Failed to load next task'))
} finally {
setIsLoadingNext(false)
}
@@ -64,7 +54,7 @@ export const StartMappingActions = ({ challengeId }: { challengeId: number }) =>
>
{isLoadingNext ? : }
{isLoadingNext
- ? t('taskEditPage.taskActions.startMapping.loading', undefined, 'Loading...')
+ ? t('common.loading2', undefined, 'Loading...')
: t('taskEditPage.taskActions.startMapping.differentTask', undefined, 'Different task')}
diff --git a/src/components/Pages/TaskEditPage/TaskActions/TaskActions.tsx b/src/components/Pages/TaskEditPage/TaskActions/TaskActions.tsx
index 0e1a06ec7..cf6db3000 100644
--- a/src/components/Pages/TaskEditPage/TaskActions/TaskActions.tsx
+++ b/src/components/Pages/TaskEditPage/TaskActions/TaskActions.tsx
@@ -68,7 +68,7 @@ export const TaskActions = () => {
undefined,
'Mark as Fixed (Ctrl/Cmd + F)'
),
- label: t('taskEditPage.taskActions.main.fixed', undefined, 'Fixed'),
+ label: t('common.fixed', undefined, 'Fixed'),
},
{
variant: 'info',
@@ -79,7 +79,7 @@ export const TaskActions = () => {
undefined,
'Mark as Already Fixed'
),
- label: t('taskEditPage.taskActions.main.alreadyFixed', undefined, 'Already Fixed'),
+ label: t('common.alreadyFixed', undefined, 'Already Fixed'),
},
{
variant: 'warning',
@@ -101,7 +101,7 @@ export const TaskActions = () => {
undefined,
"Mark as Can't Complete"
),
- label: t('taskEditPage.taskActions.main.cantComplete', undefined, "Can't Complete"),
+ label: t('common.cantComplete', undefined, "Can't Complete"),
},
]
diff --git a/src/components/Pages/TaskEditPage/TaskInfoHeader.tsx b/src/components/Pages/TaskEditPage/TaskInfoHeader.tsx
index df15d73c9..b463f8967 100644
--- a/src/components/Pages/TaskEditPage/TaskInfoHeader.tsx
+++ b/src/components/Pages/TaskEditPage/TaskInfoHeader.tsx
@@ -53,8 +53,7 @@ export const TaskInfoHeader = ({
const { data: project } = api.project.getProject(challenge?.parent)
const status = task.status ?? 0
- const statusLabel =
- STATUS_LABELS[status] || t('taskEditPage.taskInfoHeader.unknownStatus', undefined, 'Unknown')
+ const statusLabel = STATUS_LABELS[status] || t('common.unknown', undefined, 'Unknown')
const statusColor = STATUS_COLORS[status] || 'bg-zinc-500'
// Only show edit actions if user is authenticated, has locked the task, and status is editable
@@ -105,7 +104,7 @@ export const TaskInfoHeader = ({
{relation === 'primary' && (
- {t('taskEditPage.taskInfoHeader.primary', undefined, 'Primary')}
+ {t('common.primary', undefined, 'Primary')}
)}
@@ -131,8 +130,8 @@ export const TaskInfoHeader = ({
variant="ghost"
size="icon-sm"
onClick={handleZoomToTask}
- aria-label={t('taskEditPage.taskInfoHeader.zoomToTask', undefined, 'Zoom to task')}
- title={t('taskEditPage.taskInfoHeader.zoomToTask', undefined, 'Zoom to task')}
+ aria-label={t('common.zoomToTask', undefined, 'Zoom to task')}
+ title={t('common.zoomToTask', undefined, 'Zoom to task')}
>
@@ -141,8 +140,8 @@ export const TaskInfoHeader = ({
@@ -152,12 +151,8 @@ export const TaskInfoHeader = ({
url={`${window.location.origin}/tasks/${task.id}`}
title={
task.name
- ? t(
- 'taskEditPage.taskInfoHeader.shareTitleNamed',
- { name: task.name },
- 'Task: {name}'
- )
- : t('taskEditPage.taskInfoHeader.shareTitleId', { id: task.id }, 'Task #{id}')
+ ? t('common.taskWithName', { name: task.name }, 'Task: {name}')
+ : t('common.taskWithId', { id: task.id }, 'Task #{id}')
}
description={challenge?.name}
/>
@@ -168,13 +163,13 @@ export const TaskInfoHeader = ({
variant="ghost"
size="icon-sm"
asChild
- title={t('taskEditPage.taskInfoHeader.viewOnOsm', undefined, 'View on OSM')}
+ title={t('common.viewOnOsm', undefined, 'View on OSM')}
>
@@ -186,8 +181,8 @@ export const TaskInfoHeader = ({
variant="ghost"
size="icon-sm"
onClick={onClose}
- aria-label={t('taskEditPage.taskInfoHeader.closeTask', undefined, 'Close task')}
- title={t('taskEditPage.taskInfoHeader.closeTask', undefined, 'Close task')}
+ aria-label={t('common.closeTask', undefined, 'Close task')}
+ title={t('common.closeTask', undefined, 'Close task')}
>
@@ -197,7 +192,7 @@ export const TaskInfoHeader = ({
{/* Task ID */}
- {t('taskEditPage.taskInfoHeader.taskId', { id: task.id }, 'Task #{id}')}
+ {t('common.taskWithId', { id: task.id }, 'Task #{id}')}
{/* Challenge › Project breadcrumb */}
diff --git a/src/components/Pages/TaskEditPage/TaskMap/useTaskMapShortcuts.ts b/src/components/Pages/TaskEditPage/TaskMap/useTaskMapShortcuts.ts
index 340e78965..dfb643d4d 100644
--- a/src/components/Pages/TaskEditPage/TaskMap/useTaskMapShortcuts.ts
+++ b/src/components/Pages/TaskEditPage/TaskMap/useTaskMapShortcuts.ts
@@ -35,7 +35,7 @@ export const useTaskMapShortcuts = () => {
undefined,
'Toggle filter (show bundled tasks only)'
),
- category: t('taskMap.shortcuts.categoryMap', undefined, 'Map'),
+ category: t('common.map', undefined, 'Map'),
handler: () => setShowBundleOnly(!showBundleOnly),
enabled: !!activeBundle,
},
@@ -46,7 +46,7 @@ export const useTaskMapShortcuts = () => {
undefined,
'Toggle all markers visibility'
),
- category: t('taskMap.shortcuts.categoryMap', undefined, 'Map'),
+ category: t('common.map', undefined, 'Map'),
handler: () => setMarkersHidden(!markersHidden),
enabled: true,
},
@@ -60,7 +60,7 @@ export const useTaskMapShortcuts = () => {
{
key: 'Esc',
description: t('taskMap.shortcuts.cancelDrawing', undefined, 'Cancel drawing'),
- category: t('taskMap.shortcuts.categoryMap', undefined, 'Map'),
+ category: t('common.map', undefined, 'Map'),
handler: () => cancelDrawing(),
enabled: !!drawingMode,
},
diff --git a/src/components/Pages/TaskEditPage/TaskNearbyMap.tsx b/src/components/Pages/TaskEditPage/TaskNearbyMap.tsx
index 81478f6a1..850a033af 100644
--- a/src/components/Pages/TaskEditPage/TaskNearbyMap.tsx
+++ b/src/components/Pages/TaskEditPage/TaskNearbyMap.tsx
@@ -155,7 +155,7 @@ export const TaskNearbyMap = ({
- {t('taskEditPage.taskNearbyMap.current', undefined, 'Current')}
+ {t('common.current', undefined, 'Current')}
diff --git a/src/components/Pages/TeamsPage/EditTeamPage.tsx b/src/components/Pages/TeamsPage/EditTeamPage.tsx
index a04031bd1..7d4db6e4b 100644
--- a/src/components/Pages/TeamsPage/EditTeamPage.tsx
+++ b/src/components/Pages/TeamsPage/EditTeamPage.tsx
@@ -15,7 +15,7 @@ export const EditTeamPage = ({ teamId }: Props) => {
if (!team)
return (
- {t('teams.editTeam.notFound', undefined, 'Team not found.')}
+ {t('common.teamNotFound', undefined, 'Team not found.')}
)
diff --git a/src/components/Pages/TeamsPage/InviteMemberDialog.tsx b/src/components/Pages/TeamsPage/InviteMemberDialog.tsx
index fa2e5d532..9b095e7a7 100644
--- a/src/components/Pages/TeamsPage/InviteMemberDialog.tsx
+++ b/src/components/Pages/TeamsPage/InviteMemberDialog.tsx
@@ -74,11 +74,7 @@ export const InviteMemberDialog = ({ teamId, open, onOpenChange }: Props) => {
setQuery(e.target.value)}
- placeholder={t(
- 'teams.inviteMember.searchPlaceholder',
- undefined,
- 'Search OSM username'
- )}
+ placeholder={t('common.searchOsmUsername', undefined, 'Search OSM username')}
className="pl-8"
/>
@@ -110,12 +106,8 @@ export const InviteMemberDialog = ({ teamId, open, onOpenChange }: Props) => {
-
- {t('teams.inviteMember.roleMember', undefined, 'Member')}
-
-
- {t('teams.inviteMember.roleAdmin', undefined, 'Admin')}
-
+ {t('common.member', undefined, 'Member')}
+ {t('common.admin', undefined, 'Admin')}
diff --git a/src/components/Pages/TeamsPage/PendingInvitesSection.tsx b/src/components/Pages/TeamsPage/PendingInvitesSection.tsx
index 980bf0a7d..5cd785fbc 100644
--- a/src/components/Pages/TeamsPage/PendingInvitesSection.tsx
+++ b/src/components/Pages/TeamsPage/PendingInvitesSection.tsx
@@ -56,12 +56,7 @@ export const PendingInvitesSection = ({ invites }: Props) => {
- {invite.name ||
- t(
- 'teams.pendingInvites.teamFallbackName',
- { teamId: invite.teamId },
- 'Team #{teamId}'
- )}
+ {invite.name || t('common.team', { teamId: invite.teamId }, 'Team #{teamId}')}
= {
export const TeamCard = ({ membership }: Props) => {
const { t } = useIntl()
- const name =
- membership.name ||
- t('teams.card.teamFallbackName', { teamId: membership.teamId }, 'Team #{teamId}')
+ const name = membership.name || t('common.team', { teamId: membership.teamId }, 'Team #{teamId}')
const role = membership.status as TeamRole
return (
@@ -40,7 +38,7 @@ export const TeamCard = ({ membership }: Props) => {
roleBadge[role]
)}
>
- {TeamRoleLabel[role] ?? t('teams.card.unknownRole', undefined, 'Unknown')}
+ {TeamRoleLabel[role] ?? t('common.unknown', undefined, 'Unknown')}
diff --git a/src/components/Pages/TeamsPage/TeamDetailPage.tsx b/src/components/Pages/TeamsPage/TeamDetailPage.tsx
index 9c8331484..26908332f 100644
--- a/src/components/Pages/TeamsPage/TeamDetailPage.tsx
+++ b/src/components/Pages/TeamsPage/TeamDetailPage.tsx
@@ -73,7 +73,7 @@ const MemberRow = ({
{member.name}
- {TeamRoleLabel[role] ?? t('teams.detail.unknownRole', undefined, 'Unknown')}
+ {TeamRoleLabel[role] ?? t('common.unknown', undefined, 'Unknown')}
{isAdmin && member.userId !== currentUserId && (
@@ -131,7 +131,7 @@ export const TeamDetailPage = ({ teamId }: Props) => {
if (!team) {
return (
- {t('teams.detail.notFound', undefined, 'Team not found.')}
+ {t('common.teamNotFound', undefined, 'Team not found.')}
)
}
@@ -237,7 +237,7 @@ export const TeamDetailPage = ({ teamId }: Props) => {
{invited.length > 0 && iAmAdmin && (
- {t('teams.detail.invitedHeading', undefined, 'Invited')}
+ {t('common.invited', undefined, 'Invited')}
{invited.map((m) => (
diff --git a/src/components/Pages/TeamsPage/TeamForm.tsx b/src/components/Pages/TeamsPage/TeamForm.tsx
index f31c847a4..a3248878b 100644
--- a/src/components/Pages/TeamsPage/TeamForm.tsx
+++ b/src/components/Pages/TeamsPage/TeamForm.tsx
@@ -68,7 +68,7 @@ export const TeamForm = ({ team }: Props) => {
name="name"
render={({ field }) => (
- {t('teams.form.nameLabel', undefined, 'Name')}
+ {t('common.name', undefined, 'Name')}
@@ -81,7 +81,7 @@ export const TeamForm = ({ team }: Props) => {
name="description"
render={({ field }) => (
- {t('teams.form.descriptionLabel', undefined, 'Description')}
+ {t('common.description', undefined, 'Description')}
@@ -116,7 +116,7 @@ export const TeamForm = ({ team }: Props) => {
{team
? t('common.save', undefined, 'Save')
- : t('teams.form.createButton', undefined, 'Create team')}
+ : t('common.createTeam', undefined, 'Create team')}
diff --git a/src/components/Pages/TeamsPage/TeamsList.tsx b/src/components/Pages/TeamsPage/TeamsList.tsx
index 02a750abe..504465acc 100644
--- a/src/components/Pages/TeamsPage/TeamsList.tsx
+++ b/src/components/Pages/TeamsPage/TeamsList.tsx
@@ -22,11 +22,11 @@ export const TeamsList = () => {
return (
-
{t('teams.list.title', undefined, 'Teams')}
+
{t('common.teams', undefined, 'Teams')}
{' '}
- {t('teams.list.createButton', undefined, 'Create team')}
+ {t('common.createTeam', undefined, 'Create team')}
@@ -49,7 +49,7 @@ export const TeamsList = () => {
- {t('teams.list.createButton', undefined, 'Create team')}
+ {t('common.createTeam', undefined, 'Create team')}
) : (
diff --git a/src/components/TaskInfoPanel/CommentsHistoryTab.tsx b/src/components/TaskInfoPanel/CommentsHistoryTab.tsx
index c27c99f8c..1fa1ae54c 100644
--- a/src/components/TaskInfoPanel/CommentsHistoryTab.tsx
+++ b/src/components/TaskInfoPanel/CommentsHistoryTab.tsx
@@ -85,9 +85,7 @@ const StatusPill = ({ status, muted = false }: { status: number; muted?: boolean
const { t } = useIntl()
const Icon = STATUS_ICONS[status] ?? HelpCircle
const pill = STATUS_PILL_COLORS[status] ?? DEFAULT_PILL_CLASS
- const label =
- STATUS_LABELS[status] ??
- t('taskInfoPanel.comments.statusFallback', { status }, 'Status {status}')
+ const label = STATUS_LABELS[status] ?? t('common.statusWithStatus', { status }, 'Status {status}')
return (
{
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault()
if (!commentText.trim()) {
- toast.error(
- t('taskInfoPanel.comments.emptyCommentError', undefined, 'Please enter a comment')
- )
+ toast.error(t('common.pleaseEnterAComment', undefined, 'Please enter a comment'))
return
}
if (!user) {
toast.error(
- t('taskInfoPanel.comments.notSignedInError', undefined, 'You must be logged in to comment')
+ t('common.youMustBeLoggedInToComment', undefined, 'You must be logged in to comment')
)
return
}
@@ -137,7 +133,7 @@ export const CommentsHistoryTab = () => {
},
onError: (error) => {
logger.error('Error adding comment', { error })
- toast.error(t('taskInfoPanel.comments.addError', undefined, 'Failed to add comment'))
+ toast.error(t('common.failedToAddComment', undefined, 'Failed to add comment'))
},
}
)
@@ -318,11 +314,7 @@ export const CommentsHistoryTab = () => {
ref={textareaRef}
value={commentText}
onChange={(e) => setCommentText(e.target.value)}
- placeholder={t(
- 'taskInfoPanel.comments.inputPlaceholder',
- undefined,
- 'Add a comment...'
- )}
+ placeholder={t('common.addAComment', undefined, 'Add a comment...')}
rows={2}
className="flex-1 resize-none text-sm"
maxLength={5000}
diff --git a/src/components/TaskInfoPanel/OSMHistoryTab/ElementHistoryCard.tsx b/src/components/TaskInfoPanel/OSMHistoryTab/ElementHistoryCard.tsx
index 94a2d1f91..24b47a71a 100644
--- a/src/components/TaskInfoPanel/OSMHistoryTab/ElementHistoryCard.tsx
+++ b/src/components/TaskInfoPanel/OSMHistoryTab/ElementHistoryCard.tsx
@@ -83,11 +83,7 @@ export const ElementHistoryCard = ({ osmFeature, osmServer }: ElementHistoryCard
{entry.visible === false && (
- {t(
- 'taskInfoPanel.osmHistory.elementHistory.deleted',
- undefined,
- 'deleted'
- )}
+ {t('common.deleted2', undefined, 'deleted')}
)}
diff --git a/src/components/TaskInfoPanel/OSMHistoryTab/TaskTimelineCard.tsx b/src/components/TaskInfoPanel/OSMHistoryTab/TaskTimelineCard.tsx
index d06e4d59b..69cb01fda 100644
--- a/src/components/TaskInfoPanel/OSMHistoryTab/TaskTimelineCard.tsx
+++ b/src/components/TaskInfoPanel/OSMHistoryTab/TaskTimelineCard.tsx
@@ -17,7 +17,7 @@ export const TaskTimelineCard = ({ task }: TaskTimelineCardProps) => {
- {t('taskInfoPanel.osmHistory.timeline.created', undefined, 'Created')}
+ {t('common.created', undefined, 'Created')}
{formatDate(new Date(task.created))}
diff --git a/src/components/TaskInfoPanel/TaskInfoDrawer.tsx b/src/components/TaskInfoPanel/TaskInfoDrawer.tsx
index 4cee02508..155c8a291 100644
--- a/src/components/TaskInfoPanel/TaskInfoDrawer.tsx
+++ b/src/components/TaskInfoPanel/TaskInfoDrawer.tsx
@@ -87,8 +87,7 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
}
const status = task?.status ?? selectedTask?.status ?? 0
- const statusLabel =
- STATUS_LABELS[status] || t('taskInfoPanel.drawer.unknownStatus', undefined, 'Unknown')
+ const statusLabel = STATUS_LABELS[status] || t('common.unknown', undefined, 'Unknown')
const statusColor = STATUS_COLORS[status] || 'bg-zinc-500'
const osmFeature = task ? parseOsmFeatureFromTask(task) : null
@@ -137,8 +136,8 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
variant="ghost"
size="icon-sm"
onClick={handleZoomToTask}
- aria-label={t('taskInfoPanel.drawer.zoomToTask', undefined, 'Zoom to task')}
- title={t('taskInfoPanel.drawer.zoomToTask', undefined, 'Zoom to task')}
+ aria-label={t('common.zoomToTask', undefined, 'Zoom to task')}
+ title={t('common.zoomToTask', undefined, 'Zoom to task')}
>
@@ -149,8 +148,8 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
@@ -160,16 +159,8 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
url={`${window.location.origin}/tasks/${task.id}`}
title={
task.name
- ? t(
- 'taskInfoPanel.drawer.shareTitleNamed',
- { name: task.name },
- 'Task: {name}'
- )
- : t(
- 'taskInfoPanel.drawer.shareTitleNumbered',
- { id: task.id },
- 'Task #{id}'
- )
+ ? t('common.taskWithName', { name: task.name }, 'Task: {name}')
+ : t('common.taskWithId', { id: task.id }, 'Task #{id}')
}
description={challenge?.name}
/>
@@ -181,13 +172,13 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
variant="ghost"
size="icon-sm"
asChild
- title={t('taskInfoPanel.drawer.viewOnOsm', undefined, 'View on OSM')}
+ title={t('common.viewOnOsm', undefined, 'View on OSM')}
>
@@ -197,8 +188,8 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
variant="ghost"
size="icon-sm"
onClick={onClose}
- aria-label={t('taskInfoPanel.drawer.closeTask', undefined, 'Close task')}
- title={t('taskInfoPanel.drawer.closeTask', undefined, 'Close task')}
+ aria-label={t('common.closeTask', undefined, 'Close task')}
+ title={t('common.closeTask', undefined, 'Close task')}
>
@@ -207,7 +198,7 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
{/* Task ID */}
- {t('taskInfoPanel.drawer.taskIdLabel', { id: selectedTask?.id ?? '' }, 'Task #{id}')}
+ {t('common.taskWithId', { id: selectedTask?.id ?? '' }, 'Task #{id}')}
{/* Challenge › Project breadcrumb */}
@@ -263,7 +254,7 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
{t(
- 'taskInfoPanel.drawer.bundledTasksHeading',
+ 'common.bundledTasks',
{ count: bundleData.taskIds.length - 1 },
'Bundled Tasks ({count})'
)}
@@ -285,7 +276,7 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
className="flex h-8 w-full items-center rounded-lg border border-zinc-200 bg-zinc-50 px-3 text-left text-sm transition-colors hover:border-blue-300 hover:bg-blue-50 dark:border-slate-700 dark:bg-slate-900 dark:hover:border-blue-700 dark:hover:bg-blue-950/30"
>
- {t('taskInfoPanel.drawer.taskIdLabel', { id: taskId }, 'Task #{id}')}
+ {t('common.taskWithId', { id: taskId }, 'Task #{id}')}
))}
@@ -297,7 +288,7 @@ export const TaskInfoDrawer = ({ selectedTask, onClose, mapRef }: TaskInfoDrawer
{challenge?.instruction && task && (
- {t('taskInfoPanel.drawer.instructionsHeading', undefined, 'Instructions')}
+ {t('common.instructions', undefined, 'Instructions')}
- {t(
- 'taskInfoPanel.taskTab.bundleList.title',
- { count: taskIds.length },
- 'Bundled Tasks ({count})'
- )}
+ {t('common.bundledTasks', { count: taskIds.length }, 'Bundled Tasks ({count})')}
{activeView === 'id' && (
{isPrimary && }
- {t('taskInfoPanel.taskTab.bundleList.taskLabel', { id: taskId }, 'Task #{id}')}
+ {t('common.taskWithId', { id: taskId }, 'Task #{id}')}
{isPrimary && (
- {t('taskInfoPanel.taskTab.bundleList.primary', undefined, 'Primary')}
+ {t('common.primary', undefined, 'Primary')}
)}
diff --git a/src/components/TaskInfoPanel/TaskTab/InstructionPanel.tsx b/src/components/TaskInfoPanel/TaskTab/InstructionPanel.tsx
index 6affd884a..7cf75b931 100644
--- a/src/components/TaskInfoPanel/TaskTab/InstructionPanel.tsx
+++ b/src/components/TaskInfoPanel/TaskTab/InstructionPanel.tsx
@@ -60,7 +60,7 @@ export const InstructionPanel = ({
: 'text-zinc-500 hover:text-zinc-700 dark:text-slate-400 dark:hover:text-slate-300'
)}
>
- {t('taskInfoPanel.taskTab.instructions.taskView', undefined, 'Task')}
+ {t('common.task', undefined, 'Task')}
- {t('taskInfoPanel.taskTab.instructions.challengeView', undefined, 'Challenge')}
+ {t('common.challenge', undefined, 'Challenge')}
diff --git a/src/components/TaskInfoPanel/TaskTabsList.tsx b/src/components/TaskInfoPanel/TaskTabsList.tsx
index 06631b0bf..f1cd09340 100644
--- a/src/components/TaskInfoPanel/TaskTabsList.tsx
+++ b/src/components/TaskInfoPanel/TaskTabsList.tsx
@@ -15,9 +15,7 @@ export const TaskTabsList = ({ commentsCount, osmHistoryCount }: TaskTabsListPro
-
- {t('taskInfoPanel.tabs.instructions', undefined, 'Instructions')}
-
+ {t('common.instructions', undefined, 'Instructions')}
diff --git a/src/components/shared/ChallengeCard.tsx b/src/components/shared/ChallengeCard.tsx
index ae9b09708..25584442d 100644
--- a/src/components/shared/ChallengeCard.tsx
+++ b/src/components/shared/ChallengeCard.tsx
@@ -85,10 +85,10 @@ export const ChallengeCard = ({
{totalTasks} {' '}
- {t('shared.challengeCard.tasks', undefined, 'tasks')}
+ {t('common.tasks2', undefined, 'tasks')}
{' · '}
{pct}% {' '}
- {t('shared.challengeCard.complete', undefined, 'complete')}
+ {t('common.complete', undefined, 'complete')}
{t(
- 'shared.challengeCard.lastUpdated',
+ 'common.lastUpdated',
{ date: formatDate(new Date(lastUpdated)) },
'Last updated {date}'
)}
diff --git a/src/components/shared/CommentComposer/CommentComposer.tsx b/src/components/shared/CommentComposer/CommentComposer.tsx
index 5f9ed7ad8..8ed951b61 100644
--- a/src/components/shared/CommentComposer/CommentComposer.tsx
+++ b/src/components/shared/CommentComposer/CommentComposer.tsx
@@ -56,12 +56,8 @@ export const CommentComposer = ({
-
- {t('shared.commentComposer.writeTab', undefined, 'Write')}
-
-
- {t('shared.commentComposer.previewTab', undefined, 'Preview')}
-
+ {t('common.write', undefined, 'Write')}
+ {t('common.preview', undefined, 'Preview')}
{value}
) : (
- {t('shared.commentComposer.nothingToPreview', undefined, 'Nothing to preview')}
+ {t('common.nothingToPreview', undefined, 'Nothing to preview')}
)}
diff --git a/src/components/shared/CommentList/CommentItem.tsx b/src/components/shared/CommentList/CommentItem.tsx
index de6b6714e..8d085cfd3 100644
--- a/src/components/shared/CommentList/CommentItem.tsx
+++ b/src/components/shared/CommentList/CommentItem.tsx
@@ -52,7 +52,7 @@ export const CommentItem = ({
className="text-teal-600 text-xs hover:underline dark:text-teal-400"
>
{t(
- 'commentList.item.challengeLink',
+ 'common.challengeWithChallengeId',
{ challengeId: comment.challengeId },
'Challenge #{challengeId}'
)}
@@ -64,7 +64,7 @@ export const CommentItem = ({
params={{ taskId: String(comment.taskId) }}
className="text-teal-600 text-xs hover:underline dark:text-teal-400"
>
- {t('commentList.item.taskLink', { taskId: comment.taskId }, 'Task #{taskId}')}
+ {t('common.taskWithTaskId', { taskId: comment.taskId }, 'Task #{taskId}')}
)}
@@ -77,8 +77,7 @@ export const CommentItem = ({
className="mt-1 h-7 px-2 text-xs"
onClick={() => onReply(comment)}
>
- {' '}
- {t('commentList.item.reply', undefined, 'Reply')}
+ {t('common.reply', undefined, 'Reply')}
)}
diff --git a/src/components/shared/ConfigureColumnsDialog/ConfigureColumnsDialog.tsx b/src/components/shared/ConfigureColumnsDialog/ConfigureColumnsDialog.tsx
index 7ff81d456..9da2ab010 100644
--- a/src/components/shared/ConfigureColumnsDialog/ConfigureColumnsDialog.tsx
+++ b/src/components/shared/ConfigureColumnsDialog/ConfigureColumnsDialog.tsx
@@ -44,7 +44,7 @@ export const ConfigureColumnsDialog = ({
- {t('configureColumnsDialog.available', undefined, 'Available')}
+ {t('common.available', undefined, 'Available')}
{available.length === 0 && (
@@ -63,9 +63,7 @@ export const ConfigureColumnsDialog = ({
-
- {t('configureColumnsDialog.shown', undefined, 'Shown')}
-
+
{t('common.shown', undefined, 'Shown')}
{added.map((key, index) => (
diff --git a/src/components/shared/NotFound.tsx b/src/components/shared/NotFound.tsx
index 2c2c8b3d0..70cdc9984 100644
--- a/src/components/shared/NotFound.tsx
+++ b/src/components/shared/NotFound.tsx
@@ -20,7 +20,7 @@ export const NotFound = ({ className, ...props }: React.ComponentProps
- {t('shared.notFound.title', undefined, 'Page Not Found')}
+ {t('common.pageNotFound', undefined, 'Page Not Found')}
{t(
'shared.notFound.description',
diff --git a/src/components/shared/ProjectCard.tsx b/src/components/shared/ProjectCard.tsx
index 1402ce718..0548ab299 100644
--- a/src/components/shared/ProjectCard.tsx
+++ b/src/components/shared/ProjectCard.tsx
@@ -60,7 +60,7 @@ export const ProjectCard = ({
{meta.totalChallenges - meta.completed} / {meta.totalChallenges}
{' '}
- {t('shared.projectCard.tasksRemaining', undefined, 'tasks remaining')}
+ {t('common.tasksRemaining2', undefined, 'tasks remaining')}
@@ -86,7 +86,7 @@ export const ProjectCard = ({
{lastUpdated ? (
{t(
- 'shared.projectCard.lastUpdated',
+ 'common.lastUpdated',
{ date: formatDate(new Date(lastUpdated)) },
'Last updated {date}'
)}
diff --git a/src/components/shared/ProjectPickerModal.tsx b/src/components/shared/ProjectPickerModal.tsx
index 8f29e48d6..91e5414c8 100644
--- a/src/components/shared/ProjectPickerModal.tsx
+++ b/src/components/shared/ProjectPickerModal.tsx
@@ -40,7 +40,7 @@ export const ProjectPickerModal = ({
excludeProjectIds,
}: ProjectPickerModalProps) => {
const { t } = useIntl()
- const resolvedTitle = title ?? t('shared.projectPickerModal.title', undefined, 'Select a project')
+ const resolvedTitle = title ?? t('common.selectAProject', undefined, 'Select a project')
const resolvedDescription =
description ??
t(
@@ -115,32 +115,28 @@ export const ProjectPickerModal = ({
{project.id != null && (
- {t(
- 'shared.projectPickerModal.projectId',
- { id: project.id },
- '(ID: {id})'
- )}
+ {t('common.idNumberParenthetical', { id: project.id }, '(ID: {id})')}
)}
@@ -219,10 +211,10 @@ export const ProjectPickerModal = ({
{isFetching ? (
<>
- {t('shared.projectPickerModal.loading', undefined, 'Loading...')}
+ {t('common.loading2', undefined, 'Loading...')}
>
) : (
- t('shared.projectPickerModal.loadMore', undefined, 'Load More')
+ t('common.loadMore', undefined, 'Load More')
)}
diff --git a/src/components/shared/ShareLink/SharePopoverContent.tsx b/src/components/shared/ShareLink/SharePopoverContent.tsx
index e691ce624..3037d058b 100644
--- a/src/components/shared/ShareLink/SharePopoverContent.tsx
+++ b/src/components/shared/ShareLink/SharePopoverContent.tsx
@@ -78,7 +78,7 @@ export const SharePopoverContent = ({ url, title, description }: Props) => {
copy(url)
toast.success(t('shareLink.popover.copied', undefined, 'Copied to clipboard'))
}}
- aria-label={t('shareLink.popover.copyUrl', undefined, 'Copy URL')}
+ aria-label={t('common.copyUrl', undefined, 'Copy URL')}
>
{isCopied ? (
diff --git a/src/components/shared/SignIn.tsx b/src/components/shared/SignIn.tsx
index 7304d033c..abb4a478c 100644
--- a/src/components/shared/SignIn.tsx
+++ b/src/components/shared/SignIn.tsx
@@ -32,7 +32,7 @@ export const SignIn = ({ className, ...props }: React.ComponentProps
- {t('shared.signIn.action', undefined, 'Sign in')}
+ {t('common.signIn', undefined, 'Sign in')}
diff --git a/src/components/shared/StatusBadge.tsx b/src/components/shared/StatusBadge.tsx
index fbccb8646..9a2f71b23 100644
--- a/src/components/shared/StatusBadge.tsx
+++ b/src/components/shared/StatusBadge.tsx
@@ -22,7 +22,7 @@ export const StatusBadge = ({ enabled, className }: StatusBadgeProps) => {
variant={enabled ? 'default' : 'secondary'}
title={
enabled
- ? t('shared.statusBadge.discoverable', undefined, 'Discoverable')
+ ? t('common.discoverable', undefined, 'Discoverable')
: t('shared.statusBadge.notDiscoverable', undefined, 'Not discoverable')
}
>
diff --git a/src/components/shared/TaskTags/TaskTags.tsx b/src/components/shared/TaskTags/TaskTags.tsx
index ba88812f7..22f719a5e 100644
--- a/src/components/shared/TaskTags/TaskTags.tsx
+++ b/src/components/shared/TaskTags/TaskTags.tsx
@@ -54,8 +54,7 @@ export const TaskTags = ({ task, challenge }: Props) => {
onClick={() => setEditing(true)}
aria-label={t('taskTags.taskTags.editTags', undefined, 'Edit tags')}
>
- {' '}
- {t('taskTags.taskTags.edit', undefined, 'Edit')}
+ {t('common.edit', undefined, 'Edit')}
)}
{editing && (
diff --git a/src/components/shared/TaskTags/TaskTagsDialog.tsx b/src/components/shared/TaskTags/TaskTagsDialog.tsx
index 24c6a621f..ac5897ee8 100644
--- a/src/components/shared/TaskTags/TaskTagsDialog.tsx
+++ b/src/components/shared/TaskTags/TaskTagsDialog.tsx
@@ -71,7 +71,7 @@ export const TaskTagsDialog = ({
{mutation.isPending
- ? t('taskTags.dialog.saving', undefined, 'Saving…')
+ ? t('common.saving', undefined, 'Saving…')
: t('common.save', undefined, 'Save')}
diff --git a/src/components/shared/TopChallengesList/TopChallengeRow.tsx b/src/components/shared/TopChallengesList/TopChallengeRow.tsx
index 178b197bf..11ac96c81 100644
--- a/src/components/shared/TopChallengesList/TopChallengeRow.tsx
+++ b/src/components/shared/TopChallengesList/TopChallengeRow.tsx
@@ -28,7 +28,7 @@ export const TopChallengeRow = ({ rank, challenge, maxActivity }: Props) => {
{t(
- 'topChallenges.row.taskCount',
+ 'common.tasksWithCount',
{ count: challenge.activity.toLocaleString() },
'{count} tasks'
)}
diff --git a/src/components/shared/ViewModeToggle.tsx b/src/components/shared/ViewModeToggle.tsx
index 312157812..e3addf7f1 100644
--- a/src/components/shared/ViewModeToggle.tsx
+++ b/src/components/shared/ViewModeToggle.tsx
@@ -23,7 +23,7 @@ export const ViewModeToggle = ({ value, onValueChange }: ViewModeToggleProps) =>
>
@@ -31,7 +31,7 @@ export const ViewModeToggle = ({ value, onValueChange }: ViewModeToggleProps) =>
diff --git a/src/components/ui/Loader.tsx b/src/components/ui/Loader.tsx
index b64d23a06..37d599bc8 100644
--- a/src/components/ui/Loader.tsx
+++ b/src/components/ui/Loader.tsx
@@ -12,7 +12,7 @@ export const Loader = ({
isFullScreen?: boolean
}) => {
const { t } = useIntl()
- const displayMessage = message ?? t('ui.loader.message', undefined, 'Loading...')
+ const displayMessage = message ?? t('common.loading2', undefined, 'Loading...')
return (
executeMutation(
deleteNotificationMutation,
ids,
- t('notifications.actions.deleted', undefined, 'deleted'),
+ t('common.deleted2', undefined, 'deleted'),
setDeletingId,
notificationId
)
diff --git a/src/i18n/messages/en-US.json b/src/i18n/messages/en-US.json
index cd32b7338..9c27c84e9 100644
--- a/src/i18n/messages/en-US.json
+++ b/src/i18n/messages/en-US.json
@@ -2,86 +2,39 @@
"appLayout.betaBanner.message": "This is a beta version of MapRoulette and is actively being worked on. Some features may be incomplete or unavailable.",
"appLayout.dismissibleBanner.dismiss": "Dismiss banner",
"appLayout.header.appName": "MapRoulette",
- "appLayout.header.globalSearch.findById.challengeFallbackName": "Challenge #{id}",
- "appLayout.header.globalSearch.findById.challengeLabel": "Challenge",
"appLayout.header.globalSearch.findById.enterNumericId": "Enter a numeric ID",
"appLayout.header.globalSearch.findById.hint": "Enter a numeric ID to find a project, challenge, or task",
"appLayout.header.globalSearch.findById.lookingUpId": "Looking up ID {id}...",
"appLayout.header.globalSearch.findById.matchCount": "{count} match{plural}",
"appLayout.header.globalSearch.findById.noResults": "No results for ID {id}",
"appLayout.header.globalSearch.findById.noResultsHint": "No project, challenge, or task found with this ID",
- "appLayout.header.globalSearch.findById.projectFallbackName": "Project #{id}",
- "appLayout.header.globalSearch.findById.projectLabel": "Project",
"appLayout.header.globalSearch.findById.resultsForId": "Results for ID {id}",
- "appLayout.header.globalSearch.findById.taskFallbackName": "Task #{id}",
- "appLayout.header.globalSearch.findById.taskLabel": "Task",
- "appLayout.header.globalSearch.findById.title": "Find by MapRoulette ID",
"appLayout.header.globalSearch.findById.typeIdHint": "Type a project, challenge, or task ID number",
- "appLayout.header.globalSearch.findById.updatingResults": "Updating results...",
- "appLayout.header.globalSearch.findChallenge.endOfResults": "That's all!",
- "appLayout.header.globalSearch.findChallenge.loading": "Loading challenges...",
"appLayout.header.globalSearch.findChallenge.loadingMore": "Loading more challenges...",
"appLayout.header.globalSearch.findChallenge.noMoreToLoad": "No more challenges to load",
- "appLayout.header.globalSearch.findChallenge.noResults": "No challenges found",
"appLayout.header.globalSearch.findChallenge.noResultsHint": "Try adjusting your filters",
"appLayout.header.globalSearch.findChallenge.resultCount": "{count} challenge{plural}",
- "appLayout.header.globalSearch.findChallenge.results": "Results",
"appLayout.header.globalSearch.findComments.byUser": "by {username}",
- "appLayout.header.globalSearch.findComments.challengeLabel": "Challenge",
- "appLayout.header.globalSearch.findComments.challengeRef": "Challenge #{id}",
"appLayout.header.globalSearch.findComments.commentCount": "{count} comment{plural}",
"appLayout.header.globalSearch.findComments.loading": "Loading comments...",
"appLayout.header.globalSearch.findComments.noCommentsMatch": "No {label} comments match \"{query}\"",
"appLayout.header.globalSearch.findComments.noCommentsYet": "No {label} comments yet",
- "appLayout.header.globalSearch.findComments.noResultsFound": "No results found",
"appLayout.header.globalSearch.findComments.recentComments": "Recent {label} Comments",
- "appLayout.header.globalSearch.findComments.results": "Results",
- "appLayout.header.globalSearch.findComments.taskLabel": "Task",
- "appLayout.header.globalSearch.findComments.taskRef": "Task #{id}",
- "appLayout.header.globalSearch.findComments.updatingResults": "Updating results...",
- "appLayout.header.globalSearch.findFeatureByName.challenges": "Challenges",
"appLayout.header.globalSearch.findFeatureByName.exploreChallenges": "Explore Challenges",
"appLayout.header.globalSearch.findFeatureByName.featuredProjects": "Featured Projects",
- "appLayout.header.globalSearch.findFeatureByName.loading": "Loading...",
- "appLayout.header.globalSearch.findFeatureByName.noResults": "No results found",
"appLayout.header.globalSearch.findFeatureByName.nothingMatches": "Nothing matches \"{query}\"",
- "appLayout.header.globalSearch.findFeatureByName.projects": "Projects",
"appLayout.header.globalSearch.findFeatureByName.resultCount": "{count} result{plural}",
- "appLayout.header.globalSearch.findFeatureByName.status.alreadyFixed": "Already Fixed",
- "appLayout.header.globalSearch.findFeatureByName.status.cantComplete": "Can't Complete",
- "appLayout.header.globalSearch.findFeatureByName.status.created": "Created",
- "appLayout.header.globalSearch.findFeatureByName.status.deleted": "Deleted",
- "appLayout.header.globalSearch.findFeatureByName.status.falsePositive": "False Positive",
- "appLayout.header.globalSearch.findFeatureByName.status.fixed": "Fixed",
- "appLayout.header.globalSearch.findFeatureByName.status.skipped": "Skipped",
- "appLayout.header.globalSearch.findFeatureByName.status.unknown": "Unknown",
- "appLayout.header.globalSearch.findFeatureByName.tasks": "Tasks",
- "appLayout.header.globalSearch.findFeatureByName.updatingResults": "Updating results...",
- "appLayout.header.globalSearch.findProject.endOfResults": "That's all!",
"appLayout.header.globalSearch.findProject.loading": "Loading projects...",
"appLayout.header.globalSearch.findProject.loadingMore": "Loading more projects...",
"appLayout.header.globalSearch.findProject.noMoreToLoad": "No more projects to load",
- "appLayout.header.globalSearch.findProject.noResults": "No projects found",
"appLayout.header.globalSearch.findProject.noResultsHint": "Try a different search term",
"appLayout.header.globalSearch.findProject.resultCount": "{count} project{plural}",
- "appLayout.header.globalSearch.findProject.results": "Results",
- "appLayout.header.globalSearch.findTask.challengeRef": "Challenge #{id}",
- "appLayout.header.globalSearch.findTask.fallbackName": "Task #{id}",
"appLayout.header.globalSearch.findTask.found": "Task Found",
"appLayout.header.globalSearch.findTask.hint": "Enter a task ID to look it up",
"appLayout.header.globalSearch.findTask.lookingUp": "Looking up task {id}...",
"appLayout.header.globalSearch.findTask.noResults": "No task found with ID {id}",
"appLayout.header.globalSearch.findTask.noResultsHint": "Try a different task ID",
- "appLayout.header.globalSearch.findTask.status.alreadyFixed": "Already Fixed",
- "appLayout.header.globalSearch.findTask.status.cantComplete": "Can't Complete",
- "appLayout.header.globalSearch.findTask.status.created": "Created",
- "appLayout.header.globalSearch.findTask.status.deleted": "Deleted",
- "appLayout.header.globalSearch.findTask.status.falsePositive": "False Positive",
- "appLayout.header.globalSearch.findTask.status.fixed": "Fixed",
"appLayout.header.globalSearch.findTask.status.label": "Status: {status}",
- "appLayout.header.globalSearch.findTask.status.skipped": "Skipped",
- "appLayout.header.globalSearch.findTask.status.unknown": "Unknown",
- "appLayout.header.globalSearch.findTask.title": "Find a Task",
"appLayout.header.globalSearch.placeholder": "Search for challenges, tasks or projects...",
"appLayout.header.globalSearch.types.challenge.description": "Search for mapping challenges with filters for difficulty, location, and tags",
"appLayout.header.globalSearch.types.challenge.label": "Find a Challenge",
@@ -90,35 +43,21 @@
"appLayout.header.globalSearch.types.featureByName.description": "Search for geographic features like roads, buildings, or landmarks by name",
"appLayout.header.globalSearch.types.featureByName.label": "Find a Feature by Name",
"appLayout.header.globalSearch.types.id.description": "Quickly navigate to any resource (project, challenge, or task) using its ID",
- "appLayout.header.globalSearch.types.id.label": "Find by MapRoulette ID",
"appLayout.header.globalSearch.types.project.description": "Browse projects containing multiple challenges organized by theme or area",
"appLayout.header.globalSearch.types.project.label": "Find a Project",
"appLayout.header.globalSearch.types.task.description": "Search for individual mapping tasks by ID, status, priority, or location",
- "appLayout.header.globalSearch.types.task.label": "Find a Task",
"appLayout.header.globalSearch.types.taskComment.description": "Search through comments left on tasks for discussions and notes",
"appLayout.header.globalSearch.types.taskComment.label": "Find Task Comments",
"appLayout.header.globalSearch.unifiedList.goToChallenge": "Go to challenge",
"appLayout.header.globalSearch.unifiedList.goToProject": "Go to project",
- "appLayout.header.globalSearch.unifiedList.noResults": "No results found",
"appLayout.header.nav.mobile": "Mobile navigation",
"appLayout.header.nav.openInNewTab": "Open {label} in a new tab",
- "appLayout.header.nav.primary": "Primary",
- "appLayout.header.notifications.allTab": "All ({count})",
- "appLayout.header.notifications.emptyAllDescription": "You have no notifications.",
- "appLayout.header.notifications.emptyTitle": "You're all up to date",
- "appLayout.header.notifications.emptyUnreadDescription": "You have no unread notifications at the moment.",
- "appLayout.header.notifications.loading": "Loading notifications...",
- "appLayout.header.notifications.markAllAsRead": "Mark all as read",
"appLayout.header.notifications.triggerLabel": "Notifications for {name}",
"appLayout.header.notifications.unreadSrOnly": "You have unread notifications",
- "appLayout.header.notifications.unreadTab": "Unread ({count})",
- "appLayout.header.notifications.viewAll": "View all notifications",
- "appLayout.header.signIn": "Sign in",
"appLayout.header.signingIn": "signing in...",
"appLayout.header.userMenu.accountSettings": "Account Settings",
"appLayout.header.userMenu.backend": "Backend",
"appLayout.header.userMenu.frontend": "Frontend",
- "appLayout.header.userMenu.manage": "Manage",
"appLayout.header.userMenu.signOut": "Sign out",
"appLayout.header.userMenu.superAdmin": "Super Admin",
"appLayout.header.userMenu.theme": "Theme",
@@ -127,22 +66,11 @@
"browsedChallengePage.actionButtons.alreadyReported": "This challenge has already been reported",
"browsedChallengePage.actionButtons.challengeActions": "Challenge actions",
"browsedChallengePage.actionButtons.challengeReported": "Challenge Reported",
- "browsedChallengePage.actionButtons.cloneChallenge": "Clone Challenge",
"browsedChallengePage.actionButtons.manageChallenge": "Manage Challenge",
"browsedChallengePage.actionButtons.mustLoginToReport": "You must be logged in to report a challenge",
- "browsedChallengePage.actionButtons.overpassQuery": "Overpass Query",
- "browsedChallengePage.actionButtons.reportChallenge": "Report Challenge",
"browsedChallengePage.actionButtons.reportChallengeTitle": "Report challenge",
- "browsedChallengePage.challengeModals.actions.alreadyFixed": "Already Fixed",
- "browsedChallengePage.challengeModals.actions.available": "Available",
"browsedChallengePage.challengeModals.actions.avgTimeSpent": "Average Time Spent",
- "browsedChallengePage.challengeModals.actions.deleted": "Deleted",
- "browsedChallengePage.challengeModals.actions.falsePositive": "False Positive",
- "browsedChallengePage.challengeModals.actions.fixed": "Fixed",
- "browsedChallengePage.challengeModals.actions.skipped": "Skipped",
"browsedChallengePage.challengeModals.actions.title": "Task Activity",
- "browsedChallengePage.challengeModals.actions.tooHard": "Can't Complete",
- "browsedChallengePage.challengeModals.actions.total": "Total",
"browsedChallengePage.challengeModals.actions.validated": "Validated",
"browsedChallengePage.challengeModals.cloneModal.cloneError": "Failed to clone challenge",
"browsedChallengePage.challengeModals.cloneModal.cloneSuccess": "Challenge cloned successfully",
@@ -154,24 +82,16 @@
"browsedChallengePage.challengeModals.cloneModal.noProjects": "No projects available. You need to be a manager of at least one project to clone challenges.",
"browsedChallengePage.challengeModals.cloneModal.projectLabel": "Select Project",
"browsedChallengePage.challengeModals.cloneModal.projectPlaceholder": "Choose a project...",
- "browsedChallengePage.challengeModals.cloneModal.projectRequiredError": "Please select a project",
- "browsedChallengePage.challengeModals.cloneModal.submitButton": "Clone Challenge",
- "browsedChallengePage.challengeModals.cloneModal.title": "Clone Challenge",
- "browsedChallengePage.challengeModals.comments.addError": "Failed to add comment",
"browsedChallengePage.challengeModals.comments.addSuccess": "Comment added successfully",
"browsedChallengePage.challengeModals.comments.characterCount": "{count}/{max} characters",
"browsedChallengePage.challengeModals.comments.empty": "No comments yet. Be the first to comment!",
- "browsedChallengePage.challengeModals.comments.emptyCommentError": "Please enter a comment",
- "browsedChallengePage.challengeModals.comments.loginRequiredError": "You must be logged in to comment",
"browsedChallengePage.challengeModals.comments.owner": "Owner",
- "browsedChallengePage.challengeModals.comments.placeholder": "Add a comment...",
"browsedChallengePage.challengeModals.comments.reTask": "Re: Task {taskId}",
"browsedChallengePage.challengeModals.comments.send": "Send",
"browsedChallengePage.challengeModals.comments.sending": "Sending...",
"browsedChallengePage.challengeModals.comments.showTaskComments": "Show task comments",
"browsedChallengePage.challengeModals.comments.signInRequired": "Please sign in to add comments",
"browsedChallengePage.challengeModals.commentsModal.title": "Challenge Comments",
- "browsedChallengePage.challengeModals.overpassModal.title": "Overpass Query",
"browsedChallengePage.challengeModals.reportModal.checkboxError": "Please ensure that checkbox is checked before continue",
"browsedChallengePage.challengeModals.reportModal.confirmLabel": "I have attempted to contact the Challenge creator",
"browsedChallengePage.challengeModals.reportModal.createIssueError": "Failed to create GitHub issue: {status} {statusText}",
@@ -183,18 +103,12 @@
"browsedChallengePage.challengeModals.reportModal.githubNotFoundError": "GitHub repository not found. Please check that the repository exists and is accessible.",
"browsedChallengePage.challengeModals.reportModal.invalidEmailError": "Please enter a valid email address",
"browsedChallengePage.challengeModals.reportModal.minLengthError": "Report must be at least {min} characters",
- "browsedChallengePage.challengeModals.reportModal.nothingToPreview": "Nothing to preview",
- "browsedChallengePage.challengeModals.reportModal.previewTab": "Preview",
"browsedChallengePage.challengeModals.reportModal.submitButton": "Submit Report",
"browsedChallengePage.challengeModals.reportModal.submitError": "Failed to submit report. Please try again.",
"browsedChallengePage.challengeModals.reportModal.submitSuccess": "Report submitted successfully",
- "browsedChallengePage.challengeModals.reportModal.submitting": "Submitting...",
"browsedChallengePage.challengeModals.reportModal.textPlaceholder": "Enter text here",
- "browsedChallengePage.challengeModals.reportModal.title": "Report Challenge",
- "browsedChallengePage.challengeModals.reportModal.writeTab": "Write",
"browsedChallengePage.footer.failedToLoadTask": "Failed to load task",
"browsedChallengePage.footer.hideMap": "Hide Map",
- "browsedChallengePage.footer.loading": "Loading...",
"browsedChallengePage.footer.noTasksAvailable": "No tasks available for this challenge",
"browsedChallengePage.footer.reportedIssueMessage": "This challenge has been reported. Click here to view the issue.",
"browsedChallengePage.footer.showMap": "Show Map",
@@ -215,77 +129,235 @@
"browsedChallengePage.header.likeCountSingular": "1 like",
"browsedChallengePage.header.likeRemoved": "Like removed",
"browsedChallengePage.header.liked": "Liked",
- "browsedChallengePage.header.linkCopied": "Link copied to clipboard",
"browsedChallengePage.header.pleaseSignInToLike": "Please sign in to like challenges",
"browsedChallengePage.header.pleaseSignInToSave": "Please sign in to save challenges",
"browsedChallengePage.header.removeFromFavorites": "Remove from favorites",
"browsedChallengePage.header.removedFromFavorites": "Removed from favorites",
- "browsedChallengePage.header.save": "Save",
"browsedChallengePage.header.saved": "Saved",
- "browsedChallengePage.header.share": "Share",
"browsedChallengePage.header.shareChallenge": "Share challenge",
"browsedChallengePage.header.signInToLike": "Sign in to like challenges",
"browsedChallengePage.header.signInToSave": "Sign in to save challenges",
- "browsedChallengePage.header.taxonomy.archived": "Archived",
"browsedChallengePage.header.taxonomy.cooperative": "Cooperative",
"browsedChallengePage.header.taxonomy.favorite": "Favorite",
- "browsedChallengePage.header.taxonomy.featured": "Featured",
- "browsedChallengePage.header.taxonomy.newest": "Newest",
- "browsedChallengePage.header.taxonomy.paused": "Paused",
- "browsedChallengePage.header.taxonomy.popular": "Popular",
"browsedChallengePage.header.taxonomy.tagFix": "Tag Fix",
"browsedChallengePage.header.taxonomy.undiscoverable": "Undiscoverable",
"browsedChallengePage.header.unlikeChallenge": "Unlike challenge",
"browsedChallengePage.header.viewComments": "View comments",
"browsedChallengePage.map.zoomOutToAllTags": "Zoom out to all tags",
- "browsedChallengePage.panel.scrollToTop": "Scroll to top",
"browsedChallengePage.progress.details": "Details",
"browsedChallengePage.progress.progress": "Progress",
"browsedChallengePage.scrollIndicator.scrollForMore": "Scroll for more",
- "browsedProjectPage.challengesList.copyUrl": "Copy URL",
"browsedProjectPage.challengesList.emptyDescription": "This project has no challenges yet.",
"browsedProjectPage.challengesList.emptyDescriptionFiltered": "Try clearing the filters to see more results.",
- "browsedProjectPage.challengesList.emptyTitle": "No challenges found",
- "browsedProjectPage.challengesList.openMenu": "Open menu",
- "browsedProjectPage.challengesList.pinChallenge": "Pin challenge",
- "browsedProjectPage.challengesList.pinnedFilter": "Pinned",
- "browsedProjectPage.challengesList.searchPlaceholder": "Search challenges…",
"browsedProjectPage.challengesList.showCompletedFilter": "Show completed",
- "browsedProjectPage.challengesList.startChallenge": "Start challenge",
- "browsedProjectPage.challengesList.unpinChallenge": "Unpin challenge",
- "browsedProjectPage.challengesList.viewChallenge": "View challenge",
- "browsedProjectPage.projectDetail.archived": "Archived",
"browsedProjectPage.projectDetail.byOwner": "by {owner}",
- "browsedProjectPage.projectDetail.challenges": "Challenges",
- "browsedProjectPage.projectDetail.created": "Created",
- "browsedProjectPage.projectDetail.featured": "Featured",
- "browsedProjectPage.projectDetail.idLabel": "ID {id}",
- "browsedProjectPage.projectDetail.linkCopied": "Link copied to clipboard",
- "browsedProjectPage.projectDetail.manage": "Manage",
- "browsedProjectPage.projectDetail.modified": "Modified",
"browsedProjectPage.projectDetail.percentComplete": "{percent}% complete",
- "browsedProjectPage.projectDetail.share": "Share",
"browsedProjectPage.projectDetail.shareError": "Failed to share project",
- "browsedProjectPage.projectDetail.tasksRemaining": "Tasks remaining",
"challengeForm.errors.projectIdRequired": "Project ID is required to create a challenge",
- "commentList.item.challengeLink": "Challenge #{challengeId}",
- "commentList.item.reply": "Reply",
- "commentList.item.taskLink": "Task #{taskId}",
"commentList.list.empty": "No comments yet",
+ "common.accessDenied": "Access denied",
+ "common.actions": "Actions",
+ "common.activeChallenges": "Active Challenges",
+ "common.activeProjects": "Active Projects",
+ "common.addAComment": "Add a comment...",
+ "common.addChallenge": "Add challenge",
+ "common.admin": "Admin",
+ "common.all": "All ({count})",
+ "common.allChallenges": "All Challenges",
+ "common.alreadyFixed": "Already Fixed",
+ "common.approved": "Approved",
+ "common.archiveChallenge": "Archive challenge",
+ "common.archiveProject": "Archive project",
+ "common.archived": "Archived",
+ "common.assisted": "Assisted",
+ "common.available": "Available",
+ "common.avgCompletion": "Avg. Completion",
+ "common.browseChallenge": "Browse challenge",
+ "common.bundledTasks": "Bundled Tasks ({count})",
"common.cancel": "Cancel",
+ "common.cantComplete": "Can't Complete",
+ "common.challenge": "Challenge",
+ "common.challengeWithChallengeId": "Challenge #{challengeId}",
+ "common.challengeWithId": "Challenge #{id}",
+ "common.challenges": "Challenges",
+ "common.challenges2": "challenges",
+ "common.clear": "Clear",
+ "common.cloneChallenge": "Clone Challenge",
+ "common.cloneChallenge2": "Clone challenge",
"common.close": "Close",
+ "common.closeTask": "Close task",
+ "common.complete": "complete",
+ "common.copyUrl": "Copy URL",
+ "common.couldNotUpdateVisibility": "Could not update visibility",
+ "common.createChallenge": "Create Challenge",
+ "common.createManage": "create & manage",
+ "common.createNewChallenge": "Create New Challenge",
+ "common.createNewProject": "Create New Project",
+ "common.createProject": "Create Project",
+ "common.createTeam": "Create team",
+ "common.created": "Created",
+ "common.current": "Current",
"common.delete": "Delete",
+ "common.deleteChallenge": "Delete challenge",
+ "common.deleteChallenge2": "Delete challenge?",
+ "common.deleteChallengeWarning": "This will delete this challenge and all its tasks. This action cannot be undone.",
+ "common.deleteProject": "Delete project",
+ "common.deleteProject2": "Delete project?",
+ "common.deleted": "Deleted",
+ "common.deleted2": "deleted",
+ "common.description": "Description",
+ "common.difficulty": "Difficulty",
+ "common.disableChallenge": "Disable challenge",
+ "common.discoverable": "Discoverable",
+ "common.disputed": "Disputed",
+ "common.easy": "Easy",
"common.edit": "Edit",
+ "common.editChallenge": "Edit challenge",
+ "common.editProject": "Edit project",
+ "common.editTask": "Edit task",
+ "common.enableChallenge": "Enable challenge",
+ "common.enabled": "Enabled",
"common.error": "Something went wrong",
+ "common.expert": "Expert",
+ "common.exportCsv": "Export CSV",
+ "common.failedToAddComment": "Failed to add comment",
+ "common.failedToLoadNextTask": "Failed to load next task",
+ "common.falsePositive": "False Positive",
+ "common.featured": "Featured",
+ "common.findATask": "Find a Task",
+ "common.findByMaprouletteId": "Find by MapRoulette ID",
+ "common.fixed": "Fixed",
+ "common.geojson": "GeoJSON",
+ "common.geojsonUrl": "GeoJSON URL",
+ "common.gridView": "Grid view",
+ "common.hidePanel": "Hide panel",
+ "common.id": "ID",
+ "common.idNumber": "ID {id}",
+ "common.idNumberParenthetical": "(ID: {id})",
+ "common.instructions": "Instructions",
+ "common.invited": "Invited",
+ "common.joined": "Joined",
+ "common.lastUpdated": "Last updated {date}",
+ "common.level": "Level {level}",
+ "common.linkCopiedToClipboard": "Link copied to clipboard",
+ "common.listView": "List view",
+ "common.loadMore": "Load More",
"common.loading": "Loading…",
+ "common.loading2": "Loading...",
+ "common.loadingChallenges": "Loading challenges...",
+ "common.loadingNotifications": "Loading notifications...",
+ "common.makeDiscoverable": "Make discoverable",
+ "common.makeNotDiscoverable": "Make not discoverable",
+ "common.manage": "Manage",
+ "common.map": "Map",
+ "common.markAllAsRead": "Mark all as read",
+ "common.member": "Member",
+ "common.modified": "Modified",
+ "common.moveChallenge": "Move challenge",
+ "common.mrTags": "MR Tags",
+ "common.name": "Name",
+ "common.needed": "Needed",
+ "common.newest": "Newest",
+ "common.noChallengesFound": "No challenges found",
+ "common.noDescriptionAvailable": "No description available",
+ "common.noMoreTasksInChallenge": "No more tasks available in this challenge",
+ "common.noNotificationsYet": "You have no notifications.",
+ "common.noProjectsFound": "No projects found",
+ "common.noResultsFound": "No results found",
+ "common.noUnreadNotificationsYet": "You have no unread notifications at the moment.",
+ "common.normal": "Normal",
+ "common.nothingToPreview": "Nothing to preview",
+ "common.notification": "Notification",
+ "common.openMenu": "Open menu",
+ "common.openTaskById": "Open task by ID",
+ "common.overpassQuery": "Overpass Query",
+ "common.owned": "Owned",
+ "common.pageNotFound": "Page Not Found",
+ "common.paused": "Paused",
+ "common.pinChallenge": "Pin challenge",
+ "common.pinProject": "Pin project",
+ "common.pinned": "Pinned",
+ "common.platformAverage": "Platform average",
+ "common.pleaseEnterAComment": "Please enter a comment",
+ "common.pleaseSelectAProject": "Please select a project",
+ "common.popular": "Popular",
+ "common.preview": "Preview",
+ "common.primary": "Primary",
+ "common.priority": "Priority",
+ "common.project": "Project",
+ "common.projectWithId": "Project #{id}",
+ "common.projects": "Projects",
+ "common.projects2": "projects",
+ "common.rebuildTasks": "Rebuild tasks",
+ "common.recentActivity": "Recent Activity",
+ "common.rejected": "Rejected",
+ "common.reply": "Reply",
+ "common.reportChallenge": "Report Challenge",
+ "common.resetViewToTaskLocation": "Reset view to task location",
+ "common.results": "Results",
"common.save": "Save",
+ "common.saving": "Saving…",
+ "common.saving2": "Saving...",
+ "common.scrollToTop": "Scroll to top",
+ "common.searchChallenges": "Search challenges…",
+ "common.searchChallenges2": "Search challenges...",
+ "common.searchOsmUsername": "Search OSM username",
+ "common.searchProjects": "Search projects...",
+ "common.selectAProject": "Select a project",
+ "common.share": "Share",
+ "common.shareTask": "Share task",
+ "common.showPanel": "Show panel",
+ "common.shown": "Shown",
+ "common.signIn": "Sign in",
+ "common.skipped": "Skipped",
+ "common.startChallenge": "Start challenge",
+ "common.status": "Status",
+ "common.statusWithStatus": "Status {status}",
+ "common.submitting": "Submitting...",
+ "common.task": "Task",
+ "common.taskWithId": "Task #{id}",
+ "common.taskWithName": "Task: {name}",
+ "common.taskWithTaskId": "Task #{taskId}",
+ "common.tasks": "Tasks",
+ "common.tasks2": "tasks",
+ "common.tasksRemaining": "Tasks remaining",
+ "common.tasksRemaining2": "tasks remaining",
+ "common.tasksWithCount": "{count} tasks",
+ "common.team": "Team #{teamId}",
+ "common.teamNotFound": "Team not found.",
+ "common.teams": "Teams",
+ "common.thatsAll": "That's all!",
+ "common.total": "Total",
+ "common.totalChallenges": "Total Challenges",
+ "common.tryAdjustingYourSearchQuery": "Try adjusting your search query.",
+ "common.type": "Type",
+ "common.unarchiveChallenge": "Unarchive challenge",
+ "common.unarchiveProject": "Unarchive project",
+ "common.unexpectedErrorTryAgain": "An unexpected error occurred. Please try again.",
+ "common.unknown": "Unknown",
+ "common.unnecessary": "Unnecessary",
+ "common.unpinChallenge": "Unpin challenge",
+ "common.unpinProject": "Unpin project",
+ "common.unread": "Unread ({count})",
+ "common.updatingResults": "Updating results...",
+ "common.view": "View",
+ "common.viewAllNotifications": "View all notifications",
+ "common.viewChallenge": "View challenge",
+ "common.viewChallenges": "View Challenges",
+ "common.viewManageProjectsSubtitle": "View and manage all projects across the platform",
+ "common.viewOnOsm": "View on OSM",
+ "common.viewProject": "View project",
+ "common.viewProjects": "View Projects",
+ "common.write": "Write",
+ "common.youMustBeLoggedInToComment": "You must be logged in to comment",
+ "common.youreAllUpToDate": "You're all up to date",
+ "common.youveReachedTheEndOfTheList": "You've reached the end of the list",
+ "common.zoomToTask": "Zoom to task",
"configureColumnsDialog.allAdded": "All columns added.",
- "configureColumnsDialog.available": "Available",
"configureColumnsDialog.done": "Done",
"configureColumnsDialog.moveDown": "Move down",
"configureColumnsDialog.moveUp": "Move up",
"configureColumnsDialog.reset": "Reset",
- "configureColumnsDialog.shown": "Shown",
"configureColumnsDialog.title": "Configure columns",
"congratulateModal.achievement.fallback": "You earned a new badge.",
"congratulateModal.achievement.title": "Achievement unlocked!",
@@ -300,16 +372,13 @@
"dashboard.common.failedToLoad": "Failed to load",
"dashboard.contributions.empty.description": "Start mapping to track progress",
"dashboard.contributions.empty.title": "No contributions",
- "dashboard.contributions.statusFallback": "Status {status}",
"dashboard.contributions.statusSetLabel": "Set Status on Task as {statusLabel}",
"dashboard.contributions.title": "Contributions",
"dashboard.contributions.unknownChallenge": "Challenge {parentId}",
"dashboard.levelModal.calculatedUsing": "Your level is calculated using:",
- "dashboard.levelModal.current": "Current",
"dashboard.levelModal.description": "Complete challenges to earn points and level up your mapper rank.",
"dashboard.levelModal.howItWorksFooter": "Each level requires exponentially more points. Keep mapping to climb the ranks.",
"dashboard.levelModal.howItWorksTitle": "How leveling works",
- "dashboard.levelModal.level": "Level {level}",
"dashboard.levelModal.pointsRequired": "{points} points required",
"dashboard.levelModal.pointsToNextLevel": "{points} more points to next level",
"dashboard.levelModal.pointsToUnlock": "{points} points to unlock",
@@ -320,13 +389,10 @@
"dashboard.lockedTasks.empty.description": "Start editing a task to lock it",
"dashboard.lockedTasks.empty.title": "No locked tasks",
"dashboard.lockedTasks.manageTitle": "Manage task",
- "dashboard.lockedTasks.taskLabel": "Task #{id}",
"dashboard.lockedTasks.title": "Locked Tasks",
"dashboard.profile.accountAge": "Account age",
"dashboard.profile.daysCount": "{days} days",
"dashboard.profile.guest": "Guest",
- "dashboard.profile.joined": "Joined",
- "dashboard.profile.level": "Level {level}",
"dashboard.profile.points": "{points} pts",
"dashboard.profile.progressToNext": "{current} / {total} to next level",
"dashboard.profile.verified": "Verified",
@@ -336,25 +402,17 @@
"dashboard.savedChallenges.title": "Saved Challenges",
"dashboard.teams.empty.description": "Join a team to collaborate",
"dashboard.teams.empty.title": "No teams",
- "dashboard.teams.status.admin": "Admin",
- "dashboard.teams.status.invited": "Invited",
- "dashboard.teams.status.member": "Member",
- "dashboard.teams.status.unknown": "Unknown",
- "dashboard.teams.teamLabel": "Team #{teamId}",
- "dashboard.teams.title": "Teams",
"dynamicPluginRoute.errorTitle": "Error",
"dynamicPluginRoute.loadFailed": "Failed to load plugin page",
"dynamicPluginRoute.loading": "Loading plugin page...",
"dynamicPluginRoute.noPageFound": "No plugin page found for path: {path}",
"dynamicPluginRoute.notFoundDescription": "The requested plugin page could not be found.",
- "dynamicPluginRoute.notFoundTitle": "Page Not Found",
"errorBoundary.actions.goBack": "Go Back",
"errorBoundary.actions.goHome": "Go Home",
"errorBoundary.actions.goToLogin": "Go to Login",
"errorBoundary.actions.tryAgain": "Try Again",
"errorBoundary.forbidden.description": "You don't have permission to access this resource.",
"errorBoundary.forbidden.title": "403 - Forbidden",
- "errorBoundary.genericError.description": "An unexpected error occurred. Please try again.",
"errorBoundary.genericHttp.description": "An unexpected error occurred while loading this page.",
"errorBoundary.genericHttp.title": "Error {status}",
"errorBoundary.notFound.description": "The page or resource you're looking for doesn't exist.",
@@ -363,42 +421,24 @@
"errorBoundary.serverError.title": "Server Error",
"errorBoundary.unauthorized.description": "You need to be logged in to access this resource.",
"errorBoundary.unauthorized.title": "401 - Unauthorized",
- "exploreChallenges.challengeList.actionMenu.copyUrl": "Copy URL",
- "exploreChallenges.challengeList.actionMenu.openMenu": "Open menu",
- "exploreChallenges.challengeList.actionMenu.startChallenge": "Start challenge",
- "exploreChallenges.challengeList.actionMenu.viewChallenge": "View challenge",
"exploreChallenges.challengeList.emptyDescription": "Try adjusting your search filters or map bounds.",
- "exploreChallenges.challengeList.emptyTitle": "No challenges found",
- "exploreChallenges.challengeList.errorDescription": "An unexpected error occurred. Please try again.",
"exploreChallenges.challengeList.errorTitle": "Failed to load challenges",
- "exploreChallenges.challengeList.footer.endOfList": "You've reached the end of the list",
"exploreChallenges.challengeList.footer.endOfListHint": "Adjust your filters or explore a different area to discover more challenges",
- "exploreChallenges.challengeList.footer.loadMore": "Load More",
- "exploreChallenges.challengeList.footer.loading": "Loading...",
- "exploreChallenges.challengeList.loading": "Loading challenges...",
"exploreChallenges.challengeList.table.author": "Author",
"exploreChallenges.challengeList.table.contributors": "Contributors",
- "exploreChallenges.challengeList.table.difficulty": "Difficulty",
"exploreChallenges.challengeList.table.disabled": "Disabled",
"exploreChallenges.challengeList.table.dueDate": "Due date",
"exploreChallenges.challengeList.table.lastUpdated": "Last updated",
"exploreChallenges.challengeList.table.location": "Location",
- "exploreChallenges.challengeList.table.name": "Name",
"exploreChallenges.challengeList.table.organisation": "Organisation",
"exploreChallenges.challengeList.table.percentMapped": "Percent mapped",
"exploreChallenges.challengeList.table.percentValidated": "Percent validated",
- "exploreChallenges.challengeList.table.priority": "Priority",
"exploreChallenges.challengeList.table.projectLabel": "Project {parent}",
"exploreChallenges.challengeList.table.published": "Published",
- "exploreChallenges.challengeList.table.status": "Status",
"exploreChallenges.challengeList.table.urgent": "URGENT",
"exploreChallenges.challengeList.table.userLabel": "User {owner}",
"exploreChallenges.filterBar.clearFilters": "Clear filters",
"exploreChallenges.filterBar.difficulty.any": "Any",
- "exploreChallenges.filterBar.difficulty.easy": "Easy",
- "exploreChallenges.filterBar.difficulty.expert": "Expert",
- "exploreChallenges.filterBar.difficulty.label": "Difficulty",
- "exploreChallenges.filterBar.difficulty.normal": "Normal",
"exploreChallenges.filterBar.global.label": "Global",
"exploreChallenges.filterBar.location.clearAriaLabel": "Clear location",
"exploreChallenges.filterBar.location.geometryLoadFailed": "Failed to load location geometry",
@@ -408,15 +448,9 @@
"exploreChallenges.filterBar.location.noResults": "No locations found. Try a different search term.",
"exploreChallenges.filterBar.location.notFound": "Location not found",
"exploreChallenges.filterBar.location.searchPlaceholder": "Search location...",
- "exploreChallenges.filterBar.sortBy.difficulty": "Difficulty",
"exploreChallenges.filterBar.sortBy.label": "Sort by",
- "exploreChallenges.filterBar.sortBy.name": "Name",
- "exploreChallenges.filterBar.sortBy.newest": "Newest",
"exploreChallenges.filterBar.sortBy.oldest": "Oldest",
- "exploreChallenges.filterBar.sortBy.popular": "Popular",
- "exploreChallenges.filterBar.viewMode.grid": "Grid view",
"exploreChallenges.filterBar.viewMode.gridMap": "Grid with map view",
- "exploreChallenges.filterBar.viewMode.list": "List view",
"exploreChallenges.filterBar.workOn.anything": "Anything",
"exploreChallenges.filterBar.workOn.buildings": "Buildings",
"exploreChallenges.filterBar.workOn.label": "Work on",
@@ -427,37 +461,17 @@
"exploreChallenges.filterBar.workOn.water": "Water",
"exploreChallenges.map.searchThisArea": "Search this area",
"exploreChallenges.results.tabList": "List",
- "exploreChallenges.results.tabMap": "Map",
- "manageChallengeDetail.detail.breadcrumbChallenges": "challenges",
- "manageChallengeDetail.detail.breadcrumbProjects": "projects",
- "manageChallengeDetail.detail.browseChallenge": "Browse challenge",
"manageChallengeDetail.detail.configurePrioritization": "Configure prioritization",
- "manageChallengeDetail.detail.descriptionLabel": "Description",
- "manageChallengeDetail.detail.editChallenge": "Edit challenge",
- "manageChallengeDetail.detail.enabledError": "Could not update visibility",
- "manageChallengeDetail.detail.enabledLabel": "Enabled",
- "manageChallengeDetail.detail.featuredBadge": "Featured",
"manageChallengeDetail.detail.featuredError": "Could not update featured state",
- "manageChallengeDetail.detail.featuredLabel": "Featured",
- "manageChallengeDetail.detail.idLabel": "ID {id}",
- "manageChallengeDetail.detail.instructionsLabel": "Instructions",
"manageChallengeDetail.detail.pausedError": "Could not update paused state",
- "manageChallengeDetail.detail.pausedLabel": "Paused",
- "manageChallengeDetail.detail.rebuildTasks": "Rebuild tasks",
- "manageChallengeDetail.detail.recentActivityLabel": "Recent Activity",
"manageChallengeDetail.detail.statistics.completion": "Completion",
- "manageChallengeDetail.detail.statistics.created": "Created",
"manageChallengeDetail.detail.statistics.lastModified": "Last modified",
"manageChallengeDetail.detail.statistics.taskCountsByStatus": "Task counts by status",
- "manageChallengeDetail.detail.statistics.tasksRemaining": "Tasks remaining",
- "manageChallengeDetail.detail.statistics.total": "Total",
"manageChallengeDetail.detail.statisticsLabel": "Statistics",
"manageChallengeDetail.miniMap.zoomToAllTasksTooltip": "Zoom to all tasks",
"manageChallengeDetail.recentActivity.description": "Task completions by status, grouped by day (same data as the legacy admin dashboard widget).",
"manageChallengeDetail.recentActivity.empty": "No recent activity.",
"manageChallengeDetail.recentActivity.loadError": "Could not load activity.",
- "manageChallengeDetail.recentActivity.statusFallback": "Status {status}",
- "manageChallengeDetail.recentActivity.title": "Recent Activity",
"manageChallengeDetail.statusIndicator.buildingBody": "Tasks are being generated. This page will automatically refresh to show progress.",
"manageChallengeDetail.statusIndicator.deletingBody": "Tasks are being deleted. Please wait...",
"manageChallengeDetail.statusIndicator.deletingTitle": "Deleting Tasks...",
@@ -470,19 +484,12 @@
"manageChallengeDetail.statusIndicator.tasksBuildingTitle": "Tasks Building...",
"manageChallengeDetail.statusIndicator.tasksUpdatingTitle": "Tasks Updating...",
"manageChallengeDetail.statusIndicator.updatingBody": "Task statuses are being updated. This page will automatically refresh to show progress.",
- "manageChallengeDetail.tasksExplorer.clearButton": "Clear",
"manageChallengeDetail.tasksExplorer.clearFiltersTitle": "Clear all filters and reset sort",
- "manageChallengeDetail.tasksExplorer.columnActions": "Actions",
"manageChallengeDetail.tasksExplorer.columnBundle": "Bundle",
- "manageChallengeDetail.tasksExplorer.columnId": "ID",
- "manageChallengeDetail.tasksExplorer.columnPriority": "Priority",
- "manageChallengeDetail.tasksExplorer.columnStatus": "Status",
"manageChallengeDetail.tasksExplorer.deselectTaskLabel": "Deselect task",
"manageChallengeDetail.tasksExplorer.filtersLabel": "Filters",
"manageChallengeDetail.tasksExplorer.loadingTasks": "Loading tasks…",
"manageChallengeDetail.tasksExplorer.noTasksMatch": "No tasks match the current filters.",
- "manageChallengeDetail.tasksExplorer.priorityLabel": "Priority",
- "manageChallengeDetail.tasksExplorer.scrollToTopLabel": "Scroll to top",
"manageChallengeDetail.tasksExplorer.selectTaskLabel": "Select task",
"manageChallengeDetail.tasksExplorer.showingCount": "Showing {shown} of {total} tasks",
"manageChallengeDetail.tasksExplorer.sortAscButton": "Asc",
@@ -490,10 +497,7 @@
"manageChallengeDetail.tasksExplorer.sortDescButton": "Desc",
"manageChallengeDetail.tasksExplorer.sortDescTitle": "Descending — click for ascending",
"manageChallengeDetail.tasksExplorer.sortLabel": "Sort",
- "manageChallengeDetail.tasksExplorer.statusFallback": "Status {status}",
- "manageChallengeDetail.tasksExplorer.statusLabel": "Status",
"manageChallengeDetail.tasksExplorer.taskStatusMenuLabel": "Task status",
- "manageChallengeDetail.tasksExplorer.viewTask": "View",
"manageChallengeEdit.pageDescription": "Modify the information below to update your challenge",
"manageChallengeEdit.pageTitle": "Challenge Editor",
"manageChallengeNew.challengeForm.agreementCheckboxLabel": "I have read and understand the OSM Automated Edits code of conduct",
@@ -501,28 +505,20 @@
"manageChallengeNew.challengeForm.agreementDescriptionBefore": "You are about to create a MapRoulette challenge. With this power comes responsibility. Make sure that your Challenge is designed to encourage careful human attention to each task, in the spirit of OpenStreetMap's",
"manageChallengeNew.challengeForm.agreementLinkText": "Automated Edits code of conduct",
"manageChallengeNew.challengeForm.agreementSectionTitle": "Automated Edits Code of Conduct Agreement",
- "manageChallengeNew.challengeForm.createButton": "Create Challenge",
"manageChallengeNew.challengeForm.createSuccessToast": "Challenge created successfully",
- "manageChallengeNew.challengeForm.descriptionLabel": "Description",
"manageChallengeNew.challengeForm.descriptionPlaceholder": "Describe what this challenge is about...",
- "manageChallengeNew.challengeForm.difficultyEasy": "Easy",
- "manageChallengeNew.challengeForm.difficultyExpert": "Expert",
- "manageChallengeNew.challengeForm.difficultyLabel": "Difficulty",
- "manageChallengeNew.challengeForm.difficultyNormal": "Normal",
"manageChallengeNew.challengeForm.difficultyPlaceholder": "Select difficulty",
"manageChallengeNew.challengeForm.docsLinkText": "docs",
"manageChallengeNew.challengeForm.geoJSONFileDescriptionAfter": "are supported.",
"manageChallengeNew.challengeForm.geoJSONFileDescriptionBefore": "Upload a GeoJSON file from your computer. Standard GeoJSON and",
"manageChallengeNew.challengeForm.geoJSONFileLabel": "GeoJSON File",
"manageChallengeNew.challengeForm.geoJSONFileSelected": "Selected: {name} ({size} KB)",
- "manageChallengeNew.challengeForm.instructionsLabel": "Instructions",
"manageChallengeNew.challengeForm.instructionsPlaceholder": "Instructions for completing tasks...",
"manageChallengeNew.challengeForm.lineByLineGeoJSONLinkText": "line-by-line GeoJSON format",
"manageChallengeNew.challengeForm.localGeoJSONOptionDescription": "Upload a GeoJSON file from your computer",
"manageChallengeNew.challengeForm.localGeoJSONOptionTitle": "I want to upload a GeoJSON file",
"manageChallengeNew.challengeForm.localGeoJSONReadOnlyBody": "This challenge was built from an uploaded GeoJSON file, which can't be shown here. To replace it with fresh GeoJSON, use Rebuild Tasks when managing your challenge.",
"manageChallengeNew.challengeForm.localGeoJSONReadOnlyLabel": "Uploaded GeoJSON file",
- "manageChallengeNew.challengeForm.nameLabel": "Name",
"manageChallengeNew.challengeForm.namePlaceholder": "{user}'s Challenge",
"manageChallengeNew.challengeForm.overpassOptionDescription": "Use Overpass QL to automatically generate tasks from OpenStreetMap data",
"manageChallengeNew.challengeForm.overpassOptionTitle": "I want to provide an Overpass query",
@@ -532,17 +528,11 @@
"manageChallengeNew.challengeForm.overpassQueryReadOnlyBody": "Overpass queries cannot be edited here. Use Rebuild Tasks when managing your challenge to re-run the query and refresh your tasks.",
"manageChallengeNew.challengeForm.overpassQueryReadOnlyLabel": "Overpass query",
"manageChallengeNew.challengeForm.projectPicker.description": "Select the project this challenge belongs to",
- "manageChallengeNew.challengeForm.projectPicker.label": "Project",
- "manageChallengeNew.challengeForm.projectPicker.numbered": "Project #{id}",
- "manageChallengeNew.challengeForm.projectPicker.placeholder": "Select a project",
"manageChallengeNew.challengeForm.remoteGeoJSONDescription": "Provide a URL pointing to a GeoJSON file. The URL should point directly to the raw GeoJSON file, not a page that contains a link to the file.",
- "manageChallengeNew.challengeForm.remoteGeoJSONLabel": "GeoJSON URL",
"manageChallengeNew.challengeForm.remoteGeoJSONOptionDescription": "Provide a URL pointing to a GeoJSON file",
"manageChallengeNew.challengeForm.remoteGeoJSONOptionTitle": "I have a URL to the GeoJSON data",
"manageChallengeNew.challengeForm.remoteGeoJSONReadOnlyBody": "Remote URLs cannot be edited here. Use Rebuild Tasks when managing your challenge to re-download the GeoJSON and refresh your tasks.",
- "manageChallengeNew.challengeForm.remoteGeoJSONReadOnlyLabel": "GeoJSON URL",
"manageChallengeNew.challengeForm.saveErrorToast": "Failed to save challenge. Please try again.",
- "manageChallengeNew.challengeForm.savingButton": "Saving...",
"manageChallengeNew.challengeForm.taskDataDescription": "Choose how you want to provide task data for this challenge.",
"manageChallengeNew.challengeForm.taskDataReadOnlyDescription": "The data source is set when the challenge is created. To regenerate tasks from updated data, use Rebuild Tasks when managing the challenge.",
"manageChallengeNew.challengeForm.taskDataTitle": "Task data",
@@ -554,129 +544,40 @@
"manageChallengeNew.challengeForm.validation.localGeoJSONRequired": "Please upload a GeoJSON file",
"manageChallengeNew.challengeForm.validation.nameMinLength": "Challenge name must be at least 3 characters",
"manageChallengeNew.challengeForm.validation.overpassRequired": "An Overpass query is required",
- "manageChallengeNew.challengeForm.validation.projectRequired": "Please select a project",
"manageChallengeNew.challengeForm.validation.remoteGeoJSONRequired": "A GeoJSON URL is required",
"manageChallengeNew.pageDescription": "Fill in the information below to create your new challenge",
- "manageChallengeNew.pageTitle": "Create New Challenge",
"manageChallenges.content.aboutChallengesBody": "Challenges contain tasks that mappers work through to improve OpenStreetMap data.",
"manageChallenges.content.aboutChallengesTitle": "About Challenges",
- "manageChallenges.content.archiveChallenge": "Archive challenge",
- "manageChallenges.content.archivedFilter": "Archived",
"manageChallenges.content.challengeCreationGuideLink": "Challenge Creation Guide",
- "manageChallenges.content.copyUrl": "Copy URL",
- "manageChallenges.content.createChallenge": "Create Challenge",
- "manageChallenges.content.deleteChallenge": "Delete challenge",
- "manageChallenges.content.deleteChallengeDescription": "This will delete this challenge and all its tasks. This action cannot be undone.",
- "manageChallenges.content.deleteChallengeTitle": "Delete challenge?",
- "manageChallenges.content.discoverableFilter": "Discoverable",
- "manageChallenges.content.editChallenge": "Edit challenge",
"manageChallenges.content.emptyDescription": "You haven't created any challenges yet",
- "manageChallenges.content.emptyTitle": "No challenges found",
- "manageChallenges.content.hidePanel": "Hide panel",
- "manageChallenges.content.makeDiscoverable": "Make discoverable",
- "manageChallenges.content.makeNotDiscoverable": "Make not discoverable",
"manageChallenges.content.manageProjectsLink": "Manage Projects",
- "manageChallenges.content.openMenu": "Open menu",
- "manageChallenges.content.pinChallenge": "Pin challenge",
- "manageChallenges.content.pinnedFilter": "Pinned",
"manageChallenges.content.quickLinks": "Quick Links",
- "manageChallenges.content.rebuildTasks": "Rebuild tasks",
- "manageChallenges.content.searchPlaceholder": "Search challenges...",
- "manageChallenges.content.showPanel": "Show panel",
- "manageChallenges.content.startChallenge": "Start challenge",
"manageChallenges.content.tipMonitorProgressBody": "Check completion rates and review feedback. Archive challenges once all tasks are resolved.",
"manageChallenges.content.tipMonitorProgressTitle": "Monitor progress",
"manageChallenges.content.tipSetDifficultyBody": "Match difficulty to the skill required. Easy tasks attract new mappers, while expert tasks get routed to experienced contributors.",
"manageChallenges.content.tipSetDifficultyTitle": "Set appropriate difficulty",
"manageChallenges.content.tipWriteClearInstructionsBody": "Good task instructions help mappers understand what to fix and how. Include examples and link to relevant wiki pages.",
"manageChallenges.content.tipWriteClearInstructionsTitle": "Write clear instructions",
- "manageChallenges.content.unarchiveChallenge": "Unarchive challenge",
- "manageChallenges.content.unpinChallenge": "Unpin challenge",
"manageHome.challengesDescription": "Browse and manage all your challenges",
- "manageHome.challengesTitle": "Challenges",
- "manageHome.openTaskById": "Open task by ID",
"manageHome.projectsDescription": "Create and manage your MapRoulette projects",
- "manageHome.projectsTitle": "Projects",
"manageHome.tasksDescription": "Open a task by ID to view or edit it",
- "manageHome.tasksTitle": "Tasks",
- "manageHome.viewChallenges": "View Challenges",
- "manageHome.viewProjects": "View Projects",
- "manageProjectDetail.challengesTable.archiveChallenge": "Archive challenge",
- "manageProjectDetail.challengesTable.cloneChallenge": "Clone challenge",
- "manageProjectDetail.challengesTable.columnActions": "Actions",
- "manageProjectDetail.challengesTable.columnDescription": "Description",
- "manageProjectDetail.challengesTable.columnDifficulty": "Difficulty",
- "manageProjectDetail.challengesTable.columnId": "ID",
- "manageProjectDetail.challengesTable.columnName": "Name",
- "manageProjectDetail.challengesTable.columnStatus": "Status",
"manageProjectDetail.challengesTable.columnTasksLeft": "Tasks Left",
- "manageProjectDetail.challengesTable.deleteChallenge": "Delete challenge",
- "manageProjectDetail.challengesTable.disableChallenge": "Disable challenge",
- "manageProjectDetail.challengesTable.editChallenge": "Edit challenge",
- "manageProjectDetail.challengesTable.enableChallenge": "Enable challenge",
- "manageProjectDetail.challengesTable.makeDiscoverable": "Make discoverable",
- "manageProjectDetail.challengesTable.makeNotDiscoverable": "Make not discoverable",
- "manageProjectDetail.challengesTable.moveChallenge": "Move challenge",
- "manageProjectDetail.challengesTable.openMenu": "Open menu",
- "manageProjectDetail.challengesTable.pinChallenge": "Pin challenge",
- "manageProjectDetail.challengesTable.pinnedTitle": "Pinned",
- "manageProjectDetail.challengesTable.rebuildTasks": "Rebuild tasks",
- "manageProjectDetail.challengesTable.startChallenge": "Start challenge",
- "manageProjectDetail.challengesTable.unarchiveChallenge": "Unarchive challenge",
- "manageProjectDetail.challengesTable.unpinChallenge": "Unpin challenge",
- "manageProjectDetail.content.archiveChallenge": "Archive challenge",
- "manageProjectDetail.content.archiveProject": "Archive project",
- "manageProjectDetail.content.archivedBadge": "Archived",
- "manageProjectDetail.content.archivedFilter": "Archived",
- "manageProjectDetail.content.cloneChallenge": "Clone challenge",
"manageProjectDetail.content.createChallenge": "Create challenge",
- "manageProjectDetail.content.deleteChallenge": "Delete challenge",
- "manageProjectDetail.content.deleteChallengeDescription": "This will delete this challenge and all its tasks. This action cannot be undone.",
- "manageProjectDetail.content.deleteChallengeTitle": "Delete challenge?",
- "manageProjectDetail.content.deleteProject": "Delete project",
"manageProjectDetail.content.deleteProjectDescription": "This will delete this project and all its challenges and tasks. This action cannot be undone.",
- "manageProjectDetail.content.deleteProjectTitle": "Delete project?",
- "manageProjectDetail.content.disableChallenge": "Disable challenge",
"manageProjectDetail.content.disableProject": "Disable project",
- "manageProjectDetail.content.discoverableFilter": "Discoverable",
- "manageProjectDetail.content.editChallenge": "Edit challenge",
- "manageProjectDetail.content.editProject": "Edit project",
"manageProjectDetail.content.emptyDescription": "Get started by creating your first challenge",
- "manageProjectDetail.content.emptyTitle": "No challenges found",
- "manageProjectDetail.content.enableChallenge": "Enable challenge",
"manageProjectDetail.content.enableProject": "Enable project",
- "manageProjectDetail.content.featuredBadge": "Featured",
- "manageProjectDetail.content.idLabel": "ID {id}",
- "manageProjectDetail.content.makeDiscoverable": "Make discoverable",
- "manageProjectDetail.content.makeNotDiscoverable": "Make not discoverable",
- "manageProjectDetail.content.moveChallenge": "Move challenge",
- "manageProjectDetail.content.openMenu": "Open menu",
- "manageProjectDetail.content.pinChallenge": "Pin challenge",
- "manageProjectDetail.content.pinnedFilter": "Pinned",
"manageProjectDetail.content.playbookDocsLink": "Open project management docs",
"manageProjectDetail.content.playbookTip1": "Confirm challenge instructions and QA expectations are specific and testable.",
"manageProjectDetail.content.playbookTip2": "Review challenge ordering so mappers can move from easier to harder tasks.",
"manageProjectDetail.content.playbookTip3": "Assign at least one co-manager for triage, support, and archival continuity.",
"manageProjectDetail.content.playbookTitle": "Project Playbook",
- "manageProjectDetail.content.rebuildTasks": "Rebuild tasks",
- "manageProjectDetail.content.searchPlaceholder": "Search challenges…",
- "manageProjectDetail.content.startChallenge": "Start challenge",
- "manageProjectDetail.content.statsChallenges": "Challenges",
- "manageProjectDetail.content.statsDiscoverable": "Discoverable",
- "manageProjectDetail.content.statsShown": "Shown",
- "manageProjectDetail.content.statsTasksRemaining": "Tasks remaining",
- "manageProjectDetail.content.unarchiveChallenge": "Unarchive challenge",
- "manageProjectDetail.content.unarchiveProject": "Unarchive project",
- "manageProjectDetail.content.unpinChallenge": "Unpin challenge",
"manageProjectDetail.content.viewProjectPage": "View project page",
"manageProjectEdit.pageDescription": "Modify the information below to update your project",
"manageProjectEdit.pageTitle": "Project Details",
"manageProjectNew.pageDescription": "Fill in the information below to create your new project",
- "manageProjectNew.pageTitle": "Create New Project",
- "manageProjectNew.projectForm.createButton": "Create Project",
"manageProjectNew.projectForm.createSuccessToast": "Project created successfully",
"manageProjectNew.projectForm.descriptionDescription": "A brief description of the project",
- "manageProjectNew.projectForm.descriptionLabel": "Description",
"manageProjectNew.projectForm.descriptionPlaceholder": "Describe what this project is about...",
"manageProjectNew.projectForm.detailsSectionDescription": "Basic identifying information for this project.",
"manageProjectNew.projectForm.detailsSectionTitle": "Project details",
@@ -684,14 +585,11 @@
"manageProjectNew.projectForm.displayNameLabel": "Display Name",
"manageProjectNew.projectForm.displayNamePlaceholder": "My Project",
"manageProjectNew.projectForm.enabledDescription": "Make this project visible and accessible to users",
- "manageProjectNew.projectForm.enabledLabel": "Enabled",
"manageProjectNew.projectForm.featuredDescription": "Feature this project on the homepage",
- "manageProjectNew.projectForm.featuredLabel": "Featured",
"manageProjectNew.projectForm.nameDescription": "A unique identifier for the project (lowercase, no spaces)",
"manageProjectNew.projectForm.nameLabel": "Project Name",
"manageProjectNew.projectForm.namePlaceholder": "my-project",
"manageProjectNew.projectForm.saveErrorToast": "Failed to save project. Please try again.",
- "manageProjectNew.projectForm.savingButton": "Saving...",
"manageProjectNew.projectForm.updateButton": "Update Project",
"manageProjectNew.projectForm.updateSuccessToast": "Project updated successfully",
"manageProjectNew.projectForm.validation.displayNameRequired": "Display name is required",
@@ -700,102 +598,36 @@
"manageProjectNew.projectForm.visibilitySectionTitle": "Visibility",
"manageProjects.content.aboutDescription": "Good project structure improves mapper clarity, QA consistency, and long-term maintenance.",
"manageProjects.content.aboutTitle": "About Projects",
- "manageProjects.content.addChallenge": "Add challenge",
- "manageProjects.content.archiveProject": "Archive project",
"manageProjects.content.challengeCreation": "Challenge Creation",
- "manageProjects.content.copyUrl": "Copy URL",
- "manageProjects.content.createProject": "Create Project",
- "manageProjects.content.deleteProject": "Delete project",
"manageProjects.content.deleteProjectDescription": "This will delete the project \"{projectName}\" and all its challenges and tasks. This action cannot be undone.",
- "manageProjects.content.deleteProjectTitle": "Delete project?",
- "manageProjects.content.editProject": "Edit project",
- "manageProjects.content.endOfList": "You've reached the end of the list",
- "manageProjects.content.exportCsv": "Export CSV",
- "manageProjects.content.filterArchived": "Archived",
- "manageProjects.content.filterDiscoverable": "Discoverable",
- "manageProjects.content.filterOwned": "Owned",
- "manageProjects.content.filterPinned": "Pinned",
"manageProjects.content.helpfulDocs": "Helpful Docs",
- "manageProjects.content.hidePanel": "Hide panel",
"manageProjects.content.learnHub": "Learn Hub",
- "manageProjects.content.loadMore": "Load More",
- "manageProjects.content.loading": "Loading...",
- "manageProjects.content.makeDiscoverable": "Make discoverable",
- "manageProjects.content.makeNotDiscoverable": "Make not discoverable",
"manageProjects.content.noProjectsDescription": "Get started by creating your first project.",
"manageProjects.content.noProjectsDescriptionShort": "Get started by creating your first project",
- "manageProjects.content.noProjectsFound": "No projects found",
- "manageProjects.content.openMenu": "Open menu",
- "manageProjects.content.pinProject": "Pin project",
"manageProjects.content.projectManagement": "Project Management",
- "manageProjects.content.searchPlaceholder": "Search projects...",
- "manageProjects.content.showPanel": "Show panel",
"manageProjects.content.tipOwnershipBody": "Add co-managers before launch so triage, support, and archival responsibilities are covered.",
"manageProjects.content.tipOwnershipTitle": "Share ownership",
"manageProjects.content.tipPublishBody": "Keep projects non-discoverable while iterating. Turn discoverable on only after instructions and QA checks are validated.",
"manageProjects.content.tipPublishTitle": "Publish intentionally",
"manageProjects.content.tipScopeBody": "Use a stable naming pattern (region, theme, version) and keep each project focused on one clear objective.",
"manageProjects.content.tipScopeTitle": "Define scope early",
- "manageProjects.content.unarchiveProject": "Unarchive project",
- "manageProjects.content.unpinProject": "Unpin project",
- "manageProjects.content.viewProject": "View project",
- "manageProjects.table.actions": "Actions",
- "manageProjects.table.addChallenge": "Add challenge",
- "manageProjects.table.archiveProject": "Archive project",
- "manageProjects.table.challenges": "Challenges",
- "manageProjects.table.copyUrl": "Copy URL",
- "manageProjects.table.deleteProject": "Delete project",
- "manageProjects.table.description": "Description",
- "manageProjects.table.editProject": "Edit project",
- "manageProjects.table.exportCsv": "Export CSV",
- "manageProjects.table.id": "ID",
- "manageProjects.table.name": "Name",
- "manageProjects.table.openMenu": "Open menu",
- "manageProjects.table.pinProject": "Pin project",
- "manageProjects.table.pinned": "Pinned",
- "manageProjects.table.status": "Status",
- "manageProjects.table.unarchiveProject": "Unarchive project",
- "manageProjects.table.unpinProject": "Unpin project",
- "manageProjects.table.viewProject": "View project",
"manageTaskDetail.accessDeniedBody": "Only challenge owners and admins can view or edit tasks.",
- "manageTaskDetail.accessDeniedTitle": "Access denied",
- "manageTaskDetail.breadcrumbs.challenges": "challenges",
- "manageTaskDetail.breadcrumbs.createManage": "create & manage",
- "manageTaskDetail.breadcrumbs.projects": "projects",
- "manageTaskDetail.breadcrumbs.tasks": "tasks",
- "manageTaskDetail.browseChallenge": "Browse challenge",
- "manageTaskDetail.created": "Created",
- "manageTaskDetail.editTask": "Edit task",
- "manageTaskDetail.geoJson": "GeoJSON",
"manageTaskDetail.idLabel": "ID {taskId}",
- "manageTaskDetail.instructions": "Instructions",
"manageTaskDetail.loadError": "Failed to load task. It may not exist or you may not have permission to view it.",
"manageTaskDetail.manageChallenge": "Manage challenge",
- "manageTaskDetail.modified": "Modified",
- "manageTaskDetail.mrTags": "MR Tags",
- "manageTaskDetail.status": "Status",
- "manageTaskDetail.statusUnknown": "Unknown",
"manageTaskDetail.taskInformation": "Task information",
- "manageTaskDetail.taskNumber": "Task #{taskId}",
"manageTaskEdit.form.geoJsonDescription": "GeoJSON for this task (point, line or polygon). Must be valid JSON.",
- "manageTaskEdit.form.geoJsonLabel": "GeoJSON",
"manageTaskEdit.form.instructionsDescription": "Instructions for users doing this specific task",
- "manageTaskEdit.form.instructionsLabel": "Instructions",
"manageTaskEdit.form.instructionsPlaceholder": "Instructions for this task (overrides challenge instructions)",
"manageTaskEdit.form.mrTagsDescription": "Optional MR tags to annotate this task (comma-separated)",
- "manageTaskEdit.form.mrTagsLabel": "MR Tags",
"manageTaskEdit.form.mrTagsPlaceholder": "tag1, tag2",
"manageTaskEdit.form.nameDescription": "Name of the task",
- "manageTaskEdit.form.nameLabel": "Name",
"manageTaskEdit.form.namePlaceholder": "Task name",
- "manageTaskEdit.form.saving": "Saving...",
"manageTaskEdit.form.statusDescription": "Current status of the task",
- "manageTaskEdit.form.statusLabel": "Status",
"manageTaskEdit.form.statusPlaceholder": "Select status",
"manageTaskEdit.form.updateError": "Failed to save task. Please try again.",
"manageTaskEdit.form.updateSuccess": "Task updated successfully",
"manageTaskEdit.index.accessDeniedDescription": "Only challenge owners and admins can edit tasks.",
- "manageTaskEdit.index.accessDeniedTitle": "Access denied",
"manageTaskEdit.index.noPermission": "You do not have permission to edit this task.",
"manageTaskEdit.index.taskDetailsDescription": "Modify the fields below and save to update the task",
"manageTaskEdit.index.taskDetailsTitle": "Task Details",
@@ -803,17 +635,12 @@
"manageTaskNew.description": "Task management functionality is under development",
"manageTaskNew.title": "New Task",
"manageTasksOpen.cardDescription": "Enter a task ID below. You can find task IDs when working on a task (URL or header) or from your saved/locked tasks on the dashboard.",
- "manageTasksOpen.cardTitle": "Open task by ID",
- "manageTasksOpen.challengesLink": "Challenges",
"manageTasksOpen.description": "Open a task by ID to view details or edit it (name, instructions, status, etc.).",
- "manageTasksOpen.editTask": "Edit task",
"manageTasksOpen.findChallengeHint": "to find a challenge, then browse it to open a task and get its ID from the URL.",
"manageTasksOpen.or": "or",
"manageTasksOpen.orGoTo": "Or go to",
- "manageTasksOpen.projectsLink": "Projects",
"manageTasksOpen.taskIdLabel": "Task ID",
"manageTasksOpen.taskIdPlaceholder": "e.g. 12345",
- "manageTasksOpen.title": "Tasks",
"manageTasksOpen.viewTask": "View task",
"managementPages.bulkActionsToolbar.apply": "Apply",
"managementPages.bulkActionsToolbar.archive": "Archive",
@@ -826,7 +653,6 @@
"managementPages.bulkActionsToolbar.clearLockDialog.title": "Clear lock on {count} task{suffix}?",
"managementPages.bulkActionsToolbar.clearLockError": "Could not clear locks",
"managementPages.bulkActionsToolbar.clearLockSuccess": "Cleared lock on {count} tasks",
- "managementPages.bulkActionsToolbar.clearSelection": "Clear",
"managementPages.bulkActionsToolbar.deleteDialog.deleting": "Deleting…",
"managementPages.bulkActionsToolbar.deleteDialog.description": "This cannot be undone. Tasks and their comments, reviews, and tags are permanently removed.",
"managementPages.bulkActionsToolbar.deleteDialog.title": "Delete {count} task{suffix}?",
@@ -837,7 +663,6 @@
"managementPages.bulkActionsToolbar.reassign": "Reassign",
"managementPages.bulkActionsToolbar.reassignDialog.description": "Search for the reviewer to assign these task reviews to. Only tasks whose reviews are still open will be updated.",
"managementPages.bulkActionsToolbar.reassignDialog.reassigning": "Reassigning…",
- "managementPages.bulkActionsToolbar.reassignDialog.searchPlaceholder": "Search OSM username",
"managementPages.bulkActionsToolbar.reassignDialog.title": "Reassign {count} task{suffix}",
"managementPages.bulkActionsToolbar.reassignError": "Could not reassign tasks",
"managementPages.bulkActionsToolbar.reassignSuccess": "Reassigned {updated} of {requested} tasks",
@@ -853,7 +678,6 @@
"managementPages.bulkActionsToolbar.updateError": "Could not update tasks",
"managementPages.bulkActionsToolbar.updatedToast": "Updated {count} tasks",
"managementPages.challengeStatusBanner.tasksInProgress": "{status} tasks…",
- "managementPages.layout.breadcrumbRoot": "create & manage",
"managementPages.rebuildTasksDialog.dataOriginDate": "Date data was sourced (optional)",
"managementPages.rebuildTasksDialog.descriptionDefault": "Rebuild the challenge tasks from its source data.",
"managementPages.rebuildTasksDialog.incomplete": "incomplete",
@@ -874,7 +698,6 @@
"managementPages.rebuildTasksDialog.toastError": "Could not start rebuild",
"managementPages.rebuildTasksDialog.toastStarted": "Rebuild started",
"managementPages.rebuildTasksDialog.warning": "Warning: Rebuilding can lead to task duplication if your feature ids are not setup properly or if matching up old data with new data is unsuccessful. This operation cannot be undone!",
- "managementPages.visibilityToggle.error": "Could not update visibility",
"map.controls.hideControls": "Hide controls",
"map.controls.mapStyle": "Map style",
"map.controls.resetView": "Reset view",
@@ -886,9 +709,6 @@
"map.layerControl.customLayers.form.addTitle": "Add custom layer",
"map.layerControl.customLayers.form.attribution": "Attribution",
"map.layerControl.customLayers.form.editTitle": "Edit layer",
- "map.layerControl.customLayers.form.name": "Name",
- "map.layerControl.customLayers.form.type": "Type",
- "map.layerControl.customLayers.form.typeGeojson": "GeoJSON URL",
"map.layerControl.customLayers.form.typeTile": "Tile (XYZ)",
"map.layerControl.customLayers.form.typeWms": "WMS",
"map.layerControl.customLayers.form.urlPlaceholder": "https://…/{z}/{x}/{y}.png",
@@ -896,7 +716,6 @@
"map.layerControl.customLayers.panel.add": "Add",
"map.layerControl.customLayers.panel.empty": "No custom layers yet.",
"map.layerControl.customLayers.panel.title": "Custom layers",
- "map.layerControl.customLayers.row.edit": "Edit",
"map.layerControl.customLayers.row.remove": "Remove",
"map.layerControl.overlays": "Overlays",
"map.scaleBar.feet": "{value} ft",
@@ -906,15 +725,11 @@
"map.taskMarkers.clusterToggle.enforcedWarning": "Clustering is enforced for 500+ tasks",
"map.taskMarkers.clusterToggle.label": "Cluster Markers",
"map.taskMarkers.clusterToggle.taskCount": "{count} task",
- "map.taskMarkers.clusterToggle.taskCountPlural": "{count} tasks",
"map.taskMarkers.clusterToggle.tooLargeWarning": "Data is too large to cluster, zoom in to view tasks",
"moveChallengeModal.description": "Choose a project to move \"{challengeName}\" to. The challenge will be removed from the current project.",
- "moveChallengeModal.idLabel": "(ID: {id})",
"moveChallengeModal.moveError": "Failed to move challenge. You may not have permission to move to that project.",
"moveChallengeModal.noProjects": "No other projects found. Create another project first to move this challenge.",
- "moveChallengeModal.searchPlaceholder": "Search projects...",
"moveChallengeModal.title": "Move Challenge",
- "notifications.actions.deleted": "deleted",
"notifications.actions.markedAsRead": "marked as read",
"notifications.actions.markedAsUnread": "marked as unread",
"notifications.toast.actionError": "Failed to {verb} notification: {message}",
@@ -922,31 +737,19 @@
"notificationsPage.content.description": "View and manage your notifications",
"notificationsPage.content.groupByTask": "Group by Task",
"notificationsPage.content.groupByTaskHint": "Notifications for the same task are grouped together",
- "notificationsPage.content.loading": "Loading notifications...",
- "notificationsPage.content.noNotifications": "You have no notifications.",
- "notificationsPage.content.noUnread": "You have no unread notifications at the moment.",
"notificationsPage.content.title": "Notifications",
- "notificationsPage.content.upToDate": "You're all up to date",
- "notificationsPage.filters.allChallenges": "All Challenges",
"notificationsPage.filters.allSenders": "All Senders",
"notificationsPage.filters.allTasks": "All Tasks",
"notificationsPage.filters.allTypes": "All Types",
- "notificationsPage.filters.challengePlaceholder": "Challenge",
"notificationsPage.filters.clearFilters": "Clear Filters",
"notificationsPage.filters.fromPlaceholder": "From",
- "notificationsPage.filters.taskOption": "Task #{taskId}",
- "notificationsPage.filters.taskPlaceholder": "Task",
"notificationsPage.filters.typeOptionFallback": "Type {typeId}",
- "notificationsPage.filters.typePlaceholder": "Type",
"notificationsPage.item.challengeLabel": "Challenge:",
- "notificationsPage.item.challengeRef": "Challenge #{challengeId}",
"notificationsPage.item.deleteNotification": "Delete notification",
"notificationsPage.item.markAsRead": "Mark as read",
"notificationsPage.item.markAsUnread": "Mark as unread",
- "notificationsPage.item.notificationFallback": "Notification",
"notificationsPage.item.projectRef": "Project #{projectId}",
"notificationsPage.item.selectFrom": "Select notification from {from}",
- "notificationsPage.item.taskRef": "Task #{taskId}",
"notificationsPage.item.unreadTitle": "Unread notification",
"notificationsPage.savedViews.applied": "Applied view \"{name}\"",
"notificationsPage.savedViews.cancelRename": "Cancel rename",
@@ -973,7 +776,6 @@
"notificationsPage.selectAll.selectedCount": "{selected} of {total} selected",
"notificationsPage.thread.commentsHeading": "Comments on this task",
"notificationsPage.thread.commentsSectionLabel": "Task comment thread",
- "notificationsPage.thread.description.groupedFor": "Task #{taskId}",
"notificationsPage.thread.description.thisThread": "this thread",
"notificationsPage.thread.description.viewDetails": "View notification details",
"notificationsPage.thread.markThreadRead": "Mark thread as read",
@@ -983,19 +785,13 @@
"notificationsPage.thread.replyFailed": "Failed to post reply",
"notificationsPage.thread.replyPlaceholder": "Reply on Task #{taskId}…",
"notificationsPage.thread.replyPosted": "Reply posted",
- "notificationsPage.thread.replySubmitLabel": "Reply",
"notificationsPage.thread.signInToReply": "Sign in to reply",
"notificationsPage.thread.title.count": "{count} notifications",
- "notificationsPage.thread.title.single": "Notification",
"notificationsPage.thread.title.task": "Notification for Task #{taskId}",
- "notificationsPage.thread.viewAll": "View all notifications",
- "notificationsPage.toolbar.allTab": "All ({count})",
- "notificationsPage.toolbar.markAllRead": "Mark all as read",
"notificationsPage.toolbar.markAllUnread": "Mark all as unread",
"notificationsPage.toolbar.markSelectedRead": "Mark {count} as read",
"notificationsPage.toolbar.markSelectedUnread": "Mark {count} as unread",
"notificationsPage.toolbar.marking": "Marking...",
- "notificationsPage.toolbar.unreadTab": "Unread ({count})",
"plugins.errors.loadPluginFailed": "Failed to load plugin: {error}",
"plugins.errors.loadPreferencesFailed": "Failed to load plugin preferences",
"plugins.errors.notAuthenticated": "Not authenticated",
@@ -1009,26 +805,10 @@
"profilePage.index.loadError": "Couldn't load that user's profile.",
"profilePage.index.loginRequired": "Please log in to view your profile",
"profilePage.metrics.title": "Metrics",
- "profilePage.reviewStats.approved": "Approved",
- "profilePage.reviewStats.assisted": "Assisted",
- "profilePage.reviewStats.disputed": "Disputed",
"profilePage.reviewStats.loadError": "Couldn't load review stats.",
- "profilePage.reviewStats.needed": "Needed",
- "profilePage.reviewStats.rejected": "Rejected",
- "profilePage.reviewStats.statusFallback": "Status {status}",
"profilePage.reviewStats.title": "Reviews Received",
- "profilePage.reviewStats.unnecessary": "Unnecessary",
- "profilePage.reviewerStats.approved": "Approved",
- "profilePage.reviewerStats.assisted": "Assisted",
- "profilePage.reviewerStats.disputed": "Disputed",
- "profilePage.reviewerStats.needed": "Needed",
- "profilePage.reviewerStats.rejected": "Rejected",
- "profilePage.reviewerStats.statusFallback": "Status {status}",
"profilePage.reviewerStats.title": "Reviews Performed",
- "profilePage.reviewerStats.unnecessary": "Unnecessary",
"profilePage.taskStats.loadError": "Couldn't load task stats.",
- "profilePage.taskStats.statusFallback": "Status {status}",
- "profilePage.taskStats.title": "Tasks",
"profilePage.taskStats.totalCompleted": "Total completed",
"profilePage.timeRange.ariaLabel": "Time range",
"profilePage.topChallenges.title": "Top Challenges",
@@ -1039,31 +819,22 @@
"rapidEditor.iframeTitle": "Rapid Editor",
"rapidEditor.loading": "Loading Rapid Editor...",
"rapidEditor.reselectTask": "Re-Select Task",
- "rapidEditor.resetViewTitle": "Reset view to task location",
"rapidEditor.unsavedChanges": "Unsaved Changes",
"shareLink.popover.copied": "Copied to clipboard",
- "shareLink.popover.copyUrl": "Copy URL",
"shareLink.popover.hideQr": "Hide QR",
"shareLink.popover.qrCanvas": "QR code for share URL",
"shareLink.popover.qrCode": "QR code",
"shareLink.popover.shareUrl": "Share URL",
"shareLink.popover.shareVia": "Share via…",
"shareLink.popover.title": "Share this link",
- "shareLink.share": "Share",
"shared.achievementBadge.lockedLabel": "{title} (locked)",
"shared.achievementBadge.notYetEarned": "Not yet earned",
- "shared.challengeCard.complete": "complete",
- "shared.challengeCard.lastUpdated": "Last updated {date}",
"shared.challengeCard.project": "Project {id}",
- "shared.challengeCard.tasks": "tasks",
"shared.clearManageFiltersButton.label": "CLEAR FILTERS",
"shared.commentComposer.mention.userSuggestions": "User suggestions",
- "shared.commentComposer.nothingToPreview": "Nothing to preview",
"shared.commentComposer.placeholder": "Write a comment…",
"shared.commentComposer.posting": "Posting…",
- "shared.commentComposer.previewTab": "Preview",
"shared.commentComposer.submitLabel": "Post",
- "shared.commentComposer.writeTab": "Write",
"shared.digitDisplay.pointsLabel": "{value} points",
"shared.emailRequirementNotice.goToSettings": "Go to settings",
"shared.emailRequirementNotice.recommended": "We recommend setting an email so we can reach you about your challenges.",
@@ -1072,42 +843,22 @@
"shared.mapLoadingIndicator.loading": "Loading task markers...",
"shared.notFound.backHome": "Head back home",
"shared.notFound.description": "The page you are looking for does not exist.",
- "shared.notFound.title": "Page Not Found",
"shared.pointsTicker.viewProfile": "{score} points — view profile",
"shared.projectCard.completed": "Completed: {count}",
- "shared.projectCard.lastUpdated": "Last updated {date}",
"shared.projectCard.pinned": "Pinned: {count}",
- "shared.projectCard.tasksRemaining": "tasks remaining",
"shared.projectCard.totalChallenges": "Total Challenges: {count}",
"shared.projectPickerModal.description": "Choose the project this challenge belongs to.",
- "shared.projectPickerModal.filterArchived": "Archived",
- "shared.projectPickerModal.filterDiscoverable": "Discoverable",
- "shared.projectPickerModal.filterOwned": "Owned",
- "shared.projectPickerModal.filterPinned": "Pinned",
- "shared.projectPickerModal.loadMore": "Load More",
- "shared.projectPickerModal.loading": "Loading...",
"shared.projectPickerModal.noProjectsFound": "No projects found.",
- "shared.projectPickerModal.projectId": "(ID: {id})",
- "shared.projectPickerModal.searchPlaceholder": "Search projects...",
- "shared.projectPickerModal.title": "Select a project",
"shared.searchBar.placeholder": "Search...",
"shared.sectionHeader.create": "create",
"shared.sectionHeader.createCapitalized": "Create",
- "shared.signIn.action": "Sign in",
"shared.signIn.description": "You need to be signed in to manage your account.",
"shared.signIn.title": "Please sign in",
- "shared.statusBadge.discoverable": "Discoverable",
"shared.statusBadge.notDiscoverable": "Not discoverable",
- "shared.viewModeToggle.gridView": "Grid view",
- "shared.viewModeToggle.listView": "List view",
"statusBreakdownBar.bar.label": "Status breakdown",
"statusBreakdownBar.bar.noTasks": "No tasks yet",
"statusLegend.legend": "Legend",
- "statusLegend.priorityHeading": "Priority",
- "statusLegend.statusHeading": "Status",
- "superAdmin.analytics.activeChallenges": "Active Challenges",
"superAdmin.analytics.activeChallengesChange": "+15.2% from last month",
- "superAdmin.analytics.activeProjects": "Active Projects",
"superAdmin.analytics.activeProjectsChange": "+8.1% from last month",
"superAdmin.analytics.avgTaskCompletionTime": "Avg. Task Completion Time",
"superAdmin.analytics.avgTaskCompletionTimeDescription": "Improved by 1.2 min this month",
@@ -1128,7 +879,6 @@
"superAdmin.analytics.systemUptimeDescription": "Last 30 days",
"superAdmin.analytics.taskCompletionRateDescription": "Tasks completed per day",
"superAdmin.analytics.taskCompletionRateTitle": "Task Completion Rate",
- "superAdmin.analytics.taskCount": "{count} tasks",
"superAdmin.analytics.tasksCompleted": "Tasks Completed",
"superAdmin.analytics.tasksCompletedChange": "+22.5% from last month",
"superAdmin.analytics.title": "Platform Analytics",
@@ -1140,40 +890,23 @@
"superAdmin.analytics.userActivityTitle": "User Activity",
"superAdmin.analytics.userLabel": "User {index}",
"superAdmin.layout.breadcrumbRoot": "super admin",
- "superAdminChallenges.card.noDescription": "No description available",
- "superAdminChallenges.card.tasksRemaining": "tasks remaining",
- "superAdminChallenges.card.view": "View",
- "superAdminChallenges.createButton": "Create New Challenge",
- "superAdminChallenges.empty.description": "Try adjusting your search query.",
- "superAdminChallenges.empty.title": "No challenges found",
- "superAdminChallenges.searchPlaceholder": "Search challenges...",
- "superAdminChallenges.stats.active": "Active Challenges",
"superAdminChallenges.stats.activeShare": "71% of total",
- "superAdminChallenges.stats.avgCompletion": "Avg. Completion",
- "superAdminChallenges.stats.platformAverage": "Platform average",
- "superAdminChallenges.stats.total": "Total Challenges",
"superAdminChallenges.stats.totalChange": "+15% from last month",
"superAdminChallenges.stats.totalTasks": "Total Tasks",
"superAdminChallenges.stats.totalTasksNote": "Across all challenges",
"superAdminChallenges.subtitle": "Browse and manage all challenges across the platform",
- "superAdminChallenges.title": "All Challenges",
"superAdminGuard.accessDenied.message": "You do not have permission to access this area. Super admin privileges are required.",
"superAdminGuard.accessDenied.title": "Access Denied",
"superAdminHome.cards.analytics.button": "View Analytics",
"superAdminHome.cards.analytics.description": "View platform-wide analytics and metrics",
"superAdminHome.cards.analytics.title": "Analytics",
- "superAdminHome.cards.challenges.button": "View Challenges",
"superAdminHome.cards.challenges.description": "Browse and manage all challenges",
- "superAdminHome.cards.challenges.title": "Challenges",
"superAdminHome.cards.database.button": "Coming Soon",
"superAdminHome.cards.database.description": "Database management and maintenance",
"superAdminHome.cards.database.title": "Database",
"superAdminHome.cards.plugins.button": "View Plugins",
"superAdminHome.cards.plugins.description": "Manage plugins and integrations",
"superAdminHome.cards.plugins.title": "Plugins",
- "superAdminHome.cards.projects.button": "View Projects",
- "superAdminHome.cards.projects.description": "View and manage all projects across the platform",
- "superAdminHome.cards.projects.title": "Projects",
"superAdminHome.cards.settings.button": "View Settings",
"superAdminHome.cards.settings.description": "Platform settings and configuration",
"superAdminHome.cards.settings.title": "Settings",
@@ -1187,7 +920,6 @@
"superAdminPlugins.card.updated": "Updated: {date}",
"superAdminPlugins.card.versionBy": "v{version} • by {author}",
"superAdminPlugins.card.viewDetails": "View Details",
- "superAdminPlugins.empty.description": "Try adjusting your search query.",
"superAdminPlugins.empty.title": "No plugins found",
"superAdminPlugins.installButton": "Install Plugin",
"superAdminPlugins.searchPlaceholder": "Search plugins...",
@@ -1202,23 +934,10 @@
"superAdminPlugins.subtitle": "Manage plugins and integrations for the platform",
"superAdminPlugins.title": "Plugin Management",
"superAdminPlugins.uploadButton": "Upload Plugin",
- "superAdminProjects.card.challenges": "challenges",
- "superAdminProjects.card.complete": "complete",
- "superAdminProjects.card.noDescription": "No description available",
- "superAdminProjects.card.view": "View",
- "superAdminProjects.createButton": "Create New Project",
- "superAdminProjects.empty.description": "Try adjusting your search query.",
- "superAdminProjects.empty.title": "No projects found",
- "superAdminProjects.searchPlaceholder": "Search projects...",
- "superAdminProjects.stats.active": "Active Projects",
"superAdminProjects.stats.activeShare": "73% of total",
- "superAdminProjects.stats.avgCompletion": "Avg. Completion",
- "superAdminProjects.stats.platformAverage": "Platform average",
"superAdminProjects.stats.total": "Total Projects",
- "superAdminProjects.stats.totalChallenges": "Total Challenges",
"superAdminProjects.stats.totalChallengesNote": "Across all projects",
"superAdminProjects.stats.totalChange": "+8% from last month",
- "superAdminProjects.subtitle": "View and manage all projects across the platform",
"superAdminProjects.title": "All Projects",
"superAdminSettings.appearance.darkMode": "Default to Dark Mode",
"superAdminSettings.appearance.darkModeDescription": "Set dark mode as the default theme for new users",
@@ -1269,7 +988,6 @@
"superAdminSettings.subtitle": "Configure platform-wide settings and preferences",
"superAdminSettings.title": "Platform Settings",
"superAdminUsers.addButton": "Add New User",
- "superAdminUsers.empty.description": "Try adjusting your search query.",
"superAdminUsers.empty.title": "No users found",
"superAdminUsers.searchPlaceholder": "Search users by name or email...",
"superAdminUsers.stats.basedOnSearch": "Based on current search",
@@ -1279,9 +997,7 @@
"superAdminUsers.stats.superAdmins": "Super Admins",
"superAdminUsers.stats.usersOnPage": "Users on Page",
"superAdminUsers.subtitle": "Manage all users and their permissions across the platform",
- "superAdminUsers.table.columns.actions": "Actions",
"superAdminUsers.table.columns.email": "Email",
- "superAdminUsers.table.columns.joined": "Joined",
"superAdminUsers.table.columns.osmId": "OSM ID",
"superAdminUsers.table.columns.role": "Role",
"superAdminUsers.table.columns.score": "Score",
@@ -1292,7 +1008,6 @@
"superAdminUsers.table.previous": "Previous",
"superAdminUsers.table.subtitle": "A list of all users in the system (page {page})",
"superAdminUsers.table.title": "All Users",
- "superAdminUsers.table.view": "View",
"superAdminUsers.title": "User Management",
"taskEditPage.idEditor.closeEditor": "Close editor",
"taskEditPage.idEditor.closeEditorTitle": "Close editor and return to task map",
@@ -1302,7 +1017,6 @@
"taskEditPage.idEditor.focusTitle": "Dim other features to focus on tasks",
"taskEditPage.idEditor.loading": "Loading iD Editor...",
"taskEditPage.idEditor.reCenter": "Re-Center",
- "taskEditPage.idEditor.resetView": "Reset view to task location",
"taskEditPage.idEditor.selectTasks": "Select Tasks",
"taskEditPage.idEditor.selectTasksTitle": "Select task features in iD",
"taskEditPage.idEditor.showAll": "Show All",
@@ -1328,22 +1042,13 @@
"taskEditPage.taskActionModal.nextTask": "Next Task",
"taskEditPage.taskActionModal.randomTask.description": "Load the next highest priority task from this challenge",
"taskEditPage.taskActionModal.randomTask.label": "Random High Priority Task",
- "taskEditPage.taskActionModal.status.alreadyFixed": "Already Fixed",
- "taskEditPage.taskActionModal.status.cantComplete": "Can't Complete",
- "taskEditPage.taskActionModal.status.falsePositive": "False Positive",
- "taskEditPage.taskActionModal.status.fixed": "Fixed",
- "taskEditPage.taskActionModal.status.skipped": "Skipped",
- "taskEditPage.taskActionModal.status.unknown": "Unknown",
"taskEditPage.taskActionModal.statusChange": "Status Change",
- "taskEditPage.taskActionModal.submitting": "Submitting...",
"taskEditPage.taskActionModal.tagsHint": "Separate multiple tags with commas",
"taskEditPage.taskActionModal.tagsLabel": "Tags (Optional)",
"taskEditPage.taskActionModal.tagsPlaceholder": "Enter tags separated by commas (e.g., needs-review, complex)",
"taskEditPage.taskActionModal.title": "Complete Task Action",
- "taskEditPage.taskActionModal.toast.loadNextFailed": "Failed to load next task",
"taskEditPage.taskActionModal.toast.loadingNext": "Loading next task...",
"taskEditPage.taskActionModal.toast.markedAs": "Task marked as {status}",
- "taskEditPage.taskActionModal.toast.noMoreTasks": "No more tasks available in this challenge",
"taskEditPage.taskActionModal.toast.updateFailed": "Failed to update task. Please try again.",
"taskEditPage.taskActions.editorButton.changeDefault": "Change default editor",
"taskEditPage.taskActions.editorButton.defaultUpdateFailed": "Failed to update default editor",
@@ -1368,10 +1073,7 @@
"taskEditPage.taskActions.lockButton.unlock": "Unlock",
"taskEditPage.taskActions.lockButton.unlockTask": "Unlock task",
"taskEditPage.taskActions.lockButton.unlocked": "Task unlocked",
- "taskEditPage.taskActions.main.alreadyFixed": "Already Fixed",
- "taskEditPage.taskActions.main.cantComplete": "Can't Complete",
"taskEditPage.taskActions.main.completionHeading": "Completion: Set Task Status",
- "taskEditPage.taskActions.main.fixed": "Fixed",
"taskEditPage.taskActions.main.markAlreadyFixedTitle": "Mark as Already Fixed",
"taskEditPage.taskActions.main.markCantCompleteTitle": "Mark as Can't Complete",
"taskEditPage.taskActions.main.markFalsePositiveTitle": "Mark as False Positive (Ctrl/Cmd + P)",
@@ -1380,71 +1082,38 @@
"taskEditPage.taskActions.main.pausedMessage": "This challenge is currently paused. Tasks cannot be completed until it is resumed.",
"taskEditPage.taskActions.main.signInToMap": "Sign in to map this task",
"taskEditPage.taskActions.navigation.loadNearbyFailed": "Failed to load nearby task",
- "taskEditPage.taskActions.navigation.loadNextFailed": "Failed to load next task",
- "taskEditPage.taskActions.navigation.loading": "Loading...",
"taskEditPage.taskActions.navigation.nearbyTask": "Nearby task",
- "taskEditPage.taskActions.navigation.noMoreTasks": "No more tasks available in this challenge",
"taskEditPage.taskActions.navigation.noNearbyTasks": "No nearby tasks available",
"taskEditPage.taskActions.navigation.randomTask": "Random task",
"taskEditPage.taskActions.navigation.wantToMap": "Want to map this challenge?",
"taskEditPage.taskActions.skipButton.label": "Skip this task",
- "taskEditPage.taskActions.skipButton.noMoreTasks": "No more tasks available in this challenge",
"taskEditPage.taskActions.skipButton.skipFailed": "Could not skip this task",
"taskEditPage.taskActions.skipButton.title": "Skip this task (preserves status)",
"taskEditPage.taskActions.startMapping.differentTask": "Different task",
- "taskEditPage.taskActions.startMapping.loadNextFailed": "Failed to load next task",
- "taskEditPage.taskActions.startMapping.loading": "Loading...",
"taskEditPage.taskActions.startMapping.mapThisTask": "Map this task",
- "taskEditPage.taskActions.startMapping.noMoreTasks": "No more tasks available in this challenge",
"taskEditPage.taskActions.startMapping.starting": "Starting...",
"taskEditPage.taskBundle.clearedSuccess": "Now working on only the primary task",
- "taskEditPage.taskInfoHeader.closeTask": "Close task",
"taskEditPage.taskInfoHeader.hideMarkers": "Hide task markers",
- "taskEditPage.taskInfoHeader.primary": "Primary",
- "taskEditPage.taskInfoHeader.shareTask": "Share task",
- "taskEditPage.taskInfoHeader.shareTitleId": "Task #{id}",
- "taskEditPage.taskInfoHeader.shareTitleNamed": "Task: {name}",
"taskEditPage.taskInfoHeader.showMarkers": "Show task markers",
- "taskEditPage.taskInfoHeader.taskId": "Task #{id}",
- "taskEditPage.taskInfoHeader.unknownStatus": "Unknown",
- "taskEditPage.taskInfoHeader.viewOnOsm": "View on OSM",
- "taskEditPage.taskInfoHeader.zoomToTask": "Zoom to task",
"taskEditPage.taskMap.drawingModeHint": "Click and drag to select tasks • ESC to cancel",
"taskEditPage.taskMap.editInId": "Edit in iD (inline)",
"taskEditPage.taskMap.editInIdShort": "Edit in iD",
- "taskEditPage.taskNearbyMap.current": "Current",
"taskEditPage.taskNearbyMap.nearbyCount": "{count} nearby task{suffix}",
"taskEditPage.taskNearbyMap.selectedTask": "Task #{id} selected",
- "taskInfoPanel.comments.addError": "Failed to add comment",
"taskInfoPanel.comments.addSuccess": "Comment added",
"taskInfoPanel.comments.changedStatus": "changed status",
"taskInfoPanel.comments.cleared": "cleared",
- "taskInfoPanel.comments.emptyCommentError": "Please enter a comment",
"taskInfoPanel.comments.emptyState": "No activity yet. Be the first to comment!",
- "taskInfoPanel.comments.inputPlaceholder": "Add a comment...",
"taskInfoPanel.comments.markedAs": "marked as",
- "taskInfoPanel.comments.notSignedInError": "You must be logged in to comment",
"taskInfoPanel.comments.signInPrompt": "Sign in to add comments",
- "taskInfoPanel.comments.statusFallback": "Status {status}",
"taskInfoPanel.comments.systemUser": "System",
- "taskInfoPanel.drawer.bundledTasksHeading": "Bundled Tasks ({count})",
- "taskInfoPanel.drawer.closeTask": "Close task",
- "taskInfoPanel.drawer.instructionsHeading": "Instructions",
- "taskInfoPanel.drawer.shareTask": "Share task",
- "taskInfoPanel.drawer.shareTitleNamed": "Task: {name}",
- "taskInfoPanel.drawer.shareTitleNumbered": "Task #{id}",
"taskInfoPanel.drawer.startTask": "Start Task",
- "taskInfoPanel.drawer.taskIdLabel": "Task #{id}",
- "taskInfoPanel.drawer.unknownStatus": "Unknown",
- "taskInfoPanel.drawer.viewOnOsm": "View on OSM",
- "taskInfoPanel.drawer.zoomToTask": "Zoom to task",
"taskInfoPanel.osmHistory.areaHistory.description": "View recent changes in the area around this task",
"taskInfoPanel.osmHistory.areaHistory.osmHistoryLink": "OSM History at Location",
"taskInfoPanel.osmHistory.areaHistory.osmchaDescription": "All changesets in this area",
"taskInfoPanel.osmHistory.areaHistory.osmchaLink": "OSMCha Area Filter",
"taskInfoPanel.osmHistory.areaHistory.recentEditsNear": "Recent edits near {lat}, {lng}",
"taskInfoPanel.osmHistory.areaHistory.title": "Area History",
- "taskInfoPanel.osmHistory.elementHistory.deleted": "deleted",
"taskInfoPanel.osmHistory.elementHistory.empty": "No history available.",
"taskInfoPanel.osmHistory.elementHistory.fetchError": "Failed to fetch history",
"taskInfoPanel.osmHistory.elementHistory.loading": "Loading history...",
@@ -1463,30 +1132,23 @@
"taskInfoPanel.osmHistory.tab.noFeatureDescription": "This task's geometry does not contain OSM element identifiers (like @id: \"way/12345\"). OSM feature history is only available when tasks reference specific OpenStreetMap elements.",
"taskInfoPanel.osmHistory.tab.noFeatureTitle": "No OSM Feature Detected",
"taskInfoPanel.osmHistory.timeline.completed": "Completed",
- "taskInfoPanel.osmHistory.timeline.created": "Created",
"taskInfoPanel.osmHistory.timeline.lastModified": "Last Modified",
"taskInfoPanel.osmHistory.timeline.minutes": "{count} minutes",
"taskInfoPanel.osmHistory.timeline.timeSpent": "Time Spent",
"taskInfoPanel.osmHistory.timeline.title": "Task Timeline",
"taskInfoPanel.properties.empty": "No properties available for this task.",
"taskInfoPanel.tabs.comments": "Comments ({count})",
- "taskInfoPanel.tabs.instructions": "Instructions",
"taskInfoPanel.tabs.osm": "OSM ({count})",
"taskInfoPanel.tabs.properties": "Properties",
- "taskInfoPanel.taskTab.bundleList.primary": "Primary",
"taskInfoPanel.taskTab.bundleList.selectAll": "Select All",
"taskInfoPanel.taskTab.bundleList.selectAllTitle": "Select all bundled tasks in iD editor",
"taskInfoPanel.taskTab.bundleList.selectTaskTitle": "Select Task #{id} in iD editor",
- "taskInfoPanel.taskTab.bundleList.taskLabel": "Task #{id}",
- "taskInfoPanel.taskTab.bundleList.title": "Bundled Tasks ({count})",
"taskInfoPanel.taskTab.bundleState.addToBundle": "Add to Bundle",
"taskInfoPanel.taskTab.bundleState.inBundle": "In bundle",
"taskInfoPanel.taskTab.bundleState.primaryInBundle": "Primary task in bundle",
"taskInfoPanel.taskTab.bundleState.removeFromBundle": "Remove from Bundle",
- "taskInfoPanel.taskTab.instructions.challengeView": "Challenge",
"taskInfoPanel.taskTab.instructions.noChallengeDescription": "No challenge description available.",
"taskInfoPanel.taskTab.instructions.noTaskInstructions": "No task instructions available.",
- "taskInfoPanel.taskTab.instructions.taskView": "Task",
"taskMap.clearBundleDialog.confirm": "Clear Bundle",
"taskMap.clearBundleDialog.description": "This will unbundle all {taskCount} tasks. The tasks themselves will not be deleted, only separated. This action cannot be undone.",
"taskMap.clearBundleDialog.title": "Clear Task Bundle?",
@@ -1510,7 +1172,6 @@
"taskMap.multiTaskPanel.workingOnTasksPlural": "Working on {count} tasks",
"taskMap.multiTaskPanel.workingOnTasksSingular": "Working on {count} task",
"taskMap.shortcuts.cancelDrawing": "Cancel drawing",
- "taskMap.shortcuts.categoryMap": "Map",
"taskMap.shortcuts.categoryMultiTask": "Multi-task",
"taskMap.shortcuts.exitMultiTask": "Exit multi-task mode",
"taskMap.shortcuts.startDrawing": "Start drawing to add tasks",
@@ -1536,8 +1197,6 @@
"taskPrioritizationPage.content.discard": "Discard",
"taskPrioritizationPage.content.saveError": "Could not save priorities",
"taskPrioritizationPage.content.saveSuccess": "Priorities saved",
- "taskPrioritizationPage.content.saving": "Saving…",
- "taskPrioritizationPage.content.subtitle": "Challenge #{challengeId}",
"taskPrioritizationPage.defaultPrioritySelect.label": "Default priority",
"taskPrioritizationPage.index.loadError": "Could not load challenge.",
"taskPrioritizationPage.previewMap.updatingPreview": "Updating preview…",
@@ -1555,17 +1214,13 @@
"taskPropertyQueryBuilder.ruleLeaf.valuePlaceholder": "value",
"taskTags.dialog.saveError": "Could not save tags",
"taskTags.dialog.saveSuccess": "Tags saved",
- "taskTags.dialog.saving": "Saving…",
"taskTags.dialog.title": "Edit task tags",
"taskTags.tagChip.removeTag": "Remove tag {label}",
"taskTags.tagInput.addPreferredTag": "+ {tag}",
"taskTags.tagInput.addTagPlaceholder": "Add a tag…",
"taskTags.tagInput.popularInChallenge": "Popular in this challenge:",
- "taskTags.taskTags.edit": "Edit",
"taskTags.taskTags.editTags": "Edit tags",
"taskTags.taskTags.noTags": "No tags",
- "teams.card.teamFallbackName": "Team #{teamId}",
- "teams.card.unknownRole": "Unknown",
"teams.detail.adminsHeading": "Admins",
"teams.detail.deleteConfirmAction": "Delete team",
"teams.detail.deleteConfirmDescription": "This cannot be undone. All members will lose access.",
@@ -1574,39 +1229,27 @@
"teams.detail.deleteSuccess": "Team deleted",
"teams.detail.demoteButton": "Demote",
"teams.detail.inviteButton": "Invite",
- "teams.detail.invitedHeading": "Invited",
"teams.detail.memberCountPlural": "{count} members",
"teams.detail.memberCountSingular": "{count} member",
"teams.detail.memberRemoveError": "Could not remove member",
"teams.detail.memberRemoveSuccess": "Member removed",
"teams.detail.membersHeading": "Members",
- "teams.detail.notFound": "Team not found.",
"teams.detail.promoteButton": "Promote",
"teams.detail.removeMemberAriaLabel": "Remove member",
"teams.detail.roleUpdateError": "Could not update role",
"teams.detail.roleUpdateSuccess": "Role updated",
- "teams.detail.unknownRole": "Unknown",
- "teams.editTeam.notFound": "Team not found.",
"teams.editTeam.title": "Edit team",
"teams.form.avatarUrlLabel": "Avatar URL (optional)",
- "teams.form.createButton": "Create team",
"teams.form.createSuccess": "Team created",
- "teams.form.descriptionLabel": "Description",
- "teams.form.nameLabel": "Name",
"teams.form.saveError": "Could not save team",
"teams.form.updateSuccess": "Team updated",
"teams.inviteMember.description": "Search for an OSM user and pick a role for them.",
- "teams.inviteMember.roleAdmin": "Admin",
- "teams.inviteMember.roleMember": "Member",
- "teams.inviteMember.searchPlaceholder": "Search OSM username",
"teams.inviteMember.sendButton": "Send invitation",
"teams.inviteMember.sendError": "Could not send invitation",
"teams.inviteMember.sentSuccess": "Invitation sent",
"teams.inviteMember.title": "Invite a team member",
- "teams.list.createButton": "Create team",
"teams.list.emptyDescription": "Create a team to collaborate with others on challenges.",
"teams.list.emptyTitle": "No teams yet",
- "teams.list.title": "Teams",
"teams.newTeam.title": "Create a team",
"teams.pendingInvites.acceptButton": "Accept",
"teams.pendingInvites.acceptError": "Could not accept invitation",
@@ -1616,15 +1259,12 @@
"teams.pendingInvites.declineButton": "Decline",
"teams.pendingInvites.declineError": "Could not decline invitation",
"teams.pendingInvites.declineSuccess": "Invitation declined",
- "teams.pendingInvites.teamFallbackName": "Team #{teamId}",
"theme.options.dark": "Dark theme",
"theme.options.light": "Light theme",
"theme.options.system": "System theme",
"topChallenges.list.emptyDescription": "Once you start working on challenges, your top ones will show up here.",
"topChallenges.list.emptyTitle": "No contributions yet",
"topChallenges.list.loadError": "Couldn't load top challenges right now.",
- "topChallenges.row.taskCount": "{count} tasks",
- "ui.loader.message": "Loading...",
"ui.spinner.loading": "Loading",
"ui.table.resizeColumn": "Resize column"
}
diff --git a/src/routes/_app/$.tsx b/src/routes/_app/$.tsx
index 2659a0fa3..8ed9db3c3 100644
--- a/src/routes/_app/$.tsx
+++ b/src/routes/_app/$.tsx
@@ -82,9 +82,7 @@ const DynamicPluginRoute = () => {
-
- {t('dynamicPluginRoute.notFoundTitle', undefined, 'Page Not Found')}
-
+ {t('common.pageNotFound', undefined, 'Page Not Found')}
{t(
'dynamicPluginRoute.notFoundDescription',