v0.1.1
[v0.1.1] — 2026-05-20
Added
- Add ruff/Pyright static analysis; fix all lint errors
Tooling:
- pyproject.toml: ruff (E/W/F rules, E741/E731/E501 ignored) + mypy config
- .pre-commit-config.yaml: ruff linter + formatter on every commit
- .github/workflows/lint.yml: ruff + Pyright on every PR and main push
Fixes applied:
- ruff --fix: 44 auto-fixed issues (33 unused imports, 9 empty f-strings,
2 redefined-while-unused across the codebase) - ruff --unsafe-fixes: 4 W293 trailing whitespace in docstrings
(bethesda_strings/encoding.py) - F841 dead code: removed unused
qs,has_errors,translated_count
variables in app_settings.py and main_window.py - Pyright reportOptionalMemberAccess: narrowed QApplication.instance()
result before calling .styleHints() in main_window.py; refactored
_auto_fix_selected in quality_dialog.py to use local variables so
Pyright can track the not-None guarantee from the early-return guard
Result: ruff clean (0 errors), Pyright clean (0 errors, 0 warnings).
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(d262449)
- Add test CI, structured changelog, version injection, AUR package
Test workflow (.github/workflows/test.yml):
- Runs pytest on ubuntu-22.04 and windows-latest on every PR and main push
- Sets QT_QPA_PLATFORM=offscreen on Linux for headless Qt tests
Changelog (release workflow + .cliff.toml):
- Uses git-cliff to generate a structured changelog from commit messages
- Commit prefixes (Add/Fix/Remove/Update/Refactor) map to changelog sections
- Release body is now the cliff-generated notes instead of GitHub's auto-notes
Version injection:
- _version.py: dev placeholder committed to repo
- Release workflow overwrites _version.py with the tag version before
PyInstaller bundles the app, so the frozen binary shows the correct version - main.py: reads version from _version.py with ImportError fallback to "dev"
AUR package (aur/PKGBUILD):
- bethesda-strings-editor-bin: installs the pre-built Linux zip from releases
- Wrapper at /usr/bin/bethesda-strings-editor, desktop entry, icon
- Self-contained (PyInstaller bundle needs no Python/Qt runtime)
- Update sha256sums with
updpkgsumsbefore publishing to AUR
Windows code signing:
- Placeholder in release.yml (commented out) showing the signtool invocation
- Requires DigiCert/Sectigo EV certificate stored in GitHub Secrets
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(29caa98)
-
Add Sphinx documentation and GitHub Pages deployment
-
docs/: Sphinx project with RTD theme, autodoc for bethesda_strings/
-
docs/format-spec.rst: binary layout tables for .strings/.dlstrings/.ilstrings and SST XML
-
docs/architecture.rst: component diagram, translation pipeline, quality checks table
-
docs/contributing.rst + CONTRIBUTING.md: dev setup, release process, commit conventions
-
.github/workflows/docs.yml: build on every push; deploy to Pages on main
-
Fix RST formatting in xml_handler.py module docstring (clean sphinx-build -W)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(41084fb)
- Add DeepWiki badge to README
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(458d82a)
- Add CHANGELOG.md
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(48fc995)
-
Add multi-language UI support (de, es, fr, pl, cs + RTL infrastructure)
-
Skeleton .ts files for German, Spanish, French, Polish, Czech
-
RTL layout auto-enabled for Arabic/Hebrew/Farsi/Urdu locales
-
Language selector in Settings shows all locales with native names
-
Restart-required notice appears inline on language change
-
ui_language migrated from display names to BCP-47 locale codes (v17)
-
Generic translator loader in main.py replaces Ukrainian-only branch
-
compile_translations.sh compiles all *.ts files, not just uk_UA
-
PyInstaller spec globs all *.qm at build time
-
TRANSLATING.md contributor guide + .weblate/component.yml
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(e16c30a)
-
Add accessibility: High Contrast theme, focus indicators, font size, color-blind mode
-
High Contrast theme: WCAG AAA black/white/cyan with yellow focus rings
-
Focus indicator QSS mixin applied to every theme (buttons, checkboxes,
tabs, list/table views) — previously only QLineEdit/QComboBox/QSpinBox -
Qt.AccessibleTextRole in StringTableModel: screen readers get
"Translated — quality error" instead of raw symbols -
Font size setting (0=OS default, 8-24pt); applied via QApplication.setFont()
-
Color-blind mode: blue/orange replaces green/red in status column;
symbols (✓/⚠/✗) convey state independently of color -
Config version 17 → 18
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(1108316)
-
Add encryption, audit logging, and security settings (v0.1.1)
-
AES-256-GCM at-rest encryption for translation cache (opt-in)
-
SecretStore: system keyring with PBKDF2/machine-key fallback
-
Append-only JSON-lines security audit log with 5 MB rotation
-
Settings → Security section: encrypt cache + audit log toggles
-
Accessibility: High Contrast theme, focus indicators, font size, color-blind mode
-
Multi-language UI: de/es/fr/pl/cs skeletons, RTL support, Weblate config
-
Glossary editor O(N²) freeze fix
-
cryptography>=43.0 + keyring>=25.0 dependencies
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(622c891)
Fixed
-
Fix CI: pyright path install, libEGL on Linux, Windows UTF-8 in tests
-
lint.yml: install pyright via pip so version:path finds it
-
test.yml: apt-get libegl1 on ubuntu-22.04 (PySide6 needs libEGL.so.1)
-
test_glossary.py: specify encoding='utf-8' for write_text/read_text
(Windows defaults to cp1252 which can't encode Cyrillic)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(f279d5f)
- Fix lint: exclude scripts/ from Pyright (PIL not installed in CI)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(62f38d2)
- Fix glossary editor freeze: rebuild search index once, not per-entry
_clone_glossary called add_entry() N times, each triggering a full
_rebuild_search_index() — O(N²) for large glossaries. Add _rebuild=False
flag to add_entry and call _rebuild_search_index() once after bulk insert.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(3a94a58)
- Fix git-cliff template: remote.link -> remote.github.link (v2.x)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(9572e60)
- Fix git-cliff template: use hardcoded repo URL instead of remote.link
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(c4bae28)