diff --git a/middleware/redirects/handle-redirects.js b/middleware/redirects/handle-redirects.js index 503aab1bdd..94e1996c7f 100644 --- a/middleware/redirects/handle-redirects.js +++ b/middleware/redirects/handle-redirects.js @@ -1,13 +1,25 @@ import patterns from '../../lib/patterns.js' import { URL } from 'url' +import languages from '../../lib/languages.js' export default function handleRedirects(req, res, next) { // never redirect assets if (patterns.assetPaths.test(req.path)) return next() - // blanket redirects for languageless homepage to English homepage + // blanket redirects for languageless homepage if (req.path === '/') { - return res.redirect(301, '/en') + let language = 'en' + + // if set, redirect to user's preferred language translation or else English + if ( + req.context.userLanguage && + languages[req.context.userLanguage] && + !languages[req.context.userLanguage].wip + ) { + language = req.context.userLanguage + } + + return res.redirect(301, `/${language}`) } // begin redirect handling diff --git a/tests/routing/redirects.js b/tests/routing/redirects.js index 5d8b7efa85..3acdd51304 100644 --- a/tests/routing/redirects.js +++ b/tests/routing/redirects.js @@ -119,6 +119,20 @@ describe('redirects', () => { }) }) + describe('home page redirects', () => { + test('homepage redirects to english by default', async () => { + const res = await get('/') + expect(res.statusCode).toBe(301) + expect(res.headers.location).toBe('/en') + }) + + test('homepage redirects to preferred language', async () => { + const res = await get('/', { headers: { 'Accept-Language': 'ja' } }) + expect(res.statusCode).toBe(301) + expect(res.headers.location).toBe('/ja') + }) + }) + describe('external redirects', () => { test('work for top-level request paths', async () => { const res = await get('/git-ready')