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 throughqsTr(), 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
- Every user-visible literal goes through
qsTr()(QML) or the equivalent catalog call on its surface. No raw English in views. - No string concatenation across a translation boundary: whole
sentences are single translatable units with
%1-style placeholders. - Machine keys (shortcut ids, preset ids, config keys) are never UX copy and never translated.
- 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.