Як ми переклали Calendly українською для здоровʼя співвітчизників

Усі статті, обговорення, новини про Mobile — в одному місці. Підписуйтеся на телеграм-канал!

Всім привіт. Я Олександр, Full Stack інженер, і вже 4 роки працюю в продуктовій студії Railsware на проєкті Calendly. Сьогодні хочу розказати про те, як ми переклали інтерфейс цього сервісу для бронювання зустрічей українською, щоб допомогти внутрішнім переселенцям з отриманням медичних послуг — і мимохіть сприяли українізації вітчизняних бізнесів. Поїхали.

Трохи передісторії

Рік тому ми долучилися до проєкту DoctorOnlineUA, ініційованого Буковинським державним медичним університетом. Це платформа, на якій медики різних спеціальностей проводять безоплатні онлайн-консультації для українців, що опинились далеко від дому та не мають доступу до медицини.

Головний елемент функціональностей — бронювання часових слотів для консультації з лікарем. Для цього ми обрали сервіс Calendly, над яким у Railsware працюють практично від його народження. Лишилася «дрібничка»: локалізувати його для українськомовних користувачів.

Залучаємо Calendly та колег

Зі зрозумілих причин задача була терміновою. Тому для реалізації проєкту ми створили мінімалістичну цільову сторінку, що спрямовує користувачів на сайт Calendly після вибору необхідного фахівця. Там і відбувається безпосереднє бронювання.

Ми давно тісно спілкуємося і співпрацюємо з командою Calendly, а керівництво компанії з розумінням поставилося до подій в Україні та надало безоплатний доступ саме для DoctorOnlineUA. Утім, українського інтерфейсу цей сервіс ще не мав. Це створювало складнощі для наших співгромадян, адже англійською володіють не всі, а користуватися підготовленою нами інструкцією для українськомовних не зовсім зручно.

В пригоді стали корпоративні культури Calendly та Railsware. Обидві ІТ-компанії цінують ініціативність та творчу свободу, а в Calendly навіть двічі на рік проходить внутрішній хакатон Innovation Expo. Там будь-хто з колег незалежно від позиції може запропонувати ідею для продукту і втілити її, залучаючи інших. І якраз перед квітневим Innovation Expo у мене і виникла ідея перекласти інтерфейс Calendly українською у рамках цієї події.

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

Оскільки захід триває лише 2 дні, ми розуміли, що наш переклад не буде професійним, а перекласти все ми фізично не встигнемо. Головним завданням на тому етапі було переконати менеджмент Calendly, що наш задум важливий та що його можна швидко реалізувати без залучення значних ресурсів. Далеко не всі ідеї з хакатону отримують «зелене світло», тому ми переймалися за успіх.

Сприяло, зокрема, те, що Calendly — глобальний продукт і команда чудово розуміє важливість локалізації. Наразі є повноцінні версії англійською, французькою, іспанською, німецькою та португальською мовами. Додатково є переклади букінг флоу італійською та нідерландською.

Зазвичай, для локалізації Calendly залучають контракторів. Але нам це не підходило. По-перше, обсяг роботи був досить великий, а бюджет не хотілось витрачати, як і час для онбордингу підрядників. Тому, поговоривши з колегами у Railsware, вирішили залучити нашу маркетингову команду, де є чимало українськомовних контент-райтерів. Їх, до того ж не потрібно було довго онбордити.

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

Обираємо інструмент

Для початку потрібен був інструмент, де легко працювати спільно й вносити правки. Зазвичай в Calendly для перекладу використовуємо Crowdin — український продукт, родом з Тернополя. (Не можу не додати, що пишаюся тим, що в Україні створюють круті продукти, які використовуються всюдисвітно).

Зазвичай, логіка процесу така:

  • Коли ми додаємо нові фічі до продукту і нам потрібно їх перекласти, ми підключаємо контракторів через Crowdin.
  • Переклади — це, по суті, набір YML-файлів, по одному на кожну мову для кожного компонента нашого застосунку. Ми розробили спеціальний скрипт, який дозволяє нам виділяти слайс (частину) YML-файлу вихідної англійської локалізації, яка потребує перекладу, і завантажувати в Crowdin тільки її.
  • Таким чином, підрядники отримують бранч в Crowdin, де є тільки нові рядки для перекладів.

У нашому випадку було складно оперативно підключити контент-райтерів з Railsware до проєкту через бюрократичні нюанси на боці клієнта. Тому ми взяли наші скрипти та використали їх разом з новим проєктом в окремому Crowdin замість звичного в Calendly.

Далі — організували онбординг-зустріч, де швидко розповіли команді, що треба робити та як працювати з Crowdin, а також розподілили обсяг між райтерами.

Труднощі перекладу

Ми очікували, що ключові виклики для локалізації будуть з технічної точки зору. Утім, виявили і кілька лінгвістичних задач із зірочкою. Розкажу про кілька з них.

Відмінювання місяців

Назви місяців зустрічаються дуже часто в Calendly — і на противагу англійській мові, в українській вони відмінюються. Тож, якщо на екрані вибору дати консультації у вас написано просто «лютий», то обираючи слот, ви вже бачите повну дату і назву місяця у родовому відмінку.

Фронтенд та бекенд — дві окремі задачі

Окрім перекладу інтерфейсу, який реалізовано як типовий React-застосунок, ми мали перекласти повідомлення, які відправляються під час бронювання зустрічей. Через це задачу з форматування дат потрібно було вирішити двічі — у двох різних фреймворках на різних мовах (Javascript і Ruby).

Фронтенд

На фронтенді для перекладу дат ми використовуємо moment.js. Додатково юзаємо плаґін moment-strftime. Він дозволяє використовувати функціональність бібліотеки moment, але через інший інтерфейс, що нагадує класичний інтерфейс функції strftime в різних мовах. Така схема працювала в нас раніше, щоб зробити формат дат максимально схожим на фронтенді й на бекенді.

Наприклад, англійською мовою формат дати був таким: «Monday, February 27». Ми зупинилися на тому, що українська версія має виглядати як «понеділок, 27 лютого».

Якщо подивитися приклади з документації moment.js, то побачимо, що там немає варіанту, щоб отримати рядок «27 лютого». Серед них є окремий розділ, присвячений локалізації, — Multiple Locale Support, з форматами, що починаються на літеру «L».

Але річ у тім, що серед цих форматів є варіанти штибу «27 лютого 2023 р.», або «27 лют 2023 р.», але таких, як ми хочемо, немає.

Спочатку думали навіть про те, щоб діставати «27 лютого» з цього рядка. Крім того, розширення moment-strftime саме собою не підтримує більшість з цих локалізованих форматів, і його довелося б патчити. Коротко кажучи, забагато складнощів заради однієї мови.

Тому спеціально зроблені для локалізації формати ми відкинули, як хибний напрямок. Але як ви бачите, moment все ж уміє відмінювати місяці. З’ясувалося (хоч це неочевидно і не задокументовано), що якщо обрати формат день + повна назва місяця «D MMMM», то назва місяця починає відмінюватися. Тобто, такий формат і створює дату вигляду «27 лютого». Відповідно, це було дуже легко зробити за допомогою moment-strftime як «%e %B», і не потребувало змін у будь-яких сторонніх бібліотеках.

Бекенд

На бекенді все виявилося значно складніше за фронтенд.

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

Бекенд в Calendly написаний на Ruby on Rails. Утім, ми не знайшли інструментів для Ruby, які б вміли правильно відмінювати дати українською та іншими мовами.

В смс це не має великого значення, оскільки ми намагаємося робити їх якомога коротшими, щоб не переплачувати за довжину повідомлення. Ми й в інших мовах використовуємо скорочення, тому в смсках нас влаштував варіант «Пн, 27 Лют». Оскільки в Ruby використовується форматування дат за допомогою форматів strftime, це відповідає формату «%a, %e %b».

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

Приклад мейлу, який отримує користувач після бронювання

Приклад смс

AM/PM

Для користувачів з Європи ми за замовчуванням використовуємо 24-годинний формат. Але продукт підтримує 12-годинний формат часу, відомий за позначками AM/PM.

Насправді складно уявити, щоб хтось в Україні або серед українськомовних користувачів обрав 12-годинний формат. Але хто зна? Можливо, якийсь сервіс для українців Канади вважатиме це доречним.

Хай там як, хоч ця проблема і специфічна, така функціональність присутня в продукті, тож маємо її перекладати. Як краще локалізувати AM/PM? Твіттер, приміром, перекладає їх як ДП/ПП. Навряд чи це зрозуміліше для більшості користувачів ніж звичні позначки.

Виявилося, що moment.js підійшов до цієї проблеми досить цікаво. В українській локалізації режим AM/PM перекладається як чотири частини дня — ніч, ранок, день і вечір. Тобто 9 PM за замовчуванням в moment.js перекладається як «9 вечора». Це та поведінка, яку ми отримали з коробки.

Але, на жаль, хоча підхід і цікавий, в нашому продукті та випадку це скоріше вносить непорозуміння, ніж допомагає. Тому вирішили просто вимкнути цю поведінку і показувати AM/PM, так само як і іншими мовами. Тоді ризик, що хтось не зрозуміє позначку, стає значно меншим. На щастя, moment.js дозволяє вносити зміни в локалі через інтерфейс бібліотеки, тому це було нескладно зробити:

moment.updateLocale('uk', {
  meridiem: undefined
})

Підбір термінів

Доволі поширена проблема в перекладі ПЗ: треба перекласти термін, який не має прямого відповідника в цільовій мові. Наприклад, слово «Issue» в Jira або на GitHub може перекладатися як «Завдання», або як «Проблема». Але так ніхто не каже, і ми всі звикли до варваризмів штибу «Jira-тікет» та інших.

В Calendly так само зустрічаються слова, які викликають складнощі перекладу. Один з основних термінів в Calendly — слово «Event». Як його краще перекласти? Словники пропонують термін «Подія». Але що це насправді таке з точки зору продукту? «Івентом», який бронюють користувачі платформи, насправді може бути запис до лікаря, співбесіда, консультація, онлайн-тренування тощо.

Звісно, якщо ви нарешті записалися до лікаря після того, як відкладали це роками, то це дійсно подія у вашому житті. Утім, ми вирішили, що цей термін не дуже пасує тому сенсу, який несе термін «Event» в Calendly. І ми переклали «Event» як «Зустріч», хоча це і не є безпосередньо перекладом.

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

Результати

Остаточно зібрати все, перевірити, обговорити та вирішити усі корнер-кейси нам вдалось у травні. Тобто, локалізація, над якою працювали паралельно з іншими задачами, забрала 6-7 тижнів — українською переклали близько 1200 рядків. Уже в червні все запрацювало на продакшені.

Нам дуже допомогло те, що в цьому процесі брали участь люди, обізнані з продуктом і значенням тих чи інших термінів. Якщо таку роботу віддавати підрядникам, на їхній онбординг іде більше ресурсів. Також складніше перевірити розуміння ними контексту, в якому все це буде використовуватися (інакше ж можна, умовно, отримати на виході «Jira-квитки»). Тим більше якщо вони перекладають на незнайомі нам мови, — ви просто не зможете перевірити якість.

З українською локалізацією все інакше. Навіть якщо наступні переклади робитимуть контрактори, ми маємо українськомовних розробників в команді, які проконтролюють та переконаються в тому, що переклад зрозумілий. Тому можемо вже впевнено сказати, що український переклад є одним з найякісніших в Calendly.

Оскільки українська локалізація стала доступна широкому загалу, а не лише проєкту DoctorOnlineUA, нам стало цікаво, чи багато користувачів оберуть її для себе. Ми поставили аналітику і з’ясували, що попри відсутність будь-якого промоушна та реклами, чимало українських бізнесів, які користуються Calendly, перейшли на українську версію. Наразі українською версією користуються приблизно стільки ж клієнтів, скільки й італійською. І це напрочуд приємно.

👍ПодобаєтьсяСподобалось15
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Чудова стаття, дякую! Також колись писала статтю щодо викликів, з якими зустрілася наша команда, і завжди було цікаво, а що ще потенційно може бути challenging при перекладі українською. І ось ваша стаття<3 Особливо дякую, що детально розписали як ви вирішили питання з відмінюванням місяців і підсвітили проблему з 12-годинним форматом.

Якщо б я уявив себе таким, що не розуміє англійської і взагалі на «Ви» з додатками, то мене б збентежило «EEST» чи навіть «східноєвропейський час». Краще, щоб було «9pm local time», «9pm за місцевим часом».

Є таке, а з іншого боку американський користувач з великою ймовірністю знає різницю між EST та EDT. Нажаль на рівні перекладу це не вирішити. Local time не підходить, бо є можливсіть ручного вибору таймзони. Власне тому вона взагалі вказується

Ішов 2023 рік, розробники продовжували паритися з локалізацією дат...:(
До речі, ДП/ПП — це ще від «Ну постривай» та інших «електронік», яких клонували в т. ч. у нашій Вінниці. Там 12-годинний формат, НЯР, був прошитий у схему, яку клонували цілком без змін, а на екрані вже відповідні сегменти зробили потрібної форми. Якби ж розробляли «у нас» від початку — швидше впровадили б 24, як на вокзальних годинниках без батарейок.
Issue — зазвичай «питання», але треба дивитися в контекст. Мав із цим регулярні issues під час локалізації. А в технічному плані — софт від англомовних розробників дуже погано пристосовується до того факту, що в нас числа узгоджуються з різною формою множини, а такі як 21, 31 тощо — взагалі з одниною. Це треба фактично в коді прописувати, а без цього — хіба скорочувати.

Круто!
Сподіваюсь що скоро зможемо і додаток перекласти. Буду це пушити:)

Підписатись на коментарі