Diccionarios y Proveedores i18n de Next.js (nextjs-i18n-usage)
Estándares de ingeniería, hooks y patrones de proveedores para consumir traducciones de next-intl en Componentes de Servidor React (RSC), Componentes de Cliente, historias de Storybook y entornos de prueba.
[!TIP] Patrones de Implementación: Consulta
references/examples.mdpara ejemplos de código completos (RSC, formularios de cliente, selectores de idioma, decoradores de Storybook y envoltorios de prueba). Ejecución Rápida: Delega la validación de diccionarios o la sincronización de claves a un subagente ligero (Model: 'flash').
1. Contrato de Cero-Hardcode
- Cero Texto Codificado: Nunca escribas etiquetas visibles para el usuario, marcadores de posición o cadenas de respaldo en JSX.
- Sin Objetos Mock: Los diccionarios mock en el archivo (por ejemplo
const DEFAULT_CONTENT = {...}) están PROHIBIDOS. - Sincronización Síncrona: Al agregar/actualizar copia de la UI, inserta traducciones auténticas en TODOS los archivos de locale en
messages/[locale].json(ej.messages/en.jsonymessages/fa.json) antes de escribir JSX.
2. Referencia Rápida de APIs y Hooks
| Entorno / Objetivo | Hook / API | Sintaxis de Ejemplo |
|---|---|---|
| Componente de Servidor (RSC) | getTranslations | const t = await getTranslations('namespace'); |
| Formateador de Servidor | getFormatter | const format = await getFormatter(); format.dateTime(...) |
| Metadatos Dinámicos | getTranslations | export async function generateMetadata({ params }) { ... } |
| Componente de Cliente | useTranslations | const t = useTranslations('namespace'); |
| Formateador de Cliente | useFormatter | const format = useFormatter(); format.number(...) |
| Texto Enriquecido (Cliente) | t.rich | t.rich('terms', { link: (c) => <Link href="/t">{c}</Link> }) |
| Navegación | @/i18n/navigation | import { Link, useRouter, usePathname } from '@/i18n/navigation'; |
| Vista Previa de Storybook | NextIntlClientProvider | Envuelve el decorador de vista previa con <NextIntlClientProvider locale="en" messages={enMessages}> |
| Pruebas Unitarias (Jest) | renderWithIntl | Envuelve el renderizado con <NextIntlClientProvider locale="en" messages={messages}> |
3. Estándares BiDi (LTR / RTL) y de Estilo
- Solo Propiedades Lógicas de Tailwind:
- Prohibido:
ml-*,mr-*,pl-*,pr-*,left-*,right-*,text-left,text-right - Requerido:
ms-*,me-*,ps-*,pe-*,start-*,end-*,text-start,text-end
- Prohibido:
- Dirección Dinámica:
<html dir="rtl">dinámico parafa/arydir="ltr"paraen.
4. Anti-patrones y Errores Comunes
| Error | Causa Raíz | Solución |
|---|---|---|
useTranslations en RSC | Los hooks no pueden ejecutarse en componentes de servidor asíncronos | Usa await getTranslations('ns') |
getTranslations en Cliente | Función asíncrona solo de servidor | Usa useTranslations('ns') con "use client" |
| "No se encontró contexto intl" | Proveedor faltante en Storybook/pruebas | Envuelve la historia/prueba en <NextIntlClientProvider> |
| Respaldo Codificado | Ej. `t('btn') | |
next/link sin procesar | Elimina el prefijo de locale al cambiar de ruta | Usa Link de @/i18n/navigation |
5. Verificación de Paridad
Ejecuta la verificación de paridad de diccionarios:
pwsh .agents/skills/nextjs-i18n-usage/scripts/verify-dictionaries.ps1