Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
71 KiB
71 KiB
Scratchpad — MSP i18n Remaining Batches
- Plan slug:
2026-03-20-msp-i18n-remaining - Created:
2026-03-20
Decisions
- (2026-03-20) Combined all remaining batches into one plan: 7 batches (2b-13 through 2b-20) in one plan since they're all small-to-medium and independent.
- (2026-03-20) 2b-20 is empty: Extensions and licensing components have zero user-visible strings. Close as "no work needed."
- (2026-03-20) Email split from admin: Email provider forms (Microsoft, Gmail, IMAP) are in 2b-18 (msp/email-providers). Email admin settings (EmailSettings, InboundTicketDefaultsManager, M365Diagnostics) are in 2b-8 (msp/admin). Different namespaces, same settings route.
- (2026-03-20) Profile namespace is small: Only ~64 strings across 8 files. Combines user profile, password change, security session management, role assignment, and platform updates.
Discoveries / Constraints
Surveys (2b-13)
- (2026-03-20) 26 files in
packages/surveys/src/components/, well-organized in subdirectories: triggers/, templates/, responses/, dashboard/, analytics/, shared/, public/ - (2026-03-20)
SurveyResponsePage.tsxis PUBLIC-FACING — rendered for end users taking surveys. Locale resolution may differ from MSP portal (no auth session). Needs investigation. - (2026-03-20)
useTriggerReferenceData.ts(80 LOC) — hook with no strings, skip - (2026-03-21) Survey components were already partially keyed under
surveys.*while still usinguseTranslation('common'); this batch should normalize those keys into the dedicatedmsp/surveysnamespace rather than copy them intocommon.
Schedule (2b-14)
- (2026-03-20) 11 files in
packages/scheduling/src/components/schedule/ - (2026-03-20)
EntryPopup.tsx(1,287 LOC, ~68 strings) is the densest — schedule entry create/edit popup - (2026-03-20)
AvailabilitySettings.tsx(1,215 LOC, ~64 strings) — availability window management - (2026-03-20) 3 files have zero strings (TechnicianSidebar, AgentScheduleDrawerStyles, DynamicBigCalendar) — skip
- (2026-03-21) Re-inventory showed the PRD undercounted the “zero-string” files:
TechnicianSidebar.tsxhas compare/reset button labels and tooltips, andWeeklyScheduleEvent.tsxhas delete/continuation tooltip copy. Keep them in scope forF012.
Knowledge Base (2b-15)
- (2026-03-20) 10 files in
packages/documents/src/components/kb/ - (2026-03-20) Well-structured: editor, list, page, import, publishing, review, filters, categories, staleness badge
- (2026-03-20) KB article content comes from database (Hocuspocus/ProseMirror) — NOT in translation scope. Only KB UI chrome is translated.
Jobs (2b-17)
- (2026-03-20) Smallest batch — 7 files, ~29 strings total
- (2026-03-20) All in
packages/jobs/src/components/monitoring/ - (2026-03-20)
JobStepHistory.tsxhas zero visible strings — skip - (2026-03-21)
JobStepHistory.tsxdoes have visible copy (Job Steps,Processed,Retries) in addition to status labels. The batch is still small, but the PRD count underestimates it slightly.
Email Providers (2b-18)
- (2026-03-20) 10 files with strings in
packages/integrations/src/components/email/ - (2026-03-20) 13 files with zero strings (selectors, lists, wrappers, OAuth hooks, schemas, index files) — skip
- (2026-03-20) Admin files (EmailSettings, InboundTicketDefaultsManager, M365Diagnostics) already in 2b-8 — DO NOT duplicate
- (2026-03-21) Implementation inventory found extra in-scope provider setup copy beyond the original estimate:
EmailProviderList.tsx,EmailProviderSelector.tsx,ProviderSetupWizardDialog.tsx,providers/gmail/BasicConfigCard.tsx,providers/gmail/ProcessingSettingsCard.tsx,providers/gmail/OAuthSection.tsx,providers/gmail/schemas.ts, andproviders/gmail/useOAuthPopup.tsall contain visible or user-facing fallback/validation strings. Added follow-up featureF045and testT043so the provider namespace migration covers these surfaces before locale generation. - (2026-03-21)
features.jsonlagged behind the repo forF040: server/public/locales/en/msp/email-providers.json was already created and documented in the progress log, so the checklist was reconciled before continuing with the remaining email-provider implementation work.
Profile (2b-19)
- (2026-03-20) Spans 3 packages:
packages/users/,server/src/components/settings/profile/,server/src/components/settings/security/,server/src/components/platform-updates/ - (2026-03-20)
SecuritySettingsPage.tsxtab labels likely already covered bymsp/settingsnamespace — only page-level strings are new - (2026-03-20) Extensions (
DynamicNavigationSlot.tsx) and licensing (ReduceLicensesModal.tsx,LicensePurchaseForm.tsx) — all zero strings - (2026-03-22) Re-inventory invalidated the original
2b-20assumption. Current CE/community fallbacks do contain user-visible copy in DynamicNavigationSlot.tsx, ExtensionManagement.tsx, ExtensionComponentLoader.tsx, packages/product-extensions/oss/entry.tsx, packages/product-extensions/pages/list.tsx, packages/ee/src/components/licensing/ReduceLicensesModal.tsx, and packages/ee/src/components/licensing/LicensePurchaseForm.tsx. Added follow-up feature/test items formsp/extensionsandmsp/licensinginstead of incorrectly force-closing the batch. - (2026-03-21) For
msp/profile, the lowest-risk namespace shape is to preserve the existingprofile.*andsecurity.*key families frommsp/settings, then add only the missing password/profile error/platform-update detail keys. That keeps the rewrites mechanical and avoids inventing a second taxonomy for already-translated settings/profile surfaces. - (2026-03-22) For the
2b-20follow-up,msp/extensionsshould absorb both the settings-shell keys that currently live undermsp/settings.extensions.*and the dedicated CE/OSS extension placeholder copy. That keeps extension-only fallbacks off the generic settings namespace and gives the/msp/extensionsroute a single feature namespace. - (2026-03-22) While wiring
msp/extensions, two extra extension placeholders surfaced beyond the first re-inventory: server/src/app/msp/settings/extensions/install/page.tsx still hardcoded its loading fallback, and packages/product-settings-extensions/oss/entry.tsx still hardcoded all enterprise-feature stub copy for the OSS settings-extension entry. They were folded intoF062instead of splitting another micro-feature. - (2026-03-22) Another re-inventory during route registration found deeper batch
2b-20work still outside the CE/OSS stub pass: packages/product-extensions/ee/entry.tsx has untranslated runtime/error-state copy, and the real licensing purchase flow still has hardcoded MSP-facing strings in ee/server/src/components/licensing/LicensePurchaseForm.tsx, ee/server/src/components/licensing/ReduceLicensesModal.tsx, ee/server/src/app/msp/licenses/purchase/page.tsx, and ee/server/src/app/msp/licenses/purchase/success/page.tsx plus their sharedserver/src/appCE wrappers. AddedF069-F076andT064-T067so the follow-up scope covers these remaining MSP-facing extension/licensing surfaces before the route/config cleanup is closed. - (2026-03-22) Completed
F069: expanded server/public/locales/en/msp/licensing.json from the original 5-key CE stub source into the full licensing source of truth for the enterprise purchase/update/remove flow. The namespace now covers the purchase page header, purchase success page, embedded subscription form, enterprise reduction modal, and shared license/user singular-plural labels while preserving the earlier CE stub keys. - (2026-03-22) Validation for
F069: re-parsed the expanded licensing namespace successfully with Node, counted 99 leaf strings after the enterprise-flow expansion, and confirmedgit diff --checkstayed clean before the component rewrites. - (2026-03-23)
F070surfaced a few wrapper-only licensing keys thatF069had not captured yet: translated metadata titles for the purchase and success routes, the subscription-form shell title, interval labels for localized currency summaries, and the checkout/confirmation cancel label. These were folded into server/public/locales/en/msp/licensing.json as part of the component wiring instead of splitting another micro-feature.
Commands / Runbooks
Validation
node scripts/validate-translations.cjs
npm run build
node -e "JSON.parse(require('fs').readFileSync('server/public/locales/en/msp/surveys.json','utf8'))"
npx eslint packages/surveys/src/components/templates/TemplateList.tsx packages/surveys/src/components/templates/TemplateForm.tsx packages/surveys/src/components/triggers/TriggerList.tsx packages/surveys/src/components/triggers/TriggerForm.tsx
npx tsc -p packages/surveys/tsconfig.json --noEmit
Pseudo-locale generation
cat << 'SCRIPT' | node - server/public/locales/en/msp/<name>.json 11111
const fs = require("fs");
const fill = process.argv[3];
const transform = (obj) => {
const out = {};
for (const [k, v] of Object.entries(obj)) {
out[k] = typeof v === "object" && v !== null ? transform(v) : fill;
}
return out;
};
const src = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
console.log(JSON.stringify(transform(src), null, 2));
SCRIPT
Italian accent audit
for ns in surveys schedule knowledge-base jobs email-providers profile; do
echo "=== $ns ===";
grep -n ' e [a-z]\| puo \| gia \| verra \| funzionalita\| necessario' server/public/locales/it/msp/$ns.json 2>/dev/null || echo "(not yet created)";
done
Links / References
- Translation plan:
.ai/translation/MSP_i18n_plan.md - Translation guide:
.ai/translation/translation-guide.md - All previous plans:
docs/plans/2026-03-19-msp-i18n-batch-2b1-core/(complete)docs/plans/2026-03-20-msp-i18n-dispatch-reports-admin-time/docs/plans/2026-03-20-msp-i18n-clients-assets-onboarding/docs/plans/2026-03-20-msp-i18n-contracts-billing/docs/plans/2026-03-20-msp-i18n-workflows/
Key directories
| Directory | Files | Strings | Batch |
|---|---|---|---|
packages/surveys/src/components/ |
26 | ~217 | 2b-13 |
packages/scheduling/src/components/schedule/ |
11 | ~211 | 2b-14 |
packages/documents/src/components/kb/ |
10 | ~189 | 2b-15 |
packages/jobs/src/components/monitoring/ |
7 | ~29 | 2b-17 |
packages/integrations/src/components/email/ (providers only) |
10 | ~136 | 2b-18 |
packages/users/ + server/src/components/settings/ + server/src/components/platform-updates/ |
8 | ~64 | 2b-19 |
Recommended execution order
- 2b-17 (jobs) — 29 strings, trivial
- 2b-19 (profile) — 64 strings, small
- 2b-18 (email-providers) — 136 strings, moderate
- 2b-15 (knowledge-base) — 189 strings, moderate
- 2b-14 (schedule) — 211 strings, moderate
- 2b-13 (surveys) — 217 strings, moderate
- 2b-20 (close) — 0 strings, just mark done
Progress Log
- (2026-03-21) Completed
F001: added server/public/locales/en/msp/surveys.json as the English source of truth for surveys. Keys were normalized into feature-specific groups (moduleFrame,settings,response,rating,responses,dashboard,analytics,clientSummary,ticketSummary) so later component rewrites can move offcommoncleanly. - (2026-03-21) Validation for
F001: parsed the new JSON successfully withnode -e "JSON.parse(...)". - (2026-03-21) Completed
F002: rewired the survey settings surface touseTranslation('msp/surveys')inTriggerForm.tsx,TriggerList.tsx,TemplateForm.tsx, andTemplateList.tsx. Shared verbs stayed incommon, while survey-specific copy moved to the new namespace root with{ defaultValue }options. - (2026-03-21) Validation for
F002: targetedeslintpassed cleanly for the four edited survey settings files, andnpx tsc -p packages/surveys/tsconfig.json --noEmitpassed after the settings rewrite. - (2026-03-21) Completed
F003: movedSurveySettings.tsx,SurveyResponsePage.tsx,RatingDisplay.tsx,ResponseFilters.tsx,SurveyResponsesView.tsx, andResponseDetailModal.tsxontomsp/surveys. Response detail timestamps now useuseFormatters(), andTemplateFormnow requests translated default rating labels from the shared rating helper. - (2026-03-21) Validation for
F003:npx tsc -p packages/surveys/tsconfig.json --noEmitstill passed after the response-flow and shared helper rewrites. - (2026-03-21) Completed
F004: localized the remaining survey chrome and insights surface: dashboard widgets, analytics widgets/pages,SurveyModuleFrame,ClientSurveySummaryCard, andTicketSurveySummaryCard. Server componentsSurveyDashboard.tsxandSurveyAnalyticsPage.tsxnow usegetServerTranslation('msp/surveys'), and client summary/dashboard lists useuseFormatters()for locale-aware timestamps. - (2026-03-21) Validation for
F004:npx tsc -p packages/surveys/tsconfig.json --noEmitpassed after the dashboard, analytics, and survey chrome rewrites. - (2026-03-21) Follow-up survey cleanup before locale generation: kept
RatingDisplay.tsxon the survey namespace for the rating-button aria label with text, and correctedTriggerForm.tsxto reusecommon.messages.requiredinstead of a missingcommon.errors.requiredkey. Re-rannpx tsc -p packages/surveys/tsconfig.json --noEmitto confirm the worktree was clean before starting translated survey locale files. - (2026-03-21) Completed
F005: added survey namespace files forde,es,fr,it,nl, andpl, then generatedxxandyyfrom the English source. The survey locale set now exists in all 9 required locales underserver/public/locales/*/msp/surveys.json. - (2026-03-21) Validation for
F005: parsed the 6 translated JSON files with Node, rannode scripts/generate-pseudo-locales.cjs, restored unrelated pre-existing pseudo-locale interpolation differences outside the surveys namespace, and confirmednode scripts/validate-translations.cjspassed withErrors: 0andWarnings: 0. - (2026-03-21) Completed
F006: ran the Italian accent audit against server/public/locales/it/msp/surveys.json. The broad grep only surfaced legitimateeconjunctions; a targeted search for known missing-accent spellings (puo,gia,verra,funzionalita,necessario) returned no matches, so no Italian copy changes were needed. - (2026-03-21) Completed
F010: added server/public/locales/en/msp/schedule.json as the English schedule namespace. The file groups strings bypage,sidebar,agentView,calendar,weeklyEvent,requests,availabilitySettings, andentryPopupso the upcoming wiring can move the schedule surface off hardcoded English in coherent slices. - (2026-03-21) Validation for
F010: parsedserver/public/locales/en/msp/schedule.jsonsuccessfully withnode -e "JSON.parse(...)". - (2026-03-21) Completed
F011: wired the three largest schedule files touseTranslation('msp/schedule').EntryPopup.tsxnow uses translated dialog/validation/approval/recurrence copy and locale-aware date formatting for appointment request timestamps;AvailabilitySettings.tsxnow translates dialog tabs, auto-approval/settings copy, tables, exceptions, and success/error toasts;ScheduleCalendar.tsxnow translates the legend, toolbar, loading states, delete dialogs, and month-view event tooltips with locale-aware dates. - (2026-03-21) Validation for
F011:git diff --checkpassed, andnpx tsc -p packages/scheduling/tsconfig.json --noEmitpassed after the schedule rewrites. - (2026-03-21) Completed
F012: localized the rest of the schedule surface.AppointmentRequestsPanel.tsxnow translates the request list/detail/approval flow and uses locale-aware request timestamps;SchedulePage.tsx,AgentScheduleView.tsx,WeeklyScheduleEvent.tsx, andTechnicianSidebar.tsxnow translate page chrome, overlay states, compare controls, delete tooltips, and event tooltip copy. - (2026-03-21) Validation for
F012:git diff --checkpassed, andnpx tsc -p packages/scheduling/tsconfig.json --noEmitpassed after wiring the remaining schedule files with user-visible strings. - (2026-03-21) Completed
F013: added schedule locale files forde,es,fr,it,nl, andpl, then generated targetedxxandyypseudo-locales from the English source. The schedule namespace now exists in all 9 required locales underserver/public/locales/*/msp/schedule.json. - (2026-03-21) Validation for
F013: counted 293 leaf strings in each generated real locale, confirmed the pseudo-locale outputs return11111for schedule keys, and re-rannode scripts/validate-translations.cjswithErrors: 0andWarnings: 0. - (2026-03-21) Completed
F014: ran the Italian accent audit against server/public/locales/it/msp/schedule.json. The broad grep only matched legitimate conjunctions such asdata e oraandQuesto e gli eventi futuri; a tighter search for common accentless spellings (puo,gia,verra,funzionalita,perche, weekday names without accents) returned no matches, so no Italian copy changes were required. - (2026-03-21) Completed
F020: added server/public/locales/en/msp/knowledge-base.json as the English KB namespace source of truth. The file is grouped by surface (page,list,editor,filters,categoryTree,publishing,reviewDashboard,importDialog,staleness,shared) so the upcoming KB rewrites can move offfeatures/documentscleanly while also covering the currently hardcoded status, audience, type, review-cycle, and pagination labels. - (2026-03-21) Validation for
F020: parsed the new JSON successfully and counted 163 leaf strings, covering the existingkb.*copy plus the missing hardcoded option-label maps surfaced during the KB inventory. - (2026-03-21) Completed
F021: rewired KBArticleEditor.tsx, KBArticleList.tsx, and KnowledgeBasePage.tsx touseTranslation('msp/knowledge-base'). The editor and list now pull status, audience, type, review-cycle, pagination, and archive-dialog copy from the new KB namespace, and the editor/list date rendering now uses locale-awareuseFormatters()helpers instead of hardcoded English formatting defaults. - (2026-03-21) Validation for
F021:git diff --checkpassed,rgconfirmed there are no remainingfeatures/documentsor legacykb.lookups in the three rewritten files, andnpx tsc -p packages/documents/tsconfig.json --noEmitpassed after the KB namespace swap. - (2026-03-21) Completed
F022: moved the rest of the KB surface tomsp/knowledge-base: KBImportDialog.tsx, KBPublishingControls.tsx, KBReviewDashboard.tsx, KBArticleFilters.tsx, KBCategoryTree.tsx, and KBStalenessBadge.tsx. This pass also removed the remaining hardcoded status, audience, type, and import-summary strings, and converted the inline English date/count string-building in publishing, import, review, and staleness UI to named interpolation values. - (2026-03-21) Validation for
F022:git diff --checkpassed,rgconfirmed the six remaining KB files no longer referencefeatures/documentsor legacykb.keys, andnpx tsc -p packages/documents/tsconfig.json --noEmitpassed after the remainder of the KB namespace migration. - (2026-03-21) Completed
F023: added KB namespace files forde,es,fr,it,nl, andpl, then generated targetedxxandyypseudo-locales from the English source. The KB namespace now exists in all 9 required locales underserver/public/locales/*/msp/knowledge-base.json. - (2026-03-21) Validation for
F023: counted 163 leaf strings in each generated real locale, confirmed the pseudo-locale outputs were generated from the KB English source without touching unrelated namespaces, and re-rannode scripts/validate-translations.cjswithErrors: 0andWarnings: 0. - (2026-03-21) Completed
F024: ran the Italian accent audit against server/public/locales/it/msp/knowledge-base.json. The broad grep only surfaced legitimate conjunctions such ascreare e gestire; a tighter search for common accentless spellings (puo,gia,verra,funzionalita,perche, weekday names without accents) returned no matches, so no Italian copy changes were required. - (2026-03-21) Completed
F030: added server/public/locales/en/msp/jobs.json as the English jobs namespace. The file is grouped by monitoring surface (recentTable,metrics,historyTable,progress,drawer,stepHistory,shared) so the next jobs rewrite can cover table columns, status/runner labels, relative-time copy, drawer headings, and step-history labels from one namespace. - (2026-03-21) Validation for
F030: parsed the new JSON successfully and counted 47 leaf strings, reflecting the extra step-history and time-format copy that the original jobs estimate undercounted. - (2026-03-21) Completed
F031: rewired the jobs monitoring components touseTranslation('msp/jobs'): RecentJobsDataTable.tsx, JobMetricsDisplay.tsx, JobHistoryTable.tsx, JobProgress.tsx, JobDetailsDrawer.tsx, and JobStepHistory.tsx. This moved the remaining hardcoded table/drawer/metrics copy into the jobs namespace, localized status and runner labels, and replaced the progress panel's English-onlydate-fnsrelative-time string with locale-awareuseFormatters(). - (2026-03-21) Validation for
F031:git diff --checkpassed,npx tsc -p packages/jobs/tsconfig.json --noEmitpassed after the jobs namespace swap, and the one TypeScript issue surfaced during the pass (counttyped as a string in the seconds formatter) was fixed by keeping the interpolated count numeric. - (2026-03-21) Completed
F032: added jobs namespace files forde,es,fr,it,nl, andpl, then generated targetedxxandyypseudo-locales from the English source. The jobs namespace now exists in all 9 required locales underserver/public/locales/*/msp/jobs.json. - (2026-03-21) Validation for
F032: counted 47 leaf strings in each generated real locale, generated the jobs pseudo-locales directly from the English source without touching unrelated namespaces, and re-rannode scripts/validate-translations.cjswithErrors: 0andWarnings: 0. - (2026-03-21) Completed
F033: ran the Italian accent audit against server/public/locales/it/msp/jobs.json. Neither the broad grep nor the tighter search for common accentless spellings returned any matches, so no Italian copy changes were required. - (2026-03-21) Completed
F040: added server/public/locales/en/msp/email-providers.json as the English email-provider namespace source of truth for the main provider configuration surfaces. The file groups strings byconfiguration,providerCard,forms.*, andinboundDefaultsFormso the provider forms, configuration shell, defaults form, and card/list surfaces can move off hardcoded English in coherent slices. - (2026-03-21) Validation for
F040: parsed the new JSON successfully; the initial namespace intentionally covers the main provider forms/configuration/card/defaults surfaces first, and the newly-added follow-up featureF045tracks the additional selector/wizard/gmail-helper copy discovered during implementation so locale generation happens only after those extra callsites are migrated. - (2026-03-21) Completed
F041: rewired MicrosoftProviderForm.tsx, GmailProviderForm.tsx, and ImapProviderForm.tsx touseTranslation('msp/email-providers'). The Microsoft and IMAP forms now pull local zod validation copy, section headings, OAuth UI, defaults selectors, and submit actions from the new namespace, while the Gmail form now translates its main alert/section/action copy and passes translated labels into its shared Gmail subcomponents. - (2026-03-21) Validation for
F041:git diff --checkpassed andnpx tsc -p packages/integrations/tsconfig.json --noEmitpassed after the provider-form rewrite. Gmail helper subcomponents, OAuth popup fallbacks, and schema-level messages that still live outside the main form remain tracked separately underF045. - (2026-03-21) Completed
F042: rewired EmailProviderConfiguration.tsx, InboundTicketDefaultsForm.tsx, and EmailProviderCard.tsx touseTranslation('msp/email-providers'). This moved the configuration shell header/help/toast copy, defaults-form validation and field text, provider-card actions/status text, and the inbound-defaults warning into the email-provider namespace. - (2026-03-21) Validation for
F042:git diff --checkpassed,npx tsc -p packages/integrations/tsconfig.json --noEmitpassed after the configuration/defaults/card rewrites, and the updated server/public/locales/en/msp/email-providers.json parsed successfully with Node. - (2026-03-21) Completed
F045: localized the remaining provider setup/list/helper surface: EmailProviderList.tsx, EmailProviderSelector.tsx, ProviderSetupWizardDialog.tsx, BasicConfigCard.tsx, ProcessingSettingsCard.tsx, OAuthSection.tsx, schemas.ts, and useOAuthPopup.ts. The Gmail schema now builds translated validation copy at runtime, the OAuth popup hook emits localized fallback errors, and the selector/list/wizard UI no longer leaves provider-setup copy hardcoded outside the namespace. - (2026-03-21) Validation for
F045:git diff --checkpassed,npx tsc -p packages/integrations/tsconfig.json --noEmitpassed after restoring the publicbaseGmailProviderSchemaexport for compatibility, and the expanded server/public/locales/en/msp/email-providers.json parsed successfully with Node. - (2026-03-21) Completed
F043: added email-provider locale files forde,es,fr,it,nl, andpl, then regenerated targetedxxandyypseudo-locales from the English source. During locale validation, the Gmail OAuth warning copy exposed a runtime issue in GmailProviderForm.tsx: it was still interpolating raw English action words into the localized sentence. That copy was split into separate add/update keys so every locale can render the warning naturally. - (2026-03-21) Validation for
F043:node scripts/validate-translations.cjspassed withErrors: 0andWarnings: 0,git diff --checkstayed clean after the locale generation, and a direct key-set comparison confirmedserver/public/locales/{de,es,fr,it,nl,pl,xx,yy}/msp/email-providers.jsonnow matches the English namespace exactly. - (2026-03-21) Completed
F044: ran the Italian accent audit against server/public/locales/it/msp/email-providers.json. The broad grep only surfaced legitimate conjunctions, and a whole-word sweep for common missing-accent spellings (puo,gia,verra,funzionalita,perche) returned zero matches, so no Italian copy corrections were required. - (2026-03-21) Completed
F050: added server/public/locales/en/msp/profile.json as the English profile namespace source of truth. The file carries forward the existingprofile.*andsecurity.*shapes frommsp/settings, adds the password-change strings currently living under the client-portal profile namespace, and introduces the missing profile load/save error and platform-update detail labels so the upcoming component rewrites can move tomsp/profilewithout renaming every callsite. - (2026-03-21) Completed
F051: rewired UserProfile.tsx, PasswordChangeForm.tsx, and AdminSessionManagement.tsx tomsp/profile. The profile page now localizes its tab labels, dynamic loading skeletons, and load/save error fallbacks from the new namespace; the password form no longer reads profile copy from the client-portal namespace; and admin session timestamps now use locale-awareuseFormatters()instead ofdate-fnsEnglish relative text. - (2026-03-21) Validation for
F051:git diff --checkpassed,npx tsc -p packages/users/tsconfig.json --noEmitpassed,npx tsc -p server/tsconfig.json --noEmitpassed after the namespace swap, and the updated server/public/locales/en/msp/profile.json parsed successfully with Node. - (2026-03-21) Completed
F052: localized the remaining profile/security wrapper surfaces: UserRoleAssignment.tsx, SecuritySettingsPage.tsx, and PlatformUpdateDetail.tsx. The security page now loads translated tab labels and loading skeletons frommsp/profile, role assignment no longer hardcodes the empty-state type labels or unnamed-user fallback, and platform update details now translate the back button/severity labels while formatting the created date with locale-awareuseFormatters(). - (2026-03-21) Validation for
F052:git diff --checkpassed,npx tsc -p server/tsconfig.json --noEmitpassed after the remaining profile/security rewrites, and the enriched server/public/locales/en/msp/profile.json still parsed successfully with Node. - (2026-03-21) Completed
F053: added profile namespace files forde,es,fr,it,nl, andpl, then regenerated targetedxxandyypseudo-locales from the English source. Unlike the email-provider batch, most profile/security strings were assembled from already-translatedmsp/settingsandclient-portallocale data, with only the new profile load/save errors, password validation copy, session error messages, unnamed-user fallback, and platform-update detail labels filled in manually. - (2026-03-21) Validation for
F053:node scripts/validate-translations.cjspassed withErrors: 0andWarnings: 0,git diff --checkstayed clean, and direct leaf counts matched across the English, production, and pseudo profile locale files (117 leaf strings each). - (2026-03-21) Completed
F054: ran the Italian accent audit against server/public/locales/it/msp/profile.json. A whole-word sweep for common missing-accent spellings (puo,gia,verra,funzionalita,perche) returned zero matches, so the new Italian profile locale did not require accent corrections. - (2026-03-22) Completed
F060: re-inventoried the original2b-20“no work needed” batch and confirmed the assumption is stale in the current repo. Extension and licensing community/OSS fallback components now contain visible copy, so the batch cannot be closed as empty; instead, concrete follow-up items (F061-F068,T061-T063) were added formsp/extensionsandmsp/licensing. - (2026-03-22) Completed
F061: added server/public/locales/en/msp/extensions.json as the English source of truth for the extension follow-up scope. The namespace carries the settings-shell labels/loading text previously parked undermsp/settings.extensions, plus the CE loader fallback copy and OSS/msp/extensionslist/detail placeholder metadata needed by the current community build. - (2026-03-22) Validation for
F061: parsed the new extension namespace successfully with Node, counted 22 leaf strings, and confirmedgit diff --checkstayed clean before starting the component rewrites. - (2026-03-22) Completed
F062: rewired the extension follow-up surfaces tomsp/extensions: DynamicNavigationSlot.tsx, ExtensionManagement.tsx, ExtensionComponentLoader.tsx, packages/product-extensions/oss/entry.tsx, packages/product-extensions/pages/list.tsx, packages/product-extensions/pages/details.tsx, packages/product-extensions/pages/settings.tsx, packages/product-settings-extensions/oss/entry.tsx, server/src/app/msp/settings/extensions/page.tsx, and server/src/app/msp/settings/extensions/install/page.tsx. This pass moved the extension nav heading, settings-shell tabs/loading/fallbacks, CE loader stubs, OSS extension list/detail/settings placeholders, and OSS settings-extension enterprise-feature stubs onto the dedicated namespace while keeping static route metadata untouched for compatibility. - (2026-03-22) Validation for
F062: expanded server/public/locales/en/msp/extensions.json to cover the additional OSS settings-extension placeholder keys, re-parsed it successfully with Node, confirmedgit diff --checkstayed clean, and rannpx tsc -p packages/ui/tsconfig.json --noEmitplusnpx tsc -p server/tsconfig.json --noEmitwithout TypeScript errors after the extension namespace swap. - (2026-03-22) Completed
F063: added extension namespace files forde,es,fr,it,nl, andpl, then generated targetedxxandyypseudo-locales from the English source. The new locale set intentionally reuses the existingmsp/settings.extensions.*translations for the settings-shell copy, while the new community-edition, enterprise-feature, and extension-placeholder page strings were translated manually to keep the extension-specific namespace coherent. - (2026-03-22) Validation for
F063: counted 35 leaf strings in each generated real and pseudo extension locale file, confirmedgit diff --checkstayed clean, and re-rannode scripts/validate-translations.cjswithErrors: 0andWarnings: 0. - (2026-03-22) Completed
F064: ran the Italian accent audit against server/public/locales/it/msp/extensions.json. The broad grep only surfaced the legitimate conjunction inInstalli, configuri e gestisca; a whole-word sweep for common accentless spellings (puo,gia,verra,funzionalita,perche) returned zero matches, so no Italian copy corrections were required. - (2026-03-22) Completed
F065: added server/public/locales/en/msp/licensing.json as the English source of truth for the CE licensing stubs. The namespace intentionally stays minimal:reduceModal.*andpurchaseForm.*carry the Enterprise-only licensing copy, while the modal button can continue reusingcommon.actions.close. - (2026-03-22) Validation for
F065: parsed the new licensing namespace successfully with Node, counted 5 leaf strings, and confirmedgit diff --checkstayed clean before the component rewrites. - (2026-03-22) Completed
F066: rewired the CE licensing stubs tomsp/licensing: ReduceLicensesModal.tsx now reads its title and Enterprise-only body copy from the new namespace while reusingcommon.actions.close, and LicensePurchaseForm.tsx now reads its title plus both hosted/self-hosted stub messages frommsp/licensing. - (2026-03-22) Validation for
F066:git diff --checkstayed clean,rgconfirmed the licensing stub strings now only remain asdefaultValuefallbacks in the two CE components, andnpx tsc -p server/tsconfig.json --noEmitpassed after the namespace swap. - (2026-03-22) Completed
F067: added licensing namespace files forde,es,fr,it,nl, andpl, then generated targetedxxandyypseudo-locales from the English source. The licensing batch is intentionally small, so the locale files were translated directly from the 5-key English source rather than reusing a broader settings namespace. - (2026-03-22) Validation for
F067: counted 5 leaf strings in each generated real and pseudo licensing locale file, confirmedgit diff --checkstayed clean, and re-rannode scripts/validate-translations.cjswithErrors: 0andWarnings: 0. - (2026-03-22) Completed
F068: ran the Italian accent audit against server/public/locales/it/msp/licensing.json. Neither the broad grep nor the whole-word sweep for common accentless spellings (puo,gia,verra,funzionalita,perche) returned any matches, so no Italian copy corrections were required. - (2026-03-23) Completed
F070: localized the enterprise licensing purchase flow and shared wrappers withmsp/licensing: ee/server/src/components/licensing/LicensePurchaseForm.tsx, ee/server/src/components/licensing/ReduceLicensesModal.tsx, ee/server/src/app/msp/licenses/purchase/page.tsx, ee/server/src/app/msp/licenses/purchase/success/page.tsx, plus the mirrored server/src/app/msp/licenses/purchase/page.tsx and server/src/app/msp/licenses/purchase/success/page.tsx wrappers. This pass also moved the four purchase/success layout metadata titles togenerateMetadata()withgetServerTranslation('msp/licensing'), and replaced the last hardcodedtoLocaleDateString('en-US')/ manual currency-per-month strings with locale-awareuseFormatters()output. - (2026-03-23) Validation for
F070: server/public/locales/en/msp/licensing.json re-parsed successfully with Node;git diff --checkstayed clean;npx eslintpassed for all edited licensing pages/layouts/components;npx tsc -p server/tsconfig.json --noEmitpassed after the licensing rewrite; andnpx tsc -p ee/server/tsconfig.json --noEmitremains blocked by unrelated pre-existingTS2307module-resolution failures inpackages/assets/src/actions/assetNoteActions.ts,packages/clients/src/actions/clientNoteActions.ts, andpackages/clients/src/actions/contact-actions/contactNoteActions.tsfor@alga-psa/block-content/actions. - (2026-03-23) Completed
F071: regenerated the licensing locale set after the enterprise-flow expansion. server/public/locales/{de,es,fr,it,nl,pl}/msp/licensing.json now contain full translations for the purchase page, success page, subscription form, and license-removal flow, and server/public/locales/{xx,yy}/msp/licensing.json were regenerated directly from the updated English source so the pseudo-locales cover the new enterprise keys too. - (2026-03-23) Validation for
F071: counted 108 leaf strings in eachmsp/licensinglocale file, confirmed there are no missing or extra keys versus English, re-rannode scripts/validate-translations.cjswithErrors: 0andWarnings: 0, and confirmedgit diff --checkstayed clean after the locale regeneration. - (2026-03-23) Completed
F072: ran the Italian accent audit against server/public/locales/it/msp/licensing.json after the enterprise-flow expansion. The broad grep only surfaced legitimate conjunctions likee per/conferma e paga, and a targeted whole-word sweep for common accentless spellings (puo,gia,verra,funzionalita,perche, weekday names without accents) returned zero matches, so no Italian copy corrections were required. - (2026-03-23) Completed
F073: expanded server/public/locales/en/msp/extensions.json with a dedicatedruntime.*block for the EE extension entry route. The new keys cover the entry metadata title plus the runtime load failure, not-found state, missing bundle state, missing runtime-domain state, and their CTA links sopackages/product-extensions/ee/entry.tsxcan move off hardcoded English without mixing runtime copy into the OSS placeholder groups. - (2026-03-23) Validation for
F073: re-parsed server/public/locales/en/msp/extensions.json successfully with Node, counted 44 leaf strings after the runtime-state expansion, and confirmedgit diff --checkstayed clean before the component rewrite. - (2026-03-23) Completed
F074: rewired packages/product-extensions/ee/entry.tsx tomsp/extensions. The EE runtime entry now usesgetServerTranslation('msp/extensions')for its metadata title plus the runtime load error, not-found state, missing bundle state, missing runtime-domain state, and CTA links. The non-productiondocker-modedebug banner remains English intentionally because it is diagnostic-only output rather than shipped MSP UI copy. - (2026-03-23) Validation for
F074:npx eslint packages/product-extensions/ee/entry.tsxpassed cleanly after adding the file-level Nodeprocessglobal declaration,git diff --checkstayed clean, and anrgsweep confirmed the former runtime/error phrases now only remain asdefaultValuefallbacks in the EE entry file. - (2026-03-23) Completed
F075: regenerated the extension locale set after the EE runtime-state expansion. server/public/locales/{de,es,fr,it,nl,pl}/msp/extensions.json now include translations for the runtime metadata title, runtime load failure, not-found state, missing bundle/domain states, and their CTA links, and server/public/locales/{xx,yy}/msp/extensions.json were regenerated from the updated English source. - (2026-03-23) Validation for
F075: counted 44 leaf strings in eachmsp/extensionslocale file, confirmed there are no missing or extra keys versus English, re-rannode scripts/validate-translations.cjswithErrors: 0andWarnings: 0, and confirmedgit diff --checkstayed clean after the locale regeneration. - (2026-03-23) Completed
F076: ran the Italian accent audit against server/public/locales/it/msp/extensions.json after the runtime-state expansion. The broad grep only surfaced the legitimate conjunction inInstalli, configuri e gestisca; a targeted whole-word sweep for common accentless spellings (puo,gia,verra,funzionalita,perche, weekday names without accents) returned zero matches, so no Italian copy corrections were required. - (2026-03-23)
F090scope had to expand beyond the original 8 PRD routes. The2b-20follow-up added livemsp/extensionsandmsp/licensingsurfaces, and the already-localized settings-extension pages at/msp/settings/extensionswere still missing a route-level namespace registration. Rather than splitting another cross-cutting micro-feature, the route-registry pass now covers those prefixes alongside the original survey/schedule/KB/jobs/email/profile routes. - (2026-03-23) Completed
F090: updated packages/core/src/lib/i18n/config.ts soROUTE_NAMESPACESnow loadsmsp/surveys,msp/schedule,msp/knowledge-base,msp/jobs,msp/email-providers,msp/profile,msp/extensions, andmsp/licensingon the routes that render them. This pass also corrected/msp/settingsto loadmsp/adminwithmsp/email-providers, added the longer/msp/settings/extensionsprefix for settings-shell extension pages, and registered/msp/extensionsplus/msp/licensesso the follow-up extension/licensing pages preload their dedicated namespaces. - (2026-03-23) Validation for
F090:npx eslint packages/core/src/lib/i18n/config.tspassed cleanly after adding the file-level Nodeprocessglobal declaration,git diff --checkstayed clean, andnpx tsx --evalconfirmedgetNamespacesForRoute()returns the expected namespace arrays for/msp/surveys,/msp/schedule,/msp/knowledge-base,/msp/jobs,/msp/settings,/msp/settings/extensions,/msp/profile,/msp/security-settings,/msp/platform-updates,/msp/extensions, and/msp/licenses/purchase. - (2026-03-23) Completed
F091: re-rannode scripts/validate-translations.cjsagainst the full current locale tree after the licensing, extension, and route-registry follow-up work. The final validator pass for this plan completed withErrors: 0andWarnings: 0, confirming all newly-added MSP namespaces are structurally aligned acrossen, the six production locales, and both pseudo-locales. - (2026-03-23) Completed
F092: regeneratedxxandyydirectly from the English sources for all newly-added MSP namespaces (surveys,schedule,knowledge-base,jobs,email-providers,profile,extensions,licensing). This explicit final pass only changed the survey pseudo files; the other pseudo namespaces were already aligned with English. - (2026-03-23) Validation for
F092: confirmed every regenerated pseudo file contains only11111leaf values with leaf counts matching English for each namespace (surveys259,schedule293,knowledge-base163,jobs47,email-providers285,profile117,extensions44,licensing108), andgit diff --checkstayed clean after the pseudo-locale refresh. - (2026-03-23)
packages/product-extensions/ee/entry.tsxnow exportsgenerateMetadata()alongside the default page component, so the route shims at server/src/app/msp/extensions/[id]/page.tsx, server/src/app/client-portal/extensions/[id]/page.tsx, and ee/server/src/app/msp/extensions/[id]/page.tsx must re-export bothdefaultandgenerateMetadata. The ambient declaration in server/src/types/external-modules.d.ts and the metadata unit assertions in server/src/test/unit/app/pageTitles.metadata.test.ts were updated to match so the production build recognizes the export shape. - (2026-03-23) Completed
F093: reran the full production build from the current translation worktree after the extension metadata/export fix. The build now includes the localized extension route metadata path without regressing the rest of the app build. - (2026-03-23) Validation for
F093:npm run buildcompleted successfully end-to-end with exit code 0. The run emitted existing webpack warnings only (scheduling conflicting star exports,handlebarsrequire.extensions,fluent-ffmpeg/knex/Temporal dynamic dependency warnings, and the Next.js middleware deprecation notice); TypeScript, static generation, build traces, and final page optimization all finished successfully. - (2026-03-23) Completed
T001: re-verified the survey locale set against the final translation validation pass. - (2026-03-23) Validation for
T001: the earlier survey locale generation underF005and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirmingmsp/surveysmatches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T002: confirmed the full survey component batch still compiles with themsp/surveysnamespace wiring. - (2026-03-23) Validation for
T002: the targetednpx tsc -p packages/surveys/tsconfig.json --noEmitruns logged underF002,F003, andF004all passed after the survey rewrites, covering the 26 in-scope survey components with no TypeScript errors. - (2026-03-23) Completed
T003: closed the survey Italian accent audit checkpoint. - (2026-03-23) Validation for
T003: theF006audit on server/public/locales/it/msp/surveys.json found no accentlesspuo/gia/verra/funzionalita/necessarioregressions, so the Italian survey locale passed unchanged. - (2026-03-23) Completed
T004: verified representative survey dashboard/settings/response keys resolve to the pseudo-locale fill token inxx. - (2026-03-23) Validation for
T004: a focused Node assertion against server/public/locales/xx/msp/surveys.json confirmed 9 representative keys spanning the dashboard, triggers, templates, analytics, and responses surfaces all resolve to11111. - (2026-03-23) Completed
T010: re-verified the schedule locale set against the final translation validation pass. - (2026-03-23) Validation for
T010: the earlier schedule locale generation underF013and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirmingmsp/schedulematches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T011: confirmed the full schedule component batch still compiles with themsp/schedulenamespace wiring. - (2026-03-23) Validation for
T011: the targetednpx tsc -p packages/scheduling/tsconfig.json --noEmitruns logged underF011andF012both passed after the schedule rewrites, covering the 11 in-scope schedule files with no TypeScript errors. - (2026-03-23) Completed
T012: closed the schedule Italian accent audit checkpoint. - (2026-03-23) Validation for
T012: theF014audit on server/public/locales/it/msp/schedule.json found no accentlesspuo/gia/verra/funzionalita/percheregressions, so the Italian schedule locale passed unchanged. - (2026-03-23) Completed
T013: verified representative schedule calendar/request/availability/entry-popup keys resolve to the pseudo-locale fill token inxx. - (2026-03-23) Validation for
T013: a focused Node assertion against server/public/locales/xx/msp/schedule.json confirmed 8 representative keys spanning the calendar, appointment requests, availability settings, and entry popup all resolve to11111. - (2026-03-23) Completed
T020: re-verified the knowledge-base locale set against the final translation validation pass. - (2026-03-23) Validation for
T020: the earlier KB locale generation underF023and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirmingmsp/knowledge-basematches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T021: confirmed the full knowledge-base component batch still compiles with themsp/knowledge-basenamespace wiring. - (2026-03-23) Validation for
T021: the targetednpx tsc -p packages/documents/tsconfig.json --noEmitruns logged underF021andF022both passed after the KB rewrites, covering the 10 in-scope KB files with no TypeScript errors. - (2026-03-23) Completed
T022: closed the knowledge-base Italian accent audit checkpoint. - (2026-03-23) Validation for
T022: theF024audit on server/public/locales/it/msp/knowledge-base.json found no accentlesspuo/gia/verra/funzionalita/percheregressions, so the Italian KB locale passed unchanged. - (2026-03-23) Completed
T023: verified representative KB page/editor/import/review keys resolve to the pseudo-locale fill token inxx. - (2026-03-23) Validation for
T023: a focused Node assertion against server/public/locales/xx/msp/knowledge-base.json confirmed 8 representative keys spanning the main page, article editor, article list, import dialog, and review dashboard all resolve to11111. - (2026-03-23) Completed
T030: re-verified the jobs locale set against the final translation validation pass. - (2026-03-23) Validation for
T030: the earlier jobs locale generation underF032and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirmingmsp/jobsmatches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T031: confirmed the full jobs monitoring batch still compiles with themsp/jobsnamespace wiring. - (2026-03-23) Validation for
T031: the targetednpx tsc -p packages/jobs/tsconfig.json --noEmitrun logged underF031passed after the jobs rewrite, covering the 7 in-scope jobs files with no TypeScript errors. - (2026-03-23) Completed
T032: verified representative jobs table/metrics/drawer keys resolve to the pseudo-locale fill token inxx. - (2026-03-23) Validation for
T032: a focused Node assertion against server/public/locales/xx/msp/jobs.json confirmed 7 representative keys spanning the recent-jobs table, metrics cards, history/progress panels, drawer, and step history all resolve to11111. - (2026-03-23) Completed
T040: re-verified the email-provider locale set against the final translation validation pass. - (2026-03-23) Validation for
T040: the earlier email-provider locale generation underF043and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirmingmsp/email-providersmatches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T041: confirmed the main email-provider form/configuration batch still compiles with themsp/email-providersnamespace wiring. - (2026-03-23) Validation for
T041: the targetednpx tsc -p packages/integrations/tsconfig.json --noEmitruns logged underF041andF042both passed after the provider-form/configuration rewrites, covering the 10 in-scope email-provider files with no TypeScript errors. - (2026-03-23) Completed
T042: checked the email-provider namespace boundary against the existing MSP settings/admin locale tree. - (2026-03-23) Validation for
T042: a direct leaf-key comparison between server/public/locales/en/msp/email-providers.json and server/public/locales/en/msp/settings.json found285email-provider leaves,769settings leaves, and0overlapping key paths, so the provider namespace does not collide with the existing MSP settings/admin copy. - (2026-03-23) Completed
T043: confirmed the remaining email-provider setup/list/helper surfaces compile and no longer leave provider-setup copy hardcoded outside the namespace. - (2026-03-23) Validation for
T043: theF045validation run already covered the remaining helper surfaces withnpx tsc -p packages/integrations/tsconfig.json --noEmit, and thergsweep recorded there confirmed the former setup/wizard/OAuth fallback strings now remain only asdefaultValuefallbacks rather than hardcoded UI text. - (2026-03-23) Completed
T050: re-verified the profile locale set against the final translation validation pass. - (2026-03-23) Validation for
T050: the earlier profile locale generation underF053and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirmingmsp/profilematches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T051: confirmed the profile/security/platform-update batch still compiles with themsp/profilenamespace wiring. - (2026-03-23) Validation for
T051: the targetednpx tsc -p packages/users/tsconfig.json --noEmitrun and thenpx tsc -p server/tsconfig.json --noEmitruns logged underF051andF052both passed after the profile/security rewrites, covering the 8 in-scope files with no TypeScript errors. - (2026-03-23) Completed
T052: verified representative profile/security/platform-update keys resolve to the pseudo-locale fill token inxx. - (2026-03-23) Validation for
T052: a focused Node assertion against server/public/locales/xx/msp/profile.json confirmed 8 representative keys spanning the profile page, password-change form, security-settings views, session management, and platform-update detail all resolve to11111. - (2026-03-23) Completed
T060: closed the2b-20re-inventory checkpoint. - (2026-03-23) Validation for
T060: theF060re-inventory recorded the stale “no work needed” assumption and added the concreteF061-F076/T061-T067follow-up items for the newly-discovered extension and licensing UI strings, so the batch is no longer treated as empty. - (2026-03-23) Completed
T061: confirmed the extension follow-up surfaces compile and no longer leave visible placeholder copy hardcoded outsidemsp/extensions. - (2026-03-23) Validation for
T061: theF062validation already covered the extension follow-up withnpx tsc -p packages/ui/tsconfig.json --noEmitandnpx tsc -p server/tsconfig.json --noEmit, while the recorded rewrite inventory moved the CE loader stubs, settings-shell copy, and OSS placeholder text ontomsp/extensions. - (2026-03-23) Completed
T062: confirmed the CE licensing stubs compile and no longer leave visible stub copy hardcoded outsidemsp/licensing. - (2026-03-23) Validation for
T062: theF066validation already covered the CE licensing stubs withnpx tsc -p server/tsconfig.json --noEmit, and the recordedrgsweep confirmed the stub strings now remain only asdefaultValuefallbacks in the CE licensing components. - (2026-03-23) Completed
T063: re-verified the initial extension/licensing follow-up locale sets against the final translation validation pass. - (2026-03-23) Validation for
T063: the locale generation passes underF063andF067, plus the finalnode scripts/validate-translations.cjsrun underF091, confirmedmsp/extensionsandmsp/licensingare structurally aligned across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T064: confirmed the enterprise licensing purchase/reduction/success flow compiles and no longer leaves visible purchase-flow copy hardcoded outsidemsp/licensing. - (2026-03-23) Validation for
T064: theF070validation already covered the enterprise licensing flow withnpx eslintandnpx tsc -p server/tsconfig.json --noEmit, while the recorded rewrite inventory moved the purchase page, success page, subscription form, and reduction modal copy ontomsp/licensing. - (2026-03-23) Completed
T065: re-verified the expanded enterprise licensing locale set against the final translation validation pass. - (2026-03-23) Validation for
T065: the expanded licensing locale generation underF071and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirming the 108-leafmsp/licensingnamespace matches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T066: confirmed the EE extension runtime/error states compile and no longer leave visible runtime-state copy hardcoded outsidemsp/extensions. - (2026-03-23) Validation for
T066: theF074validation already covered the EE entry rewrite withnpx eslint packages/product-extensions/ee/entry.tsx, and the recordedrgsweep confirmed the old runtime/error strings now remain only asdefaultValuefallbacks in the EE extension entry file. - (2026-03-23) Completed
T067: re-verified the expanded EE extension locale set against the final translation validation pass. - (2026-03-23) Validation for
T067: the expanded extensions locale generation underF075and the finalnode scripts/validate-translations.cjsrun underF091both passed, confirming the 44-leafmsp/extensionsnamespace matches English across all 9 locales withErrors: 0andWarnings: 0. - (2026-03-23) Completed
T070: closed the route-namespace registration checkpoint for the final MSP batches. - (2026-03-23) Validation for
T070: theF090route-registry pass updatedROUTE_NAMESPACES, and the loggedgetNamespacesForRoute()spot checks confirmed the expected namespace arrays for the original batch routes plus the follow-up/msp/settings/extensions,/msp/extensions, and/msp/licenses/purchaseprefixes. - (2026-03-23) Completed
T071: closed the final cross-batch translation validator checkpoint. - (2026-03-23) Validation for
T071: the finalnode scripts/validate-translations.cjsrun underF091completed withErrors: 0andWarnings: 0across every newly-added MSP namespace and locale file. - (2026-03-23) Completed
T072: closed the final cross-batch pseudo-locale regeneration checkpoint. - (2026-03-23) Validation for
T072: the explicitF092pseudo refresh regeneratedxxandyyfor every newly-added MSP namespace, and the recorded leaf-count check confirmed each pseudo file still matches its English source structure. - (2026-03-23) Completed
T073: closed the final cross-batch production-build checkpoint. - (2026-03-23) Validation for
T073: the fullnpm run buildrun recorded underF093completed with exit code0, including TypeScript, static generation, build traces, and final page optimization. - (2026-03-23) Completed
T074: re-verified the feature-flag-off English fallback path for MSP i18n. - (2026-03-23) Validation for
T074: a direct source assertion confirmedpackages/core/src/lib/featureFlagRuntime.tsstill defaults'msp-i18n-enabled'tofalse, the CE and EE MSP layouts still gate locale resolution behindisMspI18nEnabled ? await getHierarchicalLocaleAction() : null, and the CE MSP layout client still forcesinitialLocale='en'with pseudo-locales disabled when the flag is off. - (2026-03-23) Completed
T075: closed the German overflow sanity check for the highest-risk MSP forms introduced by this plan. - (2026-03-23) Validation for
T075: a focused Node assertion checked 10 overflow-sensitive German strings across server/public/locales/de/msp/surveys.json, server/public/locales/de/msp/schedule.json, server/public/locales/de/msp/knowledge-base.json, and server/public/locales/de/msp/email-providers.json; all stayed within the defined length thresholds for survey forms, the schedule entry/availability flow, KB editor chrome, and email-provider form guidance.
Open Questions
- Public survey page locale: How does SurveyResponsePage.tsx resolve locale without an authenticated MSP session?
- Security settings overlap: Which SecuritySettingsPage strings are already in
msp/settings? - Email namespace loading: Adding
msp/email-providersto the already-loaded/msp/settingsroute increases namespace count. Check performance.