Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
Context-free machine translation picked the wrong sense of short UI
labels (Disabled, Live, Service, Vaults, Grants, Run, Kill, Image,
Volume and others) and translated literals like SQL keywords and CLI
commands. Fixed against each key's UI location.
An installed extension under src/plugins/ that ships locales/en.json
owns its keys. Collecting them into core's en.json made
extract-i18n --check fail only on machines with it installed.
The API client handed translateServerError only the code and message,
so validation.required and conflict.exists could not name the field or
resource and fell back to server text; it now passes data.details.
Also translates the service-type subline, RepoConnectForm's default
labels and a ConnectionsHub fallback that the literal census skipped,
and refreshes the migration inventory counts.
Toasts showed backend prose verbatim, with no code to translate
against and "application" where the UI says "service". Not-found,
missing-field, permission, conflict and agent-offline errors now come
from factories in app/exceptions.py that pair one fixed message with
a dotted code (not_found.<resource>, validation.required,
permission.denied, conflict.exists, agent.offline), so the client can
translate them.
The shared app-loading helpers and the apps, domains, servers,
databases and backups routes raise those errors instead of hand
shaping bodies, which drops the hand-shaped body count from 1132 to
850. Five routes picked an HTTP status by comparing error text; they
now key off a result code or a sentinel so rewording can't change a
status. Five broad excepts that echoed str(exc) now log the crash and
return the request id instead.
The backend now tags not-found, missing-field, permission, conflict
and agent-offline errors with stable codes, each minted with one
fixed message. Mapping them here lets those toasts render in the
user's language instead of the server's English. Codes that carry
per-call prose stay untranslated so their specifics survive.
Every remaining hit is now translated, so the ceiling drops to 0 and
any new untranslated string fails lint.
Three narrow rule changes keep the census honest. A number with a
bare unit symbol (`${ms} ms`, `${n}%`, GB) is a measurement, not copy.
A literal that IS the content of a <code>/<pre> (a log line,
`S3_BUCKET=...`) is a sample, though a fallback shown in its place
still counts. Arguments to reportClientError go to the server log, not
a screen. In the other direction, text starting ". " was being skipped
as a CSS selector; it is the tail of a sentence split around an
element, so it now counts.