diff --git a/src/runtime/plugins/03.define.ts b/src/runtime/plugins/03.define.ts index 3e2b4970..f6585733 100644 --- a/src/runtime/plugins/03.define.ts +++ b/src/runtime/plugins/03.define.ts @@ -1,11 +1,17 @@ import type { ModuleOptions } from '../../module' -import { defineNuxtPlugin, useRuntimeConfig } from '#app' +import { defineNuxtPlugin, useNuxtApp, useRuntimeConfig } from '#app' import { useRoute, useRouter } from '#imports' interface State extends ModuleOptions { rootDir: string } +// Рекурсивный тип для переводов +type TranslationObject = string | { [key: string]: TranslationObject } + +// Тип для локалей +type LocalesObject = Record + export default defineNuxtPlugin((_nuxtApp) => { const config = useRuntimeConfig() const route = useRoute() @@ -13,14 +19,35 @@ export default defineNuxtPlugin((_nuxtApp) => { const i18nConfig: State = config.public.i18nConfig as State + // Функция нормализации, которая объединяет массивы и объекты в единый массив строк + const normalizeLocales = (locales?: string[] | LocalesObject): LocalesObject => { + if (Array.isArray(locales)) { + // Если передан массив, преобразуем его в объект с пустыми значениями + return locales.reduce((acc, locale) => { + acc[locale] = {} + return acc + }, {} as LocalesObject) + } + else if (typeof locales === 'object' && locales !== null) { + // Если передан объект, возвращаем его как есть + return locales + } + return {} + } + // Функция для определения i18n маршрута - const defineI18nRoute = (routeDefinition: { locales?: string[] }) => { + const defineI18nRoute = (routeDefinition: { locales?: string[] | Record> }) => { const currentLocale = (route.params.locale || i18nConfig.defaultLocale!).toString() - const { locales } = routeDefinition + const normalizedLocales = normalizeLocales(routeDefinition.locales) const { name } = route - // Проверяем, если текущая локаль не входит в допустимые локали - if (locales && !locales.includes(currentLocale)) { + // Если текущая локаль есть в объекте locales + if (normalizedLocales[currentLocale]) { + const translation = normalizedLocales[currentLocale] + const nuxtApp = useNuxtApp() + nuxtApp.$mergeTranslations(translation) + } + else { // Если локаль не допустима, перенаправляем на дефолтную локаль let defaultRouteName = name?.toString().replace('localized-', '') const resolvedRoute = router.resolve({ name: defaultRouteName })