Багатомовна гра (переклади)
Одна гра, одна статистика, одні коди — а текст кожен гравець читає своєю мовою. Переклади лежать поруч із грою і підміняють текст під час показу; там, де перекладу немає, гравець бачить оригінал. Гравцеві, у якого мова збігається з мовою гри, не підміняється нічого взагалі.
Це рекомендований спосіб для перекладу тексту, посилань і картинок. Старий прийом із шаблоном {% match lang %} (Шаблони) продовжує працювати і залишається правильним вибором там, де мові потрібна не інша версія того самого тексту (це якраз перекладається), а інша структура: свій набір html-блоків, якого немає в інших мов, своя логіка у скрипті завдання, а не просто інший рядок у ньому, або розгалуження за мовою, скомбіноване з іншим темплейтом - за кодом, за командою, за бонусом. А для перекладу тексту гри нові ігри краще робити перекладами: текст завдання не перетворюється на простирадло з N копій, правка верстки не розмножується мовами, а редактор показує, що ще не перекладено.
Увімкнення
У редакторі гри, вкладка “Налаштування гри”, блок “Локалізація”:
- Мова гри — мова, якою гру написано. Доки її не вибрано, жодної локалізації в гри немає: нічого не рахується, нічого не зберігається, редактор виглядає як завжди.
- Мови перекладу — галочки мов, на які гру перекладають. Поруч із кожною — “падає на”: якою мовою показувати те, що цією ще не перекладено. Порожньо — одразу мовою гри.
- Рядок “інші мови” — куди відправляти гравця, мови якого в гри немає взагалі.
Приклад: гру написано російською, перекладено українською та англійською, а польська падає на українську (вона ближча за російську). Гравець-поляк побачить польський текст там, де він є, український — там, де польського ще немає, і російський — там, де немає й українського.
Щойно з'явилася хоча б одна мова перекладу, у редакторі з'являється вкладка “Переклад”.
Вкладка "Переклад"
Це таблиця пар «оригінал → переклад». Ліворуч рядок із гри, праворуч поле для перекладу. Відкривається вона на неперекладених рядках — на тому, що лишилося зробити.
- Рядки збираються автоматично. Великий текст (завдання, підказка, афіша, фінішний текст) ріжеться на абзаци; короткі поля (назва гри, назва завдання, назва коду, опис підказки, формат відповіді) йдуть цілком. Розмічати в тексті нічого не треба.
- Розкладка — перемикач праворуч над таблицею. «За полями» (типово) ставить рядки під заголовком їхнього поля — «Завдання 7 → Текст завдання» — і в тому порядку, в якому вони йдуть у тексті: так абзац перекладають, бачачи сусідні.\
«Списком» дає суцільний список, де адреса написана біля кожного рядка; так зручніше з короткими полями — у назви коду поле це один рядок, і заголовків виходить більше, ніж роботи.\ 
- Однаковий текст перекладається один раз на всю гру. Якщо рядок трапляється в кількох місцях, поряд із ним стоїть “місць: N” — наведіть мишу, щоб побачити де. Правка такого рядка змінює його всюди. За полями такий рядок намальовано в кожному своєму полі й позначено “спільний рядок, місць: N”: це не дубль, а той самий запис словника.
- Стан рядка видно значком: свій переклад, з мови X (прийшло ланцюжком), база (перекладу немає) або не перекладається.
- Повнота показується двома числами: скільки перекладено цією мовою і скільки вийде з урахуванням ланцюжка. Друге число саме по собі оманливе — воно ховає неперекладене за чужою мовою.
- Групи рядків — «неперекладені», «перекладені», «неперекладні». Це не вибір одного з трьох, а перемикачі: вони складаються. Типово ввімкнені лише неперекладені — це і є робота; перекладені вмикають, коли йдуть вичитувати готове, неперекладні — коли треба зняти позначку.
- Фільтр — рядок під групами. Відбирає за оригіналом, регулярним виразом, і працює разом із групами, а не замість них: «неперекладені» і ті, що підійшли під фільтр. Застосовується по Enter або кнопкою «Фільтр», числа на кнопках груп при цьому показують уже відібране, а поруч із полем стоїть «показано: N / M» — скільки рядків лишилося після фільтра і груп.
Фільтри і масова позначка
Стрілка біля поля відкриває готові фільтри:
- «немає кирилиці» та «немає латиниці» — рахуються за текстом без чипсів і підстановок, тому
!username!і%offline%латиницею не вважаються; - «немає слів» — літера є, а слова немає: координати на кшталт
N 49.5905177 34.5434377, схеми, «2+ шт».
Вибране зі списку стає в те саме поле, тож завжди видно, чим відібрано; готовий фільтр можна й виправити — щойно торкнулися тексту, він стає звичайним регекспом. Свій фільтр можна зберегти («зберегти фільтр» поруч із полем) — він потрапить до другої половини того самого списку, а прибирається звідти кнопкою «забути фільтр». Збережені фільтри особисті й спільні на всі ігри: це інструмент того, хто розбирає словник, а не властивість гри.
Заради цього фільтр і потрібен: праворуч від нього — список «з усім показаним…». У ньому ті самі три пункти, що наприкінці кожного рядка таблиці («перекладаємо», «не перекладати цією мовою», «не перекладати ніде»), тільки застосовуються вони разом до всього, що зараз показано, — тобто до фільтра разом із групами. Питається з числом в обидва боки: зняття пачкою небезпечніше за позначку — воно повертає в роботу те, що виключили свідомо. Уся пачка — один крок скасування, і кожен рядок видно у вікні збереження.
Типовий сценарій: фільтр «немає кирилиці» → у списку лишилися бренди, імена й посилання → позначити їх разом → лічильник повноти перестав упиратися в те, що перекладати ніхто не збирався.
Розмітка всередині рядка
Жирний, посилання, картинки та шаблони всередині абзацу в перекладі не пишуться руками: на їхньому місці стоять чипси — маленькі рамки з номером.
Клацніть по чипсу — він стане в переклад там, де стоїть курсор.
Чипси можна переставляти (порядок слів у мовах різний), але кожен має бути в перекладі рівно один раз — інакше переклад не збережеться і редактор про це скаже.
Так само поводяться підстановки — !username!, !task_n! та інші: вони лишаються в перекладі як є, просто в потрібному місці фрази.
Корисний наслідок: самі теги, адреси посилань і класи живуть лише в оригіналі. Виправили посилання в завданні — воно змінилося в усіх мовах одразу.
Що не перекладається
- Коди-відповіді не перекладаються ніколи. Це й робить статистику спільною. Відповіді різними мовами просто дописуються синонімами через кому в тому самому коді.
- Не перекладати цей рядок — перемикач у кінці рядка таблиці, два режими: «не перекладати цією мовою» і «не перекладати ніде». Для брендів, власних назв, латинських цитат. Такі рядки йдуть із «неперекладених» і не заважають лічильнику повноти дійти до 100%.
translate=“no”у HTML завдання — сильніший спосіб: такий шматок не стане рядком узагалі, і його не зачепить навіть автопереклад браузера. Для кодових слів і відповідей усередині тексту це важливіше, ніж здається: автоматично перекладене кодове слово ламає гру.
Посилання та файли
Адреси картинок, звуків, відео та посилань за замовчуванням не перекладаються — майже всі вони мовно-незалежні. Але переклад адреси завести можна: так гравець потрапляє на сторінку своєю мовою або отримує озвучення своєю мовою, а абзац і верстка лишаються одні на всіх.
Адреса стоїть у таблиці там, де вона стоїть у тексті, звичайним рядком: посилання всередині абзацу — під самим абзацом, з відступом; картинка, що стоїть у полі сама, — рядком сама по собі. Перекладаєте абзац — бачите і його посилання, окремо шукати не треба.
У всьому іншому це такий самий рядок, як текстовий: ті самі групи («неперекладені» та решта), той самий перемикач «не перекладати». Відмінність одна — у рахунок повноти адреси не йдуть.
Субтитри оверлеєм робити не треба — HTML це вже вміє: кілька <track srclang=“…”> в одному <video>, браузер вибере сам.
Застарілі переклади
Ідентичність рядка — його текст. Виправили оригінал — переклад до нього більше не підходить, рядок знову стає неперекладеним, а старий переклад їде в розділ “Застарілі переклади”. Якщо правка була дрібною (одрук), редактор сам запропонує його повернути кнопкою “відновити” просто під новим рядком. Непотрібні можна видалити — по одному або всі разом.
Переклади з іншої гри
Унизу вкладки: “Завантажити переклади з гри” — номер гри та кнопка. Візьмуться лише ті пари, чий оригінал є і в цій грі; звіт скаже, скільки збіглося і скільки пропущено. Наявні переклади за замовчуванням не перезаписуються. Має сенс для серії ігор одного автора з однією мовою оригіналу: у гри іншою мовою збігів не буде.
Переклад файлом
Поруч із вибором мови — дві кнопки. «Завантажити рядки на переклад» віддає файл game_<id>_<lang>.json із рядками цієї мови: неперекладені — порожніми, уже перекладені — заповненими, щоб у перекладача був глосарій і контекст. Позначені «не перекладати» та адреси посилань і файлів у нього не йдуть. «Завантажити переклади з файлу» приймає його назад — пари лягають у чернетку, поруч з'являється звіт «Завантажено: N, пропущено: M». Порожній переклад у файлі нічого не стирає: наполовину заповнений файл — це «переклали поки стільки».
Якщо ввімкнено фільтр або показані не всі групи, поруч з'являється друга кнопка — «лише показані (N)»: вона віддає той самий файл, але з відібраних рядків. Живий сценарій — «доїхало пів сотні нових рядків» або «віддати перекладачеві завдання 7». Число на кнопці каже, скільки саме поїде, а повний файл лишається в один клік поруч.
Так перекладають поза редактором: у CAT-програмі, у живого перекладача або чат-ботом — Переклад гри за допомогою AI.
Як це зберігається
Переклади — частина чернетки редактора, нарівні з текстом. Перекладати можна й незбережене завдання: написали завдання, тут же переклали, зберегли однією кнопкою. Правка оригіналу та полагоджені переклади їдуть на сервер однією операцією, тож моменту, коли гравці бачать новий текст зі старим перекладом, не виникає.
Переклади їдуть разом із грою в її JSON — секцією translations — і повертаються під час імпорту. Копія гри отримує й переклади; копіювання одного завдання в іншу гру переклади не переносить (словник спільний на гру, чужі рядки там були б сміттям) — для цього є «Завантажити переклади з гри».
Перевірка
Відкрийте гру з явною мовою: https://qeng.org/game/1234/?lang=uk. Перевірте й мову, якої в гри немає, — так видно, чи працює рядок «інші мови».
Той самий рівень мовою гри та українською: підмінився текст, а верстка, картинки й коди лишилися одні на всіх.
Чого переклади поки не стосуються
- назви платних товарів;
gt(…)всередині тега<script>, вставленого прямо в текст завдання, підказки чи бонуса, - рушій його перекладає, а вкладка «Переклад» такий рядок поки не пропонує. Окреме поле «Скрипт завдання» це обмеження не стосується - воно перекладається цілком.
Для них поки працює попередній спосіб — {% match lang %}.
Дивіться також
- Переклад домену — шапка, меню, підвал і сторінки домену перекладаються так само і тією самою таблицею.






