Lingo.dev - Kit de herramientas i18n de código abierto para localización impulsada por LLM
MCP •CLI • CI/CD •SDK • Compilador
| Herramienta | Caso de uso | Comando rápido |
|---|---|---|
| MCP | Configuración i18n asistida por IA para apps React | Prompt: Set up i18n |
| CLI | Traducir archivos JSON, YAML, markdown, CSV, PO | npx lingo.dev@latest run |
| CI/CD | Pipeline de traducción automatizado en GitHub Actions | uses: lingodotdev/lingo.dev@main |
| SDK | Traducción en tiempo de ejecución para contenido dinámico | npm install lingo.dev |
| Compiler | Localización React en tiempo de compilación sin wrappers i18n | Plugin withLingo() |
Configurar i18n en aplicaciones React es notoriamente propenso a errores, incluso para desarrolladores experimentados. Los asistentes de codificación con IA lo empeoran: alucinan APIs inexistentes, olvidan configuraciones de middleware, rompen el enrutamiento o implementan media solución antes de perderse. El problema es que la configuración de i18n requiere una secuencia precisa de cambios coordinados en múltiples archivos (enrutamiento, middleware, componentes, configuración), y los LLM tienen dificultades para mantener ese contexto.
Lingo.dev MCP resuelve esto dando a los asistentes de IA acceso estructurado al conocimiento de i18n específico del framework. En lugar de adivinar, tu asistente sigue patrones de implementación verificados para Next.js, React Router y TanStack Start.
IDEs compatibles:
- Claude Code
- Cursor
- GitHub Copilot Agents
- Codex (OpenAI)
Frameworks compatibles:
- Next.js (App Router y Pages Router v13-16)
- TanStack Start (v1)
- React Router (v7)
Uso:
Después de configurar el servidor MCP en tu IDE (ver guías de inicio rápido), solicita a tu asistente:
Set up i18n with the following locales: en, es, and pt-BR. The default locale is 'en'.
El asistente:
- Configurará el enrutamiento basado en locale (ej.,
/en,/es,/pt-BR) - Configurará componentes de cambio de idioma
- Implementará detección automática de locale
- Generará los archivos de configuración necesarios
Nota: La generación de código asistida por IA es no determinista. Revisa el código generado antes de hacer commit.
Mantener las traducciones sincronizadas es tedioso. Añades una nueva cadena, olvidas traducirla, envías una interfaz rota a usuarios internacionales. O envías archivos JSON a traductores, esperas días y luego fusionas manualmente su trabajo. Escalar a más de 10 idiomas significa gestionar cientos de archivos que constantemente se dessincronizan.
El CLI de Lingo.dev automatiza esto. Apúntalo a tus archivos de traducción, ejecuta un comando y cada locale se actualiza. Un archivo de bloqueo rastrea lo que ya está traducido, por lo que solo pagas por contenido nuevo o modificado. Compatible con archivos JSON, YAML, CSV, PO y markdown.
Configuración:
# Initialize project
npx lingo.dev@latest init
# Run translations
npx lingo.dev@latest runCómo funciona:
- Extrae el contenido traducible de los archivos configurados
- Envía el contenido al proveedor de LLM para su traducción
- Escribe el contenido traducido de vuelta al sistema de archivos
- Crea el archivo
i18n.lockpara rastrear las traducciones completadas (evita el procesamiento redundante)
Configuración:
El comando init genera un archivo i18n.json. Configura los idiomas y buckets:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es", "fr", "de"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"]
}
}
}El campo provider es opcional (por defecto usa Lingo.dev Engine). Para proveedores de LLM personalizados:
{
"provider": {
"id": "openai",
"model": "gpt-4o-mini",
"prompt": "Translate from {source} to {target}"
}
}Proveedores de LLM compatibles:
- Lingo.dev Engine (recomendado)
- OpenAI
- Anthropic
- Mistral
- OpenRouter
- Ollama
Las traducciones son la funcionalidad que siempre está "casi lista". Los ingenieros fusionan código sin actualizar los idiomas. QA detecta traducciones faltantes en staging, o peor aún, los usuarios las detectan en producción. La causa raíz: la traducción es un paso manual que es fácil omitir bajo presión de plazos.
Lingo.dev CI/CD hace que las traducciones sean automáticas. Cada push activa la traducción. Las cadenas faltantes se completan antes de que el código llegue a producción. No se requiere disciplina: el pipeline se encarga de ello.
Plataformas compatibles:
- GitHub Actions
- GitLab CI/CD
- Bitbucket Pipelines
Configuración de GitHub Actions:
Crea .github/workflows/translate.yml:
name: Translate
on:
push:
branches: [main]
permissions:
contents: write
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Lingo.dev
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}Requisitos de configuración:
- Añade
LINGODOTDEV_API_KEYa los secretos del repositorio (Settings > Secrets and variables > Actions) - Para flujos de trabajo de PR: habilita "Allow GitHub Actions to create and approve pull requests" en Settings > Actions > General
Opciones de flujo de trabajo:
Confirmar traducciones directamente:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}Crea pull requests con traducciones:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
pull-request: true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Entradas disponibles:
| Entrada | Predeterminado | Descripción |
|---|---|---|
api-key |
(requerido) | Clave API de Lingo.dev |
pull-request |
false |
Crear PR en lugar de confirmar directamente |
commit-message |
"feat: update translations via @LingoDotDev" |
Mensaje de confirmación personalizado |
pull-request-title |
"feat: update translations via @LingoDotDev" |
Título de PR personalizado |
working-directory |
"." |
Directorio en el que ejecutar |
parallel |
false |
Habilitar procesamiento paralelo |
Los archivos de traducción estáticos funcionan para etiquetas de interfaz, pero ¿qué pasa con el contenido generado por usuarios? Mensajes de chat, descripciones de productos, tickets de soporte: el contenido que no existe en tiempo de compilación no puede ser pretraducido. Te quedas mostrando texto sin traducir o construyendo un pipeline de traducción personalizado.
El SDK de Lingo.dev traduce contenido en tiempo de ejecución. Pasa cualquier texto, objeto o HTML y obtén una versión localizada. Funciona para chat en tiempo real, notificaciones dinámicas o cualquier contenido que llegue después del despliegue. Disponible para JavaScript, PHP, Python y Ruby.
Instalación:
npm install lingo.devUso:
import { LingoDotDevEngine } from "lingo.dev/sdk";
const lingoDotDev = new LingoDotDevEngine({
apiKey: process.env.LINGODOTDEV_API_KEY,
});
// Translate objects (preserves structure)
const translated = await lingoDotDev.localizeObject(
{ greeting: "Hello", farewell: "Goodbye" },
{ sourceLocale: "en", targetLocale: "es" },
);
// { greeting: "Hola", farewell: "Adiós" }
// Translate text
const text = await lingoDotDev.localizeText("Hello!", {
sourceLocale: "en",
targetLocale: "fr",
});
// Translate to multiple languages at once
const results = await lingoDotDev.batchLocalizeText("Hello!", {
sourceLocale: "en",
targetLocales: ["es", "fr", "de"],
});
// Translate chat (preserves speaker names)
const chat = await lingoDotDev.localizeChat(
[{ name: "Alice", text: "Hello!" }],
{ sourceLocale: "en", targetLocale: "es" },
);
// Translate HTML (preserves markup)
const html = await lingoDotDev.localizeHtml("<h1>Welcome</h1>", {
sourceLocale: "en",
targetLocale: "de",
});
// Detect language
const locale = await lingoDotDev.recognizeLocale("Bonjour le monde");
// "fr"SDKs disponibles:
- SDK de JavaScript - Aplicaciones web, Node.js
- SDK de PHP - PHP, Laravel
- SDK de Python - Django, Flask
- SDK de Ruby - Rails
La i18n tradicional es invasiva. Envuelves cada cadena en funciones t(), inventas claves de traducción (home.hero.title.v2), mantienes archivos JSON paralelos y ves cómo tus componentes se inflan con código repetitivo de localización. Es tan tedioso que los equipos retrasan la internacionalización hasta que se convierte en una refactorización masiva.
Lingo.dev Compiler elimina la ceremonia. Escribe componentes de React con texto en inglés simple. El compilador detecta cadenas traducibles en tiempo de compilación y genera variantes localizadas automáticamente. Sin claves, sin archivos JSON, sin funciones envolventes, solo código React que funciona en múltiples idiomas.
Instalación:
pnpm install @lingo.dev/compilerAutenticación:
# Recommended: Sign up at lingo.dev and login
npx lingo.dev@latest login
# Alternative: Add API key to .env
LINGODOTDEV_API_KEY=your_key_here
# Or use direct LLM providers (Groq, OpenAI, Anthropic, Google)
GROQ_API_KEY=your_keyConfiguración (Next.js):
// next.config.ts
import type { NextConfig } from "next";
import { withLingo } from "@lingo.dev/compiler/next";
const nextConfig: NextConfig = {};
export default async function (): Promise<NextConfig> {
return await withLingo(nextConfig, {
sourceRoot: "./app",
sourceLocale: "en",
targetLocales: ["es", "fr", "de"],
models: "lingo.dev",
dev: { usePseudotranslator: true },
});
}Configuración (Vite):
// vite.config.ts
import { lingoCompilerPlugin } from "@lingo.dev/compiler/vite";
export default defineConfig({
plugins: [
lingoCompilerPlugin({
sourceRoot: "src",
sourceLocale: "en",
targetLocales: ["es", "fr", "de"],
models: "lingo.dev",
dev: { usePseudotranslator: true },
}),
react(),
],
});Configuración del proveedor:
// app/layout.tsx (Next.js)
import { LingoProvider } from "@lingo.dev/compiler/react";
export default function RootLayout({ children }) {
return (
<LingoProvider>
<html>
<body>{children}</body>
</html>
</LingoProvider>
);
}Selector de idioma:
import { useLocale, setLocale } from "@lingo.dev/compiler/react";
export function LanguageSwitcher() {
const locale = useLocale();
return (
<select value={locale} onChange={(e) => setLocale(e.target.value)}>
<option value="en">English</option>
<option value="es">Español</option>
</select>
);
}Desarrollo: npm run dev (usa pseudotraductor, sin llamadas a la API)
Producción: Establece usePseudotranslator: false, luego next build
Confirma el directorio .lingo/ en el control de versiones.
Características principales:
- Cero costo de rendimiento en tiempo de ejecución
- Sin claves de traducción ni archivos JSON
- Sin funciones
t()ni componentes envolventes<T> - Detección automática de texto traducible en JSX
- Soporte para TypeScript
- ICU MessageFormat para plurales
- Anulaciones manuales mediante el atributo
data-lingo-override - Widget de editor de traducción integrado
Modos de compilación:
pseudotranslator: Modo de desarrollo con traducciones de marcador de posición (sin costos de API)real: Genera traducciones reales usando LLMscache-only: Modo de producción usando traducciones pregeneradas desde CI (sin llamadas a la API)
Frameworks compatibles:
- Next.js (App Router con React Server Components)
- Vite + React (SPA y SSR)
Soporte adicional de frameworks planificado.
Las contribuciones son bienvenidas. Por favor, sigue estas directrices:
- Issues: Reporta errores o solicita funcionalidades
- Pull Requests: Envía cambios
- Cada PR requiere un changeset:
pnpm new(opnpm new:emptypara cambios que no requieren release) - Asegúrate de que las pruebas pasen antes de enviar
- Cada PR requiere un changeset:
- Desarrollo: Este es un monorepo de pnpm + turborepo
- Instala las dependencias:
pnpm install - Ejecuta las pruebas:
pnpm test - Compila:
pnpm build
- Instala las dependencias:
Soporte: Comunidad de Discord
Si encuentras útil Lingo.dev, danos una estrella y ayúdanos a alcanzar las 10 000 estrellas.
[
](https://www.star-history.com/#lingodotdev/lingo.dev&Date)
Traducciones disponibles:
English • 中文 • 日本語 • 한국어 • Español • Français • Русский • Українська • Deutsch • Italiano • العربية • עברית • हिन्दी • Português (Brasil) • বাংলা • فارسی • Polski • Türkçe • اردو • भोजपुरी • অসমীয়া • ગુજરાતી • मराठी • ଓଡ଼ିଆ • ਪੰਜਾਬੀ • සිංහල • தமிழ் • తెలుగు
Añadir un nuevo idioma:
- Añade el código de locale a
i18n.jsonusando el formato BCP-47 - Envía un pull request
Formato de locale BCP-47: language[-Script][-REGION]
language: ISO 639-1/2/3 (minúsculas):en,zh,bhoScript: ISO 15924 (mayúscula inicial):Hans,Hant,LatnREGION: ISO 3166-1 alpha-2 (mayúsculas):US,CN,IN- Ejemplos:
en,pt-BR,zh-Hans,sr-Cyrl-RS