Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Localization
Runtime translation/localization helper for Valheim mods.
CHANGELOG
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.