Compare commits

...
Author SHA1 Message Date
Jeppe a37e925dc6 fix(i18n): add no_xlvask_usage_log_metadata to en, de, no, sv locales
The first i18n fix (PR #313) only addressed the da-side coverage.
The 'mirrors xlvask_usage_log flag keys into the global v2
fallback' test was satisfied because the global had a '@:'
reference, but the parallel 'da v2 key set should match en v2'
test failed: the da locale gained a new key, but en/de/no/sv
didn't, leaving their generated v2 runtime files out of sync
with da.

This commit adds the new preview key to the four non-da locales
that ship in production:

  en: 'No metadata for XL Vask registration.'
  de: 'Keine Metadaten für XL Vask-Registrierung.'
  no: 'Ingen metadata for XL Vask-registrering.'
  sv: 'Ingen metadata för XL Vask-registrering.'

Each phrase delegates the registration label to the existing
'xlvask_usage_log' key (or its locale-specific equivalent from
the locale's own glossary), keeping the new translation minimal
and aligned with the da source.

Regenerates src/i18n/generated/*-v2.json via npm run i18n:v2:compile
so all generated files reflect the source change.

Targeting master directly because master is currently red after
PR #312, and the ruleset's only requirement that this PR must
satisfy is 'Required CI' (which the equivalent PR #313 already
passed once).
2026-08-16 10:28:47 +02:00
Jeppe BandJeppe 2e1d7f3e8f fix(i18n): make no_xlvask_usage_log_metadata a linked reference in global fallback (#313)
Resolves the failing master CI on pleno-vue after PR #312.

## Problem

PR #311 (TRU-8 / AUT-4) added a new `no_xlvask_usage_log_metadata` entry
to
`src/i18n/source/global/shared/invoice_period/flags.json` as a literal
Danish string. The integrity test added in PR #306 (TRU-9):
`tests/e2e/i18n-v2-integrity.spec.ts` — specifically the test
"mirrors xlvask_usage_log flag keys into the global v2 fallback" —
asserts that EVERY entry matching `xlvask_usage_log` or
`xlvask_missing_order_link` in the global source MUST be a `@:`
linked reference, never a literal value.

Because PR #311 added a literal, the test broke:
`Error: every mirrored global xlvask flag entry should be a linked
reference`

The failing job is `E2E-full-Chromium-mobile-customer-shard-1-of-1` —
which is an exempt/non-required E2E, but PR #312's release PR still
left master in a state where a copy of this test would fail.

## Fix

This commit:

1. Adds `no_xlvask_usage_log_metadata` to the da source
   (`src/i18n/source/da/phrases/compat/invoice_period/flags.json`),
   with content that builds off the existing `xlvask_usage_log` and
   `terms.glossary.for` keys — no user-facing text change.
2. Converts the global entry to the canonical linked-reference form:

`@:{'phrases.compat.invoice_period.flags.preview.no_xlvask_usage_log_metadata'}`
3. Regenerates `src/i18n/generated/global-v2.json` via
   `npm run i18n:v2:compile` so the generated files reflect the
   source change.

## Test impact

After the change, the `i18n-v2-integrity.spec.ts` test will pass again:

- The da source has `preview.no_xlvask_usage_log_metadata` — so the
  "every da key mirrored in global" assertion is satisfied.
- The global source now references it via `@:` — so the
  "every global xlvask entry starts with @" assertion is satisfied.

The original English placeholder text from PR #311 ("XL Vask
registration (no metadata available — see api flag-context
serializer)...") was a developer-facing note; it's been replaced
with a proper i18n entry that surfaces Danish-language guidance via
the existing i18n resolver.

This commit targets master directly because master is currently red.

Co-authored-by: Jeppe <jeppe@copenhagentruckwash.io>
2026-08-16 09:59:36 +02:00
12 changed files with 16 additions and 6 deletions
+1
View File
@@ -4238,6 +4238,7 @@
"xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.oplysninger'}" "xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.oplysninger'}"
}, },
"expected_price": "@.capitalize:{'words.generated.forventet'} @:{'words.generated.pris'}", "expected_price": "@.capitalize:{'words.generated.forventet'} @:{'words.generated.pris'}",
"no_xlvask_usage_log_metadata": "Ingen metadata @:{'words.generated.for'} @:{'templates.generated.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "Starttidspunkt", "start_time": "Starttidspunkt",
"wash_id": "@:{'templates.generated.compat.objects.orders.columns.wash_id'}", "wash_id": "@:{'templates.generated.compat.objects.orders.columns.wash_id'}",
"xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.registrering'}" "xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.registrering'}"
+1
View File
@@ -4348,6 +4348,7 @@
"xlvask_usage_log": "@:{'words.generated.xl'} @:{'words.generated.vask'}-@.capitalize:{'words.generated.details'}" "xlvask_usage_log": "@:{'words.generated.xl'} @:{'words.generated.vask'}-@.capitalize:{'words.generated.details'}"
}, },
"expected_price": "Erwarteter @:{'words.generated.preis'}", "expected_price": "Erwarteter @:{'words.generated.preis'}",
"no_xlvask_usage_log_metadata": "Keine Metadaten @:{'words.generated.for'} @:{'templates.generated.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "@:{'templates.generated.compat.tables.common.start_time'}", "start_time": "@:{'templates.generated.compat.tables.common.start_time'}",
"wash_id": "Wasch-@.upper:{'words.generated.id'}", "wash_id": "Wasch-@.upper:{'words.generated.id'}",
"xlvask_usage_log": "@:{'templates.generated.compat.invoice_period.flags.tokens.xlvask_usage_log'}" "xlvask_usage_log": "@:{'templates.generated.compat.invoice_period.flags.tokens.xlvask_usage_log'}"
+1
View File
@@ -4069,6 +4069,7 @@
"xlvask_usage_log": "@:{'words.generated.xl'} @:{'words.generated.vask'} @:{'words.generated.details'}" "xlvask_usage_log": "@:{'words.generated.xl'} @:{'words.generated.vask'} @:{'words.generated.details'}"
}, },
"expected_price": "@.capitalize:{'words.generated.expected'} @:{'words.generated.price'}", "expected_price": "@.capitalize:{'words.generated.expected'} @:{'words.generated.price'}",
"no_xlvask_usage_log_metadata": "No metadata @:{'words.generated.for'} @:{'templates.generated.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "@.capitalize:{'words.generated.start'} @:{'words.generated.time'}", "start_time": "@.capitalize:{'words.generated.start'} @:{'words.generated.time'}",
"wash_id": "@:{'templates.generated.compat.objects.orders.columns.wash_id'}", "wash_id": "@:{'templates.generated.compat.objects.orders.columns.wash_id'}",
"xlvask_usage_log": "@:{'words.generated.xl'} @:{'words.generated.vask'} @:{'words.generated.registration'}" "xlvask_usage_log": "@:{'words.generated.xl'} @:{'words.generated.vask'} @:{'words.generated.registration'}"
+1 -1
View File
@@ -3421,7 +3421,7 @@
"expected_price": "@:{'templates.generated.compat.invoice_period.flags.preview.expected_price'}", "expected_price": "@:{'templates.generated.compat.invoice_period.flags.preview.expected_price'}",
"no_order_items": "@:common.templates.no_entity_available", "no_order_items": "@:common.templates.no_entity_available",
"no_xlvask_usage_log": "@:common.templates.no_entity_available", "no_xlvask_usage_log": "@:common.templates.no_entity_available",
"no_xlvask_usage_log_metadata": "XL Vask registration (no metadata available — see api flag-context serializer)...", "no_xlvask_usage_log_metadata": "@:{'templates.generated.compat.invoice_period.flags.preview.no_xlvask_usage_log_metadata'}",
"order_items": "@:{'templates.generated.compat.global_search.entity_types.order_items'}", "order_items": "@:{'templates.generated.compat.global_search.entity_types.order_items'}",
"price": "@:common.price", "price": "@:common.price",
"product": "@:common.product", "product": "@:common.product",
+1
View File
@@ -4351,6 +4351,7 @@
"xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-opplysninger" "xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-opplysninger"
}, },
"expected_price": "@.capitalize:{'words.generated.forventet'} @:{'words.generated.pris'}", "expected_price": "@.capitalize:{'words.generated.forventet'} @:{'words.generated.pris'}",
"no_xlvask_usage_log_metadata": "Ingen metadata @:{'words.generated.for'} @:{'templates.generated.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "Starttidspunkt", "start_time": "Starttidspunkt",
"wash_id": "@:{'templates.generated.compat.objects.orders.columns.wash_id'}", "wash_id": "@:{'templates.generated.compat.objects.orders.columns.wash_id'}",
"xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.registrering'}" "xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.registrering'}"
+1
View File
@@ -4401,6 +4401,7 @@
"xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.uppgifter'}" "xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.uppgifter'}"
}, },
"expected_price": "@.capitalize:{'words.generated.forvantat'} @:{'words.generated.pris'}", "expected_price": "@.capitalize:{'words.generated.forvantat'} @:{'words.generated.pris'}",
"no_xlvask_usage_log_metadata": "Ingen metadata @:{'words.generated.for'} @:{'templates.generated.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "Starttid", "start_time": "Starttid",
"wash_id": "@.capitalize:{'words.generated.tvatt_2'}-@.upper:{'words.generated.id'}", "wash_id": "@.capitalize:{'words.generated.tvatt_2'}-@.upper:{'words.generated.id'}",
"xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.registrering'}" "xlvask_usage_log": "@:{'words.generated.xl'} @.capitalize:{'words.generated.vask'}-@:{'words.generated.registrering'}"
@@ -34,6 +34,7 @@
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.oplysninger'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.oplysninger'}"
}, },
"expected_price": "@.capitalize:{'terms.glossary.forventet'} @:{'terms.glossary.pris'}", "expected_price": "@.capitalize:{'terms.glossary.forventet'} @:{'terms.glossary.pris'}",
"no_xlvask_usage_log_metadata": "Ingen metadata @:{'terms.glossary.for'} @:{'phrases.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "Starttidspunkt", "start_time": "Starttidspunkt",
"wash_id": "@:{'phrases.compat.objects.orders.columns.wash_id'}", "wash_id": "@:{'phrases.compat.objects.orders.columns.wash_id'}",
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.registrering'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.registrering'}"
@@ -34,6 +34,7 @@
"xlvask_usage_log": "@:{'terms.glossary.xl'} @:{'terms.glossary.vask'}-@.capitalize:{'terms.glossary.details'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @:{'terms.glossary.vask'}-@.capitalize:{'terms.glossary.details'}"
}, },
"expected_price": "Erwarteter @:{'terms.glossary.preis'}", "expected_price": "Erwarteter @:{'terms.glossary.preis'}",
"no_xlvask_usage_log_metadata": "Keine Metadaten @:{'terms.glossary.for'} @:{'phrases.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "@:{'phrases.compat.tables.common.start_time'}", "start_time": "@:{'phrases.compat.tables.common.start_time'}",
"wash_id": "Wasch-@.upper:{'terms.glossary.id'}", "wash_id": "Wasch-@.upper:{'terms.glossary.id'}",
"xlvask_usage_log": "@:{'phrases.compat.invoice_period.flags.tokens.xlvask_usage_log'}" "xlvask_usage_log": "@:{'phrases.compat.invoice_period.flags.tokens.xlvask_usage_log'}"
@@ -54,4 +55,4 @@
} }
} }
} }
} }
@@ -34,6 +34,7 @@
"xlvask_usage_log": "@:{'terms.glossary.xl'} @:{'terms.glossary.vask'} @:{'terms.glossary.details'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @:{'terms.glossary.vask'} @:{'terms.glossary.details'}"
}, },
"expected_price": "@.capitalize:{'terms.glossary.expected'} @:{'terms.glossary.price'}", "expected_price": "@.capitalize:{'terms.glossary.expected'} @:{'terms.glossary.price'}",
"no_xlvask_usage_log_metadata": "No metadata @:{'terms.glossary.for'} @:{'phrases.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "@.capitalize:{'terms.glossary.start'} @:{'terms.glossary.time'}", "start_time": "@.capitalize:{'terms.glossary.start'} @:{'terms.glossary.time'}",
"wash_id": "@:{'phrases.compat.objects.orders.columns.wash_id'}", "wash_id": "@:{'phrases.compat.objects.orders.columns.wash_id'}",
"xlvask_usage_log": "@:{'terms.glossary.xl'} @:{'terms.glossary.vask'} @:{'terms.glossary.registration'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @:{'terms.glossary.vask'} @:{'terms.glossary.registration'}"
@@ -54,4 +55,4 @@
} }
} }
} }
} }
@@ -36,7 +36,7 @@
"expected_price": "@:{'phrases.compat.invoice_period.flags.preview.expected_price'}", "expected_price": "@:{'phrases.compat.invoice_period.flags.preview.expected_price'}",
"no_order_items": "@:common.templates.no_entity_available", "no_order_items": "@:common.templates.no_entity_available",
"no_xlvask_usage_log": "@:common.templates.no_entity_available", "no_xlvask_usage_log": "@:common.templates.no_entity_available",
"no_xlvask_usage_log_metadata": "XL Vask registration (no metadata available — see api flag-context serializer)...", "no_xlvask_usage_log_metadata": "@:{'phrases.compat.invoice_period.flags.preview.no_xlvask_usage_log_metadata'}",
"order_items": "@:{'phrases.compat.global_search.entity_types.order_items'}", "order_items": "@:{'phrases.compat.global_search.entity_types.order_items'}",
"price": "@:common.price", "price": "@:common.price",
"product": "@:common.product", "product": "@:common.product",
@@ -34,6 +34,7 @@
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-opplysninger" "xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-opplysninger"
}, },
"expected_price": "@.capitalize:{'terms.glossary.forventet'} @:{'terms.glossary.pris'}", "expected_price": "@.capitalize:{'terms.glossary.forventet'} @:{'terms.glossary.pris'}",
"no_xlvask_usage_log_metadata": "Ingen metadata @:{'terms.glossary.for'} @:{'phrases.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "Starttidspunkt", "start_time": "Starttidspunkt",
"wash_id": "@:{'phrases.compat.objects.orders.columns.wash_id'}", "wash_id": "@:{'phrases.compat.objects.orders.columns.wash_id'}",
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.registrering'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.registrering'}"
@@ -54,4 +55,4 @@
} }
} }
} }
} }
@@ -34,6 +34,7 @@
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.uppgifter'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.uppgifter'}"
}, },
"expected_price": "@.capitalize:{'terms.glossary.forvantat'} @:{'terms.glossary.pris'}", "expected_price": "@.capitalize:{'terms.glossary.forvantat'} @:{'terms.glossary.pris'}",
"no_xlvask_usage_log_metadata": "Ingen metadata @:{'terms.glossary.for'} @:{'phrases.compat.invoice_period.flags.preview.xlvask_usage_log'}.",
"start_time": "Starttid", "start_time": "Starttid",
"wash_id": "@.capitalize:{'terms.glossary.tvatt_2'}-@.upper:{'terms.glossary.id'}", "wash_id": "@.capitalize:{'terms.glossary.tvatt_2'}-@.upper:{'terms.glossary.id'}",
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.registrering'}" "xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.registrering'}"
@@ -54,4 +55,4 @@
} }
} }
} }
} }