[ { "id": "T001", "description": "Lang-pack validation: `node scripts/generate-pseudo-locales.cjs && node scripts/validate-translations.cjs` passes for all 9 locales after namespace creation and each update (covers key parity, missing/extra keys, {{variable}} interpolation preservation, pseudo-locale fill patterns, Italian accent preservation). Single check, run on every commit.", "implemented": true, "featureIds": [ "F001", "F030", "F031", "F032", "F033", "F034", "F035", "F036", "F037" ] }, { "id": "T002", "description": "Namespace file exists: en/msp/billing-settings.json, fr/msp/billing-settings.json, es/msp/billing-settings.json, de/msp/billing-settings.json, nl/msp/billing-settings.json, it/msp/billing-settings.json, pl/msp/billing-settings.json, xx/msp/billing-settings.json, yy/msp/billing-settings.json all exist under server/public/locales/", "implemented": true, "featureIds": [ "F001", "F030", "F031", "F032", "F033", "F034", "F035", "F036" ] }, { "id": "T003", "description": "ROUTE_NAMESPACES: the '/msp/settings' entry in packages/core/src/lib/i18n/config.ts includes 'msp/billing-settings' in its namespace array", "implemented": true, "featureIds": [ "F002" ] }, { "id": "T004", "description": "BillingSettings.tsx imports useTranslation and all tab labels (General/Quoting/Tax/Payments) use t() calls; tab id attributes remain ASCII kebab-case", "implemented": true, "featureIds": [ "F003" ] }, { "id": "T005", "description": "BillingSettings.tsx card titles and descriptions (Default Currency, Invoice Numbering, Zero-Dollar Invoices, Credit Expiration, Renewal Automation, Quote Numbering, Tax Regions, Payment Settings) all use t() calls -- no hardcoded English strings in JSX", "implemented": true, "featureIds": [ "F003" ] }, { "id": "T006", "description": "DefaultCurrencySettings.tsx imports useTranslation and all user-visible strings (label, placeholder, toast, error) use t() calls", "implemented": true, "featureIds": [ "F004" ] }, { "id": "T007", "description": "ZeroDollarInvoiceSettings.tsx imports useTranslation and all user-visible strings (option labels, toggle label, help text, toast, error) use t() calls", "implemented": true, "featureIds": [ "F005" ] }, { "id": "T008", "description": "CreditExpirationSettings.tsx imports useTranslation and all user-visible strings (toggle, labels, help text, placeholder, button, toast, error) use t() calls", "implemented": true, "featureIds": [ "F006" ] }, { "id": "T009", "description": "RenewalAutomationSettings.tsx imports useTranslation and all user-visible strings including dynamic placeholders (Loading boards.../Select board/etc.) use t() calls", "implemented": true, "featureIds": [ "F007" ] }, { "id": "T010", "description": "RenewalAutomationSettings.tsx policy option labels and help text descriptions are translated at render time (not at const definition time)", "implemented": true, "featureIds": [ "F007" ] }, { "id": "T011", "description": "ServiceCategoriesSettings.tsx imports useTranslation and page heading, column titles, action menu items, and button labels use t() calls", "implemented": true, "featureIds": [ "F008" ] }, { "id": "T012", "description": "ServiceCategoriesSettings.tsx dialog strings (add/edit title, field labels, validation, import dialog, conflict resolution) all use t() calls with proper interpolation for category names", "implemented": true, "featureIds": [ "F009" ] }, { "id": "T013", "description": "ServiceTypeSettings.tsx imports useTranslation and card title/description, column titles, billing method display labels, loading state, and button labels use t() calls", "implemented": true, "featureIds": [ "F010" ] }, { "id": "T014", "description": "ServiceTypeSettings.tsx dialog strings (add/edit title, field labels, validation prompt, delete confirmation with in-use error, import/conflict resolution) use t() calls with proper interpolation", "implemented": true, "featureIds": [ "F011" ] }, { "id": "T015", "description": "ServiceCatalogManager.tsx imports useTranslation and page heading, column titles, filter placeholders, loading state, and action menu items use t() calls", "implemented": true, "featureIds": [ "F012" ] }, { "id": "T016", "description": "ServiceCatalogManager.tsx edit dialog field labels, pricing section strings (rate type labels, + Add Currency, Remove, help text), and save/cancel buttons use t() calls", "implemented": true, "featureIds": [ "F013" ] }, { "id": "T017", "description": "ProductsManager.tsx imports useTranslation and page heading, column titles, action menu items (Edit/Restore/Archive/Delete), filter options, search placeholder, and Add Product button use t() calls", "implemented": true, "featureIds": [ "F014" ] }, { "id": "T018", "description": "ProductsManager.tsx archive and permanent delete confirmation dialogs use t() calls with proper interpolation for product names and association descriptions", "implemented": true, "featureIds": [ "F015" ] }, { "id": "T019", "description": "QuickAddService.tsx imports useTranslation and all field labels, pricing section strings, validation errors, and buttons use t() calls", "implemented": true, "featureIds": [ "F016" ] }, { "id": "T020", "description": "QuickAddService.tsx conditional fields (unit of measure, hardware SKU/inventory, software license seat/term) and their validation messages use t() calls", "implemented": true, "featureIds": [ "F017" ] }, { "id": "T021", "description": "QuickAddProduct.tsx imports useTranslation and all field labels (Product Name through Description), pricing editor strings, validation errors, and dialog title (Add/Edit) use t() calls", "implemented": true, "featureIds": [ "F018" ] }, { "id": "T022", "description": "TaxSourceSettings.tsx imports useTranslation and card title, tooltip, description, radio labels with descriptions, workflow steps, and buttons use t() calls", "implemented": true, "featureIds": [ "F019" ] }, { "id": "T023", "description": "TaxRegionsManager.tsx imports useTranslation and card title, button, column titles, status badges, action menu items, dialog strings, and toast messages use t() calls", "implemented": true, "featureIds": [ "F020" ] }, { "id": "T024", "description": "TaxThresholdEditor.tsx imports useTranslation and section heading, tooltip, button, column titles, 'No limit' label, bracket issues alert, loading/empty states, and preview labels use t() calls", "implemented": true, "featureIds": [ "F021" ] }, { "id": "T025", "description": "TaxThresholdEditor.tsx dialog strings (add/edit title, field labels, max amount help text, delete confirmation with bracket range interpolation, last-bracket warning) use t() calls", "implemented": true, "featureIds": [ "F022" ] }, { "id": "T026", "description": "TaxComponentEditor.tsx imports useTranslation and section heading, tooltip, button, column titles, compound badges, date range labels, loading/empty states, and preview labels use t() calls", "implemented": true, "featureIds": [ "F023" ] }, { "id": "T027", "description": "TaxComponentEditor.tsx dialog strings (add/edit title, field labels, compound toggle description, delete confirmation with name interpolation) use t() calls", "implemented": true, "featureIds": [ "F024" ] }, { "id": "T028", "description": "TaxHolidayManager.tsx imports useTranslation and section heading (with taxRateName interpolation), tooltip, button, column titles, status badges, status summary, loading/empty states use t() calls", "implemented": true, "featureIds": [ "F025" ] }, { "id": "T029", "description": "TaxHolidayManager.tsx dialog strings (add/edit title, field labels, placeholder, delete confirmation with description/date interpolation) use t() calls", "implemented": true, "featureIds": [ "F026" ] }, { "id": "T030", "description": "TaxSettingsForm.tsx imports useTranslation and page title, loading state, no-settings message, create button, error/success messages use t() calls", "implemented": true, "featureIds": [ "F027" ] }, { "id": "T031", "description": "TaxSettingsForm.tsx tax exempt card strings (title, description, toggle, certificate field, exempt alert) use t() calls", "implemented": true, "featureIds": [ "F028" ] }, { "id": "T032", "description": "TaxSettingsForm.tsx advanced tax options card strings (title, description, reverse charge toggle, tax source override select options, effective source description, override-not-available alert) use t() calls", "implemented": true, "featureIds": [ "F029" ] }, { "id": "T033", "description": "Integration: /msp/settings?tab=billing loads General tab in en with no hardcoded English visible in card titles, descriptions, field labels, or placeholders", "implemented": true, "featureIds": [ "F003", "F004", "F005", "F006", "F007" ] }, { "id": "T034", "description": "Integration: /msp/settings?tab=billing§ion=tax loads Tax tab in en with translated tax source settings and tax regions manager", "implemented": true, "featureIds": [ "F003", "F019", "F020" ] }, { "id": "T035", "description": "Integration: /msp/settings?tab=billing renders in de with translated tab labels, card titles, field labels, and option labels (no English leakage)", "implemented": true, "featureIds": [ "F003", "F004", "F005", "F006", "F007", "F019", "F020" ] }, { "id": "T036", "description": "Integration: xx pseudo-locale smoke test on /msp/settings?tab=billing renders pseudo-text for all visible strings on General, Tax, and Payments tabs (no bare English leakage)", "implemented": true, "featureIds": [ "F003", "F004", "F005", "F006", "F007", "F019", "F020", "F036" ] }, { "id": "T037", "description": "{{variables}} preserved: all locale files for msp/billing-settings preserve identical {{variable}} interpolation tokens as the English source (validated by scripts/validate-translations.cjs)", "implemented": true, "featureIds": [ "F030", "F031", "F032", "F033", "F034", "F035", "F037" ] }, { "id": "T038", "description": "Italian accent audit: it/msp/billing-settings.json preserves proper Italian diacritics (e.g., perche -> perché, lunedi -> lunedì, qualita -> qualità) -- validated by scripts/validate-translations.cjs", "implemented": true, "featureIds": [ "F034", "F037" ] }, { "id": "T039", "description": "Manual: visual diff on /msp/settings?tab=billing in en between main and PR branch -- no layout shifts from key-length differences", "implemented": true, "featureIds": [ "F003", "F004", "F005", "F006", "F007" ] }, { "id": "T040", "description": "Manual: visual diff on /msp/settings?tab=billing in de -- long German strings do not break card layouts, button widths, or select dropdowns", "implemented": true, "featureIds": [ "F003", "F004", "F005", "F006", "F007" ] } ]