forked from saving-satoshi/saving-satoshi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmiddleware.ts
71 lines (61 loc) · 2.05 KB
/
middleware.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// import acceptLanguage from 'accept-language'
// acceptLanguage.languages(locales)
import { NextRequest, NextResponse } from 'next/server'
import { match as matchLocale } from '@formatjs/intl-localematcher'
import Negotiator from 'negotiator'
import { i18n } from 'i18n/config'
function getLocale(request: NextRequest): string | undefined {
// Negotiator expects plain object so we need to transform headers
const negotiatorHeaders: Record<string, string> = {}
request.headers.forEach((value, key) => (negotiatorHeaders[key] = value))
// @ts-ignore locales are readonly
const locales: { locale: string; label: string }[] = i18n.locales
// Use negotiator and intl-localematcher to get best locale
let languages = new Negotiator({ headers: negotiatorHeaders }).languages(
locales
)
try {
const locale = matchLocale(
languages,
locales.map((l) => l.locale),
i18n.defaultLocale
)
return locale
} catch (ex) {
console.error(ex)
return 'en'
}
}
export function middleware(request: NextRequest) {
// Check if there is any supported locale in the pathname
const pathname = request.nextUrl.pathname
if (!pathname) {
return NextResponse.next()
}
// Redirect to '/' for homepage
if (
(pathname !== '/' && !pathname.startsWith('/.well-known/')) ||
getLocale(request) !== 'en'
) {
const pathnameIsMissingLocale = i18n.locales.every(
(language) =>
!pathname.startsWith(`/${language.locale}/`) &&
pathname !== `/${language.locale}`
)
// Redirect if there is no locale
if (pathnameIsMissingLocale) {
const locale = getLocale(request)
// e.g. incoming request is /products
// The new URL is now /en-US/products
return NextResponse.redirect(
new URL(`/${locale}${pathname}`, request.url)
)
}
}
}
export const config = {
// TODO: Find a way to handle these dynamically
matcher: [
'/((?!_next/static|_next/image|assets|favicon|favicon.ico|android-icon|robots.txt|sitemap.xml|manifest.json|.well-known/nostr.json).*)',
],
}