diff --git a/src/core/i18n/middleware.js b/src/core/i18n/middleware.js deleted file mode 100644 index 72b91314107..00000000000 --- a/src/core/i18n/middleware.js +++ /dev/null @@ -1,19 +0,0 @@ -import config from 'config'; -import { getLanguage } from 'core/i18n/utils'; - -const defaultLang = config.get('defaultLang'); - - -const setLanguage = (req, res, next) => { - let lang = defaultLang; - // Locale can be changed by passing ?lang= in the querystring - const langQS = req.query ? req.query.lang : null; - if (langQS) { - lang = getLanguage(langQS); - } - // eslint-disable-next-line no-param-reassign - res.locals.lang = lang; - next(); -}; - -export default setLanguage; diff --git a/src/core/i18n/utils.js b/src/core/i18n/utils.js index 99736c37d37..a4723294782 100644 --- a/src/core/i18n/utils.js +++ b/src/core/i18n/utils.js @@ -80,3 +80,17 @@ export function isRtlLang(lang) { export function getDirection(lang) { return isRtlLang(lang) ? 'rtl' : 'ltr'; } + +export function getLangFromRouter(renderProps) { + if (renderProps) { + // Get the lang from the url param by default + // if it exists. + if (renderProps.params && renderProps.params.lang) { + return getLanguage(renderProps.params.lang); + } else if (renderProps.location && renderProps.location.query && + renderProps.location.query.lang) { + return getLanguage(renderProps.location.query.lang); + } + } + return defaultLang; +} diff --git a/src/core/server/base.js b/src/core/server/base.js index 4d1428af449..e48c425188c 100644 --- a/src/core/server/base.js +++ b/src/core/server/base.js @@ -19,8 +19,7 @@ import ServerHtml from 'core/containers/ServerHtml'; import config from 'config'; import { setJWT } from 'core/actions'; import log from 'core/logger'; -import setLanguage from 'core/i18n/middleware'; -import { getDirection, langToLocale } from 'core/i18n/utils'; +import { getDirection, getLangFromRouter, langToLocale } from 'core/i18n/utils'; import I18nProvider from 'core/i18n/Provider'; import Jed from 'jed'; @@ -45,8 +44,6 @@ function baseServer(routes, createStore, { appInstanceName = appName } = {}) { const app = new Express(); app.disable('x-powered-by'); - app.use(setLanguage); - app.use(logRequests); // Sets X-Frame-Options @@ -114,7 +111,7 @@ function baseServer(routes, createStore, { appInstanceName = appName } = {}) { fs.readFileSync(path.join(config.get('basePath'), 'dist/sri.json')) ) : {}; - const lang = res.locals.lang; + const lang = getLangFromRouter(renderProps); const dir = getDirection(lang); const locale = langToLocale(lang); diff --git a/src/disco/routes.js b/src/disco/routes.js index 3bcb3a4777b..603ac6e1856 100644 --- a/src/disco/routes.js +++ b/src/disco/routes.js @@ -8,7 +8,7 @@ export default ( diff --git a/tests/client/core/i18n/test_middleware.js b/tests/client/core/i18n/test_middleware.js deleted file mode 100644 index 71375902c81..00000000000 --- a/tests/client/core/i18n/test_middleware.js +++ /dev/null @@ -1,58 +0,0 @@ -import setLanguage from 'core/i18n/middleware'; - -describe('i18n middlware', () => { - let res; - - beforeEach(() => { - res = { - locals: {}, - }; - }); - - it('should call next()', () => { - const fakeNext = sinon.stub(); - const req = {}; - setLanguage(req, res, fakeNext); - assert.ok(fakeNext.called); - }); - - it('should default to en-US', () => { - const fakeNext = sinon.stub(); - const req = {}; - setLanguage(req, res, fakeNext); - assert.equal(res.locals.lang, 'en-US'); - }); - - it('should set lang based on query-string', () => { - const fakeNext = sinon.stub(); - const req = { - query: { - lang: 'pt-PT', - }, - }; - setLanguage(req, res, fakeNext); - assert.equal(res.locals.lang, 'pt-PT'); - }); - - it('should provide default if bogus value', () => { - const fakeNext = sinon.stub(); - const req = { - query: { - lang: 'whatevs', - }, - }; - setLanguage(req, res, fakeNext); - assert.equal(res.locals.lang, 'en-US'); - }); - - it('should provide default if bogus type', () => { - const fakeNext = sinon.stub(); - const req = { - query: { - lang: 1, - }, - }; - setLanguage(req, res, fakeNext); - assert.equal(res.locals.lang, 'en-US'); - }); -}); diff --git a/tests/client/core/i18n/test_utils.js b/tests/client/core/i18n/test_utils.js index 5af640ab96a..77909297f28 100644 --- a/tests/client/core/i18n/test_utils.js +++ b/tests/client/core/i18n/test_utils.js @@ -1,4 +1,5 @@ import * as utils from 'core/i18n/utils'; +import config from 'config'; describe('i18n utils', () => { @@ -142,4 +143,45 @@ describe('i18n utils', () => { assert.equal(utils.isValidLang('pt'), true); }); }); + + describe('getLangFromRouter()', () => { + it('should return default lang if no lang is provided', () => { + const fakeRenderProps = {}; + assert.equal(utils.getLangFromRouter(fakeRenderProps), config.get('defaultLang')); + }); + + it('should return lang if provided via the URL', () => { + const fakeRenderProps = { + params: { + lang: 'fr', + }, + }; + assert.equal(utils.getLangFromRouter(fakeRenderProps), 'fr'); + }); + + it('should return lang if provided via a query param', () => { + const fakeRenderProps = { + location: { + query: { + lang: 'pt-PT', + }, + }, + }; + assert.equal(utils.getLangFromRouter(fakeRenderProps), 'pt-PT'); + }); + + it('should use url param if both that and query string are present', () => { + const fakeRenderProps = { + params: { + lang: 'fr', + }, + location: { + query: { + lang: 'pt-PT', + }, + }, + }; + assert.equal(utils.getLangFromRouter(fakeRenderProps), 'fr'); + }); + }); });