Skip to content

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 02 Jun 11:12
· 354 commits to main since this release

[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):

  1. 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)
  2. 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)
  3. 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 Optional from typing import

  • gui/claude_chat_panel.py: remove unused top-level QApplication import;
    remove local from PySide6.QtGui import QTextCursor re-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 direct ollama run matches 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)