{{indexmenu_n>50}} ====== Многоязычная игра (переводы) ====== Одна игра, одна статистика, одни коды — а текст каждый игрок читает на своём языке. Переводы лежат **рядом** с игрой и подменяют текст при показе; там, где перевода нет, игрок видит оригинал. Игроку, у которого язык совпадает с языком игры, ничего не подменяется вообще. Это рекомендуемый способ для перевода текста, ссылок и картинок. Старый приём с шаблоном ''{% match lang %}'' ([[authors_main:task_editor:advanced:edit_templates#как_сделать_многоязычную_игру|Шаблоны]]) продолжает работать и остаётся правильным выбором там, где языку нужна не другая версия того же текста (это как раз переводится), а другая структура: свой набор html-блоков, которого нет у других языков, своя логика в скрипте задания, а не просто другая строка в нём, или ветвление по языку, скомбинированное с другим шаблоном - по коду, по команде, по бонусу. А для перевода текста игры новые игры лучше делать переводами: текст задания не превращается в простыню из N копий, правка вёрстки не размножается по языкам, а редактор показывает, что ещё не переведено. ===== Включение ===== В [[authors_main:task_editor:editor|редакторе игры]], вкладка **"Настройки игры"**, блок **"Локализация"**: {{ :authors_main:game_management:localization_block.png?800 |Блок «Локализация»: язык игры, языки перевода и на что падает непереведённое}} * **Язык игры** — язык, на котором игра написана. Пока он не выбран, никакой локализации у игры нет: ничего не считается, ничего не хранится, редактор выглядит как обычно. * **Языки перевода** — галочки языков, на которые игра переводится. Рядом с каждым — **"падает на"**: на какой язык показывать то, что на этом языке ещё не переведено. Пусто — сразу на язык игры. * Строка **"остальные языки"** — куда отправлять игрока, языка которого у игры нет вовсе. Пример: игра написана по-русски, переведена на украинский и английский, а польский падает на украинский (он ближе, чем русский). Игрок-поляк увидит польский текст там, где он есть, украинский — там, где польского ещё нет, и русский — там, где нет и украинского. Как только появился хотя бы один язык перевода, в редакторе появляется вкладка **"Перевод"**. ===== Вкладка "Перевод" ===== Это таблица пар «оригинал → перевод». Слева строка из игры, справа поле для перевода. Открывается она на непереведённых строках — на том, что осталось сделать. {{ :authors_main:game_management:localization_todo.png?800 |Вкладка «Перевод»: по умолчанию показаны непереведённые строки}} * **Строки собираются автоматически.** Большой текст (задание, подсказка, афиша, финишный текст) режется на абзацы; короткие поля (название игры, название задания, название кода, описание подсказки, формат ответа) идут целиком. Размечать в тексте ничего не надо. * **Раскладка** — переключатель справа над таблицей. **«По полям»** (по умолчанию) ставит строки под заголовком их поля — «Задание 7 → Текст задания» — и в том порядке, в каком они идут в тексте: так абзац переводят, видя соседние.\\ {{ :authors_main:game_management:localization_fields.png?800 |Раскладка «По полям»: строки стоят под заголовком своего поля}} **«Списком»** даёт сплошной список, где адрес написан у каждой строки; так удобнее с короткими полями — у названия кода поле это одна строка, и заголовков выходит больше, чем работы.\\ {{ :authors_main:game_management:localization_flat.png?800 |Раскладка «Списком»: сплошной список, адрес написан у каждой строки}} * **Одинаковый текст переводится один раз на всю игру.** Если строка встречается в нескольких местах, рядом с ней стоит **"мест: N"** — наведите мышь, чтобы увидеть где. Правка такой строки меняет её везде. По полям такая строка нарисована в каждом своём поле и помечена **"общая строка, мест: N"**: это не дубль, а одна и та же запись словаря. * **Состояние строки** видно значком: свой перевод, //из языка X// (пришло по цепочке), //база// (перевода нет) или //не переводится//. * **Полнота** показывается двумя числами: сколько переведено на этот язык и сколько получится с учётом цепочки. Второе число само по себе обманчиво — оно прячет непереведённое за чужим языком. * **Группы строк** — «непереведённые», «переведённые», «непереводимые». Это не выбор одного из трёх, а переключатели: они складываются. По умолчанию включены только непереведённые — это и есть работа; переведённые включают, когда идут вычитывать готовое, непереводимые — когда надо снять пометку. * **Фильтр** — строка под группами. Отбирает по **оригиналу**, регулярным выражением, и работает **вместе** с группами, а не вместо них: «непереведённые» и подошедшие под фильтр. Применяется по Enter или кнопке «Фильтр», числа на кнопках групп при этом показывают уже отобранное, а рядом с полем стоит **«показано: N / M»** — сколько строк осталось после фильтра **и** групп. ==== Фильтры и массовая пометка ==== Стрелка у поля открывает **готовые фильтры**: * **«нет кириллицы»** и **«нет латиницы»** — считаются по тексту без чипсов и подстановок, поэтому ''!username!'' и ''%offline%'' латиницей не считаются; * **«нет слов»** — буква есть, а слова нет: координаты вида ''N 49.5905177 34.5434377'', схемы, «2+ шт». Выбранное из списка встаёт в то же поле, так что всегда видно, чем отобрано; готовый фильтр можно и поправить — как только тронули текст, он становится обычным регэкспом. Свой фильтр можно **сохранить** («сохранить фильтр» рядом с полем) — он попадёт в тот же список, во вторую его половину, и убирается оттуда кнопкой «забыть фильтр». Сохранённые фильтры личные и общие на все игры: это инструмент того, кто разбирает словарь, а не свойство игры. Ради этого фильтр и нужен: справа от него — список **«со всеми показанными...»**. В нём те же три пункта, что в конце каждой строки таблицы («переводим», «не переводить в этом языке», «не переводить нигде»), только применяются они разом ко всему, что сейчас показано — то есть к фильтру вместе с группами. Спрашивается с числом в обе стороны: снятие пачкой опаснее пометки — оно возвращает в работу то, что исключили осознанно. Вся пачка — один шаг отмены, и каждая строка видна в окне сохранения. Типичный сценарий: фильтр «нет кириллицы» → в списке остались бренды, имена и ссылки → пометить их разом → счётчик полноты перестал упираться в то, что переводить никто не собирался. ==== Разметка внутри строки ==== Жирный, ссылки, картинки и шаблоны внутри абзаца в переводе не пишутся руками: на их месте стоят **чипсы** — маленькие рамки с номером. {{ :authors_main:game_management:localization_row.png?800 |Разметка внутри строки: жирный, ссылки и шаблоны стоят чипсами}} Кликните по чипсу — он встанет в перевод там, где стоит курсор. {{ :authors_main:game_management:localization_chips.gif |Клик по чипсу ставит маркер разметки в перевод}} Чипсы можно переставлять (порядок слов в языках разный), но каждый должен быть в переводе ровно один раз — иначе перевод не сохранится и редактор скажет об этом. Так же ведут себя **подстановки** — ''!username!'', ''!task_n!'' и прочие: они остаются в переводе как есть, просто в нужном месте фразы. Полезное следствие: сами теги, адреса ссылок и классы живут только в оригинале. Поправили ссылку в задании — она поменялась во всех языках сразу. ==== Что не переводится ==== * **Коды-ответы не переводятся никогда.** Это и делает статистику общей. Ответы на разных языках просто дописываются синонимами через запятую в том же коде. * **Не переводить эту строку** — переключатель в конце строки таблицы, два режима: «не переводить в этом языке» и «не переводить нигде». Для брендов, имён собственных, латинских цитат. Такие строки уходят из «непереведённых» и не мешают счётчику полноты дойти до 100%. * **''translate="no"''** в HTML задания — более сильный способ: такой кусок не станет строкой вовсе, и его не тронет даже автоперевод браузера. Для кодовых слов и ответов внутри текста это важнее, чем кажется: автоматически переведённое кодовое слово ломает игру. ==== Ссылки и файлы ==== Адреса картинок, звуков, видео и ссылок по умолчанию **не** переводятся — почти все они языконезависимы. Но перевод адреса можно завести: так игрок уходит на страницу своего языка или получает озвучку на своём языке, а абзац и вёрстка остаются одни на всех. Адрес стоит в таблице **там, где он стоит в тексте**, обычной строкой: ссылка внутри абзаца — под самим абзацем, с отступом; картинка, стоящая в поле одна, — строкой сама по себе. Переводите абзац — видите и его ссылку, отдельно её искать не надо. Во всём остальном это такая же строка, как текстовая: те же группы («непереведённые» и прочие), тот же переключатель «не переводить». Отличие одно — в счёт полноты адреса не идут. Субтитры оверлеем делать не надо — HTML это уже умеет: несколько '''' в одном ''