Skip to content

Commit 0067f57

Browse files
authored
fix: reuse nuxt instance at plugin setup (#3690)
1 parent 76b1378 commit 0067f57

6 files changed

Lines changed: 34 additions & 21 deletions

File tree

src/runtime/internal.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { isString } from '@intlify/shared'
2-
import { useCookie, useNuxtApp, useRequestHeader, useRuntimeConfig } from '#imports'
2+
import { useCookie, useRequestHeader, useRuntimeConfig } from '#imports'
33
import { DEFAULT_COOKIE_KEY, isSSG, localeCodes, normalizedLocales } from '#build/i18n.options.mjs'
44
import { findBrowserLocale, regexpPath } from './routing/utils'
55
import { initCommonComposableOptions } from './utils'
66
import { createLogger } from '#nuxt-i18n/logger'
77

88
import type { Locale } from 'vue-i18n'
99
import type { DetectBrowserLanguageOptions, I18nPublicRuntimeConfig } from '#internal-i18n-types'
10-
import type { CookieOptions, CookieRef } from 'nuxt/app'
10+
import type { CookieOptions, CookieRef, NuxtApp } from 'nuxt/app'
1111
import type { CompatRoute } from './types'
1212
import type { CommonComposableOptions } from './utils'
1313

@@ -110,6 +110,7 @@ type DetectBrowserLanguageResult = {
110110
}
111111

112112
export function detectBrowserLanguage(
113+
nuxtApp: NuxtApp,
113114
route: string | CompatRoute,
114115
localeCookie: string | undefined,
115116
locale: Locale = ''
@@ -122,7 +123,6 @@ export function detectBrowserLanguage(
122123
return { locale: '', error: 'disabled' }
123124
}
124125

125-
const nuxtApp = useNuxtApp()
126126
const strategy = nuxtApp.$i18n.strategy
127127
const firstAccess = nuxtApp._vueI18n.__firstAccess
128128

src/runtime/plugins/i18n.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@ export default defineNuxtPlugin({
3636
name: 'i18n:plugin',
3737
parallel: parallelPlugin,
3838
async setup(_nuxt) {
39+
// @ts-expect-error untyped internal id parameter
40+
const nuxt = useNuxtApp(_nuxt._id)
3941
Object.defineProperty(_nuxt.versions, 'nuxtI18n', { get: () => __NUXT_I18N_VERSION__ })
4042

4143
const logger = /*#__PURE__*/ createLogger('plugin:i18n')
42-
const nuxt = useNuxtApp()
4344
const _runtimeI18n = nuxt.$config.public.i18n as I18nPublicRuntimeConfig
4445

4546
const defaultLocaleDomain = getDefaultLocaleForDomain(_runtimeI18n)
@@ -110,7 +111,7 @@ export default defineNuxtPlugin({
110111
() => normalizedLocales.find(l => l.code === composer.locale.value) || { code: composer.locale.value }
111112
)
112113
composer.setLocale = async (locale: string) => {
113-
await loadAndSetLocale(locale, i18n.__firstAccess)
114+
await loadAndSetLocale(nuxt, locale, i18n.__firstAccess)
114115

115116
if (composer.strategy === 'no_prefix' || !hasPages) {
116117
await composer.loadLocaleMessages(locale)
@@ -120,7 +121,7 @@ export default defineNuxtPlugin({
120121

121122
const route = nuxt.$router.currentRoute.value
122123
const redirectPath = await nuxt.runWithContext(() =>
123-
detectRedirect({ to: route, locale, routeLocale: i18n.__localeFromRoute(route) })
124+
detectRedirect({ to: route, nuxtApp: nuxt, locale, routeLocale: i18n.__localeFromRoute(route) })
124125
)
125126

126127
__DEBUG__ && logger.log('redirectPath on setLocale', redirectPath)

src/runtime/plugins/route-locale-detect.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import type { CompatRoute } from '../types'
1010
export default defineNuxtPlugin({
1111
name: 'i18n:plugin:route-locale-detect',
1212
dependsOn: ['i18n:plugin'],
13-
async setup() {
13+
async setup(_nuxt) {
14+
// @ts-expect-error untyped internal id parameter
15+
const nuxt = useNuxtApp(_nuxt._id)
1416
const logger = /*#__PURE__*/ createLogger('plugin:route-locale-detect')
15-
const nuxt = useNuxtApp()
1617
const currentRoute = nuxt.$router.currentRoute
1718

1819
async function handleRouteDetect(to: CompatRoute) {
1920
let detected = detectLocale(
21+
nuxt,
2022
to,
2123
nuxt._vueI18n.__localeFromRoute(to),
2224
unref(nuxt.$i18n.locale),
@@ -30,7 +32,7 @@ export default defineNuxtPlugin({
3032
await nuxt.$i18n.loadLocaleMessages(detected)
3133
}
3234

33-
const modified = await nuxt.runWithContext(() => loadAndSetLocale(detected, nuxt._vueI18n.__firstAccess))
35+
const modified = await nuxt.runWithContext(() => loadAndSetLocale(nuxt, detected, nuxt._vueI18n.__firstAccess))
3436
if (modified) {
3537
detected = unref(nuxt.$i18n.locale)
3638
}
@@ -51,7 +53,7 @@ export default defineNuxtPlugin({
5153
const locale = await nuxt.runWithContext(() => handleRouteDetect(to))
5254

5355
const redirectPath = await nuxt.runWithContext(() =>
54-
detectRedirect({ to, from, locale, routeLocale: nuxt._vueI18n.__localeFromRoute(to) }, true)
56+
detectRedirect({ to, nuxtApp: nuxt, from, locale, routeLocale: nuxt._vueI18n.__localeFromRoute(to) }, true)
5557
)
5658

5759
nuxt._vueI18n.__firstAccess = false

src/runtime/plugins/ssg-detect.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ export default defineNuxtPlugin({
88
name: 'i18n:plugin:ssg-detect',
99
dependsOn: ['i18n:plugin', 'i18n:plugin:route-locale-detect'],
1010
enforce: 'post',
11-
setup() {
12-
const nuxt = useNuxtApp()
11+
setup(_nuxt) {
12+
// @ts-expect-error untyped internal id parameter
13+
const nuxt = useNuxtApp(_nuxt._id)
1314
if (!isSSG || nuxt.$i18n.strategy !== 'no_prefix' || !runtimeDetectBrowserLanguage()) return
1415

1516
const logger = /*#__PURE__*/ createLogger('plugin:i18n:ssg-detect')
@@ -18,6 +19,7 @@ export default defineNuxtPlugin({
1819
// NOTE: avoid hydration mismatch for SSG mode
1920
nuxt.hook('app:mounted', async () => {
2021
const detected = detectBrowserLanguage(
22+
nuxt,
2123
nuxt.$router.currentRoute.value,
2224
localeCookie,
2325
localeCookie || unref(nuxt.$i18n.defaultLocale)

src/runtime/plugins/switch-locale-path-ssr.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import { SWITCH_LOCALE_PATH_LINK_IDENTIFIER } from '#build/i18n.options.mjs'
66
export default defineNuxtPlugin({
77
name: 'i18n:plugin:switch-locale-path-ssr',
88
dependsOn: ['i18n:plugin'],
9-
setup() {
10-
const nuxt = useNuxtApp()
9+
setup(_nuxt) {
10+
// @ts-expect-error untyped internal id parameter
11+
const nuxt = useNuxtApp(_nuxt._id)
1112
if (nuxt.$config.public.i18n.experimental.switchLocalePathLinkSSR !== true) return
1213

1314
const switchLocalePath = useSwitchLocalePath()

src/runtime/utils.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,14 @@ export function initCommonComposableOptions(i18n?: I18n): CommonComposableOption
5050
}
5151
}
5252

53-
export async function loadAndSetLocale(newLocale: Locale, initial: boolean = false): Promise<boolean> {
53+
export async function loadAndSetLocale(
54+
nuxtApp: NuxtApp,
55+
newLocale: Locale,
56+
initial: boolean = false
57+
): Promise<boolean> {
5458
const logger = /*#__PURE__*/ createLogger('loadAndSetLocale')
55-
const nuxtApp = useNuxtApp()
5659
const { differentDomains, skipSettingLocaleOnNavigate } = nuxtApp.$config.public.i18n
57-
const opts = runtimeDetectBrowserLanguage()
60+
const opts = runtimeDetectBrowserLanguage(nuxtApp.$config.public.i18n as I18nPublicRuntimeConfig)
5861

5962
const oldLocale = unref(nuxtApp.$i18n.locale)
6063
const localeCodes = unref(nuxtApp.$i18n.localeCodes)
@@ -124,17 +127,17 @@ export async function loadAndSetLocale(newLocale: Locale, initial: boolean = fal
124127
}
125128

126129
export function detectLocale(
130+
nuxtApp: NuxtApp,
127131
route: string | CompatRoute,
128132
routeLocale: string,
129133
currentLocale: string | undefined,
130134
localeCookie: string | undefined
131135
) {
132-
const nuxtApp = useNuxtApp()
133136
const { strategy, defaultLocale, differentDomains, multiDomainLocales } = nuxtApp.$config.public.i18n
134137
const _detectBrowserLanguage = runtimeDetectBrowserLanguage()
135138
const logger = /*#__PURE__*/ createLogger('detectLocale')
136139

137-
const detectedBrowser = detectBrowserLanguage(route, localeCookie, currentLocale)
140+
const detectedBrowser = detectBrowserLanguage(nuxtApp, route, localeCookie, currentLocale)
138141
__DEBUG__ && logger.log({ detectBrowserLanguage: detectedBrowser })
139142

140143
// detected browser language
@@ -167,6 +170,7 @@ export function detectLocale(
167170
}
168171

169172
type DetectRedirectOptions = {
173+
nuxtApp: NuxtApp
170174
to: CompatRoute
171175
from?: CompatRoute
172176
/**
@@ -184,9 +188,12 @@ type DetectRedirectOptions = {
184188
*
185189
* @param inMiddleware - whether this is called during navigation middleware
186190
*/
187-
export function detectRedirect({ to, from, locale, routeLocale }: DetectRedirectOptions, inMiddleware = false): string {
191+
export function detectRedirect(
192+
{ to, nuxtApp, from, locale, routeLocale }: DetectRedirectOptions,
193+
inMiddleware = false
194+
): string {
188195
// no locale change detected from routing
189-
if (routeLocale === locale || useNuxtApp().$i18n.strategy === 'no_prefix') {
196+
if (routeLocale === locale || nuxtApp.$i18n.strategy === 'no_prefix') {
190197
return ''
191198
}
192199

0 commit comments

Comments
 (0)