Lingo.dev - Kit de ferramentas i18n de código aberto para localização com LLM
MCP •CLI • CI/CD •SDK • Compiler
| Ferramenta | Caso de uso | Comando rápido |
|---|---|---|
| MCP | Configuração de i18n assistida por IA para apps React | Prompt: Set up i18n |
| CLI | Traduzir arquivos JSON, YAML, markdown, CSV, PO | npx lingo.dev@latest run |
| CI/CD | Pipeline de tradução automatizado no GitHub Actions | uses: lingodotdev/lingo.dev@main |
| SDK | Tradução em tempo de execução para conteúdo dinâmico | npm install lingo.dev |
| Compiler | Localização React em tempo de build sem wrappers i18n | Plugin withLingo() |
Configurar i18n em aplicações React é notoriamente propenso a erros - mesmo para desenvolvedores experientes. Assistentes de IA para codificação pioram a situação: eles alucinam APIs inexistentes, esquecem configurações de middleware, quebram o roteamento ou implementam metade de uma solução antes de se perderem. O problema é que a configuração de i18n requer uma sequência precisa de mudanças coordenadas em múltiplos arquivos (roteamento, middleware, componentes, configuração), e os LLMs têm dificuldade em manter esse contexto.
O Lingo.dev MCP resolve isso fornecendo aos assistentes de IA acesso estruturado ao conhecimento de i18n específico de cada framework. Em vez de adivinhar, seu assistente segue padrões de implementação verificados para Next.js, React Router e TanStack Start.
IDEs suportadas:
- Claude Code
- Cursor
- GitHub Copilot Agents
- Codex (OpenAI)
Frameworks suportados:
- Next.js (App Router e Pages Router v13-16)
- TanStack Start (v1)
- React Router (v7)
Uso:
Após configurar o servidor MCP na sua IDE (veja os guias de início rápido), solicite ao seu assistente:
Set up i18n with the following locales: en, es, and pt-BR. The default locale is 'en'.
O assistente irá:
- Configurar roteamento baseado em locale (por exemplo,
/en,/es,/pt-BR) - Configurar componentes de troca de idioma
- Implementar detecção automática de locale
- Gerar arquivos de configuração necessários
Observação: a geração de código assistida por IA é não-determinística. Revise o código gerado antes de fazer commit.
Manter traduções sincronizadas é tedioso. Você adiciona uma nova string, esquece de traduzi-la e envia uma interface quebrada para usuários internacionais. Ou você envia arquivos JSON para tradutores, espera dias e depois mescla manualmente o trabalho deles de volta. Escalar para mais de 10 idiomas significa gerenciar centenas de arquivos que constantemente ficam dessincronizados.
O Lingo.dev CLI automatiza isso. Aponte-o para seus arquivos de tradução, execute um comando e todos os locales são atualizados. Um arquivo de bloqueio rastreia o que já foi traduzido, então você paga apenas por conteúdo novo ou alterado. Suporta arquivos JSON, YAML, CSV, PO e markdown.
Configuração:
# Initialize project
npx lingo.dev@latest init
# Run translations
npx lingo.dev@latest runComo funciona:
- Extrai conteúdo traduzível dos arquivos configurados
- Envia o conteúdo para o provedor LLM para tradução
- Grava o conteúdo traduzido de volta no sistema de arquivos
- Cria o arquivo
i18n.lockpara rastrear traduções concluídas (evita processamento redundante)
Configuração:
O comando init gera um arquivo i18n.json. Configure locales e buckets:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.10",
"locale": {
"source": "en",
"targets": ["es", "fr", "de"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"]
}
}
}O campo provider é opcional (padrão: Lingo.dev Engine). Para provedores LLM personalizados:
{
"provider": {
"id": "openai",
"model": "gpt-4o-mini",
"prompt": "Translate from {source} to {target}"
}
}Provedores LLM suportados:
- Lingo.dev Engine (recomendado)
- OpenAI
- Anthropic
- Mistral
- OpenRouter
- Ollama
Traduções são a funcionalidade que está sempre "quase pronta". Engenheiros fazem merge de código sem atualizar os locales. O QA detecta traduções faltando em staging - ou pior, os usuários detectam em produção. A causa raiz: tradução é uma etapa manual que é fácil de pular sob pressão de prazo.
O Lingo.dev CI/CD torna as traduções automáticas. Cada push aciona a tradução. Strings faltando são preenchidas antes do código chegar à produção. Nenhuma disciplina necessária - o pipeline cuida disso.
Plataformas suportadas:
- GitHub Actions
- GitLab CI/CD
- Bitbucket Pipelines
Configuração do GitHub Actions:
Crie .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 configuração:
- Adicione
LINGODOTDEV_API_KEYaos secrets do repositório (Settings > Secrets and variables > Actions) - Para workflows de PR: Habilite "Allow GitHub Actions to create and approve pull requests" em Settings > Actions > General
Opções de workflow:
Fazer commit das traduções diretamente:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}Crie pull requests com traduções:
uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
pull-request: true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Inputs disponíveis:
| Input | Padrão | Descrição |
|---|---|---|
api-key |
(obrigatório) | Chave de API do Lingo.dev |
pull-request |
false |
Criar PR em vez de fazer commit direto |
commit-message |
"feat: update translations via @LingoDotDev" |
Mensagem de commit personalizada |
pull-request-title |
"feat: update translations via @LingoDotDev" |
Título de PR personalizado |
working-directory |
"." |
Diretório para executar |
parallel |
false |
Habilitar processamento paralelo |
Arquivos de tradução estáticos funcionam para labels de UI, mas e quanto ao conteúdo gerado por usuários? Mensagens de chat, descrições de produtos, tickets de suporte - conteúdo que não existe em tempo de build não pode ser pré-traduzido. Você fica preso mostrando texto não traduzido ou construindo um pipeline de tradução personalizado.
O Lingo.dev SDK traduz conteúdo em tempo de execução. Passe qualquer texto, objeto ou HTML e receba de volta uma versão localizada. Funciona para chat em tempo real, notificações dinâmicas ou qualquer conteúdo que chega após o deploy. Disponível para JavaScript, PHP, Python e Ruby.
Instalação:
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 disponíveis:
- JavaScript SDK - Aplicativos web, Node.js
- PHP SDK - PHP, Laravel
- Python SDK - Django, Flask
- Ruby SDK - Rails
A i18n tradicional é invasiva. Você envolve cada string em funções t(), inventa chaves de tradução (home.hero.title.v2), mantém arquivos JSON paralelos e vê seus componentes incharem com boilerplate de localização. É tão tedioso que as equipes adiam a internacionalização até que ela se torne uma refatoração massiva.
O Lingo.dev Compiler elimina a cerimônia. Escreva componentes React com texto em inglês simples. O compilador detecta strings traduzíveis em tempo de build e gera variantes localizadas automaticamente. Sem chaves, sem arquivos JSON, sem funções wrapper - apenas código React que funciona em vários idiomas.
Instalação:
pnpm install @lingo.dev/compilerAutenticação:
# 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_keyConfiguração (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 },
});
}Configuração (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(),
],
});Configuração do provider:
// 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>
);
}Seletor 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>
);
}Desenvolvimento: npm run dev (usa pseudotranslator, sem chamadas de API)
Produção: Defina usePseudotranslator: false, depois next build
Faça commit do diretório .lingo/ no controle de versão.
Recursos principais:
- Custo zero de performance em runtime
- Sem chaves de tradução ou arquivos JSON
- Sem funções
t()ou componentes wrapper<T> - Detecção automática de texto traduzível em JSX
- Suporte a TypeScript
- ICU MessageFormat para plurais
- Substituições manuais via atributo
data-lingo-override - Widget integrado de editor de traduções
Modos de build:
pseudotranslator: Modo de desenvolvimento com traduções placeholder (sem custos de API)real: Gera traduções reais usando LLMscache-only: Modo de produção usando traduções pré-geradas do CI (sem chamadas de API)
Frameworks suportados:
- Next.js (App Router com React Server Components)
- Vite + React (SPA e SSR)
Suporte a frameworks adicionais planejado.
Contribuições são bem-vindas. Siga estas diretrizes:
- Issues: Reporte bugs ou solicite recursos
- Pull Requests: Envie alterações
- Todo PR requer um changeset:
pnpm new(oupnpm new:emptypara alterações que não geram release) - Certifique-se de que os testes passem antes de enviar
- Todo PR requer um changeset:
- Desenvolvimento: Este é um monorepo pnpm + turborepo
- Instale as dependências:
pnpm install - Execute os testes:
pnpm test - Build:
pnpm build
- Instale as dependências:
Suporte: Comunidade no Discord
Se você acha o Lingo.dev útil, nos dê uma estrela e nos ajude a alcançar 10.000 estrelas!
[
](https://www.star-history.com/#lingodotdev/lingo.dev&Date)
Traduções disponíveis:
English • 中文 • 日本語 • 한국어 • Español • Français • Русский • Українська • Deutsch • Italiano • العربية • עברית • हिन्दी • Português (Brasil) • বাংলা • فارسی • Polski • Türkçe • اردو • भोजपुरी • অসমীয়া • ગુજરાતી • मराठी • ଓଡ଼ିଆ • ਪੰਜਾਬੀ • සිංහල • தமிழ் • తెలుగు
Adicionando um novo idioma:
- Adicione o código do locale em
i18n.jsonusando o formato BCP-47 - Envie um pull request
Formato de locale BCP-47: language[-Script][-REGION]
language: ISO 639-1/2/3 (minúsculas):en,zh,bhoScript: ISO 15924 (primeira letra maiúscula):Hans,Hant,LatnREGION: ISO 3166-1 alpha-2 (maiúsculas):US,CN,IN- Exemplos:
en,pt-BR,zh-Hans,sr-Cyrl-RS