1
- import languages , { languageKeys } from '#src/languages/lib/languages.js '
1
+ import type { Request , Response , NextFunction } from 'express '
2
2
import parser from 'accept-language-parser'
3
+ import type { Language as parserLanguage } from 'accept-language-parser'
3
4
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'
5
8
6
9
const chineseRegions = [
7
10
'CN' , // Mainland
@@ -10,25 +13,28 @@ const chineseRegions = [
10
13
'TW' , // Taiwan
11
14
]
12
15
13
- function translationExists ( language ) {
16
+ function translationExists ( language : parserLanguage ) {
14
17
if ( language . code === 'zh' ) {
15
- return chineseRegions . includes ( language . region )
18
+ return language . region && chineseRegions . includes ( language . region )
16
19
}
17
20
// 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
19
22
}
20
23
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
23
28
}
24
29
25
- function getUserLanguage ( browserLanguages ) {
30
+ function getUserLanguage ( browserLanguages : parserLanguage [ ] ) {
26
31
try {
27
32
let numTopPreferences = 1
28
33
for ( let lang = 0 ; lang < browserLanguages . length ; lang ++ ) {
29
34
// 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 ) {
31
36
numTopPreferences ++
37
+ }
32
38
if ( translationExists ( browserLanguages [ lang ] ) && numTopPreferences < 3 ) {
33
39
return getLanguageCode ( browserLanguages [ lang ] )
34
40
}
@@ -38,26 +44,27 @@ function getUserLanguage(browserLanguages) {
38
44
}
39
45
}
40
46
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
+
43
50
// 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 ) {
45
52
return value
46
53
}
47
54
}
48
55
49
56
// determine language code from a path. Default to en if no valid match
50
- export function getLanguageCodeFromPath ( path ) {
57
+ export function getLanguageCodeFromPath ( path : string ) {
51
58
const maybeLanguage = ( path . split ( '/' ) [ path . startsWith ( '/_next/data/' ) ? 4 : 1 ] || '' ) . slice ( 0 , 2 )
52
59
return languageKeys . includes ( maybeLanguage ) ? maybeLanguage : 'en'
53
60
}
54
61
55
- export function getLanguageCodeFromHeader ( req ) {
62
+ export function getLanguageCodeFromHeader ( req : Request ) {
56
63
const browserLanguages = parser . parse ( req . headers [ 'accept-language' ] )
57
64
return getUserLanguage ( browserLanguages )
58
65
}
59
66
60
- export default function detectLanguage ( req , res , next ) {
67
+ export default function detectLanguage ( req : ExtendedRequest , res : Response , next : NextFunction ) {
61
68
req . language = getLanguageCodeFromPath ( req . path )
62
69
// Detecting browser language by user preference
63
70
req . userLanguage = getUserLanguageFromCookie ( req )
0 commit comments