import 'server-only'; import path from 'path'; import fs from 'fs'; import { getTranslateFn } from '../utils'; import { Translations } from '../types'; import settings from 'settings'; import logger from './log'; export const translations: Translations = {}; export async function getTranslations(locale_: string) { try { const locale = settings.localization.locales.find( (locale) => locale.value === locale_ ); const localeDirPath = path.resolve( `public/locales/${locale.localePath ?? locale.value}` ); const fileNames = fs.readdirSync(localeDirPath); const fileImports = fileNames.map( (fileName) => new Promise((resolve, reject) => { fs.readFile( path.join(localeDirPath, `/${fileName}`), 'utf-8', (error, data) => { if (error) { console.error(error); reject(error.message); } resolve(data); } ); }) ); let index = 0; for await (const fileImport of fileImports) { translations[ fileNames[index].substring(0, fileNames[index].lastIndexOf('.')) ] = JSON.parse(fileImport); index++; } } catch (error) { logger.error('Failed to read translations', error); } return translations; } export function t(path: string) { return getTranslateFn(path, translations); } export async function t_(path: string, locale?: string) { let translations_ = translations; if (settings.useOptimizedTranslations && locale) { const { getTranslations } = require('translations'); translations_ = await getTranslations(locale); } return getTranslateFn(path, translations_); }