Código abierto

Claude Traductor

Localización estática del sitio — traducir un sitio creado a docenas de idiomas como páginas estáticas reales, sin volver a renderizarlo y sin romper Core Web Vitals. Gratuito, autohospedado, AGPL-3.0.
Sin cuenta No hay clave API nuestra También se ejecuta en un modelo local

Ver todas las funciones

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:

concha
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ésFrancés, de esta herramientaA11y / Mejores prácticas / SEO
Escritorio100100100 / 100 / 100
Móvil9898100 / 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.

concha
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.

sourcespanishpor qué
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 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.

concha
git clone https://github.com/ConveyThis/claude-translator.git \
  ~/.claude/skills/claude-translator

En 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.

concha
cd your-project
npx claude-translator init
npm install                       # parse5, the only dependency

Los 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
concha
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

Configurar

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.

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" }
  ]
}
concha
echo "ANTHROPIC_API_KEY=your-key-here" >> .env   # and gitignore it

Ejecútalo

npm ejecuta compilaciónSu compilación normal — solo idioma de origen
scripts de nodo/i18n/extract.mjsEncuentra cada unidad traducible
scripts de nodo/i18n/translate.mjs --lang es,frtraducir a la memoria
scripts de nodo/i18n/build-locales.mjs --lang allescribe las páginas localizadas
scripts de nodo/i18n/verify.mjs --lang alleight gates — exits non-zero on failure
scripts de nodo/i18n/audit-seo.mjscanónicos, hreflang, JSON-LD, mapas de sitio
node scripts/i18n/tqa.mjs --lang es --dryoptional — 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:

i18n.config.json
{
  "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?
Es todo el oleoducto bajo AGPL-3.0 y no hay ninguna captura del tipo habitual. No necesita ninguna cuenta ConveyThis, ninguna clave nuestra ni ninguna cuota. Lo construimos para localizar conveythis.com en 55 idiomas y publicamos lo que usamos. El costo honesto es que lo ejecutas tú mismo: pagas a tu propio proveedor de modelos, alojas el resultado y no hay ningún servicio de soporte detrás.
¿Necesito una cuenta ConveyThis?
No. Nada en la herramienta verifica si hay uno, llama a casa o informa el uso. El único rastro de nosotros es una etiqueta generadora y un comentario HTML en las páginas que escribe, y dos claves de configuración los eliminan.
¿Cuánto cuesta realmente una carrera?
Pagas directamente a tu proveedor de modelos. Por defecto (Claude Haiku 4.5), un sitio de marketing de tamaño mediano con aproximadamente 150.000 palabras fuente únicas cuesta alrededor de 30 dólares en 20 idiomas. Cambiar una clave de configuración a Gemini Flash Lite eleva ese precio a aproximadamente $2,40. Apuntarlo a un modelo en tu propia máquina lo hace gratuito. La deduplicación importa más que la elección del proveedor: los encabezados, pies de página y navegación repetidos colapsan a una unidad cada uno, lo que generalmente reduce la factura en un orden de magnitud.
¿Puedo usar mi propio modelo o ejecutarlo completamente sin conexión?
Sí. Los adaptadores se envían para Claude, Gemini y cualquier punto final compatible con OpenAI — que cubre OpenAI, Azure, Groq, DeepSeek, Mistral, OpenRouter, Together y Fireworks, y también Ollama, LM Studio y vLLM. Configure apiBaseUrl en su servidor local y toda la canalización se ejecutará en su hardware sin clave ni solicitud saliendo de la máquina. Esto importa cuando el contenido es confidencial. Todo lo que no esté en esa lista es un archivo adaptador con dos funciones.
¿Las páginas traducidas serán más lentas que las originales?
No, y ésta es la decisión de diseño en la que se basa todo el proyecto. Cada página local es la página de origen con rangos de bytes empalmados; el documento nunca se vuelve a serializar desde un DOM. El CSS crítico incorporado, el elemento LCP, los hashes de activos y los atributos de ancho y alto que contienen el cambio de diseño se transfieren intactos, por lo que las páginas locales coinciden con el idioma de origen en Core Web Vitals en lugar de parecerse aproximadamente a él. La atribución agrega alrededor de 150 bytes y no realiza ninguna solicitud de red.
¿Funciona con mi framework?
Cualquier cosa que emita HTML estático: Astro, Next.js con exportación de salida, Hugo, Eleventy, Jekyll, Gatsby o HTML escrito a mano. Lee el resultado de su compilación en lugar de su fuente, por lo que el marco en su mayor parte no importa. Las notas por generador en references/adapting-generators.md cubren las excepciones, siendo la hidratación la principal.
¿Qué pasa con los componentes de React o las islas Astro que se hidratan?
Estos se vuelven a renderizar en el navegador, sobre lo que se sustituyó en el HTML, por lo que el texto vuelve al idioma de origen. La sustitución estática no puede alcanzarlos. El extractor cuenta las páginas que llevan una carga de hidratación y te lo indica antes de gastar algo, para que lo descubras en segundos en lugar de después de una ejecución completa. Si la mayor parte de su contenido se encuentra dentro de componentes hidratados, una capa de tiempo de ejecución es la herramienta adecuada y ConveyThis lo es.
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.
¿Puedo arreglar una traducción que no me gusta?
Sí, a mano. Encuentre el hash de cadena en i18n/tm/{lang}.json, edite el texto, reconstruya. No hay editor, revisor ni flujo de trabajo de aprobación en la herramienta gratuita — eso es un límite real más que una característica paralizada. Si necesita un editor visual o una revisión humana profesional, eso es lo que ofrece el producto pago.
¿Qué pasa cuando edito una página o agrego una nueva?
La memoria de traducción está codificada por un hash del texto fuente, por lo que una repetición traduce solo lo que cambió y reutiliza todo lo demás — generalmente centavos. Confirme i18n/tm/{lang}.json; es el activo y eliminarlo significa pagar por una retraducción completa. Si tu contenido cambia diariamente, la aritmética deja de favorecer este enfoque y la herramienta te indica la tasa de abandono para que puedas verla venir.
¿Las páginas traducidas serán indexadas por 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.
¿Puedo usarlo comercialmente? ¿Qué significa AGPL-3.0 para mí?
Localizar sus propios sitios y enviar el resultado no tiene restricciones, ni para los clientes ni comercialmente. La licencia cubre el software, no el HTML que escribe. La sección 13 solo se aplica si ejecuta una copia modificada como un servicio de red para otras personas, en cuyo caso debe publicar sus modificaciones o obtener una licencia comercial. LICENSING.md explica en qué grupo estás; casi todos están en el grupo sin restricciones.
¿Es necesaria la atribución ConveyThis?
No. Cada página localizada lleva una metaetiqueta generadora y un comentario HTML — aproximadamente 150 bytes, sin solicitud, sin script y sin enlace. Es el mismo mecanismo que utilizan Astro, Hugo y WordPress. Configurar credit.generatorTag y credit.htmlComment como falsos elimina ambos y nada en el código verifica si lo hizo. Un crédito visible es opcional y separado, y no le genera ningún beneficio — está ahí para las personas que desean acreditar las herramientas que utilizan.
¿En qué se diferencia esto del propio ConveyThis?
Resuelven diferentes problemas. Esto produce archivos estáticos en el momento de la compilación, que necesitan una compilación para conectarse y contenido que cambie en una cadencia de lanzamiento. ConveyThis es una capa de tiempo de ejecución administrada: sin paso de compilación, sin repetición en cada edición, un editor visual, traducción humana y soporte para CMS, comercio electrónico, contenido generado por el usuario y páginas detrás de un inicio de sesión. Si tiene una compilación estática y desea poseer el HTML, use esto. Si su contenido cambia diariamente o no hay ninguna compilación para conectar, utilice el producto. De cualquier manera, la misma empresa.
¿Listo para empezar?

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!