Fuente
Devlog без QA | Розробка ігор | Локалізація через CSV Всім привіт. Всі ж пам'ятають ось цей от асет? Я...
436 Vistas/Alcance
2025-12-16 17:15
Mensaje №449
📱 Локалізація через CSV Всім привіт. Всі ж пам'ятають ось цей от асет? Якщо ні — раджу зазирнути, штука справді зручна 👀Ті, хто вже бачив, напевно пам’ятають обговорення про тексти підказок, які можна експортувати в CSV-таблицю. Так от, нещодавно розробники прокачали цю ідею й виклали окрему міні-систему локалізації текстів у вільний доступ.Звучить доволі круто, правда? 🔥❓ Про що взагалі мова?Мова йде про просту систему локалізації в Unity на базі CSV, яка підходить насамперед для інді-проєктів. Так, у Unity вже є офіційний Localization Package, який покриває майже всі кейси. Але інколи він здається надто важким або перевантаженим, особливо для невеликих ігор. Тому тут показано лайт-альтернативу з власними плюсами.⚙️ Як це влаштовано під капотом:🔹 CSV-таблиця з перекладамиВсі тексти гри зберігаються в одній CSV:• перший рядок — назви мов;• кожен рядок — один і той самий текст різними мовами.0 | Ukr | Eng | Jap1 | текст | text | 文章2 | меню | settings | 設定3 | ПКМ | RMB | 右クリック4 | гей | hello | こんにちは
🔹 ScriptableObject як “посередник”Вся логіка локалізації зосереджена в одному ScriptableObject, який зберігає CSV як TextAsset, один раз парсить таблицю на старті гри, пам’ятає поточну мову, віддає локалізовані рядки іншим скриптам і кешує текстові обʼєкти для автоматичного оновлення. Також це можна викликати з інших скриптів:InitializeLocalizator(); // На старті сесії один раз парсить CSV, згадує поточну мову, нехай "Ukr"GetStringText(2); // Повертає string з рядку 2 і стовпчику поточної мови = "меню"FillTextObject(2, textObj); // Передає в textObj.text = "меню"; кешує textObj і рядокChangeLanguage("Jap"); // Перезаписує поточну мову|--> TranslateAllTexts(); // Усім кешованим об'єктам замінює текст (той же рядок, інша колонка). //Те, що текстові об'єкти в кеші, дозволяє тут же міняти і їх шрифт, наприклад, якщо потрібні ієрогліфи*
*А тут згадаємо ще один пост: як бути, якщо CJK шрифти не відображаютьсяПоки ви сидите в шоці і думаєте наскільки це геніально, просто і круто - розкажу вам як це інтегрувати у свій проєкт:1. Заповнити таблицю своїми текстами і перекладами2. Де Start() > дописати виклик InitializeLocalizator3. Підв'язати метод ChangeLanguage до кнопок, що міняють мову4. При спавні тексту > викликати для нього FillTextObject, щоб він далі сам перекладався і міняв шрифт5. Якщо потрібно просто брати значення > викликати GetStringTextНадійніше вести стовпець в таблиці з текстовими ключами, щоб звертатись до рядків по ним, а не по індексам:using LocalizationSystemMini;[SerializeField] private InputStringsScriptableObject textStrings;var hi = textStrings.GetStringTextByKey("hi_key");var userName = "..."; // Ім`я гравцяtextObj.text = $"{hi}, {userName}!";// За потреби можна оновити шрифт вручну. Актуальний береться зі списку мова-шрифт, який розробник складає в скриптабл об'єктіtextObj.font = textStrings.GetCurrentFont();
Таким чином код буде мати доступ до локалізованого тексту, і виводити його на сцену.➕ Щоб додати мову й відредагувати переклади, достатньо відкрити CSV. Так можна перекласти цілий стовпець, пропустивши його через перекладач (або наш любимий ШІ). Або працювати з локалізаторами, у яких немає доступу/пристрасті до інспектора)🎁 В джерелі можна завантажити .unitypackage, взяти собі в проект готову структуру таблиці + скриптабла, одразу додати щось в CSV і спробувати викликати в коді. Система вже передбачає збреження мови між сесіями, підтримку шрифтів для різних мов і ще деякі цікаві фічі.Наприклад, переклади з плейсхолдерами {var}, розкиданими по тексту залежно від порядку слів у мові.А що ви думаєте про такого роду підхід? Або якому ви би надали перевагу?✈️ Gamedev | [Забрати] | #корисне #локалізація #переклад #localization