campfire/src/lib/lang.js

70 lines
1.8 KiB
JavaScript

import * as en_GB from '@cf/lang/en_GB.json';
/**
* @param {string} lang IETH language tag (i.e. en_GB)
* @returns Map<string, string | string[]>
*/
export default function init(lang) {
let i18n = new Object();
let language;
// TODO: dynamic imports seem to fail here; it can't find the file.
// try {
// language = import(`../lang/${lang}.json`);
// } catch (error) {
// throw error;
// }
language = en_GB;
i18n.lang = language;
i18n.lang_code = lang;
i18n.string = function(/* @type string */ key, ...args) {
const tokens = key.split('.');
let i = 0;
let token = tokens[i];
let res = this.lang;
while (true) {
res = res[token];
if (res === undefined) {
console.warn(`${key} not found for language ${this.lang_code}`);
return key;
}
if (typeof res === 'string' || res instanceof String)
break;
i++;
token = tokens[i];
}
i = 1;
while (true) {
if (args.length < i || !res.includes('%' + i))
break;
res = res.replaceAll('%' + i, args[i - 1]);
i++;
}
return res;
}
i18n.stringArray = function(/* @type string */ key) {
const tokens = key.split('.');
let i = 0;
let token = tokens[i];
let res = this.lang;
while (true) {
res = res[token];
if (res === undefined) {
console.warn(`${key} not found for language ${this.lang_code}`);
return key;
}
if (Array.isArray(res))
return res;
i++;
token = tokens[i];
}
}
return i18n;
}