const path = require('path'); const fs = require('fs'); const chalk = require('chalk'); const { Util } = require('../util/'); class LocaleLoader { constructor(client) { this.client = client; this.languages = {}; } template(locale, index) { // console.log(String.raw`${this.languages[locale][index]}`); return (this.languages[locale] ? this.languages[locale][index] : `Locale \`${locale}\` does not exist.`) || `Entry \`${locale}:${index}\` does not exist.`; } async loadLanguages() { const _directory = path.join(process.cwd(), 'language/languages'); const directories = fs.readdirSync(_directory); //locale directories, ex. en_us, fi for (const directory of directories) this.loadLanguage(directory); } loadLanguage(language) { const directory = path.join(process.cwd(), `language/languages/${language}`); const files = Util.readdirRecursive(directory); const combined = {}; for(let file of files) { file = fs.readFileSync(file, { encoding: 'utf8' }); const result = this.loadFile(file); Object.assign(combined, result); } this.languages[language] = combined; this.client.logger.info(`Locale ${chalk.bold(language)} was ${chalk.bold("loaded")}.`); } loadFile(file) { if (process.platform === 'linux') file = file.replace('\r', ''); const lines = file.split('\n'); const parsed = {}; let matched = null; let text = ''; for(const line of lines) { if(line.startsWith('//')) continue; const matches = line.match(/\[([_A-Z0-9]{1,})\]/u); if(matches) { if (matched) { parsed[matched] = text; [, matched] = matches; text = ''; } else { [, matched] = matches; } } else if (matched) { text += line; if (process.platform === 'linux' && line !== '\n') text += '\n'; } else { continue; } } parsed[matched] = text; if (process.platform === 'win32') for (const [key, value] of Object.entries(parsed)) { parsed[key] = value.replace(/^(\r)|(\r){1,}$/gu, '').replace(/\r/gu, '\n'); // console.log(String.raw`${value}`); } //console.log(parsed); return parsed; } } module.exports = LocaleLoader;