Claude Traductor
Este es el oleoducto que corre www.conveythis.com en sí — un sitio Astro de 238 páginas, disponible en 55 idiomas. Lo extrajimos, documentamos cada modo de falla que nos costó encontrar y publicamos todo. No es una prueba ni un adelanto: no hay clave para comprar, ni cuota, ni cuenta.
Two design decisions
Cómo funciona
Dos decisiones lo definen. Primero, las traducciones se empalman en el HTML creado mediante desplazamiento de bytes y el documento nunca se vuelve a serializar desde un DOM —, por lo que se incluyen CSS crítico, el elemento LCP, hashes de activos y el width/height todos los atributos que contienen CLS permanecen intactos. Eso es por qué las páginas locales coinciden con el idioma de origen en Core Web Vitals en lugar de simplemente parecerse a él. En segundo lugar, la unidad de traducción es el bloque completo, no el nodo de texto, porque aproximadamente una quinta parte de los nodos de texto de un sitio típico están divididos por marcado en línea y traducir los fragmentos por separado rompe la gramática en cualquier idioma que reordene o flexione.
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
¿Realmente se mantiene?
Es una pregunta justa y comprobable, más que algo por lo que tengas que confiar en nuestra palabra. doctorslator.com/fr es un gran sitio Astro cuyas páginas en francés fueron construidas por este oleoducto. Compárelo con el original en inglés y el marcado es byte idéntico:
2,743
etiquetas, en secuencia idéntica
2,031
atributos de clase, todos coinciden
+0.74%
peso de la página — El francés es más largo
No se movió nada estructural, por lo que no hay nada que el navegador pueda diseñar de manera diferente. Compruébelo usted mismo — tarda unos diez segundos:
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"Y las puntuaciones
| Fuente en inglés | Francés, de esta herramienta | A11y / Mejores prácticas / SEO | |
|---|---|---|---|
| Escritorio | 100 | 100 | 100 / 100 / 100 |
| Móvil | 98 | 98 | 100 / 100 / 100 |
Puntuaciones de rendimiento de PageSpeed Insights, medidas el 25 de agosto de 2026. Accesibilidad, mejores prácticas y SEO fueron 100 en cada tirada de ambas páginas, en ambas estrategias.
Estas son medianas, deliberadamente. Las puntuaciones de Lighthouse se mueven: cinco ejecuciones consecutivas de la misma página móvil en inglés arrojaron 98, 98, 88, 98, 98, y la pintura con mayor contenido osciló entre 1,8 y 3,2 s. Esto es variación de red y CDN más que calidad de página. Si mides una vez y obtienes 91, es por eso que — ejecútalo unas cuantas veces y compara los dos idiomas entre sí en lugar de compararlos con un número en una página de marketing.
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 | por qué |
|---|---|---|
| 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 y 1.234,50 in de.
Honest routing
¿Cuál necesitas realmente?
La sustitución estática y una capa de tiempo de ejecución resuelven diferentes problemas. Elegir el equivocado te cuesta un fin de semana, así que aquí está la división honesta.
Tienes una compilación estática, el contenido cambia según la cadencia de lanzamiento y quieres ser dueño absoluto del HTML.
Claude Traductor
Gratuito, autohospedado, AGPL-3.0. Tu propia clave API, tus propios archivos, sin cuenta.
Ver en GitHub →Su contenido cambia diariamente, reside en un CMS, es generado por el usuario o se encuentra detrás de un inicio de sesión o pago.
ConveyThis
Una capa de tiempo de ejecución administrada. Sin pasos de compilación para enganchar, sin repetición en cada edición, un editor visual y una revisión humana.
Ver precios →Lo que necesitas traducir son documentos en lugar de páginas — PDF, DOCX, XLSX, PPTX.
Traductor de documentos
Archivos completos, diseño y tablas conservados, 100+ idiomas.
Ir a DocTranslator →Quickstart
Instalarlo
Repositorio
https://github.com/ConveyThis/claude-translator
AGPL-3.0 · Nodo ≥ 20 · una dependencia (parse5) · abrir en GitHub →
Necesitas
- Node.js 20 o más reciente
- Un sitio que crea HTML estático — lee el resultado de tu compilación, no tu fuente
- Una clave API para cualquier modelo que elijas — o ninguno en absoluto, si ejecuta uno localmente
Como habilidad de Claude Code
Clónalo en tu directorio de habilidades y luego pídele a Claude que localice el sitio. Sigue las instrucciones incluidas, incluidos los modos de falla que nos costaron dinero real encontrar — y las reglas sobre cuándo esta es la herramienta completamente incorrecta.
git clone https://github.com/ConveyThis/claude-translator.git \
~/.claude/skills/claude-translatorEn cualquier proyecto
Un comando. init copia la tubería en scripts/i18n/, escribe una configuración, declara parse5 y añade el derivado i18n/ caminos hacia tu .gitignore. Nunca sobrescribe nada sin --force, e imprime cada archivo que toca.
cd your-project
npx claude-translator init
npm install # parse5, the only dependencyLos scripts aterrizan en su repositorio en lugar de permanecer allí node_modules a propósito — resuelven rutas del proyecto en el que se encuentran, son lo suficientemente cortos para leer y la licencia existe para que puedas cambiarlos.
Instalación sin 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 parse5Configurar
La configuración más pequeña que se ejecuta. buildDir es donde su generador escribe HTML; baseUrl es tu origen canónico, sin barra diagonal final.
{
"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 itEjecútalo
| npm ejecuta compilación | Su compilación normal — solo idioma de origen |
| scripts de nodo/i18n/extract.mjs | Encuentra cada unidad traducible |
| scripts de nodo/i18n/translate.mjs --lang es,fr | traducir a la memoria |
| scripts de nodo/i18n/build-locales.mjs --lang all | escribe las páginas localizadas |
| scripts de nodo/i18n/verify.mjs --lang all | eight gates — exits non-zero on failure |
| scripts de nodo/i18n/audit-seo.mjs | canónicos, hreflang, JSON-LD, mapas de sitio |
| node scripts/i18n/tqa.mjs --lang es --dry | optional — MQM quality score, cost first |
Luego implemente el directorio de compilación exactamente como lo implementa hoy — las páginas localizadas son archivos comunes que se encuentran al lado de los existentes. Las opciones completas, cada modo de falla y el razonamiento detrás de cada decisión de diseño están en el README.
Models
Trae tu propio modelo — incluido uno local
El paso de traducción se comunica con un modelo a través de un pequeño adaptador y se envían tres con él: Claude (el predeterminado), Gemini y cualquier punto final compatible con OpenAI. Este último cubre la mayor parte del campo —OpenAI, Azure, Groq, DeepSeek, Mistral, OpenRouter, Together, Fireworks— y también cubre Ollama, LM Studio y vLLM.
Lo que significa que tres líneas de configuración ejecutan todo el proceso en su propio hardware:
{
"provider": "openai",
"apiBaseUrl": "http://localhost:11434/v1",
"model": "qwen2.5:14b"
}Sin clave, sin cuota y nada sale de la máquina — lo cual importa si el contenido es confidencial. Todo lo que no esté en esa lista es un archivo adaptador con dos funciones.
Limits
Donde termina la herramienta gratuita
Seis límites reales. Ninguna de ellas es una característica limitada — son la forma del enfoque y los scripts te indican cuándo acertas uno en lugar de fallar silenciosamente.
- Hidratación del lado del cliente
- Las islas y las cargas útiles del marco se vuelven a renderizar en el navegador, a través del HTML sustituido. El extractor cuenta las páginas afectadas para que puedas averiguarlo en segundos, no después de una ejecución completa.
- Documentos
- Los PDF vinculados, DOCX y XLSX permanecen en el idioma de origen — la canalización solo toca HTML.
- Batir
- La memoria está codificada por el hash de origen, por lo que puede indicarle qué parte de su sitio cambió desde la última ejecución. Una alta tasa de abandono significa pagar para volver a traducir, repetidamente.
- Edición de una traducción
- Busque el hash en el archivo de memoria, edite la cadena, reconstruya. No hay editor, ni revisor, ni flujo de trabajo.
- Volumen
- Pagas a tu propio proveedor de modelos directamente, a su tarifa, con tu propia clave — o nada en absoluto, si ejecutas el modelo tú mismo.
- Uso de red modificado
- AGPL-3.0 §13 le obliga a publicar modificaciones si ejecuta una copia modificada como un servicio para otras personas. Ejecutarlo sin modificaciones o modificado internamente no tiene restricciones.
Los primeros cuatro son los que la gente realmente golpea, y todos tienen la misma forma: algo tiene que pasar después la compilación, algo que una herramienta de tiempo de compilación no puede hacer. Para eso está el producto gestionado y el plan gratuito Son 5.000 palabras sin tarjeta, lo que es suficiente para saber si ayuda. No lo necesitas para usar nada de esta página.
Atribución
What it puts on your pages
Las páginas localizadas llevan un <meta name="generator"> etiqueta y un comentario HTML que nombra ConveyThis — aproximadamente 150 bytes, sin solicitud, sin script y sin enlace. Es el mismo mecanismo que utilizan Astro, Hugo y WordPress. Dos claves de configuración lo eliminan y nada en el repositorio verifica si lo hiciste.
Si prefiere mostrar un crédito visible, establezca credit.visibleLink a true y coloca el espacio donde quieras en la página. No te piden nada por ello y no te dan nada a cambio — existe porque algunas personas quieren dar crédito a las herramientas que utilizan, y sin ningún otro motivo.
El enlace de crédito es rel="nofollow", deliberadamente. No porque sea pago — no lo es — sino porque es un enlace que de otro modo un script de compilación agregaría en cada página de un sitio, y los enlaces a todo el sitio que aparecen a través de herramientas en lugar de opciones editoriales son la forma a la que apunta la guía del esquema de enlaces de Google. Vale la pena el tráfico de referencia, no los backlinks — cualquiera que te diga lo contrario te está vendiendo una penalización.
Licencia comercial
El código es AGPL-3.0. Localizar sus propios sitios y enviar el resultado no tiene restricciones — la licencia cubre el software, no el HTML que escribe. Sólo muerde si corres un modificado copiar como un servicio de red para otras personas. Si eres tú y no puedes publicar tus cambios, escribe a [correo electrónico protegido].
Preguntas
The questions people actually ask
¿Esto es realmente gratis? ¿cuál es el truco?
¿Necesito una cuenta ConveyThis?
¿Cuánto cuesta realmente una carrera?
¿Puedo usar mi propio modelo o ejecutarlo completamente sin conexión?
¿Las páginas traducidas serán más lentas que las originales?
¿Funciona con mi framework?
¿Qué pasa con los componentes de React o las islas Astro que se hidratan?
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?
¿Puedo arreglar una traducción que no me gusta?
¿Qué pasa cuando edito una página o agrego una nueva?
¿Las páginas traducidas serán indexadas por Google?
¿Puedo usarlo comercialmente? ¿Qué significa AGPL-3.0 para mí?
¿Es necesaria la atribución ConveyThis?
¿En qué se diferencia esto del propio ConveyThis?
La traducción, mucho más que simplemente conocer idiomas, es un proceso complejo.
Siguiendo nuestros consejos y utilizando ConveyThis , sus páginas traducidas resonarán en su audiencia y se sentirán nativas del idioma de destino.
Si bien exige esfuerzo, el resultado es gratificante. Si está traduciendo un sitio web, ConveyThis puede ahorrarle horas con la traducción automática.
Comience con ConveyThis en nuestro plan gratuito — ¡no se requiere tarjeta de crédito!
