@appsemble/node-utils
Version:
NodeJS utilities used by Appsemble internally.
47 lines • 2.12 kB
JavaScript
import { readdir, readFile } from 'node:fs/promises';
import { defaultLocale, normalizeLocale } from '@appsemble/utils';
import { AppsembleError } from './AppsembleError.js';
const translationsDir = new URL('../../i18n/', import.meta.url);
async function getLanguageFiles() {
const files = await readdir(translationsDir);
const result = new Map();
for (const file of files) {
if (!file.endsWith('.json')) {
continue;
}
const language = normalizeLocale(file.slice(0, -'.json'.length));
if (result.has(language)) {
throw new AppsembleError(`Found duplicate language codes: ‘${language}’`);
}
result.set(language, file);
}
return result;
}
export async function getSupportedLanguages() {
return new Set((await getLanguageFiles()).keys());
}
/**
* Fetch and merge the Appsemble core messages based on a language and a base language.
*
* @param language The language to get the messages of.
* @param baseLanguage The base language of the language to get the messages of.
* @returns The Appsemble core messages.
*/
export async function getAppsembleMessages(language, baseLanguage) {
const lang = normalizeLocale(language);
const baseLang = baseLanguage ? normalizeLocale(baseLanguage) : undefined;
const languages = await getLanguageFiles();
const messages = {};
if (baseLang && languages.has(baseLang)) {
Object.assign(messages, JSON.parse(await readFile(new URL(languages.get(baseLang), translationsDir), 'utf8')));
}
if (languages.has(lang)) {
Object.assign(messages, Object.fromEntries(Object.entries(JSON.parse(await readFile(new URL(languages.get(lang), translationsDir), 'utf8'))).filter(([, value]) => Boolean(value))));
}
if (!languages.has(lang) && (!baseLang || !languages.has(baseLang))) {
const defaultLanguage = normalizeLocale(defaultLocale);
Object.assign(messages, JSON.parse(await readFile(new URL(languages.get(defaultLanguage), translationsDir), 'utf8')));
}
return messages;
}
//# sourceMappingURL=getAppsembleMessages.js.map