29 lines
1.3 KiB
TypeScript
29 lines
1.3 KiB
TypeScript
import { hasLocale } from 'next-intl'
|
|||
|
|
import { getRequestConfig } from 'next-intl/server'
|
||
|
|
|
||
|
|
import { DEFAULT_LOCALE, type Locale, LOCALES } from './locales'
|
||
|
|
|
||
|
|
type Messages = { [key: string]: string | Messages }
|
||
|
|
|
||
|
|
const load = async (locale: Locale): Promise<Messages> =>
|
||
|
|
(await import(`./messages/${locale}.json`)).default
|
||
|
|
|
||
|
|
/** Перевод накладывается на английские сообщения: непереведённый ключ показывается по-английски */
|
||
|
|
const merge = (base: Messages, override: Messages): Messages => {
|
||
|
|
const result: Messages = { ...base }
|
||
|
|
for (const [key, value] of Object.entries(override)) {
|
||
|
|
const current = result[key]
|
||
|
|
result[key] =
|
||
|
|
typeof value === 'object' && typeof current === 'object' ? merge(current, value) : value
|
||
|
|
}
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Язык приходит из сегмента [locale] внутреннего маршрута (setRequestLocale в layout) */
|
||
|
|
export default getRequestConfig(async ({ requestLocale }) => {
|
||
|
|
const requested = await requestLocale
|
||
|
|
const locale = hasLocale(LOCALES, requested) ? requested : DEFAULT_LOCALE
|
||
|
|
const base = await load(DEFAULT_LOCALE)
|
||
|
|
const messages = locale === DEFAULT_LOCALE ? base : merge(base, await load(locale))
|
||
|
|
return { locale, messages }
|
||
|
|
})
|