Transept
ЛокалізаціяІнтернаціоналізаціяШІ-перекладРозробка

Десять мов за три дні: польові нотатки з локалізації продукту для ШІ-перекладу

Ми локалізували Transept німецькою, українською, китайською, португальською, французькою, іспанською, чеською, італійською, польською та турецькою мовами всього за одні довгі вихідні. Ми використовували машинний переклад саме так, як радимо нашим користувачам: з урахуванням контексту, термінологічних рішень та людського постредагування. Це історія про правила множини, зміну регістрів, типографічні інверсії та уроки hreflang, які ми засвоїли в процесі.

Mariia Ivakhnenko
Mariia Ivakhnenko17 хв читання
Десять мов за три дні: польові нотатки з локалізації продукту для ШІ-перекладу
На цій сторінці

З ранку п’ятниці до вечора неділі на початку липня Transept пройшов шлях від суто англомовного продукту до підтримки одинадцяти мов. Німецька, українська та китайська вийшли першими, а одразу за ними — бразильська португальська; наступного дня з’явилися французька, іспанська, чеська, італійська та польська, а в неділю цей список закрила турецька.

Ми створюємо інструмент для ШІ-перекладу. Залишатися виключно англомовними було б мовчазним визнанням того, що ми самі не віримо у власні слова. Тому ми провели локалізацію саме так, як радимо нашим користувачам: машинний переклад — для масштабу, людське судження — для прийняття рішень, і пам’ять про кожне рішення, щоб не довелося приймати його двічі.

Кожна мова — це приблизно 3300 рядків у застосунку, ще 3000 на маркетинговому сайті та в довідковому центрі, шість юридичних сторінок і всі листи, які надсилає продукт. Цей допис — наші польові нотатки: речі, які нас здивували, пастки, в які ми потрапили, і ті, яких нам вдалося вчасно уникнути. Якщо ви збираєтеся локалізувати продукт або професійно займаєтеся перекладом і хочете побачити, як виглядає локалізація софту «під капотом», цей текст для вас.

Чому ми не стали просто проганяти все через Google Translate

Цілком слушне запитання. Машинний переклад дешевий і миттєвий; будь-яку таблицю рядків у світі можна прогнати через API за кілька годин. То чому б так і не зробити?

Тому що ми спробували щось подібне і виявили проблему у власному продукті раніше за користувачів. Під час першої ітерації з маркетинговими сторінками ми сприймали їх так, як це зазвичай робиться в процесах локалізації: як таблицю з розрізненими клітинками, згрупованими за розміром, де кожен рядок перекладався наосліп. Результат був граматично правильним, нібито адекватним, але якимось «мертвим». Заголовок і фраза, що його доповнювала, перекладалися двома різними запитами, які «не бачили» один одного. Відповідь у розділі FAQ не знала свого запитання. Дві колонки порівняльної таблиці роз’їхалися, бо жодна не підозрювала про існування іншої. Водночас інтерфейс застосунку, де кожен рядок супроводжувався приміткою про контекст, читався помітно краще всіма мовами. Та сама модель, той самий день, той самий процес. Різниця була в контексті.

Це стало залізним правилом для всього: модель бачить цілісні тексти, а не перемішані фрагменти, і кожен рядок супроводжує примітка про те, де він з’являється і що саме робить користувач, коли його бачить. «Кнопка збереження» — це не опис контексту. «Універсальний напис на кнопці збереження при відправці будь-якої форми; користувач щойно відредагував значення і підтверджує зміни» — ось це він. Такі пояснення пишуться для перекладача, який ніколи не бачив застосунку на власні очі, і неважливо, людина це чи модель: без контексту обидва видають сміття, а з ним — працюють вражаюче добре.

Якість перекладу — це насамперед функція контексту, а вже потім — самого перекладача. Будь-який досвідчений лінгвіст це підтвердить. Як з'ясувалося, це правило працює і тоді, коли перекладачем є машина. І це дуже зручно, адже надати машині більше контексту значно простіше, ніж намагатися її «перевиховати».

В індустрії робочий процес, до якого ми зрештою прийшли, називають MTPE — постредагування машинного перекладу. Машина робить перший прохід по всьому тексту, а люди перевіряють там, де важлива довіра. Але MTPE працює лише в одному порядку: людина вирішує, машина виконує, людина перевіряє. Спершу — рішення. І це підводить мене до німецької.

du чи Sie: вибір регістру — це продуктове рішення

Німецька стала нашою першою мовою і вже за кілька годин після релізу піднесла нам перший урок.

У німецькій мові є два способи сказати «ви»: неформальне du та офіційне Sie. Ми запустилися з du: дружнього, у дусі стартапів — саме цей регістр використовує добра половина застосунків у вашому телефоні. Потім ми поглянули на нашу реальну аудиторію (професійних перекладачів, агенції, юридичні команди) і того ж дня перевели весь продукт на Sie.

Цей урок показав, чого насправді коштує зміна регістру: повного перекладу всього тексту заново. Вибір займенника запускає ланцюгову реакцію: змінюються відмінювання дієслів, наказовий спосіб, присвійні форми й навіть написання з великої літери. Якщо латати текст рядок за рядком, усюди залишаться «хвости»: речення із Sie, посеред якого раптом виринає дієслово у формі du. Ми переклали всі корпуси текстів з нуля, а потім за допомогою grep шукали характерні основи du/dein/dich, щоб переконатися, що перехід пройшов успішно.

The German homepage of Transept: "Wo jede Entscheidung zur Erinnerung wird"

Німецька головна сторінка. С**логан бренду «Де кожне рішення стає пам'яттю» виявився програмною тезою про саму локалізацію.

Відтоді вибір регістру — це перше питання, яке ми вирішуємо для кожної нової мови, ще до перекладу першого рядка, адже він пронизує всі шість тисяч рядків. Для іспанської ми обрали ввічливе usted, причому європейський, а не латиноамериканський варіант, щоб вона гармоніювала з німецьким Sie та французьким vous. Для італійської — ввічливе Lei. Польська? Що ж, польська заслуговує на окремий розділ.

Правила множини, про які вас ніхто не попереджає

Кожна команда, що локалізує англійський софт, потрапляє в ту саму пастку: правила множини в англійській настільки прості, що ваш формат рядків, імовірно, має лише два варіанти: для одного предмета і для багатьох. Німецька працює так само, що ще дужче присипляє пильність. А потім ви додаєте слов’янську мову — і цілі категорії інтерфейсу непомітно відкочуються до англійської.

В українській — моїй рідній мові, де я мав найменше виправдань, — чотири категорії множини. Один документ. Два, три, чотири документи — інша форма. Від п’яти до двадцяти — третя. Дроби — четверта. Наша таблиця рядків містила лише дві форми за англійським зразком, тому для значень 2, 3, 4, 5, 11, 22 (а це більшість чисел, які насправді бачить користувач) застосунок видавав англійську. Близько вісімдесяти рядків (кредити, документи, учасники, файли) — і кожен із них був наче помітний шов прямо посеред українського речення.

Engineering notes from the Ukrainian build-out, describing how counts of 2, 3, 4, 5, 11, 22 fell through to English before the plural forms were filled in

*Примітка до збірки за той день, коли ми це виявили. «*Виводиться англійська — дуже помітний баг» — взірець інженерної стриманості.

Виправити це концептуально просто (додати всі форми множини, передбачені граматикою мови, а не лише дві, як в англійській), але екскурс у те, якими саме є ці форми, став моєю улюбленою колекцією цікавинок за весь час роботи над проєктом:

МоваКатегорії множиниНесподіванка
Німецька2Жодних. У цьому й пастка: вона привчає до думки, що у світі їх усього дві.
Українська421 має форму однини: «21 крок».
Чеська4Четверта форма призначена лише для десяткових дробів — категорія-привид, яку ваш інтерфейс ніколи не відображає.
Польська4Ті самі чотири категорії, що й у чеській, але зовсім інший розподіл. 21 — це множина: „21 kroków”.
Французька3Нуль — це однина. А третя форма спрацьовує лише на рівних мільйонах.
Іспанська3Нуль — це множина — повна протилежність французькій.
Турецька2Іменники залишаються в однині після будь-якого числівника: «5 belge», а не «5 belgeler».
Китайська1Одна форма для всього. Найпростіша мова в цій таблиці.

На двох із них варто зупинитися детальніше.

Польська — це не чеська. Це споріднені західнослов'янські мови, тому ми припустили, що польська наслідуватиме чеську модель. Але це не так: попри генеалогічне дерево, правила множини в польській збігаються з правилами в українській, її східнослов'янській родичці. «Двадцять один крок» польською — це „21 kroków”, а українською — «21 крок»: множина в одній мові та однина в іншій, і це у двох мовах, які схожі майже в усьому іншому. Це універсальний урок: перевіряйте граматику, а не мовну сім’ю. Спорідненість мов — це лише орієнтир.

У французькій мові форма множини з’являється лише на мільйоні. Не «близько мільйона», а рівно на 1 000 000, 2 000 000 і так далі. В усіх інших випадках французька поводиться так само, як англійська. Тепер ми це врахували, і я сподіваюся, що колись користувач із круглим мільйоном слів на балансі це помітить.

Ще одна пастка з цього розділу, спеціально для інженерів: код української мови — uk, а не ua. ua — це код країни, і якщо ви його використаєте, механізм обробки множини не видасть помилку; він просто застосує правила британської англійської, і все описане вище повториться знову. На ці ж граблі можна наступити з чеською (cs, а не cz) та данською (da, а не dk).

«Воркфлоу» чи «робочий процес»: термінологія — це сукупність рішень

Найскладнішими виявилися зовсім не граматичні проблеми. Це були справжні баталії за окремі слова.

Візьмімо workflow. В українській мові є власна калька («робочий процес», буквально «working process»), і саме її запропонує словник. Але перекладачі, які днями безперервно «живуть» у цій програмі, не кажуть «робочий процес»; вони кажуть «воркфлоу» — це запозичення, так само як англійська свого часу ввібрала в себе rendezvous. Ми довго вагалися, але зрештою зупинилися на запозиченні. Тепер текст звучить так, як насправді спілкуються в індустрії.

Або візьмімо Memory — назву нашої власної функції. У німецькій локалізації ми зазвичай залишаємо кілька термінів англійською: Credits, Translation Memory. Для німецького фахівця це звична професійна лексика, як-от Update чи Login. Тож коли українська успадкувала той самий список неперекладних термінів, «Translation Memory» так і лишився англійським посеред кириличних речень, і це справляло враження, ніби його просто забули перекласти. Латинка в кириличному тексті одразу впадає в очі. Гірше того, українська — флективна мова: «Пам'ять» має відмінюватися, підлаштовуючись під структуру речення, а неперекладений англійський іменник на це не здатний. Ми виправили це на «перекладацька пам'ять» і зрозуміли, що список термінів без перекладу — це рішення, яке приймається окремо для кожної мови. Китайська підтвердила цю тезу з іншого боку: там перекладається геть усе (翻译记忆库 — для Translation Memory, 术语库 — для glossary, 工作流 — для workflow), і лише назви самих продуктів залишаються латинкою.

Увесь наш продукт побудований на цьому уроці: термінологія — це накопичувана сукупність рішень та їхніх обґрунтувань. Одне слово — бо так кажуть в індустрії, інше — англійською, бо це бренд, а ще інше — перекладене, бо того вимагає система письма. Прийміть рішення один раз, зафіксуйте причину — і кожен наступний документ його успадкує. Саме для цього насправді й потрібен глосарій, і саме тому ми сприймаємо перекладацьку пам'ять як контекст для прийняття рішень, а не просто як купу схожих речень.

Споріднені мови розходяться в усьому

Якщо множина була екскурсією граматикою, то типографіка стала туром з етикету, а найголовніший урок полягав у тому, що між мовами-сусідками нічого не переноситься.

Французька вимагає ставити пробіл перед кожною двокрапкою, крапкою з комою, знаком оклику та знаком питання (і то нерозривний, s'il vous plaît), а цитати бере в « лапки-ялинки з внутрішніми пробілами ». Іспанська, її пряма сусідка, робить усе навпаки: розділові знаки стоять впритул, лапки щільно прилягають до тексту «ось так», а запитання обов’язково починаються з перевернутого знака. ¿ та ¡ — це непорушне правило граматики.

Італійська підкинула нам найтонший нюанс. В офіційній італійській ввічливі займенники (Lei, Suo, Sua) пишуться з великої літери — зокрема й для того, щоб відрізнити формальне «Ви» від написаного з маленької lei, що означає «вона». Це важило більше, ніж будь-де інде, адже в наших текстах ми постійно згадуємо Literess (яка є стовідсотковою lei) поруч із реченнями, де звертаємося до користувача як Lei. Одна велика літера тут виконує роль несучої конструкції для розрізнення значень. Італійська також порушила загальноприйняту логіку написів на кнопках: якщо у французькій та іспанській на кнопках зазвичай інфінітиви (Enregistrer, Guardar), то в італійській — чистий наказовий спосіб (Salva, Accedi). Це може здатися неформальним, хоча насправді це не так: просто така вже мова італійського софту.

Польська мова поставила перед нами проблему, з якою ми раніше не стикалися: її ввічлива форма має категорію роду. Німецьке Sie, французьке vous, іспанське usted — одна форма для всіх. У польській же ввічливе звернення — це Pan для чоловіка та Pani для жінки, ба більше — навіть дієслова минулого часу змінюються залежно від статі адресата. Ми не знаємо статі користувача і не маємо наміру вгадувати, тому польська версія продукту звучить так, як і належить якісному польському софту: через безособові конструкції («Zapisano» — збережено), приязний голос компанії від першої особи множини («Zapraszamy» — запрошуємо) та пряме звернення з використанням роду лише там, де цього справді неможливо уникнути.

Турецька, наша остання мова, здавалася простою (одне гендерно-нейтральне ввічливе siz, жодного граматичного роду), але потім виставила нам рахунок своєю орфографією. Велика літера для турецької i — це İ з крапкою, тому «iptal» (скасувати) з великої літери пишеться як «İptal»; а I без крапки — це вже інша літера й очевидна помилка. Назви мов пишуться з великої («Türkçe»), тоді як у романських та слов’янських мовах — з малої. Оскільки турецька — аглютинативна мова, навіть наші назви брендів, що не підлягають перекладу, відмінюються: відмінковий суфікс додається через апостроф, тож користувачі оновлюються до «Pro'ya» та імпортують у «Transept'e». Відмінюється сам бренд. Такого не знайдеш у жодному довіднику з i18n.

Китайська, для контрасту, стала уроком фізики: повноширинні розділові знаки(,。!?), ледь помітні пробіли на стику ієрогліфів та латиниці («使用 Transept 翻译») і текст, що виходить майже вдвічі коротшим за англійський. Після німецької, яка роздувається і ламає макети, китайська стискається, через що кнопки здаються завеликими. Ваш інтерфейс має витримувати обидві ці крайнощі.

«Зайці»: рядки, що взагалі не потрапили на переклад

У локалізації є особливий вид багів: рядок, який від самого початку навіть не потрапив у систему.

Повноту перекладу в нас контролює компілятор: якщо для якогось рядка бракує перекладу, збірка проєкту буквально не відбудеться. Але ця перевірка бачить лише ті рядки, які попросилися бути перекладеними. Бейдж, що відображає сире значення з бази даних (owner, прямо з enum), ні про що не просив. Він спокійно проскакував крізь кожну збірку, залишаючись англійським у всіх одинадцяти мовах, і був непомітним з однієї простої причини: поки застосунок був лише англомовним, захардкоджена англійська слугувала камуфляжем.

Перша ж сесія українського користувача виявила бейдж owner. Потім — мітки рівнів доступу у вікні спільного доступу. Далі — усю бічну панель коментарів: зо двадцять п’ять рядків, які ніколи не бачили шару перекладу. Потім — мітку для скринрідера тут, плейсхолдер там. Кожна нова мова ставала аудитом усього зробленого раніше: щойно навколишній текст перемикається на українську, кожен «заєць» спалахує, наче сигнальна ракета.

Випуск мовної версії — це не просто переклад, це перепис. Ви не знаєте, які з ваших рядків справжні, видимі та придатні для перекладу, доки друга мова не змусить кожного з них вийти на перекличку. Заплануйте цей етап аудиту в графіку, бо компілятор не врятує вас від рядка, який ніколи не просив про переклад.

Literess відмовилася бути самовдоволеною українською

Мій улюблений баг у всьому проєкті, власне, і не баг зовсім. Ми досі не можемо його до кінця пояснити.

Literess, наша штатна помічниця-редакторка (ви можете знати її з її власної статті), має в арсеналі сорок вісім настроїв. Її аватар реагує в процесі роботи: вона обирає вираз обличчя так само, як і слова — як частину відповіді. І її фірмовий образ — самовдоволений: та сама задоволена собою посмішка, з якою вона підловлює вас на помилці, яку ви проґавили.

Вона робить це в кожній мові. Самовдоволене «спіймала на помилці» в німецькій, французькій, китайській, польській. Потім ми перемкнули її на українську й відтворили ті самі ситуації, які всюди гарантовано викликали цю усмішку, — але вона ні в яку. Та сама модель, той самий промпт, той самий характер, ті самі сорок вісім настроїв у меню. В українській вона залишається щасливою або, щонайбільше, стає серйозною. Вона просто відмовляється бути самовдоволеною українською.

Наша найкраща теорія — та, яку запропонував би перекладач. В англійській слово smug може бути приязним: коли воно стосується мультяшної помічниці, яка щойно знайшла вашу помилку, це майже комплімент. В українській такого слова немає: найближчий еквівалент, «самовдоволена», — це завжди образа. Сухе, відштовхувальне самомилування, без жодного натяку на іронію чи шарм. І модель, яка думає українською, схоже, це розуміє. Формулюючи відповідь мовою, де приязного самовдоволення як концепту не існує, вона не звертається до нього і як до емоції. Це слово є в її словниковому запасі, але спротив проявляється в її поведінці.

Для мене це водночас і кумедно, і глибоко. Увесь цей допис був про рядки (множину, регістри, пунктуацію), і ось випадок, коли кожен рядок був правильним, а продукт усе одно змінився. Мова — це не просто оболонка, яку ви натягуєте на ШІ-продукт; вона скеровує модель, що в неї вбрана. Локалізувати агента означає перевірити її характер у кожній мові, на додачу до її міток: ви маєте особисто познайомитися з тим, ким вона є в кожній із них.

(До слова, мітки теж потребували уваги: наприклад, настрій content (у значенні «задоволений») ледве не потрапив у німецьку версію як «Inhalt» (контент як іменник), поки один рядок контексту не прояснив суть. Найменш витратний спосіб підвищити якість локалізації — це все ж таки речення, яке пояснює перекладачеві, чим насправді є цей рядок.)

Буденна сторона: hreflang, карти сайту та як не конкурувати з самим собою

Усе це не має значення, якщо сторінки ніхто не знайде, тож ось стислий огляд SEO-складової.

Щойно ви публікуєте одну й ту саму сторінку одинадцятьма мовами, Google за замовчуванням вважає, що ви випустили одинадцять майже ідентичних копій, які конкурують між собою. Механізм, що запобігає цьому, — анотація hreflang, і вона менш поблажлива за будь-який компілятор:

  • Вона має бути взаємною. Англійська сторінка посилається на німецьку копію, а німецька — у відповідь з ідентичним набором посилань, інакше Google проігнорує всю конструкцію. Односторонній hreflang — це не hreflang.
  • **x-default**** вказує на вашу канонічну версію**: резервний варіант для користувачів, чия мова не збігається з жодною із запропонованих.
  • Ніколи не додавайте анотації для сторінок, яких не існує. Якщо українська версія сторінки ще не опублікована, вона не отримує альтернативного посилання; «висячий» hreflang, що вказує на 404, — це гірше, ніж його повна відсутність. Це здається очевидним, поки ви не стикаєтеся з частково перекладеними розділами, і тоді це вимагає ретельного обліку: наші статті в журналі, наприклад, перекладаються по одній, тому кожна з них вказує лише ті мови, якими вона справді існує.
  • Карти сайту містять ті самі анотації. Ми структурували свої як індекс окремих карт сайту для кожної мови, що дало приємний побічний ефект — статистику індексування для кожної мови в Search Console: тепер можна спостерігати, як сторінки кожною мовою потрапляють в індекс окремо, і відразу бачити, якщо якась із них відстає.

Усе це — технічна база. Локалізація без неї просто розпорошує вашу авторитетність між одинадцятьма копіями, що конкурують одна з одною. Уся SEO-вигода від того, що ви звертаєтеся до користувача його мовою, залежить від того, чи розуміє Google, що це одна сторінка, а не одинадцять.

Що ми не довірили машинному перекладу

Попри весь висловлений вище ентузіазм щодо машинного перекладу, три речі ми свідомо тримали поза цим конвеєром.

Ці статті. Інтерфейс журналу (мітки, підписи авторів, навігація) перекладається машинним способом, як і все інше. Самі ж статті ми перекладаємо вручну, в Transept, власними силами. Розлогі тексти з авторським підписом — це саме той випадок, коли машинний переклад ще не дотягує до потрібного рівня, а переклад власних есеїв у нашому ж редакторі — це найчесніший спосіб тестування продукту, який ми знаємо. Версія цієї статті, яку ви, можливо, читаєте німецькою чи українською, пройшла через той самий редактор, глосарій та робочий процес перевірки, які ми продаємо.

Юридичні сторінки. Машинний переклад готує чернетки (із зафіксованими назвами компаній, адресами, датами та номерами пунктів), але «Умови використання» та «Політика конфіденційності» — це документи, що мають юридичну силу, тому для кожної мови їх перевіряє юрист. Помилка перекладу в маркетинговому тексті коштує балів за стиль; у контракті вона коштує реальних грошей.

Останнє слово в зонах довіри. Ціни, виставлення рахунків, автентифікація, електронні листи: їх обов'язково вичитує носій мови, перш ніж ми вважатимемо роботу над мовою завершеною. Саме так і має працювати MTPE: машина пише кожне слово, щоб люди могли витрачати свою дефіцитну й дорогу увагу лише на ті слова, що несуть ризики.

За всіма трьома рішеннями стоїть одна й та сама логіка: машинний переклад — це лише перший етап, а саме вміння визначити, де цього достатньо, і є ключовою навичкою локалізації. Десять мов за три дні стали реальністю лише тому, що ми точно знали, чого машині довіряти не слід.

Де кожне рішення стає пам’яттю

Погляньте на цей список. Офіційний чи розмовний стиль. «Воркфлоу», а не «робочий процес». Translation Memory англійською для німців, «перекладацька пам’ять» — для українців. Ввічливе Lei з великої літери, безособові конструкції в польській, апостроф перед турецькими суфіксами, особлива форма множини для круглих мільйонів. Асистент, який іронізує дев’ятьма мовами й навідріз відмовляється робити це десятою.

Майже нічого з цього не можна було просто знайти заздалегідь. Найважливіше тут — це рішення: вистраждані в дискусіях, прийняті й згодом застосовані до тисяч рядків і кожного майбутнього документа. Втратити таке рішення — означає знову платити за ту саму суперечку; зберегти лише результат без обґрунтування — означає, що наступна людина все одно почне оскаржувати його знову.

Зрештою, саме тому ми створили наш продукт таким, яким він є: перекладацька пам’ять як контекст для прийняття рішень, глосарії та гайди зі стилю як простір для узгодження стилістики й термінології, та редактор, чиє головне завдання — гарантувати, що жодне прийняте рішення не загубиться. Локалізація Transept стала першим досвідом застосування всієї цієї філософії до нашого власного продукту в повному масштабі. Інструментарій витримав. Викладені вище уроки — це те, що ми впроваджуємо в систему зараз, адже десять мов були лише репетицією, а не фіналом.

Автор

Mariia Ivakhnenko
Mariia IvakhnenkoСпівзасновниця

Співзасновниця Transept. Має три дипломи з англійської мови та літератури — Київ, Острава та рік у Зальцбурзі — і, як українка, більшу частину свого письменницького життя проводить англійською. Прийшла в AI як промпт-інженерка, потім займалася продуктовим маркетингом. Вона пише напіввигадані історії про реальних людей і постійно повертається до питання про те, що втрачається між мовами.