Skip to content

Commit 38ceff4

Browse files
author
Peter Bengtsson
authored
Port detect-language.js to TypeScript (#50623)
1 parent a468992 commit 38ceff4

File tree

5 files changed

+45
-16
lines changed

5 files changed

+45
-16
lines changed

package-lock.json

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@
290290
"@graphql-tools/load": "^8.0.0",
291291
"@octokit/rest": "^20.1.0",
292292
"@playwright/test": "1.44.0",
293+
"@types/accept-language-parser": "1.5.6",
293294
"@types/connect-datadog": "0.0.10",
294295
"@types/connect-timeout": "0.0.39",
295296
"@types/cookie": "0.6.0",

src/frame/middleware/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
} from './set-fastly-surrogate-key.js'
1818
import handleErrors from '@/observability/middleware/handle-errors'
1919
import handleNextDataPath from './handle-next-data-path'
20-
import detectLanguage from '@/languages/middleware/detect-language.js'
20+
import detectLanguage from '@/languages/middleware/detect-language'
2121
import reloadTree from './reload-tree.js'
2222
import context from './context/context.js'
2323
import shortVersions from '@/versions/middleware/short-versions.js'

src/languages/middleware/detect-language.js renamed to src/languages/middleware/detect-language.ts

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import languages, { languageKeys } from '#src/languages/lib/languages.js'
1+
import type { Request, Response, NextFunction } from 'express'
22
import parser from 'accept-language-parser'
3+
import type { Language as parserLanguage } from 'accept-language-parser'
34

4-
import { USER_LANGUAGE_COOKIE_NAME } from '#src/frame/lib/constants.js'
5+
import languages, { languageKeys } from '@/languages/lib/languages.js'
6+
import { USER_LANGUAGE_COOKIE_NAME } from '@/frame/lib/constants.js'
7+
import type { ExtendedRequest, Languages } from '@/types'
58

69
const chineseRegions = [
710
'CN', // Mainland
@@ -10,25 +13,28 @@ const chineseRegions = [
1013
'TW', // Taiwan
1114
]
1215

13-
function translationExists(language) {
16+
function translationExists(language: parserLanguage) {
1417
if (language.code === 'zh') {
15-
return chineseRegions.includes(language.region)
18+
return language.region && chineseRegions.includes(language.region)
1619
}
1720
// 92BD1212-61B8-4E7A: Remove ` && !languages[language.code].wip` for the public ship of ko, fr, de, ru
18-
return languageKeys.includes(language.code) && !languages[language.code].wip
21+
return languageKeys.includes(language.code) && !(languages as Languages)[language.code].wip
1922
}
2023

21-
function getLanguageCode(language) {
22-
return language.code === 'cn' && chineseRegions.includes(language.region) ? 'zh' : language.code
24+
function getLanguageCode(language: parserLanguage) {
25+
return language.code === 'cn' && language.region && chineseRegions.includes(language.region)
26+
? 'zh'
27+
: language.code
2328
}
2429

25-
function getUserLanguage(browserLanguages) {
30+
function getUserLanguage(browserLanguages: parserLanguage[]) {
2631
try {
2732
let numTopPreferences = 1
2833
for (let lang = 0; lang < browserLanguages.length; lang++) {
2934
// If language has multiple regions, Chrome adds the non-region language to list
30-
if (lang > 0 && browserLanguages[lang].code !== browserLanguages[lang - 1].code)
35+
if (lang > 0 && browserLanguages[lang].code !== browserLanguages[lang - 1].code) {
3136
numTopPreferences++
37+
}
3238
if (translationExists(browserLanguages[lang]) && numTopPreferences < 3) {
3339
return getLanguageCode(browserLanguages[lang])
3440
}
@@ -38,26 +44,27 @@ function getUserLanguage(browserLanguages) {
3844
}
3945
}
4046

41-
function getUserLanguageFromCookie(req) {
42-
const value = req.cookies[USER_LANGUAGE_COOKIE_NAME]
47+
function getUserLanguageFromCookie(req: Request) {
48+
const value: undefined | string = req.cookies[USER_LANGUAGE_COOKIE_NAME]
49+
4350
// 92BD1212-61B8-4E7A: Remove ` && !languages[value].wip` for the public ship of ko, fr, de, ru
44-
if (value && languages[value] && !languages[value].wip) {
51+
if (value && (languages as Languages)[value] && !(languages as Languages)[value].wip) {
4552
return value
4653
}
4754
}
4855

4956
// determine language code from a path. Default to en if no valid match
50-
export function getLanguageCodeFromPath(path) {
57+
export function getLanguageCodeFromPath(path: string) {
5158
const maybeLanguage = (path.split('/')[path.startsWith('/_next/data/') ? 4 : 1] || '').slice(0, 2)
5259
return languageKeys.includes(maybeLanguage) ? maybeLanguage : 'en'
5360
}
5461

55-
export function getLanguageCodeFromHeader(req) {
62+
export function getLanguageCodeFromHeader(req: Request) {
5663
const browserLanguages = parser.parse(req.headers['accept-language'])
5764
return getUserLanguage(browserLanguages)
5865
}
5966

60-
export default function detectLanguage(req, res, next) {
67+
export default function detectLanguage(req: ExtendedRequest, res: Response, next: NextFunction) {
6168
req.language = getLanguageCodeFromPath(req.path)
6269
// Detecting browser language by user preference
6370
req.userLanguage = getUserLanguageFromCookie(req)

src/types.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,19 @@ export type ExtendedRequest = Request & {
1010
currentCategory?: string
1111
error?: Error
1212
}
13+
language?: string
14+
userLanguage?: string
1315
// Add more properties here as needed
1416
}
17+
18+
type Language = {
19+
name: string
20+
code: string
21+
hreflang: string
22+
dir: string
23+
wip: boolean
24+
}
25+
26+
export type Languages = {
27+
[key: string]: Language
28+
}

0 commit comments

Comments
 (0)