\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鈥檚 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鈥檛 explain how to guarantee SSR has messages ready for SEO-critical content like \u003Chead>.\n\nRight now it鈥檚 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```",[3260,3261],{"name":3198,"color":3199},{"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.67981184,{"description":3268,"labels":3269,"number":3275,"owner":3187,"repository":3188,"state":3252,"title":3276,"updated_at":3277,"url":3278,"score":3279},"### 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```",[3270,3273,3274],{"name":3271,"color":3272},"need more info","e295d6",{"name":3198,"color":3199},{"name":3178,"color":3179},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.6974616,{"description":3281,"labels":3282,"number":3284,"owner":3187,"repository":3188,"state":3252,"title":3285,"updated_at":3286,"url":3287,"score":3288},"### Environment\n\n- Operating System: `Darwin`\n- Node Version: `v22.15.1`\n- Nuxt Version: `3.15.4`\n- CLI Version: `3.21.1`\n- Nitro Version: `2.10.4`\n- Package Manager: `pnpm@9.15.0`\n- Builder: `-`\n- User Config: `extends`, `devtools`, `imports`, `site`, `experimental`, `$production`, `srcDir`, `runtimeConfig`, `components`, `eslint`, `modules`, `reka`, `dayjs`, `icon`, `prepare`, `formkit`, `tailwindcss`, `image`, `i18n`, `statamic`, `multiTenancy`, `linkChecker`, `sitemap`, `robots`, `app`, `compatibilityDate`\n- Runtime Modules: `~/modules/nuxt-multi-tenancy`, `@nuxtjs/i18n@9.5.4`, `@nuxt/eslint@0.3.13`, `@formkit/nuxt@1.6.9`, `@vueuse/nuxt@12.5.0`, `dayjs-nuxt@2.1.11`, `nuxt-prepare@2.3.1`, `reka-ui/nuxt@2.2.1`\n- Build Modules: `-`\n\n### Reproduction\n\nCan't\n\n### Describe the bug\n\nI keep getting warnings for missing baseUrl, how can i fix this? everything seems to be working fine, both on local and production.\n\nIf i use differentDomains option, the warning goes away, but i get missing domain for locale errors.\n\n\u003Cimg width=\"954\" height=\"56\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/47081b37-65fa-4da6-ab5f-f7eb2a21addf\" />\n\n### Additional context\n\n```ts\n// nuxt.config.ts\n\nimport { domains } from \"./locale-domains.config\";\n\nexport default defineNuxtConfig({\n // I18N\n i18n: {\n // baseUrl: process.env.NUXT_PUBLIC_I18N_BASE_URL || process.env.NUXT_SITE_URL,\n strategy: \"prefix\",\n multiDomainLocales: true,\n detectBrowserLanguage: false,\n langDir: \"./../src/i18n/locales/\",\n vueI18n: \"./../src/i18n/config\",\n locales: [\n {\n code: \"nl\",\n files: [\"nl-NL.ts\"],\n language: \"nl-NL\",\n domains: [\n ...[domains.nl, domains.be, domains.youkids_nl, domains.youkids_be],\n ] as string[],\n defaultForDomains: [\n ...[domains.nl, domains.be, domains.youkids_nl, domains.youkids_be],\n ] as string[],\n name: \"Nederlands\",\n isCatchallLocale: true,\n },\n {\n code: \"en\",\n file: \"en-GB.ts\",\n language: \"en-GB\",\n domains: [\n ...[domains.uk, domains.nl, domains.youkids_uk, domains.youkids_nl],\n ] as string[],\n defaultForDomains: [\n ...[domains.uk, domains.youkids_uk],\n ] as string[],\n name: \"English\",\n },\n {\n code: \"fr\",\n file: \"fr-FR.ts\",\n language: \"fr-FR\",\n domains: [\n ...[domains.fr, domains.be, domains.youkids_fr, domains.youkids_be],\n ] as string[],\n defaultForDomains: [\n ...[domains.fr, domains.youkids_fr],\n ] as string[],\n name: \"Fran莽ais\",\n },\n {\n code: \"de\",\n file: \"de-DE.ts\",\n language: \"de-DE\",\n domains: [\n ...[domains.de, domains.youkids_de],\n ] as string[],\n defaultForDomains: [\n ...[domains.de, domains.youkids_de],\n ] as string[],\n name: \"Deutsch\",\n },\n ],\n customRoutes: \"page\",\n },\n});\n```\n\n\n```ts\n// locale-domains.config.ts\nexport const domains: Record\u003Cstring, string | undefined> = {\n nl: process.env.DOMAIN_NL,\n be: process.env.DOMAIN_BE,\n fr: process.env.DOMAIN_FR,\n de: process.env.DOMAIN_DE,\n uk: process.env.DOMAIN_UK,\n youkids_nl: process.env.DOMAIN_YOUKIDS_NL,\n youkids_be: process.env.DOMAIN_YOUKIDS_BE,\n youkids_fr: process.env.DOMAIN_YOUKIDS_FR,\n youkids_de: process.env.DOMAIN_YOUKIDS_DE,\n youkids_en: process.env.DOMAIN_YOUKIDS_EN,\n} as const;\n\nexport const developmentDomains: Record\u003Cstring, string> = {\n nl: \"localhost:3000\",\n be: \"be.localhost:3000\",\n fr: \"fr.localhost:3000\",\n de: \"de.localhost:3000\",\n uk: \"uk.localhost:3000\",\n youkids_nl: \"nl.youkids.localhost:3000\",\n youkids_be: \"be.youkids.localhost:3000\",\n youkids_fr: \"fr.youkids.localhost:3000\",\n youkids_de: \"de.youkids.localhost:3000\",\n youkids_en: \"en.youkids.localhost:3000\",\n} as const;\n\nexport const i18nDomains = [domains.nl, domains.be, domains.fr, domains.de, domains.uk, domains.youkids_nl, domains.youkids_be, domains.youkids_fr, domains.youkids_de, domains.youkids_en] as string[];\nexport const developmentI18nDomains = [developmentDomains.nl, developmentDomains.be, developmentDomains.fr, developmentDomains.de, developmentDomains.uk, developmentDomains.youkids_nl, developmentDomains.youkids_be, developmentDomains.youkids_fr, developmentDomains.youkids_de, developmentDomains.youkids_en] as string[];\n```\n\n### Logs\n\n```shell\nWARN I18n baseUrl is required to generate valid SEO tag links.\n```",[3283],{"name":3198,"color":3199},3727,"Warn: I18n baseUrl is required to generate valid SEO tag links.","2025-07-20T20:16:57Z","https://github.com/nuxt-modules/i18n/issues/3727",0.6981668,["Reactive",3290],{},["Set"],["ShallowReactive",3293],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$f7fHEZqw766wUJfzdo2Hm_mDHDGMBWbakilsN5Uxc58g":-1},"/nuxt-modules/i18n/2928"]