diff --git a/.yarn/cache/@formatjs-ecma402-abstract-npm-1.11.4-98baf4d2cc-05dbe1c645.zip b/.yarn/cache/@formatjs-ecma402-abstract-npm-1.11.4-98baf4d2cc-05dbe1c645.zip new file mode 100644 index 000000000..b142b502c Binary files /dev/null and b/.yarn/cache/@formatjs-ecma402-abstract-npm-1.11.4-98baf4d2cc-05dbe1c645.zip differ diff --git a/.yarn/cache/@formatjs-ecma402-abstract-npm-1.17.0-e86778d1fc-cc45d238e5.zip b/.yarn/cache/@formatjs-ecma402-abstract-npm-1.17.0-e86778d1fc-cc45d238e5.zip new file mode 100644 index 000000000..ccb19a5ab Binary files /dev/null and b/.yarn/cache/@formatjs-ecma402-abstract-npm-1.17.0-e86778d1fc-cc45d238e5.zip differ diff --git a/.yarn/cache/@formatjs-fast-memoize-npm-1.2.1-e1ac6697b8-7df9e94114.zip b/.yarn/cache/@formatjs-fast-memoize-npm-1.2.1-e1ac6697b8-7df9e94114.zip new file mode 100644 index 000000000..deef27276 Binary files /dev/null and b/.yarn/cache/@formatjs-fast-memoize-npm-1.2.1-e1ac6697b8-7df9e94114.zip differ diff --git a/.yarn/cache/@formatjs-icu-messageformat-parser-npm-2.1.0-2edfa20736-8dab4d102b.zip b/.yarn/cache/@formatjs-icu-messageformat-parser-npm-2.1.0-2edfa20736-8dab4d102b.zip new file mode 100644 index 000000000..713888a10 Binary files /dev/null and b/.yarn/cache/@formatjs-icu-messageformat-parser-npm-2.1.0-2edfa20736-8dab4d102b.zip differ diff --git a/.yarn/cache/@formatjs-icu-skeleton-parser-npm-1.3.6-d4a8303901-cce2d8bea5.zip b/.yarn/cache/@formatjs-icu-skeleton-parser-npm-1.3.6-d4a8303901-cce2d8bea5.zip new file mode 100644 index 000000000..af092052a Binary files /dev/null and b/.yarn/cache/@formatjs-icu-skeleton-parser-npm-1.3.6-d4a8303901-cce2d8bea5.zip differ diff --git a/.yarn/cache/@formatjs-intl-localematcher-npm-0.2.25-6e304157f3-ee00ddc233.zip b/.yarn/cache/@formatjs-intl-localematcher-npm-0.2.25-6e304157f3-ee00ddc233.zip new file mode 100644 index 000000000..f81b1fdb9 Binary files /dev/null and b/.yarn/cache/@formatjs-intl-localematcher-npm-0.2.25-6e304157f3-ee00ddc233.zip differ diff --git a/.yarn/cache/@formatjs-intl-localematcher-npm-0.2.32-1117c79148-477e18aaba.zip b/.yarn/cache/@formatjs-intl-localematcher-npm-0.2.32-1117c79148-477e18aaba.zip new file mode 100644 index 000000000..a41720044 Binary files /dev/null and b/.yarn/cache/@formatjs-intl-localematcher-npm-0.2.32-1117c79148-477e18aaba.zip differ diff --git a/.yarn/cache/intl-messageformat-npm-9.13.0-7b380a28e9-effb840ae6.zip b/.yarn/cache/intl-messageformat-npm-9.13.0-7b380a28e9-effb840ae6.zip new file mode 100644 index 000000000..fda59675c Binary files /dev/null and b/.yarn/cache/intl-messageformat-npm-9.13.0-7b380a28e9-effb840ae6.zip differ diff --git a/.yarn/cache/next-intl-npm-2.19.1-d3fdbffe0b-b4c3cfbb22.zip b/.yarn/cache/next-intl-npm-2.19.1-d3fdbffe0b-b4c3cfbb22.zip new file mode 100644 index 000000000..38645bbba Binary files /dev/null and b/.yarn/cache/next-intl-npm-2.19.1-d3fdbffe0b-b4c3cfbb22.zip differ diff --git a/.yarn/cache/use-intl-npm-2.19.1-f53642df96-9c249791a4.zip b/.yarn/cache/use-intl-npm-2.19.1-f53642df96-9c249791a4.zip new file mode 100644 index 000000000..5997b9463 Binary files /dev/null and b/.yarn/cache/use-intl-npm-2.19.1-f53642df96-9c249791a4.zip differ diff --git a/app/[lang]/[page]/layout.tsx b/app/[locale]/[page]/layout.tsx similarity index 100% rename from app/[lang]/[page]/layout.tsx rename to app/[locale]/[page]/layout.tsx diff --git a/app/[lang]/[page]/opengraph-image.tsx b/app/[locale]/[page]/opengraph-image.tsx similarity index 100% rename from app/[lang]/[page]/opengraph-image.tsx rename to app/[locale]/[page]/opengraph-image.tsx diff --git a/app/[lang]/[page]/page.tsx b/app/[locale]/[page]/page.tsx similarity index 100% rename from app/[lang]/[page]/page.tsx rename to app/[locale]/[page]/page.tsx diff --git a/app/[lang]/error.tsx b/app/[locale]/error.tsx similarity index 100% rename from app/[lang]/error.tsx rename to app/[locale]/error.tsx diff --git a/app/[lang]/globals.css b/app/[locale]/globals.css similarity index 100% rename from app/[lang]/globals.css rename to app/[locale]/globals.css diff --git a/app/[lang]/images/home-image-001.webp b/app/[locale]/images/home-image-001.webp similarity index 100% rename from app/[lang]/images/home-image-001.webp rename to app/[locale]/images/home-image-001.webp diff --git a/app/[lang]/layout.tsx b/app/[locale]/layout.tsx similarity index 75% rename from app/[lang]/layout.tsx rename to app/[locale]/layout.tsx index b4b4eefe0..72154a809 100644 --- a/app/[lang]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -1,11 +1,11 @@ import Navbar from 'components/layout/navbar'; -import { Locale, i18n } from 'i18n-config'; +import { Locale } from 'i18n-config'; import { Noto_Sans_JP } from 'next/font/google'; import localFont from 'next/font/local'; import { ReactNode, Suspense } from 'react'; -import { LanguageProvider } from 'app/context/language-context'; -import { getDictionary } from 'dictionaries'; +import { NextIntlClientProvider } from 'next-intl'; +import { notFound } from 'next/navigation'; import './globals.css'; const { TWITTER_CREATOR, TWITTER_SITE, SITE_NAME } = process.env; @@ -69,8 +69,8 @@ const mincho = localFont({ variable: '--font-mincho' }); -export async function generateStaticParams() { - return i18n.locales.map((locale) => ({ lang: locale })); +export function generateStaticParams() { + return [{ locale: 'en' }, { locale: 'ja' }]; } export default async function RootLayout({ @@ -78,20 +78,25 @@ export default async function RootLayout({ params }: { children: ReactNode; - params: { lang: Locale }; + params: { locale: Locale }; }) { - const dictionary = await getDictionary(params?.lang); + let messages; + try { + messages = (await import(`../../messages/${params?.locale}.json`)).default; + } catch (error) { + notFound(); + } return ( - +
- +
{children}
-
+
diff --git a/app/[lang]/opengraph-image.tsx b/app/[locale]/opengraph-image.tsx similarity index 100% rename from app/[lang]/opengraph-image.tsx rename to app/[locale]/opengraph-image.tsx diff --git a/app/[lang]/page.tsx b/app/[locale]/page.tsx similarity index 82% rename from app/[lang]/page.tsx rename to app/[locale]/page.tsx index 7ac3dc59d..7cb6abba0 100644 --- a/app/[lang]/page.tsx +++ b/app/[locale]/page.tsx @@ -1,8 +1,7 @@ import { Carousel } from 'components/carousel'; import { ThreeItemGrid } from 'components/grid/three-items'; import Footer from 'components/layout/footer'; -import { LanguageControl } from 'components/layout/navbar/language-control'; -import type { Locale } from '../../i18n-config'; +import { LanguageControl, SupportedLocales } from 'components/layout/navbar/language-control'; import clsx from 'clsx'; import LogoNamemark from 'components/icons/namemark'; @@ -23,16 +22,20 @@ export const metadata = { } }; -export default async function HomePage({ params: { lang } }: { params: { lang: Locale } }) { +export default async function HomePage({ + params: { locale } +}: { + params: { locale: SupportedLocales }; +}) { return ( <>
- +
- +
diff --git a/app/[lang]/product/[handle]/page.tsx b/app/[locale]/product/[handle]/page.tsx similarity index 100% rename from app/[lang]/product/[handle]/page.tsx rename to app/[locale]/product/[handle]/page.tsx diff --git a/app/[lang]/robots.ts b/app/[locale]/robots.ts similarity index 100% rename from app/[lang]/robots.ts rename to app/[locale]/robots.ts diff --git a/app/[lang]/search/[collection]/opengraph-image.tsx b/app/[locale]/search/[collection]/opengraph-image.tsx similarity index 100% rename from app/[lang]/search/[collection]/opengraph-image.tsx rename to app/[locale]/search/[collection]/opengraph-image.tsx diff --git a/app/[lang]/search/[collection]/page.tsx b/app/[locale]/search/[collection]/page.tsx similarity index 100% rename from app/[lang]/search/[collection]/page.tsx rename to app/[locale]/search/[collection]/page.tsx diff --git a/app/[lang]/search/layout.tsx b/app/[locale]/search/layout.tsx similarity index 100% rename from app/[lang]/search/layout.tsx rename to app/[locale]/search/layout.tsx diff --git a/app/[lang]/search/loading.tsx b/app/[locale]/search/loading.tsx similarity index 100% rename from app/[lang]/search/loading.tsx rename to app/[locale]/search/loading.tsx diff --git a/app/[lang]/search/page.tsx b/app/[locale]/search/page.tsx similarity index 100% rename from app/[lang]/search/page.tsx rename to app/[locale]/search/page.tsx diff --git a/app/[lang]/sitemap.ts b/app/[locale]/sitemap.ts similarity index 100% rename from app/[lang]/sitemap.ts rename to app/[locale]/sitemap.ts diff --git a/app/context/language-context.tsx b/app/context/language-context.tsx deleted file mode 100644 index 628390568..000000000 --- a/app/context/language-context.tsx +++ /dev/null @@ -1,44 +0,0 @@ -'use client'; - -import { Locale } from 'i18n-config'; -import { ReactNode, createContext, useContext, useState } from 'react'; - -interface IContextProps { - currentLocale?: Locale; - currentLanguage?: Locale; - setCurrentLanguage: (language: Locale) => void; - currentDictionary?: any; -} - -export const LanguageContext = createContext({} as IContextProps); - -export function LanguageProvider({ - locale, - dictionary, - children -}: { - locale: Locale; - dictionary?: any; - children: ReactNode | ReactNode[] | string; -}) { - const [currentLocale, setCurrentLocale] = useState(locale || 'en'); - const [currentLanguage, setCurrentLanguage] = useState(locale || 'en'); - const [currentDictionary] = useState(dictionary); - - return ( - - {children} - - ); -} - -export const useLanguage = () => { - return useContext(LanguageContext); -}; diff --git a/components/grid/three-items.tsx b/components/grid/three-items.tsx index c9f31bb73..a324bf8cb 100644 --- a/components/grid/three-items.tsx +++ b/components/grid/three-items.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import { Locale } from 'i18n-config'; +import { SupportedLocales } from 'components/layout/navbar/language-control'; import { getCollectionProducts } from 'lib/shopify'; import type { Product } from 'lib/shopify/types'; import Link from 'next/link'; @@ -35,14 +35,14 @@ function ThreeItemGridItem({ item, priority }: { item: Product; priority?: boole ); } -export async function ThreeItemGrid({ lang }: { lang: Locale }) { +export async function ThreeItemGrid({ lang }: { lang: SupportedLocales }) { // Collections that start with `hidden-*` are hidden from the search page. const homepageItems = await getCollectionProducts({ collection: 'hidden-homepage-featured-items', - language: lang.toUpperCase() + language: lang?.toUpperCase() }); - console.debug({ homepageItems }); + console.debug({ lang }); if (!homepageItems[0] || !homepageItems[1] || !homepageItems[2]) return null; diff --git a/components/layout/menu/modal.tsx b/components/layout/menu/modal.tsx index 5cf3e66fb..7b9089234 100644 --- a/components/layout/menu/modal.tsx +++ b/components/layout/menu/modal.tsx @@ -1,15 +1,16 @@ 'use client'; import { Dialog, Transition } from '@headlessui/react'; -import { useLanguage } from 'app/context/language-context'; import CloseIcon from 'components/icons/close'; import MenuIcon from 'components/icons/menu'; +import { useLocale, useTranslations } from 'next-intl'; import Link from 'next/link'; import { Fragment, useRef, useState } from 'react'; -import { LanguageControl } from '../navbar/language-control'; +import { LanguageControl, SupportedLocales } from '../navbar/language-control'; export function MenuModal() { - const { currentLanguage, currentDictionary } = useLanguage(); + const t = useTranslations('Index'); + const locale = useLocale(); let [isOpen, setIsOpen] = useState(false); let closeButtonRef = useRef(null); @@ -57,7 +58,7 @@ export function MenuModal() {
- +
@@ -82,7 +83,7 @@ export function MenuModal() { href="/shops" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - {currentDictionary?.menu?.shops} + {t('menu.shops')}
@@ -91,7 +92,7 @@ export function MenuModal() { href="/about" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - {currentDictionary?.menu?.about} + {t('menu.about')} @@ -100,7 +101,7 @@ export function MenuModal() { href="/bar" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - {currentDictionary?.menu?.bar} + {t('menu.bar')} @@ -109,7 +110,7 @@ export function MenuModal() { href="/concept" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - {currentDictionary?.menu?.concept} + {t('menu.concept')} @@ -118,7 +119,7 @@ export function MenuModal() { href="/stories" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - {currentDictionary?.menu?.stories} + {t('menu.stories')} @@ -127,7 +128,7 @@ export function MenuModal() { href="/company" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - {currentDictionary?.menu?.company} + {t('menu.company')} @@ -136,7 +137,7 @@ export function MenuModal() { href="/contact" className="font-serif text-4xl font-normal transition-opacity duration-150 hover:opacity-50" > - {currentDictionary?.menu?.contact} + {t('menu.contact')} diff --git a/components/layout/navbar/language-control.tsx b/components/layout/navbar/language-control.tsx index 446381d9d..bf2b93597 100644 --- a/components/layout/navbar/language-control.tsx +++ b/components/layout/navbar/language-control.tsx @@ -1,11 +1,12 @@ 'use client'; import clsx from 'clsx'; -import type { Locale } from 'i18n-config'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; -export const LanguageControl = ({ lang }: { lang?: Locale }) => { +export type SupportedLocales = 'en' | 'ja' | undefined; + +export const LanguageControl = ({ lang }: { lang?: SupportedLocales }) => { const pathName = usePathname(); const redirectedPathName = (locale: string) => { if (!pathName) return '/'; diff --git a/components/layout/newsletter-signup.tsx b/components/layout/newsletter-signup.tsx index 1592d097d..f8312502d 100644 --- a/components/layout/newsletter-signup.tsx +++ b/components/layout/newsletter-signup.tsx @@ -1,13 +1,14 @@ 'use client'; -import { useLanguage } from 'app/context/language-context'; import clsx from 'clsx'; +import { useTranslations } from 'next-intl'; export default function NewsletterSignup() { - const { currentDictionary } = useLanguage(); + const t = useTranslations('Index'); + return (
-

{currentDictionary?.newsletter?.title}

-
{currentDictionary?.newsletter?.description}
+

{t('newsletter.title')}

+
{t('newsletter.description')}