← Повернутися до статей
Web 2026-04-17 · rev. 2026-05-10 ProtoMedia

Сайт, який говорить десятками мов, без перекладачів

Автоматичний переклад з італійської · переглянути оригінал

Як ми побудували систему перекладу, яка працює під цими сторінками: ШІ за потреби, кеш завжди, нульове відчуття очікування.

Проблема традиційної i18n

Протягом багатьох років інтернаціоналізація веб-сайту була невеликою подорожжю робочих процесів: файли .po, людські перекладачі, забуті ключі, затримки розгортання, тому що "все ще не вистачає німецької". Додавання мови коштувало часу та грошей; додавання десяти було неможливим для будь-якої невеликої компанії.

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

Архітектура, коротко

Сайт обслуговується статично італійською мовою. Коли користувач обирає іншу мову, вступає в дію невеликий двигун на трьох колекціях MongoDB:

  • i18n_base: вихідні тексти обраною мовою (сьогодні італійською), кожен з декларацією власної мови, описом того, де і чому він з’являється на сайті (важливо для якості перекладу), тоном і лімітом символів. Цей опис стає частиною промпту до LLM, який таким чином знає, чи перекладає він кнопку чи параграф.
  • i18n_human: переклади, відредаговані вручну, коли для певної сторінки ми хочемо редакторську якість замість виводу LLM. Вони мають пріоритет над автоматичним кешем і автоматично «розмічаються», коли вихідний текст змінюється.
  • i18n_cache: вже згенеровані переклади, проіндексовані за (полем, мовою). Кожен запис зберігає часову мітку базового тексту на момент генерації.
  • articoli_i18n: та сама логіка, застосована до довших вмістів, таких як ця стаття.

При першому доступі новою мовою система запитує у LLM лише дійсно відсутні поля, зберігає відповідь у кеші та повертає її браузеру. При наступних відвідуваннях та сама мова прибуває миттєво, без додаткових викликів ШІ.

Недійсність, яка працює

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

Користувач, який не чекає

Найцікавіше — не переклад, а те, як він відображається. При зміні мови браузер бачить італійську сторінку з маленькими індикаторами завантаження біля кожного блоку тексту, який потрібно оновити. Спокуса — зробити один запит, який перекладе все разом: просто, чисто, і засуджує користувача чекати, поки LLM закінчить все, перш ніж побачити будь-які зміни.

Ми пішли в протилежному напрямку. Тексти групуються за секціями (navbar, body, footer) і розбиваються на мікро-пакети по три поля кожен. Запити відправляються послідовно: спочатку кілька полів navbar, які з’являються за кілька секунд — користувач бачить, що щось відбувається, і починає читати. Поки він читає, приходить перша частина тіла, потім друга, нарешті — footer.

Короткий урок: Відчутна швидкість – це не загальна швидкість. Перекладати частинами, у видимому порядку, важливіше, ніж закінчити першим.

Нічна робота

У кешу є лише один справжній ворог: перший візит. Перший німецький користувач платить ціну за всі майбутні переклади, і саме такий досвід залишається у нього в голові. Щоб усунути (або майже усунути) проблему, фонове завдання прокидається щохвилини, обирає найбільш очікувану мову серед тих, що ще не завершені, бере неперекладений текст і передає його LLM. Наступної хвилини – наступний. За кілька днів найпоширеніші мови вже будуть готові.

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

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

Що ви отримуєте

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

Ця ж сторінка, якщо ви читаєте її німецькою, іспанською чи корейською мовами, жодного разу не була написана перекладачем. Її було перекладено лише один раз, великою мовною моделлю (LLM), і з того часу вона обслуговується з кешу. Єдине, що написано вручну, це те, що ви зараз читаєте, якщо воно італійською.

Зацікавлені в тому, щоб впровадити цю архітектуру на своєму сайті? Давайте поговоримо.

Зв'яжіться з нами

Маєте зауваження? Напишіть нам

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

Поки ви пишете, ваш браузер вирішує просту математичну задачу – це наш спосіб захистити від автоматичних розсилок без сторонніх сервісів та captcha. Вам нічого не потрібно робити, і жодні дані не покидають цей сайт.