\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```",[3235,3236],{"name":3177,"color":3178},{"name":3180,"color":3181},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.6941312,{"description":3243,"labels":3244,"number":3249,"owner":3183,"repository":3184,"state":3227,"title":3250,"updated_at":3251,"url":3252,"score":3253},"### Environment\r\n\r\n------------------------------\r\n- Operating System: Darwin\r\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: -\r\n------------------------------\r\n\r\n\r\n### Reproduction\r\n\r\nhttps://stackblitz.com/edit/github-c7te5q-rzxba2\r\n\r\n### Describe the bug\r\n\r\n`useLocaleHead` doesn't work with `useSetI18nParams` because `\u003Clink rel=\"alternate\" />` aren't sync. \r\n\r\n### Additional context\r\n\r\nif i go from Homepage `/it` to the blog page `/it/blog-1-ita` using the **Go at Blog Page** button, the alternate links don't change; but i've set all the i18nParams\r\n```js\r\nsetI18nParams({\r\n it: { blog: 'blog-1-it' },\r\n de: { blog: 'blog-1-de' },\r\n en: false,\r\n})\r\n```\r\n\r\nIf i refresh the page when i'm in the blog page, the `\u003Clink rel=\"alternate\" />` are duplicated (and also `canonical`).\r\n```html\r\n\u003Clink rel=\"alternate\" href=\"https://www.dummy.com/en/blog-1-ita\" hreflang=\"en\" data-hid=\"7fcee50\">\r\n\u003Clink rel=\"alternate\" href=\"https://www.dummy.com/it/blog-1-ita\" hreflang=\"it\" data-hid=\"08fce45\">\r\n\u003Clink rel=\"alternate\" href=\"https://www.dummy.com/de/blog-1-ita\" hreflang=\"de\" data-hid=\"5d718b2\">\r\n\u003Clink rel=\"alternate\" href=\"https://www.dummy.com/it/blog-1-ita\" hreflang=\"x-default\" data-hid=\"6527e7a\">\r\n\u003Clink rel=\"canonical\" href=\"https://www.dummy.com/it/blog-1-ita\" data-hid=\"5cca6f5\">\r\n\r\n\u003Clink id=\"i18n-alt-it\" rel=\"alternate\" href=\"https://www.dummy.com/it/blog-1-it\" hreflang=\"it\">\r\n\u003Clink id=\"i18n-alt-de\" rel=\"alternate\" href=\"https://www.dummy.com/de/blog-1-de\" hreflang=\"de\">\r\n\u003Clink id=\"i18n-xd\" rel=\"alternate\" href=\"https://www.dummy.com/it/blog-1-it\" hreflang=\"x-default\">\r\n\u003Clink id=\"i18n-can\" rel=\"canonical\" href=\"https://www.dummy.com/it/blog-1-ita\">\r\n```\r\n\r\n### Logs\r\n\r\n_No response_",[3245,3246],{"name":3221,"color":3222},{"name":3247,"color":3248},"scope: seo","30CDE0",2779,"`useSetI18nParams` and `useLocaleHead` `rel=\"alternate\"` aren't sync. ","2025-07-20T20:12:38Z","https://github.com/nuxt-modules/i18n/issues/2779",0.6955716,{"description":3255,"labels":3256,"number":3259,"owner":3183,"repository":3184,"state":3227,"title":3260,"updated_at":3261,"url":3262,"score":3263},"### Environment\n\n- Operating System: Darwin\r\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-j2hjui?file=app.vue\n\n### Describe the bug\n\nAlso if i don't set `useLocaleHead()` with `useHead`, `setI18nParams` automatically adds `\u003Clink rel=\"alternate\" />` and `og:property`. \r\n\r\n```html\r\n\u003Clink id=\"i18n-alt-it\" rel=\"alternate\" href=\"https://www.dummy.com/it/blog-1-it\" hreflang=\"it\">\r\n\u003Clink id=\"i18n-alt-de\" rel=\"alternate\" href=\"https://www.dummy.com/de/blog-1-de\" hreflang=\"de\">\r\n\u003Clink id=\"i18n-xd\" rel=\"alternate\" href=\"https://www.dummy.com/it/blog-1-it\" hreflang=\"x-default\">\r\n\u003Clink id=\"i18n-can\" rel=\"canonical\" href=\"https://www.dummy.com/it/blog-1-ita\">\r\n\u003Cmeta id=\"i18n-og-url\" property=\"og:url\" content=\"https://www.dummy.com/it/blog-1-ita\">\r\n\u003Cmeta id=\"i18n-og\" property=\"og:locale\" content=\"it\">\r\n\u003Cmeta id=\"i18n-og-alt-en\" property=\"og:locale:alternate\" content=\"en\">\r\n\u003Cmeta id=\"i18n-og-alt-de\" property=\"og:locale:alternate\" content=\"de\">\r\n```\n\n### Additional context\n\nWow, that's good, but why only whit `setI18nParams` and not in the othter pages? If i don't use `setI18nParams` i have to set all this code on `App.vue`\r\n```js\r\nconst localeHead = useLocaleHead({\r\n addSeoAttributes: true,\r\n addDirAttribute: true,\r\n})\r\n\r\nuseHead({\r\n htmlAttrs: () => localeHead.value.htmlAttrs ?? {},\r\n link: () => localeHead.value.link ?? [],\r\n meta: () => localeHead.value.meta ?? []\r\n})\r\n```\r\n\r\nSo either everything is handled automatically or everything is handled via the mix of `useLocaleHead` and `useHead`\n\n### Logs\n\n_No response_",[3257,3258],{"name":3221,"color":3222},{"name":3247,"color":3248},2780,"`setI18nParams` automatically adds `\u003Clink rel=\"alternate\" />`","2025-05-25T10:23:03Z","https://github.com/nuxt-modules/i18n/issues/2780",0.69722885,{"description":3265,"labels":3266,"number":3272,"owner":3183,"repository":3184,"state":3227,"title":3273,"updated_at":3274,"url":3275,"score":3276},"### Environment\n\nOperating System: Windows_NT\n- Node Version: v20.19.0\n- Nuxt Version: 3.19.0\n- CLI Version: 3.28.0\n- Nitro Version: 2.12.4\n- Package Manager: npm@10.8.2\n- Builder: -\n- User Config: compatibilityDate, devtools, app, modules, i18n, runtimeConfig, css, nitro, image, experimental, dir\n- Runtime Modules: @nuxt/content@3.6.3, @nuxt/eslint@1.9.0, @nuxt/image@1.11.0, @nuxt/scripts@0.11.13, @nuxt/test-utils@3.19.2, @pinia/nuxt@0.11.2, @nuxtjs/i18n@10.0.6\n- Build Modules: -\n\n### Reproduction\n\nExample:\nProject A:\nhttps://xxx.com/en/xxx1\n\nProject B:\nhttps://xxx.com/en/xxx2\n\nBoth applications will request their translations from:\nhttps://xxx.com/_i18n/en/messages.json\n\nThis causes collisions, because the i18n resources from one project may overwrite or be mixed with those from another project.\n\nExpected behavior\nThere should be a way to namespace or scope the i18n assets per application, for example:\n\n/xxx1/_i18n/en/messages.json\n/xxx2/_i18n/en/messages.json\n\nOr, ideally, allow configuration of the base path for the i18n JSON files in nuxt.config.ts, similar to how app.baseURL or build.publicPath works.\n\nActual behavior\n\nCurrently, the i18n assets are always generated under the root /_i18n/ path, and there is no configuration option to change this.\n\nNotes\n\nIn Nuxt 2 (@nuxtjs/i18n v8), translation files were bundled via Webpack chunks and respected build.publicPath, so they could be scoped by project.\n\nIn Nuxt 3 (@nuxtjs/i18n v10), translation files are generated as Nitro public assets, with a hard-coded path.\n\nThis makes it difficult to host multiple Nuxt apps under the same domain without a reverse proxy rewrite or manual Nitro middleware.\n\n### Describe the bug\n\nWhen deploying multiple Nuxt 3 projects under the same domain, the @nuxtjs/i18n module (v10) always generates and serves translation files from the fixed path:\n/_i18n/{locale}/messages.json\n\nThis leads to conflicts between different projects, because all of them try to read from the same global /_i18n/ endpoint.\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3267,3270,3271],{"name":3268,"color":3269},"need more info","e295d6",{"name":3177,"color":3178},{"name":3180,"color":3181},3806,"@nuxtjs/i18n v10: Multiple Nuxt apps on the same domain conflict because i18n JSON files are always served from /_i18n/...","2025-09-04T10:49:15Z","https://github.com/nuxt-modules/i18n/issues/3806",0.70213205,{"description":3278,"labels":3279,"number":3281,"owner":3183,"repository":3184,"state":3227,"title":3282,"updated_at":3283,"url":3284,"score":3285},"### Environment\n\n- Operating System: Darwin\n- Node Version: v23.9.0\n- Nuxt Version: 3.17.4\n- CLI Version: 3.25.1\n- Nitro Version: 2.11.12\n- Package Manager: bun@1.2.12\n- Builder: -\n- User Config: compatibilityDate, devtools, future, experimental, modules, runtimeConfig, css, app, ui, icon, fonts, image, nitro, i18n, turnstile\n- Runtime Modules: @nuxt/ui@3.1.2, @nuxt/image@1.10.0, @nuxt/scripts@0.11.7, @nuxtjs/i18n@9.5.4, @nuxtjs/turnstile@1.0.0, nuxt-auth-utils@0.5.20\n- Build Modules: -\n\n### Reproduction\n\nNuxtLinkLocale's job should be to just convert the to parameter to the correct path. Right now it does too much!\n\nWhether or not a link is external is not determined by target! It should only control the transformation of to.\n\n### Describe the bug\n\n#3252\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3280],{"name":3177,"color":3178},3631,"Respect NuxtLink props, just like NuxtLink respects VueRouteLink!","2025-05-22T11:29:36Z","https://github.com/nuxt-modules/i18n/issues/3631",0.7043561,["Reactive",3287],{},["Set"],["ShallowReactive",3290],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$fNXPehPttmw-CXC_OT6mNJpVdlACte4xOT7aAFTNAYyI":-1},"/nuxt-modules/i18n/3099"]