import merge from 'deepmerge'; import { extname, join } from 'path'; import { BaseAppConfig } from '../lib/@types'; import { NAMES } from '../lib/common/constants'; export class LocaleLanguage { lang: string; constructor(private readonly defaultLang = 'en') { const appConfig = io.services.fsUtils.tryReadJsonSync( join(io.constants.APP_PATH, NAMES.files.appConfig), ); this.lang = appConfig?.language || defaultLang; } async getLocale>(rootPath: string, fileBaseName: string = 'index') { const getPath = async (lang: string) => { const rootLangPath = join(rootPath, lang); const ext = process.argv[0].match('ts-node') ? '.ts' : '.js'; return join(rootLangPath, fileBaseName + ('.' + ext).replace(/\.\./, '.')); }; try { const defaultFilePath = await getPath(this.defaultLang); const currentLangFilePath = await getPath(this.lang); const enFileLocale = (await import(defaultFilePath)) as T | null; let currentLangFileLocale = {} as T | null; try { currentLangFileLocale = (await import(currentLangFilePath)) as T | null; } catch (error) { io.logger.write(io.libs.chalk.gray(`* Missing ${this.lang} locale data`)); currentLangFileLocale = null; } if (!enFileLocale && !currentLangFileLocale) { return null; } const mergedLocale = merge(enFileLocale || {}, currentLangFileLocale || {}, { // TODO: CHECK arrayMerge: (target, src) => src, }); return mergedLocale as T; } catch (error) { return null; } } }