Клод Переводчик
Это трубопровод, который работает 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 | |
|---|---|---|---|
| Рабочий стол | 100 | 100 | 100 / 100 / 100 |
| Мобильный | 98 | 98 | 100 / 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 twiceIt 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;
--repeatscores 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.
[
{ "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.
| source | spanish | почему |
|---|---|---|
| Apple announced a device | Apple anunció un dispositivo | capital A — protected, and now verified |
| An apple a day | Una manzana al día | lowercase — translated normally |
| Applesauce is on sale | La compota está en oferta | whole-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.
| source | becomes | where |
|---|---|---|
| 1,234.56 | 1.234,56 | de |
| 1,234.56 | 1 234,56 | fr |
| $5 | 5,00 $US | fr — placement and spacing, not the amount |
| 50% | 50 % | fr — with a non-breaking space |
It formats. It never converts.
no config option for itA 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 это ваше каноническое происхождение, без завершающей косой черты.
{
"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 --dry | optional — MQM quality score, cost first |
Затем разверните каталог сборки точно так же, как вы развернули его сегодня — локализованные страницы — это обычные файлы, расположенные рядом с вашими существующими. Полные варианты, каждый вид отказа и обоснование каждого проектного решения приведены в README.
Models
Принесите свою собственную модель — включая местную
Этап перевода взаимодействует с моделью через небольшой адаптер, и с ним поставляются три: Claude (по умолчанию), Gemini и любая конечная точка, совместимая с OpenAI. Последний охватывает большую часть области — OpenAI, Azure, Groq, DeepSeek, Mistral, OpenRouter, Together, Fireworks—, а также охватывает Ollama, LM Studio и vLLM.
Это означает, что три строки конфигурации запускают весь конвейер на вашем собственном оборудовании:
{
"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
Это действительно бесплатно? В чем подвох?
Нужна ли мне учетная запись ConveyThis?
Сколько на самом деле стоит пробег?
Могу ли я использовать свою собственную модель или запустить ее полностью в автономном режиме?
Будут ли переведенные страницы медленнее оригиналов?
Работает ли это с моим фреймворком?
А как насчет компонентов React или островов Astro, которые гидратируются?
Can it keep my terminology consistent, and tell a brand name from an ordinary word?
I already use it. What changes when I upgrade to 2.0.0?
Могу ли я исправить перевод, который мне не нравится?
Что происходит, когда я редактирую страницу или добавляю новую?
Будут ли переведенные страницы индексироваться Google?
Могу ли я использовать его в коммерческих целях? Что для меня означает AGPL-3.0?
Требуется ли указание авторства ConveyThis?
Чем это отличается от самого ConveyThis?
Перевод, гораздо больше, чем просто знание языков, это сложный процесс.
Следуя нашим советам и используя ConveyThis , ваши переведенные страницы найдут отклик у вашей аудитории, чувствуя себя родными для целевого языка.
Хотя это требует усилий, результат приносит удовлетворение. Если вы переводите веб-сайт, ConveyThis может сэкономить вам часы с помощью автоматизированного машинного перевода.
Начните с ConveyThis на нашем бесплатном плане — кредитная карта не требуется!
