| 
                        12345678910111213141516171819202122232425262728293031323334353637383940414243 | 
                        - import 'server-only'
 - 
 - import { cookies, headers } from 'next/headers'
 - import Negotiator from 'negotiator'
 - import { match } from '@formatjs/intl-localematcher'
 - import type { Locale } from '.'
 - import { i18n } from '.'
 - 
 - export const getLocaleOnServer = (): Locale => {
 -   // @ts-expect-error locales are readonly
 -   const locales: string[] = i18n.locales
 - 
 -   let languages: string[] | undefined
 -   // get locale from cookie
 -   const localeCookie = cookies().get('locale')
 -   languages = localeCookie?.value ? [localeCookie.value] : []
 - 
 -   if (!languages.length) {
 -     // Negotiator expects plain object so we need to transform headers
 -     const negotiatorHeaders: Record<string, string> = {}
 -     headers().forEach((value, key) => (negotiatorHeaders[key] = value))
 -     // Use negotiator and intl-localematcher to get best locale
 -     languages = new Negotiator({ headers: negotiatorHeaders }).languages()
 -   }
 - 
 -   // match locale
 -   const matchedLocale = match(languages, locales, i18n.defaultLocale) as Locale
 -   return matchedLocale
 - }
 - 
 - // We enumerate all dictionaries here for better linting and typescript support
 - // We also get the default import for cleaner types
 - const dictionaries = {
 -   'en': () => import('@/dictionaries/en.json').then(module => module.default),
 -   'zh-Hans': () => import('@/dictionaries/zh-Hans.json').then(module => module.default),
 - } as { [locale: string]: () => Promise<any> }
 - 
 - export const getDictionary = async (locale: Locale = 'en') => {
 -   try {
 -     return await dictionaries[locale]()
 -   }
 -   catch (e) { console.error('locale not found', locale) }
 - }
 
 
  |