\n\n### Describe the bug\n\nWith the default settings and `experimental.typedPages: true` the generated types are not correctly picked up.\n\nIf I rename `RouteNamedMapI18n` to `RouteNamedMap` the types are available.\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3197],{"name":3175,"color":3176},3771,"useRoute needs suffix to work","2025-08-05T16:28:06Z","https://github.com/nuxt-modules/i18n/issues/3771",0.72675955,{"description":3204,"labels":3205,"number":3218,"owner":3178,"repository":3179,"state":3180,"title":3219,"updated_at":3220,"url":3221,"score":3222},"### Environment\n\n- Operating System: `Darwin`\n- Node Version: `v20.9.0`\n- Nuxt Version: `3.14.159`\n- CLI Version: `3.15.0`\n- Nitro Version: `2.10.4`\n- Package Manager: `pnpm@9.9.0`\n- Builder: `-`\n- User Config: `default`\n- Runtime Modules: `@nuxtjs/i18n@9.0.0`\n- Build Modules: `-`\n\n\n### Reproduction\n\nhttps://stackblitz.com/edit/github-v1acupz3?file=app%2Fpages%2Fabout.vue,nuxt.config.ts\n\n### Describe the bug\n\nWhen a project uses different domains to separate localizations and the routes are translated using `defineI18nRoute()`, the routes from other locales are available in every locale as well.\nFor example, let's say I have route `/about` available on `foo.com` and `/o-nas` on `foo.sk`. When I go to `foo.sk/about`, it will still work.\n```ts\ndefineI18nRoute({\n paths: {\n en: '/about',\n sk: '/o-nas'\n }\n})\n```\n\n\n\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3206,3209,3212,3215],{"name":3207,"color":3208},"bug 🐛","ee0701",{"name":3210,"color":3211},"need reproduction","CD234A",{"name":3213,"color":3214},"scope: language detection","1B89B8",{"name":3216,"color":3217},"scope: routing","21CD73",3226,"Routes from different domains are mixed","2025-06-04T22:01:10Z","https://github.com/nuxt-modules/i18n/issues/3226",0.730286,{"description":3224,"labels":3225,"number":3227,"owner":3178,"repository":3179,"state":3180,"title":3228,"updated_at":3229,"url":3230,"score":3231},"### Environment\n\n- Operating System: `Darwin`\n- Node Version: `v22.14.0`\n- Nuxt Version: `3.17.6`\n- CLI Version: `3.25.1`\n- Nitro Version: `2.11.13`\n- Package Manager: `npm@10.9.2`\n- Builder: `-`\n- User Config: `compatibilityDate`, `devtools`, `modules`, `i18n`\n- Runtime Modules: `@nuxtjs/i18n@9.5.6`\n- Build Modules: `-`\n\n\n### Reproduction\n\n[https://github.com/ap-arto/define-i18n-route-issue](https://github.com/ap-arto/define-i18n-route-issue)\n \n1. Run the development server:`npm run dev`\n2. Visit localhost:3000\n3. Observe that the `spanish___es` route has been created, even though this domain is meant to serve only the `en` locale and the `/spanish` page shouldn't be available.\n\n### Describe the bug\n\nWhen using customRoutes: 'config' with manually specified pages, everything works as expected. However, defineI18nRoute appears to be broken in this edge case.\n\n### Additional context\n\nThis might be related to that issue: https://github.com/nuxt-modules/i18n/issues/3226\n\n### Logs\n\n```shell\n\n```",[3226],{"name":3175,"color":3176},3721,"defineI18nRoute includes routes for other locales when using 'no_prefix' and differentDomains","2025-07-11T09:46:02Z","https://github.com/nuxt-modules/i18n/issues/3721",0.7332368,{"description":3233,"labels":3234,"number":3238,"owner":3178,"repository":3179,"state":3239,"title":3240,"updated_at":3241,"url":3242,"score":3243},"### Environment\r\n\r\n------------------------------\r\n- Operating System: Windows_NT\r\n- Node Version: v21.6.2\r\n- Nuxt Version: 3.11.0\r\n- CLI Version: 3.10.1\r\n- Nitro Version: 2.9.4\r\n- Package Manager: npm@10.2.4\r\n- Builder: -\r\n- User Config: modules, devtools\r\n- Runtime Modules: @nuxtjs/i18n@8.2.0\r\n- Build Modules: -\r\n------------------------------\r\n\r\n### Reproduction\r\n\r\nhttps://github.com/frasza/i18n-warn\r\n\r\nSpin up dev server, open dev tools and click on NuxtLink. Warning appears.\r\n\r\n### Describe the bug\r\n\r\nRecently I noticed warning popup in my Nuxt project and I have tried to set up fresh Nuxt project with i18n dependacy and I still get warning when for navigating across pages.\r\n\r\nWarning:\r\n```\r\n[Vue warn]: Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.\r\n```\r\n\r\nNoticed that I get warning the moment I add i18n to the modules.\r\n\r\n### Additional context\r\n\r\n_No response_\r\n\r\n### Logs\r\n\r\n_No response_",[3235],{"name":3236,"color":3237},"🍰 p2-nice-to-have","0e8a16",2856,"closed","Warning: Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.","2025-05-23T11:11:02Z","https://github.com/nuxt-modules/i18n/issues/2856",0.67718333,{"description":3245,"labels":3246,"number":3253,"owner":3178,"repository":3179,"state":3239,"title":3254,"updated_at":3255,"url":3256,"score":3257},"### Environment\n\n- Node Version: v20.11.0\r\n- Nuxt Version: 3.10.1\r\n- CLI Version: 3.10.0\r\n- Nitro Version: 2.8.1\r\n- Package Manager: yarn@4.0.1\r\n- Builder: -\r\n- User Config: modules, i18n, devtools\r\n- Runtime Modules: @nuxtjs/i18n@8.1.0\r\n- Build Modules: -\n\n### Reproduction\n\nhttps://stackblitz.com/edit/github-c7te5q-s3x21p?file=app.vue\n\n### Describe the bug\n\nAlso if i've set \r\n```js\r\nsetI18nParams({\r\n it: { blog: 'blog-1-it' },\r\n de: { blog: 'blog-1-de' },\r\n en: { blog: undefined },\r\n})\r\n```\r\n\r\nthe `og:locale:alternate` for the `en` lang it was addes\r\n\r\n```html\r\n\u003Cmeta id=\"i18n-og-alt-en\" property=\"og:locale:alternate\" content=\"en\">\r\n```\n\n### Additional context\n\n_No response_\n\n### Logs\n\n_No response_",[3247,3250],{"name":3248,"color":3249},"🔨 p3-minor-bug","fbca04",{"name":3251,"color":3252},"scope: seo","30CDE0",2782,"Allow disabling page per locale with `useSetI18nParams`","2025-05-25T10:23:04Z","https://github.com/nuxt-modules/i18n/issues/2782",0.6977185,{"description":3259,"labels":3260,"number":3263,"owner":3178,"repository":3179,"state":3239,"title":3264,"updated_at":3265,"url":3266,"score":3267},"### Environment\n\n``` \n- Operating System: Darwin\n- Node Version: v22.16.0\n- Nuxt Version: 4.0.3\n- CLI Version: 3.28.0\n- Nitro Version: 2.12.4\n- Package Manager: npm@10.9.2\n- Builder: -\n- User Config: compatibilityDate, devtools, modules, css, vite, routeRules, i18n, sanctum, runtimeConfig, uiPro\n- Runtime Modules: @nuxt/eslint@1.8.0, @nuxt/image@1.11.0, @nuxt/scripts@0.11.10, @nuxt/ui-pro@3.3.2, @nuxtjs/i18n@10.0.5, nuxt-auth-sanctum@1.1.2, dayjs-nuxt@2.1.11\n- Build Modules: -\n```\n\n### Reproduction\n\n1. Create translation files in the default location:\n```\ni18n/locales/es.ts\ni18n/locales/en.ts\n```\n\n2. Configure nuxt.config.ts:\n```ts\nrouteRules: {\n \"/\": { prerender: true },\n \"/en\": { prerender: true },\n...\n// We have prerender y routes, because are landings and astatic\n},\n i18n: {\n defaultLocale: \"es\",\n strategy: \"prefix_except_default\",\n baseUrl: process.env.NUXT_PUBLIC_FRONTEND_URL,\n locales: [\n { code: \"en\", name: \"English\", file: \"en.ts\", language: \"en\" },\n { code: \"es\", name: \"Español\", file: \"es.ts\", language: \"es\" },\n ],\n}\n```\n\n3. layouts/default.vue\n```vue\n\u003Cscript lang=\"ts\" setup>\nconst i18nHead = useLocaleHead({\n dir: true,\n seo: true,\n});\nconst { t } = useI18n();\nconst route = useRoute();\nconst config = useRuntimeConfig();\nconst { locale } = useI18n();\nconst title = computed(() =>\n t((route.meta.title as string) ?? \"layout.default.title\", {\n appName: config.public.appName,\n })\n);\ntype Meta = {\n property?: string;\n content: string;\n name?: string;\n};\nconst metaTags = computed\u003CMeta[]>(() => {\n const description = t(\n (route.meta.description as string) ?? \"layout.default.description\"\n );\n\n return [\n ...(i18nHead.value.meta || []),\n {\n name: \"description\",\n content: description,\n },\n {\n property: \"og:title\",\n content: title.value,\n },\n {\n property: \"og:description\",\n content: description,\n },\n {\n property: \"og:image\",\n content: `/media/common/${locale.value}/og.webp`,\n },\n {\n property: \"og:url\",\n content: `${config.public.frontendUrl}${route.fullPath}`,\n },\n {\n property: \"og:locale\",\n content: i18nHead.value.htmlAttrs.lang,\n },\n {\n property: \"og:site_name\",\n content: config.public.appName as string,\n },\n {\n property: \"og:type\",\n content: \"website\",\n },\n {\n name: \"twitter:card\",\n content: \"summary_large_image\",\n },\n {\n name: \"twitter:title\",\n content: title.value,\n },\n {\n name: \"twitter:description\",\n content: description,\n },\n {\n name: \"twitter:image\",\n content: `/media/common/${locale.value}/og.webp`,\n },\n {\n name: \"robots\",\n // Only if we are in production\n content:\n config.public.vercelEnv == \"production\"\n ? \"index, follow\"\n : \"noindex, nofollow\",\n },\n ] as Meta[];\n});\n\nconst links = computed(() => [\n ...(i18nHead.value.link || []),\n { rel: \"icon\", type: \"image/x-icon\", href: \"/favicon.ico\" },\n]);\n\u003C/script>\n\n\u003Ctemplate>\n \u003CHtml :lang=\"i18nHead.htmlAttrs.lang\" :dir=\"i18nHead.htmlAttrs.dir\">\n \u003CHead>\n \u003CTitle>{{ title }}\u003C/Title>\n \u003Ctemplate v-for=\"link in links\" :key=\"link.id\">\n \u003CLink\n :id=\"link.id\"\n :rel=\"link.rel\"\n :href=\"link.href\"\n :hreflang=\"link.hreflang\"\n />\n \u003C/template>\n \u003Ctemplate v-for=\"meta in metaTags\" :key=\"meta.id\">\n \u003CMeta\n :property=\"meta.property\"\n :content=\"meta.content\"\n :name=\"meta.name\"\n />\n \u003C/template>\n \u003C/Head>\n \u003CBody>\n \u003CAppHeader />\n \u003Cslot />\n \u003CAppFooter />\n \u003C/Body>\n \u003C/Html>\n\u003C/template>\n\n\u003Cstyle>\u003C/style>\n```\n\n4. Some page\n```vue\ndefinePageMeta({\n layout: \"default\",\n title: \"essay.meta.title\",\n description: \"essay.meta.description\",\n});\n```\n\n5. Example of translation file:\n```\nexport default {\n appHeader: {\n tools: \"Herramientas\",\n summary: {\n title: \"Resumidor\",\n description: \"Resume textos de forma automática.\",\n },\n....\n```\n\n\n\n### Describe the bug\n\nWhen using the current Nuxt i18n setup (translations inside i18n/locales/es.ts, i18n/locales/en.ts, etc.), translation keys appear in the \u003Chead> instead of resolved translations.\n\nFor example, Google is indexing essay.meta.title instead of the translated string because the SSR HTML is rendered before locale messages are available. The client later fetches /_i18n/es/messages.json, but if that request fails or is delayed, the \u003Ctitle> and \u003Cmeta> remain as raw keys. This is problematic for SEO since crawlers usually index the raw SSR HTML.\n\nWhen inspect with search console:\n\u003Cimg width=\"399\" height=\"76\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/9b9fcc11-0244-4eab-a624-1e60ac29d6e3\" />\n\u003Cimg width=\"400\" height=\"223\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/3f70c9a6-ec7e-4a20-9ec1-16dc62958297\" />\nIn google SERP\n\u003Cimg width=\"705\" height=\"151\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/ea3e3b89-9bcf-421d-96cc-5987aff8a64c\" />\n\n### Additional context\n\n#### Documentation issues\n\nIn older versions there was a lazy: true/false option. This no longer exists, but the migration path is unclear.\n\nIt’s not documented whether .ts files (with export default {}) behave the same as .json for SSR vs client-only loading.\n\nThe docs show how to use file/files, but don’t explain how to guarantee SSR has messages ready for SEO-critical content like \u003Chead>.\n\nRight now it’s unclear if the messages are truly lazy-loaded, or if something else prevents them from being available at SSR.\n\n### Logs\n\n```shell\n\n```",[3261,3262],{"name":3175,"color":3176},{"name":3210,"color":3211},3794,"SEO issue with SSR translations and unclear lazy-loading behavior","2025-10-07T14:52:13Z","https://github.com/nuxt-modules/i18n/issues/3794",0.7042701,{"description":3269,"labels":3270,"number":3273,"owner":3178,"repository":3179,"state":3239,"title":3274,"updated_at":3275,"url":3276,"score":3277},"### Environment\n\n- Operating System: `Windows_NT`\n- Node Version: `v22.14.0`\n- Nuxt Version: `3.16.2`\n- CLI Version: `3.24.0`\n- Nitro Version: `2.11.8`\n- Package Manager: `npm@10.8.1`\n- Builder: `-`\n- User Config: `modules`, `imports`, `devtools`, `app`, `css`, `site`, `runtimeConfig`, `devServer`, `experimental`, `compatibilityDate`, `nitro`, `vite`, `typescript`, `eslint`, `graphqlMiddleware`, `i18n`, `image`, `leaflet`, `multiCache`, `primevue`\n- Runtime Modules: `@pinia/nuxt@0.10.1`, `pinia-plugin-persistedstate/nuxt@4.2.0`, `nuxt-multi-cache@3.4.0`, `nuxt-graphql-middleware@4.3.2`, `normalizedModule()`, `@nuxtjs/i18n@9.4.0`, `@nuxtjs/seo@3.0.1`, `@nuxtjs/leaflet@1.2.6`, `nuxt-splide@1.1.1`, `@nuxt/icon@1.11.0`, `@primevue/nuxt-module@4.3.2`, `@nuxt/image@1.10.0`, `@formkit/auto-animate/nuxt@0.8.2`, `@vueuse/nuxt@13.0.0`, `nuxt-lodash@2.5.3`, `nuxt-monaco-editor@1.3.1`, `dayjs-nuxt@2.1.11`, `@nuxt/eslint@1.2.0`\n- Build Modules: `-`\n\n\n### Reproduction\n\n1. Create a new Nuxt 3 project and install @nuxtjs/i18n. Configure the module as needed.\n\n2. Create the following folder structure within the pages directory:\n\n```\npages/\n└── blog/\n├── [[category]]/\n│ ├── [article].html.vue\n│ └── index.vue\n└── index.vue\n```\n\n3. Add a basic HTML template to each of the .vue files for visual identification. For example:\n\npages/blog/index.vue:\n```html\n\u003Ctemplate>\n\n\u003Cdiv>Blog Index (root)\u003C/div>\n\u003C/template>\n```\npages/blog/[[category]]/index.vue:\n```html\n\u003Ctemplate>\n\n\u003Cdiv>Category Index: {{ $route.params.category }}\u003C/div>\n\u003C/template>\n```\npages/blog/[[category]]/[[article]].html.vue:\n```html\n\u003Ctemplate>\n\n\u003Cdiv>Article: {{ $route.params.article }} in Category: {{ $route.params.category }}\u003C/div>\n\u003C/template>\n```\n4. Run Nuxt in development mode (npm run dev or yarn dev or pnpm dev).\n\n5. Navigate to the following URLs in your browser:\n\n - /blog/ - Expected to render \"Blog Index (root)\" (Works as expected).\n \n - /blog/article2.html - Expected to render [article].html.vue with category as undefined and article as article2. Current Behavior: Instead, it seems to attempt to render [[category]]/index.vue, possibly interpreting \"article2.html\" as the category parameter, leading to unexpected output or a 404.\n \n - /blog/category1/ - Expected to render \"Category Index: category1\" (Works as expected).\n \n - /blog/category1/article1.html - Expected to render \"Article: article1 in Category: category1\" (Works as expected).\n\n\nMinimal reproduction:\nhttps://stackblitz.com/edit/github-wp13roib-mzypd8gg\n\n### Describe the bug\n\nWith @nuxtjs/i18n enabled, accessing a dynamic route [[article]].html.vue within a directory with an optional dynamic parameter [[category]] directly with the .html extension results in incorrect route resolution. Instead of correctly identifying the optional category parameter as missing and resolving to the [article].html.vue route, Nuxt seems to be trying to match the URL against the [[category]]/index.vue route, misinterpreting the \"article2.html\" segment.\n\n### Additional context\n\nThis issue only occurs when @nuxtjs/i18n is active. Without the module, a different routing issue arises (documented in the next issue). This suggests an interaction between the Nuxt routing and @nuxtjs/i18n in handling optional dynamic parameters with file extensions.\n\n\n\n### Logs\n\n```shell\n\n```",[3271],{"name":3272,"color":3249},"upstream issue",3504,"Dynamic route with optional parent parameter fails to resolve correctly when accessed directly with extension","2025-05-22T15:54:36Z","https://github.com/nuxt-modules/i18n/issues/3504",0.7072831,{"description":3279,"labels":3280,"number":3284,"owner":3178,"repository":3179,"state":3239,"title":3285,"updated_at":3286,"url":3287,"score":3288},"### Environment\r\n\r\n------------------------------\r\n- Operating System: Linux\r\n- Node Version: v18.16.0\r\n- Nuxt Version: 3.7.1\r\n- CLI Version: 3.7.3\r\n- Nitro Version: 2.6.2\r\n- Package Manager: pnpm@8.6.12\r\n- Builder: -\r\n- User Config: extends, telemetry, ssr, fontMetrics, nitro, routeRules, runtimeConfig, build, modules, delayHydration, image, components, bugsnag, devtools, i18n, experimental, pwa, app, dnGraphqlClient, vite, plugins\r\n- Runtime Modules: @nuxtjs/fontaine@0.4.1, @pinia/nuxt@0.4.11, @nuxt/devtools@0.8.2, @vite-pwa/nuxt@0.1.0, nuxt-bugsnag@7.0.0, @digitalnatives/css-variables/nuxt@5.1.3, @digitalnatives/graphql-client@4.0.3, @nuxtjs/i18n@8.0.0-rc.4, @nuxt/image@1.0.0-rc.1, nuxt-delay-hydration@1.2.1, @digitalnatives/composables@2.0.1\r\n- Build Modules: -\r\n------------------------------\r\n\r\n### Reproduction\r\n\r\nA naïve reproduction is the following:\r\n\r\n```js\r\nconst route = useRoute(); \r\nconst locale = useLocale();\r\n\r\n// On switch, this will first log the NEW locale with the OLD path, then it will trigger a second time, logging the NEW locale with the NEW path\r\nwatchEffect(() => {\r\n console.log(route.fullPath);\r\n console.log(locale);\r\n});\r\n```\r\n\r\nAdd it to a global component in the layout that doesn't get mounted/umounted on URI change.\r\n\r\n\r\n\r\n### Describe the bug\r\n\r\nWhen using prefixed routes and a language switcher as described in the docs, it seems the locale changes before the route does.\r\n\r\nWhen watching the locale with `useAsyncData()` or `useLazyAsyncData()` this will cause the results of this call to be associated with the wrong URL/path, which then has a side-effect of refetching API data which was already pre-rendered in Nuxt static mode. Therefore, the pre-rendered payload is NOT used in this pattern, even though it should.\r\n\r\nI've also seen this lead to data mismatching to the wrong paths, but this is a bit harder to create a reproduction for.\r\n\r\n### Additional context\r\n\r\nMy current workaround is this;\r\n\r\ncomposable:\r\n```js\r\nexport const useVariables = () => {\r\n const route = useRoute();\r\n const { $i18n }: any = useNuxtApp();\r\n // Don't automatically update the site and url to ensure they both change at the same time\r\n variables.uri = toValue(route.path);\r\n variables.lang = toValue($i18n?.localeProperties)?.apiLanguageHandle;\r\n\r\n // Update variables manually when the route changes, at this point both the locale AND the URI are correct.\r\n watch(() => route.path, () => {\r\n variables.uri = toValue(route.path);\r\n variables.lang = toValue($i18n?.localeProperties)?.apiLanguageHandle;\r\n });\r\n return { variables };\r\n});\r\n```\r\n\r\nthen:\r\n\r\n```js\r\nconst { variables } = useVariables();\r\nuseAsyncData(() => { console.log('trigger!') } , { watch: [ variables ] });\r\n```\r\n\r\n\r\nPerhaps it would be possible to inject the locale & locale properties into the localized route meta? That way we could just watch the route and apply the language from that.\r\n\r\nRelates to #2278 \r\n\r\n### Logs\r\n\r\n_No response_",[3281],{"name":3282,"color":3283},"switch locale","D2FCC6",2377,"`locale` changes BEFORE the route path does, which causes issues with (static) `asyncData`-payloads","2025-05-16T11:44:11Z","https://github.com/nuxt-modules/i18n/issues/2377",0.71292007,["Reactive",3290],{},["Set"],["ShallowReactive",3293],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$fQxpU6uK3KBRFLFq7S4qxfBtUb27jaZRfLNgZWe26IX4":-1},"/nuxt-modules/i18n/3049"]