Você instala uma única CLI, envia um prompt ao Cursor, e seu projeto Next.js passa de um JSX só em inglês para um app multilíngue funcional, com roteamento [locale], chaves geradas e sincronização automática a cada push. globalize.now é uma infraestrutura de localização baseada em IA que faz o trabalho de i18n que o Cursor deixou passar: extrair strings hardcoded, gerar chaves next-intl e arquivos de locale, e manter as traduções sincronizadas a cada push no Git. O passo a passo abaixo parte de um projeto padrão com App Router. Tempo total no nosso repositório de teste: 13 minutos e 40 segundos.

O que realmente quebra quando o Cursor constrói sua UI em Next.js?

O Cursor otimiza para uma UI funcional, não para arquitetura. Ele gera código a partir de instruções em linguagem natural e atualiza trechos de código via prompts, o que significa que o JSX é escrito como um humano escreveria um protótipo rápido: texto direto no código, sem chaves, sem arquivos de locale, sem segmento [locale].

Uma página típica de Next.js gerada pelo Cursor se parece com isto:

// app/page.tsx
export default function Home() {
  return (
    <main>
      <h1>Welcome to Acme</h1>
      <p>Get started in seconds.</p>
      <button>Sign up</button>
    </main>
  )
}

Três strings hardcoded em uma única página. Um app de verdade tem centenas delas espalhadas por dezenas de componentes. O Pages Router costumava vir com uma configuração de i18n embutida, mas ela foi removida quando o App Router se tornou o padrão, deixando para os desenvolvedores a tarefa de configurar middleware, segmentos de rota dinâmicos e uma biblioteca externa como o next-intl. Nada no comportamento padrão do Cursor faz isso por você.

O resultado é o padrão que já vimos em Por que as traduções do seu app no Lovable quebram a cada deploy: a base de código cresce, as strings hardcoded se acumulam, e “adicionar espanhol mês que vem” vira um refactor de várias semanas.

Como eu configuro o globalize.now em um projeto Cursor?

Conecte seu repositório em globalize.now. A primeira conversão roda uma única vez, dentro do app: ela lê o repositório, substitui as strings hardcoded por chaves e abre um pull request para você revisar. A partir daí, todo push traduz o que houver de novo.

Para conduzir essa primeira passagem a partir do Cursor, instale as skills a partir da raiz do projeto:

npx skills add globalize-now/globalize-skills

A CLI detecta sua stack, escolhe o preset certo para o Cursor e instala as regras de agente no seu projeto. Em um projeto Next.js 16 com App Router, a saída é assim:

✓ Stack detected: Next.js 16 (App Router)
✓ Editor detected: Cursor
✓ Preset selected: globalize-guide + next-intl
✓ Installed 4 skill files to .cursor/rules/
Done in 1.2s

Os arquivos de skill ficam junto das suas regras existentes do Cursor. Eles dizem ao agente do Cursor como lidar com a extração de strings, como gerar chaves consistentes com as convenções do next-intl e como configurar o segmento de rota [locale]. Nada sai da sua máquina. Seu código não é enviado para lugar nenhum.

Se você usa Claude Code ou Codex em vez do Cursor, a CLI instala os arquivos de skill equivalentes para essas ferramentas. O fluxo a partir daí é idêntico.

Como o agente extrai strings hardcoded de uma base de código no Cursor?

Abra o painel de agente do Cursor e envie um único prompt:

Set up i18n for this project. Use English, Spanish, German, and Arabic.

O agente carrega as regras instaladas, escaneia os diretórios app/ e components/, e retorna um relatório. Em um site institucional com 12 páginas, o relatório costuma ser assim:

Detected Next.js 16 with App Router.
Found 47 hardcoded strings across 12 components.
Best fit: next-intl. RTL required for Arabic.

Plan:
- Install next-intl
- Move app/* into app/[locale]/*
- Generate i18n/request.ts and middleware.ts
- Extract 47 strings to messages/en.json
- Convert JSX to useTranslations / getTranslations calls

Proceed? (y/n)

O agente está fazendo o que a documentação do next-intl chama de parte dolorosa: middleware, segmentos de rota dinâmicos, configuração de requisições e a conversão componente por componente para usar hooks de tradução. Você revisa o plano e confirma. O agente aplica as mudanças como uma única edição multi-arquivo que você pode aceitar ou rejeitar na visualização de diff do Cursor.

Como ele gera as chaves e os arquivos de locale do next-intl?

Depois que você aprova o plano, o agente gera a estrutura padrão do next-intl. O repositório ganha quatro novidades:

i18n/
  request.ts
  routing.ts
middleware.ts
messages/
  en.json
  es.json
  de.json
  ar.json
app/
  [locale]/
    layout.tsx
    page.tsx
    ...

Dentro de messages/en.json, as 47 strings extraídas viram chaves organizadas em namespaces, agrupadas por componente ou rota:

{
  "Home": {
    "heading": "Welcome to Acme",
    "lede": "Get started in seconds.",
    "signupCta": "Sign up"
  }
}

O page.tsx original é reescrito para usar useTranslations nos componentes client e getTranslations nos componentes server. A divisão é automática. O agente identifica quais componentes têm a diretiva "use client" e escolhe o hook correto.

Os arquivos JSON em espanhol, alemão e árabe são gerados com traduções de primeira passagem que respeitam um glossário construído pelo agente a partir dos nomes dos seus componentes e props. Termos de marca permanecem em inglês. O suporte a RTL já vem configurado no layout: o atributo dir é definido a partir do locale, e propriedades lógicas de CSS substituem utilitários fixos de esquerda/direita onde o agente consegue detectá-los.

Esse é o mesmo padrão de ponta a ponta que aplicamos em um monorepo de produção em O que acontece quando um agente de IA internacionaliza um monorepo real?. O formato do passo a passo é o mesmo; os insumos é que mudam.

Como funciona a sincronização via Git push depois da primeira execução?

A primeira execução acontece uma única vez. A sincronização é para sempre.

Depois que o agente termina, você conecta o repositório ao globalize.now pelo dashboard. A partir daí:

Push to main
   ↓
globalize.now diffs against last synced state
   ↓
New hardcoded strings get extracted + keyed
   ↓
Translations generated for every configured locale
   ↓
PR opened with locale file updates

O Cursor não precisa estar aberto. O Claude Code não precisa estar rodando. A sincronização acontece na camada do Git, então funciona não importa qual ferramenta tenha escrito o próximo lote de UI. Quando o Cursor regenerar um componente semana que vem e adicionar três botões novos, esses botões chegam já traduzidos no próximo PR.

Não existe exportação manual. Não existe fila de revisão. Não existe ida e volta de CSV. A promessa do produto é a mesma que documentamos em Como globalizar seu app com globalize.now: configure uma vez, sincronize automaticamente a cada push.

E se você já tiver uma configuração de next-intl feita manualmente?

O agente a lê primeiro.

Se i18n/request.ts já existir, o agente adota sua configuração em vez de sobrescrevê-la. Se messages/en.json já tiver Pricing.heading, o agente reaproveita essa chave em vez de gerar uma nova. Se sua convenção de namespace for pricing.heading (minúsculo, com pontos) em vez de Pricing.heading (PascalCase, aninhado), o agente se adapta a ela.

A única coisa que o agente se recusa a fazer é sobrescrever silenciosamente um arquivo de locale existente. Se houver colisão de chaves, ele para e pergunta. Esse comportamento está codificado nas regras de skill instaladas por npx skills add globalize-now/globalize-skills, não é algo que você precisa configurar.

O globalize.now resolve isso. Conecte seu repositório Next.js e a conversão roda uma única vez, dentro do app; as skills do npx skills add globalize-now/globalize-skills cuidam do trabalho que vem depois, direto no seu editor. Veja como funciona em globalize.now.

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