Хорошая локализация, то есть адаптация приложения для пользователей из разных стран, позволит ему завоевать сердца своей аудитории. Плохая же, напротив, станет настоящей болью. Например, один из навигаторов в Google Play предлагает «Не обновлять, не вы приобрели коммерческая карта» и пугает, что «На некоторых устройствах вы будете просить, чтобы выбрать папку установки».
Цель локализации не в том, чтобы сделать приложение просто доступным на других языках, но дать каждому пользователю почувствовать, что оно было разработано с учетом особенностей именно его родного языка.
В этой статье мы вкратце расскажем о тех аспектах локализации, которым нужно уделить внимание в первую очередь, и поделимся опытом, который мы накопили при переводе Badoo на 46 языков. Это очень обширная тема, и мы продолжим рассказывать в деталях, как мы реализовали те или иные инструменты. В конце статьи вы можете проголосовать и выбрать тот аспект, о котором вам интересно узнать в первую очередь.
Введение
Поддержка нескольких языковых стандартов — это сложная многоэтапная задача, которая начинается с адаптации кода вашего приложения. Практически любой текст, передаваемый пользователю (если он не является технической составляющей), может потребовать модификации для некоторых языков.
Существует множество решений, позволяющих отделить переводимый текст от непереводимого и организовать систему переводов без фатальных недостатков. Мы не используем готовых решений, мы решили строить и развивать свою собственную систему, самостоятельно наступать на все грабли и изобретать велосипеды. Зато наша система получилась по-настоящему гибкой и подходящей нам во всём. Начнём с терминологии и общих принципов работы.
Ключевой элемент системы переводов — это некие фрагменты текста, достаточно компактные, чтобы ими было удобно оперировать, но при этом достаточно большие, чтобы сохранить логическую целостность. Мы называем такие фрагменты лексемами. Рассмотрим для примера мессенджер Badoo. Это хороший пример: подобных интерфейсов достаточно как в мобильных, так и в веб-приложениях.
Обратите внимание на несколько ключевых моментов, хорошо заметных на этом скриншоте. Существуют различные лексемы:
- те, которые можно использовать неоднократно («Поиск», «Непрочитанные», «Анонимный чат»);
- содержащие переменные («Посмотреть профиль и 16 фото»);
- зависящие от пола («Сделайте первый шаг, напишите ему!»);
- зависящие от числовых параметров и содержащие склонения («Здесь вас увидят 2370 девушек»).
Часто употребляемые лексемы, такие как «Поиск», «Непрочитанные», «Девушка» и т.п. в Badoo отделены от прочих и могут быть использованы повторно в разных подсистемах нашей большой и разносторонней архитектуры, включая единые переводы для мобильных и веб-приложений. Ключевые преимущества такого подхода:
- уменьшение объема работы переводчикам;
- единый стиль текста;
- возможность дополнительной обработки лексем (изменение в зависимости от числа и склонения).
С лексемами, содержащими переменные («Посмотреть профиль и {{number}} фото») всё просто: нужно только не забывать подставлять данные.
С зависимостью от числа и склонениями всё гораздо сложнее («Здесь вас увидят {{number}} девушек»), мы обсудим эту тему в отдельном разделе.
Процесс подготовки и отображения переводов может стать серьёзной головной болью с точки зрения производительности системы, особенно если это приходится делать больше 20 тысяч раз в секунду (пиковая нагрузка в Badoo бывает и выше).
А теперь давайте рассмотрим более детально, чему стоит уделить внимание.
Диалекты и многоступенчатый «фейловер»
У некоторых языков существуют диалекты. Например, английский бывает британским и американским, а испанский бывает колумбийским, аргентинским и мексиканским. И даже если переводы на 99% совпадают, может оказаться, что одна и та же фраза должна звучать на них совершенно по-разному. Если не учесть этот маленький нюанс, может случиться большой конфуз. Например, rapariga по-португальски означает «девушка», но в Бразилии это слово используется в значении «ночная бабочка». Для бразильского диалекта используется слово garota, которое в Португалии неприменимо, поскольку означает «маленькая девочка».
В Badoo мы выстроили языки в виде дерева. Корневой элемент — это «универсальный английский». От него ветвятся остальные языки (включая британский и американский английские), часть из которых, в свою очередь, имеет диалекты.
Переводчики работают сверху вниз: сначала переводится универсальный английский, затем языки второго уровня, и только потом их диалекты. То есть перевод на испанский происходит с универсального английского, а на мексиканский — с испанского.
При отображении переводов пользователю поиск производится снизу вверх. Например, для мексиканского языка сначала ищется мексиканский перевод. Если он не найден — испанский. Если и его нет — универсальный английский.
Направление письма и пунктуация
Для большинства языков достаточно перевести текст, а внешний вид приложения и окружающие текст элементы не подвергаются никакой модификации. Однако существуют специфические языки:
- с обратным написанием (справа налево, например, арабский и иврит);
- с особенными правилами пунктуации (испанский, японский).
Для языков с обратным написанием требуется не только перевести текст, но и сделать интерфейс зеркальным: меняется не только направление текста, но и направление восприятия информации.
С пунктуацией бывают случаи попроще. Например, в азиатских языках (японский, корейский) используются собственные символы UTF-8 для точки, восклицательного и вопросительного знаков (выглядят почти как наши, только не наши):
。?!
.?!
А бывают случаи посложнее. Например, в испанском вопросительный и восклицательный знаки дублируются в начале предложения в перевёрнутом виде.
А исключать пунктуацию из лексем ни в коем случае нельзя!
Форматы и единицы измерения
Существуют тонкие, но очень важные различия в форматировании дат и чисел, которые могут придать им совершенно разные значения в разных странах.
Например, 03/07/2013 может обозначать 3 июля или 7 марта — в зависимости от местных стандартов. Это частая причина путаницы между США и Великобританией, где говорят на одном языке, но используют разный формат дат. Не нужно считать, что если две страны говорят на одном языке, то они обязательно всё поймут одинаково.
Похожее происходит и с числами. Число 1.000 можно прочитать как «один» или как «тысяча» в зависимости от того, какой разделитель используется для отделения дробной части. Например, в Корее точка — это десятичный разделитель, а в Германии она используется для отделения тысяч.
Отдельное внимание нужно уделять системе измерений. Самое простое решение — отображать рост пользователя одновременно в футах и сантиметрах, но выглядит это неестественно. Можно сделать переключатель, позволяющий пользователю выбрать удобные величины, а значение по умолчанию выставлять, исходя из выбранного языка. Это относится к мерам длины (роста), веса, шкале температур и т.п.
Стилистика
В разных компонентах Badoo может использоваться разный стиль текста: где-то более формальный, а где-то более молодёжно-разговорный. Например, в условиях использования сервиса и прочих официальных документах лучше переводить you как «вы», в то время как в интерфейсах развлекательного характера зачастую используется «ты».
Кроме этого, очень важно не путаться в терминологии и устоявшиеся слова и фразы переводить везде одинаково. Например, сервис случайных знакомств на Badoo по-английски называется Encounters. Это слово можно перевести по-разному, но мы придерживаемся перевода «Знакомства». Это крайне важно, иначе пользователь может не понять промо-текст, призывающий к каким-то действиям, или сообщение об ошибке. Для решения этой проблемы мы используем два механизма. Первый — это отдельная группа коротких лексем, которые либо используются очень часто, либо могут зависеть от пола и числа. Об этой группе мы подробнее расскажем в следующем разделе.
Второй механизм мы называем TranslationMemory. Он выполняет сразу две функции:
- уменьшает количество работы переводчикам (и, как следствие, ускоряет деплой);
- помогает выдерживать переводы схожих лексем в одной стилистике.
Логика работы TranslationMemory достаточно проста, а вот реализация может быть интересной темой, и мы обязательно расскажем об этом подробнее в будущем. Если вкратце, то при переводе лексемы мы разбираем оригинальный текст и перевод на более мелкие «нити» (части фраз и целые предложения) по знакам пунктуации, тегам, переносам строк и некоторым другим разделителям. Почему нити? Потому что они могут пересекаться, переплетаться и включать любое количество других нитей. Совокупность всех нитей в лексеме мы называем структурой лексемы.
Если мы можем чётко сопоставить структуру нитей из оригинала и перевода друг другу, мы сохраняем пары нитей. В будущем, при появлении новых лексем в системе переводов, мы стараемся найти перевод для каждой нити. Комбинируя найденные варианты, мы подбираем максимально полный перевод. Переводчик может выбрать за основу нового перевода один из нескольких наиболее полных переводов, собранных по-кусочкам из разных нитей.
Например, переведя однажды две разные лексемы Hello world и My name is John, переводчик может практически ничего не делать для лексемы Hello world! My name is John. TranslationMemory предложит готовый перевод. Переводчику останется лишь убедиться, что знаки пунктуации соответствуют языку.
Зависимость от пола
В разных языках половая принадлежность указывается по-разному: где-то используются артикли и предлоги, где-то окончания, а где-то всё и сразу. Например, в славянских языках от пола могут зависеть практически все части речи. Кроме того, сложные фразы могут зависеть не только от пола объекта, но и от пола субъекта. Правила в некоторых языках могут оказаться настолько сложными, что иногда приходится дублировать английский текст для нескольких сочетаний объектов и субъектов разных полов и, соответственно, модифицировать приложение.
Такие ситуации практически невозможно предугадать, не будучи полиглотом. Более того, мы считаем, что разработчики и не должны об этом думать. Поэтому у наших переводчиков есть специальный инструмент в интерфейсе переводов, позволяющий «заказать» разделение лексемы по половому признаку: автоматически создаётся тикет на разработку с описанием проблемы.
Зависимость от числа и склонения
В большинстве языков существуют только две формы зависимости от числа: единственное и множественное. Русский язык является отличным примером сложных правил зависимости от числа: 1 пользователь, 2 пользователя, 5 пользователей. Причём 21 (31, 41, 101) пользователь, но 11 пользователей. Сами по себе правила не очень сложные, но мы копнём глубже.
Обычно приложения считают то, что для них важно. Социальные сети считают пользователей, фотографии, посты и лайки. В финансовой сфере считают сделки, валюту и клиентов. GPS-навигаторы считают минуты и километры (или мили). Исчисляются те величины, названия и единицы измерения которых встречаются в приложении повсеместно. Это те самые часто используемые лексемы, которые уже неоднократно упоминались в этой статье. Зависимость от числа — одна из причин, по которой мы создали отдельный инструмент для манипуляций такими лексемами.
Вторая причина — «Иван Родил Девчонку, Велел Тащить Пеленку», т.е. склонения. Занимательный факт: в венгерском языке 17 склонений — это рекордсмен среди языков, на которые мы переводим сайт и приложения. Для редко встречающихся слов и фраз можно обойтись обычным текстовым переводом без программной обвязки. Для часто встречающихся слов и фраз полезно иметь инструмент, получающий грамматически правильный вариант. Например, фраза «Вы понравились 2 девушкам» греет душу не только приятным фактом предстоящего знакомства, но и чистым и понятным русским языком.
Наш инструментарий позволяет выполнять две важных операции. Для разработчиков — получить готовое слово или фразу в грамматически правильной форме (точнее, универсальный контейнер). Для переводчиков — использовать эти правильные формы в переводах обычных лексем. Например, приведённая выше лексема в системе переводов на русском будет выглядеть как «Вы понравились {{users_num}} {{users_word#Dative}}». Это даёт нам определённую свободу: переводчик может по собственному усмотрению перефразировать лексему и изменить падеж.
Это достаточно хорошее решение, но оно требует взаимодействия между переводчиками и разработчиками. Сейчас мы работаем над системой, которая позволит изменять всю лексему или её часть на основании имеющихся в ней переменных без участия разработчиков, только силами переводчиков.
Контекст и длина лексем
Зачастую одну и ту же фразу (не говоря уже об отдельных словах) можно перевести по-разному в зависимости от контекста. Короткое search может быть как существительным «поиск», так и глаголом «искать». В погоне за повторным использованием идентичных лексем и переводов важно следить за контекстом. Чтобы помочь переводчикам правильно понять контекст фразы, мы, как правило, используем скриншот примера использования лексемы. Мы даже создали систему автоматического сбора скриншотов на этапе тестирования задачи, но об этом в отдельной статье.
Работая с мобильными проектами нужно уделять особое внимание длине строк. Место на экране будет в дефиците, и нужно удостовериться, что фрагмент текста умещается в назначенное для него пространство. Зачастую термин, являющийся одним словом на английском, может оказаться целым предложением на других языках. Длину строк можно ограничивать как символами, так и пикселями (если размер и тип шрифта заранее известны и редко меняются).
Ограничение длины перевода, как правило, носит рекомендательный характер. При превышении ограничения переводчик увидит соответствующее предупреждение, но всё равно сможет сохранить перевод.
Мультиверсионность и отказоустойчивость
Когда у вас в команде больше сотни разработчиков, это требует некоторой осторожности при работе с переводами: один и тот же шаблон с переводимым текстом (равно как и словарь мобильного приложения) может быть изменён в разных задачах. Система переводов должна уметь различать разные версии файлов и понимать, какой перевод нужно отдать пользователю.
Для большой команды так же важно сделать систему переводов максимально удобной и отказоустойчивой. Удобство позволяет новым членам коллектива максимально быстро приступить к работе. Отказоустойчивость нужна для снижения влияния человеческого фактора: система должна самостоятельно справляться с человеческими ошибками и либо исправлять их, где это возможно, либо громко ругаться и бить током.
Пусть переводят пользователи
Можно долго и мучительно искать переводчиков в штат или на фриланс, выдумывать систему контроля качества переводов и всячески страдать каждый раз, когда вы хотите добавить поддержку нового языка. Но если ваше приложение носит развлекательный характер и аудитория достаточно велика, то вполне допустимо привлекать пользователей к переводам. Так переводятся Facebook и WhatsApp, так с недавних пор переводится и Badoo.
Мы уделяем большое значение качеству переводов, и нам было страшновато запускать такую схему. Тем не менее, у такого подхода существует ряд сильных сторон:
- вам не нужно искать переводчиков на все языки в штат;
- сами носители языка контролируют качество переводов;
- это бесплатно.
Мы поощряем самых активных участников, но по большей части пользователи работают за идею — сделать Badoo доступным на своём родном языке. Сейчас пользователи работают с семью языками, из которых три (финский, малайский и вьетнамский) уже доступны всему сообществу Badoo. Перевод на оставшиеся четыре (баскский, бенгальский, исландский и суахили) ещё не настолько хорош, чтобы включить его в поддержку для всех пользователей, но это вопрос времени.
Заключение
Цель локализации в том, чтобы пользователи чувствовали себя комфортно в вашем приложении, независимо от языка и места проживания. Зачастую это требует неочевидных и сложных решений, но, исходя из нашего семилетнего опыта, мы можем смело сказать, что это того стоит.
Система переводов в Badoo выстраивалась все эти годы и продолжает развиваться. Мы постараемся в будущем рассказать более подробно о наших технических и организационных решениях. О чём будет следующая статья — решать вам!
Глеб Дейкало, PHP-разработчик
Автор: