Открытый исходный код

Клод Переводчик

Статическая локализация сайта — перевести созданный сайт на десятки языков в виде настоящих статических страниц, не перерисовывая его и не нарушая основные веб-показатели. Бесплатный, самостоятельный, AGPL-3.0.
Нет аккаунта Никакого API-ключа от нас Работает и на локальной модели

Посмотреть все функции

Это трубопровод, который работает www.conveythis.com сам по себе — 238-страничный сайт Astro, работающий на 55 языках. Мы извлекли его, задокументировали все виды отказов, которые нам пришлось обнаружить, и опубликовали все это. Это не пробный период и не тизер: нет ключа для покупки, нет квоты и нет учетной записи.

Two design decisions

Как это работает

Два решения определяют это. Во-первых, переводы вставляются в созданный HTML с помощью смещения байтов, и документ никогда не сериализуется повторно из DOM —, поэтому встраиваются критически важные CSS, элемент LCP, хэши активов и width/height атрибуты, которые удерживают CLS, остаются нетронутыми. То есть почему Страницы локали соответствуют исходному языку Core Web Vitals, а не просто напоминают его. Во-вторых, единицей перевода является весь блок, а не текстовый узел, поскольку примерно пятая часть текстовых узлов типичного сайта разделена встроенной разметкой, а перевод фрагментов по отдельности нарушает грамматику любого языка, который меняет порядок или склоняется.

The result is proved rather than asserted: eight gates and an exhaustive SEO audit over every page, including one gate that exists purely because coverage metrics are structurally blind to extraction bugs.

Verification

Действительно ли это так?

Справедливый вопрос, и его можно проверить, а не верить нам на слово. doctranslator.com/fr — крупный сайт Astro, французские страницы которого были созданы с помощью этого конвейера. Сравните его с английским оригиналом, и наценка будет такой байт-идентичный:

2,743

теги в одинаковой последовательности

2,031

атрибуты класса, все совпадают

+0.74%

вес страницы — французский длиннее

Ничего структурно не изменилось, поэтому браузеру нечего выложить по-другому. Проверьте сами — это займет около десяти секунд:

оболочка
curl -s https://doctranslator.com/   | grep -o 'class="[^"]*"' > en.txt
curl -s https://doctranslator.com/fr | grep -o 'class="[^"]*"' > fr.txt
diff en.txt fr.txt && echo "markup identical — only the text changed"

И оценки

Английский источникФранцузский, из этого инструментаA11y / Лучшие практики / SEO
Рабочий стол100100100 / 100 / 100
Мобильный9898100 / 100 / 100

Показатели эффективности PageSpeed Insights, измеренные 25 августа 2026 г. Доступность, лучшие практики и SEO были на 100% при каждом запуске обеих страниц в обеих стратегиях.

Это намеренно медианы. Рейтинги Lighthouse меняются: пять последовательных запусков одной и той же мобильной страницы на английском языке дали результаты 98, 98, 88, 98, 98, при этом краска с наибольшим содержанием колебалась между 1,8 и 3,2 с. Это дисперсия сети и CDN, а не качество страницы. Если вы измерите один раз и получите 91, вот почему — запустите его несколько раз и сравните два языка друг с другом, а не с числом на маркетинговой странице.

And the language

Markup identity is measurable. Whether the Spanish is any good is a different question, and until 2.0 the pipeline had no answer to it — the tests checked request shapes and scaffolding, and nothing scored a translation.

оболочка
node scripts/i18n/tqa.mjs --lang es --dry      # sample size and cost, no API call
node scripts/i18n/tqa.mjs --lang es,fr,de     # scorecard + per-locale JSON
node scripts/i18n/tqa.mjs --lang es --repeat  # judge the same sample twice

It scores a stratified sample on the MQM error typology at its conventional weights — minor 1, major 5, critical 10 — and weights the sample by how often each string appears, so the header everyone reads counts for more than a one-off footnote. Three things keep the number from being decorative:

The judge is a different model from the translator
Models score their own output generously. If no second provider key is configured it uses the same one and says so, in the run and in the report.
The sample is seeded, and the variance is reported
A seed reproduces a score exactly; --repeat scores the same sample twice and prints the gap. A quality number nobody can re-derive, quoted without its noise, is a marketing number.
A unit the judge cannot assess is excluded, not counted as clean
An early version printed 100.00 out of 100 from a sample where every single unit had failed to parse. It now refuses to report a score at all in that case.

Read it as a comparison — between locales, between models, before and after a prompt change — not as a grade. It is one model’s assessment of another’s work rather than a human review, and the report says so on its face.

Decision three

Terminology is not a per-sentence choice

Identical strings were always consistent — units are keyed by a hash of the source text, so a nav label translated once is reused on every page and across runs. What that cannot do is hold a term inside varying sentences: “Dashboard” in two different paragraphs is two hashes, two batches, two stateless requests, and nothing compared them.

glossary.json
[
  { "source": "Acme",      "rule": "keep",      "matchCase": true },
  { "source": "Dashboard", "rule": "translate",
    "targets": { "es": "Panel de control", "de": "Übersicht" } }
]

matchCase is the answer to a question we were asked directly: can it tell Apple the company from apple the fruit? A flat list of names cannot express that. Whole-word, case-sensitive rules can.

sourcespanishпочему
Apple announced a deviceApple anunció un dispositivocapital A — protected, and now verified
An apple a dayUna manzana al díalowercase — translated normally
Applesauce is on saleLa compota está en ofertawhole-word — never matches inside a longer word

The same release tells the model what a string is. It used to receive the text and nothing else, so a button label and a body paragraph were indistinguishable — which made the prompt’s own instruction to keep button labels short unenforceable. A <button>, a heading, a form label and a meta description now each say so.

It deliberately does not demand the imperative for buttons: German UI prefers a verbal noun and French the infinitive, so it asks for whatever construction that language actually puts on a button. Brand names you already list are folded in automatically as case-sensitive keep rules, which also brings them under a verification gate that checks they survived. Nothing checked that before.

Locale conventions

Numbers get localized. Prices never get converted.

Writing 1,234.56 to a German reader is one of the most visible marks of a machine translation. Models are unreliable at separator conventions, so the model is told to leave numbers alone and Intl reformats them afterwards, deterministically.

sourcebecomeswhere
1,234.561.234,56de
1,234.561 234,56fr
$55,00 $USfr — placement and spacing, not the amount
50%50 %fr — with a non-breaking space

It formats. It never converts.

no config option for it

A price is a commercial commitment, and converting one at a rate baked into a build — stale the day after it is written — is how a translation tool starts publishing wrong offers in markets nobody is watching. Every monetary amount found is written to a report instead, so a human prices each market deliberately.

A numeric-integrity gate backs that up by failing the build if a number’s value changes between source and translation. A model that quietly ships $39 where the source said $49 passes every other check: identical markup, matching placeholders, plausible length, fluent Spanish.

Deliberately left alone: version numbers, times, IP addresses, ISO dates, phone numbers and any ungrouped number — during development a greedy pattern turned 192.168.1.1 into 1.921.681,1, and that case is now a test. One result that looks like a bug and is not: Spanish does not group four-digit numbers, so 1,234.50 is correctly 1234,50 in es и 1.234,50 in de.

Honest routing

Какой из них вам на самом деле нужен?

Статическая замена и уровень времени выполнения решают различные проблемы. Выбор неправильного варианта обойдется вам в выходные, поэтому вот честный выбор.

У вас есть статическая сборка, контент меняется с частотой выпуска, и вы хотите полностью владеть HTML.

Клод Переводчик

Бесплатно, самостоятельно размещено, AGPL-3.0. Ваш собственный ключ API, ваши собственные файлы, никакой учетной записи.

Посмотреть на GitHub →

Ваш контент меняется ежедневно, находится в CMS, создается пользователями или находится за входом в систему или оформлением заказа.

ConveyThis

Управляемый уровень времени выполнения. Никаких этапов сборки, никаких повторных запусков при каждом редактировании, визуальный редактор и человеческий обзор.

См. цены →

Вам нужно перевести документы, а не страницы — PDF, DOCX, XLSX, PPTX.

DocTranslator

Сохранены целые файлы, макет и таблицы, 100+ языков.

Перейти к DocTranslator →

Quickstart

Установите его

Репозиторий

https://github.com/ConveyThis/claude-translator

AGPL-3.0 · Узел ≥ 20 · одна зависимость (parse5) · открыть на GitHub →

Вам нужно

  • Node.js 20 или новее
  • Сайт, построенный на статическом HTML — он считывает выходные данные вашей сборки, а не ваш источник
  • Ключ API для любой выбранной вами модели — или вообще нет, если вы запустите его локально

Как навык Клода Кода

Клонируйте его в свой каталог навыков, а затем попросите Клода локализовать сайт. Он следует прилагаемым инструкциям, включая режимы отказов, поиск которых обходится нам в реальные деньги —, а также правила, когда это совершенно неправильный инструмент.

оболочка
git clone https://github.com/ConveyThis/claude-translator.git \
  ~/.claude/skills/claude-translator

В любом проекте

Одна команда. init копирует конвейер в scripts/i18n/, пишет конфигурацию, объявляет parse5 и добавляет производное i18n/ пути к вашему .gitignore. Он никогда ничего не перезаписывает без --force, и он печатает каждый файл, к которому прикасался.

оболочка
cd your-project
npx claude-translator init
npm install                       # parse5, the only dependency

Скрипты попадают в ваш репозиторий, а не остаются там node_modules намеренно — они определяют пути из проекта, в котором находятся, они достаточно короткие для чтения, и лицензия существует, поэтому вы можете их изменить.

Установка без npx
оболочка
git clone https://github.com/ConveyThis/claude-translator.git
cp -r claude-translator/scripts  your-project/scripts/i18n
cp claude-translator/i18n.config.example.json your-project/i18n.config.json
cd your-project && npm install --save-dev parse5

Настроить

Наименьшая запущенная конфигурация. buildDir это место, где ваш генератор пишет HTML; baseUrl это ваше каноническое происхождение, без завершающей косой черты.

i18n.config.json
{
  "buildDir": "dist",
  "baseUrl": "https://example.com",
  "provider": "anthropic",
  "glossary": "glossary.json",
  "locales": [
    { "hreflang": "es", "pathCode": "es", "nativeLabel": "Español" },
    { "hreflang": "de", "pathCode": "de", "nativeLabel": "Deutsch" }
  ]
}
оболочка
echo "ANTHROPIC_API_KEY=your-key-here" >> .env   # and gitignore it

Запустите его

npm запустить сборкуваша обычная сборка — только исходный язык
сценарии узлов/i18n/extract.mjsнайдите каждую переводимую единицу
скрипты узлов/i18n/translate.mjs --lang es,frперевести в память
сценарии узлов/i18n/build-locales.mjs --lang всенапишите локализованные страницы
скрипты узлов/i18n/verify.mjs --lang всеeight gates — exits non-zero on failure
скрипты узла/i18n/audit-seo.mjsканонические, hreflang, JSON-LD, карты сайта
node scripts/i18n/tqa.mjs --lang es --dryoptional — MQM quality score, cost first

Затем разверните каталог сборки точно так же, как вы развернули его сегодня — локализованные страницы — это обычные файлы, расположенные рядом с вашими существующими. Полные варианты, каждый вид отказа и обоснование каждого проектного решения приведены в README.

Models

Принесите свою собственную модель — включая местную

Этап перевода взаимодействует с моделью через небольшой адаптер, и с ним поставляются три: Claude (по умолчанию), Gemini и любая конечная точка, совместимая с OpenAI. Последний охватывает большую часть области — OpenAI, Azure, Groq, DeepSeek, Mistral, OpenRouter, Together, Fireworks—, а также охватывает Ollama, LM Studio и vLLM.

Это означает, что три строки конфигурации запускают весь конвейер на вашем собственном оборудовании:

i18n.config.json
{
  "provider": "openai",
  "apiBaseUrl": "http://localhost:11434/v1",
  "model": "qwen2.5:14b"
}

Ни ключа, ни квоты, и ничего не покидает машину — что имеет значение, если контент конфиденциальен. Все, чего нет в этом списке, представляет собой файл адаптера с двумя функциями.

Limits

Где останавливается бесплатный инструмент

Шесть реальных ограничений. Ни одна из них не является ограниченной функцией — они являются формой подхода, и скрипты сообщают вам, когда вы достигаете одной из них, а не тихо терпят неудачу.

Увлажнение на стороне клиента
Острова и полезные нагрузки фреймворка повторно отображаются в браузере поверх замененного HTML. Экстрактор подсчитывает затронутые страницы, поэтому вы узнаете об этом за считанные секунды, а не после полного запуска.
Документы
Связанные PDF-файлы, DOCX и XLSX остаются на исходном языке — конвейер всегда касается только HTML.
Отстой
Память имеет ключ исходного хеша, поэтому она может сообщить вам, какая доля вашего сайта изменилась с момента последнего запуска. Высокий отток означает необходимость платить за повторный перевод, причем неоднократно.
Редактирование перевода
Найдите хэш в файле памяти, отредактируйте строку, восстановите. Нет редактора, нет рецензента и нет рабочего процесса.
Объем
Вы платите своему поставщику модели напрямую, по его тарифу, своим собственным ключом — или вообще ничего, если вы запускаете модель самостоятельно.
Измененное использование сети
AGPL-3.0 §13 обязывает вас публиковать изменения, если вы используете измененную копию в качестве услуги для других людей. Запуск его без изменений или с внутренними изменениями не имеет ограничений.

Первые четыре — это те, по которым люди действительно бьют, и все они имеют одинаковую форму: что-то должно произойти после сборка, которую инструмент времени сборки сделать не может. Именно для этого и предназначен управляемый продукт, и бесплатный план это 5000 слов без карточки, чего достаточно, чтобы узнать, помогает ли это. Вам это не нужно, чтобы использовать что-либо на этой странице.

Атрибуция

What it puts on your pages

Локализованные страницы несут a <meta name="generator"> тег и один HTML-комментарий с именем ConveyThis — около 150 байт, без запроса, без скрипта и нет ссылки. Это тот же механизм, который используют Astro, Hugo и WordPress. Два ключа конфигурации удаляют его, и ничто в репозитории не проверяет, сделали ли вы это.

Если вы предпочитаете показать видимый кредит, установите credit.visibleLink к true и разместите слот там, где вы хотите, на странице. От вас ничего за это не просят и ничего не дают взамен — это существует потому, что некоторые люди хотят отдать должное инструментам, которые они используют, и ни по какой другой причине.

Кредитная ссылка rel="nofollow", намеренно. Не потому, что это платно — это не так —, а потому, что это ссылка, которую в противном случае скрипт сборки добавил бы на каждую страницу сайта, а ссылки на весь сайт, которые появляются с помощью инструментов, а не редакционного выбора, - это форма, на которую нацелено руководство Google по схеме ссылок. Стоит реферального трафика, а не обратных ссылок — любой, кто говорит вам обратное, продает вам штраф.

Коммерческая лицензия

Код — AGPL-3.0. Локализация собственных сайтов и отправка результатов не ограничены — лицензия распространяется на программное обеспечение, а не на HTML, который оно пишет. Он кусается только если вы запускаете измененный копировать как сетевой сервис для других людей. Если это про вас и вы не можете опубликовать свои изменения, напишите нам [email protected].

Вопросы

The questions people actually ask

Это действительно бесплатно? В чем подвох?
Это весь трубопровод под AGPL-3.0, и обычного улова нет. Вам не нужна учетная запись ConveyThis, ключ от нас и квота. Мы создали его для локализации conveythis.com на 55 языках и опубликовали то, что используем. Честная цена заключается в том, что вы управляете им самостоятельно: вы платите своему поставщику моделей, размещаете результаты, и за этим нет службы поддержки.
Нужна ли мне учетная запись ConveyThis?
Нет. Ничто в инструменте не проверяет его, не звонит домой и не сообщает об использовании. Единственный след нас — это тег генератора и HTML-комментарий на страницах, которые он пишет, а два ключа конфигурации удаляют их.
Сколько на самом деле стоит пробег?
Вы платите своему поставщику моделей напрямую. По умолчанию (Claude Haiku 4.5) маркетинговый сайт среднего размера, содержащий около 150 000 уникальных исходных слов, стоит около 30 долларов США на 20 языках. Замена одного ключа конфигурации на Gemini Flash Lite обойдется примерно в 2,40 доллара. Направив его на модель на собственном компьютере, вы получите свободу действий. Дедупликация важнее выбора провайдера: повторяющиеся верхние и нижние колонтитулы, а также навигация сводятся к одной единице каждая, что обычно сокращает расходы на порядок.
Могу ли я использовать свою собственную модель или запустить ее полностью в автономном режиме?
Да. Адаптеры поставляются для Claude, Gemini и любой конечной точки, совместимой с OpenAI—, которая охватывает OpenAI, Azure, Groq, DeepSeek, Mistral, OpenRouter, Together и Fireworks, а также Ollama, LM Studio и vLLM. Установите apiBaseUrl на локальный сервер, и весь конвейер будет работать на вашем оборудовании без ключа и без запроса, покидающего машину. Это важно, когда контент конфиденциальен. Все, чего нет в этом списке, представляет собой файл адаптера с двумя функциями.
Будут ли переведенные страницы медленнее оригиналов?
Нет, и это проектное решение, на котором основан весь проект. Каждая страница локали является исходной страницей с присоединенными диапазонами байтов; документ никогда не сериализуется повторно из DOM. Встроенный критический CSS, элемент LCP, хэши ресурсов, а также атрибуты ширины и высоты, которые удерживают сдвиг макета, сохраняются нетронутыми, поэтому страницы локали соответствуют исходному языку в Core Web Vitals, а не приблизительно напоминают его. Атрибуция добавляет около 150 байт и не делает сетевых запросов.
Работает ли это с моим фреймворком?
Все, что генерирует статический HTML: Astro, Next.js с экспортом выходных данных, Hugo, Eleventy, Jekyll, Gatsby или рукописный HTML. Он считывает выходные данные вашей сборки, а не исходный код, поэтому фреймворк в большинстве случаев не имеет значения. Примечания по каждому генератору в references/adapting-generators.md охватывают исключения, основным из которых является гидратация.
А как насчет компонентов React или островов Astro, которые гидратируются?
Они повторно отображаются в браузере поверх того, что было заменено в HTML, поэтому текст возвращается к исходному языку. Статическая замена не может их достичь. Экстрактор подсчитывает страницы, содержащие полезную нагрузку гидратации, и сообщает вам об этом до того, как вы что-либо потратите, поэтому вы узнаете об этом за считанные секунды, а не после полного запуска. Если большая часть вашего контента находится внутри гидратированных компонентов, то правильным инструментом будет слой времени выполнения, и ConveyThis — это именно он.
Can it keep my terminology consistent, and tell a brand name from an ordinary word?
Yes, since 2.0.0. Identical strings were always consistent because units are keyed by a hash of the source text, but a term inside varying sentences had no mechanism at all. A glossary file now pins terms per locale, and rules can be case-sensitive and whole-word: Apple the company is protected while apple the fruit is translated, and neither matches inside Applesauce. Brand names you already list are folded in automatically, and a verification gate checks they actually survived the translation, which nothing did before. The model is also told what each string is, so a button label, a heading and a meta description are no longer indistinguishable to it.
I already use it. What changes when I upgrade to 2.0.0?
Nothing re-translates. Unit hashes are computed from the source text alone, so no existing translation memory is invalidated, and that was verified against a fixture before release. Two behaviour changes do bite, and both are deliberate in a major version: locale number formatting is on by default, so a rebuild reformats numbers in your output, and a new numeric-integrity gate fails the build if a number changed value between source and translation. One caveat worth stating plainly: the stages added in 2.0.0 have not had a live billed run at scale against a hosted provider. The pipeline underneath them runs conveythis.com in 55 languages; the additions were verified offline, with fixtures and a local model.
Могу ли я исправить перевод, который мне не нравится?
Да, вручную. Найдите хэш строки в i18n/tm/{lang}.json, отредактируйте текст, восстановите. В бесплатном инструменте нет редактора, рецензента и рабочего процесса утверждения — это реальный предел, а не урезанная функция. Если вам нужен визуальный редактор или профессиональный человеческий обзор, именно это и предоставляет платный продукт.
Что происходит, когда я редактирую страницу или добавляю новую?
Память переводов имеет ключ, состоящий из хеша исходного текста, поэтому повторный запуск переводит только то, что изменилось, и повторно использует все остальное — обычно центы. Зафиксируйте i18n/tm/{lang}.json; это актив, и его удаление означает оплату полного повторного перевода. Если ваш контент меняется ежедневно, арифметика перестает отдавать предпочтение этому подходу, и инструмент сообщает вам скорость оттока, чтобы вы могли это предвидеть.
Будут ли переведенные страницы индексироваться Google?
They are real static pages, so yes. Read what it does as corrected rather than created, because that distinction is what keeps the markup byte-identical: it rewrites the values on tags your template already emits. Every locale page comes out with the right html lang and dir, a self-referencing canonical, x-default and source-language hreflang pointed back at the original, og:url and og:locale, per-locale JSON-LD with the right @id and inLanguage, and locale-prefixed internal links. Your own template supplies the full hreflang mesh and the sitemap; the SEO audit then checks both across every page rather than a sample, and exits non-zero so it can gate a deploy.
Могу ли я использовать его в коммерческих целях? Что для меня означает AGPL-3.0?
Локализация собственных сайтов и отправка продукции не ограничены, в том числе для клиентов и в коммерческих целях. Лицензия распространяется на программное обеспечение, а не на HTML-код, который оно пишет. Раздел 13 применяется только в том случае, если вы запускаете измененную копию в качестве сетевой услуги для других людей. В этом случае вы должны опубликовать свои изменения или получить коммерческую лицензию. LICENSING.md объясняет, к какой группе вы относитесь; почти все относятся к группе без ограничений.
Требуется ли указание авторства ConveyThis?
Нет. Каждая локализованная страница содержит метатег генератора и HTML-комментарий — около 150 байт, без запроса, без скрипта и без ссылки. Это тот же механизм, который используют Astro, Hugo и WordPress. Установка credit.generatorTag и credit.htmlComment в значение false удаляет оба, и ничто в коде не проверяет, сделали ли вы это. Видимый кредит предоставляется по желанию и отдельно, и он ничего вам не приносит — он предназначен для людей, которые хотят получить кредит за используемые ими инструменты.
Чем это отличается от самого ConveyThis?
Они решают разные проблемы. Это создает статические файлы во время сборки, для подключения которых требуется сборка и контент, который меняется в зависимости от частоты выпуска. ConveyThis - это управляемый уровень времени выполнения: нет этапа сборки, нет повторного запуска при каждом редактировании, визуальный редактор, человеческий перевод и поддержка CMS, электронной коммерции, пользовательского контента и страниц за входом в систему. Если у вас статическая сборка и вы хотите владеть HTML, используйте это. Если ваш контент меняется ежедневно или нет готовой сборки, используйте продукт. В любом случае это одна и та же компания.
Готовы начать?

Перевод, гораздо больше, чем просто знание языков, это сложный процесс.

Следуя нашим советам и используя ConveyThis , ваши переведенные страницы найдут отклик у вашей аудитории, чувствуя себя родными для целевого языка.

Хотя это требует усилий, результат приносит удовлетворение. Если вы переводите веб-сайт, ConveyThis может сэкономить вам часы с помощью автоматизированного машинного перевода.

Начните с ConveyThis на нашем бесплатном плане — кредитная карта не требуется!