| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| UnityGameTranslator-BepInEx5-v0.9.56.zip | 2026-03-26 | 3.3 MB | |
| UnityGameTranslator-BepInEx6-IL2CPP-v0.9.56.zip | 2026-03-26 | 3.3 MB | |
| UnityGameTranslator-BepInEx6-Mono-v0.9.56.zip | 2026-03-26 | 3.3 MB | |
| UnityGameTranslator-MelonLoader-IL2CPP-v0.9.56.zip | 2026-03-26 | 3.3 MB | |
| UnityGameTranslator-MelonLoader-Mono-v0.9.56.zip | 2026-03-26 | 3.3 MB | |
| README.md | 2026-03-26 | 4.7 kB | |
| v0.9.56 source code.tar.gz | 2026-03-26 | 296.4 kB | |
| v0.9.56 source code.zip | 2026-03-26 | 340.4 kB | |
| Totals: 8 Items | 17.0 MB | 2 | |
v0.9.56 — Major Update
🔤 Universal Font Replacement
- TTF/OTF Rasterizer: Built-in pipeline to rasterize any .ttf/.otf font into SDF bitmap atlas. Supports TrueType (quadratic), OpenType CFF (cubic), compound glyphs, and variable fonts. No external tools needed.
- UI.Text font replacement on IL2CPP: Working via fontNames trick — clones the game font, redirects to system/custom fonts. Includes DontDestroyOnLoad for persistence across scenes.
- TMProOld fallback fonts: Custom fonts (Devanagari, etc.) work as TMProOld fallbacks with all required fields properly initialized (fixes NullRef in GenerateTextMesh).
- Font scale system: Per-font size scaling with bestFit maxSize support. Conditional scale — only applied when clone font is active.
- Key==value font replacement: Texts validated as identical in source/target (e.g., "Options" EN→FR) correctly receive the replacement font. Scanner triggers font replacement for prefab-defined text.
🎮 Scene-Aware Font Management
- DontDestroyOnLoad on clone fonts — persist across scene changes.
- willRenderCanvases hook — re-warm clone atlases and refresh text after scene transitions.
- Scene unload hooks — cleanup stale references, typewriting state, and dead component refs.
- OnEnable hook — Harmony postfix on Graphic.OnEnable re-binds clone font when components activate.
⌨️ Typewriting Detection
- Debounce system: Per-component tracking detects text growing char by char. 500ms stabilization before queuing for AI.
- Dialogue replacement: When text changes completely on same component (click-to-next), previous text is finalized and queued before deferring the new one.
- Cache hit bypass: Cache hits during typewriting touch the timestamp to keep the stabilizer alive.
🤖 AI Translation Quality
- Markup tag extraction:
<color>,<size>,<b>, etc. are extracted as[!t*N]placeholders before AI, restored after. Prevents AI from corrupting game formatting. - Line break preservation:
\n→[!nl]placeholder before AI, restored after. - Whitespace preservation: Leading/trailing whitespace trimmed before AI, restored after.
- Placeholder format: Migrated from
[vN]to[!v*N]to avoid collision with game text. Auto-migration of existing files. - Conditional prompt rules:
[!v*N],[!t*N],[!nl]rules only mentioned when present — prevents AI hallucinating non-existent placeholders. - Tag validation: Warning logged when AI drops tag placeholders (informational, no rejection).
🔄 Cache & Sync
- Thread-safe reverse cache:
HashSet→ConcurrentDictionaryfixes intermittent missed translations from concurrent access. - Read-back detection: When games read translated text and append untranslated content, reconstructs source text for proper cache lookup. Verified against cache to prevent false positives.
- Worker cache-hit notification: Components re-queued with the same text now all receive translations (fixes first-dialogue display).
- Upload auto-select: Games with Steam ID are auto-selected without manual search. Server creates game on first upload.
- CJK game name support: Proper URL slugs for Chinese/Japanese/Korean game names (server-side).
- Fonts metadata:
_fontssettings included in upload payload.
🔍 Scanner & Detection
- Unified scanner architecture: Refactored with generic text type detection (NGUI, SuperTextMesh, custom frameworks).
- Relaxed visibility check: Inactive panels/tabs with stable text are translated upfront. Only inactive + typewriting components (accumulators) are deferred.
- Generic text type patching: Auto-detects and patches
set_text/get_texton unknown text component types.
🛡️ Stability
- Atlas corruption fix: ASCII-only PreWarm (95 chars) prevents corruption with large caches. Additional chars added incrementally.
- Per-frame atlas protection: Prevents character purging when multiple cloned fonts share the native rasterizer.
- Shutdown cleanup: Proper thread termination prevents game hang on exit (IL2CPP).
- Conditional SetFont: Only apply clone font when text has a cached translation — untranslated CJK text keeps original game font.
- Conditional ApplyFontScale: Only scale when component has clone font — prevents size cumulation.
🧹 Cleanup
- Debug mode:
"debug": truein config.json enables verbose logging. All diagnostic logs (TW-STAB, TW-FINAL, REVERSE-MISS, etc.) are debug-only. - Silenced noisy logs: UniverseLib TypeLoadException warnings and SSE connection errors moved to debug.
- Removed ~660 lines of dead code.