4.2 KiB
4.2 KiB
2026-09-15 工作日志
记住语言偏好功能 ✅(11:43–12:00)
用户要求:选过语言后,下次进首页直接用上次的语言。
- 关键前提:本项目
prefixDefaultLocale: true,/en、/cn 都带前缀,根/由服务端 302 到/en。故「进首页」实际落在 /en,在此做自动跳转。 src/lib/i18n/index.ts新增STORED_LOCALE_KEY='preferred_locale'、storeLocale(locale)、getStoredLocale()(localStorage 读写,单一来源)。src/layouts/Layout.astro:<head>顶部加is:inline+define:vars脚本,进首页(path==='/' 或 '/'+defaultLocale)且记住了非默认语言时location.replace('/'+stored)。脚本在 head 同步执行,先于首屏绘制,基本无闪白。- 语言切换器
x-data="{ open:false }"→langSwitch();<a>@click改为open=false; pick('<code>')。 - footer 脚本 import
storeLocale,注册langSwitchAlpine 组件(含pick(code){ storeLocale(code) })。
- 设计铁律:只在「显式点击切换器」时写 localStorage,绝不按页面加载的 URL 写——否则与首页自动跳转冲突(点了英文又被 URL 上的 en 覆盖,首页永远跳不回去)。
- 验证:
npm run buildComplete;astro check0/0/0;产物 HTML 确认内联脚本注入const defaultLocale="en"; const storedKey="preferred_locale";且两个pick('cn')/pick('en')锚点存在。 - 顺带整理了被截断的超长 MEMORY.md(重写精简版,保留架构/约定/脚本铁律/类型坑/lib分层/验证手段/门禁/账号/i18n/记住语言)。
语言建议弹窗(未选过语言时按浏览器语言提示)✅(12:11–12:30)
用户追加需求:没选过语言时,按浏览器语言自动判断,并弹小窗提示是否切换。
Layout.astrofooter<script>(alpine:init 内)新增localeSuggestAlpine 组件,import 扩展为storeLocale, getStoredLocale, DEFAULT_LOCALE, LOCALE_NAMES。init():已getStoredLocale()则返回(交给 head 脚本重定向,不弹);否则读navigator.language,/^(zh|cmn|zho)/→ 'cn' 否则 'en';仅在首页(p==='/' || p==='/' + def)且detected !== cur时显示。messagegetter:target='cn' 时中文「检测到您的浏览器语言为「中文」,是否切换到中文界面?」;否则英文兜底。switchLang():storeLocale(target)+location.replace('/'+target);keep():storeLocale(current)(记下"保持当前默认"避免再弹)+ 隐藏。
- body 末尾加弹窗标记
x-data="localeSuggest()"+x-show="visible"+x-cloak+x-transition,两个按钮keep()/switchLang(),标签用names[target]/names[current](LOCALE_NAMES.nativeName:English / 中文)。 - 设计要点:弹窗与 head 重定向互斥(靠
getStoredLocale()判存);点「保持」写current(默认 en)即压制后续弹窗与重定向。 - 验证:
npm run buildComplete;astro check0/0/0;产物 HTML 含 popup 标记、JS bundle 含 localeSuggest + 中英文案。
字体统一:移除 font-mono / font-serif ✅(16:16–16:23)
用户要求:font-mono 这类字体都不要了,否则字体不统一。
- 站里原混用
font-sans(系统栈,默认)+font-mono(等宽)+font-serif(衬线)三类,视觉不统一。 - 用脚本批量剥除
src下全部font-mono/font-serif工具类(9 个 .astro 文件:Layout/LoginPage/AccountPage/AuthModal/BrandModal/ComingSoon/GalleryLightbox/RunwayLookCard/StreetSnapCard),UTF-8 无 BOM 精确回写,只删 token 不动其余。 - 两处"裸"字体声明单独手改:
LoadingOverlay.astro<style>:删#loading-screen h1的ui-serif,...serif与.ls-sub的ui-monospace,...monospace两行font-family(改继承 body 的 font-sans);同步更新注释里的"mono 小标"措辞。AccountPage.astroSVG 占位图<text font-family="monospace">→sans-serif(SVG 作为 data URI 隔离渲染,必须显式给字体)。
- 残留核查:
font-mono|font-serif|monospace|ui-serif|ui-monospace在 src 下 0 命中。全站统一为font-sans(系统字体栈)。 - 验证:
npm run buildComplete;astro check0/0/0。