|\u003Cimg width=\"324\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/cd6f6927-33b3-4b85-a984-64c6cb1f53e5\" />|\n\n#### Proposed Feature: `localeDetector` Option\n\n##### Current Behavior Example\n\nTo illustrate the current behavior, consider the following scenario:\n\n* Accessing `/en/about` and `/ja/about` under the `no_prefix` strategy will not trigger locale detection based on the pathname.\n* As a result, both paths will use the language setting of the build machine during SSG, resulting in both paths potentially being generated in the same language.\n\nScreenshots and repository links demonstrating the current behavior will be provided to further clarify the issue.\n\nTo address this issue, I propose adding a new `localeDetector` option to the module configuration. This option allows specifying the methods for locale detection as follows:\n\n```typescript\ntype LocaleDetector = (\"pathname\" | \"domain\" | \"cookie\" | \"browser\")[];\n\nconst localeDetector: LocaleDetector = [\"pathname\", \"domain\", \"cookie\", \"browser\"];\n```\n\nIf `pathname` is specified, the locale will be automatically detected based on the URL pathname.\n\nThe default value of `localeDetector` will vary depending on the `strategy` value to maintain backward compatibility. For instance, when `no_prefix` is selected, the default value would be:\n\n```javascript\nlocaleDetector: [\"domain\", \"cookie\", \"browser\"]\n```\n\n##### Example Configuration for My Use Case:\n\n```javascript\nstrategy: \"no_prefix\",\nlocaleDetector: [\"pathname\", \"cookie\", \"browser\"]\n```\n\nThis configuration would resolve the issue by enabling locale detection based on pathname while maintaining backward compatibility with existing behavior.\n\nThank you for considering this feature request. I would be happy to provide further clarifications or contribute to the implementation if needed.\n\n\n### Additional information\n\n- [x] Would you be willing to help implement this feature?\n- [ ] Could this feature be implemented as a module?\n\n### Final checks\n\n- [x] Read the [contribution guide](https://nuxt.com/docs/community/contribution) (The contribution guideline of nuxt-modules/i18n is compliant with Nuxt too).\n- [x] Check existing [discussions](https://github.com/nuxt-modules/i18n/discussions) and [issues](https://github.com/nuxt/nuxt/issues).",[3218],{"name":3173,"color":3174},3609,"Add `localeDetector` option to customize locale detection during Vue component rendering","2025-05-16T18:51:35Z","https://github.com/nuxt-modules/i18n/issues/3609",0.66512275,{"description":3225,"labels":3226,"number":3239,"owner":3176,"repository":3177,"state":3178,"title":3240,"updated_at":3241,"url":3242,"score":3243},"### Environment\n\n•\tNuxt: 4.x\n•\t@nuxtjs/i18n: 10.x\n•\tNode.js: 20+\n•\tOS: macos\n•\tBrowser:chrome\n\n### Reproduction\n\n1.\tCreate a fresh Nuxt 4 project\n2.\tInstall @nuxtjs/i18n@^10\n3.\tMinimal nuxt.config.ts:\n```\nexport default defineNuxtConfig({\n i18n: {\n strategy: 'prefix',\n defaultLocale: 'en-US',\n locales: [\n { code: 'en-US', name: 'English' },\n { code: 'zh-CN', name: '简体中文' }\n ],\n detectBrowserLanguage: false,\n skipSettingLocaleOnNavigate: true,\n experimental: {\n preload: false,\n stripMessagesPayload: false\n }\n }\n})\n```\n4.\tRun npm run dev and open the homepage — you’ll see two logs for the same locale.\n\nCall stacks from first page load:\n\nCall 1 (App initialization)\n```\nloadMessagesFromClient (…/node_modules/@nuxtjs/i18n/dist/runtime/utils/load-messages.mjs:XX)\nloadAndSetLocale (…/node_modules/@nuxtjs/i18n/dist/runtime/utils/locale.mjs:XX)\nsetup (route-locale-detect.client.mjs:12)\napplyPlugins (…/node_modules/nuxt/dist/app/entry.mjs:XX)\ninitApp (…/node_modules/nuxt/dist/app/entry.mjs:XX)\n```\nCall 2 (Initial navigation / route normalization)\n```\nloadMessagesFromClient (…/node_modules/@nuxtjs/i18n/dist/runtime/utils/load-messages.mjs:XX)\nloadAndSetLocale (…/node_modules/@nuxtjs/i18n/dist/runtime/utils/locale.mjs:XX)\nsetup (route-locale-detect.client.mjs:13)\nrouter.replace / pushWithRedirect (…/node_modules/vue-router/dist/vue-router.mjs:XX)\n```\n\n### Describe the bug\n\nWhen using @nuxtjs/i18n v10 with Nuxt 4, loadMessagesFromClient is executed twice on the client during the first page load — once during app initialization and once again after the initial navigation normalization.\nEven with minimal config, browser language detection disabled, and skipSettingLocaleOnNavigate enabled, this still happens.\nFor runtime-loaded translations (e.g., from a remote API), the second internal load overwrites messages from the first, leading to inconsistent output.\n\n### Additional context\n\n•\tTried disabling detectBrowserLanguage and enabling skipSettingLocaleOnNavigate\n•\tNo custom route middlewares or manual setLocale calls\n•\tToggling experimental.preload had no effect\n•\tqueueMicrotask cannot guarantee correct overwrite order if local message files are large; only setTimeout(0) reliably delays after the second call, which is not ideal\n•\tLikely cause: route-locale-detect client plugin calls loadAndSetLocale both during app initialization and after initial navigation.\n•\tSuggestion: Provide an option to skip the second call in client mode, or internally cache per-locale loader results so repeated calls for the same locale return the same Promise instead of overwriting.\n\n### Logs\n\n```shell\n\n```",[3227,3230,3233,3236],{"name":3228,"color":3229},"bug 🐛","ee0701",{"name":3231,"color":3232},"performance","006b75",{"name":3234,"color":3235},"scope: dynamic resources","38FB12",{"name":3237,"color":3238},"scope: runtime","84b6eb",3773,"Messages fetched and merged twice on client initialization","2025-09-11T16:11:22Z","https://github.com/nuxt-modules/i18n/issues/3773",0.67248285,{"description":3245,"labels":3246,"number":3248,"owner":3176,"repository":3177,"state":3178,"title":3249,"updated_at":3250,"url":3251,"score":3252},"### Environment\n\n- Operating System: `Darwin`\n- Node Version: `v21.7.1`\n- Nuxt Version: `3.16.2`\n- CLI Version: `3.25.0`\n- Nitro Version: `2.11.9`\n- Package Manager: `npm@10.9.0`\n- Builder: `-`\n- User Config: `codegen`, `compatibilityDate`, `css`, `device`, `devtools`, `i18n`, `image`, `modules`, `runtimeConfig`, `scripts`, `srcDir`, `svgo`, `vite`, `watch`\n- Runtime Modules: `@bootstrap-vue-next/nuxt@0.29.3`, `@nuxt/eslint@1.3.0`, `@nuxt/fonts@0.11.2`, `@nuxt/image@1.10.0`, `@nuxt/scripts@0.11.6`, `@nuxtjs/device@3.2.4`, `@nuxtjs/i18n@9.5.3`, `@nuxtjs/stylelint-module@5.2.1`, `nuxt-svgo@4.0.19`, `nuxt-swiper@2.0.0`\n- Build Modules: `-`\n\n\n### Reproduction\n\nHere is the reproduction:\n\nhttps://stackblitz.com/edit/bobbiegoede-nuxt-i18n-starter-rskcxctd\n\n### Describe the bug\n\nWhen you translate your pages with defineI18nRoute (or maybe into `pages` key into i18n config) is getting rid when strategy in no prefixed (bot _no_prefix_ and _prefix_except_default_)\n\n### Additional context\n\n_No response_\n\n### Logs\n\n```shell\n\n```",[3247],{"name":3173,"color":3174},3598,"defineI18nRoute is not working with no_prefix strategy","2025-05-13T14:21:14Z","https://github.com/nuxt-modules/i18n/issues/3598",0.6822588,{"description":3254,"labels":3255,"number":3262,"owner":3176,"repository":3177,"state":3263,"title":3264,"updated_at":3265,"url":3266,"score":3267},"### Environment\n\n- Operating System: macOS Ventura 13\r\n- Node Version: v19.9.0\r\n- Nuxt Version: 3.7.3\r\n- Nitro Version: 2.6.3\r\n- Package Manager: pnpm@8.9.2\r\n- Builder: -\r\n- User Config: modules, i18n\r\n- Runtime Modules: @nuxtjs/i18n@8.0.0-rc.5\r\n- Build Modules: -\n\n### Reproduction\n\nhttps://i18n-test.designbydc.de/\r\nAuth: **bug** /// **i18n-test$**\r\n\r\n-----\r\n**Config:**\r\n```\r\n{\r\n...\r\ni18n: {\r\n defaultLocale: 'de',\r\n langDir: 'locales',\r\n lazy: true,\r\n locales: [\r\n {\r\n code: 'en',\r\n iso: 'en-GB',\r\n name: 'EN',\r\n file: 'en-GB.json'\r\n },\r\n {\r\n code: 'de',\r\n iso: 'de-DE',\r\n name: 'DE',\r\n file: 'de-DE.json'\r\n }\r\n ],\r\n compilation: {\r\n strictMessage: false\r\n }\r\n }\r\n}\r\n```\r\n-----\r\n**Dependencies:**\r\n```\r\n\"devDependencies\": {\r\n \"@nuxt/devtools\": \"latest\",\r\n \"@nuxtjs/i18n\": \"^v8.0.0-rc.5\",\r\n \"nuxt\": \"^3.7.3\",\r\n \"sass\": \"^1.68.0\",\r\n \"sass-loader\": \"^13.3.0\"\r\n },\r\n```\n\n### Describe the bug\n\nAfter pre-rendering pages by default i18n configuration with `nuxt generate`, the browser language detection not automatically redirect visitors to their preferred language on initial page load. \r\n\r\nTo reproduce it click on the language navigation so the default cookie **i18n_redirected** will be enabled. \r\n\r\nThe bug occurs if you click on EN and try to load the page without pathname \"/en\". After that the wrong language link in navigation is active and the content is only partially displayed correctly suitable for the selected language.\n\n### Additional context\n\n_No response_\n\n### Logs\n\n_No response_",[3256,3259],{"name":3257,"color":3258},"scope: language detection","1B89B8",{"name":3260,"color":3261},"scope: prerender","8B39DF",2507,"closed","Redirection to preferred language not works after pre-rendering pages","2025-06-09T22:33:59Z","https://github.com/nuxt-modules/i18n/issues/2507",0.61806643,{"description":3269,"labels":3270,"number":3272,"owner":3176,"repository":3177,"state":3263,"title":3273,"updated_at":3274,"url":3275,"score":3276},"### Environment\n\n- Operating System: Linux\r\n- Node Version: v18.20.3\r\n- Nuxt Version: 3.12.4\r\n- CLI Version: 3.12.0\r\n- Nitro Version: -\r\n- Package Manager: pnpm@8.15.6\r\n- Builder: -\r\n- User Config: modules, runtimeConfig, i18n, compatibilityDate\r\n- Runtime Modules: @nuxtjs/i18n@8.3.1\r\n- Build Modules: -\n\n### Reproduction\n\nhttps://stackblitz.com/edit/nuxt-starter-i18n-timothe?file=app.vue,pages/%5B...slug%5D.vue,nuxt.config.ts\n\n### Describe the bug\n\nWhen using `prefix_except_default` strategy, and try to initialize locale with setLocale function but I18n fallback to default locale afterward. It's only work when I set detectBrowserLanguage to `{}` instead of `false`.\n\n### Additional context\n\nI let the CMS handle the routing for the wildcard.\n\n### Logs\n\n```shell\nisSSG false\r\nuseCookie on setup false\r\ndefaultLocale on setup fr\r\ngetLocaleCookie { useCookie: false, cookieKey: false, localeCodes: [ 'fr', 'en' ] }\r\ndetectLocale: initialLocale - fr\r\ndetectLocale: (ssg, callType, firstAccess) - normal setup true\r\ndetectLocale: detectBrowserLanguage (browserLocale, stat, reason, from) - false unknown unknown\r\ndetectLocale: finaleLocale first (finaleLocale, strategy) - prefix_except_default\r\ndetectLocale: finaleLocale second (finaleLocale, detectBrowserLanguage) - false\r\ndetectLocale: finalLocale last (finalLocale, defaultLocale) - fr\r\ndetectLocale: finalLocale - fr\r\nfirst detect initial locale fr\r\n../assets/fr.json is loading ...\r\nloadMessage: (locale) - fr\r\nloadMessage: load { welcome:\r\n { type: 0,\r\n start: 0,\r\n end: 9,\r\n loc: { start: [Object], end: [Object], source: 'Bienvenue' },\r\n body:\r\n { type: 2, start: 0, end: 9, loc: [Object], items: [Array], static: 'Bienvenue' } } }\r\nfinal initial locale: fr\r\nlocale-changing middleware { fullPath: '/',\r\n hash: '',\r\n query: {},\r\n name: 'slug',\r\n path: '/',\r\n params: { slug: '' },\r\n matched:\r\n [ { path: '/:slug(.*)*',\r\n redirect: undefined,\r\n name: 'slug',\r\n meta: {},\r\n aliasOf: undefined,\r\n beforeEnter: undefined,\r\n props: [Object],\r\n children: [],\r\n instances: {},\r\n leaveGuards: Set(0) {},\r\n updateGuards: Set(0) {},\r\n enterCallbacks: {},\r\n components: [Object] } ],\r\n meta: {},\r\n redirectedFrom: undefined,\r\n href: '/' } { fullPath: '/',\r\n path: '/',\r\n query: {},\r\n hash: '',\r\n name: undefined,\r\n params: { slug: '' },\r\n matched:\r\n [ { path: '/:slug(.*)*',\r\n redirect: undefined,\r\n name: 'slug',\r\n meta: {},\r\n aliasOf: undefined,\r\n beforeEnter: undefined,\r\n props: [Object],\r\n children: [],\r\n instances: {},\r\n leaveGuards: Set(0) {},\r\n updateGuards: Set(0) {},\r\n enterCallbacks: {},\r\n components: [Object] } ],\r\n meta: {},\r\n redirectedFrom: undefined,\r\n href: '/' }\r\ngetLocaleCookie { useCookie: false, cookieKey: false, localeCodes: [ 'fr', 'en' ] }\r\ndetectLocale: initialLocale - fr\r\ndetectLocale: (ssg, callType, firstAccess) - normal routing true\r\ndetectLocale: detectBrowserLanguage (browserLocale, stat, reason, from) - false unknown unknown\r\ndetectLocale: finaleLocale first (finaleLocale, strategy) - prefix_except_default\r\ndetectLocale: finaleLocale second (finaleLocale, detectBrowserLanguage) - false\r\ndetectLocale: finalLocale last (finalLocale, defaultLocale) - fr\r\ndetectLocale: finalLocale - fr\r\ndetect locale fr\r\nlocaleSetup false\r\nsetLocale: new -> fr old -> fr initial -> false\r\ndetectRedirect: targetLocale -> fr\r\ndetectRedirect: route -> { to:\r\n { fullPath: '/',\r\n hash: '',\r\n query: {},\r\n name: 'slug',\r\n path: '/',\r\n params: { slug: '' },\r\n matched: [ [Object] ],\r\n meta: {},\r\n redirectedFrom: undefined,\r\n href: '/' },\r\n from:\r\n { fullPath: '/',\r\n path: '/',\r\n query: {},\r\n hash: '',\r\n name: undefined,\r\n params: { slug: '' },\r\n matched: [ [Object] ],\r\n meta: {},\r\n redirectedFrom: undefined,\r\n href: '/' } }\r\ndetectRedirect: calledWithRouting -> true \r\ndetectRedirect: calculate routePath -> /\r\nredirectPath on locale-changing middleware \r\nnavigate options 302 false false false\r\nnavigate isSSG false\r\nsetLocale: new -> en old -> fr initial -> true\r\n../assets/en.json is loading ...\r\nloadMessage: (locale) - en\r\nloadMessage: load { welcome:\r\n { type: 0,\r\n start: 0,\r\n end: 7,\r\n loc: { start: [Object], end: [Object], source: 'Welcome' },\r\n body: { type: 2, start: 0, end: 7, loc: [Object], items: [Array], static: 'Welcome' } } }\r\ndetectRedirect: targetLocale -> en\r\ndetectRedirect: route -> { to: {} }\r\ndetectRedirect: calledWithRouting -> false \r\ndetectRedirect: calculate routePath -> /\r\nredirectPath on setLocale \r\nnavigate options 302 false false true\r\nnavigate isSSG false\n```\n",[3271],{"name":3257,"color":3258},3039,"DetectBrowserLanguage rollback to default locale when using `prefix_except_default`","2025-06-08T01:03:16Z","https://github.com/nuxt-modules/i18n/issues/3039",0.65314317,{"description":3278,"labels":3279,"number":3281,"owner":3176,"repository":3177,"state":3263,"title":3282,"updated_at":3283,"url":3284,"score":3285},"### Environment\n\n------------------------------\r\n- Operating System: Windows_NT\r\n- Node Version: v20.10.0\r\n- Nuxt Version: 3.13.2\r\n- CLI Version: 3.13.2\r\n- Nitro Version: 2.9.7\r\n- Package Manager: npm@10.2.3\r\n- Builder: -\r\n- User Config: compatibilityDate, devtools, modules, i18n\r\n- Runtime Modules: @nuxtjs/i18n@8.5.5\r\n- Build Modules: -\r\n------------------------------\n\n### Reproduction\n\n[nuxt-i18n-BUG-REPRODUCE.zip](https://github.com/user-attachments/files/17109191/nuxt-i18n-BUG-REPRODUCE.zip)\r\n\n\n### Describe the bug\n\nwith setting:\r\n```ts\r\ni18n:{\r\n strategy: 'prefix',\r\n locales: ['zh', 'en'], \r\n detectBrowserLanguage: // \r\n\t{\r\n\t\tuseCookie: false, //set true or false, not influenced the result\r\n\t\tcookieKey: 'i18n_redirected',\r\n\t\tredirectOn: 'root' // recommended\r\n\t}\r\n }\r\n```\r\n\r\nWhen Browser request header has `accept-language: zh-CN,zh;q=0.9`\r\nExpect: redirect to `/zh/hello`\r\nBut has: `location: /en/hello`\r\n\r\nsame with [issues/1632](https://github.com/nuxt-modules/i18n/issues/1632)\n\n### Additional context\n\n_No response_\n\n### Logs\n\n_No response_",[3280],{"name":3257,"color":3258},3126,"`detectBrowserLanguage` does not detect browser lang as expected","2025-06-08T01:24:47Z","https://github.com/nuxt-modules/i18n/issues/3126",0.6565711,["Reactive",3287],{},["Set"],["ShallowReactive",3290],{"$fTRc1wZytZ_XrK4EfJfei_Sz-An4H4Yy6syhVxH_PVJc":-1,"$fiHico6ipgfDTkZstDtdRsvzQz0Dk482fbTHqf0ppBP4":-1},"/nuxt-modules/i18n/3678"]