diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index ad401c8cbb..39139fbf89 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -65,8 +65,11 @@ import type { } from './types/index.js' import type { TraverseFieldsCallback } from './utilities/traverseFields.js' export type * from './admin/types.js' +import type { SupportedLanguages } from '@payloadcms/translations' + import { Cron } from 'croner' +import type { ClientConfig } from './config/client.js' import type { TypeWithVersion } from './versions/types.js' import { decrypt, encrypt } from './auth/crypto.js' @@ -865,10 +868,12 @@ export const reload = async ( } await payload.db.init() + if (payload.db.connect) { await payload.db.connect({ hotReload: true }) } - global._payload_clientConfig = null + + global._payload_clientConfigs = {} as Record global._payload_schemaMap = null global._payload_clientSchemaMap = null global._payload_doNotCacheClientConfig = true // This will help refreshing the client config cache more reliably. If you remove this, please test HMR + client config refreshing (do new fields appear in the document?) diff --git a/packages/ui/src/utilities/getClientConfig.ts b/packages/ui/src/utilities/getClientConfig.ts index ae5629a868..4bf4c1b54b 100644 --- a/packages/ui/src/utilities/getClientConfig.ts +++ b/packages/ui/src/utilities/getClientConfig.ts @@ -1,31 +1,38 @@ -import type { I18nClient } from '@payloadcms/translations' +import type { I18nClient, SupportedLanguages } from '@payloadcms/translations' import type { ClientConfig, ImportMap, SanitizedConfig } from 'payload' import { createClientConfig } from 'payload' import { cache } from 'react' -let cachedClientConfig: ClientConfig | null = global._payload_clientConfig +let cachedClientConfigs = global._payload_clientConfigs as Record< + keyof SupportedLanguages, + ClientConfig +> -if (!cachedClientConfig) { - cachedClientConfig = global._payload_clientConfig = null +if (!cachedClientConfigs) { + cachedClientConfigs = global._payload_clientConfigs = {} as Record< + keyof SupportedLanguages, + ClientConfig + > } export const getClientConfig = cache( (args: { config: SanitizedConfig; i18n: I18nClient; importMap: ImportMap }): ClientConfig => { - if (cachedClientConfig && !global._payload_doNotCacheClientConfig) { - return cachedClientConfig + const { config, i18n, importMap } = args + const currentLanguage = i18n.language + + if (cachedClientConfigs[currentLanguage] && !global._payload_doNotCacheClientConfig) { + return cachedClientConfigs[currentLanguage] } - const { config, i18n, importMap } = args - - cachedClientConfig = createClientConfig({ + const cachedClientConfig = createClientConfig({ config, i18n, importMap, }) - global._payload_clientConfig = cachedClientConfig - + cachedClientConfigs[currentLanguage] = cachedClientConfig + global._payload_clientConfigs = cachedClientConfigs global._payload_doNotCacheClientConfig = false return cachedClientConfig diff --git a/test/i18n/e2e.spec.ts b/test/i18n/e2e.spec.ts index 8880a8ec05..a1b7587c52 100644 --- a/test/i18n/e2e.spec.ts +++ b/test/i18n/e2e.spec.ts @@ -82,4 +82,27 @@ describe('i18n', () => { page.locator('.componentWithCustomI18n .componentWithCustomI18nCustomValidI18nT'), ).toHaveText('My custom translation') }) + + test('ensure translations update correctly when switching language', async () => { + await page.goto(serverURL + '/admin/account') + + await page.locator('div.rs__control').click() + await page.locator('div.rs__option').filter({ hasText: 'English' }).click() + await expect(page.locator('div.payload-settings h3')).toHaveText('Payload Settings') + + await page.goto(serverURL + '/admin/collections/collection1/create') + await expect(page.locator('label[for="field-fieldDefaultI18nValid"]')).toHaveText( + 'Add {{label}}', + ) + + await page.goto(serverURL + '/admin/account') + await page.locator('div.rs__control').click() + await page.locator('div.rs__option').filter({ hasText: 'Español' }).click() + await expect(page.locator('div.payload-settings h3')).toHaveText('Configuración de la carga') + + await page.goto(serverURL + '/admin/collections/collection1/create') + await expect(page.locator('label[for="field-fieldDefaultI18nValid"]')).toHaveText( + 'Añadir {{label}}', + ) + }) })