Realmente no sabía cómo explicar esto. Esencialmente, tengo una estructura de directorio:
src/ modules/ clients/ i18n/ en-US.ts tasks/ i18n/ en-US.tsAhora cada uno de esos archivos .ts tiene el mismo aspecto:
export default { "Key1": "The value", "Key2": "The value 2", }Pero, por supuesto, los archivos tendrán diferentes nombres y valores clave.
Ahora, necesito precompilar todos estos archivos en un solo index.ts que se vea así:
messages: { 'en-US': { "Key1": "....", .... } }Por el momento, lo que tengo es realmente una mierda. Básicamente tengo estos archivos de idioma como archivos "txt" con el "contenido" del objeto
'Key1': 'Some test',y construyo el archivo index.ts escribiendo primero todo el código hasta ": {" donde deben ir los mensajes, luego leo esos archivos txt e ingreso su contenido, y finalmente cierro el objeto.
Realmente, quiero poder leer la exportación de estos archivos ts reales y concatenar el valor en una variable que luego escribo en el archivo index.ts.
es posible?
Sí, es posible. Este tipo de lógica debería hacerlo. Realmente no lo he probado, pero seguirlo debería llevarte a lo que quieres.
let messages = {} let module_folder_directory = "some_directory" fs .readdirSync(module_folder_directory) .forEach((module)=>{ fs .readdirSync(path.join(module_folder_directory, module, "i18n")) // Assuming there's only one file in the folder, you could just access the first element in the array. .forEach((file)=>{ messages[file] = require(path.join(module_folder_directory, module, "i18n", file)) }) })Puede leer más sobre el sistema de archivos aquí .
La estructura de datos puede ser más compleja, pero aquí hay una versión simple de la importación de un archivo:
import { basename } from 'node:path' async function buildMessages(file_list) { const messages = {} for (const file_path of file_list) { const file_label = basename(file_path, '.ts') // build specific if (!messages[file_label]) messages[file_label] = {} const file_messages = await import(file_path) Object.assign(messages[file_label], file_messages.default) } return messages } El paso de precompilación es más fácil con deno o ts-node donde puede usar los nombres de archivo mecanografiados directamente. Ejecutarlo desde TS compilado depende de la configuración de compilación de TS, ya que las extensiones de archivo y las importaciones pueden variar con las opciones de tsconfig.
const built_file_list = [ './a.ts', './b.ts', './c.ts' ] const messages = await buildMessages(built_file_list) Esto también podría ejecutarse en node.js sin formato si la tarea "crear lista de archivos" creó un enlace simbólico o una copia de todos los archivos como x.mjs y puede asegurarse de que los archivos de idioma sigan siendo compatibles con JS ESM sin formato.
Luego construya código para tipos de datos simples a través de JSON:
const code = `const messages = ${JSON.stringify(messages, undefined, 2))}` //>>> const messages = { "a": { "key": "aa", "key2": "ab" }, "b": { "key3": "ba", "key": "bcw" }, "c": { "key4": "ca", "key5": "cd" } } Si el destino de index.ts es un entorno de nodo, puede escribir los datos de los mensajes en un archivo JSON e importarlos nuevamente a index.ts . El uso de una importación JSON requiere algunas travesuras de compilación de mecanografiado para configurarlo.