Browse Source

fix: locale routing

Adam 2 weeks ago
parent
commit
3dc720ff9c
2 changed files with 22 additions and 6 deletions
  1. 17 1
      packages/web/src/i18n/locales.ts
  2. 5 5
      packages/web/src/middleware.ts

+ 17 - 1
packages/web/src/i18n/locales.ts

@@ -69,7 +69,7 @@ const starts = [
   ["en", "root"],
 ] as const
 
-export function matchLocale(input: string) {
+function parse(input: string) {
   let decoded = ""
   try {
     decoded = decodeURIComponent(input)
@@ -79,6 +79,22 @@ export function matchLocale(input: string) {
 
   const value = decoded.trim().toLowerCase()
   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.includes("hant") || value.includes("-tw") || value.includes("-hk") || value.includes("-mo")) {

+ 5 - 5
packages/web/src/middleware.ts

@@ -1,5 +1,5 @@
 import { defineMiddleware } from "astro:middleware"
-import { matchLocale } from "./i18n/locales"
+import { exactLocale, matchLocale } from "./i18n/locales"
 
 function docsAlias(pathname: string) {
   const hit = /^\/docs\/([^/]+)(\/.*)?$/.exec(pathname)
@@ -7,12 +7,12 @@ function docsAlias(pathname: string) {
 
   const value = hit[1] ?? ""
   const tail = hit[2] ?? ""
-  const locale = matchLocale(value)
+  const locale = exactLocale(value)
   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) {