Back

Internacionalización i18n en un proyecto de Next.js

JavaScript
i18n
Nextjs
next-intl

La internacionalización, también conocida como i18n (abreviatura de "internationalization"), es un aspecto crucial para alcanzar audiencias globales en el desarrollo de aplicaciones web. En este artículo, te guiaremos a través del proceso de integrar la internacionalización en tu proyecto de Next.js utilizando la librería next-intl.

3 min de lectura

Internacionalización i18n en un proyecto de Next.js por sergio campbell dev

Integrando la Internacionalización (i18n) en tu Proyecto de Next.js con next-intl

La internacionalización, también conocida como i18n (abreviatura de “internationalization”), es un aspecto crucial para alcanzar audiencias globales en el desarrollo de aplicaciones web. En este artículo, te guiaremos a través del proceso de integrar la internacionalización en tu proyecto de Next.js utilizando la librería next-intl.

¿Qué es next-intl?

next-intl es una librería que facilita la internacionalización en proyectos de Next.js. Permite la traducción de contenido y la gestión de formatos de fecha, hora y número en diferentes idiomas de una manera simple y eficiente.

Pasos para Integrar next-intl en tu Proyecto de Next.js

Los fragmentos de código siguen la configuración actual de next-intl para el App Router. La librería evoluciona rápido — si algo cambió, revisa la documentación oficial.

1. Instalando Dependencias

Para empezar, instala las dependencias necesarias ejecutando el siguiente comando en tu terminal:

npm install next-intl

 y crea la siguiente estructura de archivos:

├── messages (1)
   ├── en.json
   └── ...
├── next.config.mjs (2)
└── src
    ├── i18n.ts (3)
    ├── middleware.ts (4)
    └── app
        └── [locale]
            ├── layout.tsx (5)
            └── page.tsx (6)

2. Configurando next-intl (next.config)

El antiguo wrapper withIntl() ya no existe. La integración actual usa la fábrica createNextIntlPlugin de next-intl/plugin, que conecta tu configuración de i18n por petición con los Server Components:

// next.config.mjs (módulos ES)
import createNextIntlPlugin from 'next-intl/plugin';
const withNextIntl = createNextIntlPlugin();
const nextConfig = {};
export default withNextIntl(nextConfig);

Si tu proyecto usa CommonJS para la configuración de Next.js:

// next.config.js (CommonJS)
const createNextIntlPlugin = require('next-intl/plugin');
const withNextIntl = createNextIntlPlugin();
/** @type {import('next').NextConfig} */
const nextConfig = {};
module.exports = withNextIntl(nextConfig);

3. Creando Archivos de Traducción

Crea archivos de traducción para cada idioma que desees admitir en tu aplicación. Por ejemplo, puedes tener archivos como en.json para inglés y es.json para español, ubicados en un directorio como public/locales.

Ejemplo:

{
  "Index": {
    "title": "¡Hola mundo!"
  }
}

4. Configurando next.config.mjs

Ahora, configura el plugin que crea un alias para proporcionar tu configuración de i18n (especificada en el siguiente paso) a los Componentes del Servidor.

Si estás utilizando módulos de ECMAScript para tu configuración de Next.js, puedes usar el plugin de la siguiente manera:

/** @type {import('next').NextConfig} */
import createNextIntlPlugin from 'next-intl/plugin';
const withNextIntl = createNextIntlPlugin();
const nextConfig = {};
export default withNextIntl(nextConfig);

Si estás utilizando CommonJS para tu configuración de Next.js, puedes usar el plugin de la siguiente manera:

const createNextIntlPlugin = require('next-intl/plugin');
const withNextIntl = createNextIntlPlugin();
/** @type {import('next').NextConfig} */
const nextConfig = {};
module.exports = withNextIntl(nextConfig);

5. Configurando i18n.ts

next-intl crea una configuración una vez por solicitud. Aquí puedes proporcionar mensajes y otras opciones dependiendo del idioma del usuario.

// src/i18n.ts
import {notFound} from 'next/navigation';
import {getRequestConfig} from 'next-intl/server';
// Se puede importar desde una configuración compartida
const locales = ['en', 'es'];
export default getRequestConfig(async ({locale}) => {
  // Valida que el parámetro `locale` entrante sea válido
  if (!locales.includes(locale as any)) notFound();
  return {
    messages: (await import(`../messages/${locale}.json`)).default
  };
});

🚨 ¿Puedo mover este archivo a otro lugar?

Este archivo es compatible de forma predeterminada tanto en la carpeta src como en la raíz del proyecto con las extensiones .ts, .tsx, .js y .jsx.

Si prefieres mover este archivo a otro lugar, puedes proporcionar una ruta opcional al plugin:

const withNextIntl = createNextIntlPlugin(
  // Especifica una ruta personalizada aquí
  './somewhere/else/i18n.ts'
);

6. Configurando middleware.ts

El middleware coincide con un idioma para la solicitud y maneja las redirecciones y reescrituras en consecuencia.

//src/middleware.ts
import createMiddleware 
from 'next-intl/middleware';
export default createMiddleware({
// Una lista de todos los idiomas admitidos
  locales: ['en', 'es'],

// Se utiliza cuando no coincide ningún idioma
  defaultLocale: 'en'
});
export const config = {
// Coincide solo con nombres de ruta internacionalizados
  matcher: ['/', '/(es|en)/:path*']
};

7. Configurando app/[locale]/layout.tsx

El locale que coincidió con el middleware está disponible a través del parámetro locale y se puede utilizar para configurar el idioma del documento.

//app/[locale]/layout.tsx
export default function LocaleLayout({
  children,
  params: {locale}
}: {
  children: React.ReactNode;
  params: {locale: string};
}) {
  return (
    <html lang={locale}>
      <body>{children}</body>
    </html>
  );
}

Usando Traducciones

¡Utiliza traducciones en los componentes de tu página o en cualquier otro lugar!

//app/[locale]/page.tsx
import {useTranslations} from 'next-intl';
export default function Index() {
  const t = useTranslations('Index');
  return < h1 >{t('title')}</ h1 >;
}

Comienza a Internacionalizar tu Aplicación Next.js Hoy Mismo

Con estos sencillos pasos, puedes añadir fácilmente soporte de internacionalización a tu proyecto de Next.js utilizando next-intl. Ahora, tu aplicación estará lista para alcanzar una audiencia global y proporcionar una experiencia localizada y personalizada. ¡No esperes más y comienza a internacionalizar tu aplicación hoy mismo!

Recuerda seguir la documentación para más detalles


Fuentes y lecturas adicionales