From b2f053db258c9227fd64aa73566e25420e78d5cc Mon Sep 17 00:00:00 2001 From: Sh Date: Fri, 24 Jan 2025 22:44:24 +0200 Subject: [PATCH 01/18] Added next-intl integration --- locales/en.json | 9 + locales/fr.json | 9 + next.config.js | 9 +- package.json | 1 + .../(checkout)/checkout/page.tsx | 0 .../[countryCode]/(checkout)/layout.tsx | 0 .../[countryCode]/(checkout)/not-found.tsx | 0 .../account/@dashboard/addresses/page.tsx | 0 .../(main)/account/@dashboard/loading.tsx | 0 .../@dashboard/orders/details/[id]/page.tsx | 0 .../(main)/account/@dashboard/orders/page.tsx | 0 .../(main)/account/@dashboard/page.tsx | 0 .../account/@dashboard/profile/page.tsx | 0 .../(main)/account/@login/page.tsx | 0 .../[countryCode]/(main)/account/layout.tsx | 0 .../[countryCode]/(main)/account/loading.tsx | 0 .../[countryCode]/(main)/cart/loading.tsx | 0 .../[countryCode]/(main)/cart/not-found.tsx | 0 .../[countryCode]/(main)/cart/page.tsx | 0 .../(main)/categories/[...category]/page.tsx | 0 .../(main)/collections/[handle]/page.tsx | 0 .../[countryCode]/(main)/layout.tsx | 8 +- .../[countryCode]/(main)/not-found.tsx | 0 .../(main)/order/[id]/confirmed/loading.tsx | 0 .../(main)/order/[id]/confirmed/page.tsx | 0 .../[id]/transfer/[token]/accept/page.tsx | 0 .../[id]/transfer/[token]/decline/page.tsx | 0 .../order/[id]/transfer/[token]/page.tsx | 0 .../[countryCode]/(main)/page.tsx | 0 .../(main)/products/[handle]/page.tsx | 0 .../[countryCode]/(main)/store/page.tsx | 0 src/app/layout.tsx | 46 +++- src/app/not-found.tsx | 12 +- src/lib/i18n/config-callback.ts | 23 ++ src/lib/i18n/navigation.ts | 5 + src/lib/i18n/request-config.js | 3 + src/lib/i18n/settings.ts | 15 ++ src/lib/i18n/translations/en.ts | 240 ++++++++++++++++++ src/lib/i18n/translations/fr.ts | 231 +++++++++++++++++ src/lib/i18n/translations/keys.ts | 225 ++++++++++++++++ src/lib/i18n/translations/locales/en.ts | 240 ++++++++++++++++++ src/lib/i18n/translations/locales/fr.ts | 231 +++++++++++++++++ src/lib/i18n/use-safe-translations.ts | 15 ++ src/middleware.ts | 72 ++++-- tsconfig.json | 3 +- 45 files changed, 1369 insertions(+), 28 deletions(-) create mode 100644 locales/en.json create mode 100644 locales/fr.json rename src/app/{ => [locale]}/[countryCode]/(checkout)/checkout/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(checkout)/layout.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(checkout)/not-found.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/@dashboard/addresses/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/@dashboard/loading.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/@dashboard/orders/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/@dashboard/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/@dashboard/profile/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/@login/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/layout.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/account/loading.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/cart/loading.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/cart/not-found.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/cart/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/categories/[...category]/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/collections/[handle]/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/layout.tsx (90%) rename src/app/{ => [locale]}/[countryCode]/(main)/not-found.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/order/[id]/confirmed/loading.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/order/[id]/confirmed/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/order/[id]/transfer/[token]/accept/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/order/[id]/transfer/[token]/decline/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/order/[id]/transfer/[token]/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/products/[handle]/page.tsx (100%) rename src/app/{ => [locale]}/[countryCode]/(main)/store/page.tsx (100%) create mode 100644 src/lib/i18n/config-callback.ts create mode 100644 src/lib/i18n/navigation.ts create mode 100644 src/lib/i18n/request-config.js create mode 100644 src/lib/i18n/settings.ts create mode 100644 src/lib/i18n/translations/en.ts create mode 100644 src/lib/i18n/translations/fr.ts create mode 100644 src/lib/i18n/translations/keys.ts create mode 100644 src/lib/i18n/translations/locales/en.ts create mode 100644 src/lib/i18n/translations/locales/fr.ts create mode 100644 src/lib/i18n/use-safe-translations.ts diff --git a/locales/en.json b/locales/en.json new file mode 100644 index 000000000..00662dd16 --- /dev/null +++ b/locales/en.json @@ -0,0 +1,9 @@ +{ + "main":{}, + "checkout":{}, + "products":{}, + "content":{}, + "GO_TO_FRONTPAGE":"Go to homepage", + "THE_PAGE_YOU_TRIED_TO_ACCESS_D":"The page you tried to access does not exist.", + "PAGE_NOT_FOUND":"Page not found" +} \ No newline at end of file diff --git a/locales/fr.json b/locales/fr.json new file mode 100644 index 000000000..31c59b757 --- /dev/null +++ b/locales/fr.json @@ -0,0 +1,9 @@ +{ + "main":{}, + "checkout":{}, + "products":{}, + "content":{}, + "GO_TO_FRONTPAGE":"Aller à la page d'accueil", + "THE_PAGE_YOU_TRIED_TO_ACCESS_D":"La page que vous avez essayé d'accéder n'existe pas.", + "PAGE_NOT_FOUND":"Page introuvable" +} \ No newline at end of file diff --git a/next.config.js b/next.config.js index fd5706a24..838e987c6 100644 --- a/next.config.js +++ b/next.config.js @@ -1,11 +1,16 @@ const checkEnvVariables = require("./check-env-variables") +const nextIntl = require("next-intl/plugin") + checkEnvVariables() /** * @type {import('next').NextConfig} */ -const nextConfig = { + +const withNextIntl = nextIntl("./src/lib/i18n/request-config.js") + +const configOpts = { reactStrictMode: true, logging: { fetches: { @@ -40,4 +45,6 @@ const nextConfig = { }, } +const nextConfig = withNextIntl(configOpts) + module.exports = nextConfig diff --git a/package.json b/package.json index 683e0bf37..7ceae1350 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@stripe/stripe-js": "^1.29.0", "lodash": "^4.17.21", "next": "15.0.3", + "next-intl": "^3.26.3", "pg": "^8.11.3", "qs": "^6.12.1", "react": "19.0.0-rc-66855b96-20241106", diff --git a/src/app/[countryCode]/(checkout)/checkout/page.tsx b/src/app/[locale]/[countryCode]/(checkout)/checkout/page.tsx similarity index 100% rename from src/app/[countryCode]/(checkout)/checkout/page.tsx rename to src/app/[locale]/[countryCode]/(checkout)/checkout/page.tsx diff --git a/src/app/[countryCode]/(checkout)/layout.tsx b/src/app/[locale]/[countryCode]/(checkout)/layout.tsx similarity index 100% rename from src/app/[countryCode]/(checkout)/layout.tsx rename to src/app/[locale]/[countryCode]/(checkout)/layout.tsx diff --git a/src/app/[countryCode]/(checkout)/not-found.tsx b/src/app/[locale]/[countryCode]/(checkout)/not-found.tsx similarity index 100% rename from src/app/[countryCode]/(checkout)/not-found.tsx rename to src/app/[locale]/[countryCode]/(checkout)/not-found.tsx diff --git a/src/app/[countryCode]/(main)/account/@dashboard/addresses/page.tsx b/src/app/[locale]/[countryCode]/(main)/account/@dashboard/addresses/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/@dashboard/addresses/page.tsx rename to src/app/[locale]/[countryCode]/(main)/account/@dashboard/addresses/page.tsx diff --git a/src/app/[countryCode]/(main)/account/@dashboard/loading.tsx b/src/app/[locale]/[countryCode]/(main)/account/@dashboard/loading.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/@dashboard/loading.tsx rename to src/app/[locale]/[countryCode]/(main)/account/@dashboard/loading.tsx diff --git a/src/app/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx b/src/app/[locale]/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx rename to src/app/[locale]/[countryCode]/(main)/account/@dashboard/orders/details/[id]/page.tsx diff --git a/src/app/[countryCode]/(main)/account/@dashboard/orders/page.tsx b/src/app/[locale]/[countryCode]/(main)/account/@dashboard/orders/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/@dashboard/orders/page.tsx rename to src/app/[locale]/[countryCode]/(main)/account/@dashboard/orders/page.tsx diff --git a/src/app/[countryCode]/(main)/account/@dashboard/page.tsx b/src/app/[locale]/[countryCode]/(main)/account/@dashboard/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/@dashboard/page.tsx rename to src/app/[locale]/[countryCode]/(main)/account/@dashboard/page.tsx diff --git a/src/app/[countryCode]/(main)/account/@dashboard/profile/page.tsx b/src/app/[locale]/[countryCode]/(main)/account/@dashboard/profile/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/@dashboard/profile/page.tsx rename to src/app/[locale]/[countryCode]/(main)/account/@dashboard/profile/page.tsx diff --git a/src/app/[countryCode]/(main)/account/@login/page.tsx b/src/app/[locale]/[countryCode]/(main)/account/@login/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/@login/page.tsx rename to src/app/[locale]/[countryCode]/(main)/account/@login/page.tsx diff --git a/src/app/[countryCode]/(main)/account/layout.tsx b/src/app/[locale]/[countryCode]/(main)/account/layout.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/layout.tsx rename to src/app/[locale]/[countryCode]/(main)/account/layout.tsx diff --git a/src/app/[countryCode]/(main)/account/loading.tsx b/src/app/[locale]/[countryCode]/(main)/account/loading.tsx similarity index 100% rename from src/app/[countryCode]/(main)/account/loading.tsx rename to src/app/[locale]/[countryCode]/(main)/account/loading.tsx diff --git a/src/app/[countryCode]/(main)/cart/loading.tsx b/src/app/[locale]/[countryCode]/(main)/cart/loading.tsx similarity index 100% rename from src/app/[countryCode]/(main)/cart/loading.tsx rename to src/app/[locale]/[countryCode]/(main)/cart/loading.tsx diff --git a/src/app/[countryCode]/(main)/cart/not-found.tsx b/src/app/[locale]/[countryCode]/(main)/cart/not-found.tsx similarity index 100% rename from src/app/[countryCode]/(main)/cart/not-found.tsx rename to src/app/[locale]/[countryCode]/(main)/cart/not-found.tsx diff --git a/src/app/[countryCode]/(main)/cart/page.tsx b/src/app/[locale]/[countryCode]/(main)/cart/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/cart/page.tsx rename to src/app/[locale]/[countryCode]/(main)/cart/page.tsx diff --git a/src/app/[countryCode]/(main)/categories/[...category]/page.tsx b/src/app/[locale]/[countryCode]/(main)/categories/[...category]/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/categories/[...category]/page.tsx rename to src/app/[locale]/[countryCode]/(main)/categories/[...category]/page.tsx diff --git a/src/app/[countryCode]/(main)/collections/[handle]/page.tsx b/src/app/[locale]/[countryCode]/(main)/collections/[handle]/page.tsx similarity index 100% rename from src/app/[countryCode]/(main)/collections/[handle]/page.tsx rename to src/app/[locale]/[countryCode]/(main)/collections/[handle]/page.tsx diff --git a/src/app/[countryCode]/(main)/layout.tsx b/src/app/[locale]/[countryCode]/(main)/layout.tsx similarity index 90% rename from src/app/[countryCode]/(main)/layout.tsx rename to src/app/[locale]/[countryCode]/(main)/layout.tsx index 5635222a1..b843b274f 100644 --- a/src/app/[countryCode]/(main)/layout.tsx +++ b/src/app/[locale]/[countryCode]/(main)/layout.tsx @@ -23,7 +23,13 @@ export default async function PageLayout(props: { children: React.ReactNode }) { shippingOptions = shipping_options } - + // return ( + // + // + // {props.children} + // + // + // ) return ( <>