Skip to content

Commit 30ffaf1

Browse files
calderbuildclaude
andcommitted
feat: implement unified bilingual system with capsule language switcher
- Remove PageSpeed optimization article - Add language toggle to navbar with refined capsule design - Convert homepage to bilingual (EN default, ZH toggle) - Update About page with bilingual support - Update Archive/Tags pages with bilingual text - Unify language switching mechanism using localStorage - Redesign language switcher with sliding indicator animation - Support both :has() CSS selector and JS fallback for slider position - Default language is now English 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 065117d commit 30ffaf1

File tree

13 files changed

+496
-357
lines changed

13 files changed

+496
-357
lines changed

_includes/footer.html

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,13 @@
180180
window.open(`https://www.linkedin.com/sharing/share-offsite/?url=${url}&title=${title}`, '_blank', 'width=600,height=400');
181181
}
182182
function shareToWechat() {
183+
var lang = localStorage.getItem('preferredLanguage') || 'en';
184+
var msgCopied = lang === 'zh' ? '链接已复制到剪贴板,请在微信中粘贴分享!' : 'Link copied! Paste in WeChat to share.';
185+
var msgPrompt = lang === 'zh' ? '请复制以下链接在微信中分享:' : 'Copy this link to share on WeChat:';
183186
navigator.clipboard.writeText(window.location.href).then(function() {
184-
alert('链接已复制到剪贴板,请在微信中粘贴分享!');
187+
alert(msgCopied);
185188
}).catch(function() {
186-
prompt('请复制以下链接在微信中分享:', window.location.href);
189+
prompt(msgPrompt, window.location.href);
187190
});
188191
}
189192
function shareToWeibo() {
@@ -356,55 +359,38 @@
356359

357360
<!-- Multi-Lingual -->
358361
{% if page.multilingual %}
359-
<!-- Handle Language Change -->
362+
<!-- Handle Language Change - Unified with localStorage -->
360363
<script type="text/javascript">
361364
// get nodes
362365
var $zh = document.querySelector(".zh");
363366
var $en = document.querySelector(".en");
364-
var $select = document.querySelector("select");
365367

366-
// Changes at v1.8.1: include lang flag as a url query. This interop well with catalog hash anchors.
367-
function getLang() { return new URLSearchParams(document.location.search).get("lang") }
368-
369-
function setLang(newLang) {
370-
var params = new URLSearchParams(document.location.search)
371-
params.set("lang", newLang)
372-
document.location.search = params.toString() // refresh.
368+
// Get language from localStorage, default to English
369+
function getLang() {
370+
return localStorage.getItem('preferredLanguage') || 'en';
373371
}
374372

375-
// handle render
373+
// handle render - Default to English
376374
function _render() {
377-
var lang = getLang()
378-
// en
379-
if (lang == "en") {
380-
$select.selectedIndex = 1;
381-
$en.style.display = "block";
382-
$en.classList.add("active");
383-
$zh.style.display = "none";
384-
$zh.classList.remove("active");
385-
// default to zh-cn
375+
var lang = getLang();
376+
377+
if (lang == "zh") {
378+
// Show Chinese content
379+
if ($zh) { $zh.style.display = "block"; $zh.classList.add("active"); }
380+
if ($en) { $en.style.display = "none"; $en.classList.remove("active"); }
386381
} else {
387-
$select.selectedIndex = 0;
388-
$zh.style.display = "block";
389-
$zh.classList.add("active");
390-
$en.style.display = "none";
391-
$en.classList.remove("active");
382+
// Default: Show English content
383+
if ($en) { $en.style.display = "block"; $en.classList.add("active"); }
384+
if ($zh) { $zh.style.display = "none"; $zh.classList.remove("active"); }
392385
}
393-
// interop with catalog
394-
generateCatalog(".catalog-body");
395-
}
396386

397-
// handle select change
398-
function onLanChange(index) {
399-
if (index == 0) {
400-
lang = "zh"
401-
} else {
402-
lang = "en"
387+
// Regenerate catalog for current language
388+
if (typeof generateCatalog === 'function') {
389+
generateCatalog(".catalog-body");
403390
}
404-
setLang(lang)
405391
}
406392

407-
// init
393+
// init - render based on saved preference (default: English)
408394
_render();
409395
</script>
410396
{% endif %}

_includes/multilingual-sel.html

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
<!-- Language Switcher - Modern Toggle Buttons -->
2-
<div class="language-switcher">
3-
<button class="lang-btn lang-btn-en active" data-lang="en" aria-label="Switch to English">
4-
<span class="lang-label">EN</span>
5-
</button>
6-
<span class="lang-separator">|</span>
7-
<button class="lang-btn lang-btn-zh" data-lang="zh" aria-label="切换到中文">
8-
<span class="lang-label">中文</span>
9-
</button>
10-
</div>
11-
1+
<!-- Language Switcher - Capsule Toggle Design -->
2+
<div class="lang-toggle" role="radiogroup" aria-label="Language selection">
3+
<button class="lang-toggle__btn lang-toggle__btn--en active"
4+
data-lang="en"
5+
role="radio"
6+
aria-checked="true"
7+
aria-label="English">
8+
<span class="lang-toggle__text">EN</span>
9+
</button>
10+
<button class="lang-toggle__btn lang-toggle__btn--zh"
11+
data-lang="zh"
12+
role="radio"
13+
aria-checked="false"
14+
aria-label="中文">
15+
<span class="lang-toggle__text"></span>
16+
</button>
17+
<span class="lang-toggle__slider" aria-hidden="true"></span>
18+
</div>

_includes/nav.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
<span class="sr-only">Search</span>
5252
</a>
5353
</li>
54+
<!-- Language Switcher -->
55+
<li class="language-switcher-nav">
56+
{% include multilingual-sel.html %}
57+
</li>
5458
</ul>
5559
</div>
5660
</div>

_posts/2025-12-11-ai-pagespeed-ai-autopilot.md

Lines changed: 0 additions & 67 deletions
This file was deleted.

about.html

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,18 @@
77
multilingual: true
88
---
99

10-
{% include multilingual-sel.html %}
10+
<!-- English Version (default) -->
11+
<div class="en post-container lang-en">
12+
{% capture about_en %}{% include about/en.md %}{% endcapture %}
13+
{{ about_en | markdownify }}
14+
</div>
1115

12-
<!-- Chinese Version -->
13-
<div class="zh post-container">
16+
<!-- Chinese Version (hidden by default) -->
17+
<div class="zh post-container lang-zh" style="display:none;">
1418
{% capture about_zh %}{% include about/zh.md %}{% endcapture %}
1519
{{ about_zh | markdownify }}
1620
</div>
1721

18-
<!-- English Version -->
19-
<div class="en post-container">
20-
{% capture about_en %}{% include about/en.md %}{% endcapture %}
21-
{{ about_en | markdownify }}
22-
</div>
23-
2422

2523
{% if site.disqus_username %}
2624
<!-- disqus 评论框 start -->

archive/index.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Archive
33
layout: default
4-
description: "技术探索 | 项目实战 | AI学习笔记"
4+
description: "Tech Insights | Project Cases | AI Learning Notes"
55
header-img: "img/bg-little-universe.jpg"
66
---
77

@@ -19,7 +19,8 @@
1919
<!-- Tags (as filter) -->
2020
<div id='tag_cloud' class="tags tags-sup js-tags">
2121
<a class="tag-button--all" data-encode="">
22-
Show All
22+
<span class="lang-en">Show All</span>
23+
<span class="lang-zh" style="display:none;">显示全部</span>
2324
<sup>{{site.posts.size}}</sup>
2425
</a>
2526

0 commit comments

Comments
 (0)