|
| 1 | +import { defineNuxtPlugin } from '#imports' |
| 2 | +import type { Locale } from 'vue-i18n' |
| 3 | +import { resolveRoute } from '../routing/routing' |
| 4 | +import { useNuxtApp } from 'nuxt/app' |
| 5 | +import { useRouter } from 'vue-router' |
| 6 | +import type { I18nPublicRuntimeConfig } from '#internal-i18n-types' |
| 7 | + |
| 8 | +type ResolverParams = Parameters<import('#vue-router').Router['resolve']> |
| 9 | + |
| 10 | +export default defineNuxtPlugin({ |
| 11 | + name: 'i18n:route-resolution-enhancement', |
| 12 | + dependsOn: ['i18n:plugin'], |
| 13 | + setup() { |
| 14 | + const nuxt = useNuxtApp() |
| 15 | + const runtimeI18n = nuxt.$config.public.i18n as I18nPublicRuntimeConfig |
| 16 | + |
| 17 | + if (!runtimeI18n.experimental.routeResolutionEnhancement) return |
| 18 | + |
| 19 | + const router = useRouter() |
| 20 | + const implicit = runtimeI18n.experimental.routeResolutionEnhancement === 'implicit' |
| 21 | + |
| 22 | + const originalResolve = router.resolve.bind(router) |
| 23 | + router.resolve = ( |
| 24 | + to: ResolverParams[0], |
| 25 | + currentLocation: ResolverParams[1], |
| 26 | + options?: { locale?: Locale | boolean } |
| 27 | + ) => { |
| 28 | + /** |
| 29 | + * disable enhancement |
| 30 | + * - explicit mode without `locale` |
| 31 | + * - implicit mode with `locale: false` |
| 32 | + */ |
| 33 | + if ((!implicit && options?.locale == null) || options?.locale === false) { |
| 34 | + return originalResolve(to, currentLocation) |
| 35 | + } |
| 36 | + |
| 37 | + // resolve to string | undefined |
| 38 | + const _locale = (typeof options?.locale === 'string' && options?.locale) || undefined |
| 39 | + console.log(_locale) |
| 40 | + return resolveRoute(nuxt._nuxtI18n, to, _locale ?? nuxt._nuxtI18n.getLocale()) |
| 41 | + } |
| 42 | + } |
| 43 | +}) |
0 commit comments