Skip to content

Latest commit

 

History

History
510 lines (383 loc) · 17.3 KB

File metadata and controls

510 lines (383 loc) · 17.3 KB

Lingo.dev

Lingo.dev - Kit de ferramentas i18n de código aberto para localização com LLM


MCPCLICI/CDSDKCompiler

Release Licença Último Commit Product Hunt #1 DevTool do Mês Product Hunt #1 DevTool da Semana Product Hunt #2 Produto do Dia Trending no Github


Início rápido

Ferramenta Caso de uso Comando rápido
MCP Configuração de i18n assistida por IA para apps React Prompt: Set up i18n
CLI Traduz 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 dinâmica em tempo de execução npm install lingo.dev
Compiler Localização React em tempo de build sem wrappers i18n Plugin withLingo()

Lingo.dev MCP

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á:

  1. Configurar roteamento baseado em localidade (por exemplo, /en, /es, /pt-BR)
  2. Configurar componentes de troca de idioma
  3. Implementar detecção automática de localidade
  4. 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.

Leia a documentação →


Lingo.dev CLI

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 run

Como funciona:

  1. Extrai conteúdo traduzível dos arquivos configurados
  2. Envia o conteúdo para o provedor LLM para tradução
  3. Escreve o conteúdo traduzido de volta ao sistema de arquivos
  4. Cria o arquivo i18n.lock para rastrear traduções concluídas (evita processamento redundante)

Configuração:

O comando init gera um arquivo i18n.json. Configure os 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
  • Google
  • Mistral
  • OpenRouter
  • Ollama

Leia a documentação →


Lingo.dev CI/CD

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:

  1. Adicione LINGODOTDEV_API_KEY aos segredos do repositório (Settings > Secrets and variables > Actions)
  2. 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 Cria PR em vez de commitar diretamente
commit-message "feat: update translations via @LingoDotDev" Mensagem de commit personalizada
pull-request-title "feat: update translations via @LingoDotDev" Título personalizado de PR
working-directory "." Diretório para execução
parallel false Habilitar processamento paralelo

Leia a documentação →


Lingo.dev SDK

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

Uso:

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:

Leia a documentação →


Lingo.dev Compiler

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 observa seus componentes ficarem inchados com boilerplate de localização. É tão trabalhoso que as equipes adiam a internacionalização até que se torne uma grande refatoração.

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/compiler

Autenticaçã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_key

Configuraçã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 de performance zero em tempo de execução
  • 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
  • Sobrescritas manuais por atributo data-lingo-override
  • Widget integrado de edição de tradução

Modos de build:

  • pseudotranslator: Modo de desenvolvimento com traduções placeholder (sem custos de API)
  • real: Gera traduções reais usando LLMs
  • cache-only: Modo de produção utilizando 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.

Leia a documentação →


Contribuindo

Contribuições são bem-vindas. Siga estas diretrizes:

  1. Issues: Reporte bugs ou solicite recursos
  2. Pull Requests: Envie alterações
    • Todo PR requer um changeset: pnpm new (ou pnpm new:empty para mudanças que não geram release)
    • Certifique-se de executar os testes antes de enviar
  3. Desenvolvimento: Este é um monorepo pnpm + turborepo
    • Instale as dependências: pnpm install
    • Execute os testes: pnpm test
    • Build: pnpm build

Suporte: Comunidade no Discord

Histórico de estrelas

Se você acha o Lingo.dev útil, nos dê uma estrela e nos ajude a alcançar 10.000 estrelas!

[

Gráfico do histórico de estrelas

](https://www.star-history.com/#lingodotdev/lingo.dev&Date)

Documentação localizada

Traduções disponíveis:

English中文日本語한국어EspañolFrançaisРусскийУкраїнськаDeutschItalianoالعربيةעבריתहिन्दीPortuguês (Brasil)বাংলাفارسیPolskiTürkçeاردوभोजपुरीঅসমীয়াગુજરાતીमराठीଓଡ଼ିଆਪੰਜਾਬੀසිංහලதமிழ்తెలుగు

Adicionando um novo idioma:

  1. Adicione o código do locale em i18n.json usando o formato BCP-47
  2. Envie um pull request

Formato BCP-47 de locale: language[-Script][-REGION]

  • language: ISO 639-1/2/3 (minúsculas): en, zh, bho
  • Script: ISO 15924 (primeira letra maiúscula): Hans, Hant, Latn
  • REGION: ISO 3166-1 alpha-2 (maiúsculas): US, CN, IN
  • Exemplos: en, pt-BR, zh-Hans, sr-Cyrl-RS