Skip to content

Feature request: translatable event-log / webhook messages (backend i18n) #49

Closed as not planned

Description

@paki81

Following up on PR #48 (Italian UI + manual): the frontend i18n covers UI labels and the manual, but event-log messages, webhook messages and API messages stay English — and that is currently by design ("uniformly English … keeps analysis and monitoring consistent").

We'd like to propose making event messages translatable too, and would be happy to implement it if you'd like to have it. Writing this up first because it's an architectural decision, not something a dictionary file can solve.

Why frontend i18n can't do it

Event strings are produced in the backend and persisted — e.g. db.log_event("Configuration saved", "", db.INFO) writes the final English text into events.db. By the time the UI displays them they are opaque strings; there is no key to look up.

Possible approaches

  1. Stable event keys + parameters — log ("config_saved", {}) instead of "Configuration saved", translate at render time in the UI's language (and for webhooks/API, decide a language policy: English always, or a per-webhook language option).
    • Pros: one source of truth, all languages handled the same way, historical rows could even be rendered in new languages.
    • Cons: every log_event call site changes; payloads (detail strings often embed dynamic values) need parameterization.
  2. Keep storing English, translate at display time by matching — fragile, effectively parsing English. Not recommended, mentioned for completeness.
  3. Structured storage — store key + params JSON in a new column, keep the English text column for compatibility/rendering where no translation exists.

Historical events would presumably stay English either way (unless rendered from keys for new rows only — which is fine).

Questions for you

  • Is localized event text something you'd want at all, or do you prefer the current "always English" consistency for monitoring/parsing?
  • If yes: translate only in the UI display, or also let webhooks emit a chosen language per target?
  • Any preference on the approaches above (or another design)?

Happy to do the implementation work — including keeping test_i18n-style parity guarantees — once there's an agreed direction.

Activity

  1. added
    enhancementImprovement of existing functions - not a new feature
    on Oct 22, 2026
  2. ffind-dev commented on Oct 22, 2026

    @ffind-dev
    Owner

    Thanks a lot for writing this up before coding it. That was exactly the right call, and the analysis of the options is spot on (and thanks again for the Italian UI in #48).

    I've thought it through and I'd like to keep the backend English, so I'm going to close this as "not planned" for now.

    My reasons:

    • Stability comes first. The focus of PVE-UPS is to be as stable as possible. It's the one thing that has to work when everything else is going down. Backend i18n would reach right into the code that runs during an outage: the engine emits these messages while it is deciding about and firing shutdowns. Every message would pass through a lookup, a fallback and a parameter substitution. To me that feels too error-prone for something that could affect exactly those critical paths. As far as possible the rule here is: keep it simple, keep it reliable, keep it safe.
    • The event log is the record of an outage. It's what people read afterwards to understand why a host went down, or didn't. I'd rather have one wording I can check for than translations of critical messages I can't check myself. Same reasoning as for the manual in i18n: add Italian (it) UI dictionary #48.
    • The messages aren't really templates. Many bodies are composed at runtime: parts joined together, cluster steps and test results nested inside, and error texts from httpx, pysnmp, NUT or the Proxmox API embedded verbatim. Keys + params would need nested structures across roughly 70 call sites plus the trigger reasons and cluster step messages, and the result would still be mixed-language wherever an external error text shows up.
    • Support and monitoring. People paste log excerpts into issues, and webhook consumers and alert rules match on the subject text. One language keeps both working. That was the deliberate reason for making everything English in 3.0.0.

    If you'd like localized notifications today, the Custom webhook format already gets you most of the way. You write the message frame in your own language and pull in {{severity}}, {{facts}}, {{facts_json}} or {{status_json}} for the values. The event subject itself stays English.

    If there's ever broader demand, I agree your option 3 (key + params stored next to the English text) would be the right foundation, since it stays backward compatible. I'm not planning it at the moment, though. Thanks again for the offer to implement it!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementImprovement of existing functions - not a new feature

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions