@gramio/i18n
Version:
i18n plugin for GramIO with type-safety
65 lines (58 loc) • 1.81 kB
JavaScript
;
var gramio = require('gramio');
function buildLanguage(languageRaw) {
const texts = {};
function recursiveAdd(textsRaw, prefix = "") {
for (const [key, value] of Object.entries(textsRaw)) {
const newPrefix = `${prefix}${key}`;
if (typeof value === "object" && !(value instanceof gramio.FormattableString)) {
recursiveAdd(value, `${newPrefix}.`);
} else {
texts[newPrefix] = value;
}
}
}
recursiveAdd(languageRaw);
return texts;
}
function buildT(languages, primaryLanguage) {
const languagesTexts = {};
for (const [language, texts] of Object.entries(languages)) {
languagesTexts[language] = buildLanguage(texts);
}
return function t(language, key, ...args) {
const fallbackItem = languagesTexts[primaryLanguage][key];
const item = languagesTexts[language] ? languagesTexts[language][key] ?? fallbackItem : fallbackItem;
if (typeof item === "function") return item(...args);
return item;
};
}
function pluralizeEnglish(n, one, many) {
return n === 1 ? one : many;
}
function pluralizeRussian(count, one, few, many) {
const mod10 = count % 10;
const mod100 = count % 100;
if (mod10 === 1 && mod100 !== 11) return one;
if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) return few;
return many;
}
function defineI18n({ languages, primaryLanguage }) {
const t = buildT(languages, primaryLanguage);
return {
t,
languages: Object.keys(languages),
primaryLanguage,
buildT: (language) => {
return (key, ...args) => t(language, key, ...args);
},
_: {
languages,
primaryLanguage
}
// plugin: () => {},
};
}
exports.defineI18n = defineI18n;
exports.pluralizeEnglish = pluralizeEnglish;
exports.pluralizeRussian = pluralizeRussian;