@roxxel/payload-multilang 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +16 -3
  2. package/dist/components/LanguageListToolbar.js +4 -3
  3. package/dist/components/LanguageListToolbar.js.map +1 -1
  4. package/dist/components/LanguageMetabox.js +18 -17
  5. package/dist/components/LanguageMetabox.js.map +1 -1
  6. package/dist/components/TranslationActionsClient.js +16 -14
  7. package/dist/components/TranslationActionsClient.js.map +1 -1
  8. package/dist/components/TranslationColumnCell.js +4 -1
  9. package/dist/components/TranslationColumnCell.js.map +1 -1
  10. package/dist/components/TranslationColumnCellClient.js +16 -7
  11. package/dist/components/TranslationColumnCellClient.js.map +1 -1
  12. package/dist/components/TranslationsTab.js +9 -8
  13. package/dist/components/TranslationsTab.js.map +1 -1
  14. package/dist/constants.d.ts +1 -1
  15. package/dist/constants.js +1 -1
  16. package/dist/constants.js.map +1 -1
  17. package/dist/endpoints/translations.js +4 -6
  18. package/dist/endpoints/translations.js.map +1 -1
  19. package/dist/hooks/translatedCollection.d.ts +2 -1
  20. package/dist/hooks/translatedCollection.js +321 -16
  21. package/dist/hooks/translatedCollection.js.map +1 -1
  22. package/dist/hooks/translatedGlobal.js +5 -1
  23. package/dist/hooks/translatedGlobal.js.map +1 -1
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.js +22 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/config.js +2 -10
  28. package/dist/lib/config.js.map +1 -1
  29. package/dist/lib/data.d.ts +1 -2
  30. package/dist/lib/data.js +32 -4
  31. package/dist/lib/data.js.map +1 -1
  32. package/dist/translations.d.ts +72 -0
  33. package/dist/translations.js +72 -0
  34. package/dist/translations.js.map +1 -0
  35. package/dist/types.d.ts +0 -19
  36. package/dist/types.js.map +1 -1
  37. package/docs/configuration.md +51 -9
  38. package/docs/usage.md +17 -35
  39. package/package.json +1 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, GlobalConfig, Plugin } from 'payload'\n\nimport type { PayloadMultilangConfig } from './types.js'\n\nimport { createTranslationEndpoints } from './endpoints/translations.js'\nimport { withTranslatedCollection } from './hooks/translatedCollection.js'\nimport { withTranslatedGlobal } from './hooks/translatedGlobal.js'\nimport {\n getCollectionConfig,\n getGlobalConfig,\n sanitizePluginConfig,\n} from './lib/config.js'\n\nexport {\n DEFAULT_FIELD_NAMES,\n MULTILANG_GROUP_FIELD,\n MULTILANG_LANGUAGE_FIELD,\n MULTILANG_META_FIELD,\n} from './constants.js'\n\nexport {\n createMultilangHelpers,\n findGlobalByLanguageWithPayload,\n getDocumentTranslationsWithPayload,\n getDocumentTranslationWithPayload,\n getGroupTranslationsWithPayload,\n getMultilangDocumentLanguage,\n localizedSlugQuery,\n updateGlobalByLanguageWithPayload,\n withLanguage,\n} from './lib/data.js'\n\nexport type {\n FindGlobalByLanguageArgs,\n GetDocumentTranslationArgs,\n GetDocumentTranslationsArgs,\n LocalizedSlugQuery,\n LocalizedSlugQueryArgs,\n LocalizedSlugQueryStatus,\n MultilangDocumentLanguageArgs,\n MultilangHelpers,\n PayloadFactory,\n UpdateGlobalByLanguageArgs,\n} from './lib/data.js'\n\nexport type {\n MultilangCollectionOptions,\n MultilangFieldNames,\n MultilangGlobalOptions,\n MultilangLanguage,\n PayloadMultilangConfig,\n ResolvedMultilangGlobal,\n TranslationMap,\n TranslationState,\n} from './types.js'\n\nexport const payloadMultilang =\n (pluginOptions: PayloadMultilangConfig = { languages: [] }): Plugin =>\n (config: Config): Config => {\n if (pluginOptions.disabled) {\n return config\n }\n\n if (config.localization) {\n throw new Error(\n 'payload-multilang uses per-language documents and cannot run with Payload built-in localization enabled. Set localization: false and do not use localized: true fields for this plugin model.',\n )\n }\n\n const pluginConfig = sanitizePluginConfig(pluginOptions)\n\n const incomingCollections = config.collections || []\n const collections = incomingCollections.map(\n (collection): CollectionConfig => {\n const translatedCollection = getCollectionConfig(\n pluginConfig.collections,\n collection.slug,\n )\n\n if (!translatedCollection) {\n return collection\n }\n\n const translated = withTranslatedCollection({\n collection: translatedCollection,\n config: collection,\n })\n\n return {\n ...translated,\n endpoints: [\n ...(translated.endpoints || []),\n ...createTranslationEndpoints({\n collection: translatedCollection,\n collectionConfig: collection,\n }),\n ],\n }\n },\n )\n\n const incomingGlobals = config.globals || []\n const globals = incomingGlobals.map((globalConfig): GlobalConfig => {\n const translatedGlobal = getGlobalConfig(\n pluginConfig.globals,\n globalConfig.slug,\n )\n\n if (!translatedGlobal) {\n return globalConfig\n }\n\n return withTranslatedGlobal({\n config: globalConfig,\n global: translatedGlobal,\n })\n })\n\n return {\n ...config,\n admin: {\n ...config.admin,\n custom: {\n ...config.admin?.custom,\n payloadMultilang: {\n ...((config.admin?.custom as\n | { payloadMultilang?: Record<string, unknown> }\n | undefined)?.payloadMultilang || {}),\n defaultLanguage: pluginConfig.defaultLanguage,\n languages: pluginConfig.languages,\n },\n },\n },\n collections,\n globals,\n }\n }\n"],"names":["createTranslationEndpoints","withTranslatedCollection","withTranslatedGlobal","getCollectionConfig","getGlobalConfig","sanitizePluginConfig","DEFAULT_FIELD_NAMES","MULTILANG_GROUP_FIELD","MULTILANG_LANGUAGE_FIELD","MULTILANG_META_FIELD","createMultilangHelpers","findGlobalByLanguageWithPayload","getDocumentTranslationsWithPayload","getDocumentTranslationWithPayload","getGroupTranslationsWithPayload","getMultilangDocumentLanguage","localizedSlugQuery","updateGlobalByLanguageWithPayload","withLanguage","payloadMultilang","pluginOptions","languages","config","disabled","localization","Error","pluginConfig","incomingCollections","collections","map","collection","translatedCollection","slug","translated","endpoints","collectionConfig","incomingGlobals","globals","globalConfig","translatedGlobal","global","admin","custom","defaultLanguage"],"mappings":"AAIA,SAASA,0BAA0B,QAAQ,8BAA6B;AACxE,SAASC,wBAAwB,QAAQ,kCAAiC;AAC1E,SAASC,oBAAoB,QAAQ,8BAA6B;AAClE,SACEC,mBAAmB,EACnBC,eAAe,EACfC,oBAAoB,QACf,kBAAiB;AAExB,SACEC,mBAAmB,EACnBC,qBAAqB,EACrBC,wBAAwB,EACxBC,oBAAoB,QACf,iBAAgB;AAEvB,SACEC,sBAAsB,EACtBC,+BAA+B,EAC/BC,kCAAkC,EAClCC,iCAAiC,EACjCC,+BAA+B,EAC/BC,4BAA4B,EAC5BC,kBAAkB,EAClBC,iCAAiC,EACjCC,YAAY,QACP,gBAAe;AA0BtB,OAAO,MAAMC,mBACX,CAACC,gBAAwC;IAAEC,WAAW,EAAE;AAAC,CAAC,GAC1D,CAACC;QACC,IAAIF,cAAcG,QAAQ,EAAE;YAC1B,OAAOD;QACT;QAEA,IAAIA,OAAOE,YAAY,EAAE;YACvB,MAAM,IAAIC,MACR;QAEJ;QAEA,MAAMC,eAAerB,qBAAqBe;QAE1C,MAAMO,sBAAsBL,OAAOM,WAAW,IAAI,EAAE;QACpD,MAAMA,cAAcD,oBAAoBE,GAAG,CACzC,CAACC;YACC,MAAMC,uBAAuB5B,oBAC3BuB,aAAaE,WAAW,EACxBE,WAAWE,IAAI;YAGjB,IAAI,CAACD,sBAAsB;gBACzB,OAAOD;YACT;YAEA,MAAMG,aAAahC,yBAAyB;gBAC1C6B,YAAYC;gBACZT,QAAQQ;YACV;YAEA,OAAO;gBACL,GAAGG,UAAU;gBACbC,WAAW;uBACLD,WAAWC,SAAS,IAAI,EAAE;uBAC3BlC,2BAA2B;wBAC5B8B,YAAYC;wBACZI,kBAAkBL;oBACpB;iBACD;YACH;QACF;QAGF,MAAMM,kBAAkBd,OAAOe,OAAO,IAAI,EAAE;QAC5C,MAAMA,UAAUD,gBAAgBP,GAAG,CAAC,CAACS;YACnC,MAAMC,mBAAmBnC,gBACvBsB,aAAaW,OAAO,EACpBC,aAAaN,IAAI;YAGnB,IAAI,CAACO,kBAAkB;gBACrB,OAAOD;YACT;YAEA,OAAOpC,qBAAqB;gBAC1BoB,QAAQgB;gBACRE,QAAQD;YACV;QACF;QAEA,OAAO;YACL,GAAGjB,MAAM;YACTmB,OAAO;gBACL,GAAGnB,OAAOmB,KAAK;gBACfC,QAAQ;oBACN,GAAGpB,OAAOmB,KAAK,EAAEC,MAAM;oBACvBvB,kBAAkB;wBAChB,GAAI,AAACG,OAAOmB,KAAK,EAAEC,QAEHvB,oBAAoB,CAAC,CAAC;wBACtCwB,iBAAiBjB,aAAaiB,eAAe;wBAC7CtB,WAAWK,aAAaL,SAAS;oBACnC;gBACF;YACF;YACAO;YACAS;QACF;IACF,EAAC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config, GlobalConfig, Plugin } from 'payload'\n\nimport type { PayloadMultilangConfig } from './types.js'\n\nimport { createTranslationEndpoints } from './endpoints/translations.js'\nimport { withTranslatedCollection } from './hooks/translatedCollection.js'\nimport { withTranslatedGlobal } from './hooks/translatedGlobal.js'\nimport {\n getCollectionConfig,\n getGlobalConfig,\n sanitizePluginConfig,\n} from './lib/config.js'\nimport { payloadMultilangTranslations } from './translations.js'\n\nexport {\n DEFAULT_FIELD_NAMES,\n MULTILANG_GROUP_FIELD,\n MULTILANG_LANGUAGE_FIELD,\n MULTILANG_META_FIELD,\n} from './constants.js'\n\nexport {\n createMultilangHelpers,\n findGlobalByLanguageWithPayload,\n getDocumentTranslationsWithPayload,\n getDocumentTranslationWithPayload,\n getGroupTranslationsWithPayload,\n getMultilangDocumentLanguage,\n localizedSlugQuery,\n updateGlobalByLanguageWithPayload,\n withLanguage,\n} from './lib/data.js'\n\nexport type {\n FindGlobalByLanguageArgs,\n GetDocumentTranslationArgs,\n GetDocumentTranslationsArgs,\n LocalizedSlugQuery,\n LocalizedSlugQueryArgs,\n LocalizedSlugQueryStatus,\n MultilangDocumentLanguageArgs,\n MultilangHelpers,\n PayloadFactory,\n UpdateGlobalByLanguageArgs,\n} from './lib/data.js'\n\nexport {\n type PayloadMultilangTranslationKey,\n payloadMultilangTranslations,\n type PayloadMultilangTranslations,\n} from './translations.js'\n\nexport type {\n MultilangCollectionOptions,\n MultilangFieldNames,\n MultilangGlobalOptions,\n MultilangLanguage,\n PayloadMultilangConfig,\n ResolvedMultilangGlobal,\n TranslationMap,\n TranslationState,\n} from './types.js'\n\ntype TranslationRecord = Record<string, unknown>\n\nconst isRecord = (value: unknown): value is TranslationRecord =>\n Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n\nconst mergeTranslations = (\n base: TranslationRecord,\n override: TranslationRecord,\n): TranslationRecord => {\n const output: TranslationRecord = { ...base }\n\n Object.entries(override).forEach(([key, value]) => {\n const existing = output[key]\n\n output[key] =\n isRecord(existing) && isRecord(value)\n ? mergeTranslations(existing, value)\n : value\n })\n\n return output\n}\n\nconst withPluginTranslations = (config: Config): Config => ({\n ...config,\n i18n: {\n ...config.i18n,\n translations: mergeTranslations(\n payloadMultilangTranslations,\n (config.i18n?.translations || {}) as TranslationRecord,\n ) as NonNullable<Config['i18n']>['translations'],\n },\n})\n\nexport const payloadMultilang =\n (pluginOptions: PayloadMultilangConfig = { languages: [] }): Plugin =>\n (config: Config): Config => {\n if (pluginOptions.disabled) {\n return config\n }\n\n if (config.localization) {\n throw new Error(\n 'payload-multilang uses per-language documents and cannot run with Payload built-in localization enabled. Set localization: false and do not use localized: true fields for this plugin model.',\n )\n }\n\n const pluginConfig = sanitizePluginConfig(pluginOptions)\n\n const incomingCollections = config.collections || []\n const collections = incomingCollections.map(\n (collection): CollectionConfig => {\n const translatedCollection = getCollectionConfig(\n pluginConfig.collections,\n collection.slug,\n )\n\n if (!translatedCollection) {\n return collection\n }\n\n const translated = withTranslatedCollection({\n collection: translatedCollection,\n config: collection,\n })\n\n return {\n ...translated,\n endpoints: [\n ...(translated.endpoints || []),\n ...createTranslationEndpoints({\n collection: translatedCollection,\n collectionConfig: collection,\n }),\n ],\n }\n },\n )\n\n const incomingGlobals = config.globals || []\n const globals = incomingGlobals.map((globalConfig): GlobalConfig => {\n const translatedGlobal = getGlobalConfig(\n pluginConfig.globals,\n globalConfig.slug,\n )\n\n if (!translatedGlobal) {\n return globalConfig\n }\n\n return withTranslatedGlobal({\n config: globalConfig,\n global: translatedGlobal,\n })\n })\n\n return withPluginTranslations({\n ...config,\n admin: {\n ...config.admin,\n custom: {\n ...config.admin?.custom,\n payloadMultilang: {\n ...((config.admin?.custom as\n | { payloadMultilang?: Record<string, unknown> }\n | undefined)?.payloadMultilang || {}),\n defaultLanguage: pluginConfig.defaultLanguage,\n languages: pluginConfig.languages,\n },\n },\n },\n collections,\n globals,\n })\n }\n"],"names":["createTranslationEndpoints","withTranslatedCollection","withTranslatedGlobal","getCollectionConfig","getGlobalConfig","sanitizePluginConfig","payloadMultilangTranslations","DEFAULT_FIELD_NAMES","MULTILANG_GROUP_FIELD","MULTILANG_LANGUAGE_FIELD","MULTILANG_META_FIELD","createMultilangHelpers","findGlobalByLanguageWithPayload","getDocumentTranslationsWithPayload","getDocumentTranslationWithPayload","getGroupTranslationsWithPayload","getMultilangDocumentLanguage","localizedSlugQuery","updateGlobalByLanguageWithPayload","withLanguage","isRecord","value","Boolean","Array","isArray","mergeTranslations","base","override","output","Object","entries","forEach","key","existing","withPluginTranslations","config","i18n","translations","payloadMultilang","pluginOptions","languages","disabled","localization","Error","pluginConfig","incomingCollections","collections","map","collection","translatedCollection","slug","translated","endpoints","collectionConfig","incomingGlobals","globals","globalConfig","translatedGlobal","global","admin","custom","defaultLanguage"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- import { DEFAULT_DUPLICATE_EXCLUDE_FIELDS, DEFAULT_FIELD_NAMES, DEFAULT_GLOBAL_TABS_LABEL } from '../constants.js';
1
+ import { DEFAULT_FIELD_NAMES, DEFAULT_GLOBAL_TABS_LABEL } from '../constants.js';
2
2
  export const resolveFieldNames = (pluginFieldNames, collectionFieldNames)=>({
3
3
  ...DEFAULT_FIELD_NAMES,
4
4
  ...pluginFieldNames || {},
5
5
  ...collectionFieldNames || {}
6
6
  });
7
- const uniqueStrings = (...values)=>Array.from(new Set(values.flatMap((value)=>(value || []).map((field)=>field.trim()).filter(Boolean))));
8
7
  export const sanitizePluginConfig = (pluginOptions)=>{
9
8
  const languages = normalizeConfiguredLanguages(pluginOptions.languages || []);
10
9
  const defaultLanguage = languages.find((language)=>language.isDefault);
@@ -20,15 +19,8 @@ export const sanitizePluginConfig = (pluginOptions)=>{
20
19
  {
21
20
  slug,
22
21
  defaultLanguage,
23
- duplicate: collectionOptions.duplicate ?? true,
24
- duplicateExcludeFields: [
25
- ...DEFAULT_DUPLICATE_EXCLUDE_FIELDS,
26
- ...pluginOptions.duplicateExcludeFields || [],
27
- ...collectionOptions.duplicateExcludeFields || []
28
- ],
29
22
  fieldNames: resolveFieldNames(pluginOptions.fieldNames, collectionOptions.fields),
30
- languages,
31
- synchronizedFields: uniqueStrings(collectionOptions.synchronizedFields)
23
+ languages
32
24
  }
33
25
  ];
34
26
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/config.ts"],"sourcesContent":["import type {\n MultilangCollectionOptions,\n MultilangFieldNames,\n MultilangGlobalOptions,\n MultilangLanguage,\n PayloadMultilangConfig,\n ResolvedMultilangCollection,\n ResolvedMultilangGlobal,\n} from '../types.js'\n\nimport {\n DEFAULT_DUPLICATE_EXCLUDE_FIELDS,\n DEFAULT_FIELD_NAMES,\n DEFAULT_GLOBAL_TABS_LABEL,\n} from '../constants.js'\n\nexport type SanitizedPluginConfig = {\n collections: ResolvedMultilangCollection[]\n defaultLanguage: MultilangLanguage\n disabled: boolean\n globals: ResolvedMultilangGlobal[]\n languages: MultilangLanguage[]\n raw: PayloadMultilangConfig\n}\n\nexport const resolveFieldNames = (\n pluginFieldNames?: Partial<MultilangFieldNames>,\n collectionFieldNames?: Partial<MultilangFieldNames>,\n): MultilangFieldNames => ({\n ...DEFAULT_FIELD_NAMES,\n ...(pluginFieldNames || {}),\n ...(collectionFieldNames || {}),\n})\n\nconst uniqueStrings = (...values: Array<string[] | undefined>): string[] =>\n Array.from(\n new Set(\n values.flatMap((value) =>\n (value || []).map((field) => field.trim()).filter(Boolean),\n ),\n ),\n )\n\nexport const sanitizePluginConfig = (\n pluginOptions: PayloadMultilangConfig,\n): SanitizedPluginConfig => {\n const languages = normalizeConfiguredLanguages(pluginOptions.languages || [])\n const defaultLanguage = languages.find((language) => language.isDefault)\n\n if (!defaultLanguage) {\n throw new Error('payload-multilang requires one active default language.')\n }\n\n const collections = Object.entries(pluginOptions.collections || {}).flatMap(\n ([slug, value]) => {\n if (!value) {\n return []\n }\n\n const collectionOptions: MultilangCollectionOptions =\n value === true ? {} : value\n\n return [\n {\n slug,\n defaultLanguage,\n duplicate: collectionOptions.duplicate ?? true,\n duplicateExcludeFields: [\n ...DEFAULT_DUPLICATE_EXCLUDE_FIELDS,\n ...(pluginOptions.duplicateExcludeFields || []),\n ...(collectionOptions.duplicateExcludeFields || []),\n ],\n fieldNames: resolveFieldNames(\n pluginOptions.fieldNames,\n collectionOptions.fields,\n ),\n languages,\n synchronizedFields: uniqueStrings(collectionOptions.synchronizedFields),\n },\n ]\n },\n )\n\n const globals = Object.entries(pluginOptions.globals || {}).flatMap(\n ([slug, value]) => {\n if (!value) {\n return []\n }\n\n const globalOptions: MultilangGlobalOptions = value === true ? {} : value\n\n return [\n {\n slug,\n defaultLanguage,\n label: globalOptions.label?.trim() || DEFAULT_GLOBAL_TABS_LABEL,\n languages,\n },\n ]\n },\n )\n\n return {\n collections,\n defaultLanguage,\n disabled: Boolean(pluginOptions.disabled),\n globals,\n languages,\n raw: pluginOptions,\n }\n}\n\nexport const getCollectionConfig = (\n collections: ResolvedMultilangCollection[],\n slug: string,\n): ResolvedMultilangCollection | undefined =>\n collections.find((collection) => collection.slug === slug)\n\nexport const getGlobalConfig = (\n globals: ResolvedMultilangGlobal[],\n slug: string,\n): ResolvedMultilangGlobal | undefined =>\n globals.find((global) => global.slug === slug)\n\nexport const normalizeConfiguredLanguages = (\n languages: MultilangLanguage[],\n): MultilangLanguage[] => {\n const seen = new Set<string>()\n const normalized = languages.map((language, index): MultilangLanguage => {\n const code = language.code.trim().toLowerCase()\n\n if (!code) {\n throw new Error(`payload-multilang language at index ${index} is missing a code.`)\n }\n\n if (seen.has(code)) {\n throw new Error(`payload-multilang language code \"${code}\" is duplicated.`)\n }\n\n seen.add(code)\n\n return {\n id: language.id,\n name: language.name?.trim() || code,\n active: language.active !== false,\n code,\n direction: language.direction === 'rtl' ? 'rtl' : 'ltr',\n flagLabel: language.flagLabel?.trim(),\n isDefault: language.isDefault === true,\n locale: language.locale?.trim(),\n order: typeof language.order === 'number' ? language.order : 0,\n }\n })\n\n const activeDefaults = normalized.filter(\n (language) => language.active !== false && language.isDefault,\n )\n\n if (activeDefaults.length !== 1) {\n throw new Error('payload-multilang requires exactly one active default language.')\n }\n\n return normalized.sort((a, b) => {\n const order = (a.order || 0) - (b.order || 0)\n\n if (order !== 0) {\n return order\n }\n\n return a.code.localeCompare(b.code)\n })\n}\n"],"names":["DEFAULT_DUPLICATE_EXCLUDE_FIELDS","DEFAULT_FIELD_NAMES","DEFAULT_GLOBAL_TABS_LABEL","resolveFieldNames","pluginFieldNames","collectionFieldNames","uniqueStrings","values","Array","from","Set","flatMap","value","map","field","trim","filter","Boolean","sanitizePluginConfig","pluginOptions","languages","normalizeConfiguredLanguages","defaultLanguage","find","language","isDefault","Error","collections","Object","entries","slug","collectionOptions","duplicate","duplicateExcludeFields","fieldNames","fields","synchronizedFields","globals","globalOptions","label","disabled","raw","getCollectionConfig","collection","getGlobalConfig","global","seen","normalized","index","code","toLowerCase","has","add","id","name","active","direction","flagLabel","locale","order","activeDefaults","length","sort","a","b","localeCompare"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/config.ts"],"sourcesContent":["import type {\n MultilangCollectionOptions,\n MultilangFieldNames,\n MultilangGlobalOptions,\n MultilangLanguage,\n PayloadMultilangConfig,\n ResolvedMultilangCollection,\n ResolvedMultilangGlobal,\n} from '../types.js'\n\nimport { DEFAULT_FIELD_NAMES, DEFAULT_GLOBAL_TABS_LABEL } from '../constants.js'\n\nexport type SanitizedPluginConfig = {\n collections: ResolvedMultilangCollection[]\n defaultLanguage: MultilangLanguage\n disabled: boolean\n globals: ResolvedMultilangGlobal[]\n languages: MultilangLanguage[]\n raw: PayloadMultilangConfig\n}\n\nexport const resolveFieldNames = (\n pluginFieldNames?: Partial<MultilangFieldNames>,\n collectionFieldNames?: Partial<MultilangFieldNames>,\n): MultilangFieldNames => ({\n ...DEFAULT_FIELD_NAMES,\n ...(pluginFieldNames || {}),\n ...(collectionFieldNames || {}),\n})\n\nexport const sanitizePluginConfig = (\n pluginOptions: PayloadMultilangConfig,\n): SanitizedPluginConfig => {\n const languages = normalizeConfiguredLanguages(pluginOptions.languages || [])\n const defaultLanguage = languages.find((language) => language.isDefault)\n\n if (!defaultLanguage) {\n throw new Error('payload-multilang requires one active default language.')\n }\n\n const collections = Object.entries(pluginOptions.collections || {}).flatMap(\n ([slug, value]) => {\n if (!value) {\n return []\n }\n\n const collectionOptions: MultilangCollectionOptions =\n value === true ? {} : value\n\n return [\n {\n slug,\n defaultLanguage,\n fieldNames: resolveFieldNames(\n pluginOptions.fieldNames,\n collectionOptions.fields,\n ),\n languages,\n },\n ]\n },\n )\n\n const globals = Object.entries(pluginOptions.globals || {}).flatMap(\n ([slug, value]) => {\n if (!value) {\n return []\n }\n\n const globalOptions: MultilangGlobalOptions = value === true ? {} : value\n\n return [\n {\n slug,\n defaultLanguage,\n label: globalOptions.label?.trim() || DEFAULT_GLOBAL_TABS_LABEL,\n languages,\n },\n ]\n },\n )\n\n return {\n collections,\n defaultLanguage,\n disabled: Boolean(pluginOptions.disabled),\n globals,\n languages,\n raw: pluginOptions,\n }\n}\n\nexport const getCollectionConfig = (\n collections: ResolvedMultilangCollection[],\n slug: string,\n): ResolvedMultilangCollection | undefined =>\n collections.find((collection) => collection.slug === slug)\n\nexport const getGlobalConfig = (\n globals: ResolvedMultilangGlobal[],\n slug: string,\n): ResolvedMultilangGlobal | undefined =>\n globals.find((global) => global.slug === slug)\n\nexport const normalizeConfiguredLanguages = (\n languages: MultilangLanguage[],\n): MultilangLanguage[] => {\n const seen = new Set<string>()\n const normalized = languages.map((language, index): MultilangLanguage => {\n const code = language.code.trim().toLowerCase()\n\n if (!code) {\n throw new Error(`payload-multilang language at index ${index} is missing a code.`)\n }\n\n if (seen.has(code)) {\n throw new Error(`payload-multilang language code \"${code}\" is duplicated.`)\n }\n\n seen.add(code)\n\n return {\n id: language.id,\n name: language.name?.trim() || code,\n active: language.active !== false,\n code,\n direction: language.direction === 'rtl' ? 'rtl' : 'ltr',\n flagLabel: language.flagLabel?.trim(),\n isDefault: language.isDefault === true,\n locale: language.locale?.trim(),\n order: typeof language.order === 'number' ? language.order : 0,\n }\n })\n\n const activeDefaults = normalized.filter(\n (language) => language.active !== false && language.isDefault,\n )\n\n if (activeDefaults.length !== 1) {\n throw new Error('payload-multilang requires exactly one active default language.')\n }\n\n return normalized.sort((a, b) => {\n const order = (a.order || 0) - (b.order || 0)\n\n if (order !== 0) {\n return order\n }\n\n return a.code.localeCompare(b.code)\n })\n}\n"],"names":["DEFAULT_FIELD_NAMES","DEFAULT_GLOBAL_TABS_LABEL","resolveFieldNames","pluginFieldNames","collectionFieldNames","sanitizePluginConfig","pluginOptions","languages","normalizeConfiguredLanguages","defaultLanguage","find","language","isDefault","Error","collections","Object","entries","flatMap","slug","value","collectionOptions","fieldNames","fields","globals","globalOptions","label","trim","disabled","Boolean","raw","getCollectionConfig","collection","getGlobalConfig","global","seen","Set","normalized","map","index","code","toLowerCase","has","add","id","name","active","direction","flagLabel","locale","order","activeDefaults","filter","length","sort","a","b","localeCompare"],"mappings":"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"}
@@ -104,10 +104,9 @@ export declare const updateGlobalByLanguageWithPayload: <TDoc extends DocumentDa
104
104
  req?: PayloadRequest;
105
105
  slug: GlobalSlug;
106
106
  }) => Promise<TDoc>;
107
- export declare const duplicateDocumentData: ({ collection, doc, duplicateExcludeFields, fieldNames, targetLanguage, }: {
107
+ export declare const duplicateDocumentData: ({ collection, doc, fieldNames, targetLanguage, }: {
108
108
  collection: CollectionConfig;
109
109
  doc: DocumentData;
110
- duplicateExcludeFields: string[];
111
110
  fieldNames: MultilangFieldNames;
112
111
  targetLanguage: string;
113
112
  }) => DocumentData;
package/dist/lib/data.js CHANGED
@@ -1,4 +1,4 @@
1
- import { DEFAULT_FIELD_NAMES } from '../constants.js';
1
+ import { DEFAULT_FIELD_NAMES, SYSTEM_DUPLICATION_EXCLUDED_FIELDS } from '../constants.js';
2
2
  export const asDocument = (value)=>value && typeof value === 'object' ? value : {};
3
3
  export const getStringValue = (value)=>typeof value === 'string' && value.length > 0 ? value : undefined;
4
4
  export const getID = (value)=>typeof value === 'number' || typeof value === 'string' ? value : undefined;
@@ -278,12 +278,40 @@ export const updateGlobalByLanguageWithPayload = async ({ slug, data, depth, lan
278
278
  });
279
279
  };
280
280
  const fieldAffectsData = (field)=>'name' in field && typeof field.name === 'string' && field.type !== 'ui';
281
- export const duplicateDocumentData = ({ collection, doc, duplicateExcludeFields, fieldNames, targetLanguage })=>{
281
+ const duplicateFieldValue = (field, value)=>{
282
+ if (field.type === 'array' && Array.isArray(value)) {
283
+ return value.map((row)=>duplicateRowValue(asDocument(row), field.fields));
284
+ }
285
+ if (field.type === 'blocks' && Array.isArray(value)) {
286
+ return value.map((row)=>{
287
+ const rowData = asDocument(row);
288
+ const block = field.blocks.find((candidate)=>candidate.slug === getStringValue(rowData.blockType));
289
+ return duplicateRowValue(rowData, block?.fields || []);
290
+ });
291
+ }
292
+ return value;
293
+ };
294
+ const duplicateRowValue = (row, fields)=>{
295
+ const data = Object.entries(row).reduce((acc, [key, value])=>{
296
+ if (key !== 'id') {
297
+ acc[key] = value;
298
+ }
299
+ return acc;
300
+ }, {});
301
+ for (const field of fields){
302
+ if (!fieldAffectsData(field) || !(field.name in data)) {
303
+ continue;
304
+ }
305
+ data[field.name] = duplicateFieldValue(field, data[field.name]);
306
+ }
307
+ return data;
308
+ };
309
+ export const duplicateDocumentData = ({ collection, doc, fieldNames, targetLanguage })=>{
282
310
  const excluded = new Set([
283
311
  fieldNames.group,
284
312
  fieldNames.language,
285
313
  fieldNames.meta,
286
- ...duplicateExcludeFields
314
+ ...SYSTEM_DUPLICATION_EXCLUDED_FIELDS
287
315
  ]);
288
316
  const data = {};
289
317
  for (const field of collection.fields || []){
@@ -293,7 +321,7 @@ export const duplicateDocumentData = ({ collection, doc, duplicateExcludeFields,
293
321
  if (!(field.name in doc)) {
294
322
  continue;
295
323
  }
296
- data[field.name] = doc[field.name];
324
+ data[field.name] = duplicateFieldValue(field, doc[field.name]);
297
325
  }
298
326
  if (typeof data.slug === 'string' && data.slug.length > 0) {
299
327
  data.slug = `${data.slug}-${targetLanguage}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/data.ts"],"sourcesContent":["import type {\n CollectionConfig,\n CollectionSlug,\n Config,\n Field,\n GlobalSlug,\n Payload,\n PayloadRequest,\n Where,\n} from 'payload'\n\nimport type {\n MultilangFieldNames,\n MultilangLanguage,\n TranslationState,\n WithLanguageArgs,\n} from '../types.js'\n\nimport { DEFAULT_FIELD_NAMES } from '../constants.js'\n\nexport type DocumentData = {\n id?: number | string\n} & Record<string, unknown>\n\nexport const asDocument = (value: unknown): DocumentData =>\n value && typeof value === 'object' ? (value as DocumentData) : {}\n\nexport const getStringValue = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined\n\nexport const getID = (value: unknown): number | string | undefined =>\n typeof value === 'number' || typeof value === 'string' ? value : undefined\n\nexport const normalizeLanguage = (doc: unknown): MultilangLanguage => {\n const data = asDocument(doc)\n const code = getStringValue(data.code)?.trim().toLowerCase() || ''\n\n return {\n id: getID(data.id),\n name: getStringValue(data.name)?.trim() || code,\n active: data.active !== false,\n code,\n direction: data.direction === 'rtl' ? 'rtl' : 'ltr',\n flagLabel: getStringValue(data.flagLabel),\n isDefault: data.isDefault === true,\n locale: getStringValue(data.locale),\n order: typeof data.order === 'number' ? data.order : 0,\n }\n}\n\ntype ConfigWithMultilang = Pick<Config, 'admin'> | Pick<Payload['config'], 'admin'>\n\nexport const getLanguagesFromCustom = (custom: unknown): MultilangLanguage[] => {\n const payloadMultilang = asDocument(asDocument(custom).payloadMultilang)\n const languages = payloadMultilang.languages\n\n if (!Array.isArray(languages)) {\n return []\n }\n\n return languages.map(normalizeLanguage).filter((language) => language.code)\n}\n\n/**\n * Returns the languages configured for payload-multilang.\n */\nexport const getLanguages = ({\n config,\n languages,\n payload,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n payload?: Payload\n} = {}): MultilangLanguage[] => {\n if (languages) {\n return languages.map(normalizeLanguage).filter((language) => language.code)\n }\n\n if (payload) {\n return getLanguagesFromCustom(payload.config.admin?.custom)\n }\n\n if (config) {\n return getLanguagesFromCustom(config.admin?.custom)\n }\n\n throw new Error(\n 'getLanguages requires languages, config, or payload. Use createMultilangHelpers({ getPayload }) for app-level convenience.',\n )\n}\n\nexport const getDefaultLanguage = ({\n config,\n languages,\n payload,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n payload?: Payload\n}): MultilangLanguage | undefined => {\n const configuredLanguages = getLanguages({ config, languages, payload })\n\n return configuredLanguages.find((language) => language.isDefault) || configuredLanguages[0]\n}\n\n/**\n * Adds a language constraint to a Payload `where` query.\n *\n * Use this when querying an enabled collection directly and you only want documents for one\n * payload-multilang language.\n */\nexport const withLanguage = ({\n fieldName = DEFAULT_FIELD_NAMES.language,\n language,\n where,\n}: WithLanguageArgs): Where => {\n const languageWhere: Where = {\n [fieldName]: {\n equals: language,\n },\n }\n\n if (!where) {\n return languageWhere\n }\n\n return {\n and: [where, languageWhere],\n }\n}\n\nexport type MultilangDocumentLanguageArgs = {\n data?: unknown\n doc?: unknown\n fallback?: string\n fieldName?: string\n}\n\n/**\n * Resolves a document's payload-multilang language from draft/form data first, then persisted doc data.\n *\n * Useful in Payload admin preview and livePreview URL builders where unsaved form data may already\n * contain the selected language.\n */\nexport const getMultilangDocumentLanguage = ({\n data,\n doc,\n fallback,\n fieldName = DEFAULT_FIELD_NAMES.language,\n}: MultilangDocumentLanguageArgs): string | undefined =>\n getStringValue(asDocument(data)[fieldName]) ||\n getStringValue(asDocument(doc)[fieldName]) ||\n fallback\n\nexport type LocalizedSlugQueryStatus = 'any' | 'draft' | 'published'\n\nexport type LocalizedSlugQueryArgs = {\n fieldName?: string\n language: string\n slug: string\n slugFieldName?: string\n status?: LocalizedSlugQueryStatus\n where?: Where\n}\n\nexport type LocalizedSlugQuery = {\n draft?: boolean\n where: Where\n}\n\n/**\n * Builds the common Payload Local API query for per-language documents addressed by slug.\n */\nexport const localizedSlugQuery = ({\n slug,\n fieldName = DEFAULT_FIELD_NAMES.language,\n language,\n slugFieldName = 'slug',\n status = 'published',\n where,\n}: LocalizedSlugQueryArgs): LocalizedSlugQuery => {\n const constraints: Where[] = [\n {\n [slugFieldName]: {\n equals: slug,\n },\n },\n {\n [fieldName]: {\n equals: language,\n },\n },\n ]\n\n if (where) {\n constraints.unshift(where)\n }\n\n if (status !== 'any') {\n constraints.push({\n _status: {\n equals: status,\n },\n })\n }\n\n return {\n ...(status === 'draft' ? { draft: true } : {}),\n where:\n constraints.length === 1\n ? constraints[0]\n : {\n and: constraints,\n },\n }\n}\n\nexport const getDocumentTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const source = asDocument(\n await payload.findByID({\n id,\n collection,\n depth: 0,\n overrideAccess,\n req,\n }),\n ) as TDoc\n\n const group = getStringValue(source[fieldNames.group])\n const language = getStringValue(source[fieldNames.language])\n\n if (!group) {\n return {\n language,\n source,\n translations: language ? { [language]: source } : {},\n }\n }\n\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n language,\n source,\n translations,\n }\n}\n\nexport const getGroupTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n group,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n group: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n translations,\n }\n}\n\n/**\n * Returns the source document and every document in the same translation group, keyed by language.\n */\nexport const getDocumentTranslationWithPayload = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TDoc | undefined> => {\n const state = await getDocumentTranslationsWithPayload<TDoc>({\n id,\n collection,\n fieldNames,\n overrideAccess,\n payload,\n req,\n })\n\n return state.translations[language]\n}\n\nconst GLOBAL_SYSTEM_FIELDS = new Set(['_status', 'createdAt', 'globalType', 'id', 'updatedAt'])\n\nconst getGlobalPayloadMultilangCustom = ({\n slug,\n payload,\n}: {\n payload: Payload\n slug: GlobalSlug\n}): {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n} => {\n const global = payload.config.globals.find((item) => item.slug === slug)\n const payloadMultilang = asDocument(asDocument(global?.admin?.custom).payloadMultilang)\n\n return payloadMultilang as {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n }\n}\n\nconst validateGlobalLanguage = ({\n slug,\n language,\n payload,\n}: {\n language: string\n payload: Payload\n slug: GlobalSlug\n}): void => {\n const languages = getGlobalPayloadMultilangCustom({ slug, payload }).languages\n\n if (!Array.isArray(languages) || languages.length === 0) {\n return\n }\n\n if (!languages.some((candidate) => candidate.code === language)) {\n throw new Error(`Language \"${language}\" is not configured for ${slug}.`)\n }\n}\n\nconst getGlobalLanguageTab = <TDoc extends DocumentData = DocumentData>({\n doc,\n language,\n}: {\n doc: DocumentData\n language: string\n}): TDoc => {\n const languageData = asDocument(doc[language])\n const systemData = Object.entries(doc).reduce<DocumentData>((acc, [key, value]) => {\n if (GLOBAL_SYSTEM_FIELDS.has(key)) {\n acc[key] = value\n }\n\n return acc\n }, {})\n\n return {\n ...systemData,\n ...languageData,\n } as TDoc\n}\n\nexport const findGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const doc = asDocument(\n await payload.findGlobal({\n slug,\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nexport const updateGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n data: Record<string, unknown>\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const currentDoc = asDocument(\n await payload.findGlobal({\n slug,\n depth: 0,\n overrideAccess,\n req,\n } as never),\n )\n const currentLanguageData = asDocument(currentDoc[language])\n\n const doc = asDocument(\n await payload.updateGlobal({\n slug,\n data: {\n [language]: {\n ...currentLanguageData,\n ...data,\n },\n },\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nconst fieldAffectsData = (field: Field): field is { name: string } & Field =>\n 'name' in field && typeof field.name === 'string' && field.type !== 'ui'\n\nexport const duplicateDocumentData = ({\n collection,\n doc,\n duplicateExcludeFields,\n fieldNames,\n targetLanguage,\n}: {\n collection: CollectionConfig\n doc: DocumentData\n duplicateExcludeFields: string[]\n fieldNames: MultilangFieldNames\n targetLanguage: string\n}): DocumentData => {\n const excluded = new Set([\n fieldNames.group,\n fieldNames.language,\n fieldNames.meta,\n ...duplicateExcludeFields,\n ])\n\n const data: DocumentData = {}\n\n for (const field of collection.fields || []) {\n if (!fieldAffectsData(field) || excluded.has(field.name)) {\n continue\n }\n\n if (!(field.name in doc)) {\n continue\n }\n\n data[field.name] = doc[field.name]\n }\n\n if (typeof data.slug === 'string' && data.slug.length > 0) {\n data.slug = `${data.slug}-${targetLanguage}`\n }\n\n return data\n}\n\nexport type PayloadFactory = () => Payload | Promise<Payload>\n\nexport type GetDocumentTranslationsArgs = {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n overrideAccess?: boolean\n req?: PayloadRequest\n}\n\nexport type GetDocumentTranslationArgs = {\n language: string\n} & GetDocumentTranslationsArgs\n\nexport type FindGlobalByLanguageArgs = {\n depth?: number\n language: string\n overrideAccess?: boolean\n req?: PayloadRequest\n slug: GlobalSlug\n}\n\nexport type UpdateGlobalByLanguageArgs = {\n data: Record<string, unknown>\n} & FindGlobalByLanguageArgs\n\nexport type MultilangHelpers = {\n findGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(\n args: FindGlobalByLanguageArgs,\n ) => Promise<TDoc>\n getDocumentTranslation: <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationArgs,\n ) => Promise<TDoc | undefined>\n getDocumentTranslations: <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationsArgs,\n ) => Promise<TranslationState<TDoc>>\n getLanguages: () => Promise<MultilangLanguage[]>\n updateGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(\n args: UpdateGlobalByLanguageArgs,\n ) => Promise<TDoc>\n}\n\nexport const createMultilangHelpers = ({\n getPayload,\n}: {\n getPayload: PayloadFactory\n}): MultilangHelpers => {\n const resolvePayload = async () => getPayload()\n\n return {\n findGlobalByLanguage: async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n overrideAccess,\n req,\n }: FindGlobalByLanguageArgs): Promise<TDoc> =>\n findGlobalByLanguageWithPayload<TDoc>({\n slug,\n depth,\n language,\n overrideAccess,\n payload: await resolvePayload(),\n req,\n }),\n\n getDocumentTranslation: async <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationArgs,\n ): Promise<TDoc | undefined> =>\n getDocumentTranslationWithPayload<TDoc>({\n ...args,\n payload: await resolvePayload(),\n }),\n\n getDocumentTranslations: async <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationsArgs,\n ): Promise<TranslationState<TDoc>> =>\n getDocumentTranslationsWithPayload<TDoc>({\n ...args,\n payload: await resolvePayload(),\n }),\n\n getLanguages: async (): Promise<MultilangLanguage[]> =>\n getLanguages({ payload: await resolvePayload() }),\n\n updateGlobalByLanguage: async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n overrideAccess,\n req,\n }: UpdateGlobalByLanguageArgs): Promise<TDoc> =>\n updateGlobalByLanguageWithPayload<TDoc>({\n slug,\n data,\n depth,\n language,\n overrideAccess,\n payload: await resolvePayload(),\n req,\n }),\n }\n}\n"],"names":["DEFAULT_FIELD_NAMES","asDocument","value","getStringValue","length","undefined","getID","normalizeLanguage","doc","data","code","trim","toLowerCase","id","name","active","direction","flagLabel","isDefault","locale","order","getLanguagesFromCustom","custom","payloadMultilang","languages","Array","isArray","map","filter","language","getLanguages","config","payload","admin","Error","getDefaultLanguage","configuredLanguages","find","withLanguage","fieldName","where","languageWhere","equals","and","getMultilangDocumentLanguage","fallback","localizedSlugQuery","slug","slugFieldName","status","constraints","unshift","push","_status","draft","getDocumentTranslationsWithPayload","collection","fieldNames","overrideAccess","req","source","findByID","depth","group","translations","result","limit","docs","reduce","acc","translation","getGroupTranslationsWithPayload","getDocumentTranslationWithPayload","state","GLOBAL_SYSTEM_FIELDS","Set","getGlobalPayloadMultilangCustom","global","globals","item","validateGlobalLanguage","some","candidate","getGlobalLanguageTab","languageData","systemData","Object","entries","key","has","findGlobalByLanguageWithPayload","findGlobal","updateGlobalByLanguageWithPayload","currentDoc","currentLanguageData","updateGlobal","fieldAffectsData","field","type","duplicateDocumentData","duplicateExcludeFields","targetLanguage","excluded","meta","fields","createMultilangHelpers","getPayload","resolvePayload","findGlobalByLanguage","getDocumentTranslation","args","getDocumentTranslations","updateGlobalByLanguage"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/data.ts"],"sourcesContent":["import type {\n CollectionConfig,\n CollectionSlug,\n Config,\n Field,\n GlobalSlug,\n Payload,\n PayloadRequest,\n Where,\n} from 'payload'\n\nimport type {\n MultilangFieldNames,\n MultilangLanguage,\n TranslationState,\n WithLanguageArgs,\n} from '../types.js'\n\nimport { DEFAULT_FIELD_NAMES, SYSTEM_DUPLICATION_EXCLUDED_FIELDS } from '../constants.js'\n\nexport type DocumentData = {\n id?: number | string\n} & Record<string, unknown>\n\nexport const asDocument = (value: unknown): DocumentData =>\n value && typeof value === 'object' ? (value as DocumentData) : {}\n\nexport const getStringValue = (value: unknown): string | undefined =>\n typeof value === 'string' && value.length > 0 ? value : undefined\n\nexport const getID = (value: unknown): number | string | undefined =>\n typeof value === 'number' || typeof value === 'string' ? value : undefined\n\nexport const normalizeLanguage = (doc: unknown): MultilangLanguage => {\n const data = asDocument(doc)\n const code = getStringValue(data.code)?.trim().toLowerCase() || ''\n\n return {\n id: getID(data.id),\n name: getStringValue(data.name)?.trim() || code,\n active: data.active !== false,\n code,\n direction: data.direction === 'rtl' ? 'rtl' : 'ltr',\n flagLabel: getStringValue(data.flagLabel),\n isDefault: data.isDefault === true,\n locale: getStringValue(data.locale),\n order: typeof data.order === 'number' ? data.order : 0,\n }\n}\n\ntype ConfigWithMultilang = Pick<Config, 'admin'> | Pick<Payload['config'], 'admin'>\n\nexport const getLanguagesFromCustom = (custom: unknown): MultilangLanguage[] => {\n const payloadMultilang = asDocument(asDocument(custom).payloadMultilang)\n const languages = payloadMultilang.languages\n\n if (!Array.isArray(languages)) {\n return []\n }\n\n return languages.map(normalizeLanguage).filter((language) => language.code)\n}\n\n/**\n * Returns the languages configured for payload-multilang.\n */\nexport const getLanguages = ({\n config,\n languages,\n payload,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n payload?: Payload\n} = {}): MultilangLanguage[] => {\n if (languages) {\n return languages.map(normalizeLanguage).filter((language) => language.code)\n }\n\n if (payload) {\n return getLanguagesFromCustom(payload.config.admin?.custom)\n }\n\n if (config) {\n return getLanguagesFromCustom(config.admin?.custom)\n }\n\n throw new Error(\n 'getLanguages requires languages, config, or payload. Use createMultilangHelpers({ getPayload }) for app-level convenience.',\n )\n}\n\nexport const getDefaultLanguage = ({\n config,\n languages,\n payload,\n}: {\n config?: ConfigWithMultilang\n languages?: MultilangLanguage[]\n payload?: Payload\n}): MultilangLanguage | undefined => {\n const configuredLanguages = getLanguages({ config, languages, payload })\n\n return configuredLanguages.find((language) => language.isDefault) || configuredLanguages[0]\n}\n\n/**\n * Adds a language constraint to a Payload `where` query.\n *\n * Use this when querying an enabled collection directly and you only want documents for one\n * payload-multilang language.\n */\nexport const withLanguage = ({\n fieldName = DEFAULT_FIELD_NAMES.language,\n language,\n where,\n}: WithLanguageArgs): Where => {\n const languageWhere: Where = {\n [fieldName]: {\n equals: language,\n },\n }\n\n if (!where) {\n return languageWhere\n }\n\n return {\n and: [where, languageWhere],\n }\n}\n\nexport type MultilangDocumentLanguageArgs = {\n data?: unknown\n doc?: unknown\n fallback?: string\n fieldName?: string\n}\n\n/**\n * Resolves a document's payload-multilang language from draft/form data first, then persisted doc data.\n *\n * Useful in Payload admin preview and livePreview URL builders where unsaved form data may already\n * contain the selected language.\n */\nexport const getMultilangDocumentLanguage = ({\n data,\n doc,\n fallback,\n fieldName = DEFAULT_FIELD_NAMES.language,\n}: MultilangDocumentLanguageArgs): string | undefined =>\n getStringValue(asDocument(data)[fieldName]) ||\n getStringValue(asDocument(doc)[fieldName]) ||\n fallback\n\nexport type LocalizedSlugQueryStatus = 'any' | 'draft' | 'published'\n\nexport type LocalizedSlugQueryArgs = {\n fieldName?: string\n language: string\n slug: string\n slugFieldName?: string\n status?: LocalizedSlugQueryStatus\n where?: Where\n}\n\nexport type LocalizedSlugQuery = {\n draft?: boolean\n where: Where\n}\n\n/**\n * Builds the common Payload Local API query for per-language documents addressed by slug.\n */\nexport const localizedSlugQuery = ({\n slug,\n fieldName = DEFAULT_FIELD_NAMES.language,\n language,\n slugFieldName = 'slug',\n status = 'published',\n where,\n}: LocalizedSlugQueryArgs): LocalizedSlugQuery => {\n const constraints: Where[] = [\n {\n [slugFieldName]: {\n equals: slug,\n },\n },\n {\n [fieldName]: {\n equals: language,\n },\n },\n ]\n\n if (where) {\n constraints.unshift(where)\n }\n\n if (status !== 'any') {\n constraints.push({\n _status: {\n equals: status,\n },\n })\n }\n\n return {\n ...(status === 'draft' ? { draft: true } : {}),\n where:\n constraints.length === 1\n ? constraints[0]\n : {\n and: constraints,\n },\n }\n}\n\nexport const getDocumentTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const source = asDocument(\n await payload.findByID({\n id,\n collection,\n depth: 0,\n overrideAccess,\n req,\n }),\n ) as TDoc\n\n const group = getStringValue(source[fieldNames.group])\n const language = getStringValue(source[fieldNames.language])\n\n if (!group) {\n return {\n language,\n source,\n translations: language ? { [language]: source } : {},\n }\n }\n\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n language,\n source,\n translations,\n }\n}\n\nexport const getGroupTranslationsWithPayload = async <TDoc extends DocumentData = DocumentData>({\n collection,\n fieldNames = DEFAULT_FIELD_NAMES,\n group,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n group: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TranslationState<TDoc>> => {\n const result = await payload.find({\n collection,\n depth: 0,\n limit: 200,\n overrideAccess,\n req,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n const translations = result.docs.reduce<TranslationState<TDoc>['translations']>((acc, doc) => {\n const translation = asDocument(doc) as TDoc\n const code = getStringValue(translation[fieldNames.language])\n\n if (code) {\n acc[code] = translation\n }\n\n return acc\n }, {})\n\n return {\n group,\n translations,\n }\n}\n\n/**\n * Returns the source document and every document in the same translation group, keyed by language.\n */\nexport const getDocumentTranslationWithPayload = async <TDoc extends DocumentData = DocumentData>({\n id,\n collection,\n fieldNames,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n}): Promise<TDoc | undefined> => {\n const state = await getDocumentTranslationsWithPayload<TDoc>({\n id,\n collection,\n fieldNames,\n overrideAccess,\n payload,\n req,\n })\n\n return state.translations[language]\n}\n\nconst GLOBAL_SYSTEM_FIELDS = new Set(['_status', 'createdAt', 'globalType', 'id', 'updatedAt'])\n\nconst getGlobalPayloadMultilangCustom = ({\n slug,\n payload,\n}: {\n payload: Payload\n slug: GlobalSlug\n}): {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n} => {\n const global = payload.config.globals.find((item) => item.slug === slug)\n const payloadMultilang = asDocument(asDocument(global?.admin?.custom).payloadMultilang)\n\n return payloadMultilang as {\n defaultLanguage?: MultilangLanguage\n languages?: MultilangLanguage[]\n }\n}\n\nconst validateGlobalLanguage = ({\n slug,\n language,\n payload,\n}: {\n language: string\n payload: Payload\n slug: GlobalSlug\n}): void => {\n const languages = getGlobalPayloadMultilangCustom({ slug, payload }).languages\n\n if (!Array.isArray(languages) || languages.length === 0) {\n return\n }\n\n if (!languages.some((candidate) => candidate.code === language)) {\n throw new Error(`Language \"${language}\" is not configured for ${slug}.`)\n }\n}\n\nconst getGlobalLanguageTab = <TDoc extends DocumentData = DocumentData>({\n doc,\n language,\n}: {\n doc: DocumentData\n language: string\n}): TDoc => {\n const languageData = asDocument(doc[language])\n const systemData = Object.entries(doc).reduce<DocumentData>((acc, [key, value]) => {\n if (GLOBAL_SYSTEM_FIELDS.has(key)) {\n acc[key] = value\n }\n\n return acc\n }, {})\n\n return {\n ...systemData,\n ...languageData,\n } as TDoc\n}\n\nexport const findGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const doc = asDocument(\n await payload.findGlobal({\n slug,\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nexport const updateGlobalByLanguageWithPayload = async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n overrideAccess = true,\n payload,\n req,\n}: {\n data: Record<string, unknown>\n depth?: number\n language: string\n overrideAccess?: boolean\n payload: Payload\n req?: PayloadRequest\n slug: GlobalSlug\n}): Promise<TDoc> => {\n validateGlobalLanguage({ slug, language, payload })\n\n const currentDoc = asDocument(\n await payload.findGlobal({\n slug,\n depth: 0,\n overrideAccess,\n req,\n } as never),\n )\n const currentLanguageData = asDocument(currentDoc[language])\n\n const doc = asDocument(\n await payload.updateGlobal({\n slug,\n data: {\n [language]: {\n ...currentLanguageData,\n ...data,\n },\n },\n depth,\n overrideAccess,\n req,\n } as never),\n )\n\n return getGlobalLanguageTab<TDoc>({\n doc,\n language,\n })\n}\n\nconst fieldAffectsData = (field: Field): field is { name: string } & Field =>\n 'name' in field && typeof field.name === 'string' && field.type !== 'ui'\n\nconst duplicateFieldValue = (field: Field, value: unknown): unknown => {\n if (field.type === 'array' && Array.isArray(value)) {\n return value.map((row) =>\n duplicateRowValue(asDocument(row), field.fields),\n )\n }\n\n if (field.type === 'blocks' && Array.isArray(value)) {\n return value.map((row) => {\n const rowData = asDocument(row)\n const block = field.blocks.find(\n (candidate) => candidate.slug === getStringValue(rowData.blockType),\n )\n\n return duplicateRowValue(rowData, block?.fields || [])\n })\n }\n\n return value\n}\n\nconst duplicateRowValue = (\n row: Record<string, unknown>,\n fields: Field[],\n): Record<string, unknown> => {\n const data = Object.entries(row).reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n if (key !== 'id') {\n acc[key] = value\n }\n\n return acc\n },\n {},\n )\n\n for (const field of fields) {\n if (!fieldAffectsData(field) || !(field.name in data)) {\n continue\n }\n\n data[field.name] = duplicateFieldValue(field, data[field.name])\n }\n\n return data\n}\n\nexport const duplicateDocumentData = ({\n collection,\n doc,\n fieldNames,\n targetLanguage,\n}: {\n collection: CollectionConfig\n doc: DocumentData\n fieldNames: MultilangFieldNames\n targetLanguage: string\n}): DocumentData => {\n const excluded = new Set([\n fieldNames.group,\n fieldNames.language,\n fieldNames.meta,\n ...SYSTEM_DUPLICATION_EXCLUDED_FIELDS,\n ])\n\n const data: DocumentData = {}\n\n for (const field of collection.fields || []) {\n if (!fieldAffectsData(field) || excluded.has(field.name)) {\n continue\n }\n\n if (!(field.name in doc)) {\n continue\n }\n\n data[field.name] = duplicateFieldValue(field, doc[field.name])\n }\n\n if (typeof data.slug === 'string' && data.slug.length > 0) {\n data.slug = `${data.slug}-${targetLanguage}`\n }\n\n return data\n}\n\nexport type PayloadFactory = () => Payload | Promise<Payload>\n\nexport type GetDocumentTranslationsArgs = {\n collection: CollectionSlug\n fieldNames?: MultilangFieldNames\n id: number | string\n overrideAccess?: boolean\n req?: PayloadRequest\n}\n\nexport type GetDocumentTranslationArgs = {\n language: string\n} & GetDocumentTranslationsArgs\n\nexport type FindGlobalByLanguageArgs = {\n depth?: number\n language: string\n overrideAccess?: boolean\n req?: PayloadRequest\n slug: GlobalSlug\n}\n\nexport type UpdateGlobalByLanguageArgs = {\n data: Record<string, unknown>\n} & FindGlobalByLanguageArgs\n\nexport type MultilangHelpers = {\n findGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(\n args: FindGlobalByLanguageArgs,\n ) => Promise<TDoc>\n getDocumentTranslation: <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationArgs,\n ) => Promise<TDoc | undefined>\n getDocumentTranslations: <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationsArgs,\n ) => Promise<TranslationState<TDoc>>\n getLanguages: () => Promise<MultilangLanguage[]>\n updateGlobalByLanguage: <TDoc extends DocumentData = DocumentData>(\n args: UpdateGlobalByLanguageArgs,\n ) => Promise<TDoc>\n}\n\nexport const createMultilangHelpers = ({\n getPayload,\n}: {\n getPayload: PayloadFactory\n}): MultilangHelpers => {\n const resolvePayload = async () => getPayload()\n\n return {\n findGlobalByLanguage: async <TDoc extends DocumentData = DocumentData>({\n slug,\n depth,\n language,\n overrideAccess,\n req,\n }: FindGlobalByLanguageArgs): Promise<TDoc> =>\n findGlobalByLanguageWithPayload<TDoc>({\n slug,\n depth,\n language,\n overrideAccess,\n payload: await resolvePayload(),\n req,\n }),\n\n getDocumentTranslation: async <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationArgs,\n ): Promise<TDoc | undefined> =>\n getDocumentTranslationWithPayload<TDoc>({\n ...args,\n payload: await resolvePayload(),\n }),\n\n getDocumentTranslations: async <TDoc extends DocumentData = DocumentData>(\n args: GetDocumentTranslationsArgs,\n ): Promise<TranslationState<TDoc>> =>\n getDocumentTranslationsWithPayload<TDoc>({\n ...args,\n payload: await resolvePayload(),\n }),\n\n getLanguages: async (): Promise<MultilangLanguage[]> =>\n getLanguages({ payload: await resolvePayload() }),\n\n updateGlobalByLanguage: async <TDoc extends DocumentData = DocumentData>({\n slug,\n data,\n depth,\n language,\n overrideAccess,\n req,\n }: UpdateGlobalByLanguageArgs): Promise<TDoc> =>\n updateGlobalByLanguageWithPayload<TDoc>({\n slug,\n data,\n depth,\n language,\n overrideAccess,\n payload: await resolvePayload(),\n req,\n }),\n }\n}\n"],"names":["DEFAULT_FIELD_NAMES","SYSTEM_DUPLICATION_EXCLUDED_FIELDS","asDocument","value","getStringValue","length","undefined","getID","normalizeLanguage","doc","data","code","trim","toLowerCase","id","name","active","direction","flagLabel","isDefault","locale","order","getLanguagesFromCustom","custom","payloadMultilang","languages","Array","isArray","map","filter","language","getLanguages","config","payload","admin","Error","getDefaultLanguage","configuredLanguages","find","withLanguage","fieldName","where","languageWhere","equals","and","getMultilangDocumentLanguage","fallback","localizedSlugQuery","slug","slugFieldName","status","constraints","unshift","push","_status","draft","getDocumentTranslationsWithPayload","collection","fieldNames","overrideAccess","req","source","findByID","depth","group","translations","result","limit","docs","reduce","acc","translation","getGroupTranslationsWithPayload","getDocumentTranslationWithPayload","state","GLOBAL_SYSTEM_FIELDS","Set","getGlobalPayloadMultilangCustom","global","globals","item","validateGlobalLanguage","some","candidate","getGlobalLanguageTab","languageData","systemData","Object","entries","key","has","findGlobalByLanguageWithPayload","findGlobal","updateGlobalByLanguageWithPayload","currentDoc","currentLanguageData","updateGlobal","fieldAffectsData","field","type","duplicateFieldValue","row","duplicateRowValue","fields","rowData","block","blocks","blockType","duplicateDocumentData","targetLanguage","excluded","meta","createMultilangHelpers","getPayload","resolvePayload","findGlobalByLanguage","getDocumentTranslation","args","getDocumentTranslations","updateGlobalByLanguage"],"mappings":"AAkBA,SAASA,mBAAmB,EAAEC,kCAAkC,QAAQ,kBAAiB;AAMzF,OAAO,MAAMC,aAAa,CAACC,QACzBA,SAAS,OAAOA,UAAU,WAAYA,QAAyB,CAAC,EAAC;AAEnE,OAAO,MAAMC,iBAAiB,CAACD,QAC7B,OAAOA,UAAU,YAAYA,MAAME,MAAM,GAAG,IAAIF,QAAQG,UAAS;AAEnE,OAAO,MAAMC,QAAQ,CAACJ,QACpB,OAAOA,UAAU,YAAY,OAAOA,UAAU,WAAWA,QAAQG,UAAS;AAE5E,OAAO,MAAME,oBAAoB,CAACC;IAChC,MAAMC,OAAOR,WAAWO;IACxB,MAAME,OAAOP,eAAeM,KAAKC,IAAI,GAAGC,OAAOC,iBAAiB;IAEhE,OAAO;QACLC,IAAIP,MAAMG,KAAKI,EAAE;QACjBC,MAAMX,eAAeM,KAAKK,IAAI,GAAGH,UAAUD;QAC3CK,QAAQN,KAAKM,MAAM,KAAK;QACxBL;QACAM,WAAWP,KAAKO,SAAS,KAAK,QAAQ,QAAQ;QAC9CC,WAAWd,eAAeM,KAAKQ,SAAS;QACxCC,WAAWT,KAAKS,SAAS,KAAK;QAC9BC,QAAQhB,eAAeM,KAAKU,MAAM;QAClCC,OAAO,OAAOX,KAAKW,KAAK,KAAK,WAAWX,KAAKW,KAAK,GAAG;IACvD;AACF,EAAC;AAID,OAAO,MAAMC,yBAAyB,CAACC;IACrC,MAAMC,mBAAmBtB,WAAWA,WAAWqB,QAAQC,gBAAgB;IACvE,MAAMC,YAAYD,iBAAiBC,SAAS;IAE5C,IAAI,CAACC,MAAMC,OAAO,CAACF,YAAY;QAC7B,OAAO,EAAE;IACX;IAEA,OAAOA,UAAUG,GAAG,CAACpB,mBAAmBqB,MAAM,CAAC,CAACC,WAAaA,SAASnB,IAAI;AAC5E,EAAC;AAED;;CAEC,GACD,OAAO,MAAMoB,eAAe,CAAC,EAC3BC,MAAM,EACNP,SAAS,EACTQ,OAAO,EAKR,GAAG,CAAC,CAAC;IACJ,IAAIR,WAAW;QACb,OAAOA,UAAUG,GAAG,CAACpB,mBAAmBqB,MAAM,CAAC,CAACC,WAAaA,SAASnB,IAAI;IAC5E;IAEA,IAAIsB,SAAS;QACX,OAAOX,uBAAuBW,QAAQD,MAAM,CAACE,KAAK,EAAEX;IACtD;IAEA,IAAIS,QAAQ;QACV,OAAOV,uBAAuBU,OAAOE,KAAK,EAAEX;IAC9C;IAEA,MAAM,IAAIY,MACR;AAEJ,EAAC;AAED,OAAO,MAAMC,qBAAqB,CAAC,EACjCJ,MAAM,EACNP,SAAS,EACTQ,OAAO,EAKR;IACC,MAAMI,sBAAsBN,aAAa;QAAEC;QAAQP;QAAWQ;IAAQ;IAEtE,OAAOI,oBAAoBC,IAAI,CAAC,CAACR,WAAaA,SAASX,SAAS,KAAKkB,mBAAmB,CAAC,EAAE;AAC7F,EAAC;AAED;;;;;CAKC,GACD,OAAO,MAAME,eAAe,CAAC,EAC3BC,YAAYxC,oBAAoB8B,QAAQ,EACxCA,QAAQ,EACRW,KAAK,EACY;IACjB,MAAMC,gBAAuB;QAC3B,CAACF,UAAU,EAAE;YACXG,QAAQb;QACV;IACF;IAEA,IAAI,CAACW,OAAO;QACV,OAAOC;IACT;IAEA,OAAO;QACLE,KAAK;YAACH;YAAOC;SAAc;IAC7B;AACF,EAAC;AASD;;;;;CAKC,GACD,OAAO,MAAMG,+BAA+B,CAAC,EAC3CnC,IAAI,EACJD,GAAG,EACHqC,QAAQ,EACRN,YAAYxC,oBAAoB8B,QAAQ,EACV,GAC9B1B,eAAeF,WAAWQ,KAAK,CAAC8B,UAAU,KAC1CpC,eAAeF,WAAWO,IAAI,CAAC+B,UAAU,KACzCM,SAAQ;AAkBV;;CAEC,GACD,OAAO,MAAMC,qBAAqB,CAAC,EACjCC,IAAI,EACJR,YAAYxC,oBAAoB8B,QAAQ,EACxCA,QAAQ,EACRmB,gBAAgB,MAAM,EACtBC,SAAS,WAAW,EACpBT,KAAK,EACkB;IACvB,MAAMU,cAAuB;QAC3B;YACE,CAACF,cAAc,EAAE;gBACfN,QAAQK;YACV;QACF;QACA;YACE,CAACR,UAAU,EAAE;gBACXG,QAAQb;YACV;QACF;KACD;IAED,IAAIW,OAAO;QACTU,YAAYC,OAAO,CAACX;IACtB;IAEA,IAAIS,WAAW,OAAO;QACpBC,YAAYE,IAAI,CAAC;YACfC,SAAS;gBACPX,QAAQO;YACV;QACF;IACF;IAEA,OAAO;QACL,GAAIA,WAAW,UAAU;YAAEK,OAAO;QAAK,IAAI,CAAC,CAAC;QAC7Cd,OACEU,YAAY9C,MAAM,KAAK,IACnB8C,WAAW,CAAC,EAAE,GACd;YACEP,KAAKO;QACP;IACR;AACF,EAAC;AAED,OAAO,MAAMK,qCAAqC,OAAiD,EACjG1C,EAAE,EACF2C,UAAU,EACVC,aAAa1D,mBAAmB,EAChC2D,iBAAiB,IAAI,EACrB1B,OAAO,EACP2B,GAAG,EAQJ;IACC,MAAMC,SAAS3D,WACb,MAAM+B,QAAQ6B,QAAQ,CAAC;QACrBhD;QACA2C;QACAM,OAAO;QACPJ;QACAC;IACF;IAGF,MAAMI,QAAQ5D,eAAeyD,MAAM,CAACH,WAAWM,KAAK,CAAC;IACrD,MAAMlC,WAAW1B,eAAeyD,MAAM,CAACH,WAAW5B,QAAQ,CAAC;IAE3D,IAAI,CAACkC,OAAO;QACV,OAAO;YACLlC;YACA+B;YACAI,cAAcnC,WAAW;gBAAE,CAACA,SAAS,EAAE+B;YAAO,IAAI,CAAC;QACrD;IACF;IAEA,MAAMK,SAAS,MAAMjC,QAAQK,IAAI,CAAC;QAChCmB;QACAM,OAAO;QACPI,OAAO;QACPR;QACAC;QACAnB,OAAO;YACL,CAACiB,WAAWM,KAAK,CAAC,EAAE;gBAClBrB,QAAQqB;YACV;QACF;IACF;IAEA,MAAMC,eAAeC,OAAOE,IAAI,CAACC,MAAM,CAAyC,CAACC,KAAK7D;QACpF,MAAM8D,cAAcrE,WAAWO;QAC/B,MAAME,OAAOP,eAAemE,WAAW,CAACb,WAAW5B,QAAQ,CAAC;QAE5D,IAAInB,MAAM;YACR2D,GAAG,CAAC3D,KAAK,GAAG4D;QACd;QAEA,OAAOD;IACT,GAAG,CAAC;IAEJ,OAAO;QACLN;QACAlC;QACA+B;QACAI;IACF;AACF,EAAC;AAED,OAAO,MAAMO,kCAAkC,OAAiD,EAC9Ff,UAAU,EACVC,aAAa1D,mBAAmB,EAChCgE,KAAK,EACLL,iBAAiB,IAAI,EACrB1B,OAAO,EACP2B,GAAG,EAQJ;IACC,MAAMM,SAAS,MAAMjC,QAAQK,IAAI,CAAC;QAChCmB;QACAM,OAAO;QACPI,OAAO;QACPR;QACAC;QACAnB,OAAO;YACL,CAACiB,WAAWM,KAAK,CAAC,EAAE;gBAClBrB,QAAQqB;YACV;QACF;IACF;IAEA,MAAMC,eAAeC,OAAOE,IAAI,CAACC,MAAM,CAAyC,CAACC,KAAK7D;QACpF,MAAM8D,cAAcrE,WAAWO;QAC/B,MAAME,OAAOP,eAAemE,WAAW,CAACb,WAAW5B,QAAQ,CAAC;QAE5D,IAAInB,MAAM;YACR2D,GAAG,CAAC3D,KAAK,GAAG4D;QACd;QAEA,OAAOD;IACT,GAAG,CAAC;IAEJ,OAAO;QACLN;QACAC;IACF;AACF,EAAC;AAED;;CAEC,GACD,OAAO,MAAMQ,oCAAoC,OAAiD,EAChG3D,EAAE,EACF2C,UAAU,EACVC,UAAU,EACV5B,QAAQ,EACR6B,iBAAiB,IAAI,EACrB1B,OAAO,EACP2B,GAAG,EASJ;IACC,MAAMc,QAAQ,MAAMlB,mCAAyC;QAC3D1C;QACA2C;QACAC;QACAC;QACA1B;QACA2B;IACF;IAEA,OAAOc,MAAMT,YAAY,CAACnC,SAAS;AACrC,EAAC;AAED,MAAM6C,uBAAuB,IAAIC,IAAI;IAAC;IAAW;IAAa;IAAc;IAAM;CAAY;AAE9F,MAAMC,kCAAkC,CAAC,EACvC7B,IAAI,EACJf,OAAO,EAIR;IAIC,MAAM6C,SAAS7C,QAAQD,MAAM,CAAC+C,OAAO,CAACzC,IAAI,CAAC,CAAC0C,OAASA,KAAKhC,IAAI,KAAKA;IACnE,MAAMxB,mBAAmBtB,WAAWA,WAAW4E,QAAQ5C,OAAOX,QAAQC,gBAAgB;IAEtF,OAAOA;AAIT;AAEA,MAAMyD,yBAAyB,CAAC,EAC9BjC,IAAI,EACJlB,QAAQ,EACRG,OAAO,EAKR;IACC,MAAMR,YAAYoD,gCAAgC;QAAE7B;QAAMf;IAAQ,GAAGR,SAAS;IAE9E,IAAI,CAACC,MAAMC,OAAO,CAACF,cAAcA,UAAUpB,MAAM,KAAK,GAAG;QACvD;IACF;IAEA,IAAI,CAACoB,UAAUyD,IAAI,CAAC,CAACC,YAAcA,UAAUxE,IAAI,KAAKmB,WAAW;QAC/D,MAAM,IAAIK,MAAM,CAAC,UAAU,EAAEL,SAAS,wBAAwB,EAAEkB,KAAK,CAAC,CAAC;IACzE;AACF;AAEA,MAAMoC,uBAAuB,CAA2C,EACtE3E,GAAG,EACHqB,QAAQ,EAIT;IACC,MAAMuD,eAAenF,WAAWO,GAAG,CAACqB,SAAS;IAC7C,MAAMwD,aAAaC,OAAOC,OAAO,CAAC/E,KAAK4D,MAAM,CAAe,CAACC,KAAK,CAACmB,KAAKtF,MAAM;QAC5E,IAAIwE,qBAAqBe,GAAG,CAACD,MAAM;YACjCnB,GAAG,CAACmB,IAAI,GAAGtF;QACb;QAEA,OAAOmE;IACT,GAAG,CAAC;IAEJ,OAAO;QACL,GAAGgB,UAAU;QACb,GAAGD,YAAY;IACjB;AACF;AAEA,OAAO,MAAMM,kCAAkC,OAAiD,EAC9F3C,IAAI,EACJe,KAAK,EACLjC,QAAQ,EACR6B,iBAAiB,IAAI,EACrB1B,OAAO,EACP2B,GAAG,EAQJ;IACCqB,uBAAuB;QAAEjC;QAAMlB;QAAUG;IAAQ;IAEjD,MAAMxB,MAAMP,WACV,MAAM+B,QAAQ2D,UAAU,CAAC;QACvB5C;QACAe;QACAJ;QACAC;IACF;IAGF,OAAOwB,qBAA2B;QAChC3E;QACAqB;IACF;AACF,EAAC;AAED,OAAO,MAAM+D,oCAAoC,OAAiD,EAChG7C,IAAI,EACJtC,IAAI,EACJqD,KAAK,EACLjC,QAAQ,EACR6B,iBAAiB,IAAI,EACrB1B,OAAO,EACP2B,GAAG,EASJ;IACCqB,uBAAuB;QAAEjC;QAAMlB;QAAUG;IAAQ;IAEjD,MAAM6D,aAAa5F,WACjB,MAAM+B,QAAQ2D,UAAU,CAAC;QACvB5C;QACAe,OAAO;QACPJ;QACAC;IACF;IAEF,MAAMmC,sBAAsB7F,WAAW4F,UAAU,CAAChE,SAAS;IAE3D,MAAMrB,MAAMP,WACV,MAAM+B,QAAQ+D,YAAY,CAAC;QACzBhD;QACAtC,MAAM;YACJ,CAACoB,SAAS,EAAE;gBACV,GAAGiE,mBAAmB;gBACtB,GAAGrF,IAAI;YACT;QACF;QACAqD;QACAJ;QACAC;IACF;IAGF,OAAOwB,qBAA2B;QAChC3E;QACAqB;IACF;AACF,EAAC;AAED,MAAMmE,mBAAmB,CAACC,QACxB,UAAUA,SAAS,OAAOA,MAAMnF,IAAI,KAAK,YAAYmF,MAAMC,IAAI,KAAK;AAEtE,MAAMC,sBAAsB,CAACF,OAAc/F;IACzC,IAAI+F,MAAMC,IAAI,KAAK,WAAWzE,MAAMC,OAAO,CAACxB,QAAQ;QAClD,OAAOA,MAAMyB,GAAG,CAAC,CAACyE,MAChBC,kBAAkBpG,WAAWmG,MAAMH,MAAMK,MAAM;IAEnD;IAEA,IAAIL,MAAMC,IAAI,KAAK,YAAYzE,MAAMC,OAAO,CAACxB,QAAQ;QACnD,OAAOA,MAAMyB,GAAG,CAAC,CAACyE;YAChB,MAAMG,UAAUtG,WAAWmG;YAC3B,MAAMI,QAAQP,MAAMQ,MAAM,CAACpE,IAAI,CAC7B,CAAC6C,YAAcA,UAAUnC,IAAI,KAAK5C,eAAeoG,QAAQG,SAAS;YAGpE,OAAOL,kBAAkBE,SAASC,OAAOF,UAAU,EAAE;QACvD;IACF;IAEA,OAAOpG;AACT;AAEA,MAAMmG,oBAAoB,CACxBD,KACAE;IAEA,MAAM7F,OAAO6E,OAAOC,OAAO,CAACa,KAAKhC,MAAM,CACrC,CAACC,KAAK,CAACmB,KAAKtF,MAAM;QAChB,IAAIsF,QAAQ,MAAM;YAChBnB,GAAG,CAACmB,IAAI,GAAGtF;QACb;QAEA,OAAOmE;IACT,GACA,CAAC;IAGH,KAAK,MAAM4B,SAASK,OAAQ;QAC1B,IAAI,CAACN,iBAAiBC,UAAU,CAAEA,CAAAA,MAAMnF,IAAI,IAAIL,IAAG,GAAI;YACrD;QACF;QAEAA,IAAI,CAACwF,MAAMnF,IAAI,CAAC,GAAGqF,oBAAoBF,OAAOxF,IAAI,CAACwF,MAAMnF,IAAI,CAAC;IAChE;IAEA,OAAOL;AACT;AAEA,OAAO,MAAMkG,wBAAwB,CAAC,EACpCnD,UAAU,EACVhD,GAAG,EACHiD,UAAU,EACVmD,cAAc,EAMf;IACC,MAAMC,WAAW,IAAIlC,IAAI;QACvBlB,WAAWM,KAAK;QAChBN,WAAW5B,QAAQ;QACnB4B,WAAWqD,IAAI;WACZ9G;KACJ;IAED,MAAMS,OAAqB,CAAC;IAE5B,KAAK,MAAMwF,SAASzC,WAAW8C,MAAM,IAAI,EAAE,CAAE;QAC3C,IAAI,CAACN,iBAAiBC,UAAUY,SAASpB,GAAG,CAACQ,MAAMnF,IAAI,GAAG;YACxD;QACF;QAEA,IAAI,CAAEmF,CAAAA,MAAMnF,IAAI,IAAIN,GAAE,GAAI;YACxB;QACF;QAEAC,IAAI,CAACwF,MAAMnF,IAAI,CAAC,GAAGqF,oBAAoBF,OAAOzF,GAAG,CAACyF,MAAMnF,IAAI,CAAC;IAC/D;IAEA,IAAI,OAAOL,KAAKsC,IAAI,KAAK,YAAYtC,KAAKsC,IAAI,CAAC3C,MAAM,GAAG,GAAG;QACzDK,KAAKsC,IAAI,GAAG,GAAGtC,KAAKsC,IAAI,CAAC,CAAC,EAAE6D,gBAAgB;IAC9C;IAEA,OAAOnG;AACT,EAAC;AA4CD,OAAO,MAAMsG,yBAAyB,CAAC,EACrCC,UAAU,EAGX;IACC,MAAMC,iBAAiB,UAAYD;IAEnC,OAAO;QACLE,sBAAsB,OAAiD,EACrEnE,IAAI,EACJe,KAAK,EACLjC,QAAQ,EACR6B,cAAc,EACdC,GAAG,EACsB,GACzB+B,gCAAsC;gBACpC3C;gBACAe;gBACAjC;gBACA6B;gBACA1B,SAAS,MAAMiF;gBACftD;YACF;QAEFwD,wBAAwB,OACtBC,OAEA5C,kCAAwC;gBACtC,GAAG4C,IAAI;gBACPpF,SAAS,MAAMiF;YACjB;QAEFI,yBAAyB,OACvBD,OAEA7D,mCAAyC;gBACvC,GAAG6D,IAAI;gBACPpF,SAAS,MAAMiF;YACjB;QAEFnF,cAAc,UACZA,aAAa;gBAAEE,SAAS,MAAMiF;YAAiB;QAEjDK,wBAAwB,OAAiD,EACvEvE,IAAI,EACJtC,IAAI,EACJqD,KAAK,EACLjC,QAAQ,EACR6B,cAAc,EACdC,GAAG,EACwB,GAC3BiC,kCAAwC;gBACtC7C;gBACAtC;gBACAqD;gBACAjC;gBACA6B;gBACA1B,SAAS,MAAMiF;gBACftD;YACF;IACJ;AACF,EAAC"}
@@ -0,0 +1,72 @@
1
+ export declare const payloadMultilangTranslations: {
2
+ readonly en: {
3
+ readonly payloadMultilang: {
4
+ readonly allLanguages: "All languages";
5
+ readonly chooseLanguage: "Choose language";
6
+ readonly chooseTargetLanguage: "Choose a target language.";
7
+ readonly connectExisting: "Connect existing";
8
+ readonly createOrConnectDocuments: "Create or connect separate localized documents.";
9
+ readonly createTranslation: "Create translation";
10
+ readonly createTranslationFor: "Create {{language}} translation";
11
+ readonly current: "Current";
12
+ readonly disconnectDocument: "Disconnect this document";
13
+ readonly documentID: "Document ID";
14
+ readonly editTranslationFor: "Edit {{language}} translation";
15
+ readonly existingDocumentID: "Existing document ID";
16
+ readonly language: "Language";
17
+ readonly linkedDocuments: "Linked documents";
18
+ readonly localized: "Localized";
19
+ readonly localizedContent: "Localized content";
20
+ readonly missing: "Missing";
21
+ readonly saveBeforeAddingTranslations: "Save before adding translations.";
22
+ readonly saveBeforeCreatingTranslations: "Save the document before creating translations.";
23
+ readonly saveBeforeManagingTranslations: "Save the document before managing translations.";
24
+ readonly targetIDAndLanguageRequired: "Target ID and language are required.";
25
+ readonly translationActions: "Translation actions";
26
+ readonly translationConnected: "Translation connected.";
27
+ readonly translationCouldNotBeConnected: "Translation could not be connected.";
28
+ readonly translationCouldNotBeCreated: "Translation could not be created.";
29
+ readonly translationCouldNotBeDisconnected: "Translation could not be disconnected.";
30
+ readonly translationDisconnected: "Translation disconnected.";
31
+ readonly translations: "Translations";
32
+ readonly unassigned: "Unassigned";
33
+ readonly unassignedStoredLanguageNotConfigured: "Unassigned; stored language \"{{language}}\" is not configured";
34
+ };
35
+ };
36
+ readonly uk: {
37
+ readonly payloadMultilang: {
38
+ readonly allLanguages: "Усі мови";
39
+ readonly chooseLanguage: "Оберіть мову";
40
+ readonly chooseTargetLanguage: "Оберіть цільову мову.";
41
+ readonly connectExisting: "Підключити наявний";
42
+ readonly createOrConnectDocuments: "Створюйте або підключайте окремі локалізовані документи.";
43
+ readonly createTranslation: "Створити переклад";
44
+ readonly createTranslationFor: "Створити переклад: {{language}}";
45
+ readonly current: "Поточний";
46
+ readonly disconnectDocument: "Від’єднати цей документ";
47
+ readonly documentID: "ID документа";
48
+ readonly editTranslationFor: "Редагувати переклад: {{language}}";
49
+ readonly existingDocumentID: "ID наявного документа";
50
+ readonly language: "Мова";
51
+ readonly linkedDocuments: "Пов’язані документи";
52
+ readonly localized: "Локалізовано";
53
+ readonly localizedContent: "Локалізований вміст";
54
+ readonly missing: "Відсутній";
55
+ readonly saveBeforeAddingTranslations: "Збережіть перед додаванням перекладів.";
56
+ readonly saveBeforeCreatingTranslations: "Збережіть документ перед створенням перекладів.";
57
+ readonly saveBeforeManagingTranslations: "Збережіть документ перед керуванням перекладами.";
58
+ readonly targetIDAndLanguageRequired: "Потрібні ID цільового документа та мова.";
59
+ readonly translationActions: "Дії з перекладами";
60
+ readonly translationConnected: "Переклад підключено.";
61
+ readonly translationCouldNotBeConnected: "Не вдалося підключити переклад.";
62
+ readonly translationCouldNotBeCreated: "Не вдалося створити переклад.";
63
+ readonly translationCouldNotBeDisconnected: "Не вдалося від’єднати переклад.";
64
+ readonly translationDisconnected: "Переклад від’єднано.";
65
+ readonly translations: "Переклади";
66
+ readonly unassigned: "Не призначено";
67
+ readonly unassignedStoredLanguageNotConfigured: "Не призначено; збережена мова \"{{language}}\" не налаштована";
68
+ };
69
+ };
70
+ };
71
+ export type PayloadMultilangTranslations = (typeof payloadMultilangTranslations)['en'];
72
+ export type PayloadMultilangTranslationKey = `payloadMultilang:${keyof PayloadMultilangTranslations['payloadMultilang']}`;
@@ -0,0 +1,72 @@
1
+ export const payloadMultilangTranslations = {
2
+ en: {
3
+ payloadMultilang: {
4
+ allLanguages: 'All languages',
5
+ chooseLanguage: 'Choose language',
6
+ chooseTargetLanguage: 'Choose a target language.',
7
+ connectExisting: 'Connect existing',
8
+ createOrConnectDocuments: 'Create or connect separate localized documents.',
9
+ createTranslation: 'Create translation',
10
+ createTranslationFor: 'Create {{language}} translation',
11
+ current: 'Current',
12
+ disconnectDocument: 'Disconnect this document',
13
+ documentID: 'Document ID',
14
+ editTranslationFor: 'Edit {{language}} translation',
15
+ existingDocumentID: 'Existing document ID',
16
+ language: 'Language',
17
+ linkedDocuments: 'Linked documents',
18
+ localized: 'Localized',
19
+ localizedContent: 'Localized content',
20
+ missing: 'Missing',
21
+ saveBeforeAddingTranslations: 'Save before adding translations.',
22
+ saveBeforeCreatingTranslations: 'Save the document before creating translations.',
23
+ saveBeforeManagingTranslations: 'Save the document before managing translations.',
24
+ targetIDAndLanguageRequired: 'Target ID and language are required.',
25
+ translationActions: 'Translation actions',
26
+ translationConnected: 'Translation connected.',
27
+ translationCouldNotBeConnected: 'Translation could not be connected.',
28
+ translationCouldNotBeCreated: 'Translation could not be created.',
29
+ translationCouldNotBeDisconnected: 'Translation could not be disconnected.',
30
+ translationDisconnected: 'Translation disconnected.',
31
+ translations: 'Translations',
32
+ unassigned: 'Unassigned',
33
+ unassignedStoredLanguageNotConfigured: 'Unassigned; stored language "{{language}}" is not configured'
34
+ }
35
+ },
36
+ uk: {
37
+ payloadMultilang: {
38
+ allLanguages: 'Усі мови',
39
+ chooseLanguage: 'Оберіть мову',
40
+ chooseTargetLanguage: 'Оберіть цільову мову.',
41
+ connectExisting: 'Підключити наявний',
42
+ createOrConnectDocuments: 'Створюйте або підключайте окремі локалізовані документи.',
43
+ createTranslation: 'Створити переклад',
44
+ createTranslationFor: 'Створити переклад: {{language}}',
45
+ current: 'Поточний',
46
+ disconnectDocument: 'Від’єднати цей документ',
47
+ documentID: 'ID документа',
48
+ editTranslationFor: 'Редагувати переклад: {{language}}',
49
+ existingDocumentID: 'ID наявного документа',
50
+ language: 'Мова',
51
+ linkedDocuments: 'Пов’язані документи',
52
+ localized: 'Локалізовано',
53
+ localizedContent: 'Локалізований вміст',
54
+ missing: 'Відсутній',
55
+ saveBeforeAddingTranslations: 'Збережіть перед додаванням перекладів.',
56
+ saveBeforeCreatingTranslations: 'Збережіть документ перед створенням перекладів.',
57
+ saveBeforeManagingTranslations: 'Збережіть документ перед керуванням перекладами.',
58
+ targetIDAndLanguageRequired: 'Потрібні ID цільового документа та мова.',
59
+ translationActions: 'Дії з перекладами',
60
+ translationConnected: 'Переклад підключено.',
61
+ translationCouldNotBeConnected: 'Не вдалося підключити переклад.',
62
+ translationCouldNotBeCreated: 'Не вдалося створити переклад.',
63
+ translationCouldNotBeDisconnected: 'Не вдалося від’єднати переклад.',
64
+ translationDisconnected: 'Переклад від’єднано.',
65
+ translations: 'Переклади',
66
+ unassigned: 'Не призначено',
67
+ unassignedStoredLanguageNotConfigured: 'Не призначено; збережена мова "{{language}}" не налаштована'
68
+ }
69
+ }
70
+ };
71
+
72
+ //# sourceMappingURL=translations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/translations.ts"],"sourcesContent":["export const payloadMultilangTranslations = {\n en: {\n payloadMultilang: {\n allLanguages: 'All languages',\n chooseLanguage: 'Choose language',\n chooseTargetLanguage: 'Choose a target language.',\n connectExisting: 'Connect existing',\n createOrConnectDocuments: 'Create or connect separate localized documents.',\n createTranslation: 'Create translation',\n createTranslationFor: 'Create {{language}} translation',\n current: 'Current',\n disconnectDocument: 'Disconnect this document',\n documentID: 'Document ID',\n editTranslationFor: 'Edit {{language}} translation',\n existingDocumentID: 'Existing document ID',\n language: 'Language',\n linkedDocuments: 'Linked documents',\n localized: 'Localized',\n localizedContent: 'Localized content',\n missing: 'Missing',\n saveBeforeAddingTranslations: 'Save before adding translations.',\n saveBeforeCreatingTranslations: 'Save the document before creating translations.',\n saveBeforeManagingTranslations: 'Save the document before managing translations.',\n targetIDAndLanguageRequired: 'Target ID and language are required.',\n translationActions: 'Translation actions',\n translationConnected: 'Translation connected.',\n translationCouldNotBeConnected: 'Translation could not be connected.',\n translationCouldNotBeCreated: 'Translation could not be created.',\n translationCouldNotBeDisconnected: 'Translation could not be disconnected.',\n translationDisconnected: 'Translation disconnected.',\n translations: 'Translations',\n unassigned: 'Unassigned',\n unassignedStoredLanguageNotConfigured:\n 'Unassigned; stored language \"{{language}}\" is not configured',\n },\n },\n uk: {\n payloadMultilang: {\n allLanguages: 'Усі мови',\n chooseLanguage: 'Оберіть мову',\n chooseTargetLanguage: 'Оберіть цільову мову.',\n connectExisting: 'Підключити наявний',\n createOrConnectDocuments: 'Створюйте або підключайте окремі локалізовані документи.',\n createTranslation: 'Створити переклад',\n createTranslationFor: 'Створити переклад: {{language}}',\n current: 'Поточний',\n disconnectDocument: 'Від’єднати цей документ',\n documentID: 'ID документа',\n editTranslationFor: 'Редагувати переклад: {{language}}',\n existingDocumentID: 'ID наявного документа',\n language: 'Мова',\n linkedDocuments: 'Пов’язані документи',\n localized: 'Локалізовано',\n localizedContent: 'Локалізований вміст',\n missing: 'Відсутній',\n saveBeforeAddingTranslations: 'Збережіть перед додаванням перекладів.',\n saveBeforeCreatingTranslations: 'Збережіть документ перед створенням перекладів.',\n saveBeforeManagingTranslations: 'Збережіть документ перед керуванням перекладами.',\n targetIDAndLanguageRequired: 'Потрібні ID цільового документа та мова.',\n translationActions: 'Дії з перекладами',\n translationConnected: 'Переклад підключено.',\n translationCouldNotBeConnected: 'Не вдалося підключити переклад.',\n translationCouldNotBeCreated: 'Не вдалося створити переклад.',\n translationCouldNotBeDisconnected: 'Не вдалося від’єднати переклад.',\n translationDisconnected: 'Переклад від’єднано.',\n translations: 'Переклади',\n unassigned: 'Не призначено',\n unassignedStoredLanguageNotConfigured:\n 'Не призначено; збережена мова \"{{language}}\" не налаштована',\n },\n },\n} as const\n\nexport type PayloadMultilangTranslations =\n (typeof payloadMultilangTranslations)['en']\n\nexport type PayloadMultilangTranslationKey =\n `payloadMultilang:${keyof PayloadMultilangTranslations['payloadMultilang']}`\n"],"names":["payloadMultilangTranslations","en","payloadMultilang","allLanguages","chooseLanguage","chooseTargetLanguage","connectExisting","createOrConnectDocuments","createTranslation","createTranslationFor","current","disconnectDocument","documentID","editTranslationFor","existingDocumentID","language","linkedDocuments","localized","localizedContent","missing","saveBeforeAddingTranslations","saveBeforeCreatingTranslations","saveBeforeManagingTranslations","targetIDAndLanguageRequired","translationActions","translationConnected","translationCouldNotBeConnected","translationCouldNotBeCreated","translationCouldNotBeDisconnected","translationDisconnected","translations","unassigned","unassignedStoredLanguageNotConfigured","uk"],"mappings":"AAAA,OAAO,MAAMA,+BAA+B;IAC1CC,IAAI;QACFC,kBAAkB;YAChBC,cAAc;YACdC,gBAAgB;YAChBC,sBAAsB;YACtBC,iBAAiB;YACjBC,0BAA0B;YAC1BC,mBAAmB;YACnBC,sBAAsB;YACtBC,SAAS;YACTC,oBAAoB;YACpBC,YAAY;YACZC,oBAAoB;YACpBC,oBAAoB;YACpBC,UAAU;YACVC,iBAAiB;YACjBC,WAAW;YACXC,kBAAkB;YAClBC,SAAS;YACTC,8BAA8B;YAC9BC,gCAAgC;YAChCC,gCAAgC;YAChCC,6BAA6B;YAC7BC,oBAAoB;YACpBC,sBAAsB;YACtBC,gCAAgC;YAChCC,8BAA8B;YAC9BC,mCAAmC;YACnCC,yBAAyB;YACzBC,cAAc;YACdC,YAAY;YACZC,uCACE;QACJ;IACF;IACAC,IAAI;QACF/B,kBAAkB;YAChBC,cAAc;YACdC,gBAAgB;YAChBC,sBAAsB;YACtBC,iBAAiB;YACjBC,0BAA0B;YAC1BC,mBAAmB;YACnBC,sBAAsB;YACtBC,SAAS;YACTC,oBAAoB;YACpBC,YAAY;YACZC,oBAAoB;YACpBC,oBAAoB;YACpBC,UAAU;YACVC,iBAAiB;YACjBC,WAAW;YACXC,kBAAkB;YAClBC,SAAS;YACTC,8BAA8B;YAC9BC,gCAAgC;YAChCC,gCAAgC;YAChCC,6BAA6B;YAC7BC,oBAAoB;YACpBC,sBAAsB;YACtBC,gCAAgC;YAChCC,8BAA8B;YAC9BC,mCAAmC;YACnCC,yBAAyB;YACzBC,cAAc;YACdC,YAAY;YACZC,uCACE;QACJ;IACF;AACF,EAAU"}
package/dist/types.d.ts CHANGED
@@ -17,22 +17,10 @@ export type MultilangLanguage = {
17
17
  order?: number;
18
18
  };
19
19
  export type MultilangCollectionOptions = {
20
- /**
21
- * Set to false to create empty translation documents by default.
22
- */
23
- duplicate?: boolean;
24
- /**
25
- * Additional top-level document field names that should not be copied when creating a translation.
26
- */
27
- duplicateExcludeFields?: string[];
28
20
  /**
29
21
  * Override hidden metadata field names for this collection.
30
22
  */
31
23
  fields?: Partial<MultilangFieldNames>;
32
- /**
33
- * Top-level document field names that should share one value across every language in a translation group.
34
- */
35
- synchronizedFields?: string[];
36
24
  };
37
25
  export type MultilangGlobalOptions = {
38
26
  /**
@@ -49,10 +37,6 @@ export type PayloadMultilangConfig = {
49
37
  * Disable runtime UI/endpoints/hooks while keeping schema fields in place.
50
38
  */
51
39
  disabled?: boolean;
52
- /**
53
- * Global duplicate exclusions applied to all enabled collections.
54
- */
55
- duplicateExcludeFields?: string[];
56
40
  /**
57
41
  * Global hidden metadata field name overrides.
58
42
  */
@@ -69,12 +53,9 @@ export type PayloadMultilangConfig = {
69
53
  };
70
54
  export type ResolvedMultilangCollection = {
71
55
  defaultLanguage: MultilangLanguage;
72
- duplicate: boolean;
73
- duplicateExcludeFields: string[];
74
56
  fieldNames: MultilangFieldNames;
75
57
  languages: MultilangLanguage[];
76
58
  slug: string;
77
- synchronizedFields: string[];
78
59
  };
79
60
  export type ResolvedMultilangGlobal = {
80
61
  defaultLanguage: MultilangLanguage;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug, Where } from 'payload'\n\nexport type MultilangDirection = 'ltr' | 'rtl'\n\nexport type MultilangFieldNames = {\n group: string\n language: string\n meta: string\n}\n\nexport type MultilangLanguage = {\n active?: boolean\n code: string\n direction?: MultilangDirection\n flagLabel?: string\n id?: number | string\n isDefault?: boolean\n locale?: string\n name: string\n order?: number\n}\n\nexport type MultilangCollectionOptions = {\n /**\n * Set to false to create empty translation documents by default.\n */\n duplicate?: boolean\n /**\n * Additional top-level document field names that should not be copied when creating a translation.\n */\n duplicateExcludeFields?: string[]\n /**\n * Override hidden metadata field names for this collection.\n */\n fields?: Partial<MultilangFieldNames>\n /**\n * Top-level document field names that should share one value across every language in a translation group.\n */\n synchronizedFields?: string[]\n}\n\nexport type MultilangGlobalOptions = {\n /**\n * Override the top-level tabs field label used to group localized global fields.\n */\n label?: string\n}\n\nexport type PayloadMultilangConfig = {\n /**\n * Payload collections that should use Polylang-style document translations.\n */\n collections?: Partial<Record<CollectionSlug, MultilangCollectionOptions | true>>\n /**\n * Disable runtime UI/endpoints/hooks while keeping schema fields in place.\n */\n disabled?: boolean\n /**\n * Global duplicate exclusions applied to all enabled collections.\n */\n duplicateExcludeFields?: string[]\n /**\n * Global hidden metadata field name overrides.\n */\n fieldNames?: Partial<MultilangFieldNames>\n /**\n * Payload globals that should store language-specific values in one singleton document.\n */\n globals?: Partial<Record<GlobalSlug, MultilangGlobalOptions | true>>\n /**\n * Languages available to translated collections. Codes are normalized to\n * lowercase during plugin setup.\n */\n languages: MultilangLanguage[]\n}\n\nexport type ResolvedMultilangCollection = {\n defaultLanguage: MultilangLanguage\n duplicate: boolean\n duplicateExcludeFields: string[]\n fieldNames: MultilangFieldNames\n languages: MultilangLanguage[]\n slug: string\n synchronizedFields: string[]\n}\n\nexport type ResolvedMultilangGlobal = {\n defaultLanguage: MultilangLanguage\n label: string\n languages: MultilangLanguage[]\n slug: string\n}\n\nexport type TranslationMap<TDoc = Record<string, unknown>> = Record<string, TDoc>\n\nexport type TranslationState<TDoc = Record<string, unknown>> = {\n group?: string\n language?: string\n source?: TDoc\n translations: TranslationMap<TDoc>\n}\n\nexport type WithLanguageArgs = {\n fieldName?: string\n language: string\n where?: Where\n}\n"],"names":[],"mappings":"AAsGA,WAIC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { CollectionSlug, GlobalSlug, Where } from 'payload'\n\nexport type MultilangDirection = 'ltr' | 'rtl'\n\nexport type MultilangFieldNames = {\n group: string\n language: string\n meta: string\n}\n\nexport type MultilangLanguage = {\n active?: boolean\n code: string\n direction?: MultilangDirection\n flagLabel?: string\n id?: number | string\n isDefault?: boolean\n locale?: string\n name: string\n order?: number\n}\n\nexport type MultilangCollectionOptions = {\n /**\n * Override hidden metadata field names for this collection.\n */\n fields?: Partial<MultilangFieldNames>\n}\n\nexport type MultilangGlobalOptions = {\n /**\n * Override the top-level tabs field label used to group localized global fields.\n */\n label?: string\n}\n\nexport type PayloadMultilangConfig = {\n /**\n * Payload collections that should use Polylang-style document translations.\n */\n collections?: Partial<Record<CollectionSlug, MultilangCollectionOptions | true>>\n /**\n * Disable runtime UI/endpoints/hooks while keeping schema fields in place.\n */\n disabled?: boolean\n /**\n * Global hidden metadata field name overrides.\n */\n fieldNames?: Partial<MultilangFieldNames>\n /**\n * Payload globals that should store language-specific values in one singleton document.\n */\n globals?: Partial<Record<GlobalSlug, MultilangGlobalOptions | true>>\n /**\n * Languages available to translated collections. Codes are normalized to\n * lowercase during plugin setup.\n */\n languages: MultilangLanguage[]\n}\n\nexport type ResolvedMultilangCollection = {\n defaultLanguage: MultilangLanguage\n fieldNames: MultilangFieldNames\n languages: MultilangLanguage[]\n slug: string\n}\n\nexport type ResolvedMultilangGlobal = {\n defaultLanguage: MultilangLanguage\n label: string\n languages: MultilangLanguage[]\n slug: string\n}\n\nexport type TranslationMap<TDoc = Record<string, unknown>> = Record<string, TDoc>\n\nexport type TranslationState<TDoc = Record<string, unknown>> = {\n group?: string\n language?: string\n source?: TDoc\n translations: TranslationMap<TDoc>\n}\n\nexport type WithLanguageArgs = {\n fieldName?: string\n language: string\n where?: Where\n}\n"],"names":[],"mappings":"AAmFA,WAIC"}