Localization
Runtime translation/localization helper for Valheim mods.Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[v2.0.1] - 2026-05-16
Fixed
- Fixed the devtools Playground rebuild flow so rebuilding the page clears stale UI references instead of reusing dead controls, and clicking a scrollable input field now re-activates the underlying
InputFieldso text entry keeps working after scrolling.
[v2.0.0] - 2026-05-16
Added
- Added the built-in in-game Localization devtools overlay with
Plugin,Performance,Trace,Browser, andPlaygroundpages for live inspection and rule drafting. - Added root-level plugin localization catalogs (
Localization-English.jsonandLocalization-Chinese_Trad.json) with hot reload so overlay labels, plugin-owned UI strings, and fallback log text can be localized separately from mod translation rules. - Added runtime performance metrics, translation-analysis views, and rule-browser snapshots for loaded local and ServerSync rule files.
- Added
trace_feed_max_entries,devtools_enabled, anddevtools_toggle_shortcuttoBepInEx/config/com.paxton0505.localization/config.yaml, withCtrl + F1as the default devtools toggle in the UI.
Changed
config.yamlhot reload now also updates trace-feed capacity and the devtools overlay enable/shortcut state without restarting the game.- Root-level plugin localization files are now auto-generated and hot-reloaded alongside the language rule folders.
- Updated the repository README and Thunderstore README to document the built-in devtools overlay, plugin-owned localization files, live runtime settings, and current Thunderstore packaging output.
Removed
- Removed the unused
DevToolsSectionedPagescaffold left over from earlier devtools layout experiments.
[v1.3.0] - 2026-05-14
Added
- Added
translation_enabled: trueas the top-most runtime setting inBepInEx/config/com.paxton0505.localization/config.yaml. - Added deterministic
validate-artifactworkflow support for the translation agent, plus restored Python/runtime checks around sanitizer and artifact validation behavior. - Added an optional runtime settings file at
BepInEx/config/com.paxton0505.localization/config.yamlwithdebug: falseby default. - Added configurable whole-string longest-match exact replacement restrictions through
whole_string_longest_match_modeandwhole_string_longest_match_min_lengthinconfig.yaml. - Added constrained template placeholders for
word,words(...),int(...),float(...), andoneof(...), including numericwhere=predicates such as>0 && <10.
Changed
- When
translation_enabled: false, the runtime now bypasses UI translation and skips rule reloads until translation is enabled again. - Clarified that
translation_enabled,debug, and other runtime knobs remain local client-side settings even when translation rules are synced through ServerSync. - Restored rich-text tag stripping for exact, template, and whole-string longest-match exact replacement while keeping
OrdinalIgnoreCasebehavior. - Normalized exact and template matches now re-apply only the outer tags immediately wrapping the matched visible span. Whole-string longest-match exact replacement keeps only the full string's outermost tags; internal word-level tag positions are not remapped.
- Whole-string longest-match exact replacement now defaults to
per_wordmode, and runtime changes to its restriction settings immediately clear translation caches. - Updated the repository README and Thunderstore README to document tag-stripped matching with outer-tag reapplication.
- Refreshed the repository README and Thunderstore README to document the current project layout, validation commands, runtime toggle behavior, and ServerSync hot reload semantics.
- Signed
intandfloatconstrained placeholders now accept optional leading+or-by default, with further numeric filtering available throughwhere=predicates. - When
debug: trueis enabled, the plugin now logs intercepted UI strings before translation, rule-file load details, cache hits and miss-cache hits, winning match stages, placeholder resolution, and loop or duplicate diagnostics.
[v1.2.3] - 2026-05-13
Added
- Added normalized exact-rule matching for all translation hops by stripping rich-text tags from match input and comparing exact rules with
OrdinalIgnoreCase. - Added normalized template matching so template literals also compare against tag-stripped input case-insensitively.
Changed
- Matched output now always comes from the rule
replacevalue, so intercepted source tags are not re-applied after translation. - Active-language translation hops now participate in the same relaxed normalized matching instead of limiting ignore-case behavior to the English bridge layer.
- Updated the repository README and Thunderstore README to document normalized matching, tag stripping, and replace-first rendering behavior.
[v1.2.1] - 2026-05-13
Added
- Added an English-only
OrdinalIgnoreCaseexact-rule fallback so English baseline normalization can still bridge casing variants such asPACKHORSE -> PackHorse -> 馱馬.
Changed
- Kept active-language exact rules and all template matching case-sensitive, limiting ignore-case behavior to the English exact normalization layer.
- Updated the repository README and Thunderstore README to document the new English-only ignore-case fallback and its scope.
[v1.2.0] - 2026-05-13
Added
- Added chained runtime translation passes so one intercepted string can flow through multiple rule matches, such as
German hardcoded text -> English baseline alias -> Chinese_Trad active translation. - Added chained exact-rule resolution for
{{localize(...)}}template placeholders so placeholder values can also normalize through English aliases before landing on the final target language.
Changed
- Updated the repository README and Thunderstore README to document chained translation behavior, English normalization patterns, and the new placeholder resolution flow.
[v1.1.1] - 2026-05-13
Changed
- Lowered duplicate exact-rule and template-rule diagnostics from error level to debug level. Later duplicate definitions are still ignored, but they no longer surface as load errors.
- Expanded the Thunderstore README into a fuller usage guide covering installation, config layout, rule format, load precedence, server/client behavior, and hot-reload details.
- Reformatted this changelog to the Keep a Changelog structure.
[v1.1.0] - 2026-05-13
Added
- Server-side hot reload logs so dedicated server config updates now show when a debounced snapshot is republished.
- Debounced config file watcher reloads so rapid JSON saves only publish one local snapshot.
- ServerSync-based session overlays so clients can receive the server's localization JSON tree without rewriting local files.
- Remote/local layered rule merging so synced rules can override the local English and active-language files in a predictable order.
Changed
- Dedicated servers now run in sync-only mode and skip the local translation runtime plus UI Harmony patches.
- Bundled ServerSync into the plugin build and updated the release/docs for the new sync flow.
[v1.0.4] - 2026-05-13
Fixed
- Fixed the release zip output and cleaned up the Thunderstore packaging flow.
Changed
- Polished release metadata and trimmed package assets/docs for distribution.
[v1.0.3] - 2026-05-13
Changed
- Optimized template rule dispatch and loading performance.
Added
- GitHub Copilot-assisted translation workflow, prompts, agents, and Python tooling.
- Recorded mod version metadata in the translation workflow and reorganized Thunderstore release files.
[v1.0.2] - 2026-05-10
Added
- Thunderstore packaging basics including manifest and icon assets.
Changed
- Refined the project/build setup and refreshed the README for initial release packaging.
[v1.0.1] - 2026-05-10
Added
- Split the initial implementation into focused runtime, loader, template, and interception components.
- Added exact/template rule loading, placeholder handling, and final UI text interception.
[v1.0.0] - 2026-05-10
Added
- Initial project scaffolding, BepInEx plugin entry point, build file, and README.
- First working prototype of the runtime localization plugin.
