@lingui/cli
Version:
Lingui CLI to extract messages, compile catalogs, and manage translation workflows
74 lines (73 loc) • 2.67 kB
JavaScript
import { getFallbackListForLocale } from "./getFallbackListForLocale.js";
export async function getTranslationsForCatalog(catalog, locale, options) {
const locales = new Set([
locale,
options.sourceLocale,
...getFallbackListForLocale(options.fallbackLocales, locale),
]);
const [catalogs, template] = await Promise.all([
catalog.readAll(Array.from(locales)),
catalog.readTemplate(),
]);
const sourceLocaleCatalog = catalogs[options.sourceLocale] || {};
const input = { ...template, ...sourceLocaleCatalog, ...catalogs[locale] };
const missing = [];
const messages = Object.keys(input).reduce((acc, key) => {
acc[key] = getTranslation(catalogs, input[key], locale, key, (event) => {
missing.push(event);
}, options);
return acc;
}, {});
return {
missing,
messages,
};
}
function sourceLocaleFallback(catalog, key) {
if (!catalog?.[key]) {
return undefined;
}
return catalog[key].translation || catalog[key].message;
}
function getTranslation(catalogs, msg, locale, key, onMissing, options) {
const { fallbackLocales, sourceLocale } = options;
const getTranslation = (_locale) => {
const localeCatalog = catalogs[_locale];
return localeCatalog?.[key]?.translation;
};
const getMultipleFallbacks = (_locale) => {
const fL = getFallbackListForLocale(fallbackLocales, _locale);
if (!fL.length)
return null;
for (const fallbackLocale of fL) {
if (catalogs[fallbackLocale] && getTranslation(fallbackLocale)) {
return getTranslation(fallbackLocale);
}
}
};
// target locale -> fallback locales -> fallback locales default ->
// ** (following fallbacks would emit `missing` warning) **
// -> source locale translation -> source locale message
// -> template message
// ** last resort **
// -> id
const translation =
// Get translation in target locale
getTranslation(locale) ||
// We search in fallbackLocales as dependent of each locale
getMultipleFallbacks(locale) ||
(sourceLocale &&
sourceLocale === locale &&
sourceLocaleFallback(catalogs[sourceLocale], key));
if (!translation) {
onMissing({
id: key,
source: msg.message || sourceLocaleFallback(catalogs[sourceLocale], key) || "",
});
}
return (translation ||
(sourceLocale && sourceLocaleFallback(catalogs[sourceLocale], key)) ||
// take from template
msg.message ||
key);
}