Skip to content

Commit

Permalink
update: defineI18nRoute with locale
Browse files Browse the repository at this point in the history
  • Loading branch information
s00d committed Aug 19, 2024
1 parent c362568 commit 22f8ac1
Showing 1 changed file with 32 additions and 5 deletions.
37 changes: 32 additions & 5 deletions src/runtime/plugins/03.define.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,53 @@
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<string, TranslationObject>

export default defineNuxtPlugin((_nuxtApp) => {
const config = useRuntimeConfig()
const route = useRoute()
const router = useRouter()

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<string, Record<string, string>> }) => {
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 })
Expand Down

0 comments on commit 22f8ac1

Please sign in to comment.