Skip to content

Releases: djethino/UnityGameTranslator

v0.9.62 — Wider IL2CPP game compatibility

05 May 09:27

Choose a tag to compare

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

28 Apr 16:07

Choose a tag to compare

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

08 Apr 13:48

Choose a tag to compare

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

07 Apr 16:31

Choose a tag to compare

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

03 Apr 10:41

Choose a tag to compare

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

02 Apr 19:53

Choose a tag to compare

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

26 Mar 16:03

Choose a tag to compare

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.

v0.9.55

15 Mar 03:07

Choose a tag to compare

Font Replacement Overhaul

Reverse Fallback Architecture

  • Replacement font is now primary, original game font added as fallback
  • This allows imposing a custom font while keeping original glyphs for missing characters
  • Consistent across all platforms: standard TMP, TMProOld (Hollow Knight), UI.Text, IL2CPP

Font Runtime Controls Fixed

  • Font replacement, scale, enable/disable toggle all work correctly at runtime
  • Changing fallback font properly restores originals before applying new one
  • Font scale applies immediately on all components (fixed empty name bug on Unity 6)
  • IL2CPP: fontSharedMaterial assignment uses proper type casting

Font Identify UI

  • New "?" button on each font row in Options → Fonts tab
  • Click to highlight all in-game texts using that font (magenta) and dim others
  • Click again or switch tab to clear — own UI excluded from highlight
  • Works on both Mono and IL2CPP builds

Code Cleanup

  • Removed dead code from old forward-fallback architecture
  • Removed diagnostic logging from font scale debugging
  • Removed verbose hot-path logs in AlternateTMP prefix

v0.9.54 - Universal AI API

13 Mar 13:22

Choose a tag to compare

What's New

Universal AI API (OpenAI-compatible)

  • Any LLM provider: Ollama, LM Studio, OpenAI, Groq, Google Gemini, Mistral, OpenRouter, and any OpenAI-compatible server
  • API Key support: Encrypted at rest (AES-256) for cloud providers
  • Model dropdown: Browse available models from your server with searchable dropdown + Refresh button
  • Backward-compatible config: Existing Ollama configs auto-migrate to new format

Thinking Model Support

  • Universal think: false for all models that support it
  • Extra /no_think + assistant prefill for Qwen3/DeepSeek-R1 models
  • Non-thinking models (TranslateGemma, Llama, etc.) get clean requests

Bug Fixes

  • Fix Font.GetOSInstalledFontNames() crash on IL2CPP (Schedule I, etc.)
  • Fix silent AI errors — HTTP failures and exceptions now always logged
  • Fix config migration not triggering worker thread on first load
  • Reduce log spam: verbose font diagnostics moved behind debug_ai flag
  • Silence expected ForceMeshUpdate failures on uninitialized components

Configuration

{
  "ai_url": "http://localhost:11434",
  "ai_model": "qwen3:8b",
  "ai_api_key": null,
  "enable_ai": true
}

For cloud providers (e.g., Groq):

{
  "ai_url": "https://api.groq.com/openai",
  "ai_model": "llama-3.3-70b-versatile",
  "ai_api_key": "your-api-key-here",
  "enable_ai": true
}

v0.9.53

18 Feb 04:01

Choose a tag to compare

Changes

Real-time sync via SSE

  • Migrated from HTTP polling to Server-Sent Events (SSE) for real-time translation sync
  • Added dedicated SSE micro-server support (Node.js) for scalable hosting
  • Device Flow login now uses SSE for instant auth notification
  • Sync state (upload/download/merge detection) delivered in real-time
  • Merge completion notified instantly via SSE

UI improvements

  • Runtime translation toggle with original text tracking
  • Unified Apply system for all options tabs
  • Per-font scale option with debug logging
  • New SearchableDropdown component (replaces LanguageSelector across all panels)
  • Custom SDF font loading system (msdf-atlas-gen JSON+PNG)
  • Fixed duplicate fonts in UI by deduplicating by name