Files
joulenap/backend
Catubba e9dc577ba4 feat(i18n): purge orphan keys, fix plurals, localize run errors
Close the frontend block. The locale packs go 727 -> 498 keys and the
strings that survive are now enforced to stay in step across languages.

Purge: delete 257 keys left over from the 0.9 UI (settings.setup/nav/
safety, the old dashboard panels, the manual-run dialogs). The nine
settings.setup.* strings the wizard still uses move into wizard.* rather
than keeping the tree alive for them.

Fix four defects a grep cannot see:
- the backup-mode dropdown rendered its options untranslated under a
  translated label; the strings already existed with no caller
- RouteStrip never called dashboard.onDays, so Italian lost the
  preposition around the day list
- six count strings interpolated {{n}}, which i18next cannot pluralise
  ("1 events"); they take {{count}} with _one/_other now
- the retention inputs built their accessible name by string surgery

Localize a run's failure message. It is shown in the notification body
and in the run-history row, so it is stored as a key plus parameters
(runs.error_key / runs.error_params, both nullable) and rendered on read
in the configured language. runs.error keeps the English rendering as the
fallback for pre-1.0 rows and for text from other software. CycleAbort
and PbsUnreachableError carry codes; text bubbling out of a connector
lands under a generic key with its message as a parameter.

Reword the missed-run notification, which said "missed scheduled backup"
while catchup fires for every route kind, and give the MONITOR step's
detail a single definition: the notifier parses the observed count back
out of it, which was an unpinned contract between two modules.

Add the en/it parity tests neither side had. The backend one covers
_KIND_LABEL and _ERRORS as well as _MESSAGES, because _pack() falls back
whole-pack and a key present in one language only raises at send time.
2026-08-04 11:55:06 +02:00
..