Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

366
Vistas
¿Hay alguna forma de acceder a `__filename` en Next.js?

Estoy trabajando en un módulo i18n personalizado y me encantaría reemplazar este código (esta es una página "acerca de nosotros"):

 const messages = (await import(`./about-us.${locale}.json`)) .default as Messages;

Por

 const messages = ( await import(`./${__filename.replace('.tsx', `.${locale}.json`)}`) ).default as Messages;

Desafortunadamente __filename resuelve en /index.js (¿supongo que debido a Webpack?) - ¿Hay alguna forma de lograr lo que estoy tratando de hacer en mi ejemplo o esto debería estar integrado en Next.js directamente para que funcione?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Refactorice esto para que los consumidores no sepan sobre el sistema de archivos

Spoiler: no te voy a decir cómo acceder a __filename con Next.js; No sé nada de eso.

Aquí hay un patrón que es mejor que lo que propones y que evade el problema por completo.

Primero, configuración: parece que tienes una carpeta llena con estos archivos JSON. Me imagino esto:

 l10n/ about-us.en-US.json about-us.fr-FR.json contact-us.en-US.json contact-us.fr-FR.json ... <package>.<locale>.json

Esa organización de archivos es agradable, pero es un error hacer que todos los posibles consumidores de l10n lo sepan.

  • ¿Qué pasa si cambias el esquema de nombres más tarde? ¿Va a editar a mano todos los archivos que importen texto localizado? ¿Por qué tratarías a Future-You tan mal?
  • Si no existe un archivo de configuración regional en particular, ¿preferiría que la aplicación fallara o simplemente recurriera a otro idioma? 1

Es mejor crear una función que tome packageName y localeCode como argumentos y devuelva el contenido deseado. Esa función se convierte entonces en la única parte de la aplicación que debe conocer los nombres de archivo, la lógica de respaldo, etc.

 // l10n/index.js export default function getLang( packageName, localeCode ) { let contentPath = `${packageName}.${localeCode}.json` // TODO: fallback logic return JSON.parse(FS.readFileSync(contentPath, 'utf8')) }

Es un trabajo complejo ubicar y leer los datos deseados y, al mismo tiempo, garantizar que ninguna solicitud obtenga una carga útil vacía y que cada tecla de texto se resuelva en un valor. import dinámica + sistema de archivos sano es un buen comienzo (:aplausos:), pero esa combinación no es lo suficientemente sólida por sí sola.

En un trabajo anterior, construimos un microservicio completo solo para hacer esto. (También creamos un servicio separado para obtener traducciones y algunos paquetes npm privados para permitir que las aplicaciones web soliciten y usen paquetes de idiomas de nuestro CMS). no es diminuto.


1 Lógica alternativa: por ejemplo en-UK y en-US suelen ser intercambiables; algunos grupos de lenguas romances podrían ser aceptables en una emergencia (me vienen a la mente español/portugués/brasileño); también idiomas germánicos, etc. Lo que funciona y lo que no depende del contenido y el contexto, pero ninguna versión de respaldo encajará en una import dinámica.

over 4 years ago · Santiago Trujillo Denunciar

0

Después de una larga búsqueda, la solución fue escribir un useMessages que se "inyectaría" con las cadenas correctas usando un complemento de Babel personalizado.

Un cargador de Webpack no parecía la opción correcta ya que el cargador solo tiene acceso al contenido del archivo que carga. Al usar Babel, tenemos muchas más opciones para inyectar código en la versión compilada final.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda