Show preset wish names in the current UI language
Preset wishes were created with `name: t(preset.labelKey)`, so the translated string was persisted as the wish's name. A wish created while the UI was Swedish stayed "Jul" in English forever -- the Swedish text was the data, so no display-layer change could fix it. Wish names are user-editable free text, so `name` cannot simply be translated at render time. Migration 007 adds a nullable `leave_wish.name_message_key` recording where a name came from: preset wishes store the i18n key alongside the translated literal, and the UI renders the key when present. The key is cleared server-side the moment `name` actually changes, compared against the stored value rather than trusting the caller, so no client can forget to clear it and silently revert a user's own name to a preset label. An unknown key (a stale row, a renamed key) falls back to the stored literal via an isTranslationKey guard, so a bad key can never crash the page or leak a raw key to the user. Rows predating this column keep displaying their stored name. _FULL_SCHEMA in db/connection.py is updated in step with the migration. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RXMhc9nT6sNz1SL4j8dznL
This commit is contained in:
@@ -71,6 +71,10 @@ export interface LeaveWishCreateRequest {
|
||||
workspaceId: string
|
||||
childId?: string | null
|
||||
name: string
|
||||
// The i18n key `name` was translated from, when created from a preset —
|
||||
// see `LeaveWish.nameMessageKey`. `undefined`/omitted means "no key"
|
||||
// (a free-typed name); passing `null` on an update explicitly clears it.
|
||||
nameMessageKey?: string | null
|
||||
windowStartMonth: number
|
||||
windowStartDay: number
|
||||
windowEndMonth: number
|
||||
|
||||
@@ -33,6 +33,12 @@ export interface LeaveWish {
|
||||
workspaceId: string
|
||||
childId: string | null
|
||||
name: string
|
||||
// i18n provenance of `name` (see backend/app/entities/leave_wish.py):
|
||||
// the message key a preset (Sommar/Jullov/...) was created from, or
|
||||
// `null` for a free-typed/edited name. An untyped string as it arrives —
|
||||
// resolve display text through `resolveWishName` (src/utils/wishName.ts),
|
||||
// never `t()` directly, since a stale/unknown key must not crash.
|
||||
nameMessageKey: string | null
|
||||
windowStartMonth: number
|
||||
windowStartDay: number
|
||||
windowEndMonth: number
|
||||
|
||||
Reference in New Issue
Block a user