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 => (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 } })