diff --git a/.workbuddy/memory/2026-09-15.md b/.workbuddy/memory/2026-09-15.md new file mode 100644 index 0000000..4234a55 --- /dev/null +++ b/.workbuddy/memory/2026-09-15.md @@ -0,0 +1,33 @@ +# 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`: + - `
` 顶部加 `is:inline` + `define:vars` 脚本,进首页(path==='/' 或 '/'+defaultLocale)且记住了非默认语言时 `location.replace('/'+stored)`。脚本在 head 同步执行,先于首屏绘制,基本无闪白。 + - 语言切换器 `x-data="{ open:false }"` → `langSwitch()`;`` `@click` 改为 `open=false; pick('')`。
+ - footer 脚本 import `storeLocale`,注册 `langSwitch` Alpine 组件(含 `pick(code){ storeLocale(code) }`)。
+- **设计铁律**:只在「显式点击切换器」时写 localStorage,绝不按页面加载的 URL 写——否则与首页自动跳转冲突(点了英文又被 URL 上的 en 覆盖,首页永远跳不回去)。
+- 验证:`npm run build` Complete;`astro check` 0/0/0;产物 HTML 确认内联脚本注入 `const defaultLocale="en"; const storedKey="preferred_locale";` 且两个 `pick('cn')`/`pick('en')` 锚点存在。
+- 顺带整理了被截断的超长 MEMORY.md(重写精简版,保留架构/约定/脚本铁律/类型坑/lib分层/验证手段/门禁/账号/i18n/记住语言)。
+
+## 语言建议弹窗(未选过语言时按浏览器语言提示)✅(12:11–12:30)
+用户追加需求:没选过语言时,按浏览器语言自动判断,并弹小窗提示是否切换。
+- `Layout.astro` footer `
@@ -94,7 +107,7 @@ const headers = {
{t('Home')}
{t('Portfolio')}
-
+
2026
@@ -138,7 +151,7 @@ const headers = {
-
+
@@ -255,7 +327,7 @@ const headers = {
{/* Location Badge */}
-
+
Paris
•
Milan
@@ -267,13 +339,40 @@ const headers = {
-
+
{t('© 2026 PORTFOLIO STUDIO. ALL RIGHTS RESERVED.')}
{/* 全局登录门禁层(login-required 属性 + 统一登录浮层) */}
+
+ {/* 语言建议弹窗:未选过语言且浏览器语言与当前首页不符时,提示是否切换到该语言 */}
+
+
+
+
+
+
+