Se seu repositório já tem next-intl, react-i18next, i18next ou Lingui configurados — com pastas de locale no disco, dependências em package.json, middleware ou arquivos de configuração — você não precisa de mais uma ferramenta que finja que você está começando do zero. O globalize.now é uma infraestrutura de localização com IA. No modo L1 (já internacionalizado), o produto pula o scaffold destrutivo de configuração e permanece em modo de sincronização: lê seu idioma de origem, compara os demais locales a cada push e abre pull requests com os preenchimentos. Este artigo mostra o que esse modo altera, o que ele se recusa a alterar e o que fazer quando a detecção erra.

Por que a maioria das dicas sobre i18n parte do princípio de que você está começando do zero?

Os materiais de marketing de ferramentas de i18n ainda se baseiam no cenário "greenfield": nenhuma biblioteca instalada, nenhum arquivo de locale, nenhuma extração feita. A maioria dos códigos em produção não está nessa situação.

Nas últimas semanas, três primeiros contatos sem relação entre si trouxeram o mesmo padrão: o time tentou fazer i18n uma vez, chegou a algo que funcionava pela metade e parou — porque arrancar tudo e refazer parecia pior do que conviver com a bagunça.

Se esse é o seu caso, este post foi escrito para você.

Como é, na prática, uma base de código parcialmente internacionalizada?

Esses padrões aparecem repetidamente (detalhes anonimizados):

  • Um app Next.js + next-intl em que a maioria dos componentes usa t(), mas rotas mais antigas ainda enviam texto fixo em inglês porque a primeira leva de migração nunca foi concluída.
  • Um projeto React + i18next cujos arquivos de locale existem, mas só contêm valores em inglês — traduzir sempre ficava para o próximo trimestre.
  • Uma árvore messages/ em que en.json está completo e es.json está praticamente vazio.
  • Um seletor de idioma incorporado ao layout que às vezes retorna 404 porque o roteamento foi migrado apenas pela metade.

Nenhum desses projetos precisa que o globalize.now recomece do zero. Eles precisam que ele conclua o trabalho.

L0 versus L1 setup pathA decision tree showing that when globalize.now detects existing i18n on first run, it skips four destructive setup steps and goes straight to translating missing keys.your repoDETECTIONfirst-run scan of package.json + repoNO i18n FOUNDL0 pathi18n DETECTEDL1 pathinstall libraryextract stringsgenerate locale filesinject switchertranslateinstall libraryextract stringsgenerate locale filesinject switchertranslateSKIPPEDPR on every push
A detecção bifurca o fluxo de configuração. O L0 executa as cinco etapas completas; o L1 pula quatro delas e vai direto para a sincronização.

Quais sinais o globalize.now busca na primeira execução?

A detecção acontece em duas etapas, não em uma só.

Primeiro, aponte o globalize.now para o repositório. Conectá-lo no app já executa a detecção e a conversão única para você. Se preferir que seu agente faça essa análise localmente, instale as skills — isso apenas adiciona alguns arquivos de playbook em .claude/skills/ e não muda mais nada no seu repositório:

npx skills add globalize-now/globalize-skills

Em seguida, dê o comando ao seu agente — Claude Code, Cursor ou Codex. O agente lê as skills instaladas e as usa para varrer seu repositório:

Set up localization for my project

É nessa segunda etapa que a detecção de fato acontece. O agente procura por:

  • Dependências de package.json: next-intl, react-i18next, i18next, @lingui/core, @lingui/react, @lingui/macro, ou qualquer plugin de i18next-*.
  • Pastas de locale: messages/ na raiz do repositório, uma pasta locales/, ou src/i18n/ com subpastas de locale.
  • Arquivos de locale existentes: en.json, en.po, en.yml, en.yaml, ou o arquivo do locale padrão que sua biblioteca já espera.
  • Configuração específica de framework: i18n.config.ts, middleware do next-intl, lingui.config.js, ou equivalentes.

Se pelo menos dois desses sinais estiverem presentes, o projeto é tratado como L1 — já internacionalizado — e o fluxo de configuração segue outro caminho em vez de rodar o scaffold completo para projetos do zero. Mais detalhes estão no artigo da Central de Ajuda sobre i18n existente.

O que o modo L1 se recusa a alterar?

Esta é a parte com que as pessoas se importam. No modo L1, o globalize.now não:

  • Executa a varredura ampla de extração de strings que vasculha componentes em busca de literais fixos.
  • Gera novas chaves de tradução ou reorganiza a estrutura de chaves que você já definiu.
  • Cria do zero arquivos de locale para idiomas que você ainda não configurou.
  • Injeta um seletor de idioma. Se você já tem um, ele permanece. Se não tem, nós não adicionamos um.
  • Reescreve roteamento, middleware ou configuração de framework por você.

Sua configuração de i18n existente continua sendo sua. Nesse modo, não a reestruturamos.

O que o modo de sincronização L1 faz depois da detecção?

O L1 prioriza a sincronização. Depois que a detecção se estabiliza:

  1. Lemos seus arquivos de locale existentes para entender a estrutura atual das chaves e qual idioma é a fonte de verdade.
  2. Você conecta o repositório do GitHub pela CLI do globalize.now ou pelo aplicativo web.
  3. A cada push para sua branch main, comparamos o arquivo do idioma de origem com os demais locales. As traduções ausentes são preenchidas com saída de IA que respeita o glossário e o guia de estilo que você configurou.
  4. Um pull request chega com os arquivos de locale atualizados. Você revisa e faz o merge. Nós nunca mesclamos por você.

Esse é o ciclo. Sem painel de tradução para vigiar. Sem exportações manuais. Sem malabarismo de formatos de arquivo.

Compare isso com o passo a passo do L0 em Como adiciono i18n a um app Next.js criado no Cursor em 15 minutos? — o mesmo produto, com um ponto de entrada diferente.

E se só parte da interface usar chamadas de tradução?

Esse é o padrão normal de migração parcial: telas novas usam t(), telas antigas ainda vazam literais. Fora do modo de sincronização, o pipeline de skills trata as strings que já têm chave como travadas: ele foca nos literais que ainda não foram conectados e preserva as chaves existentes. Times que fazem deploy toda semana enquanto estão no meio dessa migração são o usuário

Para um relato completo de conversão feita por agente em uma árvore complicada, veja O que acontece quando um agente de IA internacionaliza um monorepo real?.

O que fazer se o fluxo de configuração criou tudo do zero mesmo assim?

Estamos refinando a lógica de detecção para que o caminho errado não seja acionado, mas se npx skills add globalize-now/globalize-skills já gerou um diff com mais de 100 arquivos que reescreve sua pasta de locale, adiciona um seletor de idioma que você não pediu, ou reestrutura o roteamento — não faça commit. Use o widget de feedback (canto inferior direito) com sua lista de dependências de package.json e uma breve descrição de como suas pastas de locale estão organizadas; podemos direcionar o repositório manualmente para o L1. Uma flag de CLI self-service --existing-i18n está a caminho.

A recuperação na sua máquina é git restore . mais git clean -fd, se necessário. Nada foi enviado com push; nada em produção quebrou; o agente só mexeu na sua branch local. O relato completo está em globalize_skills fez mudanças demais — o que aconteceu?.

Por que "tentamos fazer i18n e travamos" virou a história padrão?

Isso não é um slogan — é um padrão. Três primeiros contatos independentes em seis semanas, três versões de "é, a gente tentou isso; agora está tudo torto". Uma extensão do Chrome com dezenas de milhares de usuários sofreu um pico de tráfego coreano e expôs uma migração de next-intl inacabada. Um app criado no Lovable quebrou o próprio build ao adicionar suporte multilíngue e teve que ser revertido. Um repositório React + Vite feito no estilo vibe coding conectou o i18next, preencheu cerca de um terço das chaves e parou por aí.

A base de código L0 perfeitamente limpa, em busca de uma biblioteca, realmente existe, mas não é o gargalo. O gargalo é a base de código que já tentou isso uma vez e agora ninguém quer assumir a bagunça resultante.

O modo L1 existe exatamente para essa base de código.

Quanto custa?

€20 por mês. Um único plano. Aproximadamente 16.000 palavras incluídas (pense em algo como 80 telas típicas de aplicativo). €5 de crédito de tradução ao se cadastrar. Seja você L0 e começando do zero, ou L1 arrastando três anos de dívida de locale, o preço é o mesmo — medimos volume e automação, não o quão bagunçado estava o primeiro commit.

Quais posts e documentos da Central de Ajuda devo ler em seguida?

Disponibilize os idiomas que seu tráfego já espera — conecte o repositório em globalize.now, ou veja como a automação por push no Git se encaixa no fluxo de trabalho de um time já estabelecido.

O globalize.now transforma textos fixos do app em arquivos de locale prontos para tradução e os mantém atualizados a cada novo lançamento.

Experimente o globalize.now grátis