galactic-bot/language/LocaleLoader.js
2020-07-25 13:02:04 +03:00

91 lines
2.5 KiB
JavaScript

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') 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;