Files
pleno-vue/src/i18n/source/sv/phrases/compat/invoice_period/flags.json
T
dfaca1e8a5 i18n(xlvask_review): translate missing keys for no/sv/de/en + locale coverage test (#307)
## Summary

The `invoicing_period.xlvask_review.*` and
`invoice_period.flags.preview.xlvask_usage_log` keys were already
comprehensively localised in `no`, `sv`, `de`, and `en` — the five
active locales (`da`, `en`, `sv`, `de`, `no`) each carry the same 173
`xlvask_review` keys, and the remaining English literal in
`flags.automatic.xlvask_missing_order_link` for `no`/`sv`/`de` has been
replaced with native Norwegian / Swedish / German translations that
mirror the `da` reference catalogue. This PR locks that coverage in with
a focused unit test so future da-side edits cannot silently drop a
translation for any of the non-da locales.

## Commits

- `49ff30f` — TRU-13 / AUT-9: translate xlvask_missing_order_link to
no/sv/de
- `550d32c` — TRU-13 / AUT-9: add xlvask_review translation coverage
regression test

## Verification

- `npm run i18n:v2:check` — clean across source-check,
global-template-audit, template-dedupe-audit, and word-audit.
- `npx vitest run tests/unit/i18n-xlvask-review-coverage.spec.js` — 1 /
1 pass (5 locales × 173 keys verified).
- `npx vitest run tests/unit/i18n-*` — 11 / 11 pass.
- `npx playwright test tests/e2e/i18n-v2-integrity.spec.ts` — 126 / 126
pass across all 9 browser projects.

The new test in `tests/unit/i18n-xlvask-review-coverage.spec.js`
enumerates every leaf string under
`compat.invoicing_period.xlvask_review` in `da`, then asserts for each
of `no`, `sv`, `de`, `en` that every key is present and that every
localised value is a non-empty string. Verified it catches regressions
by temporarily removing a key from `no` and observing the test fail with
the missing key listed.

Closes TRU-13.

---------

Co-authored-by: Jeppe <jeppe@copenhagentruckwash.io>
Co-authored-by: openhands <openhands@all-hands.dev>
2026-08-15 20:53:01 +02:00

58 lines
5.8 KiB
JSON

{
"compat": {
"invoice_period": {
"flags": {
"badge": {
"automatic": "Automatiska varningar",
"manual": "Manuella flaggor",
"summary": "{red} röda flaggor och {yellow} gula varningar"
},
"automatic": {
"customer_rule_exempt_from_administration_fees": "{product} @:{'terms.glossary.is'} @:{'terms.glossary.an'} @:{'terms.glossary.administration'} @:{'terms.glossary.fee'} @:{'terms.glossary.for_2'} @:{'terms.glossary.an'} @:{'terms.glossary.exempt'} @:{'terms.glossary.customer'}.",
"customer_rule_invoice_all_orders_individually": "@.capitalize:{'terms.glossary.invoice'} @:{'terms.glossary.collection'} @:{'terms.glossary.contains'} @:{'terms.glossary.multiple'} @:{'terms.glossary.orders'} @:{'terms.glossary.for_2'} @:{'terms.glossary.a'} @:{'terms.glossary.customer'} requiring individual @:{'terms.glossary.invoices'}.",
"customer_rule_only_tank_cleaning": "{product} @:{'terms.glossary.violates'} @:{'terms.glossary.the'} @:{'terms.glossary.only'} @:{'terms.glossary.tank'} @:{'terms.glossary.cleaning'} @:{'terms.glossary.rule'}.",
"customer_rule_requires_po_number": "@.capitalize:{'terms.glossary.order'} @:{'terms.glossary.is'} @:{'terms.glossary.missing'} @:{'terms.glossary.a'} @:{'terms.glossary.required'} @:{'terms.glossary.po'} @:{'terms.glossary.number'}.",
"customer_rule_requires_reference": "@.capitalize:{'terms.glossary.order'} @:{'terms.glossary.is'} @:{'terms.glossary.missing'} @:{'terms.glossary.a'} @:{'terms.glossary.required'} @:{'terms.glossary.reference'}.",
"customer_rule_restrict_addon_services": "{product} @:{'terms.glossary.violates'} @:{'terms.glossary.restricted'} addon @:{'terms.glossary.services'}.",
"customer_rule_restrict_interior_cleaning": "{product} @:{'terms.glossary.violates'} @:{'terms.glossary.restricted'} @:{'terms.glossary.interior'} @:{'terms.glossary.wash'}.",
"customer_rule_restrict_spot_free": "{product} @:{'terms.glossary.violates'} @:{'terms.glossary.restricted'} @.capitalize:{'terms.glossary.spot'} @.capitalize:{'terms.glossary.free'}.",
"customer_rule_restrict_tank_cleaning": "{product} @:{'terms.glossary.violates'} @:{'terms.glossary.restricted'} @:{'terms.glossary.tank'} @:{'terms.glossary.cleaning'}.",
"duplicate_vehicle_subscription_charge_same_month": "@.capitalize:{'terms.glossary.duplicate'} @:{'terms.glossary.vehicle'} @:{'terms.glossary.subscription'} charges @:{'terms.glossary.exist'} @:{'terms.glossary.in'} @:{'terms.glossary.the'} @:{'terms.glossary.same'} @:{'terms.glossary.month'}.",
"historical_primary_product_mismatch": "{product} @:{'terms.glossary.differs'} @:{'terms.glossary.from'} @:{'terms.glossary.the'} @:{'terms.glossary.registration'} @:{'terms.glossary.number'}'@:{'terms.glossary.s'} usual @:{'terms.glossary.product'} {expected_product}.",
"multiple_fixed_pricing_items_same_month": "@.capitalize:{'terms.glossary.multiple'} @:{'terms.glossary.fixed'} @:{'terms.glossary.pricing'} @:{'terms.glossary.items'} @:{'terms.glossary.exist'} @:{'terms.glossary.in'} @:{'terms.glossary.the'} @:{'terms.glossary.same'} @:{'terms.glossary.month'}.",
"multiple_identical_primary_vehicle_items": "@.capitalize:{'terms.glossary.ordern'} innehaaller @:{'terms.glossary.flera'} likadana primaera fordonsprodukter.",
"price_mismatch": "{product} @:{'terms.glossary.product'} @:{'terms.glossary.price'} @:{'terms.glossary.differs'} @:{'terms.glossary.from'} @:{'terms.glossary.expected'}.",
"quantity_exceeds_product_limit": "{product} quantity exceeds @:{'terms.glossary.the'} @:{'terms.glossary.product'} limit.",
"vehicle_subscription_type_mismatch": "{product} @:{'terms.glossary.does'} @:{'terms.glossary.not'} @:{'terms.glossary.match'} @:{'terms.glossary.the'} @:{'terms.glossary.vehicle'} @:{'terms.glossary.subscription'} @:{'terms.glossary.type'} {expected_product}.",
"wash_certificate_attached_without_item": "@.capitalize:{'terms.glossary.tvattcertifikat_2'} ar bifogat @:{'terms.glossary.utan'} @:{'terms.replication.host_definite_suffix'} tvattcertifikatrad.",
"wash_certificate_item_without_certificate": "@:{'terms.glossary.tvattcertifikatraden'} @:{'terms.glossary.finns'} @:{'terms.glossary.utan'} @:{'terms.glossary.ett'} @:{'terms.glossary.tvattcertifikat_2'}.",
"xlvask_missing_order_link": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-registreringen @:{'terms.glossary.ar'} varken ignorerad @:{'terms.glossary.eller'} kopplad @:{'terms.glossary.till'} @:{'terms.replication.host_definite_suffix'} @:{'terms.glossary.order'} @:{'terms.glossary.i'} @:{'terms.replication.article.host_mention'} @:{'terms.glossary.valda'} perioden."
},
"preview": {
"entities": {
"order_items": "@:{'terms.glossary.orderrader'}",
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.uppgifter'}"
},
"expected_price": "@.capitalize:{'terms.glossary.forvantat'} @:{'terms.glossary.pris'}",
"start_time": "Starttid",
"wash_id": "@.capitalize:{'terms.glossary.tvatt_2'}-@.upper:{'terms.glossary.id'}",
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-@:{'terms.glossary.registrering'}"
},
"status": {
"false_positive": "Falskt positiv",
"ignored": "Ignorerad",
"reason_placeholder": "@:{'terms.glossary.valfri'} @:{'terms.glossary.orsak'}",
"resolved": "Lost"
},
"tokens": {
"expected": "@:{'terms.glossary.forvantat'}",
"xlvask_usage_log": "@:{'terms.glossary.xl'} @.capitalize:{'terms.glossary.vask'}-registreringen"
},
"tooltip": {
"created_by": "@.capitalize:{'terms.glossary.av'}"
}
}
}
}
}