Show localized text tooltips supporting key rebinding & dynamic variablesTextMeshPro is required in the project for this system to function properly.Tooltip Localization System Mini for Unity projects using TextMeshPro is based on a CSV + ScriptableObject setup. Reads a CSV file, returns the rows, switches fonts, and caches everything for optimization. Made for solo devs and indie teams who want to keep text strings out of scripts and manage translations through external editors. 📄 Full documentation (eng) (укр)The full original version of the system is used in Automatic Tutorial Maker →FEATURES:CSV-based translations. Edit in Excel, Google Sheets, or any CSV editor. Default: ; delimiter, UTF-8, " text qualifier.12+ languages included & saving language between sessions. English, Chinese, Japanese, German, French, Spanish, Portuguese, Italian, Ukrainian, Polish, Turkish, Korean. Add custom via Language enum or column name.Automatic font switching. Assign fonts per language (e.g., NotoSansTC for Chinese), auto-applies on change. Includes Noto Sans CJK + Audex fonts with licenses.Dynamic placeholders. Insert variables: {playerName}, {score}, {anyVariable} → filled at runtime. There is a Parameter Selector for assigning a reference to any custom variable of any custom component.TextMeshPro tags support. Use , , emojis 😊 directly in translations.Static Mode. Cache text objects, auto-update on language change, including font switching (efficient for menus/UI)Dynamic Mode. Read strings per-frame, no built-in font switching (for scores/timers, cached lookups)CREATE TEXT TOOLTIPS:The system can be used to show text tooltips that support value substitution. For example, add the entry "Press {key} to interact" to the table, along with its translations. Then call ReplacePlaceholders in your script, specifying the row containing the text and passing the variable for substitution. The variable can be a system-defined key or one reassigned by the player.During translation, the system replaces the {key} placeholder with the variable. In different languages, placeholders may appear in different positions to preserve natural phrasing. Multiple placeholders can exist in a sentence, but their order must be maintained.DEMO:Open DemoScene to see all features in action.STRUCTURE:🗒 A CSV table with translations. The first row contains language names, each language has its own column. Retrieve specific text by accessing rows.🔗 A Scriptable Object. It stores the CSV as a Text Asset and handles operations: parses it into an array and contains methods for further reading. This can be called from other scripts, for example:InitializeLocalizator(); // Parses CSV, remembers current language on start, let's say "Eng"GetStringText(2); // Returns string from row 2 and current language column = "menu"FillTextObject(2, textObj); // Passes to textObj.text = "menu"; caches textObj and rowChangeLanguage("Jap"); // Overwrites current languageTranslateAllTexts(); // Replaces text for all cached objects (same row, different column). Having text objects in cache allows changing their font right there, for example, if hieroglyphs are neededUSAGE:Fill the CSV table with your texts and translationsOn Start() > add InitializeLocalizator callBind ChangeLanguage method to buttons that switch languageWhen spawning text > call FillTextObject for it, so it translates itself and changes font automaticallyIf you just need the value > call GetStringText💡Maintain a column in the table with text keys to access rows by them rather than by indices:using LocalizationSystemMini;[SerializeField] private InputStringsScriptableObject textStrings;var hi = textStrings.GetStringTextByKey("hi_key");var userName = "..."; // Player nametextObj.text = $"{hi}, {userName}!";// If needed, update the font manuallytextObj.font = textStrings.GetCurrentFont();This way the code will have access to localized text and output it to the scene.➕ To add a language and edit translations, just open the CSV. You can translate an entire column by running it through a translator. Or work with localizers who don't have access to/affinity for the inspector.Developed using Unity 6The core system is lightweight, while font samples with licenses occupy 99.7% of packageTextMeshPro is required in the project for this system to function properlyP.S. There’s already a solution based on CSV: Localization Package from Unity, which includes most of the possible features. This system shows a simpler version for indie projects, with some unique advantages. For instance, it can cache a pair of TMP_Text and its string, so that when a translation is updated, all pairs are refreshed automatically, including the font. It supports languages with any name (you can add a column like “Elvish” and reference it by “Elvish”). And it uses only one ScriptableObject as a "middleman", accessible from anywhere, so you don’t need to deal with a bunch of components.




