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 @@ + + + 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 } }