Aprende a implementar internacionalización (i18n) de forma fluida en tus aplicaciones Next.js para llegar a una audiencia global. Cubre enrutamiento, traducción de contenido y mejores prácticas.
Internacionalización en Next.js: Creando aplicaciones multilingües para una audiencia global
En el mundo interconectado de hoy, crear aplicaciones que se adapten a una audiencia global ya no es un lujo, es una necesidad. Next.js, un potente framework de React, proporciona características robustas para implementar la internacionalización (i18n), permitiéndote crear aplicaciones multilingües que ofrecen una experiencia localizada a usuarios de todo el mundo. Esta guía completa te guiará a través de los conceptos, técnicas y mejores prácticas esenciales para construir aplicaciones internacionalizadas con Next.js.
Entendiendo la Internacionalización y la Localización
Antes de sumergirnos en los detalles de la i18n de Next.js, aclaremos los términos clave:
- Internacionalización (i18n): El proceso de diseñar y desarrollar una aplicación para que pueda adaptarse fácilmente a diversos idiomas y regiones sin requerir cambios de ingeniería. Esto implica abstraer texto, formatos y otros elementos específicos de la configuración regional (locale).
- Localización (l10n): El proceso de adaptar una aplicación a un idioma y región específicos. Esto incluye traducir texto, ajustar formatos de fecha y hora, símbolos de moneda y más.
En esencia, la i18n prepara tu aplicación para la localización. Al separar los elementos dependientes del idioma del código principal, facilitas la localización de la aplicación para diferentes mercados.
¿Por qué implementar la internacionalización en Next.js?
Implementar i18n en tu aplicación Next.js ofrece numerosos beneficios:
- Alcance ampliado: Llega a una audiencia más amplia proporcionando contenido en su idioma preferido.
- Experiencia de usuario mejorada: Ofrece una experiencia más personalizada y atractiva para los usuarios de diferentes regiones.
- SEO mejorado: Mejora la optimización para motores de búsqueda (SEO) al proporcionar contenido localizado que se dirige a regiones geográficas específicas.
- Aumento de conversiones: Aumenta las conversiones presentando la información en el idioma nativo del usuario, fomentando la confianza y la comprensión.
- Presencia de marca global: Establece una presencia de marca global más sólida demostrando un compromiso con la inclusividad y atendiendo a audiencias diversas.
Características y configuración de i18n en Next.js
Next.js ofrece soporte integrado para i18n a través de sus funciones de enrutamiento y gestión de contenido. A continuación, se desglosan las características importantes:
1. Configurando i18n en next.config.js
La configuración principal para i18n reside en el archivo next.config.js
. Aquí tienes un ejemplo:
/** @type {import('next').NextConfig} */
const nextConfig = {
i18n: {
locales: ['en', 'es', 'fr'], // Un array de las configuraciones regionales (locales) soportadas (códigos de idioma)
defaultLocale: 'en', // El locale predeterminado a utilizar
localeDetection: true, // Habilita/deshabilita la detección automática del locale según la configuración del navegador (opcional)
// domains: [
// {
// domain: 'example.com',
// defaultLocale: 'en',
// },
// {
// domain: 'example.es',
// defaultLocale: 'es',
// },
// ],
},
}
module.exports = nextConfig;
Explicación:
locales
: Un array que contiene los códigos de idioma (p. ej.,'en'
para inglés,'es'
para español,'fr'
para francés) de los idiomas soportados por tu aplicación. Asegúrate de seguir los códigos de idioma ISO 639-1 para mantener la consistencia.defaultLocale
: El idioma predeterminado que utilizará tu aplicación. Este es el idioma que se muestra si no se especifica otro en la URL o no se detecta en la configuración del navegador del usuario. Elige un idioma que sea representativo de tu audiencia principal.localeDetection
: Un valor booleano que controla si Next.js detecta automáticamente el idioma preferido del usuario según la configuración de su navegador. Si se establece entrue
, Next.js intentará redirigir al usuario a la versión del sitio en el idioma apropiado.domains
(opcional): Un array que te permite asociar locales con dominios específicos. Esto es útil si tienes dominios separados para diferentes idiomas (p. ej.,example.com
para inglés,example.es
para español).
2. Enrutamiento con prefijos de locale
Next.js añade automáticamente prefijos a las rutas con el locale. Por ejemplo, si tienes una página en /about
y el locale es 'es' (español), la URL se convertirá en /es/about
. Esto permite tener diferentes versiones de idioma de las páginas y que los motores de búsqueda indexen el contenido para cada locale. El framework se encarga de la redirección y el enrutamiento por ti.
3. Utilizando el hook useRouter
El hook useRouter
de next/router
proporciona acceso al locale actual y a otra información de enrutamiento.
import { useRouter } from 'next/router';
function MyComponent() {
const router = useRouter();
const { locale, locales, defaultLocale } = router;
return (
Locale actual: {locale}
Locales disponibles: {locales.join(', ')}
Locale predeterminado: {defaultLocale}
);
}
export default MyComponent;
El objeto router
ofrece las siguientes propiedades clave:
locale
: El locale actualmente seleccionado (p. ej., 'en', 'es', 'fr').locales
: Un array con todos los locales soportados definidos ennext.config.js
.defaultLocale
: El locale predeterminado establecido ennext.config.js
.asPath
: La ruta tal como se muestra en el navegador, incluyendo el prefijo del locale (p. ej.,/es/about
).pathname
: La ruta sin el prefijo del locale (p. ej.,/about
).
Estrategias de traducción de contenido
Una vez que hayas configurado tu aplicación Next.js para i18n, necesitarás implementar estrategias para traducir tu contenido. Aquí hay varios enfoques populares:
1. Usando un sistema de gestión de traducciones (TMS) dedicado
Para proyectos a gran escala con muchos idiomas, un TMS es muy recomendable. Las opciones populares incluyen:
- Phrase: Un TMS basado en la nube con integraciones para diversas plataformas, incluido Next.js. Ofrece funciones colaborativas y flujos de trabajo automatizados.
- Localize: Otro TMS basado en la nube que soporta una amplia gama de formatos de archivo y proporciona funciones de gestión de traducciones.
- Crowdin: Un potente TMS que es muy popular en la comunidad de código abierto y se integra bien con Next.js, permitiendo a los equipos traducir contenido de manera eficiente.
Beneficios:
- Gestión de traducciones centralizada.
- Funciones de colaboración para traductores.
- Automatización de los flujos de trabajo de traducción.
- Integración con tu flujo de trabajo de desarrollo.
2. Creando archivos de traducción JSON
Para proyectos más pequeños, usar archivos JSON para almacenar traducciones es un método simple y efectivo.
Ejemplo de estructura de directorios:
/src
├── locales
│ ├── en.json
│ └── es.json
├── components
│ └── MyComponent.js
└── pages
└── index.js
Ejemplo de en.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Ejemplo de es.json
:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Ejemplo de MyComponent.js
:
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
function MyComponent() {
const { locale } = useRouter();
const t = locale === 'es' ? es : en;
return (
{t.greeting}
{t.welcomeMessage}
);
}
export default MyComponent;
Este enfoque proporciona flexibilidad y es sencillo para proyectos más pequeños. Generalmente es fácil de actualizar y mantener.
3. Usando una biblioteca de traducción
Varias bibliotecas de JavaScript agilizan la traducción de contenido dentro de tus componentes de React.
next-i18next
: Una biblioteca popular diseñada específicamente para Next.js. Se integra bien con el framework y proporciona características como renderizado del lado del servidor (SSR) y traducción del lado del cliente.react-i18next
: Una biblioteca de i18n de propósito general para React. Puedes usarla en tus aplicaciones Next.js, aunque puede requerir más configuración en comparación connext-i18next
.
Ejemplo con next-i18next
(Instalación: npm install next-i18next i18next react-i18next
):
Crea un archivo de configuración de i18n (p. ej., i18n.js
en tu directorio raíz):
// i18n.js
import { createServerSideHelpers } from 'next-i18next'
import { i18n } from './next-i18next.config'
export function initI18next(req, res, namespaces = ['common']) {
const helpers = createServerSideHelpers(
req,
res,
i18n,
namespaces
)
return helpers
}
export { appWithTranslation } from 'next-i18next'
export { i18n }
Crea tu configuración de Next.js para next-i18next.
// next-i18next.config.js
const { i18n } = require('./next-i18next.config');
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
defaultLocale: 'en',
locales: ['en', 'es', 'fr'],
},
// otra configuración
}
module.exports = nextConfig
Añade la configuración y la importación de la traducción a tu _app.js
:
import { appWithTranslation } from 'next-i18next';
import '../styles/globals.css';
function MyApp({ Component, pageProps }) {
return ;
}
export default appWithTranslation(MyApp);
Crea una carpeta y llénala con los locales para tus traducciones.
/public
└── locales
├── en
│ └── common.json
├── es
│ └── common.json
└── fr
└── common.json
Ejemplo en/common.json:
{
"greeting": "¡Hola, mundo!",
"welcomeMessage": "Bienvenido a nuestro sitio web."
}
Usando la traducción en un componente:
import { useTranslation } from 'next-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return (
{t('greeting')}
{t('welcomeMessage')}
);
}
export default MyComponent;
Este ejemplo usa el hook useTranslation
para obtener las traducciones basadas en el locale actual.
Manejando rutas dinámicas y generación de sitios estáticos (SSG)
La internacionalización se vuelve más compleja al tratar con rutas dinámicas (p. ej., entradas de blog, páginas de productos) y la generación de sitios estáticos (SSG).
1. Rutas dinámicas (p. ej., /blog/[slug])
Para las rutas dinámicas, necesitarás generar las rutas correctas para cada locale durante el tiempo de compilación usando getStaticPaths
. Esta función devuelve un array de rutas que Next.js debe pre-renderizar.
export async function getStaticPaths() {
const paths = [];
const locales = ['en', 'es', 'fr'];
const posts = await fetchPosts(); // Obtener datos de las entradas del blog
posts.forEach(post => {
locales.forEach(locale => {
paths.push({
params: {
slug: post.slug,
},
locale,
});
});
});
return {
paths,
fallback: false, // o 'blocking' si quieres mostrar un estado de carga
};
}
export async function getStaticProps({ params, locale }) {
const post = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
Explicación:
getStaticPaths
: Esta función itera a través de las entradas de tu blog y genera una ruta para cada entrada y cada locale. El objetoparams
contiene los parámetros de la ruta (p. ej., el slug de la entrada del blog).locale
: Este parámetro proporciona el locale actual, permitiéndote obtener el contenido traducido para ese locale específico.fallback
: Determina cómo Next.js maneja las rutas no definidas engetStaticPaths
.fallback: false
genera páginas 404 para rutas no definidas.fallback: 'blocking'
pre-renderiza las páginas bajo demanda.
2. Generación de sitio estático (SSG) con getStaticProps
En getStaticProps
, puedes obtener contenido traducido basándote en el parámetro locale
.
export async function getStaticProps({ params, locale }) {
// Obtener contenido según el locale y los parámetros
const { post } = await getPostBySlug(params.slug, locale);
return {
props: {
post,
},
};
}
La función getPostBySlug
debería obtener el contenido traducido para el slug y el locale dados, que podría recuperarse de tus archivos de traducción, una base de datos o un CMS.
3. Renderizado del lado del servidor (SSR) con getServerSideProps
Para contenido que necesita ser obtenido en el momento de la solicitud, usa getServerSideProps
. Esto es útil si el contenido cambia con frecuencia o es personalizado para cada usuario.
export async function getServerSideProps({ params, locale, req, res }) {
// Obtener datos según el locale y los parámetros (p. ej., desde una base de datos)
const data = await fetchData(params.slug, locale);
return {
props: {
data,
},
};
}
Mejores prácticas para la internacionalización en Next.js
Seguir estas mejores prácticas te ayudará a construir aplicaciones multilingües robustas, mantenibles y fáciles de usar:
- Planifica con antelación: Considera la internacionalización desde el inicio de tu proyecto. Es mucho más fácil implementarla desde el principio que adaptarla más tarde.
- Separa el contenido del código: Almacena todo el texto traducible en archivos separados (p. ej., archivos JSON o un TMS) y evita escribir texto directamente en tus componentes.
- Usa un sistema de gestión de traducciones (TMS): Para proyectos más grandes, un TMS puede agilizar el proceso de traducción y mejorar la colaboración.
- Prueba a fondo: Prueba tu aplicación en todos los idiomas soportados para asegurar traducciones precisas, formato correcto y renderizado adecuado en diferentes navegadores y dispositivos. Prueba en dispositivos reales, no solo en emuladores.
- Considera los idiomas de derecha a izquierda (RTL): Si soportas idiomas como el árabe o el hebreo, asegúrate de que tu diseño y maquetación se adapten a la dirección del texto de derecha a izquierda. Next.js no maneja esto automáticamente, por lo que se requieren soluciones con CSS u otras.
- Maneja el formato de fecha y hora: Usa bibliotecas o funciones integradas para formatear fechas y horas según el locale del usuario. Moment.js y date-fns son dos bibliotecas populares que son de gran ayuda.
- Gestiona el formato de números y divisas: Formatea correctamente los números y los símbolos de moneda según el locale del usuario.
- Optimiza el SEO: Usa metaetiquetas específicas del idioma (
hreflang
) para ayudar a los motores de búsqueda a indexar tu contenido correctamente. Incluye los códigos de idioma en tus URL. - Prioriza la experiencia del usuario: Proporciona una forma clara e intuitiva para que los usuarios cambien de idioma. Considera ofrecer detección automática del idioma basada en la configuración del navegador.
- Mantente actualizado: Mantén tu versión de Next.js y las bibliotecas de i18n al día para beneficiarte de las últimas características y parches de seguridad.
- Considera la accesibilidad (a11y): Asegúrate de que tu contenido traducido sea accesible para usuarios con discapacidades. Proporciona texto alternativo para las imágenes y usa los atributos ARIA apropiados. Usa lectores de pantalla para probar.
Consideraciones de SEO para sitios web internacionalizados
Optimizar tu sitio web internacionalizado para los motores de búsqueda es esencial para atraer tráfico orgánico de todo el mundo. Aquí hay algunas prácticas clave de SEO:
- Etiquetas
hreflang
: Implementa etiquetashreflang
en el<head>
de tu HTML para informar a los motores de búsqueda sobre las variaciones de idioma y región de tu contenido. Esto es crítico para el SEO. Por ejemplo:<link rel="alternate" hreflang="en" href="https://example.com/en/" />
y<link rel="alternate" hreflang="es" href="https://example.com/es/" />
- URL específicas por idioma: Usa códigos de idioma en tus URL (p. ej.,
/en/about
,/es/acerca-de
). Esto indica claramente el idioma del contenido tanto a los usuarios como a los motores de búsqueda. - Contenido localizado: Traduce tu contenido de manera precisa y natural. Las traducciones automáticas deben ser revisadas por un hablante nativo.
- Metadescripciones y títulos localizados: Escribe metadescripciones y títulos únicos y atractivos para cada idioma para mejorar las tasas de clics en los resultados de búsqueda.
- Sitemaps XML: Crea y envía sitemaps XML que incluyan todas las variaciones de idioma de tus páginas.
- Enlaces internos: Usa enlaces internos apropiados entre las versiones de idioma de tu contenido.
- Investigación de palabras clave por país: Realiza una investigación de palabras clave en cada idioma para identificar los términos que los usuarios buscan en cada región.
Ejemplo: Construyendo un blog multilingüe simple
Vamos a crear un ejemplo simplificado de un blog multilingüe usando Next.js. Esto proporcionará una ilustración más concreta de cómo aplicar los conceptos discutidos anteriormente.
1. Configuración del proyecto
Crea un nuevo proyecto de Next.js:
npx create-next-app mi-blog-multilenguaje
cd mi-blog-multilenguaje
2. Configurar i18n (next.config.js
)
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
i18n: {
locales: ['en', 'es', 'fr'],
defaultLocale: 'en',
},
}
module.exports = nextConfig
3. Crear archivos de traducción
Crea una carpeta locales
en el directorio raíz y añade los siguientes archivos JSON:
locales/en.json
:
{
"title": "Welcome to My Blog",
"postTitle": "My First Post",
"postContent": "This is the content of my first blog post."
}
locales/es.json
:
{
"title": "Bienvenido a mi Blog",
"postTitle": "Mi Primer Post",
"postContent": "Este es el contenido de mi primer publicación de blog."
}
locales/fr.json
:
{
"title": "Bienvenue sur Mon Blog",
"postTitle": "Mon Premier Article",
"postContent": "Ceci est le contenu de mon premier article de blog."
}
4. Crear el componente de la entrada del blog (p. ej., components/BlogPost.js
)
import { useRouter } from 'next/router';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function BlogPost() {
const router = useRouter();
const { locale } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
{translations.postTitle}
{translations.postContent}
);
}
export default BlogPost;
5. Crear la página de inicio (pages/index.js
)
import { useRouter } from 'next/router';
import BlogPost from '../components/BlogPost';
import en from '../locales/en.json';
import es from '../locales/es.json';
import fr from '../locales/fr.json';
function HomePage() {
const router = useRouter();
const { locale, locales } = router;
let translations;
switch (locale) {
case 'es':
translations = es;
break;
case 'fr':
translations = fr;
break;
default:
translations = en;
}
return (
);
}
export default HomePage;
Este ejemplo simplificado muestra los principios fundamentales de la internacionalización en Next.js. Puedes ampliar este marco básico para incluir características más complejas, como rutas dinámicas e integración con sistemas de gestión de traducciones. Considera mejorar los enlaces anteriores con el componente Link
y añadir el atributo locale
apropiado.
6. Ejecutar la aplicación
Ejecuta la aplicación con:
npm run dev
Ahora puedes acceder a tu blog en http://localhost:3000
(inglés), http://localhost:3000/es
(español) y http://localhost:3000/fr
(francés). Deberías ver el título y el contenido de la entrada del blog traducidos según el locale seleccionado.
Conclusión
Next.js proporciona un conjunto completo de características para implementar la internacionalización en tus aplicaciones web. Siguiendo los principios y técnicas descritos en esta guía, puedes crear aplicaciones multilingües que ofrezcan experiencias localizadas a usuarios de todo el mundo. Recuerda planificar tu estrategia de i18n con antelación, elegir el método de traducción adecuado para tus necesidades y priorizar la experiencia del usuario. Con una planificación y ejecución cuidadosas, puedes construir aplicaciones que conecten con una audiencia global y abran nuevas oportunidades de crecimiento. El aprendizaje continuo y mantenerse al día con las últimas versiones y mejores prácticas garantizará que utilices tus herramientas y tecnologías de manera efectiva.
A medida que la tecnología avanza, es de esperar que surjan características de i18n más avanzadas. La capacidad de llegar a usuarios de diferentes culturas y grupos lingüísticos seguirá siendo una prioridad clave para los desarrolladores de aplicaciones en todo el mundo. Por lo tanto, dominar los fundamentos de la i18n es una habilidad valiosa que aumentará tu valor en el panorama del desarrollo global actual.