Автоматизация перевода документов на иностранные языки через стандарт XLIFF: особенности тестирования

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

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

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

Чтобы локализация происходила проще, мы сделали фичу, которая собирает исходный текст в формат XLIFF, отправляет его в Crowdin и потом передаёт клиенту готовый локализованный текст. Это быстро, почти автоматически и тестируется! Про особенности тестирования сборки текстов в XLIFF-документ и расскажем в статье.

Почему именно XLIFF

Что за формат XLIFF и с чем его "едят" хорошо описано на Википедии

Возникла идея: можно выгрузить из файла документ, в котором будет содержаться не только текст, но и всё необходимое форматирование. После перевода на нужный язык документ будет импортироваться обратно в исходный файл. И вуаля: получим переведённый текст с корректным форматированием. 

Выбор пал на формат XLIFF (XML Localization Interchange File Format), потому что у него есть: 

  • Набор платных и бесплатных редакторов под desktop и web.

  • Возможность поддержки форматирования любых кастомных элементов внутри текста.

Механизм экспорта и импорта текстов
Механизм экспорта и импорта текстов

Для пользователя магия экспорта и импорта происходит в 9 кликов:

  • Нажать кнопку «Перевод».

  • Выбрать кнопку экспорта.

  • Выбрать язык исходного текста.

  • Ввести имя файла.

  • Сохранить XLIFF-документ.

После перевода в стороннем сервисе, таком как CrowdIn, Smartcat, Localazy:

  • Нажать кнопку «Перевод».

  • Нажать кнопку импорта.

  • Выбрать файл.

  • Загрузить переводы.

Что учитывать при тестировании XLIFF

В целом процесс тестирования XLIFF ничем не отличается от обычного тестирования. Но есть несколько особенностей, которые нужно держать в голове.  

Первое и самое главное — структура документа

Бывает, что между экспортом перевода и импортом перевода исходный документ может измениться: например, добавили в тест новый вопрос или текст ответа. Структура документа XLIFF должна быть устойчива к таким изменениям: нужно следить, чтобы импорт перевода в измененный документ проходил без ошибок. 

Пример теста, который нужно локализовать
Пример теста, который нужно локализовать

Второе. Unit-тесты необходимы

За качество продукта отвечают не только тестировщики, но и разработчики. В частности, если разработчики покрывают unit-тестами большую часть кода, качество продукта становится выше. Поэтому программисты использовали эту практику и с нашей фичей. 

Внутри документа XLIFF была большая структура с тегами и атрибутами — если бы тестировщики проверяли это сами, получилось бы накладно и долго. Поэтому бОльшую часть проверки структуры документов покрыли unit-тестами.

После экспорта получаем примерно такой .xliff файл
После экспорта получаем примерно такой .xliff файл

Также написали небольшой скрипт, который брал экспортированный XLIFF, менял регистр, добавлял теги <trans_unit> — это показывало, что документ переведён. Такой скрипт помогает проверять регрессию импорта текстов.

Третье. Теги в документе XLIFF

Есть теги стандартные (target-language="en", <target></target>) и обязательные, без которых XLIFF — не XLIFF. Например, <xliff>, <file>, <body> и так далее.

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

<g clone="yes" ctype="x-is-par" id="g1" ispring:start-data="data1"><g clone="yes" ctype="x-is-span" id="span1" ispring:start-data="data2">Событие 3</g></g></g>
Вот так иногда отображаются теги в сервисах по переводу
Вот так иногда отображаются теги в сервисах по переводу

XLIFF позволяет внедрять кастомные атрибуты: например, к какому вопросу и ответу в продукте отнести тот или иной текст. Но не все сервисы по переводам их поддерживают. 

Поэтому проверяйте, не удалил ли сервис кастомные атрибуты, которые вы заложили в XLIFF. Бывает, что при импорте переведенного текста выгруженный файл не будет поддерживаться вашим продуктом. 

Например, до загрузки в сервис:

<file datatype="x-is-Quiz"
	      ispring:id="quiz_mlup862t69wi-95mjo8sai7jg"
	      original="Quiz"
	      source-language="es-SV"
	      xml:space="preserve">
</file>

После выгрузки из сервиса:

<file datatype="x-is-Quiz" 
original="Quiz"
source-language="en" 
target-language="en-US">
</file>

Ещё один важный момент: если переводить текст в самом документе, ничего не выйдет. Будет не хватать основных тегов: target-language="en", <target></target>

Подробнее про теги и атрибуты можно почитать в документации.

Четвертое. Проверка форматирования

В тексте документа может простое или продвинутое форматирование. Поэтому при импорте текста в документ нужно визуально проверить, что всё форматирование сохранилось и никакие атрибуты и теги не потерялись.

Простые встроенные средства форматирования:

Продвинутые средства форматирования:

В атрибутах ctype указываем форматирование. Это может быть как один стиль текста или множество
В атрибутах ctype указываем форматирование. Это может быть как один стиль текста или множество

Пятое. Устранение дублирования текста

В документах встречаются целые разделы одинакового текста: например, одинаковые предложения в «обратной связи» при ответе на вопрос. Но в сервис переводов такие тексты должны попасть только один раз: переводчик берёт оплату за строки текста, и ему не важно, одинаковый текст или нет. Мы распознаём одинаковые тексты, не дублируем их при переводе и экономим деньги пользователя.

При сохранении текста проверяется, не совпадает ли содержимое с ранее экспортированным текстом
При сохранении текста проверяется, не совпадает ли содержимое с ранее экспортированным текстом
Если совпадает, то вместо сохранения самого текста, сохраняется ссылка на ранее сохранённый текст. В результате одинаковые тексты экспортируются без дубликатов
Если совпадает, то вместо сохранения самого текста, сохраняется ссылка на ранее сохранённый текст. В результате одинаковые тексты экспортируются без дубликатов

Шестое. Применение перевода только к экспортированному тексту

При отгрузке текста нужно присваивать уникальный id каждому разделу и документу. Это позволяет каждой части перевода интегрироваться только в тот раздел, откуда она была извлечена.

Тестирование XLIFF: 6 нюансов

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

  1. Следить за структурой документа: чтобы переведённые части текста импортировались без проблем, даже если в документ добавили новый слайд или раздел.

  2. Покрывать структуру документов автотестами, чтобы не приходилось долго и мучительно проверять их вручную.

  3. Следить за тегами и кастомными атрибутами: некоторые сервисы переводов их «выпиливают», из-за чего продукт может не поддерживать выгруженный файл.

  4. Проверять форматирование документа после импорта глазами: что все атрибуты и теги подтянулись.

  5. Предусмотреть фичу, которая будет отслеживать дублирование текста и удалять одинаковые куски: это сэкономит деньги и время при переводе.

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

Источник: https://habr.com/ru/company/ispring/blog/647133/


Интересные статьи

Интересные статьи

Решение по созданию недорогого варианта для открывания шлагбаума. После нескольких месяцев тестирования в посёлке были выявлены проблемы, исправлены ошибки. Статья повторяет первую, но основана на пра...
Прошлый учебный год я вёл занятия в школе робототехники. Класс состоял из подростков 12-13 лет, способных и дисциплинированных. В моих подопечных меня устраивало всё, кроме одного маленького нюанса ...
Если ваши микросервисы уже используют общую базу PostgreSQL для хранения данных, или ей пользуются несколько экземпляров одного сервиса на разных серверах, можно относительно «дешево» получить во...
TL;DR Атакующий подменяет source ip на адрес вашего сервера и триггерит автоматические абузы. В результате клиента банят на хостинге за вредоносную активность, которой не было. Комментарий...
Но если для интернет-магазина, разработанного 3–4 года назад «современные» ошибки вполне простительны потому что перед разработчиками «в те далекие времена» не стояло таких задач, то в магазинах, сдел...