96 lines
3.0 KiB
JavaScript
96 lines
3.0 KiB
JavaScript
"use strict";
|
|
const sprintf_js_1 = require("sprintf-js");
|
|
class i18n {
|
|
constructor(options = {}) {
|
|
this.data = {};
|
|
this.languages = options.languages || ['default'];
|
|
if (!Array.isArray(this.languages)) {
|
|
this.languages = [this.languages];
|
|
}
|
|
}
|
|
get(languages) {
|
|
const { data } = this;
|
|
const result = {};
|
|
if (languages) {
|
|
if (!Array.isArray(languages)) {
|
|
languages = [languages];
|
|
}
|
|
}
|
|
else {
|
|
languages = this.languages;
|
|
}
|
|
languages.forEach(lang => {
|
|
const langData = data[lang];
|
|
if (langData) {
|
|
Object.keys(langData).forEach(key => {
|
|
if (!Object.prototype.hasOwnProperty.call(result, key)) {
|
|
result[key] = langData[key];
|
|
}
|
|
});
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
set(lang, data) {
|
|
if (typeof lang !== 'string')
|
|
throw new TypeError('lang must be a string!');
|
|
if (typeof data !== 'object')
|
|
throw new TypeError('data is required!');
|
|
this.data[lang] = flattenObject(data);
|
|
return this;
|
|
}
|
|
remove(lang) {
|
|
if (typeof lang !== 'string')
|
|
throw new TypeError('lang must be a string!');
|
|
delete this.data[lang];
|
|
return this;
|
|
}
|
|
list() {
|
|
return Object.keys(this.data);
|
|
}
|
|
__(lang) {
|
|
const data = this.get(lang);
|
|
return (key, ...args) => {
|
|
if (!key)
|
|
return '';
|
|
const str = data[key] || key;
|
|
return (0, sprintf_js_1.vsprintf)(str, args);
|
|
};
|
|
}
|
|
_p(lang) {
|
|
const data = this.get(lang);
|
|
return (key, ...args) => {
|
|
if (!key)
|
|
return '';
|
|
const number = args.length ? +args[0] : 0;
|
|
let str = key;
|
|
if (!number && Object.prototype.hasOwnProperty.call(data, `${key}.zero`)) {
|
|
str = data[`${key}.zero`];
|
|
}
|
|
else if (number === 1 && Object.prototype.hasOwnProperty.call(data, `${key}.one`)) {
|
|
str = data[`${key}.one`];
|
|
}
|
|
else if (Object.prototype.hasOwnProperty.call(data, `${key}.other`)) {
|
|
str = data[`${key}.other`];
|
|
}
|
|
else if (Object.prototype.hasOwnProperty.call(data, key)) {
|
|
str = data[key];
|
|
}
|
|
return (0, sprintf_js_1.vsprintf)(str, args);
|
|
};
|
|
}
|
|
}
|
|
function flattenObject(data, obj = {}, parent = '') {
|
|
Object.keys(data).forEach(key => {
|
|
const item = data[key];
|
|
if (typeof item === 'object') {
|
|
flattenObject(item, obj, `${parent + key}.`);
|
|
}
|
|
else {
|
|
obj[parent + key] = item;
|
|
}
|
|
});
|
|
return obj;
|
|
}
|
|
module.exports = i18n;
|
|
//# sourceMappingURL=i18n.js.map
|