Мови віджета і письмо справа наліво
Для розробників, у коді: якою мовою інтерфейс віджета, привітання і відповіді, як вбудований словник і перекладач ділять роботу, і що дзеркалиться для арабської та івриту.
На будь-якій сторінці задіяні три мови, і вирішуються вони окремо.
| Що | Іде за | Вирішує |
|---|---|---|
| власний текст віджета — кнопки, підписи, поле вводу, контактна форма | сторінкою: <html lang> (pageLang) |
віддається локалізованим у GET /widget/config?lang= |
| привітання і FAQ-чіпи | теж мовою сторінки | текст власника для цієї мови, інакше переклад з базової мови власника |
| відповідь | повідомленням відвідувача | визначається на кожному повідомленні; кирилична мова відрізняється від сусідніх за літерами й словами; коротка відповідь усередині згоди зберігає мову розмови |
Мова відповіді ніколи не є мовою сторінки. Українське питання на англійській сторінці отримує українську, а мова, якої власник ніде не вказав, усе одно отримує відповідь нею.
Звідки беруться рядки інтерфейсу
GET /widget/config віддає strings — мапу { ключ: текст } фіксованого тексту віджета,
локалізовану для lang. Три шари, від найдешевшого: вбудований словник для 17 мов (без виклику
моделі), кеш попередніх перекладів і переклад на вимогу для будь-якої іншої мови. Сторінка може
перевизначити окремі ключі в ShukaiConfig.strings — але це замінює всю мапу з сервера, тож це
для навмисної зміни слова, а не для локалізації.
Ключі: composer.placeholder, composer.label, send, launcher.open, teaser.dismiss;
voice.input.start / .stop / .listening / .denied / .error; language.label,
language.search, language.group.browser / .site / .common; conversation.listening,
.idle_hint, .muted_talking, .held; confirm.accept, confirm.decline, confirm.press,
confirm.dontPress; handoff.label (+ .whatsapp / .telegram / .viber / .email),
handoff.menu, .contact, .comment, .send, .disclaimer, .invalid, .sent, .sent_to,
.sending, .error, .form_title, .or, .dismiss; companion.ai_label, .back, .close,
.conversation, .delete_conversation, .dismiss, .history, .mic_paused, .more,
.new_conversation, .stop, .talk; error.limit, error.generic, error.unavailable.
Чіпи згоди (confirm.*) — виняток із правила «інтерфейс іде за сторінкою»: це питання всередині
розмови, тож вони приходять мовою відповіді, з кадром done як confirm_strings, лише коли
згоду притримано.
Справа наліво
Коли <html lang> — RTL-мова (ar, he, fa, ur, ps, sd, ug, yi, dv, ckb),
віджет пише data-dir="rtl" на свій корінь, і його текст читається справа наліво. Власний атрибут
dir сторінки не враховується: англійський віджет на дзеркальній сторінці лишається зліва направо.
| У RTL-мові | |
|---|---|
| бульбашки, картка, тизер, контактна форма, FAQ-чіпи | текст починається справа; ✕ переходить ліворуч |
| поле вводу | поле починається справа, «Надіслати» — зліва |
| де стоїть віджет | без змін — кут власника, перетягування відвідувача, бік, у який відкриваються бульбашки |
| повідомлення | читається в напрямку свого тексту, у будь-якому віджеті (dir="auto") |
| код усередині повідомлення | зліва направо, у будь-якому віджеті — дужки й слеші зберігають порядок |
До віджета зліва направо нічого не додається: кожне правило дзеркалення обмежене
.root[data-dir="rtl"]. Дві примітки тим, хто стилізує віджет сам: віддавайте перевагу логічним
властивостям (padding-inline-start, text-align: start) у правилах ::part() і власному CSS,
щоб вони йшли за напрямком; і правила відступів для RTL специфічніші за простий селектор, тож
правило custom_css на кшталт .sa-bubble { padding: … } стосується лише LTR-відвідувачів —
значення для RTL пишіть як .root[data-dir="rtl"] .sa-bubble { … }.
Ще не дзеркалиться: бік підпису кнопки запуску, порядок списку вибору мови, порядок полів контактної форми.
Голосовий бік
Яку мову слухає мікрофон — справа позначки мови мовлення (Голос); який голос
читає відповідь, обирається на сервері для кожної мови, спершу за перевизначеннями власника. 49
мов сьогодні мають голос; точний список — GET /stt/languages.