Upgrade to Pro — share decks privately, control downloads, hide ads and more …

зыки, платформы, версии: масштабируем локализац...

зыки, платформы, версии: масштабируем локализацию — Алексей Тимин(Badoo)

Выступление на Live! Badoo Localization Meetup (21/04/2020)

Если у продукта, который вы делаете, глобальные планы, то рано или поздно вам придется столкнуться с локализацией. Перевести на английский — полбеды, но когда добавляются новые языки и диалекты, то возникают не всегда очевидные трудности. Нужно уметь контролировать все изменения. А если ко всему прочему у вас параллельно могут существовать несколько версий одного текста… Вам не позавидуешь!

В случае нашей компании речь идет о четырех разных продуктах, 52 языках (11 из них — диалекты), 17 падежах в венгерском языке, письме справа налево в арабском и иврите, числительных в русском и огромном количестве версий и клиентов.

В докладе я поделюсь описанием нашего процесса перевода. Расскажу об интеграции локализации и Jira, об использовании Git-хуков и автоматических скриншотах. Мы разберём, как проводить А/B-тестирование. Обсудим, как обеспечить единство стиля с помощью глоссария и памяти переводов на ElasticSearch, а также как успевать переводить новый функционал за 48 часов и не нагружать разработчиков рутиной.

Badoo Tech

April 21, 2020
Tweet

More Decks by Badoo Tech

Other Decks in Programming

Transcript

  1. 3

  2. Лексема Отдается сервером? Ключ Сan't connect Нет cannot_connect <a>Send a

    request</a> to get access to {{contact_name}}’s friends Да 123 You need {{credits_amount}} [[credits:credits_amount]] to let her know she’s your crush. Да she_crush ТЗ. Таблица лексем 10
  3. • Мы учитываем использование лексемы в разных контекстах • Указываем,

    отдается лексема сервером или интегрируется в клиент Это экономит время Вывод 15
  4. Перевод • Порядок перевода • Контекст • Единый стиль •

    Падежи и числительные • Проверка переводов 17
  5. Порядок перевода EN Master 20 EN Великобритания EN США EN

    Австралия EN Канада EN Индия RU Россия ES Испания FR Франция ES Аргентина ES Мексика ES Колумбия FR Канада
  6. Порядок перевода EN Master 21 EN Великобритания EN США EN

    Австралия EN Канада EN Индия RU Россия ES Испания FR Франция ES Аргентина ES Мексика ES Колумбия FR Канада Hey! Неформальное приветствие ¡Hola! Salut! Привет! G’day mate ¿Qué onda?
  7. Порядок перевода EN Master 22 EN Великобритания EN США EN

    Австралия EN Канада EN Индия RU Россия ES Испания FR Франция ES Аргентина ES Мексика ES Колумбия FR Канада Hello! Стало более официально Salut! Привет! Надо проверить переводы! G’day mate ¡Hola! ¿Qué onda?
  8. Создание/редактирование лексем • Текстовое описание • Картинка • М /

    Ж • Типы переменных • Максимальная длина • Большой текст разбивается на части Контекст 29
  9. ТЕКСТ ДО ТЕКСТ ДО ТЕКСТ ДО ТЕКСТ ДО ТЕКСТ ДО

    ТЕКСТ ПОСЛЕ ТЕКСТ ПОСЛЕ ТЕКСТ ПОСЛЕ Перевод лексемы должен быть согласован с текстом ДО и ПОСЛЕ Контекст 30
  10. Unlock your Likes List to see everyone who’s interested at

    once Term Description Likes Noun Folder containing people who liked you - formerly "Admirateurs / Fans" Глоссарий 31
  11. Вариант перевода Численная переменная М / Ж Web / Android

    / iOS Badoo / Bumble ? Зависимость перевода 33
  12. - Your account has been blocked - You’ve been blocked

    - UH OH! Единый стиль 35
  13. You got an extra {{num_likes}} [[likes:num_likes]] – fancy another go?

    Совпадение Схожесть Перевод You got an extra {{num_likes}} [[likes:num_likes]] – fancy another go? 100 % Вы получили {{num_likes}} [[likes:num_likes@3]]! Хотите повторить? Память переводов 36
  14. You got an extra {{num_likes}} [[likes:num_likes]] – fancy another go?

    Совпадение Схожесть Перевод You got an extra {{num_likes}} [[likes:num_likes]] – fancy another go? 100 % Вы получили {{num_likes}} [[likes:num_likes@3]]! Хотите повторить? You got an extra {{num_likes}} {{num_matches}} [[likes:num_likes]] [[matches:num_matches]] – fancy another go? 84 % Вы получили {{num_matches}} [[matches:num_matches@3]]! Хотите повторить? Память переводов 37
  15. 39

  16. Падеж \ Число 1, 21, 31, 41… 2-4 22-24, 32-34…

    0, 5-20, 25-30, 35-40… x.1-x.9 0. Именительный кредит кредита кредита кредитов кредита 1. Родительный кредита кредитов кредитов кредитов кредитов 2. Дательный кредиту кредитам кредитам кредитам кредитам 3. Винительный кредит кредита кредита кредитов кредита 4. Творительный кредитом кредитами кредитами кредитами кредитами 5. Предложный кредите кредитах кредитах кредитах кредитах Матрица падежных форм 40
  17. Падеж \ Число 1, 21, 31, 41… 2-4 22-24, 32-34…

    0, 5-20, 25-30, 35-40… x.1-x.9 0. Именительный кредит кредита кредита кредитов кредита 1. Родительный кредита кредитов кредитов кредитов кредитов 2. Дательный кредиту кредитам кредитам кредитам кредитам 3. Винительный кредит кредита кредита кредитов кредита 4. Творительный кредитом кредитами кредитами кредитами кредитами 5. Предложный кредите кредитах кредитах кредитах кредитах Вам нужно {{credits_amount}} [[credits:credits_amount@3]], чтобы отправить подарок {{second_user_name}}. Перевод с указанием падежа Число от разработчика Выбранный переводчиком падеж 41
  18. Падеж \ Число 1, 21, 31, 41… 2-4 22-24, 32-34…

    0, 5-20, 25-30, 35-40… x.1-x.9 0. Именительный кредит кредита кредита кредитов кредита 1. Родительный кредита кредитов кредитов кредитов кредитов 2. Дательный кредиту кредитам кредитам кредитам кредитам 3. Винительный кредит кредита кредита кредитов кредита 4. Творительный кредитом кредитами кредитами кредитами кредитами 5. Предложный кредите кредитах кредитах кредитах кредитах Вам нужно 10 кредитов , чтобы отправить подарок {{second_user_name}}. 42 Перевод с указанием падежа
  19. • Контекст переводчикам — всегда! • Гибкая система === уместные

    переводы • Нужна автоматическая проверка переводов Вывод 48
  20. Готовы к новым знакомствам? Присоединяйтесь! Еще пара шагов… И вы

    станете частью Badoo! ИЛИ A/B-тестирование переводов 52
  21. Вариант перевода Численная переменная М / Ж Web / Android

    / iOS Badoo / Bumble ? Зависимость перевода 54
  22. Вариант перевода Численная переменная М / Ж Web / Android

    / iOS Badoo / Bumble A/B-тест Зависимость перевода 55
  23. 56

  24. Вы получили дополнительные {{num_likes}} [[likes:num_likes]] - попробуем еще раз? Votes:

    6 У тебя есть дополнительные {{num_likes}} [[likes:num_likes]] – попробуешь еще раз? Votes: 3 Совместный перевод 60
  25. Параллельная разработка Отправь подарок send_gift Открыть приватные фото show_private …

    … Отправь подарок send_gift Открыть приватные фото show_photo … … Лексемы.txt Лексемы.txt 65
  26. Параллельная разработка Создание / изменение лексем в системе локализации Скачивание

    набора лексем Разработчики Отправь подарок send_gift Открыть приватные фото show_private … … 66
  27. Напишите <b>{{second_user_name@2}}</b> за {{credits_amount}} [[credits:credits_amount@3]] Ошибки при использовании лексем Число

    от разработчика Матрица падежных форм слова Кредит Падеж от переводчика Падеж от переводчика Имя пользователя от разработчика 68
  28. class TextContainer { private $translation = 'Напишите <b>{{second_user_name@2}}</b> за {{credits_amount}}

    [[credits:credits_amount@3]]'; private $var_types = [ 'second_user_name' => 'name', 'credits_amount' => 'int', ]; public function getReplaced(array $substitutions) { // Проверка типов значений, переданных для подстановки // Подстановка // return (все подстановки сделаны) ? Строка : Container; } public function __toString() { // Warning!!! Не все подстановки произведены!!! } } Контроль использования лексем 69
  29. class TextContainer { private $translation = 'Напишите <b>{{second_user_name@2}}</b> за {{credits_amount}}

    [[credits:credits_amount@3]]'; private $var_types = [ 'second_user_name' => 'name', 'credits_amount' => 'int', ]; public function getReplaced(array $substitutions) { // Проверка типов значений, переданных для подстановки // Подстановка // return (все подстановки сделаны) ? Строка : Container; } public function __toString() { // Warning!!! Не все подстановки произведены!!! } } Контроль использования лексем 70
  30. class TextContainer { private $translation = 'Напишите <b>{{second_user_name@2}}</b> за {{credits_amount}}

    [[credits:credits_amount@3]]'; private $var_types = [ 'second_user_name' => 'name', 'credits_amount' => 'int', ]; public function getReplaced(array $substitutions) { // Проверка типов значений, переданных для подстановки // Подстановка // return (все подстановки сделаны) ? Строка : Container; } public function __toString() { // Warning!!! Не все подстановки произведены!!! } } Контроль использования лексем 71
  31. 74

  32. 75

  33. 76

  34. 77

  35. 78

  36. 82

  37. Стоит отметить • Нужно понять, какими устройствами пользуется ваша аудитория

    • Обязательно тестировать на всех целевых устройствах • Может помочь выборочный аудит переводов 88
  38. Версионирование переводов Версия переводов 98 В разработке В тестировании У

    пользователей Версия переводов Версия переводов
  39. • AppStore • GooglePlay Production Server 101 Перевод интегрированный Перевод

    с сервера Релиз переводов Вы понравились друг другу!
  40. • AppStore • GooglePlay Hot Update Production Server 102 Перевод

    интегрированный Перевод с сервера Обновление интегрированного перевода Релиз переводов Вы понравились друг другу!
  41. Вывод • Нужно учитывать путь релиза вашего приложения от вас

    до клиентов • Разные части приложения могут обновляться по-разному 103
  42. Подробное ТЗ + Контекст, история переводов + Автоматизирование контроля +

    Свобода разработчиков от непрофильных задач = Формула успеха 105
  43. CHEERS! Переводим интерфейсы на полсотни языков. Sketch tech.badoo.com/ru/article/397/ Обновление строк

    на лету в мобильных приложениях tech.badoo.com/ru/article/403/ tech.badoo.com/ru/article/419/ А/Б-тестирование habr.com/ru/company/badoo/blog/498174/ Еще много крутого на tech.badoo.com 106