= {
| ? | {t('kbd_this_help', locale)} |
| g h | {t('kbd_gh_home', locale)} |
| g a | {t('kbd_ga_posts', locale)} |
+ | g s | {t('kbd_gs_books', locale)} |
| g g | {t('kbd_gg_gallery', locale)} |
| g m | {t('kbd_gm_moments', locale)} |
| /terminal | {t('kbd_terminal', locale)} |
diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts
index cdb1d0b..909adb2 100644
--- a/src/i18n/ui.ts
+++ b/src/i18n/ui.ts
@@ -11,6 +11,8 @@ const dict = {
nav_gallery: { zh: '图库', en: 'Gallery' },
nav_about: { zh: '关于', en: 'About' },
nav_opensource: { zh: '开源', en: 'Projects' }, // en 用短词:390-430px 尾部主题钮免内滚(用户拍板)
+ nav_books: { zh: '书架', en: 'Books' },
+ kbd_gs_books: { zh: '书架', en: 'Books' },
search_label: { zh: '搜索', en: 'Search' },
search_placeholder: { zh: '搜索文章…(Esc 关闭)', en: 'Search posts… (Esc to close)' },
search_hint: { zh: '索引由 Pagefind 构建期生成 · 静态站零后端', en: 'Index built by Pagefind · zero-backend static site' },
diff --git a/tests/e2e.mjs b/tests/e2e.mjs
index 05342ec..52101b3 100644
--- a/tests/e2e.mjs
+++ b/tests/e2e.mjs
@@ -83,7 +83,7 @@ ok('en 图库可达', page.url().includes('/en/gallery'));
// E 车道回归:en 页导航必须整轨 /en/(用户实测"切语言后点导航回中文"的防线)
const enNavHrefs = await page.$$eval('nav a[href^="/"]:not(.nav-lang)', (as) => as.map((a) => a.getAttribute('href')));
const enNavBad = await page.$$eval('nav a[href^="/"]:not(.nav-lang)', (as) => as.filter((a) => !(a.getAttribute('href') ?? '').startsWith('/en/')).map((a) => a.outerHTML.slice(0, 140)));
-ok('en 导航全轨 /en/ 前缀', enNavBad.length === 0 && enNavHrefs.length >= 5, enNavBad.join(' ; ') || enNavHrefs.join(' '));
+ok('en 导航全轨 /en/ 前缀', enNavBad.length === 0 && enNavHrefs.length >= 6 && enNavHrefs.includes('/en/books/'), enNavBad.join(' ; ') || enNavHrefs.join(' '));
const enBrand = await page.getAttribute('a.brand', 'href');
ok('en 品牌链接指 /en/', enBrand === '/en/', String(enBrand));