Исключайте ненужные строки из перевода с помощью regex-фильтров
Отладочные строки, пути к ресурсам и остатки служебного текста могут проскользнуть мимо автоисключения. Regex-фильтры RuneTranslate, настраиваемые для каждого проекта, исключают любую строку, исходный текст которой совпадает с шаблоном — с живым предпросмотром того, что именно они отлавливают — так что вы никогда не потратите перевод на мусор. Бесплатно, на любом тарифе.
Укажите RuneTranslate на игру, и он вытянет все переводимые строки, какие только сможет найти. Большая часть из них — это настоящие диалоги и текст меню, но кое-что оказывается мусором: оставшиеся отладочные строки, имена файлов ресурсов, внутренние флаги и случайные идентификаторы, которые игра никогда не показывает игроку. RuneTranslate уже исключает очевидные случаи для каждого движка и помечает их красными строками с возможностью включения вручную, но каждая игра индивидуальна, и часть мусора специфична именно для того проекта, над которым вы работаете.
Именно для этого нужны regex-фильтры исключения. Вы задаёте RuneTranslate один или несколько шаблонов, и любая строка, исходный текст которой совпадает с шаблоном, убирается из прогона — переводчик её пропускает, а сама она отображается красной строкой с возможностью включения вручную, которую вы всегда можете вернуть обратно. Это тот же механизм, что и встроенные исключения движков, только управляемый вашими собственными правилами и сохраняемый вместе с проектом. И это ничего не стоит: в отличие от глоссария и памяти переводов, regex-исключения бесплатны на любом тарифе.
Зачем вообще исключать строки?
Есть две причины — одна очевидная, а вторая важнее:
- Стоимость и время. Каждая переведённая мусорная строка — это квота провайдера (или лимит бесплатного скрапера), потраченная на текст, который никто никогда не прочитает. В масштабах целой игры это складывается в заметную величину.
- Сохранение работоспособности игры. Вот это по-настоящему важно. Некоторые строки — вовсе не текст: это ключи, пути к файлам или операнды логики, которые движок разрешает по значению. Переведите
bg_office_01илиEV_FLAG_TRUE— и вы можете незаметно сломать переход между сценами или поиск переменной. Их исключение сохраняет стабильность собранной сборки.
Где это найти
Откройте проект, затем на панели инструментов редактора откройте меню ⋯ Ещё и выберите Regex-исключения. Откроется панель Пользовательские фильтры исключения — вы добавляете шаблоны, наблюдаете, что именно они отлавливают, и применяете — всё в одном окне.
Живой предпросмотр — в этом весь смысл
Вы никогда не применяете шаблон вслепую. Пока вы вводите regex, RuneTranslate показывает Совпадений: N из TOTAL строк и выводит несколько реальных строк, которые он отловит, обновляя всё это на каждое нажатие клавиши. Некорректный шаблон мгновенно отмечается с описанием ошибки, так что сохранить сломанный вы не сможете.
Поскольку предпросмотр показывает реальные строки именно вашего проекта, вы подстраиваете шаблон, пока он не начнёт отлавливать ровно мусор и ничего настоящего, а затем применяете его. Одна деталь, которую стоит запомнить: шаблоны сопоставляются с исходным текстом — оригинальным японским или каким угодно вашим исходным языком — а не с переводом. Шаблоны вы пишете под непереведённый текст.
Готовые шаблоны
В панели есть готовые чипы в один клик для шаблонов, которые встречаются почти в каждой японской игре:
- Только ASCII —
^[\x00-\x7F]+$— строка, в которой вообще нет символов исходного языка (оставшийся английский, ромадзи или идентификатор). Обычно её безопасно отбросить, если ваш исходный язык — японский. - Путь к ресурсу —
\.(png|jpe?g|gif|webp|ogg|mp3|wav|webm|mp4)$— всё, что заканчивается расширением медиафайла. - Переменная —
^[a-z_]+\.[a-z_]— точечные ссылки в коде вродеf.pageилиstate.flag. - Токен ЗАГЛАВНЫМИ —
^[A-Z0-9_]+$— константы и флаги, такие какEVENT_FLAG_3. - Числа / символы —
^[\d\s.,:%/+\-]+$— строки только из цифр и маски тайлов вроде11111112222. - Тег в скобках —
^\[.*\]$— целая строка, состоящая только из[tag].
В панели также есть компактная шпаргалка для составления собственных шаблонов: ^ и $ привязывают к началу и концу строки, . — любой символ, * и + означают «ноль или больше» и «один или больше», ? — необязательный элемент, \d — цифра, \w — символ слова, а \s — пробельный символ.
Как писать собственные фильтры
Готовые шаблоны покрывают типовые случаи; для всего, что специфично для конкретной игры, вы пишете собственное регулярное выражение JavaScript. Несколько практических правил:
- Привязывайте к строке целиком. Голое
debugсовпадёт с любой строкой, содержащей это слово, — включая настоящий диалог про отладку.^DEBUG:совпадает только со строками, которые начинаются с этого маркера, а заключение шаблона в^...$сопоставляет строку целиком. Привязка — самый безопасный вариант по умолчанию. - Следите за счётчиком в предпросмотре. Если шаблон вдруг перескочил с 12 мусорных строк на 400, вы почти наверняка зацепили настоящий текст — проверьте примеры и сузьте шаблон.
- Опирайтесь на структуру, а не на слова. Мусор обычно узнаётся по форме — заглавные буквы, точечные пути, расширения файлов на конце, чистые числа — а не по конкретным словам. Структурные шаблоны обобщаются на весь проект.
- Одно правило на одну идею. Несколько небольших и понятных шаблонов проще осмыслить — и позже удалить — чем один гигантский нечитаемый.
Применение и отмена
Нажмите Применить и сохранить. RuneTranslate сохранит шаблоны вместе с проектом и заново классифицирует каждую строку, а затем сообщит, что именно произошло — например, Исключено 340 строк · 5 восстановлено. Число восстановленных — это строки, которые фильтр раньше отлавливал, но больше не отлавливает, возвращённые автоматически.
Всё полностью обратимо: удалите шаблон, примените снова — и его строки вернутся. Фильтры распоряжаются только своими собственными исключениями — они никогда не переопределяют автоисключение движка — и вы всё так же можете вручную вернуть любую отдельную строку переключателем в её ряду, если фильтр оказался чуть слишком широким.
Запрос на сброс отфильтрованных переводов
Один случай RuneTranslate берёт на себя: что, если вы отфильтровали строки, которые уже перевели? Исключённая строка экспортирует свой исходный текст, но старый перевод всё ещё к ней привязан. Поэтому сразу после применения, если какие-то только что отфильтрованные строки уже имели перевод, RuneTranslate спрашивает, сбросить ли их в статус «ожидает» — убрав перевод, чтобы при экспорте чисто откатиться к источнику — или оставить их. Обычно нужен именно сброс, ведь вы исключили эти строки как раз потому, что не хотели их переводить.
Как это сочетается со всем остальным
Regex-фильтры — это инструмент «последней мили». Адаптеры движков уже исключают тот структурный мусор, о котором знают для каждого формата, так что в хорошо поддерживаемой игре ИИ никогда не увидит путь к ресурсу. Фильтры нужны для остатков: специфичного для игры маркера, одного странного отладочного канала или строк, которые нишевый движок выдаёт наружу и которые не совсем являются диалогом.
Используйте в редакторе фильтр по статусу Исключённые, чтобы просмотреть всё, что сейчас отложено — исключения движка и ваши regex-исключения вместе — и вернуть в перевод что угодно из этого. И там, где фильтры убирают строки, глоссарий делает обратное: он фиксирует выбранные термины, чтобы они всегда переводились одинаково. Вдвоём они дают вам контроль и над тем, что переводится, и над тем, как.
Пять минут с панелью фильтров в начале проекта — добавьте пару готовых чипов, взгляните на предпросмотр, примените — экономят квоту на каждом последующем прогоне и полностью держат рискованный не-текст подальше от переводчика. Скачайте RuneTranslate, откройте любую игру и загляните в меню ⋯ Ещё в поисках пункта Regex-исключения.
Готовы попробовать RuneTranslate?
Бесплатный тариф открывает все движки и всех провайдеров перевода. Supporter ($3/mo) открывает полную скорость.
Скачать для Windows