Free

Дать Claude перевести одну статью на 19 языков

Одна статья 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.


Главное решение: перевод vs. локализация

Две очень разные вещи.

Перевод переносит смысл с языка A на язык B — то, что делает Google Translate. Читается «правильно», но «плоско».

Локализация сохраняет регистр, ритм и технический уровень автора, переписывая на «голосе тех-блога» целевого языка. Результат читается так, будто написано носителем.

Перевод для Claude — работа на 5 минут; локализация требует, чтобы в prompt было прописано:

  • Кто целевой читатель (разработчики, технические команды)
  • Эталонный регистр («звучит как такой-то блог»)
  • Термины, которые должны остаться на языке-источнике (имена API, названия фреймворков, команды, URL)
  • Где разрешено перекомпоновывать (разбивать длинные фразы, менять метафоры на те, которые узнает носитель)

Команда /write-article в how2claude несёт стилевое требование на каждый язык:

Файл языка Стилевое требование
ja.md Тон тех-блога, естественный японский
ko.md Тон тех-блога, естественный корейский
zh-TW.md Тайваньское словоупотребление, традиционные иероглифы
ar.md Современный стандартный арабский (письменный)
id.md Стандартный индонезийский

Выглядит как одна лишняя строка. Но для Claude это определяющее — без неё по умолчанию выходит «учебниковый перевод».

Структура файлов: 19 языков живут в одной папке

Одна папка на черновик, 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",
    "ru": "Дать Claude перевести одну статью на 19 языков",
    "...": "..."
  },
  "summary": {
    "ru": "Одна статья 19 языков: структура файлов, prompt перевода, 5 реальных ловушек, как POST за раз.",
    "...": "..."
  }
}

Первая строка каждого файла .md# заголовок, остальное — тело. Title берётся не из первой строки md, а из meta.json — так у каждого языка заголовок — это отдельно отточенная короткая фраза, а не первая фраза статьи, которая при переводе могла раздуться.

Поток: написать zh, потом раздать на 18 языков

Два неправильных потока:

Неправильно: цепочка переводов. 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 — всё. Один важный момент: делать в одной сессии / на одной версии модели — голос дрейфует между сессиями и поколениями модели.

5 мест, где реально ломается

1. Лимиты символов у твитов зависят от языка

X считает CJK-символы (китайский/японский/корейский) строже. Я попросил Claude генерировать твиты с такими ограничениями:

  • Китайские твиты ≤ 140 символов
  • Другие языки ≤ 280 символов

На первом проходе три китайских твита вылезли за лимит (160, 164, 152). Claude буквально перевёл английские твиты — английский твит на 260 символов в китайском выходит ровно на границу.

Правило: китайские твиты нужно переписывать, а не переводить. Требования: потолок 140 символов, обязательный крючок, небольшая потеря деталей допустима.

2. zh-TW — это не конвертация символов

zhzh-TW провоцирует лень: прогнать через конвертер упрощённого в традиционный. Иероглифы совпадают, словарь — нет:

zh zh-TW (неправ.) zh-TW (прав.)
文件 文件 檔案
信息 信息 資訊
软件 軟件 軟體
视频 視頻 影片

Когда просишь у Claude zh-TW, говори обе части: «тайваньское словоупотребление, традиционные иероглифы». «Только традиционные» даст конвертацию символов.

3. RTL-языки (ar, he) ломают вёрстку

Арабский и иврит читают справа налево. На стороне Rails нужен <html dir="rtl"> и варианты rtl: в Tailwind. Но и в самом переводе есть ловушки:

  • Блоки кода остаются на английском, но когда арабский абзац обёртывает блок кода, браузеру нужен unicode-bidi: isolate, иначе код «засосёт» в RTL-поток
  • Смешанная пунктуация: арабский использует ، вместо ,, ؟ вместо ?. Claude по умолчанию ставит английские знаки; надо явно прописать
  • Направление цифр: в арабском цифры пишутся слева направо (2026) внутри абзаца, идущего справа налево. Браузеры с этим справляются, но Claude в сыром тексте часто путает

4. Claude по умолчанию «выравнивает» голос автора

Разговорные обороты оригинала («одним махом», «наступил на грабли», «улетел в молоко») Claude переводит в японский/корейский по умолчанию формальными письменными формами (「一気に実装」「落とし穴」「失敗」) — смысл совпадает, тон испаряется.

Лечение: прописать в prompt — «сохраняй прямой, слегка самоироничный, неформальный тон тех-блога; не академизируй». Даже так некоторые языки (немецкий, русский) сядут чуть «формальнее» источника — сами языки имеют bias к письменному регистру.

5. Плейсхолдеры и переменные не переводятся

Строки в коде делятся на две корзины — UI-текст (переводим) и плейсхолдеры/имена переменных (нет):

t("pricing.page_title")        # не переводим (i18n key)
"user_id"                      # не переводим (имя переменной)
"Monthly subscription"         # показывается в тексте как пример → не переводим

Для всего, что соседствует с кодом, «не переводим» — более безопасное дефолт-решение. То, что действительно надо переводить, — это файлы i18n locale (config/locales/xx.yml), и это отдельная задача.

Публикация: один POST, 19 языков

/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 по ключу locale
  • таблица x_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 языков — полный чек-лист:

  1. Сначала зафиксировать zh (или en), потом лучевым образом раздать остальные 18 переводов из этого источника. Никаких цепочек.
  2. Стилевое требование по языку — в prompt. «Естественный японский» недостаточно — говорить «тон тех-блога, естественный японский».
  3. Переводить title и summary отдельно, не тянуть из первого абзаца тела. Все 19 title/summary централизованы в meta.json.
  4. Явно перечислить, что не переводится: блоки кода, команды, имена API, URL, i18n-ключи, имена переменных. Переводится: пояснительный текст, метафоры, структура абзацев.
  5. Твиты надо переписывать, а не переводить. 140 символов для китайского, 280 для остального. Буквальный перевод с английского на китайский всегда выходит за лимит.
  6. Для zh-TW говорить «тайваньское словоупотребление + традиционные иероглифы»; иначе получится только конвертация иероглифов, а словарь останется континентальным.
  7. RTL-языки (ar, he) требуют dir="rtl" + варианты rtl: Tailwind на стороне Rails. Смешанная пунктуация и изоляция блоков кода — отдельная работа.
  8. Отправлять все языки одним POST — 19 content + 19 title/summary + твиты для каждого подключённого аккаунта, один запрос в бэкенд.

Реальное узкое горлышко — не качество перевода — модели класса Claude 4 переводят на японский/корейский/арабский/русский почти на уровне носителя. Узкое горлышко — готов ли ты поставить одну статью перед читателями на 19 языках одновременно. Технически это 5 минут. С точки зрения контента — готовность обслужить в 200 раз большую аудиторию одновременно.