Managing translations
User-facing strings go through self.tr(...) (either from QObject or
toolbelt.i18n.Translatable) or directly through QCoreApplication.translate(...) if not inside
a class. English is the source language, so it needs no catalog (Qt falls back to the source
string). The translations are collected into Qt translation files under
stratified_packager/resources/i18n/:
stratified_packager_es.ts— neutral international Spanish (serves everyes*locale)stratified_packager_pt.ts— Brazilian Portuguese
The .ts files are XML and tracked in git; the compiled .qm files are binary,
git-ignored, and produced by CI (see below).
Update the .ts files from the source
just lupdate
This runs the pylupdate prek hook, which calls scripts/pylupdate.py — a wrapper around
PyQt6.lupdate that extracts translatable strings from the .py and .ui files and writes them
into the .ts files with POSIX-relative source locations (--no-obsolete, so obsolete entries are
dropped). The same hook also runs automatically on commit whenever a .py or .ui file changes.
There is no
.proprofile file and nopylupdate5;scripts/pylupdate.pyreplaces both.
Translate
Edit the .ts files directly (they are plain XML) or open them in Qt Linguist. To add
a language, create a new stratified_packager_<lang>.ts file in the same directory — the
hook’s *.ts glob picks it up automatically.
Compile to .qm
Compilation is handled by the publishing.yml workflow, which installs Qt’s lrelease
(the qt6-l10n-tools package), compiles every .ts to .qm, and bundles the result into
the released package.
To compile locally, run just lrelease. It uses pyside6-lrelease (pulled on demand via
uv run --with pyside6-essentials, since QGIS ships no lrelease CLI of its own) to write a
.qm next to each .ts. The .qm files are git-ignored; CI regenerates them at release time.