Some checks failed
Main Confidence / confidence (push) Failing after 56s
## Summary - add the localization v1 foundation with request-time locale resolution and workspace or user preference handling - localize the first-wave platform surfaces for auth, shell, dashboards, findings, baseline compare, and review workspace chrome - add Pest coverage for locale resolution, preference flows, fallback behavior, notifications, and governance surface localization ## Scope - active spec: specs/252-platform-localization-v1 - target branch: dev ## Notes - machine-readable artifacts remain invariant and are not localized in this slice - the branch includes the related spec kit artifacts for the feature Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #293
3.3 KiB
3.3 KiB
Data Model: Platform Localization v1 (DE/EN)
Supported Locale Set
| Value | Meaning | Notes |
|---|---|---|
en |
English | System default and controlled fallback in v1 |
de |
German | First additional supported locale |
Locale Sources
| Source | Ownership | Persistence | Allowed Values | Notes |
|---|---|---|---|---|
tenantpilot.locale_override |
request or session scoped | transient | en, de |
Explicit temporary choice for the current browsing context |
users.preferred_locale |
user-owned | persisted on users |
en, de, null |
Personal preference; null means inherit |
localization.default_locale |
workspace-owned | existing workspace settings infrastructure | en, de, null |
Workspace default for users without a personal preference |
config('app.locale') |
system-owned | config | en initially |
Final fallback anchor |
Precedence Rule
- Explicit override
- User preference
- Workspace default
- System default
If the chosen source is missing, malformed, or unsupported, resolution falls back to the next valid source until a supported locale is found. The final controlled fallback is English.
Plane-Specific Resolution
- Admin and tenant panels: use the full precedence rule above.
- System panel: uses
explicit override -> system defaultonly in v1 because system actors authenticate asPlatformUserand do not get a persisted locale preference or workspace-default inheritance in this slice.
Derived Resolved Locale Context
| Field | Type | Meaning |
|---|---|---|
locale |
string | Effective locale for the current request (en or de) |
source |
string | One of explicit_override, user_preference, workspace_default, system_default |
fallback_locale |
string | Controlled fallback locale, en in v1 |
workspace_default_locale |
string or null | Current workspace default when a workspace context exists |
user_preference_locale |
string or null | Persisted personal locale preference for workspace-bound users; null on the system plane |
Persistence Shape
- User preference: add one nullable locale preference field to the current workspace-bound user-owned surface.
- Workspace default: add one workspace setting definition under a localization-specific domain using the existing settings infrastructure.
- No new table: the first slice does not create a generic preferences or translation state table, and it does not add a second locale-preference store for
PlatformUser.
Translation Catalog Ownership
| Catalog Family | Ownership | Notes |
|---|---|---|
lang/en/*.php |
canonical English source | Existing findings.php and baseline-compare.php remain authoritative English catalogs |
lang/de/*.php |
German translation mirror | Added only for the selected first-wave surface families |
| generic shell or settings catalogs | platform runtime | Used for shell/auth/context-bar and shared operator text that does not belong to one domain file |
Invariance Boundaries
The following stay non-localized in v1:
- raw JSON and provider payloads
- audit entries and machine-readable audit values
- stored report payloads and exported artifact data
- identifiers, slugs, route parameters, and query semantics
- global-search scope, authorization outcomes, and tenant/workspace context selection