Skip to content

Releases: djethino/UnityGameTranslator

v0.9.65 — Non-Latin font fixes & Unity 6 compatibility

Choose a tag to compare

@djethino djethino released this 10 Jun 12:54

Fixed

  • Non-Latin fonts (Chinese, Japanese, Korean, …) are now correctly applied on Mono games using modern TextMeshPro — text that previously showed up as empty boxes now renders properly.
  • Fixed a crash that could occur when quitting the game.

Improved

  • Better compatibility and UI reliability on newer Unity (including Unity 6) and IL2CPP games.
  • Security hardening: stored credentials are now encrypted at rest, and the mod is more robust against malformed server responses.

Each mod loader has its own archive below. Download the one matching your setup, plus its .sha256 if you want to verify the download.

v0.9.64

Choose a tag to compare

@djethino djethino released this 03 Jun 11:01

Fixes

  • Custom CJK / Devanagari fonts now render the correct glyphs (a y-flip inversion in the modern glyph path was previously sampling mirrored UV positions, producing the wrong characters).
  • Custom font no longer becomes invalid after a game restart, and modifying it after restart no longer crashes (atlas texture, material and clone are now flagged DontDestroyOnLoad).
  • Custom fonts initialised before the splash scene no longer produce a broken bare ScriptableObject — the loader now defers and retries automatically once a game TMP_FontAsset becomes cloneable.
  • Font dropdown no longer shows "(incompatible)" on TTF fonts whose first PNG write failed; the in-memory texture is reused on retry instead of pointing at a phantom file path.

Performance & memory

  • Atlas texture is now Alpha8 instead of RGBA32: 4× less VRAM per atlas and 4× less RAM during creation.
  • LoadRawTextureData on a single byte[] replaces SetPixels32 on a Color32[], removing a ~1 GB Mono LOH allocation per 16384² atlas (transparent fallback to SetPixels32 if the IL2CPP runtime rejects the raw path).
  • Apply(false, true) after every atlas load drops the CPU mirror; GC.Collect + Resources.UnloadUnusedAssets after each font load releases the rasterizer's transient buffers immediately.
  • Disk cache per CJK font dropped from ~1 GB raw RGBA dump to ~10–30 MB PNG-compressed Alpha8 atlas. Legacy .cache.* files are auto-deleted on startup.
  • AtlasPacker now uses SystemInfo.maxTextureSize and supports multi-atlas spill (dormant for current targets but wired in).

Unity 6 compatibility

  • New pure-C# PNG encoder replaces Texture2D.EncodeToPNG on the rasterizer path. Required because Unity 6 + Il2CppInterop throws Instances of abstract classes cannot be created in BlittableArrayWrapper.Unmarshal — the marshalled byte[] return wrapper can't be instantiated on that runtime.
  • PNG output uses ColorType 4 (grayscale + alpha) so Unity's LoadImage routes the SDF byte into the texture's alpha channel, avoiding the "white squares" artefact that ColorType 0 PNGs produced.
  • Streaming row-by-row encode keeps peak transient RAM under 50 MB during the encode itself.

Diagnostics & privacy

  • Always-on environment snapshot at startup logs Unity / OS / GPU / RAM / maxTextureSize / Alpha8 support / culture in a single block.
  • Logs now strip the Windows username from paths, hide custom AI / API hosts (stock hosts kept in clear), and mask the API username — making bug-report logs safe to share publicly.
  • EncodeToPNG and WriteAllBytes failures now surface the inner exception, drive free space and texture state.

Downloads

Pick the zip matching your mod loader:

File Mod loader
UnityGameTranslator-BepInEx5-v0.9.64.zip BepInEx 5 (Mono)
UnityGameTranslator-BepInEx6-Mono-v0.9.64.zip BepInEx 6 (Mono)
UnityGameTranslator-BepInEx6-IL2CPP-v0.9.64.zip BepInEx 6 (IL2CPP)
UnityGameTranslator-MelonLoader-Mono-v0.9.64.zip MelonLoader (Mono)
UnityGameTranslator-MelonLoader-IL2CPP-v0.9.64.zip MelonLoader (IL2CPP)

v0.9.63

Choose a tag to compare

@djethino djethino released this 29 May 13:48

What's new

Bug fixes

  • Font replacement pipeline rewritten for TMP-only games. TMP fonts now resolve correctly on more IL2CPP titles (the legacy CreateFontAsset path looked the system font up by file name; we now read the real family name from the TTF before calling it). Components no longer render with their original font on first display of a new scene, and the small font-swap flicker on scene transitions is gone. The per-scene refresh that drove all this was being silently skipped on games without any Unity legacy Font clones.
  • Async / threading. Unobserved exceptions in async work and in main-thread callbacks no longer take the host runtime down silently — they are caught, logged with full stack traces, and the next iteration continues.

Features

  • Network / Proxy configuration. The mod's HTTP requests (AI server, sync API, GitHub) can now be routed via Default / System (forced fresh Windows proxy) / None (bypass all proxies) / Custom (URL + optional credentials). Useful when a game's process injects a runtime proxy that swallows the mod's calls. Settable from Options > Online > Network / Proxy, applied live with no restart.
  • Unified per-frame tick. All per-frame work now runs from a single coroutine instead of each mod-loader's MonoBehaviour.Update. Some games suppress our Update — on those the mod now works the same as everywhere else. As a side effect the work runs in the coroutine slot between Update and LateUpdate, which gives slightly smoother frame pacing.

UI

  • Panels with scrollable content (Inspector text edit, merge conflicts, parameters tabs…) can now be resized vertically up to the screen height, and their inner list expands accordingly.
  • Title bars stay grabbable in all positions — no more dragging a panel half off-screen and being unable to bring it back.

Install

Pick the archive for your loader + runtime:

  • BepInEx 5 (legacy Mono): UnityGameTranslator-BepInEx5-v0.9.63.zip
  • BepInEx 6 Mono: UnityGameTranslator-BepInEx6-Mono-v0.9.63.zip
  • BepInEx 6 IL2CPP: UnityGameTranslator-BepInEx6-IL2CPP-v0.9.63.zip
  • MelonLoader Mono: UnityGameTranslator-MelonLoader-Mono-v0.9.63.zip
  • MelonLoader IL2CPP: UnityGameTranslator-MelonLoader-IL2CPP-v0.9.63.zip

Extract into the matching mod folder of your game.

v0.9.62 — Wider IL2CPP game compatibility

Choose a tag to compare

@djethino djethino released this 05 May 09:27

v0.9.62 — Wider IL2CPP game compatibility

🔧 Fixes

  • Mod no longer crashes when opening its UI on Unity IL2CPP games whose build has stripped the 4-argument RectOffset constructor.
  • Same defensive routing applied to Texture2D and Rect constructors so any future IL2CPP game with similarly aggressive code-stripping is protected.
  • AI URL resolution now handles providers without a /v1 path prefix (Deepseek, etc.). When the configured URL ends with /chat/completions, the mod derives the connection-test endpoint by swapping that suffix instead of blindly appending /v1/models. Users on /v1-less providers should paste the full chat URL their provider documents.

No behaviour change on games where the previous version already worked or on AI providers using the standard /v1/ prefix.

v0.9.61 — Single-DLL packaging & smooth scanning

Choose a tag to compare

@djethino djethino released this 28 Apr 16:07

v0.9.61 — Single-DLL packaging & smooth scanning

✨ New

  • Single-DLL packaging: UnityGameTranslator.dll now embeds Newtonsoft.Json, Core, and UniverseLib via ILRepack — eliminates conflicts when other plugins using different versions of those libraries are installed in the same game.
  • 9 new configurable hotkeys for panel toggles and actions (translations, AI, images, fonts, overlay, inspector, upload, exclusion mode, text editor, force scan). All disabled by default to avoid game-input conflicts; configure them in the Options panel.

🔧 Fixes

  • Periodic microfreezes during scanning are gone: scanner now runs every frame with an adaptive sub-noise-floor budget instead of bursts every 200ms. Stays imperceptible regardless of scene size.

⚙️ Config

  • New option max_text_detection_latency_seconds (default 1s) controls how fast newly-spawned text components are picked up.

📚 Docs

  • README clarifies MelonLoader install path (Mods/ directly, no subfolder) and documents External Resources folders (custom fonts, replacement images).
  • "External Resources" link added in the mod UI (opens fonts/images folder).

🧹 Upgrade notes — files you can remove

The single-DLL packaging means several files shipped with previous versions are no longer needed. They are safe to leave in place (the new DLL ships its own internalized copies and ignores the external ones), but if you want a clean install you can delete them.

BepInEx (5, 6-Mono, 6-IL2CPP)

Folder: <Game>/BepInEx/plugins/UnityGameTranslator/

Safe to delete (they only existed for this mod):

  • UnityGameTranslator.Core.dll
  • Newtonsoft.Json.dll
  • UniverseLib.Mono.dll (BepInEx 5 / BepInEx 6-Mono)
  • UniverseLib.BIE.IL2CPP.Interop.dll (BepInEx 6-IL2CPP)

MelonLoader (Mono, IL2CPP)

Folder: <Game>/Mods/

Files that may be shared with other mods (UnityExplorer, etc.) — only delete if you are sure no other mod uses them:

  • UniverseLib.Mono.dll (MelonLoader-Mono — used by UnityExplorer-Mono)
  • UniverseLib.ML.IL2CPP.Interop.dll (MelonLoader-IL2CPP — used by UnityExplorer-IL2CPP)
  • Newtonsoft.Json.dll

Files that were ours alone (always safe to delete):

  • UnityGameTranslator.Core.dll

When in doubt, leave the files. They will not conflict with the new single-DLL build.

v0.9.60 — Font Overrides, In-Game Text Editor & Merge Fixes

Choose a tag to compare

@djethino djethino released this 08 Apr 13:48

New Features

Font/Size Overrides by Pattern

Override font size for specific UI elements without affecting the rest of the game. Useful when translated text needs different sizing than the original (e.g., tables, tooltips, titles).

  • 3 ways to add overrides: click on an element with the inspector, search by text content, or type a pattern manually
  • Supports recursive patterns (path:**/TablePanel/**)
  • Changes apply at runtime — no restart needed
  • Found in Translation Parameters → Fonts → Overrides

In-Game Text Editor

Edit any translation directly in the game without opening external files.

  • Click on any UI element to see all its text children
  • Edit the translation and save with a single click (tagged as Human)
  • Or retranslate with AI if the current translation isn't good enough
  • Found in Translation Parameters → Tools → Start Text Editor

Multiple Translation Backends

  • AI (LLM): any OpenAI-compatible server (Ollama, LM Studio, Groq, OpenAI, Google Gemini, and more)
  • Google Translate: Cloud Translation API
  • DeepL: Free and Pro tiers

Improvements

Merge & Sync

  • Merge panel now fully works on IL2CPP games (Schedule I, etc.)
  • "Keep My Changes" and "Take Server" buttons highlight when selected
  • "Apply Merge" is disabled until you make a choice
  • Clearer sync notifications: "Sync needed" instead of "Conflict" when changes can be merged automatically
  • Auto-merge when no real conflicts — panel only appears when manual resolution is needed
  • Website merge-preview: fixed session handling and accurate change count

UI

  • Inspector highlight no longer covers mod panels
  • Correct panel layering when returning from inspector
  • "Behavior" tab renamed to "Tools"
  • All writing systems supported (Arabic, Hindi, Cyrillic, Thai, Hebrew, CJK, and more)

Bug Fixes

  • Fixed merge button in overlay opening an empty panel instead of downloading remote changes
  • Fixed font size overrides not applying to child elements at runtime
  • Fixed website merge-preview "file not found" error when saving
  • Fixed website logout after merge-preview save when already logged in
  • Fixed AI URL resolution for non-standard providers (Gemini requires full URL with /chat/completions)

v0.9.59 — Major Update

Choose a tag to compare

@djethino djethino released this 07 Apr 16:31

Major Update

Image Replacement System

  • Bitmap image replacement for translated text in sprites
  • Hot-reload and auto-load with simplified JSON schema
  • IL2CPP compatible sprite resolution

Variable Capture & Translation Parameters

  • Variable capture system with new TranslationParametersPanel
  • Find by Value search across all text components
  • Exclusion patterns for UI elements
  • Behavior tab with detection toggles

Font Fallback System (IL2CPP)

  • Fixed atlas corruption: direct fontNames modification on original fonts instead of Instantiate clones
  • Font family name resolution for reliable FreeType lookup
  • Runtime font changes via fontSize bump to invalidate atlas cache
  • Continuous font scale slider (1%-200%)

Procedural Text Detection (Concat)

  • Detects text built in steps (tooltips, item descriptions)
  • Translates each part separately for better cache reuse across items
  • Runtime concat cache for instant re-display
  • Re-assembly on AI completion
  • Typewriting overwrite detection

Settings

  • Typewriting and Procedural text detection toggles (Behavior tab)
  • Settings stored in translations.json for sharing between users

Other Fixes

  • IL2CPP Harmony compatibility (SetMethod.Invoke)
  • ForceRefreshAllText improvements
  • Transparent font fix
  • SaveCache after manual download

v0.9.58 — Inspector IL2CPP + DevTools-style

Choose a tag to compare

@djethino djethino released this 03 Apr 10:41

What's New

Inspector now works on IL2CPP games

  • Complete rewrite of UI raycast using pure reflection — no more crashes on IL2CPP
  • Fixed GetWorldCorners, GetComponents<T>(), FindObjectsOfType<T>() JIT crashes

DevTools-style inspector

  • Hover preview: real-time path display as you move cursor over UI elements
  • Highlight overlay: semi-transparent blue rect over hovered/selected elements (Chrome DevTools-style)
  • Separate "Hovered" and "Selected" fields

Exclusion improvements

  • Excluding a parent now excludes all children (e.g., excluding a scoreboard excludes all score texts)
  • Inspector hides MainPanel during inspection for a clear view, restores it on close
  • Closing inspector returns to OptionsPanel → Exclusions tab

v0.9.57

Choose a tag to compare

@djethino djethino released this 02 Apr 19:53

v0.9.57

New Features

  • Google Translate & DeepL API backends — Choose between LLM (AI), Google Translate, or DeepL for auto-translation. Configurable in Settings > Translation tab via a type selector (LLM / Translation API) and provider dropdown (Google / DeepL)
  • Rate limit handling — HTTP 429 responses from any backend (LLM, Google, DeepL) are detected and failed translations are automatically re-queued with configurable retry delay (default 3s, supports decimals)
  • Notification overlay settings — Disable the corner notification overlay entirely or choose its position (top-right, top-left, bottom-right, bottom-left) in Settings > General

Improvements

  • Smart endpoint resolution — Automatically detects URL format for all OpenAI-compatible providers. Just paste the base URL from your provider's docs:

    Provider URL to enter
    Ollama http://localhost:11434
    LM Studio http://localhost:1234/v1
    Groq https://api.groq.com/openai/v1
    OpenRouter https://openrouter.ai/api/v1
    Together AI https://api.together.xyz/v1
    Gemini https://generativelanguage.googleapis.com/v1beta/openai/chat/completions

    The mod auto-detects the URL format and resolves the correct endpoint. URLs ending with /v1 get /chat/completions appended. Bare URLs (like Ollama) get /v1/chat/completions. URLs with /v1/ followed by a wrong path are corrected. Full endpoint URLs are used as-is. Existing configurations are fully backwards compatible.

    Note: Gemini uses a non-standard path (/v1beta/openai/chat/completions instead of /v1/chat/completions). Use the full URL above for Gemini.

Fixes

  • Groq compatibility — Fix "property 'think' is unsupported" error by broadening think parameter detection for all provider error formats
  • Login from wizard — Fix Connect Account button not working during wizard setup

v0.9.56

Choose a tag to compare

@djethino djethino released this 26 Mar 16:03

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: HashSetConcurrentDictionary fixes 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: _fonts settings 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_text on 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": true in 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.