diff --git a/app/live-preview/_components/CollectionArchive/PopulateByCollection/index.tsx b/app/live-preview/_components/CollectionArchive/PopulateByCollection/index.tsx index ac259e095..b2f4a8f22 100644 --- a/app/live-preview/_components/CollectionArchive/PopulateByCollection/index.tsx +++ b/app/live-preview/_components/CollectionArchive/PopulateByCollection/index.tsx @@ -133,7 +133,7 @@ export const CollectionArchiveByCollection: React.FC = (props) => { } } - makeRequest() + void makeRequest() return () => { if (timer) clearTimeout(timer) diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index d1dcfb319..39abe6dc2 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -3,7 +3,7 @@ import type { SanitizedConfig } from 'payload/types' import { translations } from '@payloadcms/translations/client' import { RootProvider, buildComponentMap } from '@payloadcms/ui' import '@payloadcms/ui/scss/app.scss' -import { headers as getHeaders } from 'next/headers.js' +import { headers as getHeaders, cookies as nextCookies } from 'next/headers.js' import { parseCookies } from 'payload/auth' import { createClientConfig } from 'payload/config' import { deepMerge } from 'payload/utilities' @@ -37,6 +37,7 @@ export const RootLayout = async ({ const lang = getRequestLanguage({ + config, cookies, headers, }) ?? clientConfig.i18n.fallbackLanguage @@ -50,6 +51,16 @@ export const RootLayout = async ({ value: language, })) + // eslint-disable-next-line @typescript-eslint/require-await + async function switchLanguageServerAction(lang: string): Promise { + 'use server' + nextCookies().set({ + name: `${config.cookiePrefix || 'payload'}-lng'`, + path: '/', + value: lang, + }) + } + const { componentMap, wrappedChildren } = buildComponentMap({ DefaultCell, DefaultEditView, @@ -67,6 +78,8 @@ export const RootLayout = async ({ fallbackLang={clientConfig.i18n.fallbackLanguage} lang={lang} languageOptions={languageOptions} + // eslint-disable-next-line react/jsx-no-bind + switchLanguageServerAction={switchLanguageServerAction} translations={mergedTranslations[lang]} > {wrappedChildren} diff --git a/packages/next/src/routes/rest/collections/create.ts b/packages/next/src/routes/rest/collections/create.ts index aae5a0bfc..ffbf9df1c 100644 --- a/packages/next/src/routes/rest/collections/create.ts +++ b/packages/next/src/routes/rest/collections/create.ts @@ -1,3 +1,4 @@ +import { getTranslation } from '@payloadcms/translations' import httpStatus from 'http-status' import { createOperation } from 'payload/operations' import { isNumber } from 'payload/utilities' @@ -23,7 +24,7 @@ export const create: CollectionRouteHandler = async ({ collection, req }) => { { doc, message: req.t('general:successfullyCreated', { - label: collection.config.labels.singular, + label: getTranslation(collection.config.labels.singular, req.i18n), }), }, { diff --git a/packages/next/src/utilities/createPayloadRequest.ts b/packages/next/src/utilities/createPayloadRequest.ts index 7118b1266..c71030fb5 100644 --- a/packages/next/src/utilities/createPayloadRequest.ts +++ b/packages/next/src/utilities/createPayloadRequest.ts @@ -67,6 +67,7 @@ export const createPayloadRequest = async ({ } const language = getRequestLanguage({ + config, cookies, headers: request.headers, }) diff --git a/packages/next/src/utilities/getNextI18n.ts b/packages/next/src/utilities/getNextI18n.ts index 9b49321a7..25a7d2a52 100644 --- a/packages/next/src/utilities/getNextI18n.ts +++ b/packages/next/src/utilities/getNextI18n.ts @@ -7,19 +7,16 @@ import { cookies, headers } from 'next/headers.js' import { getRequestLanguage } from './getRequestLanguage.js' -export const getNextI18n = async ({ +export const getNextI18n = ({ config, language, }: { config: SanitizedConfig language?: string -}): Promise => { - const i18n = initI18n({ +}): I18n => + initI18n({ config: config.i18n, context: 'client', - language: language || getRequestLanguage({ cookies: cookies(), headers: headers() }), + language: language || getRequestLanguage({ config, cookies: cookies(), headers: headers() }), translations, }) - - return i18n -} diff --git a/packages/next/src/utilities/getRequestLanguage.ts b/packages/next/src/utilities/getRequestLanguage.ts index b7fe90b5f..0d962b8b6 100644 --- a/packages/next/src/utilities/getRequestLanguage.ts +++ b/packages/next/src/utilities/getRequestLanguage.ts @@ -1,24 +1,27 @@ import type { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies.js' +import type { SanitizedConfig } from 'packages/payload/src/exports/types.js' import { matchLanguage } from '@payloadcms/translations' type GetRequestLanguageArgs = { + config: SanitizedConfig cookies: Map | ReadonlyRequestCookies defaultLanguage?: string headers: Request['headers'] } export const getRequestLanguage = ({ + config, cookies, defaultLanguage = 'en', headers, }: GetRequestLanguageArgs): string => { const acceptLanguage = headers.get('Accept-Language') - const cookieLanguage = cookies.get('lng') + const cookieLanguage = cookies.get(`${config.cookiePrefix || 'payload'}-lng'`) const reqLanguage = - acceptLanguage || (typeof cookieLanguage === 'string' ? cookieLanguage : cookieLanguage?.value) || + acceptLanguage || defaultLanguage return matchLanguage(reqLanguage) diff --git a/packages/next/src/utilities/initPage.ts b/packages/next/src/utilities/initPage.ts index eb4999918..940000bdd 100644 --- a/packages/next/src/utilities/initPage.ts +++ b/packages/next/src/utilities/initPage.ts @@ -62,7 +62,7 @@ export const initPage = async ({ localization && localization.defaultLocale ? localization.defaultLocale : 'en' const localeCode = localeParam || defaultLocale const locale = localization && findLocaleFromCode(localization, localeCode) - const language = getRequestLanguage({ cookies, headers }) + const language = getRequestLanguage({ config: payload.config, cookies, headers }) const i18n = initI18n({ config: payload.config.i18n, diff --git a/packages/next/src/views/Account/Settings/index.tsx b/packages/next/src/views/Account/Settings/index.tsx index cc7c23cc8..5a1d8812b 100644 --- a/packages/next/src/views/Account/Settings/index.tsx +++ b/packages/next/src/views/Account/Settings/index.tsx @@ -13,7 +13,7 @@ export const Settings: React.FC<{ }> = (props) => { const { className } = props - const { i18n, languageOptions, t } = useTranslation() + const { i18n, languageOptions, switchLanguage, t } = useTranslation() return (
@@ -22,8 +22,9 @@ export const Settings: React.FC<{