Skip to content

Commit 0bfbb06

Browse files
authored
fix: clear message cache on server startup (#3683)
1 parent 400913f commit 0bfbb06

4 files changed

Lines changed: 35 additions & 12 deletions

File tree

src/runtime/context.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ import type {
2020
RootRedirectOptions
2121
} from '#internal-i18n-types'
2222

23-
const useLocaleConfigs = () =>
24-
useState<Record<string, { cacheable: boolean; fallbacks: string[] }>>('i18n:cached-locale-configs', () => ({}))
23+
export const useLocaleConfigs = () =>
24+
useState<Record<string, { cacheable: boolean; fallbacks: string[] }> | undefined>(
25+
'i18n:cached-locale-configs',
26+
() => undefined
27+
)
2528

2629
/**
2730
* @internal
@@ -84,7 +87,7 @@ export function createNuxtI18nContext(nuxt: NuxtApp, vueI18n: I18n, defaultLocal
8487
const localeCookie = useI18nCookie(detectConfig)
8588

8689
/** Get computed config for locale */
87-
const getLocaleConfig = (locale: string) => serverLocaleConfigs.value[locale]
90+
const getLocaleConfig = (locale: string) => serverLocaleConfigs.value![locale]
8891
const getDomainFromLocale = (locale: string) =>
8992
domainFromLocale(runtimeI18n.domainLocales, useRequestURL({ xForwardedHost: true }), locale)
9093
const baseUrl = createBaseUrlGetter(nuxt, runtimeI18n.baseUrl, defaultLocale, getDomainFromLocale)

src/runtime/plugins/i18n.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { extendI18n } from '../routing/i18n'
77
import { getI18nTarget } from '../compatibility'
88
import { localeHead, _useLocaleHead } from '../routing/head'
99
import { useLocalePath, useLocaleRoute, useRouteBaseName, useSwitchLocalePath } from '../composables'
10-
import { getDefaultLocaleForDomain } from '../shared/locales'
10+
import { createLocaleConfigs, getDefaultLocaleForDomain } from '../shared/locales'
1111
import { setupVueI18nOptions } from '../shared/vue-i18n'
12-
import { createNuxtI18nContext, useNuxtI18nContext, type NuxtI18nContext } from '../context'
12+
import { createNuxtI18nContext, useLocaleConfigs, useNuxtI18nContext, type NuxtI18nContext } from '../context'
1313
import { useI18nDetection, useRuntimeI18n } from '../shared/utils'
1414
import { useDetectors } from '../shared/detection'
1515
import { resolveSupportedLocale } from '../shared/locales'
@@ -31,6 +31,14 @@ export default defineNuxtPlugin({
3131
getDefaultLocaleForDomain(useRequestURL({ xForwardedHost: true }).host) || runtimeI18n.defaultLocale || ''
3232
const optionsI18n = preloadedOptions || (await setupVueI18nOptions(_defaultLocale))
3333

34+
const localeConfigs = useLocaleConfigs()
35+
if (import.meta.server) {
36+
localeConfigs.value = useRequestEvent()!.context.nuxtI18n?.localeConfigs || {}
37+
} else {
38+
// fallback when server is disabled
39+
localeConfigs.value ??= createLocaleConfigs(optionsI18n.fallbackLocale)
40+
}
41+
3442
if (__MULTI_DOMAIN_LOCALES__) {
3543
setupMultiDomainLocales(optionsI18n.defaultLocale)
3644
}

src/runtime/server/plugin.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { stringify } from 'devalue'
22
import { defineI18nMiddleware } from '@intlify/h3'
3-
import { defineNitroPlugin } from 'nitropack/runtime'
3+
import { defineNitroPlugin, useStorage } from 'nitropack/runtime'
44
import { tryUseI18nContext, createI18nContext } from './context'
55
import { createUserLocaleDetector } from './utils/locale-detector'
66
import { pickNested } from './utils/messages-utils'
@@ -20,6 +20,11 @@ export default defineNitroPlugin(async nitro => {
2020
const runtimeI18n = useRuntimeI18n()
2121
const defaultLocale: string = runtimeI18n.defaultLocale || ''
2222

23+
// clear cache for i18n handlers on startup
24+
const cacheStorage = useStorage('cache')
25+
const cachedKeys = await cacheStorage.getKeys('nitro:handlers:i18n')
26+
await Promise.all(cachedKeys.map(key => cacheStorage.removeItem(key)))
27+
2328
nitro.hooks.hook('request', async (event: H3Event) => {
2429
const options = await setupVueI18nOptions(getDefaultLocaleForDomain(getHost(event)) || defaultLocale)
2530
const localeConfigs = createLocaleConfigs(options.fallbackLocale)

src/runtime/server/routes/messages.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { deepCopy } from '@intlify/shared'
2-
import { defineCachedEventHandler } from 'nitropack/runtime'
2+
import { defineCachedEventHandler, defineCachedFunction } from 'nitropack/runtime'
33
import { getRouterParam, createError, defineEventHandler } from 'h3'
44
import { useI18nContext } from '../context'
55
import { getMergedMessages } from '../utils/messages'
@@ -27,11 +27,8 @@ const _messagesHandler = defineEventHandler(async (event: H3Event) => {
2727
return ctx.messages
2828
})
2929

30-
/**
31-
* Load messages for the specified locale event parameter (cached)
32-
*/
33-
const _messagesHandlerCached = defineCachedEventHandler(_messagesHandler, {
34-
name: 'i18n:messages',
30+
const _cachedMessageLoader = defineCachedFunction(_messagesHandler, {
31+
name: 'i18n:messages-internal',
3532
maxAge: !__I18N_CACHE__ ? -1 : 60 * 60 * 24,
3633
getKey: event => getRouterParam(event, 'locale') ?? 'null',
3734
shouldBypassCache(event) {
@@ -41,6 +38,16 @@ const _messagesHandlerCached = defineCachedEventHandler(_messagesHandler, {
4138
}
4239
})
4340

41+
/**
42+
* Load messages for the specified locale event parameter (cached)
43+
*/
44+
const _messagesHandlerCached = defineCachedEventHandler(_cachedMessageLoader, {
45+
name: 'i18n:messages',
46+
maxAge: !__I18N_CACHE__ ? -1 : 10,
47+
swr: false,
48+
getKey: event => getRouterParam(event, 'locale') ?? 'null'
49+
})
50+
4451
/**
4552
* Load messages for the specified locale event parameter
4653
* - uses `messagesHandler` in development

0 commit comments

Comments
 (0)