fix: locale routing
This commit is contained in:
@@ -69,7 +69,7 @@ const starts = [
|
|||||||
["en", "root"],
|
["en", "root"],
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
export function matchLocale(input: string) {
|
function parse(input: string) {
|
||||||
let decoded = ""
|
let decoded = ""
|
||||||
try {
|
try {
|
||||||
decoded = decodeURIComponent(input)
|
decoded = decodeURIComponent(input)
|
||||||
@@ -79,6 +79,22 @@ export function matchLocale(input: string) {
|
|||||||
|
|
||||||
const value = decoded.trim().toLowerCase()
|
const value = decoded.trim().toLowerCase()
|
||||||
if (!value) return null
|
if (!value) return null
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
export function exactLocale(input: string) {
|
||||||
|
const value = parse(input)
|
||||||
|
if (!value) return null
|
||||||
|
if (value in localeAlias) {
|
||||||
|
return localeAlias[value as keyof typeof localeAlias]
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
export function matchLocale(input: string) {
|
||||||
|
const value = parse(input)
|
||||||
|
if (!value) return null
|
||||||
|
|
||||||
if (value.startsWith("zh")) {
|
if (value.startsWith("zh")) {
|
||||||
if (value.includes("hant") || value.includes("-tw") || value.includes("-hk") || value.includes("-mo")) {
|
if (value.includes("hant") || value.includes("-tw") || value.includes("-hk") || value.includes("-mo")) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { defineMiddleware } from "astro:middleware"
|
import { defineMiddleware } from "astro:middleware"
|
||||||
import { matchLocale } from "./i18n/locales"
|
import { exactLocale, matchLocale } from "./i18n/locales"
|
||||||
|
|
||||||
function docsAlias(pathname: string) {
|
function docsAlias(pathname: string) {
|
||||||
const hit = /^\/docs\/([^/]+)(\/.*)?$/.exec(pathname)
|
const hit = /^\/docs\/([^/]+)(\/.*)?$/.exec(pathname)
|
||||||
@@ -7,12 +7,12 @@ function docsAlias(pathname: string) {
|
|||||||
|
|
||||||
const value = hit[1] ?? ""
|
const value = hit[1] ?? ""
|
||||||
const tail = hit[2] ?? ""
|
const tail = hit[2] ?? ""
|
||||||
const locale = matchLocale(value)
|
const locale = exactLocale(value)
|
||||||
if (!locale) return null
|
if (!locale) return null
|
||||||
if (locale === "root") return `/docs${tail}`
|
|
||||||
if (value === locale) return null
|
|
||||||
|
|
||||||
return `/docs/${locale}${tail}`
|
const next = locale === "root" ? `/docs${tail}` : `/docs/${locale}${tail}`
|
||||||
|
if (next === pathname) return null
|
||||||
|
return next
|
||||||
}
|
}
|
||||||
|
|
||||||
function localeFromCookie(header: string | null) {
|
function localeFromCookie(header: string | null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user