diff --git a/specs/fixtures/issues/2255/app.vue b/specs/fixtures/issues/2255/app.vue
new file mode 100644
index 000000000..7911f88bc
--- /dev/null
+++ b/specs/fixtures/issues/2255/app.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/specs/fixtures/issues/2255/i18n.config.ts b/specs/fixtures/issues/2255/i18n.config.ts
new file mode 100644
index 000000000..2ce25f1ac
--- /dev/null
+++ b/specs/fixtures/issues/2255/i18n.config.ts
@@ -0,0 +1,12 @@
+export default defineI18nConfig(() => ({
+ legacy: false,
+ locale: 'en',
+ messages: {
+ en: {
+ welcome: 'Welcome'
+ },
+ fr: {
+ welcome: 'Bienvenue'
+ }
+ }
+}))
diff --git a/specs/fixtures/issues/2255/layouts/default.vue b/specs/fixtures/issues/2255/layouts/default.vue
new file mode 100644
index 000000000..56a8b72d4
--- /dev/null
+++ b/specs/fixtures/issues/2255/layouts/default.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/specs/fixtures/issues/2255/nuxt.config.ts b/specs/fixtures/issues/2255/nuxt.config.ts
new file mode 100644
index 000000000..7fb6c98e9
--- /dev/null
+++ b/specs/fixtures/issues/2255/nuxt.config.ts
@@ -0,0 +1,25 @@
+// https://nuxt.com/docs/api/configuration/nuxt-config
+export default defineNuxtConfig({
+ devtools: { enabled: true },
+ modules: ['@nuxtjs/i18n'],
+ i18n: {
+ locales: [
+ {
+ code: 'en',
+ name: 'English'
+ },
+ {
+ code: 'fr',
+ name: 'Français'
+ }
+ ],
+ strategy: 'prefix_except_default',
+ defaultLocale: 'en',
+ // debug: true,
+ detectBrowserLanguage: {
+ useCookie: true,
+ cookieKey: 'i18n_redirected',
+ redirectOn: 'root' // recommended
+ }
+ }
+})
diff --git a/specs/fixtures/issues/2255/package.json b/specs/fixtures/issues/2255/package.json
new file mode 100644
index 000000000..9f543d6f6
--- /dev/null
+++ b/specs/fixtures/issues/2255/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "nuxt3-test-issues-2255",
+ "private": true,
+ "scripts": {
+ "build": "nuxt build",
+ "dev": "nuxt dev",
+ "generate": "nuxt generate",
+ "preview": "nuxt preview"
+ },
+ "devDependencies": {
+ "@nuxtjs/i18n": "latest",
+ "nuxt": "latest"
+ }
+}
diff --git a/specs/fixtures/issues/2255/pages/index.vue b/specs/fixtures/issues/2255/pages/index.vue
new file mode 100644
index 000000000..296ecbf08
--- /dev/null
+++ b/specs/fixtures/issues/2255/pages/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+ {{ locale.name }}
+
+
+ {{ $t('welcome') }}
+
diff --git a/specs/issues/2255.spec.ts b/specs/issues/2255.spec.ts
new file mode 100644
index 000000000..a9f525d37
--- /dev/null
+++ b/specs/issues/2255.spec.ts
@@ -0,0 +1,27 @@
+import { test, expect, describe } from 'vitest'
+import { fileURLToPath } from 'node:url'
+import { URL } from 'node:url'
+import { setup, url, createPage } from '../utils'
+import { getText } from '../helper'
+
+describe('#2255', async () => {
+ await setup({
+ rootDir: fileURLToPath(new URL(`../fixtures/issues/2255`, import.meta.url))
+ })
+
+ test('redirect with browser language locale', async () => {
+ const home = url('/')
+ const page = await createPage(undefined, { locale: 'fr' })
+ await page.goto(home)
+
+ expect(await getText(page, '#msg')).toEqual('Bienvenue')
+ })
+
+ test('redirect with accept language header', async () => {
+ const home = url('/')
+ const page = await createPage(undefined, { extraHTTPHeaders: { 'Accept-Language': 'fr' } })
+ await page.goto(home)
+
+ expect(await getText(page, '#msg')).toEqual('Bienvenue')
+ })
+})
diff --git a/src/runtime/internal.ts b/src/runtime/internal.ts
index a7b41236e..96dfbed99 100644
--- a/src/runtime/internal.ts
+++ b/src/runtime/internal.ts
@@ -234,7 +234,7 @@ export function getBrowserLocale(options: Required, con
if (navigator.languages) {
// get browser language either from navigator if running on client side, or from the headers
ret = findBrowserLocale(options.__normalizedLocales, navigator.languages as string[])
- __DEBUG__ && console.log('getBrowserLocale navigator.languages', navigator.languages)
+ __DEBUG__ && console.log('getBrowserLocale (navigator.languages, ret) -', navigator.languages, ret)
}
} else if (process.server) {
const header = useRequestHeaders(['accept-language'])
@@ -242,6 +242,7 @@ export function getBrowserLocale(options: Required, con
const accept = header['accept-language']
if (accept) {
ret = findBrowserLocale(options.__normalizedLocales, parseAcceptLanguage(accept))
+ __DEBUG__ && console.log('getBrowserLocale ret', ret)
}
}
@@ -470,7 +471,7 @@ export function detectBrowserLanguage(
return { locale: finalLocale, stat: true, from: localeFrom }
}
- if (localeFrom === 'navigator_or_header' && finalLocale) {
+ if ((localeFrom === 'navigator_or_header' || localeFrom === 'cookie') && finalLocale) {
return { locale: finalLocale, stat: true, from: localeFrom }
}