UNPKG

@websolutespa/payload-plugin-bowl

Version:

Bowl PayloadCms plugin of the BOM Repository

137 lines (136 loc) 4.57 kB
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