|
|
'use strict'; |
|
|
|
|
|
const parser = require('accept-language-parser'); |
|
|
const _ = require('lodash'); |
|
|
const { languageCodeExists } = require('country-language'); |
|
|
|
|
|
const DEFAULT_LANGUAGE = 'en'; |
|
|
|
|
|
module.exports = setup; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function findLanguageMatch(authorizedLanguages, userAcceptLanguages) { |
|
|
for (const language of userAcceptLanguages) { |
|
|
|
|
|
const foundExactLanguage = _.find( |
|
|
authorizedLanguages, |
|
|
lang => lang === `${language.code}-${language.region}` |
|
|
); |
|
|
if (foundExactLanguage) return foundExactLanguage; |
|
|
|
|
|
|
|
|
const foundCountryCode = _.find(authorizedLanguages, lang => { |
|
|
|
|
|
const parsedLanguage = _.get(parser.parse(lang), '[0]'); |
|
|
return parsedLanguage.code === language.code; |
|
|
}); |
|
|
if (foundCountryCode) return foundCountryCode; |
|
|
} |
|
|
|
|
|
return null; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function setup({ languages = [], defaultLanguage = DEFAULT_LANGUAGE } = {}) { |
|
|
if (!languages || !languages.length) { |
|
|
throw new Error('opts.languages is mandatory'); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return function middleware(req, res, next) { |
|
|
const acceptLanguage = req.get('Accept-Language'); |
|
|
|
|
|
if (!acceptLanguage) { |
|
|
req.language = defaultLanguage; |
|
|
return next(); |
|
|
} |
|
|
|
|
|
|
|
|
const parsedLanguages = parser.parse(acceptLanguage); |
|
|
|
|
|
|
|
|
const userAcceptLanguages = _.filter(parsedLanguages, language => |
|
|
languageCodeExists(language.code) |
|
|
); |
|
|
|
|
|
|
|
|
const language = |
|
|
findLanguageMatch(languages, userAcceptLanguages) || defaultLanguage; |
|
|
|
|
|
req.language = language; |
|
|
|
|
|
return next(); |
|
|
}; |
|
|
} |
|
|
|