Internationalization (English-first)

HorneroOS speaks English first and keeps every door open for a second language later. The rule is simple: no user-visible string may be trapped in code without a translation hook.

Current state

  • The shell already enforces it in the Welcome Center (shell/tests/test_welcome_static.py): every user-visible literal goes through qsTr(), and the test fails the build otherwise.
  • Organization-wide English for docs, commits, tickets, and release notes (see HorneroOS/.github).

The contract for new UI

  1. Every user-visible literal goes through qsTr() (QML) or the equivalent catalog call on its surface. No raw English in views.
  2. No string concatenation across a translation boundary: whole sentences are single translatable units with %1-style placeholders.
  3. Machine keys (shortcut ids, preset ids, config keys) are never UX copy and never translated.
  4. Dates, numbers, and units render through locale-aware formatters, never hand-rolled padding.

What is deliberately deferred

No translation catalog, no locale switcher, no per-language QA — until a second language has a committed maintainer and a review loop. An unreviewed machine-translated UI is worse than an honest English one. When that day comes, the qsTr() coverage above is the head start; the catalog format and the CI gate (untranslated-string scan) get decided then, not now.