diff --git a/routes/_middleware.ts b/routes/_middleware.ts index 7a948fc..2af4b43 100644 --- a/routes/_middleware.ts +++ b/routes/_middleware.ts @@ -7,6 +7,7 @@ import { import { exists } from "std/fs/exists.ts"; import { get_task_manager } from "../server.ts"; import { build_sw } from "../server/build_sw.ts"; +import { i18n_get_lang } from "../server/i18ns.ts"; const STATIC_FILES = ["/common.css", "/scrollBar.css", "/sw.js", "/sw.js.map"]; @@ -49,6 +50,15 @@ export async function handler(req: Request, ctx: FreshContext) { if (!(await exists(p)) || p === flutter_base) { p = join(flutter_base, "/index.html"); } + if (u.pathname == "/flutter/manifest.json") { + const lang = i18n_get_lang(req, ["zh-cn"]); + if (lang !== "en") { + const tp = join(flutter_base, `/manifest.${lang}.json`); + if (await exists(tp)) { + p = tp; + } + } + } const opts: GetFileResponseOptions = {}; opts.range = req.headers.get("range"); opts.if_modified_since = req.headers.get("If-Modified-Since"); diff --git a/server/i18ns.ts b/server/i18ns.ts index 2312bc8..00ddc61 100644 --- a/server/i18ns.ts +++ b/server/i18ns.ts @@ -54,6 +54,20 @@ export function get_i18nmap(lang: string, ...modules: MODULE[]) { return r; } +export function i18n_get_lang(req: Request, langs: string[]) { + const u = new URL(req.url); + const lang = u.searchParams.get("lang"); + if (lang && (lang === "en" || langs.includes(lang))) { + return lang; + } else { + const a = req.headers.get("Accept-Language"); + const l = + (a ? pick(langs, a) || pick(langs, a, { loose: true }) : null) || + "en"; + return l; + } +} + export function i18n_handle_request(req: Request) { const u = new URL(req.url); const lang = u.searchParams.get("lang");