Одна стаття 19 мов: структура файлів, prompt перекладу, 5 реальних пасток, як POST за раз.
Офіційна документація Anthropic і OpenAI лише англійською. Це величезна прогалина у глобальній екосистемі контенту для AI-розробників. how2claude закриває цю прогалину — кожна стаття виходить одразу 19 мовами: zh / en / zh-TW / ja / ko / es / pt-BR / id / vi / tr / ar / fr / de / it / ru / uk / pl / he / th.
Наймати людей нереально (20 перекладів на статтю, кожен — кілька тисяч доларів). Віддати Claude — гранична вартість падає майже до нуля, але кинути через паркан «перекладай на японську» і отримуєш текст із явним присмаком машинного перекладу, де голос автора випарувався. Далі — повний потік, як робити це правильно: структура файлів, як писати перекладацький prompt, де Claude гарантовано спотикається, як відправити 19 мов плюс твіти по мовах на API одним POST.
Дві дуже різні речі.
Переклад переносить сенс з мови A на мову B — те, що робить Google Translate. Читається «правильно», але «пласко».
Локалізація зберігає регістр, ритм і технічний рівень автора, переписуючи «голосом тех-блогу» цільової мови. Результат читається так, ніби написано носієм.
Переклад для Claude — робота на 5 хвилин; локалізація вимагає, щоб у prompt було прописано:
Команда /write-article у how2claude несе стильову вимогу на кожну мову:
| Файл мови | Стильова вимога |
|---|---|
ja.md |
Тон тех-блогу, природна японська |
ko.md |
Тон тех-блогу, природна корейська |
zh-TW.md |
Тайванське слововжиток, традиційні ієрогліфи |
ar.md |
Сучасна стандартна арабська (письмова) |
id.md |
Стандартна індонезійська |
Виглядає як один зайвий рядок. Але для Claude це визначальне — без нього за замовчуванням виходить «підручниковий переклад».
Одна тека на чернетку, 20 файлів:
docs/drafts/let-claude-translate-articles/
├── meta.json # title + summary для всіх 19 мов
├── zh.md # китайська (джерело, пишеться першою)
├── en.md # англійська (перша хвиля перекладів)
├── zh-TW.md
├── ja.md
├── ko.md
├── ...(ще 14)
└── th.md
meta.json:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"title": {
"zh": "让 Claude 把一篇文章翻译成 19 种语言",
"en": "Letting Claude Translate One Article Into 19 Languages",
"uk": "Дати Claude перекласти одну статтю на 19 мов",
"...": "..."
},
"summary": {
"uk": "Одна стаття 19 мов: структура файлів, prompt перекладу, 5 реальних пасток, як POST за раз.",
"...": "..."
}
}
Перший рядок кожного файлу .md — # заголовок, решта — тіло. Title береться не з першого рядка md, а з meta.json — так у кожної мови заголовок — це окремо відточена коротка фраза, а не перша фраза статті, яка при перекладі могла розтягнутися.
Два неправильні потоки:
Неправильно: ланцюжок перекладів. zh → en → ja → ko → ...
Проблема: ja спирається на en, ko на ja — кожен стрибок втрачає крихту сенсу. До моменту th (тайська) — інформація через чотири руки.
Правильно: променевий переклад. Закрити zh → згенерувати en / ja / ko / ar / id / ... безпосередньо з джерела.
Кожна мова виходить прямо з оригіналу, без пересадок.
Структура prompt (упакована в /write-article):
Це стаття тех-блогу про X, джерело — китайська:
[повний zh.md]
Переклади на такі мови з вимогами по мові:
- ja.md: тон тех-блогу, природна японська
- ko.md: тон тех-блогу, природна корейська
- ar.md: сучасна стандартна арабська (письмова)
...
Правила:
1. Зберігай прямий, професійний, злегка самоіронічний регістр автора
2. Не перекладай блоки коду, команди, імена API, URL
3. Заголовки, підзаголовки, хід абзаців можна перекомпоновувати
4. Окремий title по мові — короткий, з гачком, не дослівний переклад вихідного заголовка
Перекладати 18 мов паралельно, одна сесія Claude — все. Один важливий момент: робити в одній сесії / на одній версії моделі — голос дрейфує між сесіями й поколіннями моделі.
X рахує CJK-символи (китайська/японська/корейська) суворіше. Я попросив Claude генерувати твіти з такими обмеженнями:
На першому проході три китайські твіти вилізли за ліміт (160, 164, 152). Claude дослівно переклав англійські твіти — англійський твіт на 260 символів китайською виходить якраз на межу.
Правило: китайські твіти треба переписувати, а не перекладати. Вимоги: стеля 140 символів, обов'язковий гачок, невелика втрата деталей припустима.
zh → zh-TW провокує лінь: прогнати через конвертер спрощеної в традиційну. Ієрогліфи збігаються, словник — ні:
| zh | zh-TW (неправ.) | zh-TW (прав.) |
|---|---|---|
| 文件 | 文件 | 檔案 |
| 信息 | 信息 | 資訊 |
| 软件 | 軟件 | 軟體 |
| 视频 | 視頻 | 影片 |
Коли просиш у Claude zh-TW, кажи обидві частини: «тайванське слововжиток, традиційні ієрогліфи». «Лише традиційні» дасть конвертацію ієрогліфів.
Арабська й іврит читають справа наліво. На стороні Rails потрібен <html dir="rtl"> і варіанти rtl: у Tailwind. Але й у самому перекладі є пастки:
unicode-bidi: isolate, інакше код «засмокче» у RTL-потік، замість ,, ؟ замість ?. Claude за замовчуванням ставить англійські знаки; треба явно прописати2026) всередині абзацу, що йде справа наліво. Браузери з цим справляються, але Claude у сирому тексті часто плутаєРозмовні звороти оригіналу («одним махом», «наступив на граблі», «улетів у молоко») Claude перекладає в японську/корейську за замовчуванням формальними письмовими формами (「一気に実装」「落とし穴」「失敗」) — сенс збігається, тон випаровується.
Лікування: прописати в prompt — «зберігай прямий, злегка самоіронічний, неформальний тон тех-блогу; не академізуй». Навіть так деякі мови (німецька, російська) сядуть трохи «формальніше» за джерело — самі мови мають bias до письмового регістру.
Рядки в коді діляться на дві корзини — UI-текст (перекладаємо) і плейсхолдери/імена змінних (ні):
t("pricing.page_title") # не перекладаємо (i18n key)
"user_id" # не перекладаємо (ім'я змінної)
"Monthly subscription" # показується в тексті як приклад → не перекладаємо
Для всього, що сусідить з кодом, «не перекладаємо» — безпечніше дефолт-рішення. Те, що справді треба перекладати, — це файли i18n locale (config/locales/xx.yml), і це окреме завдання.
/publish-article шле POST чернетки на how2claude.com/api/articles:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"thread": true,
"title": { "zh": "...", "en": "...", "ja": "...", ... },
"summary": { "zh": "...", "en": "...", ... },
"content": { "zh": "<md>", "en": "<md>", ... },
"tweets": { "en": ["...", "..."], "zh": [...], ... }
}
Один запит ~300KB (19 мов × ~15KB). Сервер розкладає в таблиці БД:
articles, title / summary / content — jsonb за ключем localex_queue_tweets, за locale + акаунтом, відправляється в чергу розкладуТвіти йдуть лише на locale з підключеним X-акаунтом (зараз en/zh/ja/ko/ar/id — 6). Мови без акаунта шлють []. Перевірка акаунтів:
Account.all.each { |a| puts "#{a.locale}: #{a.name}" }
# en: @how2claude
# zh: @howtoclaude
# ja: @how2claude_ja
# ko: @how2claude_ko
# ar: @how2claude_ar
# id: @how2claude_id
Дати Claude перекласти одну статтю на 19 мов — повний чек-лист:
dir="rtl" + варіанти rtl: Tailwind на стороні Rails. Змішана пунктуація й ізоляція блоків коду — окрема робота.Справжнє вузьке горло — не якість перекладу — моделі класу Claude 4 перекладають японською/корейською/арабською/російською майже на рівні носія. Вузьке горло — чи готовий ти поставити одну статтю перед читачами 19 мовами одночасно. Технічно це 5 хвилин. З точки зору контенту — готовність обслужити у 200 разів більшу аудиторію за раз.