## 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>
58 lines
5.8 KiB
JSON
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'}"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|