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) { this.client.logger.info(`Loading locale ${chalk.bold(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; } loadFile(file) { 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,})\]/giu); if(matches) { if (matched) { parsed[matched] = text; [, matched] = matches; text = ''; } else { [, matched] = matches; } } else if(matched) { text += line; } else { continue; } } parsed[matched] = text; for(const [ key, value ] of Object.entries(parsed)) { parsed[key] = value.replace(/^(\r)|(\r){1,}$/gu, '').replace(/\r/gu, '\n'); } return parsed; } } module.exports = LocaleLoader;