\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3236,3237],{"name":3175,"color":3176},{"name":3178,"color":3179},3807,"closed","静态生成时,.output下 locales语言文件是空的","2025-09-05T01:23:11Z","https://github.com/nuxt-modules/i18n/issues/3807",0.6655789,{"description":3245,"labels":3246,"number":3251,"owner":3181,"repository":3182,"state":3239,"title":3252,"updated_at":3253,"url":3254,"score":3255},"### Environment\n\n------------------------------\n- Operating System: Darwin\n- Node Version: v22.14.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: runtimeConfig, graphql-client, app, site, seo, devtools, nitro, build, css, modules, components, sentry, sourcemap, googleFonts, dayjs, i18n, image, compatibilityDate\n- Runtime Modules: @nuxtjs/google-fonts@3.2.0, @nuxtjs/i18n@10.0.4, @nuxt/image@1.11.0, @nuxtjs/tailwindcss@6.14.0, @pinia/nuxt@0.11.2, nuxt-graphql-client@0.2.46, @nuxtjs/seo@3.1.0, dayjs-nuxt@2.1.11, @sentry/nuxt/module@10.4.0, @vite-pwa/nuxt@1.0.4\n- Build Modules: -\n------------------------------\n\n### Reproduction\n\nNot sure\n\n### Describe the bug\n\nI have a `app/pages/businesses/[slug]/register.vue` and a `app/pages/businesses/[slug]/dotoos/index.vue` page which both broke when updating to 10.0.4:\nThey return a 404 page not found.\n\nNow for example in `app/pages/businesses/[slug]/dotoos/index.vue` I have this:\n```vue\ndefineI18nRoute({\n paths: {\n en: '/businesses/[business_slug]/dotoos',\n nl: '/bedrijven/[business_slug]/dotoos',\n },\n})\n```\n\nSo my url `http://localhost:3000/bedrijven/test/dotoos` should work.\n\nI deleted my lockfile, node modules AND `.nuxt` file and tried again, same problem. When I pin the version to 10.0.3 it works....\n\nThe strange thing, in my devtools I see those routes, note the `businesses-slug-dotoos___nl`! \n\n\u003Cimg width=\"1069\" height=\"122\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/32264c2b-6817-46f1-976d-aad85bc269c1\" />\nIt should be `/bedrijven/business_slug?/dotoos`!\n\nSomething is off here, unless im doing something wrong.\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3247,3248],{"name":3178,"color":3179},{"name":3249,"color":3250},"possible regression","B78041",3779,"Page not found on 10.0.4","2025-08-13T12:31:07Z","https://github.com/nuxt-modules/i18n/issues/3779",0.69065046,{"description":3257,"labels":3258,"number":3261,"owner":3181,"repository":3182,"state":3239,"title":3262,"updated_at":3263,"url":3264,"score":3265},"### Environment\r\n\r\n------------------------------\r\n- Operating System: Darwin\r\n- Node Version: v22.2.0\r\n- Nuxt Version: 3.12.3\r\n- CLI Version: 3.12.0\r\n- Nitro Version: 2.9.7\r\n- Package Manager: pnpm@9.1.2\r\n- Builder: -\r\n- User Config: app, modules, i18n, components, experimental, routeRules, vuefire, imports, vite, devtools\r\n- Runtime Modules: @vueuse/nuxt@10.11.0, nuxt-lodash@2.5.3, @pinia/nuxt@0.5.1, nuxt-vuefire@1.0.2, @nuxtjs/i18n@8.3.1, @nuxt/content@2.13.1\r\n- Build Modules: -\r\n------------------------------\r\n\r\n### Reproduction\r\n\r\nNavigate to the login screen, the original route path is `/auth/signin`, not `/Auth/Signin`\r\n\r\nThis discrepancy is due to the `i18n` route override process, which takes into account the casing of the actual files or folders in the pages directory. This behavior contrasts with Nuxt and its router, which normalize all paths to lowercase.\r\n\r\n[Live Version](https://skriptjobs-layers-4.vercel.app/) \r\n \r\n### Describe the bug\r\n\r\n It would be preferable for this behavior to be configurable via a flag, rather than needing the creation of a plugin or middleware to address this undesired outcome. \r\n\r\n",[3259,3260],{"name":3178,"color":3179},{"name":3208,"color":3209},3018,"Undesired Route Path Casing Override","2025-06-03T21:54:18Z","https://github.com/nuxt-modules/i18n/issues/3018",0.6909156,{"description":3267,"labels":3268,"number":3271,"owner":3181,"repository":3182,"state":3239,"title":3272,"updated_at":3273,"url":3274,"score":3275},"### 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```",[3269,3270],{"name":3175,"color":3176},{"name":3178,"color":3179},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.6923677,{"description":3277,"labels":3278,"number":3283,"owner":3181,"repository":3182,"state":3239,"title":3284,"updated_at":3285,"url":3286,"score":3287},"### Environment\n\n- Operating System: `Darwin`\n- Node Version: `v22.14.0`\n- Nuxt Version: `4.0.1`\n- CLI Version: `3.26.4`\n- Nitro Version: `2.12.4`\n- Package Manager: `pnpm@10.12.4`\n- Builder: `-`\n- User Config: `compatibilityDate`, `devtools`, `modules`, `i18n`\n- Runtime Modules: `@nuxt/scripts@0.11.10`, `@nuxt/test-utils@3.19.2`, `@nuxtjs/i18n@10.0.2`\n- Build Modules: `-`\n\n\n### Reproduction\n\n修改多语言热更新报错,\n\n\u003Cimg width=\"3318\" height=\"334\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/ba25f21a-3216-4066-9e49-269efad06425\" />\n\n\u003Cimg width=\"1436\" height=\"474\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/378d9d5d-c5ae-48e5-a3b5-da94d168e206\" />\n\n### Describe the bug\n\n修改多语言热更新报错,\n\n\u003Cimg width=\"3318\" height=\"334\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/ba25f21a-3216-4066-9e49-269efad06425\" />\n\n\u003Cimg width=\"1436\" height=\"474\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/378d9d5d-c5ae-48e5-a3b5-da94d168e206\" />\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3279,3282],{"name":3280,"color":3281},"upstream","fbca04",{"name":3178,"color":3179},3753,"在 nuxt4.0.2 里使用 \"@nuxtjs/i18n\": \"^10.0.2\" 热更新报错","2025-07-24T09:13:52Z","https://github.com/nuxt-modules/i18n/issues/3753",0.6927609,["Reactive",3289],{},["Set"],["ShallowReactive",3292],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$fW0LbtWTNXZuF6KSH2sdwbg-Ln_jqkSosWF_dUOpZzzY":-1},"/nuxt-modules/i18n/3781"]