Я хорошо помню день, когда впервые столкнулся с локализацией программного обеспечения. Это была задача на перевод интерфейсов для какого-то промышленного оборудования в сложной программе для локализации ПО. С тематикой промышленного оборудования у меня проблем не было, а вот с текстами интерфейсов я столкнулся впервые.

container.png

Самым удивительным был совсем не стиль текстов — к тому времени я уже пользовался компьютером на продвинутом уровне и представлял себе, на каком языке машины разговаривают с пользователями (правда, с тех пор чат-боты и разговорные интерфейсы изменили мое представление). Больше всего меня озадачили кусочки типа {0}, %d, %setup% или $stop$ — я понятия не имел, что они значат, и нужно ли переводить текст внутри символов. В общем, в том проекте я наделал много ошибок. Завершающим ударом по моей уверенности в себе стали переносы строк \n, такое обозначение я видел впервые. Они то и дело сливались с текстом, вгоняя меня в ступор, ведь исходный текст был на немецком: \nein— это “nein” или “\n + ein”, недоумевал я. Менеджер проектов наверняка пожалел, что дал такую задачу новичку, получив от меня шквал вопросов. А может быть даже написал гневный твит.

Finding out the placeholders in the translated files for an urgent project have magically disappeared. #PMproblems #StartPanicking
(Внезапно из переведенных файлов в срочном проекте испарились все плейсхолдеры #ПроблемыПроджекта #Паника)
— Lau Velázquez (@geekylau) October 9, 2013
Übersetzer, welche den Platzhalter $DepartureTime$ mit $HeureDépart$ übersetzen sind einfach nur konsequent.
(Переводчиков, которые переводят плейсхолдер $Departure Time$ как $Время вылета$, я называю последовательными в работе.)
— Olivier Oswald (@ooswald) July 27, 2011
That moment when a translator decides to change form of quotation marks and half of your variables in-game disappear.
(Тот самый момент, когда переводчик решил поменять форму скобки, и половина твоих переменных в игре исчезла.)
— Vojtěch Schubert (@falagor) January 12, 2016

С тех пор прошло несколько лет. Я вспоминаю тот первый опыт с улыбкой и всегда терпеливо объясняю переводчикам, как работают переменные в интерфейсах программ. Кроме того, есть прекрасный способ предотвратить ошибки и сэкономить время и переводчикам, и себе — с помощью регулярных выражений превратить эти переменные в объекты, которые нельзя будет отредактировать и наличие которых можно отслеживать автоматически. В разных программах эти объекты называются по-разному, в Smartcat мы называем их «плейсхолдерами». А «регулярные выражения» — это вовсе не те фразы, которые вы каждое утро говорите баристе, заказывая чашечку кофе по пути на работу. Так называется формальный язык, состоящий из метасимволов, с помощью которого можно производить манипуляции с текстом. Если вы слышите об этом впервые, не пугайтесь — программировать не придется.

Таинственные знаки

Вот простой пример. Возьмем несколько строчек из песни I’m Gonna Be (500 miles) группы The Proclaimers:

But I would walk 500 miles And I would walk 500 more Just to be the man who walked a thousand miles To fall down at your door

Допустим, мы хотим, чтобы этот текст менялся в зависимости от местоположения слушателя. Для этого используем переменные:

But I would walk %$1s miles And I would walk %$2s more Just to be the man who walked a {spelled-number} miles To fall down at your {location}

Какие неприятности нас здесь ждут? Неопытный переводчик может случайно удалить нужный символ или использовать неверный, например не тот вид скобок. Числа в переменной %$1s должны меняться, а {spelled-number} и {location} не нужно переводить — об этом знает, увы, не каждый.

«Но зачем же работать с новичками, если можно нанять опытного переводчика?», спросит читатель. Причины бывают разными, но главное помнить: никто не рождается с опытом локализации приложений. У всех когда-то был первый проект, а набитые шишки — это и есть тот ценный опыт, который дороже денег.

Защита от новичка, или Как спасти мир

Итак, попробуем не дать переводчику ошибиться и сэкономить свое время. Для этого опишем переменные с помощью регулярных выражений:

  • Для числовых переменных (внутри может быть любая цифра): %\$\ds
  • Для переменных в фигурных скобках: \{.+?\}

Составляя регулярные выражения, я часто пользуюсь удобной шпаргалкой, а правильность составленного выражения проверяю на сайте regex101.com. Загрузим файл с переменными в Smartcat и получим такой результат:

screenshot11.png

Переменные превратились в фиолетовые объекты, их очевидно не нужно переводить и можно простым сочетанием клавиш в целости и сохранности перенести из исходного текста в перевод. Когда мы скачаем переведенный документ, обозначенные таким образом фрагменты останутся в нем нетронутыми. Плейсхолдеры используются не только в локализации. Представьте себе, что вы переводите большую техническую спецификацию, скажем, насосов. Документация изобилует похожими с виду артикулами, и перепутать их очень легко.

screenshot2.png

У такой ошибки могут быть серьезные последствия: на складе неправильно соберут заказ или при сборке насоса возникнут проблемы. Для заказчика это грозит убытками или того хуже: из-за неточно переведенных данных могут возникнуть неполадки в работе систем, что, в свою очередь, приведет к экологической катастрофе. Плейсхолдеры не нужно переводить, их достаточно в точности перенести в перевод, так зачем тратить на них время? Найдем все артикулы с помощью регулярного выражения [A-Z]{2}\d{4}\-\d{4} и превратим их в нередактируемые элементы:

screenshot3.png

Переводить (и проверять перевод) сразу станет намного легче, и процесс пойдет быстрее.

Пока в Smartcat разметка плейсхолдеров для нелокализационных форматов работает в тестовом режиме и включается по запросу для любого формата. Напишите нам, если хотите попробовать.

Я решил поинтересоваться у коллег из других компаний, используют ли они плейсхолдеры в своей работе.

fedor_bezrukov.png
Федор Безруков, руководитель киевского офиса Logrus IT
«В нашей работе достаточно часто возникает потребность использовать плейсхолдеры и тэги в необычных форматах. Например, клиент может выдать экселевский файл, в котором будут строки с HTML- или XML-разметкой. Благодаря плейсхолдерам и поддержке регулярных выражений в Smartcat работать с такими ресурсами стало значительно проще и удобнее».

logrusit.png
Максим Левушкин, менеджер проектов игровой локализации Logrus IT
«Во-первых, если скрыть плейсхолдерами служебный текст, то переводимый текст воспринимается значительно лучше. Во-вторых, содержимое плейсхолдера не испортишь — не сотрешь какой-нибудь важный символ, из-за которого весь сайт может перестать работать».

marina_ilyinykh.png
Марина Ильиных, менеджер по локализации Bookmate
«Мы активно используем переменные и теги форматирования в текстах наших приложений. Заменяя теги и переменные плейсхолдерами, мы получаем возможность автоматически проверять их целостность. Это значит, что из наших приложений никогда не пропадет цена продукта или дата действия подписки, а все ссылки будут работать».

yulia_zerova.png
Юлия Зерова, специалист по локализации «Доктор Веб»
«Плейсхолдеры избавляют и нас, и переводчиков от множества проблем. Переводчик не переведет название переменной, не пропустит закрывающую скобку и не поставит пробел между числом и знаком процента. Переводимый текст становится заметнее, а непонятные наборы символов не маячат перед глазами. А когда нужно что-то поправить без участия переводчика, с плейсхолдерами это сделать гораздо проще. Особенно в RTL-языках, там плейсхолдеры настоящее спасение».

yannis_evangelou.png
Яннис Евангелу, CEO lexiQA
«С плейсхолдерами, специальными символами и тегами часто случаются недоразумения. Так называемые escape characters — еще один сложный момент для начинающих переводчиков. Мало кто знает, как поступать с такими фрагментами в тексте, в том числе и проект-менеджеры. Эти ошибки приводят к серьезным проблемам. Знакомый переводчик рассказывал, как ему поручили однажды перевести документацию для разработчиков, и в ней был пример HTML-форматирования. Так вот, вместе с остальным текстом он перевел на греческий строчку: <p style="border: 1px solid red;"></p>. Получилось так: <π στυλ="περίγραμμα: 1 πίξελ συμπαγές κόκκινο;"></π>. Свое решение он аргументировал тем, что «не все верстальщики хорошо знают английский». Самое интересное, что проект-менеджер согласилась с таким доводом и приняла работу!»

Похоже, плейсхолдеры — удобная штука. Они защищают заказчика перевода от ошибок, которые могут допустить переводчики. Но не всё так просто.

rolf_klischewsky.png

Напоследок Рольф Клишевски, эксперт в области перевода игр, рассказал мне о трудностях, с которыми сталкиваются переводчики, и привел любопытный пример.

«Переводчикам игр часто приходится иметь дело с текстами, которые выглядят так:

rolf1.jpg

А в игре вы увидите что-то вроде:

rolf2.jpg

Однако без сложностей в нашем деле обходится редко.

rolf4.jpg

Тут проблема в артиклях. На английском “the Bahamas” пишутся с артиклем, тогда как “Barbados” — без. А по-немецки «Швейцария» будет “Die Schweiz”. Зачастую приходится отказываться от таких проектов. Я не готов вкладывать силы в заведомо плохой результат, поэтому обычно советую клиенту внести изменения в текстовый движок игры. Когда разработчики интересуются, действительно ли это такая большая проблема, я отвечаю, что, на самом деле, это не помешает играть в игру. Так что же делать? Объяснить клиенту ситуацию. Если он не готов переделать движок, а вам нужны деньги, соглашайтесь с условием, что ваше имя нигде не будет указано.»