
Acronis — международная компания с основным R&D в России, но основной наш язык — английский. У региональных продуктов свои языки, и их довольно много. Языков сайта ещё больше, чем языков софта.
Поэтому мы сделали такую систему на Друпале, причём не без извращений:
- Появляется мастер-текст на английском (США). Он раскатывается на все сайты как «золотой» образ.
- Если есть прямой перевод на язык локали, используется он.
- Если нет прямого перевода на язык локали, но есть перевод на язык наследования, используется текст на языке наследования.

То есть в Мексике (где говорят на языке, произошедшем от испанского), цепочка будет такая: проверить мексиканский; если нет — взять испанский; если нет — поставить английский США. В Великобритании последовательность короче: классический английский, затем — американский английский. При этом цена наследуется по другому пути: сначала проверяется местная, потом берётся американская, а не европейская.
Вторая важная вещь — разбить все целые страницы на куски и токены, чтобы обеспечить зависимость переменных (цены, форматы дат, названия продуктов, отдельные названия кнопок и так далее). Извращения понадобились, потому что из коробки Друпал делал всё куда «деревяннее» и проще.
Вводная информация
Много контента, прозрачный, но не короткий процесс редактирования, ревью переводов и пруфридинга. Порядка 30 человек, редактирующих сайт. Всего один инстанс Drupal 7. Разное содержимое на локалях — специальные предложения, скидки, валюты и её формат, а также доступность продуктов и страниц в зависимости от определённых условий. Интересно, правда?
Пока кто-то пишет код, рождается контент
Наверное, так должно быть, но бывает не всегда, правда? У нас, если честно, в этом плане всё весьма упорядоченно и отлажено.
- Мы отталкиваемся от базового языка (английского) и именно на нём формируем переводимые строки, содержимое полей, картинки.
- Это содержимое в процессе размещения на сайте корректируется, проходит первичный ревью и становится отправной точкой для дальнейших действий.
- На выходе мы имеем полностью готовые страницы, в вёрстке, с содержимым на английском языке. Стоит отметить, что эта работа разделяется на 2 процесса: простое размещение текста в интерфейсе Drupal и вёрстка, написание JavaScript-кода и файлов шаблонов, содержащих переводимые строки с использованием функции t() Drupal.

Как переводить?
Как известно, в Drupal 7 есть всего два варианта, чтобы переводить содержимое: делать полную копию любой сущности или переводить поля. Первый — более «ядерный», но менее гибкий и откровенно перегруженный способ с помощью модуля locale. Мы пошли по второму пути — Entity Translation, благодаря чему в таблице node у нас не так много записей, как могло бы быть.
Хорошо было не сразу
- Мы пережили огромное количество невероятных приключений по поиску случайных, странных и порой пугающих багов в Entity Translation.
- Мы находили такой
прекрасный и опрятныйкод, что мы были вынуждены стать морально устойчивей. - Всё это
очень быстро и стабильнои хорошо работало под нагрузкой. - Выгружать переводы было
очень удобно. - Как и все коробочные системы, Drupal 7 изначально был не очень удобен и приятен, но его гибкость дала нам шанс.
И наконец построили...
Мы очень старались сделать всё, чтобы наши коллеги могли переводить термины таксономии, а виджеты taxonomy term reference умели показывать локализованные заголовки терминов. Нам удалось научить Drupal обходить всю цепочку языков-кандидатов на перевод в разных ситуациях именно так, как нам этого хочется. Также удалось сделать весьма точную и расширяемую систему обработки форматов валют со своим отдельным механизмом наследования. У нас несколько своих собственных Entity-типов, которые также прекрасно управляются, переводятся в едином стиле. Нам удалось сделать гибкий функционал меню, функциональность которого ушла очень далеко за пределы «node/».
Мы переписали немного доработали известный проект Translation Management Tool и научили его фокусам переводить все наши сущности, обрабатывать наши собственные токены, выгружать переводы дел в XLIFF с зависимостями, а также парочке трюков.
Ещё нам пришлось написать собственные опции для скрытия/показа сущностей для нужных локалей, которая умеет правильно возвращать access материала в этапе запроса (примерно так, как это организовано в системе доступа), что сделало эту опцию «сквозной» до самого меню — ссылки на скрытые страницы исчезают из меню для нужной локали. За «скрытыми» страницами последовал собственный delivery callback, чтобы не отдавать 403 клиентам без разбора.

Токенизируй это!
Так случилось, что нам понравилось использовать токены. Изменения — это хорошо, и мы придумали ставить токены, например, в шаблонах или частях body страниц. Токены, как правило, являются сущностями другого, нашего собственного типа — Template. Это позволило нам организовать себя, выработать стандарт по названию и расстановке этих токенов и не бояться изменений. Убрать или изменить телефон на 20 страницах на 1 локали? — Легко! Убрать часть опций из предложения в Австралии? — Конечно!
Мы реализовали свои токены для расстановки правильных URL-ссылок в контенте со своим алгоритмом работы, нацеленным всегда вернуть клиенту локализованную ссылку, даже если с указанной страницы есть редирект, а сама она уже не существует.
Самое главное — локализация
И всё, о чём мы говорили, ради этого момента. Наша локализационная команда из Москвы умеет прекрасно взаимодействовать с Drupal. Мы именно к этому и шли — процесс стал практически параллельным. Ребята создают задачи на выгрузку данных из всех полей выбранных страниц, указывая, на какой язык требуется перевод, и забирают XLIFF-файлы, чтобы начать свою работу. Сами переводчики на редкие языки, как правило, удалённые сотрудники или агентства с носителями языка, поэтому выгрузка просто передаётся наружу. Там она переводится, снова загоняется в софт наших переводчиков, а оттуда, после проверки, импортируется в Drupal, где автоматически создаются новые переводы для каждой Entity и добавляются значения переводимых полей. Остаётся отправить ссылку на переведённую версию страницы региональному менеджеру.
Заключение
У нас есть очень хороший опыт по работе с многоязычной и весьма сложной структурой в рамках одного инстанса системы. Мы, стабильно с Zero Downtime, обновляем релизы сайта. Мы намеренно не разбивали сайт на целую массу маленьких сайтиков, потому что так действительно правильнее, как минимум, с точки зрения обслуживания. Важным пунктом нашего заключения является то, что нам удалось достигнуть всех перечисленных успехов вообще без хакинга ядра Drupal.
Автор: Acronis