@websolutespa/payload-plugin-bowl
Version:
Bowl PayloadCms plugin of the BOM Repository
137 lines (136 loc) • 4.57 kB
JavaScript
import { toCharCase } from '@websolutespa/bom-core';
import { options } from '../../options';
// !!! todo move to payload-utils
const missingTranslations = [];
const locales = options.locales.map((x)=>typeof x === 'string' ? x : x.code);
export function getTranslation(path, defaultText, locale, node, fullPath) {
node = node || options.translations[locale];
fullPath = fullPath || path;
if (node && path.indexOf('.') !== -1) {
const paths = path.split('.');
const key = paths.shift();
path = paths.join('.');
return getTranslation(path, defaultText, locale, node[key] || {}, fullPath);
}
if (node[path]) {
return node[path] || defaultText || '';
} else {
if (missingTranslations.indexOf(fullPath) === -1) {
missingTranslations.push(fullPath);
}
return toCharCase(fullPath.split('.').pop() || '', ' ');
}
}
export function getTranslations(path, defaultText) {
defaultText = defaultText || path;
const localizedText = {};
options.locales.forEach((locale)=>{
const code = typeof locale === 'string' ? locale : locale.code;
localizedText[code] = getTranslation(path, defaultText, code);
});
return localizedText;
}
export function slugToLabels(slug) {
return {
singular: getTranslations(`collection.singular.${slug}`, slug),
plural: getTranslations(`collection.plural.${slug}`, slug)
};
}
export function slugToLabel(slug) {
return getTranslations(`global.${slug}`, slug);
}
export function translateTab(tab) {
if (tab.label === false) {
return tab;
}
if (typeof tab.label === 'object') {
return tab;
}
const label = tab.name || tab.label;
if (label) {
tab.label = getTranslations(`field.${label}`);
}
tab.fields = translateFields(tab.fields);
return tab;
}
export function translateTabs(tabs) {
tabs = tabs.map((tab)=>translateTab(tab));
return tabs;
}
export function translateBlock(block) {
block.labels = slugToLabels(block.slug);
block.fields = translateFields(block.fields);
/*
if (block.slug === 'feature') {
console.log(block.fields);
}
*/ return block;
}
export function translateBlocks(blocks) {
blocks = blocks.map((block)=>translateBlock(block));
return blocks;
}
export function translateField(field) {
if (field.type === 'ui') {
return field;
}
if (field.type === 'row') {
field.fields = translateFields(field.fields);
return field;
}
if (field.type !== 'tabs') {
if (field.admin && typeof field.admin.description === 'string') {
field.admin.description = getTranslations(`description.${field.admin.description}`);
}
}
if (typeof field.label === 'object') {
return field;
}
if (field.label === false) {
return field;
}
const name = field.type === 'tabs' || field.type === 'collapsible' ? undefined : field['name'];
const label = name || field.label;
if (typeof label === 'string') {
field.label = getTranslations(`field.${label}`);
// console.log('label', label, '->', field.label);
}
switch(field.type){
case 'tabs':
break;
case 'group':
case 'array':
field.fields = translateFields(field.fields);
break;
case 'blocks':
field.blocks = translateBlocks(field.blocks);
break;
}
return field;
}
export function translateFields(fields) {
fields = fields.map((field)=>translateField(field));
return fields;
}
export function translateCollection(config) {
config.labels = slugToLabels(config.slug);
config.fields = translateFields(config.fields);
if (config.admin && config.admin.group && typeof config.admin.group === 'string') {
config.admin.group = getTranslations(`group.${config.admin.group}`);
}
return config;
}
export function translateGlobal(config) {
config.label = slugToLabel(config.slug);
config.fields = translateFields(config.fields);
if (config.admin && config.admin.group && typeof config.admin.group === 'string') {
// !!! possible payloadcms Typescript bug
config.admin.group = getTranslations(`group.${config.admin.group}`);
}
return config;
}
export function logMissingTranslations() {
missingTranslations.sort();
missingTranslations.forEach((missing)=>console.warn(`[Bowl] missing translation ${missing}`));
}
//# sourceMappingURL=translations.js.map