This reverts commit a9947c086c.
This commit is contained in:
@@ -1,17 +1,14 @@
|
||||
import languages, { languageKeys } from '../lib/languages.js'
|
||||
import libLanguages from '../lib/languages.js'
|
||||
import parser from 'accept-language-parser'
|
||||
const languageCodes = Object.keys(libLanguages)
|
||||
|
||||
const chineseRegions = ['CN', 'HK']
|
||||
|
||||
// This value is replicated in two places! See <LanguagePicker/> component.
|
||||
// Note, the only reason this is exported is to benefit the tests.
|
||||
export const PREFERRED_LOCALE_COOKIE_NAME = 'preferredlang'
|
||||
|
||||
function translationExists(language) {
|
||||
if (language.code === 'zh') {
|
||||
return chineseRegions.includes(language.region)
|
||||
}
|
||||
return languageKeys.includes(language.code)
|
||||
return languageCodes.includes(language.code)
|
||||
}
|
||||
|
||||
function getLanguageCode(language) {
|
||||
@@ -20,41 +17,33 @@ function getLanguageCode(language) {
|
||||
|
||||
function getUserLanguage(browserLanguages) {
|
||||
try {
|
||||
let userLanguage = getLanguageCode(browserLanguages[0])
|
||||
let numTopPreferences = 1
|
||||
for (let lang = 0; lang < browserLanguages.length; lang++) {
|
||||
// If language has multiple regions, Chrome adds the non-region language to list
|
||||
if (lang > 0 && browserLanguages[lang].code !== browserLanguages[lang - 1].code)
|
||||
numTopPreferences++
|
||||
if (translationExists(browserLanguages[lang]) && numTopPreferences < 3) {
|
||||
return getLanguageCode(browserLanguages[lang])
|
||||
userLanguage = getLanguageCode(browserLanguages[lang])
|
||||
break
|
||||
}
|
||||
}
|
||||
return userLanguage
|
||||
} catch {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
function getUserLanguageFromCookie(req) {
|
||||
const value = req.cookies[PREFERRED_LOCALE_COOKIE_NAME]
|
||||
// But if it's a WIP language, reject it.
|
||||
if (value && languages[value] && !languages[value].wip) {
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
// determine language code from a path. Default to en if no valid match
|
||||
export function getLanguageCodeFromPath(path) {
|
||||
const maybeLanguage = (path.split('/')[path.startsWith('/_next/data/') ? 4 : 1] || '').slice(0, 2)
|
||||
return languageKeys.includes(maybeLanguage) ? maybeLanguage : 'en'
|
||||
return languageCodes.includes(maybeLanguage) ? maybeLanguage : 'en'
|
||||
}
|
||||
|
||||
export default function detectLanguage(req, res, next) {
|
||||
req.language = getLanguageCodeFromPath(req.path)
|
||||
// Detecting browser language by user preference
|
||||
req.userLanguage = getUserLanguageFromCookie(req)
|
||||
if (!req.userLanguage) {
|
||||
const browserLanguages = parser.parse(req.headers['accept-language'])
|
||||
req.userLanguage = getUserLanguage(browserLanguages)
|
||||
}
|
||||
const browserLanguages = parser.parse(req.headers['accept-language'])
|
||||
req.userLanguage = getUserLanguage(browserLanguages)
|
||||
return next()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user