Skip to content

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.

[1.3.0] - 2026-04-21

Added

  • Translation API (Pro): Local HTTP server for LLM and external tool integration. Exposes REST endpoints for StringTable CRUD operations at http://127.0.0.1:{port}/api/v1/. Start via Tools > KitStack > Lexis > Translation API. Ships an OpenAPI schema for tool definitions at /api/v1/openapi.json
  • Editor Auto-Initialization: Added LexisEditorBootstrap with [InitializeOnLoad] to automatically initialize Lexis in editor mode and re-initialize after play mode exit
  • Lazy Auto-Initialization: LocalizationService.Get() and related methods now attempt auto-initialization on first access when LocalizationSettings exists, eliminating [MISSING] prefixes before explicit Initialize() calls
  • FontFallback.Reset(): New method to restore all locale-to-category mappings to defaults, clearing custom mappings added via RegisterLocaleCategory
  • LLM Discovery: Ships AGENTS.md and CLAUDE.md in-package so AI coding tools automatically discover the Lexis API

Changed

  • Unified Assembly Names: Pro edition now uses the same assembly names as Free (Lexis.Core, Lexis.Core.Editor) instead of the previous Lexis.Pro / Lexis.Pro.Editor. This enables seamless Free ↔ Pro switching without breaking assembly references. Migration: If upgrading from a previous Pro version, update any asmdef references from Lexis.Pro to Lexis.Core and from Lexis.Pro.Editor to Lexis.Core.Editor
  • Editor Menu Reorganization: Decluttered the Tools > KitStack > Lexis menu. Setup, Refresh Assembly References, and Migrate Asset GUIDs moved to Advanced > submenu. Translation Window renamed to Auto-Translate. Duplicate Validation menu items consolidated
  • 3-Way GUID Migration: Automatic asset migration now handles upgrades from any previous version or edition (published Pro, source Pro, Free DLL). All StringTable and AssetTable data preserved automatically

Fixed

  • UXML Namespace: Corrected sample UXML and doc comments from lingua: prefix to lexis: with correct Lexis.UIToolkit namespace
  • Unused Key Detector Path: Fixed UnusedKeyDetector checking for obsolete package name com.lingua.core instead of com.kitstack.lexis
  • Test Cleanup: ImporterTests now cleans up the TestAssets directory after test runs, preventing empty folder artifacts

1.2.0 - 2026-04-21

Added

  • Automatic Service Initialization: Localization system now auto-initializes before scene load via RuntimeInitializeOnLoadMethod, eliminating the need for manual Initialize() calls in most cases
  • Lazy Auto-Initialization on Access: LocalizationService.Get and Has methods now attempt automatic initialization when called before explicit setup, picking up newly-created LocalizationSettings on subsequent calls
  • KitStack Editor Core Integration: All editor windows now use KitStackEditorColors and KitStackIcons for consistent theming across KitStack tools (Auto-Translate, Language Switcher, String Table Browser, Overwrite Consent Dialog, all property drawers)
  • Comment Field in Entry Editor: Editable comment field now displays inline when editing a String Table entry

Changed

  • Entry Creation Validation: String Table Browser now requires a default locale to be configured before allowing new entry creation, showing a warning if missing
  • Import Asset Marking: CSV, Google Sheets, JSON, and PO importers now explicitly call EditorUtility.SetDirty() on both the imported table and settings asset after import, preventing data loss

Fixed

  • Build Compilation Errors: Moved SetDirty() calls inside #if UNITY_EDITOR guards in AssetTable, LocalizationSettings, and StringTable public setter methods, preventing "UnityEditor.dll referenced by user code" errors in runtime builds
  • Unused Key Detector Path: Fixed UnusedKeyDetector checking for obsolete package name com.lingua.core instead of com.kitstack.lexis when skipping internal code
  • UI Toolkit Namespace: Corrected UXML example code in LocalizedImage, LocalizedLabel, and RtlContainer to use the correct lexis: namespace prefix instead of lingua:

1.1.3 - 2026-04-08

Fixed

  • Fixed ZString compilation errors (CS1503) when com.cysharp.zstring is installed: Utf16ValueStringBuilder.AppendFormat does not support IFormatProvider, so culture-aware formatting paths now correctly fall back to string.Format (Lexis PRO only; Lexis FREE was unaffected as its DLL excludes ZString code paths)

1.1.2 - 2026-04-04

Fixed

  • Fixed Android/iOS/WebGL build failure: "UnityEditor.dll assembly is referenced by user code" caused by editor API references baked into pre-compiled runtime DLLs (Lexis Free only)
  • Critical: Fixed StringTable and AssetTable data loss on package update or Free-to-Pro upgrade. Assets no longer show "missing script" after updating. All existing entries and translations are preserved automatically via GUID migration
  • Fixed Free edition assembly name mismatch (Lexis.RuntimeLexis.Core) that prevented type resolution across editions
  • Fixed Free edition sample assets referencing incorrect script GUIDs (source GUIDs instead of DLL GUIDs)

Added

  • Automatic GUID Migration: Editor script that detects and repairs mismatched script references on import — works for version updates, Free↔Pro switches, and any historical GUID variant. Manual trigger available via KitStack > Lexis > Advanced > Migrate Asset GUIDs
  • JSON Exporter: Export StringTable data to JSON files for backup before updates (Tools > KitStack > Lexis > Export > JSON File). Produces the same format consumed by the JSON Importer for full round-trip compatibility. Supports single table or all tables, with optional comments and default values

1.1.1 - 2026-03-31

Fixed

  • String Table Browser: locale dropdown no longer resets to the default language on window resize or refocus (affected both String Tables and Asset Tables)
  • String Table Browser: single-table view now sorts entries A-Z consistently (previously used unsorted serialization order)
  • String Table Browser: in-progress translation edits are no longer lost when pressing CTRL+S (pending edits are now auto-committed before asset save)

Added

  • String Table Browser: clickable Key column header to toggle sort direction (A-Z / Z-A) for both String Tables and Asset Tables

1.1.0 - 2026-03-29

Added

  • Template Caching: Pre-parsed template segments cached for repeat calls, eliminating regex overhead after first parse
  • Escaped Characters: Support for \|, \=, and \\ in format specs for literal pipe, equals, and backslash
  • Select Formatter: {0:select:key=text|other=fallback} with exact match, numeric range match (1-10=Low), and other fallback
  • Ordinal Plurals: {0:ordinal:one=#st|two=#nd|few=#rd|other=#th} with CLDR ordinal rules for English, French, Italian, and all other supported locales
  • List Formatter: {0:list:, |, and } joins IEnumerable values with configurable separators
  • Custom Formatter Hook (Pro): ISmartFormatter interface and RegisterFormatter()/UnregisterFormatter() API for custom format prefixes
  • SmartFormatterConfig (Pro): ScriptableObject for configuring custom formatters in the Inspector, auto-registered on initialization
  • Data-Driven Locale Rules (Pro): PluralRules.RegisterCardinalRule() and RegisterOrdinalRule() for adding plural rules for unsupported locales
  • Smart String Validator (Pro): Editor window (KitStack > Lexis > Validation > Run Validation) for compile-time validation of smart string templates
  • ZString Integration: Zero-allocation evaluation path when LEXIS_ZSTRING is defined
  • TryParse API: SmartStringParser.TryParse() for zero-allocation parsing into Span<char> buffers (requires ZString)
  • ClearCache API: SmartStringParser.ClearCache() for manual cache invalidation
  • Updated LLM translation prompt with select, ordinal, and escape syntax

1.0.1 - 2026-03-26

Fixed

  • Fixed locale switching not updating localized components
  • Improved edit-mode preview for all localized components

Added

  • Configurable fallback assets and missing translation prefix in Settings
  • Quick-create button for Pseudo-Localization Settings

1.0.0 - 2026-01-18

Added

Core Localization System

  • Localization static facade for convenient access to the localization system
  • LocalizationService pure C# implementation with DI support
  • ILocalizationService interface for testing and dependency injection
  • LocalizedString serializable struct for Inspector-friendly localization references
  • Locale class representing language/region with metadata (display name, native name, RTL support)
  • StringTable ScriptableObject for storing translations with O(1) lookup performance
  • LocalizationSettings ScriptableObject for project-wide configuration

Provider System

  • ILocalizationProvider interface for implementing custom data providers
  • JsonProvider for file-based JSON storage with caching and compression support
  • CsvProvider for CSV import/export with configurable delimiter and layout options
  • POProvider for GNU Gettext PO file support with:
    • Standard msgid/msgstr pairs
    • Context support (msgctxt)
    • Plural forms (msgid_plural, msgstr[n])
    • Translator and extracted comments
    • Multiline strings and escape sequences
  • ProviderRegistry for automatic provider discovery and registration
  • LocaleData and TranslationEntry data transfer objects

Smart String System

  • SmartStringParser with support for:
    • Positional arguments ({0}, {1})
    • Named arguments ({player}, {score})
    • Pluralization with CLDR rules ({0:plural:one=# item|other=# items})
    • Gender agreement ({0:male=He|female=She|other=They})
    • Boolean conditionals ({0:true=Yes|false=No})
    • Number formatting ({0:N0}, {0:N2})
    • Currency formatting ({0:C})
    • Date formatting ({0:d}, {0:D})
  • PluralRules implementing CLDR plural categories for 15+ languages
  • Template validation and variable extraction utilities

UI Components

  • LocalizedTMP component for TextMeshPro with automatic locale updates
  • LocalizedText component for legacy Unity UI Text
  • LocalizedImage component for locale-specific sprites
  • LocalizedAudioComponent for localized audio clips with playback control
  • LocalizedTextureComponent for localized textures on RawImage

Asset Localization

  • AssetTable ScriptableObject for localizing non-text assets
  • ILocalizedAsset<T> interface for typed asset references
  • LocalizedTexture and LocalizedAudioClip structs

UI Toolkit Integration

  • LocalizedLabel element with UXML support
  • LocalizedStringConverter for UXML attribute binding

Editor Tools

  • Setup Panel (Lexis > Advanced > Setup)
    • Initial setup wizard
    • Settings validation
    • Package detection status
  • String Table Browser (Lexis > String Table Browser)
    • Inline translation editing
    • Search and filter
    • Add/remove entries
    • Create new string tables
  • Language Switcher (Lexis > Language Switcher)
  • Property drawers for LocalizedString, LocalizedTexture, LocalizedAudioClip
  • CSV, JSON, and PO file importers

Validation

  • MissingTranslationValidator for finding missing translations across locales

Internal Utilities

  • LocaleDetector for system language detection
  • StringFormatter with ZString integration for zero-allocation formatting
  • IServiceFactory and DefaultServiceFactory for DI support

Samples

  • Basic Setup sample with minimal configuration example
  • Smart Strings sample demonstrating pluralization and formatting
  • UI Toolkit sample showing LocalizedLabel in UXML

Documentation

  • Comprehensive README with quick start guide
  • XML documentation for all public APIs with examples
  • This CHANGELOG

Platform Support

  • Unity 2020.3 LTS through Unity 6
  • All build targets (Windows, macOS, Linux, Android, iOS, WebGL, consoles)
  • All render pipelines (Built-in, URP, HDRP)

Dependencies

  • Required: Unity 2023.1+ OR UniTask
  • Optional: TextMeshPro, UI Toolkit, ZString

Professional Unity Development Tools