Integração com Next.js

Max PrilutskiyCEO e cofundadorAtualizado em: há 7 meses · 3 min de leitura

Alpha

O Compiler da Lingo.dev está em alpha. É instável, não é recomendado para uso em produção e as APIs podem mudar entre versões.

O Compiler da Lingo.dev integra-se com o App Router do Next.js através de um wrapper de configuração withLingo() que transforma o pipeline de build para gerar bundles por idioma. Suporta React Server Components, Webpack e Turbopack sem exigir alterações ao código dos componentes.

Pré-requisitos#

Requisitos

  • Next.js 14+ com App Router
  • Node.js 18+
  • @lingo.dev/compiler instalado

Instalar#

bash
pnpm install @lingo.dev/compiler

Configurar o next.config.ts#

Envolva a configuração do Next.js com withLingo. A função de configuração tem de ser async — isto é obrigatório porque withLingo faz uma inicialização assíncrona durante o build.

ts
// 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", "de", "fr", "ja"],
    models: "lingo.dev",
    dev: {
      usePseudotranslator: true,
    },
  });
}

Configuração async obrigatória

A configuração tem de ser exportada como uma função async, e não como um objeto simples. Se exportar um objeto simples, o Compiler não conseguirá inicializar e o build irá falhar. Consulte Troubleshooting para mais detalhes.

Adicionar o LingoProvider#

Envolva o layout raiz com LingoProvider para ativar o contexto de idioma em toda a árvore de componentes:

tsx
// app/layout.tsx
import { LingoProvider } from "@lingo.dev/compiler/react";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <LingoProvider>
      <html>
        <body>{children}</body>
      </html>
    </LingoProvider>
  );
}

LingoProvider trata da resolução do idioma, da persistência e do carregamento de dicionários. Funciona tanto com Server Components como com Client Components.

Server Components e Client Components#

O Compiler trata ambos os tipos de componentes de forma transparente:

Tipo de componenteComo funcionam as traduções
React Server ComponentsAs traduções são resolvidas no servidor no momento do pedido. Sem overhead de JS no cliente.
Client Components ("use client")As traduções são incluídas no chunk do cliente. useLingoContext() disponível para mudar de idioma.
Componentes partilhadosFuncionam em ambos os contextos. O Compiler deteta automaticamente o ambiente de renderização.
tsx
// app/page.tsx - Server Component (default)
export default function Home() {
  return <h1>Welcome to our app</h1>;
  // Renders translated text with zero client JS
}
tsx
// app/components/greeting.tsx - Client Component
"use client";

export function Greeting() {
  return <p>Hello, world</p>;
  // Translations included in client bundle
}

Suporte de bundlers#

O wrapper withLingo() funciona com os dois bundlers suportados pelo Next.js:

BundlerSuporteNotas
WebpackCompletoBundler predefinido. Não é necessária qualquer configuração adicional.
TurbopackCompletoAtive com next dev --turbopack. O Compiler deteta automaticamente o Turbopack.

Configuração de sourceRoot#

A opção sourceRoot indica ao Compiler qual o diretório que contém os componentes traduzíveis. Em projetos com Next.js App Router, normalmente é ./app:

ts
{
  sourceRoot: "./app",
}

Se tiver componentes fora de ./app (como uma pasta partilhada components/), defina sourceRoot para o diretório principal comum:

ts
{
  sourceRoot: ".",
}

Um sourceRoot mais abrangente significa que serão analisados mais ficheiros. Em projetos grandes, mantenha-o o mais restrito possível para reduzir os tempos de build. Em alternativa, use useDirective: true e adicione 'use i18n' apenas aos ficheiros que precisam de tradução. Consulte Project Structure para mais detalhes.

Próximos passos#