v0.2.1
[v0.2.1] — 2026-06-02
Added
- Add NexusMods automatic upload to release workflow
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(65d3b97)
-
Add NexusMods upload API support (v3 multipart flow)
-
gui/nexusmods_uploader.py: 6-step upload client (initiate → chunk PUT
→ S3 XML complete → finalise → poll → create version) -
gui/nexusmods_upload_dialog.py: upload dialog with API key field,
file/group-ID pickers, metadata form, progress bar, QThread worker -
app_settings.py: nexusmods_api_key + nexusmods_file_group_id fields,
config v20 → v21 migration -
main_window.py: File → Upload to NexusMods… menu item
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(031177c)
-
Add NexusMods page auto-update script and updated description
-
scripts/update_nexusmods_page.py: Playwright automation that logs in,
updates short + full description via TinyMCE API, saves, and persists
cookies for future runs -
resources/nexusmods_description.html: updated copy for all 11 languages,
BA2 support, newline restoration, NexusMods upload feature
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(65cbd1b)
-
Add content-type icons to string table (Phosphor Icons, theme-aware)
-
gui/string_type_detector.py: classify strings into 7 types (Dialogue,
Quest, Book, Note, Terminal, UI, System) using regex heuristics on
text content + file extension; render Phosphor SVG icons on-demand via
QSvgRenderer, cached per (type, dark_mode); colors adapt to palette -
gui/string_table.py: insert "Kind" column (28 px) after ID; returns
themed QIcon in DecorationRole and label in ToolTipRole; type cache
cleared and icons re-tinted on theme change -
main_window.py: call invalidate_type_cache() after manual and
auto (OS) theme changes
Icon set: Phosphor Icons (MIT), phosphoricons.com
Colours: blue=dialogue, amber=quest, violet=book, slate=note,
green=terminal, orange=UI, slate=system
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(3f1f155)
- Add NexusMods badge and link to README
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(8417fc6)
- Add Batch Translate Folder dialog for bulk AI retranslation
New Translation → Batch Translate Folder… menu item opens a dialog that:
- Scans a folder of binary string files (_uk.strings / .dlstrings / .ilstrings)
- Loads matching _ru source files for source-language context
- Auto-fixes mechanical issues (Russian chars, missing tags, whitespace)
- AI-translates untranslated strings via Ollama (parallel workers)
- AI-retranslates strings with Russian word leakage
- Saves fixed binary files in place
- Shows real-time progress and log
Designed for bulk post-fix of the 4,737 untranslated + 5,936 Russian-leak
strings remaining after the scripted fix pass.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(24547f8)
- Add Claude AI integration: translation backend, chat assistant, quality review
Three new Claude-powered features (requires Anthropic API key):
-
Claude translation backend
- Select claude-haiku-4-5 / claude-sonnet-4-6 / claude-opus-4-7 in Preferences
- ClaudeTranslationWorker mirrors OllamaWorker signals exactly; all existing
progress, caching, term-protection, and glossary plumbing works unchanged - Parallel API calls via ThreadPoolExecutor (default 5 workers)
-
Claude AI Assistant chat panel (Ctrl+Shift+A)
- Dockable panel (right side); auto-updates context when a string is selected
- Full multi-turn conversation with Claude about the current string
- "Review Translation" — structured quality review with issues + rating
- "Suggest Translation" — asks Claude to translate the source string
- "Use as Translation" — applies Claude's last code-block suggestion to the table
- API key stored in existing SecretStore (encrypted, per-machine)
- Ctrl+Enter to send; model selector (Haiku / Sonnet / Opus)
-
Claude menu
- Claude AI → Show AI Assistant (Ctrl+Shift+A)
- Claude AI → Review Current Translation (Ctrl+Shift+R)
- Claude AI → Suggest Translation (Ctrl+Shift+T)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(780e694)
- Add QC training dataset generator for Gemma fine-tuning
scripts/create_qc_dataset.py — scans EN→UK Starfield string pairs,
runs QualityChecker on each, and emits ShareGPT JSONL with structured
quality assessment examples (VERDICT/CODES/SEVERITY/DETAILS/ACTION format).
Eleven synthetic injectors (missing_tag, extra_tag, russian_leak,
ai_artifact, repetition, empty, untranslated, truncated,
suspiciously_short, case_mismatch, missing_newlines) ensure full coverage
of all QC issue codes even when real data has few examples of a code.
Generated qc_dataset_sharegpt.jsonl: 14,928 examples
GOOD: 5,000 | ISSUES_FOUND: 9,928 across 16+ issue codes.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(0547e80)
- Add icons to all menu actions and extend toolbar
Sets QIcon.fromTheme() icons on every menu action (File, Edit,
Translation, Glossary, Claude AI, Settings, Help) so menus are no
longer bare text. Also adds Approve, Reject, Next Untranslated,
Edit Glossary, and Show AI Assistant buttons to the toolbar so the
most-used review actions are one click away.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(b979d57)
- Add Gemma 4 4B Modelfile and register in OllamaWorker
Modelfile.gemma4 points to the Unsloth Studio Q4_K_M GGUF export of
gemma-4-e4b-it. Adds "translategemma4-st" to OllamaWorker.MODEL_CONFIGS
with the same parameters as translategemma3-st so the app can use it
immediately after: ollama create translategemma4-st -f Modelfile.gemma4
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(5ebcd5a)
Changed
- Update UI translations: de/fr/es/pl/cs complete, uk partial
de_DE, fr_FR, es_ES, pl_PL, cs_CZ: 844 strings fully translated.
uk_UA: 422 strings translated, 422 new strings pending (added by lupdate).
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(25f5a8a)
Fixed
- Fix secrets context error in NexusMods upload job
secrets context is not available in job-level if conditions; move the
API key check to step level using an env var instead.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(9e224b4)
- Fix Ctrl+Shift+A shortcut conflict breaking both actions
Translate All and Claude panel both claimed Ctrl+Shift+A, silencing
both shortcuts. Reassigned Claude panel to Ctrl+Shift+C.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(f5da782)
- Fix encoding detection: English UTF-8 files no longer mis-detected as windows-1252
Two changes:
- Count 3-byte UTF-8 sequences (0xE0-0xEF lead) in addition to 2-byte ones, so
English smart quotes / em-dashes (U+201x, U+2014 etc.) raise UTF-8 confidence
instead of leaving confirmed_pairs at zero. - Add step 5: if UTF-8 strict decode fails but < 1% of decoded chars are
replacement chars, the content is overwhelmingly ASCII — return UTF-8 rather
than falling through to the CP1252 fallback. This handles files that are
effectively UTF-8 but contain a handful of stray CP1252 bytes.
Russian/Ukrainian UTF-8 detection is unaffected (Cyrillic pair check in step 2).
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(ebfaa63)
-
Fix ruff lint errors: remove unused imports and local re-imports
-
scripts/update_translations.py: remove unused
import json -
gui/claude_translation_worker.py: remove unused
Optionalfrom typing import -
gui/claude_chat_panel.py: remove unused top-level
QApplicationimport;
remove localfrom PySide6.QtGui import QTextCursorre-imports from
_begin_claude_stream / _on_token / _on_reply (F811 redefinition of the
top-level import on line 19)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(0e47470)
- Fix NexusMods upload steps being skipped due to env secret check
GitHub Actions does not reliably expose job-level env vars set from secrets
to step if: expressions — env.NEXUSMODS_API_KEY != '' always evaluated false,
silently skipping both upload steps. Remove the per-step guards; the job-level
condition (non-prerelease tag) is sufficient.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(a72fc2d)
- Fix NexusMods workflow: use vars. context instead of secrets.
The API key and file group IDs were stored as repository Variables
(Settings → Secrets and variables → Variables tab), not as Secrets.
Variables are accessed via ${{ vars.NAME }}, not ${{ secrets.NAME }}.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(b82150e)
Other
- Clean protected terms: remove 158 unused + 5 not in active string files
Terms pruned from 3,233 to 3,075. The 5 terms not found in any of the
original/uk nexus string files (Drilling Machine, Arnie, Latika, Mara, FEV)
were removed by the automated scan. Remaining prior removals were already
in the working tree.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(4690b1d)
- Rebuild protected terms: remove proper_noun, regenerate from string pairs
Removed 1,780 generic proper_noun entries. Regenerated 54 new proper_noun
terms from ID-matched EN/UK string pairs — only multi-word brand/org names
and confirmed single terms surviving in Ukrainian text. Total: 3,233 → 163
(company 31, faction 25, ui 20, lore 17, ship 16, proper_noun 54).
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(f18e045)
- Regenerate CLAUDE.md + add standalone ROCm training script
CLAUDE.md: fully updated to reflect current codebase — CONFIG_VERSION 21,
all new gui modules (audit_log, crash_recovery, secret_store, claude_client,
claude_chat_panel, glossary, consistency_checker, keyboard_manager, diff_viewer,
plugin_validator, nexusmods_uploader, etc.), ba2_handler/version_diff in the
library layer, requirements.txt, multi-locale translations, and scripts section.
scripts/train_qc_model.py: standalone QLoRA fine-tuning script for the Gemma 3
1B QC model. Bypasses Unsloth Studio (which crashes on ROCm gfx1030 with Gemma 4).
Sets HSA_ENABLE_SDMA=0 + PYTORCH_HIP_ALLOC_CONF before torch import, uses
attn_implementation="eager" to avoid broken Flash Attention 2 path. Falls back
to plain transformers+peft if unsloth is unavailable.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(37883ee)
- Sync Modelfile with actual runtime behaviour
Two fixes:
- repeat_penalty: was 1.05 in Modelfile but app sends 1.1 (MODEL_CONFIGS value);
aligned to 1.1 so directollama runmatches in-app behaviour. - IMPORTANT comment: corrected list of which params the app overrides vs which
are inherited from Modelfile (min_p and repeat_last_n are NOT overridden by
the app — their Modelfile values are always active during API calls too).
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(c52c05c)
-
Upgrade Claude integration: caching, streaming, current models
-
Prompt caching (cache_control: ephemeral) on every API call — system
prompts are identical within a batch session so subsequent requests pay
~10 % of normal input token cost for the system-prompt portion -
Add chat_stream() to ClaudeClient yielding text deltas for progressive UI
-
Chat panel wires token_ready signal: tokens appear as they arrive, then
the final reply is re-rendered with full markdown/code-block formatting -
Share one ClaudeClient instance per translation worker instead of
allocating a new one for every string (also enables prompt-cache reuse) -
Update model registry: claude-haiku-4-5 (no stale date suffix),
claude-opus-4-8 replaces 4-7; fix default across all five files
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(9acad3d)
- Suppress AT-SPI accessibility bus warning on startup
Sets NO_AT_BRIDGE=1 before any Qt/GTK import to prevent the
"Couldn't connect to accessibility bus" dbind warning that appears
when the at-spi daemon socket is inaccessible.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(760ca08)
- Complete Ukrainian UI translation: all 844 strings finished
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(a32c7fa)
- Bump version to 0.2.1
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(5cbac2f)
- Replace Nexus-Mods/upload-action with project's own uploader script
The third-party action throws "Input required and not supplied: api_key"
when the secret evaluates to empty string via GHA's input validation,
even when the secret is set. Use scripts/nexusmods_upload.py backed by
gui/nexusmods_uploader.py (already in tree) instead — secrets are passed
as env vars, avoiding the action's input-required check entirely, and the
script emits clear errors when API key or file group IDs are missing.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(f92cce7)
- NexusMods upload: skip gracefully when API key secret is not configured
Change exit code from 1 to 0 when NEXUSMODS_API_KEY is missing so CI does
not fail on repos without the secret set. Add a diagnostic step that prints
true/false for each expected secret so the log shows exactly what is missing.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(b2191bd)
Removed
- Remove character, item, and location terms from protected list
Drops 964 terms (111 characters, 20 items, 833 locations/planets).
Remaining 2,111 terms cover: proper nouns, skills, resources,
creatures, companies, factions, UI labels, lore, and ships.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(c031f03)
- Remove skill, resource, and creature terms from protected list
Drops 222 terms (96 skills, 92 resources, 34 creatures).
Remaining 1,889 terms: proper nouns, companies, factions, UI, lore, ships.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(28bd957)
- Remove Modelfile.gemma4, train_qc_model.py, update_nexusmods_page.py
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(3b390c3)
- Remove apply_quality_fixes.py and apply_uk_translations.py
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com(fd997dc)