No se puede ejecutar la aplicación de Next.js con internacionalización i18n en Docker.
La aplicación está escrita con TypeScript.
La compilación fue exitosa, pero cuando inicio el programa en localhost:3000, obtengo este error:
TypeError: La URL no está configurada con i18n
en URL.get locale [según el local] (/app/.next/server/pages/_middleware.js:1:46515)
En mi Dockerfile, copié todos los archivos necesarios:
COPY package.json /app/package.json
COPY package-lock.json /app/package-lock.json
COPY next.config.js /app/next.config.js
COPY .next /app/.next
COPY public /app/public
El archivo next.config.js
contiene:
module.exports = {
reactStrictMode: true,
i18n: {
locales: ["en", "fr"],
defaultLocale: "en",
},
};
En next.config.js
, intenté agregar la función rewrites
, pero aún obtengo el mismo error:
async rewrites() {
return [
{
source: "/",
destination: "/",
locale: false, // Usar `locale: false` para que el prefijo coincida correctamente con el idioma deseado
},
{
source: "/fr/test",
destination: "/fr/test",
locale: false, // Usar `locale: false` para que el prefijo coincida correctamente con el idioma deseado
},
];
},
El archivo _middleware.ts
contiene:
import { NextRequest, NextResponse } from "next/server";
const PUBLIC_FILE = /.(.*)$/;
export function middleware(request: NextRequest) {
const shouldHandleLocale =
!PUBLIC_FILE.test(request.nextUrl.pathname) &&
!request.nextUrl.pathname.includes("/api/") &&
request.nextUrl.locale === "default";
return shouldHandleLocale
? NextResponse.redirect(`/en${request.nextUrl.href}`)
: undefined;
}
Parece que el middleware no está funcionando.
¿Algún consejo útil o ideas?
Gracias.
davy.ai
Parece que, según el mensaje de error, la aplicación no está configurada correctamente para la internacionalización. El mensaje de error específicamente indica que “La URL no está configurada con i18n”.
El archivo
next.config.js
contiene la configuración necesaria de i18n, incluyendo las localidades (locales) y la localidad por defecto (defaultLocale). Sin embargo, es posible que la funciónrewrites
no esté manejando correctamente el prefijo de la localidad.Otro posible problema podría estar en el archivo
_middleware.ts
. Parece que el middleware es responsable de manejar la localidad, pero no está del todo claro por qué no funciona. El middleware verifica si la solicitud debe manejar la localidad o no, y luego redirige a la localidad correspondiente utilizandoNextResponse.redirect()
. Es posible que el middleware no esté siendo invocado realmente, o que no esté redirigiendo correctamente a la localidad correcta.Para comenzar a depurar este problema, aquí hay algunas cosas que puedes intentar:
rewrites
denext.config.js
para ver si eso hace alguna diferencia.console.log
al archivo_middleware.ts
para verificar que realmente esté siendo invocado y que la localidad correcta esté siendo detectada._middleware.ts
esté correctamente registrado con Next.js.next.config.js
para descartar cualquier problema de configuración.Esperemos que uno de estos pasos pueda ayudar a resolver el problema.