You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
v0.9.0: Swedish, Spanish and German
The app now speaks English, Swedish, Spanish and German, picking whichever the
Mac prefers. Menus, every dialog and button, the About panel, notifications,
update and self-update messages, and the HTML report (headings, column names,
meta line) are translated; dates are localised too.
- src/i18n.py: language detection + _() / ngettext() / localised dates.
Detection reads macOS AppleLanguages (honours the per-app language override)
and deliberately ignores Python's locale module, which reports "C" in our
frozen app and would have shipped English to everyone.
- src/translations.py: dict catalogues keyed by the English source string.
Chosen over gettext/.mo — 83 strings don't justify a compile step, and dicts
stay reviewable in a diff. Anything missing falls back to English.
- packaging/locales: an InfoPlist.strings per language. The Automation
permission prompt is rendered by macOS, so it needs .lproj files rather than
gettext; CFBundleLocalizations declares the languages so macOS offers the
per-app override in System Settings.
- Plurals: English "tab(s)" hides a problem the translations can't — one tab
read "1 flikar" / "1 pestañas" / "1 Tabs". Added singular/plural variants for
the menu total, the export dialog and the HTML meta line.
- CSV column headers stay English (machine-readable); the HTML report's visible
headers are translated.
- tests/test_i18n.py: every used string is translated, no stale entries,
placeholders survive translation, plurals differ, unknown strings fall back.
Verified: all suites pass; the .lproj files ship in the bundle; and with the
app's own preference domain in the search list (what the running app sees)
detection resolves to sv and the UI renders in Swedish.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>