diff --git a/frontend/index.html b/frontend/index.html index a1e2c71ed..0de76cc68 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -115,32 +115,95 @@ }
@@ -148,7 +211,7 @@Starting Windshift…
+Starting Windshift…
This is taking longer than expected. Check your connection or server.
diff --git a/frontend/package.json b/frontend/package.json index 680a0e98f..d445ba1bb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,7 +20,7 @@ "format:check": "biome format .", "lint": "biome lint .", "lint:fix": "biome lint --write .", - "check": "biome check . && node scripts/check-shortcuts.js && node scripts/check-i18n.js", + "check": "biome check . && node scripts/check-shortcuts.js && node scripts/check-i18n.js && node scripts/check-hardcoded-i18n.js", "check:entry-assets": "node scripts/check-entry-assets.js", "check:fix": "biome check --write .", "test": "bun --bun vitest", diff --git a/frontend/scripts/check-hardcoded-i18n.js b/frontend/scripts/check-hardcoded-i18n.js new file mode 100644 index 000000000..02a8077bd --- /dev/null +++ b/frontend/scripts/check-hardcoded-i18n.js @@ -0,0 +1,107 @@ +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); + +// This list is an incremental ratchet: once a user-facing screen has been +// migrated, literal English UI copy must not return to it. +const guardedFiles = [ + 'src/lib/layout/DashboardCustomizationSidebar.svelte', + 'src/lib/pages/Homepage.svelte', + 'src/lib/features/workflows/WorkflowBuilder.svelte', + 'src/lib/pages/Screens.svelte', + 'src/lib/pickers/ConfigurationSetPicker.svelte', + 'src/lib/pickers/ScreenPicker.svelte', + 'src/lib/pickers/WorkflowPicker.svelte', + 'src/lib/settings/ConfigurationSetManager.svelte', + 'src/lib/settings/ConfigurationSetItemTypes.svelte', + 'src/lib/settings/ActionCapabilitiesManager.svelte', + 'src/lib/settings/ActionCredentialManager.svelte', + 'src/lib/settings/AgentTemplateManager.svelte', + 'src/lib/settings/CapabilityManager.svelte', + 'src/lib/settings/HierarchyLevelManager.svelte', + 'src/lib/settings/ItemTypeManager.svelte', + 'src/lib/settings/IntegrationProviderManager.svelte', + 'src/lib/settings/IntegrationsManager.svelte', + 'src/lib/settings/LLMConnectionManager.svelte', + 'src/lib/settings/LinkTypeManager.svelte', + 'src/lib/settings/OAuthClientManager.svelte', + 'src/lib/settings/PriorityManager.svelte', + 'src/lib/settings/StatusCategoryManager.svelte', + 'src/lib/settings/StatusManager.svelte', + 'src/lib/settings/ThemeManager.svelte', + 'src/lib/settings/RunnerPoolManager.svelte', + 'src/lib/workspaces/WorkspaceConfigurationAssigner.svelte', + 'src/lib/workspaces/WorkspaceConfigurationPreview.svelte', + 'src/lib/workspaces/WorkspaceMembers.svelte', + 'src/lib/workspaces/WorkspaceCustomizationSidebar.svelte', + 'src/lib/workspaces/WorkspaceNavigation.svelte', + 'src/lib/workspaces/WorkspaceWelcome.svelte', + 'src/lib/workspaces/Workspaces.svelte', + 'src/lib/widgets/CompletionChartWidget.svelte', + 'src/lib/widgets/CreatedChartWidget.svelte', + 'src/lib/widgets/IterationTimelineWidget.svelte', + 'src/lib/widgets/MilestoneProgressWidget.svelte', + 'src/lib/widgets/MyTasksWidget.svelte', + 'src/lib/widgets/OverdueItemsWidget.svelte', + 'src/lib/widgets/RecentItemsWidget.svelte', + 'src/lib/widgets/StatsCardWidget.svelte', + 'src/lib/widgets/TestCoverageWidget.svelte', + 'src/lib/widgets/UpcomingDeadlinesWidget.svelte', + 'src/lib/widgets/WidgetState.svelte', + 'src/lib/widgets/WidgetWrapper.svelte', + 'src/lib/widgets/dashboard/AssignedToMeWidget.svelte', + 'src/lib/widgets/dashboard/DailyBriefingWidget.svelte', + 'src/lib/widgets/dashboard/DashboardItemRow.svelte', + 'src/lib/widgets/dashboard/DashboardTaskList.svelte', + 'src/lib/widgets/dashboard/DueMark.svelte', + 'src/lib/widgets/dashboard/PersonalTasksWidget.svelte', + 'src/lib/widgets/dashboard/QuickAccessWidget.svelte', + 'src/lib/widgets/dashboard/RecentWorkspacesWidget.svelte', + 'src/lib/widgets/dashboard/SavedSearchWidget.svelte', + 'src/lib/widgets/dashboard/UpcomingMilestonesWidget.svelte', + 'src/lib/widgets/dashboard/WatchedItemsWidget.svelte', + 'src/lib/widgets/dashboard/WhatsNewWidget.svelte', + 'src/lib/widgets/dashboard/YourActivityWidget.svelte', +]; + +const rules = [ + { + name: 'visible text', + pattern: />\s*([A-Z][^<{\n]*?)\s*` that look like HTML text to + // the lightweight regex guard. UI copy lives in the component markup. + const source = readFileSync(path.join(root, relativeFile), 'utf8').replace( + / -Skip to main content + + {getStartupCopy('common.skipToMainContent', i18nReady, t)} +{startupError}
-Check your connection or server, then try again.
+{getStartupCopy(startupError, i18nReady, t)}
+ >{getStartupCopy('common.retry', i18nReady, t)}Work Management
+{t('footer.platformName')}
{label}
+{displayLabel}
{#if detail}{detail}
{/if} diff --git a/frontend/src/lib/components/ItemsByStatusCategory.svelte b/frontend/src/lib/components/ItemsByStatusCategory.svelte index 82545c07e..ae61ee40c 100644 --- a/frontend/src/lib/components/ItemsByStatusCategory.svelte +++ b/frontend/src/lib/components/ItemsByStatusCategory.svelte @@ -2,6 +2,7 @@ import { IconChevronDown, IconChevronRight } from '@tabler/icons-svelte-runes'; import EmptyState from './EmptyState.svelte'; import { itemUrl } from '../utils/urls.js'; + import { systemPriorityName, systemStatusCategoryName } from '../utils/systemLabels.js'; let { statusBreakdown = [], @@ -37,7 +38,12 @@ class="w-3 h-3 rounded-full" style="background-color: {category.category_color || '#9ca3af'};" >- Loading {label}… + {t('common.loading')}
@@ -55,12 +57,13 @@ style="background-color: var(--ds-surface-raised); color: var(--ds-text); box-shadow: var(--ds-shadow-raised);" role="alert" data-testid="root-dialog-error" + data-root-label={label} >- Check your connection, then try again. + {t('errors.NETWORK_ERROR')}
+ >{t('common.retry')} {/await} diff --git a/frontend/src/lib/components/LazyRootView.svelte b/frontend/src/lib/components/LazyRootView.svelte index 76a39b3b8..f9aec93dc 100644 --- a/frontend/src/lib/components/LazyRootView.svelte +++ b/frontend/src/lib/components/LazyRootView.svelte @@ -1,6 +1,7 @@ @@ -112,8 +124,8 @@- {agent.purpose || 'A workspace specialist configured by your administrators.'} + {agent.purpose || t('workspaceAgents.catalog.defaultPurpose')}