diff --git a/docs/.vitepress/theme/components/HomeFeatures.vue b/docs/.vitepress/theme/components/HomeFeatures.vue index 99cf26e..eb42701 100644 --- a/docs/.vitepress/theme/components/HomeFeatures.vue +++ b/docs/.vitepress/theme/components/HomeFeatures.vue @@ -47,17 +47,13 @@ const isCjkLocale = computed(() => { const topPromo = computed(() => { const code = lang.value ? lang.value.toLowerCase() : 'en' - if (code === 'zh-cn' || code === 'zh-tw') { - return { - text: '用 Easy-Vibe 构建你的第一个 AI 应用,最快当天可上线原型。', - cta: '开始学习 ›', - link: '/zh-cn/stage-1/learning-map/' - } - } + const isChinese = code === 'zh-cn' || code === 'zh-tw' return { - text: 'Build your first AI app with Easy-Vibe and ship a working prototype fast.', - cta: 'Start learning ›', - link: '/en/stage-1/learning-map/' + text: isChinese + ? '用 Easy-Vibe 构建你的第一个 AI 应用,最快当天可上线原型。' + : 'Build your first AI app with Easy-Vibe and ship a working prototype fast.', + cta: isChinese ? '开始学习 ›' : 'Start learning ›', + link: `/${code}/stage-1/learning-map/` } }) diff --git a/docs/.vitepress/theme/components/home/HomeAppleFooter.vue b/docs/.vitepress/theme/components/home/HomeAppleFooter.vue index d57404d..55091b3 100644 --- a/docs/.vitepress/theme/components/home/HomeAppleFooter.vue +++ b/docs/.vitepress/theme/components/home/HomeAppleFooter.vue @@ -88,6 +88,11 @@ const appleFooterInfo = computed(() => { return content[locale] || content.en }) +const footerBtnLink = computed(() => { + const locale = t.value._locale || 'zh-cn' + return withBase(`/${locale}/stage-1/learning-map/`) +}) + const footerRepositoryLink = 'https://github.com/datawhalechina/easy-vibe' const footerPolicyLinkMap = { @@ -100,26 +105,34 @@ const footerPolicyLinkMap = { } const footerColumnLinkMap = { - '零基础入门': '/zh-cn/stage-1/', - '初中级开发': '/zh-cn/stage-2/', - '高级开发': '/zh-cn/stage-3/', - '附录': '/zh-cn/appendix/', - '学习地图': '/zh-cn/stage-1/learning-map/', - '课程总览': '/zh-cn/stage-1/', + '零基础入门': '/stage-1/', + '初中级开发': '/stage-2/', + '高级开发': '/stage-3/', + '附录': '/appendix/', + '学习地图': '/stage-1/learning-map/', + '课程总览': '/stage-1/', + 'Foundations': '/stage-1/', + 'Junior/Mid Dev': '/stage-2/', + 'Senior Dev': '/stage-3/', + 'Appendix': '/appendix/', + 'Learning Map': '/stage-1/learning-map/', + 'Course Outline': '/stage-1/', + 'Overview': '/guide/introduction', +} + +const footerExternalLinks = { 'GitHub 仓库': 'https://github.com/datawhalechina/easy-vibe', - 'Foundations': '/en/stage-1/', - 'Junior/Mid Dev': '/en/stage-2/', - 'Senior Dev': '/en/stage-3/', - 'Appendix': '/en/appendix/', - 'Learning Map': '/en/stage-1/learning-map/', - 'Course Outline': '/en/stage-1/', 'GitHub Repository': 'https://github.com/datawhalechina/easy-vibe', - 'Overview': '/en/guide/introduction', - 'Changelog': 'https://github.com/datawhalechina/easy-vibe/releases' + 'Changelog': 'https://github.com/datawhalechina/easy-vibe/releases', } const getFooterLink = (label) => { - return footerColumnLinkMap[label] || '#' + const external = footerExternalLinks[label] + if (external) return external + const basePath = footerColumnLinkMap[label] + if (!basePath) return '#' + const locale = t.value._locale || 'zh-cn' + return `/${locale}${basePath}` } const getPolicyLink = (label) => { @@ -140,7 +153,7 @@ const resolveFooterHref = (link) => {

{{ t.footer.desc }}

{{ t.footer.btn }} diff --git a/docs/.vitepress/theme/components/home/HomeData.js b/docs/.vitepress/theme/components/home/HomeData.js index edec393..372fbfa 100644 --- a/docs/.vitepress/theme/components/home/HomeData.js +++ b/docs/.vitepress/theme/components/home/HomeData.js @@ -201,4 +201,4 @@ export const appendixCards = [ tag: 'General', link: '/zh-cn/appendix/1-computer-fundamentals/computer-networks' } -] \ No newline at end of file +] diff --git a/docs/.vitepress/theme/components/home/HomeI18n.js b/docs/.vitepress/theme/components/home/HomeI18n.js index fdb3f40..d0b41e5 100644 --- a/docs/.vitepress/theme/components/home/HomeI18n.js +++ b/docs/.vitepress/theme/components/home/HomeI18n.js @@ -14,10 +14,22 @@ export const i18n = { cat: '用户故事', title: '看见每一个
闪亮的你', sub: '加入他们,分享你的 vibe coding 故事', - s1: { title: '放弃月入过万,他在农村小学带孩子们“用AI赶苍蝇”', author: '小学老师小浩' }, - s2: { title: '期末考试周,我偷偷用AI造了个“校园闲鱼”', author: '一位大二学生' }, - s3: { title: '我给每个学生,做了一个不会累的“学霸同桌”', author: '高中信息技术老师' }, - s4: { title: '48岁货车司机,熬了几个通宵,硬是用AI磕出一个出海工具站', author: '货车司机老黄' }, + s1: { + title: '放弃月入过万,他在农村小学带孩子们“用AI赶苍蝇”', + author: '小学老师小浩' + }, + s2: { + title: '期末考试周,我偷偷用AI造了个“校园闲鱼”', + author: '一位大二学生' + }, + s3: { + title: '我给每个学生,做了一个不会累的“学霸同桌”', + author: '高中信息技术老师' + }, + s4: { + title: '48岁货车司机,熬了几个通宵,硬是用AI磕出一个出海工具站', + author: '货车司机老黄' + }, authorPrefix: '讲述者:', ui: { prevLabel: '上一则故事', @@ -28,8 +40,7 @@ export const i18n = { }, stage1: { cat: 'Stage 1 · 零基础入门', - title: - '没有技术背景?
正好。', + title: '没有技术背景?
正好。', sub: '不看专业、不看出身——会说话,你就能做产品。', cards: [ { @@ -195,7 +206,7 @@ export const i18n = { btn: '>_ Start' } }, - 'en': { + en: { nav: { title: 'Easy-Vibe Tutorial', home: 'Home', @@ -210,10 +221,25 @@ export const i18n = { cat: 'Vibe Stories', title: 'Meet every
shining builder.', sub: 'See how people from different backgrounds use AI to solve real problems.', - s1: { title: 'He gave up a high salary to help rural kids "fight flies" with AI', author: 'Xiaohao, primary school teacher' }, - s2: { title: 'During finals week, I secretly built a campus marketplace with AI', author: 'A sophomore student' }, - s3: { title: 'I built every student a tireless AI study buddy', author: 'A high school IT teacher' }, - s4: { title: 'A 48-year-old truck driver stayed up for nights to build an overseas AI tool site', author: 'Lao Huang, truck driver' }, + s1: { + title: + 'He gave up a high salary to help rural kids "fight flies" with AI', + author: 'Xiaohao, primary school teacher' + }, + s2: { + title: + 'During finals week, I secretly built a campus marketplace with AI', + author: 'A sophomore student' + }, + s3: { + title: 'I built every student a tireless AI study buddy', + author: 'A high school IT teacher' + }, + s4: { + title: + 'A 48-year-old truck driver stayed up for nights to build an overseas AI tool site', + author: 'Lao Huang, truck driver' + }, authorPrefix: 'By', ui: { prevLabel: 'Previous story', @@ -257,37 +283,37 @@ export const i18n = { title: 'Asset Agent', headline: 'Speed up content production.', desc: 'Build your own design-asset workflow and drawing agent with Lovart and Nanobanana.', - link: '/zh-cn/stage-2/frontend/lovart-assets/' + link: '/en/stage-2/frontend/lovart-assets/' }, { title: 'Figma & MasterGo', headline: 'Get fluent with design tools.', desc: 'Learn the basics of modern UI design tools and how design files flow into development.', - link: '/zh-cn/stage-2/frontend/figma-mastergo/' + link: '/en/stage-2/frontend/figma-mastergo/' }, { title: 'Design to Code', headline: 'Turn mockups into pages.', desc: 'Convert prototypes into real frontend code that runs in the browser instead of staying as static designs.', - link: '/zh-cn/stage-2/frontend/design-to-code/' + link: '/en/stage-2/frontend/design-to-code/' }, { title: 'Real Data Project', headline: 'Backed by a real DB.', desc: 'Design tables and permissions on Supabase and wire them into real read/write flows.', - link: '/zh-cn/stage-2/backend/database-supabase/' + link: '/en/stage-2/backend/database-supabase/' }, { title: 'Deployment', headline: 'Ship it to the world.', desc: 'Use CloudBase, Vercel and Zeabur to turn local projects into publicly reachable sites.', - link: '/zh-cn/stage-2/backend/zeabur-deployment/' + link: '/en/stage-2/backend/zeabur-deployment/' }, { title: 'AI Knowledge Base', headline: 'Plug AI into the app.', desc: 'Use Dify to build AI workflows and knowledge-base powered product experiences.', - link: '/zh-cn/stage-2/ai-capabilities/dify-knowledge-base/' + link: '/en/stage-2/ai-capabilities/dify-knowledge-base/' } ] }, @@ -300,22 +326,22 @@ export const i18n = { { title: 'Electron Desktop App', desc: 'Build a speech-to-text desktop app that runs on Windows, macOS and Linux from one codebase.', - link: '/zh-cn/stage-3/cross-platform/electron-voice-to-text/' + link: '/en/stage-3/cross-platform/electron-voice-to-text/' }, { title: 'Agent Teams', desc: 'Use Claude Agent Teams to orchestrate multiple agents like a real dev team.', - link: '/zh-cn/stage-3/core-skills/agent-teams/' + link: '/en/stage-3/core-skills/agent-teams/' }, { title: 'Long-running Tasks', desc: 'Design loops and task queues so Claude Code can safely run overnight until work is truly done.', - link: '/zh-cn/stage-3/core-skills/long-running-tasks/' + link: '/en/stage-3/core-skills/long-running-tasks/' }, { title: 'Personal Brand', desc: 'Build your own website and tech blog to showcase projects and writing.', - link: '/zh-cn/stage-3/personal-brand/personal-website-blog/' + link: '/en/stage-3/personal-brand/personal-website-blog/' } ] }, @@ -328,62 +354,62 @@ export const i18n = { { title: 'AI History', desc: 'Milestones in AI evolution.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/en/appendix/8-artificial-intelligence/ai-history' }, { title: 'Prompt Eng', desc: 'Master AI communication skills.', - link: '/zh-cn/appendix/8-artificial-intelligence/prompt-engineering' + link: '/en/appendix/8-artificial-intelligence/prompt-engineering' }, { title: 'LLM Intro', desc: 'Understanding Large Language Models.', - link: '/zh-cn/appendix/8-artificial-intelligence/llm-principles' + link: '/en/appendix/8-artificial-intelligence/llm-principles' }, { title: 'AI Agents', desc: 'Autonomous decision-making AI.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-agents' + link: '/en/appendix/8-artificial-intelligence/ai-agents' }, { title: 'Web Basics', desc: 'HTML/CSS/JS fundamentals.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/en/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Frontend Evo', desc: 'Evolution of frontend tech stack.', - link: '/zh-cn/appendix/3-browser-and-frontend/frontend-frameworks' + link: '/en/appendix/3-browser-and-frontend/frontend-frameworks' }, { title: 'Backend Arch', desc: 'From monolith to microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/en/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'Backend Lang', desc: 'Choosing the right tech stack.', - link: '/zh-cn/appendix/4-server-and-backend/backend-languages' + link: '/en/appendix/4-server-and-backend/backend-languages' }, { title: 'Database', desc: 'Core principles of data storage.', - link: '/zh-cn/appendix/5-data/database-fundamentals' + link: '/en/appendix/5-data/database-fundamentals' }, { title: 'API Design', desc: 'Designing robust interfaces.', - link: '/zh-cn/appendix/4-server-and-backend/api-intro' + link: '/en/appendix/4-server-and-backend/api-intro' }, { title: 'Git', desc: 'Version control mastery.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/en/appendix/2-development-tools/git-version-control' }, { title: 'Networks', desc: 'Protocols and communication.', - link: '/zh-cn/appendix/1-computer-fundamentals/computer-networks' + link: '/en/appendix/1-computer-fundamentals/computer-networks' } ] }, @@ -408,10 +434,24 @@ export const i18n = { cat: 'ユーザーストーリー', title: 'それぞれの
輝く物語を見よう。', sub: 'さまざまな背景の人たちが、AIで現実の課題をどう解決したかを紹介します。', - s1: { title: '高収入の仕事を辞め、農村の子どもたちとAIで「ハエ対策」アプリを作った先生', author: '小学校教師 小浩' }, - s2: { title: '期末試験の週に、AIでこっそり「学内版フリマ」を作った', author: '大学2年生' }, - s3: { title: '生徒一人ひとりに、疲れない「AI優等生の隣の席」を作った', author: '高校の情報技術教師' }, - s4: { title: '48歳のトラック運転手が、徹夜で海外向けAIツールサイトを作り上げた', author: 'トラック運転手 老黄' }, + s1: { + title: + '高収入の仕事を辞め、農村の子どもたちとAIで「ハエ対策」アプリを作った先生', + author: '小学校教師 小浩' + }, + s2: { + title: '期末試験の週に、AIでこっそり「学内版フリマ」を作った', + author: '大学2年生' + }, + s3: { + title: '生徒一人ひとりに、疲れない「AI優等生の隣の席」を作った', + author: '高校の情報技術教師' + }, + s4: { + title: + '48歳のトラック運転手が、徹夜で海外向けAIツールサイトを作り上げた', + author: 'トラック運転手 老黄' + }, authorPrefix: '語り手:', ui: { prevLabel: '前のストーリー', @@ -430,19 +470,19 @@ export const i18n = { title: 'AI PM', desc: 'アイデアからプロトタイプまで、話すだけ。', sub: '非技術者向け', - link: '/zh-cn/stage-1/learning-map/' + link: '/ja-jp/stage-1/learning-map/' }, { title: 'ゲーム化入門', desc: 'スネークゲームやテトリスを作って、コードへの恐怖を克服。', sub: '遊びながら学ぶ', - link: '/zh-cn/stage-1/learning-map/' + link: '/ja-jp/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: 'AI時代のコーディングの核心:プロンプトエンジニアリングとコンテキスト管理。', sub: '核心的な考え方', - link: '/zh-cn/stage-1/learning-map/' + link: '/ja-jp/stage-1/learning-map/' } ] }, @@ -456,19 +496,19 @@ export const i18n = { title: 'フルスタック', headline: 'フロント&バックエンド。', desc: 'DB設計からAPI、コンポーネントまで、現代的なWebアプリを完全に構築。', - link: '/zh-cn/stage-2/' + link: '/ja-jp/stage-2/' }, { title: 'リアルプロジェクト', headline: 'おもちゃのコードは卒業。', desc: '認証、ストレージ、ファイルアップロード、コアビジネスロジックを深く掘り下げる。', - link: '/zh-cn/stage-2/' + link: '/ja-jp/stage-2/' }, { title: 'デプロイ', headline: '世界に公開。', desc: 'サーバー設定、DNS、CI/CD。製品リリースのラストワンマイル。', - link: '/zh-cn/stage-2/' + link: '/ja-jp/stage-2/' } ] }, @@ -480,22 +520,22 @@ export const i18n = { { title: 'WeChatミニアプリ', desc: 'クロスプラットフォーム開発、数億人のユーザーに到達。', - link: '/zh-cn/stage-3/' + link: '/ja-jp/stage-3/' }, { title: 'AIネイティブアプリ', desc: 'RAG、Agent。LLMの限界を探る。', - link: '/zh-cn/stage-3/' + link: '/ja-jp/stage-3/' }, { title: '複雑なアーキテクチャ', desc: '高並行性、高可用性のアーキテクチャ設計。', - link: '/zh-cn/stage-3/' + link: '/ja-jp/stage-3/' }, { title: 'パーソナルブランド', desc: '自分のウェブサイトと学術ブログを構築。', - link: '/zh-cn/stage-3/' + link: '/ja-jp/stage-3/' } ] }, @@ -508,22 +548,22 @@ export const i18n = { { title: 'AI Fundamentals', desc: 'LLM, Agent, RAG. Dive into AI internals.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/ja-jp/appendix/8-artificial-intelligence/ai-history' }, { title: 'Frontend', desc: 'Browser internals, Performance, Canvas.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/ja-jp/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Backend', desc: 'High concurrency, Distributed systems, Microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/ja-jp/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'General Skills', desc: 'Git, Networks, IDE internals.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/ja-jp/appendix/2-development-tools/git-version-control' } ] }, @@ -548,10 +588,22 @@ export const i18n = { cat: '使用者故事', title: '看見每一個
閃光的你。', sub: '看看不同背景的人,如何用 AI 解決真實問題、做出真實產品。', - s1: { title: '放棄月入過萬,他在鄉村小學帶孩子們「用 AI 趕蒼蠅」', author: '小學老師小浩' }, - s2: { title: '期末考週,我偷偷用 AI 做了個「校園閒魚」', author: '一位大二學生' }, - s3: { title: '我給每個學生,做了一個不會累的「學霸同桌」', author: '高中資訊科技老師' }, - s4: { title: '48 歲貨車司機熬了幾個通宵,硬是用 AI 做出一個出海工具站', author: '貨車司機老黃' }, + s1: { + title: '放棄月入過萬,他在鄉村小學帶孩子們「用 AI 趕蒼蠅」', + author: '小學老師小浩' + }, + s2: { + title: '期末考週,我偷偷用 AI 做了個「校園閒魚」', + author: '一位大二學生' + }, + s3: { + title: '我給每個學生,做了一個不會累的「學霸同桌」', + author: '高中資訊科技老師' + }, + s4: { + title: '48 歲貨車司機熬了幾個通宵,硬是用 AI 做出一個出海工具站', + author: '貨車司機老黃' + }, authorPrefix: '講述者:', ui: { prevLabel: '上一則故事', @@ -570,19 +622,19 @@ export const i18n = { title: 'AI 產品經理', desc: '從想法到高保真原型,你只需要會說話。', sub: '適合非技術背景', - link: '/zh-cn/stage-1/learning-map/' + link: '/zh-tw/stage-1/learning-map/' }, { title: '遊戲化入門', desc: '通過製作貪吃蛇、俄羅斯方塊,打破對代碼的恐懼。', sub: '邊玩邊學', - link: '/zh-cn/stage-1/learning-map/' + link: '/zh-tw/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: '掌握 AI 時代的編程核心:提示詞工程與上下文管理。', sub: '核心心法', - link: '/zh-cn/stage-1/learning-map/' + link: '/zh-tw/stage-1/learning-map/' } ] }, @@ -595,19 +647,19 @@ export const i18n = { title: '全棧開發', headline: '獨立完成前後端。', desc: '從數據庫設計到 API 開發,再到前端組件化,完整構建一個現代化 Web 應用。', - link: '/zh-cn/stage-2/' + link: '/zh-tw/stage-2/' }, { title: '真實項目', headline: '拒絕玩具代碼。', desc: '深入理解用戶鑑權、數據存儲、文件上傳等核心業務邏輯。', - link: '/zh-cn/stage-2/' + link: '/zh-tw/stage-2/' }, { title: '部署上線', headline: '讓世界看到你的作品。', desc: '學習服務器配置、域名解析和自動化部署,打通產品落地的最後一公里。', - link: '/zh-cn/stage-2/' + link: '/zh-tw/stage-2/' } ] }, @@ -619,22 +671,22 @@ export const i18n = { { title: '微信小程序', desc: '跨平台開發,觸達億級用戶。', - link: '/zh-cn/stage-3/' + link: '/zh-tw/stage-3/' }, { title: 'AI 原生應用', desc: 'RAG、Agent,探索 LLM 的無限可能。', - link: '/zh-cn/stage-3/' + link: '/zh-tw/stage-3/' }, { title: '複雜業務架構', desc: '應對高並發、高可用場景的架構設計。', - link: '/zh-cn/stage-3/' + link: '/zh-tw/stage-3/' }, { title: '個人品牌', desc: '構建屬於自己的個人網頁與學術博客。', - link: '/zh-cn/stage-3/' + link: '/zh-tw/stage-3/' } ] }, @@ -646,22 +698,22 @@ export const i18n = { { title: '人工智能', desc: 'LLM、Agent、RAG,深入 AI 底層原理。', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/zh-tw/appendix/8-artificial-intelligence/ai-history' }, { title: '前端開發', desc: '瀏覽器原理、性能優化、Canvas 圖形學。', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/zh-tw/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: '後端架構', desc: '高並發、分佈式、微服務架構設計。', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/zh-tw/appendix/4-server-and-backend/backend-layered-architecture' }, { title: '通用技能', desc: 'Git、網絡、IDE 原理,開發者必備素養。', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/zh-tw/appendix/2-development-tools/git-version-control' } ] }, @@ -684,12 +736,27 @@ export const i18n = { }, stories: { cat: '사용자 이야기', - title: '빛나는 모두의
이야기를 만나보세요.', + title: + '빛나는 모두의
이야기를 만나보세요.', sub: '서로 다른 배경의 사람들이 AI로 현실의 문제를 어떻게 해결했는지 살펴보세요.', - s1: { title: '높은 월급을 포기하고 시골 초등학교 아이들과 AI로 "파리 막기"를 만든 선생님', author: '초등학교 교사 샤오하오' }, - s2: { title: '기말고사 주간에 몰래 AI로 "캠퍼스 중고장터"를 만든 이야기', author: '대학교 2학년 학생' }, - s3: { title: '모든 학생에게 지치지 않는 "AI 우등생 짝꿍"을 만들어 준 선생님', author: '고등학교 정보기술 교사' }, - s4: { title: '48세 트럭 운전사가 며칠 밤을 새워 해외용 AI 툴 사이트를 만든 이야기', author: '트럭 운전사 라오황' }, + s1: { + title: + '높은 월급을 포기하고 시골 초등학교 아이들과 AI로 "파리 막기"를 만든 선생님', + author: '초등학교 교사 샤오하오' + }, + s2: { + title: '기말고사 주간에 몰래 AI로 "캠퍼스 중고장터"를 만든 이야기', + author: '대학교 2학년 학생' + }, + s3: { + title: '모든 학생에게 지치지 않는 "AI 우등생 짝꿍"을 만들어 준 선생님', + author: '고등학교 정보기술 교사' + }, + s4: { + title: + '48세 트럭 운전사가 며칠 밤을 새워 해외용 AI 툴 사이트를 만든 이야기', + author: '트럭 운전사 라오황' + }, authorPrefix: '화자:', ui: { prevLabel: '이전 이야기', @@ -708,19 +775,19 @@ export const i18n = { title: 'AI 제품 관리자', desc: '아이디어에서 프로토타입까지, 말 한마디로.', sub: '비전공자 추천', - link: '/zh-cn/stage-1/learning-map/' + link: '/ko-kr/stage-1/learning-map/' }, { title: '게임으로 입문', desc: '스네이크 게임, 테트리스를 만들며 코딩 공포증 극복.', sub: '놀면서 배우기', - link: '/zh-cn/stage-1/learning-map/' + link: '/ko-kr/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: 'AI 시대 코딩의 핵심: 프롬프트 엔지니어링과 컨텍스트 관리.', sub: '핵심 마인드셋', - link: '/zh-cn/stage-1/learning-map/' + link: '/ko-kr/stage-1/learning-map/' } ] }, @@ -733,19 +800,19 @@ export const i18n = { title: '풀스택 개발', headline: '프론트 & 백엔드 독립 완성.', desc: 'DB 설계부터 API 개발, 프론트엔드 컴포넌트화까지 현대적인 웹 앱을 완벽하게 구축.', - link: '/zh-cn/stage-2/' + link: '/ko-kr/stage-2/' }, { title: '실전 프로젝트', headline: '장난감 코드는 그만.', desc: '사용자 인증, 데이터 저장, 파일 업로드 등 핵심 비즈니스 로직 심층 이해.', - link: '/zh-cn/stage-2/' + link: '/ko-kr/stage-2/' }, { title: '배포 및 출시', headline: '세상에 보여주세요.', desc: '서버 설정, 도메인 연결, CI/CD. 제품 출시의 마지막 관문.', - link: '/zh-cn/stage-2/' + link: '/ko-kr/stage-2/' } ] }, @@ -758,22 +825,22 @@ export const i18n = { { title: '위챗 미니프로그램', desc: '크로스 플랫폼 개발, 수억 명의 사용자 도달.', - link: '/zh-cn/stage-3/' + link: '/ko-kr/stage-3/' }, { title: 'AI 네이티브 앱', desc: 'RAG, Agent. LLM의 한계 탐색.', - link: '/zh-cn/stage-3/' + link: '/ko-kr/stage-3/' }, { title: '복잡한 아키텍처', desc: '고동시성, 고가용성 아키텍처 설계.', - link: '/zh-cn/stage-3/' + link: '/ko-kr/stage-3/' }, { title: '퍼스널 브랜딩', desc: '나만의 웹사이트와 학술 블로그 구축.', - link: '/zh-cn/stage-3/' + link: '/ko-kr/stage-3/' } ] }, @@ -786,22 +853,22 @@ export const i18n = { { title: 'AI Fundamentals', desc: 'LLM, Agent, RAG. Dive into AI internals.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/ko-kr/appendix/8-artificial-intelligence/ai-history' }, { title: 'Frontend', desc: 'Browser internals, Performance, Canvas.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/ko-kr/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Backend', desc: 'High concurrency, Distributed systems, Microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/ko-kr/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'General Skills', desc: 'Git, Networks, IDE internals.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/ko-kr/appendix/2-development-tools/git-version-control' } ] }, @@ -824,12 +891,29 @@ export const i18n = { }, stories: { cat: 'Historias de usuarios', - title: 'Conoce cada
historia que brilla.', + title: + 'Conoce cada
historia que brilla.', sub: 'Descubre cómo personas de distintos contextos usan la IA para resolver problemas reales.', - s1: { title: 'Dejó un salario de cinco cifras para ayudar a niños rurales a "ahuyentar moscas" con IA', author: 'Xiaohao, maestro de primaria rural' }, - s2: { title: 'Durante la semana de finales, construí en secreto un mercado universitario con IA', author: 'Una estudiante de segundo año' }, - s3: { title: 'Le construí a cada alumno un compañero de estudio con IA que nunca se cansa', author: 'Un profesor de informática de secundaria' }, - s4: { title: 'Un camionero de 48 años pasó varias noches despierto para crear una web de herramientas de IA para el extranjero', author: 'Lao Huang, camionero' }, + s1: { + title: + 'Dejó un salario de cinco cifras para ayudar a niños rurales a "ahuyentar moscas" con IA', + author: 'Xiaohao, maestro de primaria rural' + }, + s2: { + title: + 'Durante la semana de finales, construí en secreto un mercado universitario con IA', + author: 'Una estudiante de segundo año' + }, + s3: { + title: + 'Le construí a cada alumno un compañero de estudio con IA que nunca se cansa', + author: 'Un profesor de informática de secundaria' + }, + s4: { + title: + 'Un camionero de 48 años pasó varias noches despierto para crear una web de herramientas de IA para el extranjero', + author: 'Lao Huang, camionero' + }, authorPrefix: 'Por', ui: { prevLabel: 'Historia anterior', @@ -848,19 +932,19 @@ export const i18n = { title: 'PM de IA', desc: 'De la idea al prototipo, solo hablando.', sub: 'Amigable para no técnicos', - link: '/zh-cn/stage-1/learning-map/' + link: '/es-es/stage-1/learning-map/' }, { title: 'Intro Gamificada', desc: 'Crea Snake, Tetris y rompe el miedo al código.', sub: 'Aprende jugando', - link: '/zh-cn/stage-1/learning-map/' + link: '/es-es/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: 'Domina el núcleo de la programación con IA: Ingeniería de Prompts y Contexto.', sub: 'Mentalidad Clave', - link: '/zh-cn/stage-1/learning-map/' + link: '/es-es/stage-1/learning-map/' } ] }, @@ -873,19 +957,19 @@ export const i18n = { title: 'Mapa de la Etapa', headline: 'Primero entiende el recorrido completo.', desc: 'Revisa la vista general de Stage 2 para ver cómo encajan frontend, backend, DB y despliegue.', - link: '/zh-cn/stage-2/' + link: '/es-es/stage-2/' }, { title: 'Proyecto con DB real', headline: 'Supabase como base de datos de verdad.', desc: 'Diseña tablas y permisos en Supabase y conéctalos a flujos reales de lectura/escritura.', - link: '/zh-cn/stage-2/backend/database-supabase/' + link: '/es-es/stage-2/backend/database-supabase/' }, { title: 'Despliegue en producción', headline: 'Lleva tu app al mundo real.', desc: 'Usa CloudBase, Vercel y Zeabur para convertir tu código local en un sitio público.', - link: '/zh-cn/stage-2/backend/zeabur-deployment/' + link: '/es-es/stage-2/backend/zeabur-deployment/' } ] }, @@ -898,22 +982,22 @@ export const i18n = { { title: 'App de escritorio multiplataforma', desc: 'Crea con Electron una app de voz a texto que funciona en Windows, macOS y Linux con una sola base de código.', - link: '/zh-cn/stage-3/cross-platform/electron-voice-to-text/' + link: '/es-es/stage-3/cross-platform/electron-voice-to-text/' }, { title: 'Equipos de agentes IA', desc: 'Usa Claude Agent Teams para orquestar varios agentes como si fueran un equipo de desarrollo real.', - link: '/zh-cn/stage-3/core-skills/agent-teams/' + link: '/es-es/stage-3/core-skills/agent-teams/' }, { title: 'Tareas de larga duración', desc: 'Diseña bucles y colas de tareas para que Claude Code pueda trabajar durante horas de forma estable.', - link: '/zh-cn/stage-3/core-skills/long-running-tasks/' + link: '/es-es/stage-3/core-skills/long-running-tasks/' }, { title: 'Marca personal', desc: 'Construye tu sitio web y blog técnico para dar visibilidad a tus proyectos.', - link: '/zh-cn/stage-3/personal-brand/personal-website-blog/' + link: '/es-es/stage-3/personal-brand/personal-website-blog/' } ] }, @@ -926,22 +1010,22 @@ export const i18n = { { title: 'AI Fundamentals', desc: 'LLM, Agent, RAG. Dive into AI internals.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/es-es/appendix/8-artificial-intelligence/ai-history' }, { title: 'Frontend', desc: 'Browser internals, Performance, Canvas.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/es-es/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Backend', desc: 'High concurrency, Distributed systems, Microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/es-es/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'General Skills', desc: 'Git, Networks, IDE internals.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/es-es/appendix/2-development-tools/git-version-control' } ] }, @@ -964,12 +1048,29 @@ export const i18n = { }, stories: { cat: 'Histoires d’utilisateurs', - title: 'Découvrez chaque
parcours inspirant.', + title: + 'Découvrez chaque
parcours inspirant.', sub: 'Voyez comment des personnes de tous horizons utilisent l’IA pour résoudre de vrais problèmes.', - s1: { title: 'Il a quitté un salaire confortable pour aider des enfants d’une école rurale à "chasser les mouches" avec l’IA', author: 'Xiaohao, instituteur' }, - s2: { title: 'Pendant la semaine des examens, j’ai secrètement créé une marketplace de campus avec l’IA', author: 'Une étudiante de deuxième année' }, - s3: { title: 'J’ai créé pour chaque élève un binôme d’étude IA qui ne se fatigue jamais', author: 'Un professeur d’informatique au lycée' }, - s4: { title: 'Un chauffeur routier de 48 ans a veillé plusieurs nuits pour lancer un site d’outils IA à l’international', author: 'Lao Huang, chauffeur routier' }, + s1: { + title: + 'Il a quitté un salaire confortable pour aider des enfants d’une école rurale à "chasser les mouches" avec l’IA', + author: 'Xiaohao, instituteur' + }, + s2: { + title: + 'Pendant la semaine des examens, j’ai secrètement créé une marketplace de campus avec l’IA', + author: 'Une étudiante de deuxième année' + }, + s3: { + title: + 'J’ai créé pour chaque élève un binôme d’étude IA qui ne se fatigue jamais', + author: 'Un professeur d’informatique au lycée' + }, + s4: { + title: + 'Un chauffeur routier de 48 ans a veillé plusieurs nuits pour lancer un site d’outils IA à l’international', + author: 'Lao Huang, chauffeur routier' + }, authorPrefix: 'Par', ui: { prevLabel: 'Histoire précédente', @@ -988,19 +1089,19 @@ export const i18n = { title: 'PM IA', desc: "De l'idée au prototype, juste en parlant.", sub: 'Accessible aux non-tech', - link: '/zh-cn/stage-1/learning-map/' + link: '/fr-fr/stage-1/learning-map/' }, { title: 'Intro Gamifiée', desc: 'Créez Snake, Tetris et brisez la peur du code.', sub: 'Apprendre en jouant', - link: '/zh-cn/stage-1/learning-map/' + link: '/fr-fr/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: 'Maîtrisez le cœur du codage IA : Prompt Engineering & Contexte.', sub: 'Esprit Clé', - link: '/zh-cn/stage-1/learning-map/' + link: '/fr-fr/stage-1/learning-map/' } ] }, @@ -1014,19 +1115,19 @@ export const i18n = { title: 'Full Stack', headline: 'Frontend & Backend.', desc: 'Du design DB aux API et composants, construisez une web app moderne complète.', - link: '/zh-cn/stage-2/' + link: '/fr-fr/stage-2/' }, { title: 'Projets Réels', headline: 'Pas de code jouet.', desc: "Plongez dans l'Auth, le Stockage, l'Upload de fichiers et la logique métier.", - link: '/zh-cn/stage-2/' + link: '/fr-fr/stage-2/' }, { title: 'Déploiement', headline: 'Montrez au monde.', desc: 'Config serveur, DNS, CI/CD. Le dernier kilomètre de la livraison produit.', - link: '/zh-cn/stage-2/' + link: '/fr-fr/stage-2/' } ] }, @@ -1039,22 +1140,22 @@ export const i18n = { { title: 'WeChat Mini-app', desc: "Dév multiplateforme, touchant des millions d'utilisateurs.", - link: '/zh-cn/stage-3/' + link: '/fr-fr/stage-3/' }, { title: 'Apps Natives IA', desc: 'RAG, Agent. Explorez les limites des LLM.', - link: '/zh-cn/stage-3/' + link: '/fr-fr/stage-3/' }, { title: 'Arch. Complexe', desc: "Conception d'architecture haute concurrence et haute disponibilité.", - link: '/zh-cn/stage-3/' + link: '/fr-fr/stage-3/' }, { title: 'Marque Perso', desc: 'Construisez votre propre site web et blog académique.', - link: '/zh-cn/stage-3/' + link: '/fr-fr/stage-3/' } ] }, @@ -1067,22 +1168,22 @@ export const i18n = { { title: 'AI Fundamentals', desc: 'LLM, Agent, RAG. Dive into AI internals.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/fr-fr/appendix/8-artificial-intelligence/ai-history' }, { title: 'Frontend', desc: 'Browser internals, Performance, Canvas.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/fr-fr/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Backend', desc: 'High concurrency, Distributed systems, Microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/fr-fr/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'General Skills', desc: 'Git, Networks, IDE internals.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/fr-fr/appendix/2-development-tools/git-version-control' } ] }, @@ -1105,12 +1206,29 @@ export const i18n = { }, stories: { cat: 'Nutzergeschichten', - title: 'Entdecke jede
inspirierende Geschichte.', + title: + 'Entdecke jede
inspirierende Geschichte.', sub: 'Sieh, wie Menschen mit ganz unterschiedlichen Hintergründen mit KI echte Probleme lösen.', - s1: { title: 'Er gab ein hohes Gehalt auf, um Kindern auf dem Land mit KI beim "Fliegenvertreiben" zu helfen', author: 'Xiaohao, Grundschullehrer' }, - s2: { title: 'In der Prüfungswoche habe ich heimlich mit KI einen Campus-Marktplatz gebaut', author: 'Eine Studentin im zweiten Jahr' }, - s3: { title: 'Ich habe jedem Schüler einen unermüdlichen KI-Lernpartner gebaut', author: 'Ein Informatiklehrer an einer Oberschule' }, - s4: { title: 'Ein 48-jähriger Lkw-Fahrer blieb mehrere Nächte wach, um eine internationale KI-Toolseite zu bauen', author: 'Lao Huang, Lkw-Fahrer' }, + s1: { + title: + 'Er gab ein hohes Gehalt auf, um Kindern auf dem Land mit KI beim "Fliegenvertreiben" zu helfen', + author: 'Xiaohao, Grundschullehrer' + }, + s2: { + title: + 'In der Prüfungswoche habe ich heimlich mit KI einen Campus-Marktplatz gebaut', + author: 'Eine Studentin im zweiten Jahr' + }, + s3: { + title: + 'Ich habe jedem Schüler einen unermüdlichen KI-Lernpartner gebaut', + author: 'Ein Informatiklehrer an einer Oberschule' + }, + s4: { + title: + 'Ein 48-jähriger Lkw-Fahrer blieb mehrere Nächte wach, um eine internationale KI-Toolseite zu bauen', + author: 'Lao Huang, Lkw-Fahrer' + }, authorPrefix: 'Von', ui: { prevLabel: 'Vorherige Geschichte', @@ -1129,19 +1247,19 @@ export const i18n = { title: 'KI PM', desc: 'Von der Idee zum Prototyp, einfach durch Sprechen.', sub: 'Nicht-Tech-freundlich', - link: '/zh-cn/stage-1/learning-map/' + link: '/de-de/stage-1/learning-map/' }, { title: 'Gamifizierte Intro', desc: 'Baue Snake, Tetris und überwinde die Angst vor Code.', sub: 'Spielend lernen', - link: '/zh-cn/stage-1/learning-map/' + link: '/de-de/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: 'Meistere den Kern des KI-Codings: Prompt Engineering & Kontext.', sub: 'Kern-Mindset', - link: '/zh-cn/stage-1/learning-map/' + link: '/de-de/stage-1/learning-map/' } ] }, @@ -1154,19 +1272,19 @@ export const i18n = { title: 'Full Stack', headline: 'Frontend & Backend.', desc: 'Vom DB-Design bis zu APIs und Komponenten, baue eine moderne Web-App komplett.', - link: '/zh-cn/stage-2/' + link: '/de-de/stage-2/' }, { title: 'Echte Projekte', headline: 'Kein Spielzeug-Code.', desc: 'Tauche ein in Auth, Speicher, Datei-Uploads und Kern-Geschäftslogik.', - link: '/zh-cn/stage-2/' + link: '/de-de/stage-2/' }, { title: 'Deployment', headline: 'Zeig es der Welt.', desc: 'Server-Konfig, DNS, CI/CD. Die letzte Meile der Produktlieferung.', - link: '/zh-cn/stage-2/' + link: '/de-de/stage-2/' } ] }, @@ -1179,22 +1297,22 @@ export const i18n = { { title: 'WeChat Mini-App', desc: 'Plattformübergreifende Entwicklung, Millionen von Nutzern erreichen.', - link: '/zh-cn/stage-3/' + link: '/de-de/stage-3/' }, { title: 'KI-Native Apps', desc: 'RAG, Agent. Erkunde die Grenzen von LLMs.', - link: '/zh-cn/stage-3/' + link: '/de-de/stage-3/' }, { title: 'Komplexe Arch', desc: 'Architekturdesign für hohe Gleichzeitigkeit und hohe Verfügbarkeit.', - link: '/zh-cn/stage-3/' + link: '/de-de/stage-3/' }, { title: 'Persönliche Marke', desc: 'Baue deine eigene Website und deinen akademischen Blog.', - link: '/zh-cn/stage-3/' + link: '/de-de/stage-3/' } ] }, @@ -1207,22 +1325,22 @@ export const i18n = { { title: 'AI Fundamentals', desc: 'LLM, Agent, RAG. Dive into AI internals.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/de-de/appendix/8-artificial-intelligence/ai-history' }, { title: 'Frontend', desc: 'Browser internals, Performance, Canvas.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/de-de/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Backend', desc: 'High concurrency, Distributed systems, Microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/de-de/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'General Skills', desc: 'Git, Networks, IDE internals.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/de-de/appendix/2-development-tools/git-version-control' } ] }, @@ -1247,10 +1365,25 @@ export const i18n = { cat: 'قصص المستخدمين', title: 'تعرّف على كل
قصة ملهمة.', sub: 'اكتشف كيف يستخدم أشخاص من خلفيات مختلفة الذكاء الاصطناعي لحل مشكلات حقيقية.', - s1: { title: 'تخلّى عن راتب مرتفع ليساعد أطفال مدرسة ريفية على "طرد الذباب" باستخدام الذكاء الاصطناعي', author: 'شياوهاو، معلم مدرسة ابتدائية' }, - s2: { title: 'خلال أسبوع الامتحانات النهائية، بنيت سرًا سوقًا جامعيًا باستخدام الذكاء الاصطناعي', author: 'طالبة في السنة الثانية' }, - s3: { title: 'صنعت لكل طالب زميل دراسة بالذكاء الاصطناعي لا يتعب أبدًا', author: 'معلم تقنية معلومات في الثانوية' }, - s4: { title: 'سائق شاحنة يبلغ 48 عامًا سهر عدة ليالٍ ليبني موقع أدوات ذكاء اصطناعي للأسواق الخارجية', author: 'لاو هوانغ، سائق شاحنة' }, + s1: { + title: + 'تخلّى عن راتب مرتفع ليساعد أطفال مدرسة ريفية على "طرد الذباب" باستخدام الذكاء الاصطناعي', + author: 'شياوهاو، معلم مدرسة ابتدائية' + }, + s2: { + title: + 'خلال أسبوع الامتحانات النهائية، بنيت سرًا سوقًا جامعيًا باستخدام الذكاء الاصطناعي', + author: 'طالبة في السنة الثانية' + }, + s3: { + title: 'صنعت لكل طالب زميل دراسة بالذكاء الاصطناعي لا يتعب أبدًا', + author: 'معلم تقنية معلومات في الثانوية' + }, + s4: { + title: + 'سائق شاحنة يبلغ 48 عامًا سهر عدة ليالٍ ليبني موقع أدوات ذكاء اصطناعي للأسواق الخارجية', + author: 'لاو هوانغ، سائق شاحنة' + }, authorPrefix: 'الراوي:', ui: { prevLabel: 'القصة السابقة', @@ -1269,19 +1402,19 @@ export const i18n = { title: 'مدير منتج AI', desc: 'من الفكرة إلى النموذج الأولي، بمجرد التحدث.', sub: 'صديق لغير التقنيين', - link: '/zh-cn/stage-1/learning-map/' + link: '/ar-sa/stage-1/learning-map/' }, { title: 'مقدمة بالألعاب', desc: 'ابنِ Snake و Tetris واكسر حاجز الخوف من الكود.', sub: 'تعلم باللعب', - link: '/zh-cn/stage-1/learning-map/' + link: '/ar-sa/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: 'أتقن جوهر برمجة الذكاء الاصطناعي: هندسة الأوامر والسياق.', sub: 'العقلية الأساسية', - link: '/zh-cn/stage-1/learning-map/' + link: '/ar-sa/stage-1/learning-map/' } ] }, @@ -1295,19 +1428,19 @@ export const i18n = { title: 'Full Stack', headline: 'واجهة أمامية وخلفية.', desc: 'من تصميم DB إلى API والمكونات، ابنِ تطبيق ويب حديث بالكامل.', - link: '/zh-cn/stage-2/' + link: '/ar-sa/stage-2/' }, { title: 'مشاريع حقيقية', headline: 'ليس كود ألعاب.', desc: 'تعمق في المصادقة، التخزين، رفع الملفات ومنطق العمل الأساسي.', - link: '/zh-cn/stage-2/' + link: '/ar-sa/stage-2/' }, { title: 'النشر', headline: 'أظهر للعالم.', desc: 'إعداد الخادم، DNS، CI/CD. الميل الأخير لتسليم المنتج.', - link: '/zh-cn/stage-2/' + link: '/ar-sa/stage-2/' } ] }, @@ -1320,22 +1453,22 @@ export const i18n = { { title: 'برنامج WeChat المصغر', desc: 'تطوير متعدد المنصات، الوصول لملايين المستخدمين.', - link: '/zh-cn/stage-3/' + link: '/ar-sa/stage-3/' }, { title: 'تطبيقات AI الأصلية', desc: 'RAG، Agent. استكشف حدود LLMs.', - link: '/zh-cn/stage-3/' + link: '/ar-sa/stage-3/' }, { title: 'هندسة معقدة', desc: 'تصميم هندسة التزامن العالي والتوافر العالي.', - link: '/zh-cn/stage-3/' + link: '/ar-sa/stage-3/' }, { title: 'العلامة التجارية الشخصية', desc: 'ابنِ موقعك الخاص ومدونتك الأكاديمية.', - link: '/zh-cn/stage-3/' + link: '/ar-sa/stage-3/' } ] }, @@ -1348,22 +1481,22 @@ export const i18n = { { title: 'AI Fundamentals', desc: 'LLM, Agent, RAG. Dive into AI internals.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/ar-sa/appendix/8-artificial-intelligence/ai-history' }, { title: 'Frontend', desc: 'Browser internals, Performance, Canvas.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/ar-sa/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Backend', desc: 'High concurrency, Distributed systems, Microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/ar-sa/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'General Skills', desc: 'Git, Networks, IDE internals.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/ar-sa/appendix/2-development-tools/git-version-control' } ] }, @@ -1386,12 +1519,28 @@ export const i18n = { }, stories: { cat: 'Câu chuyện người dùng', - title: 'Gặp gỡ từng
câu chuyện tỏa sáng.', + title: + 'Gặp gỡ từng
câu chuyện tỏa sáng.', sub: 'Khám phá cách những người từ nhiều xuất phát điểm khác nhau dùng AI để giải quyết vấn đề thật.', - s1: { title: 'Anh bỏ mức lương cao để giúp trẻ em vùng quê "đuổi ruồi" bằng AI', author: 'Xiaohao, giáo viên tiểu học' }, - s2: { title: 'Trong tuần thi cuối kỳ, tôi lặng lẽ làm một chợ đồ cũ trong trường bằng AI', author: 'Một sinh viên năm hai' }, - s3: { title: 'Tôi tạo cho mỗi học sinh một bạn học giỏi AI không biết mệt', author: 'Một giáo viên CNTT trung học' }, - s4: { title: 'Một tài xế xe tải 48 tuổi thức trắng nhiều đêm để làm một website công cụ AI cho thị trường quốc tế', author: 'Lao Huang, tài xế xe tải' }, + s1: { + title: + 'Anh bỏ mức lương cao để giúp trẻ em vùng quê "đuổi ruồi" bằng AI', + author: 'Xiaohao, giáo viên tiểu học' + }, + s2: { + title: + 'Trong tuần thi cuối kỳ, tôi lặng lẽ làm một chợ đồ cũ trong trường bằng AI', + author: 'Một sinh viên năm hai' + }, + s3: { + title: 'Tôi tạo cho mỗi học sinh một bạn học giỏi AI không biết mệt', + author: 'Một giáo viên CNTT trung học' + }, + s4: { + title: + 'Một tài xế xe tải 48 tuổi thức trắng nhiều đêm để làm một website công cụ AI cho thị trường quốc tế', + author: 'Lao Huang, tài xế xe tải' + }, authorPrefix: 'Người kể:', ui: { prevLabel: 'Câu chuyện trước', @@ -1410,19 +1559,19 @@ export const i18n = { title: 'AI PM', desc: 'Từ ý tưởng đến nguyên mẫu, chỉ bằng lời nói.', sub: 'Thân thiện với non-tech', - link: '/zh-cn/stage-1/learning-map/' + link: '/vi-vn/stage-1/learning-map/' }, { title: 'Nhập môn qua Game', desc: 'Xây dựng Snake, Tetris và phá bỏ nỗi sợ code.', sub: 'Học mà chơi', - link: '/zh-cn/stage-1/learning-map/' + link: '/vi-vn/stage-1/learning-map/' }, { title: 'Vibe Coding', desc: 'Nắm vững cốt lõi lập trình AI: Prompt Engineering & Context.', sub: 'Tư duy cốt lõi', - link: '/zh-cn/stage-1/learning-map/' + link: '/vi-vn/stage-1/learning-map/' } ] }, @@ -1436,19 +1585,19 @@ export const i18n = { title: 'Full Stack', headline: 'Frontend & Backend.', desc: 'Từ thiết kế DB đến API và component, xây dựng trọn vẹn web app hiện đại.', - link: '/zh-cn/stage-2/' + link: '/vi-vn/stage-2/' }, { title: 'Dự án thực tế', headline: 'Không phải code đồ chơi.', desc: 'Đi sâu vào Auth, Lưu trữ, Upload file và logic nghiệp vụ cốt lõi.', - link: '/zh-cn/stage-2/' + link: '/vi-vn/stage-2/' }, { title: 'Triển khai', headline: 'Show cho thế giới.', desc: 'Cấu hình server, DNS, CI/CD. Chặng cuối của việc giao sản phẩm.', - link: '/zh-cn/stage-2/' + link: '/vi-vn/stage-2/' } ] }, @@ -1461,22 +1610,22 @@ export const i18n = { { title: 'WeChat Mini-app', desc: 'Phát triển đa nền tảng, tiếp cận hàng triệu người dùng.', - link: '/zh-cn/stage-3/' + link: '/vi-vn/stage-3/' }, { title: 'App AI Native', desc: 'RAG, Agent. Khám phá giới hạn của LLM.', - link: '/zh-cn/stage-3/' + link: '/vi-vn/stage-3/' }, { title: 'Kiến trúc phức tạp', desc: 'Thiết kế kiến trúc chịu tải cao và sẵn sàng cao.', - link: '/zh-cn/stage-3/' + link: '/vi-vn/stage-3/' }, { title: 'Thương hiệu cá nhân', desc: 'Xây dựng website và blog học thuật của riêng bạn.', - link: '/zh-cn/stage-3/' + link: '/vi-vn/stage-3/' } ] }, @@ -1489,22 +1638,22 @@ export const i18n = { { title: 'AI Fundamentals', desc: 'LLM, Agent, RAG. Dive into AI internals.', - link: '/zh-cn/appendix/8-artificial-intelligence/ai-history' + link: '/vi-vn/appendix/8-artificial-intelligence/ai-history' }, { title: 'Frontend', desc: 'Browser internals, Performance, Canvas.', - link: '/zh-cn/appendix/3-browser-and-frontend/javascript-deep-dive' + link: '/vi-vn/appendix/3-browser-and-frontend/javascript-deep-dive' }, { title: 'Backend', desc: 'High concurrency, Distributed systems, Microservices.', - link: '/zh-cn/appendix/4-server-and-backend/backend-layered-architecture' + link: '/vi-vn/appendix/4-server-and-backend/backend-layered-architecture' }, { title: 'General Skills', desc: 'Git, Networks, IDE internals.', - link: '/zh-cn/appendix/2-development-tools/git-version-control' + link: '/vi-vn/appendix/2-development-tools/git-version-control' } ] }, diff --git a/docs/.vitepress/theme/components/home/HomeSection.css b/docs/.vitepress/theme/components/home/HomeSection.css index bf85fb3..14922e9 100644 --- a/docs/.vitepress/theme/components/home/HomeSection.css +++ b/docs/.vitepress/theme/components/home/HomeSection.css @@ -41,8 +41,7 @@ color: #6e6e73; max-width: 760px; font-family: - -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'PingFang SC', - sans-serif; + -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'PingFang SC', sans-serif; } .dark .section-category, @@ -65,13 +64,12 @@ a { -webkit-tap-highlight-color: transparent; } -:is( - .feature-card, - .comm-card, - .prod-card, - .appendix-card, - .buy-btn - ):is(:hover, :focus, :focus-visible, :active) { +:is(.feature-card, .comm-card, .prod-card, .appendix-card, .buy-btn):is( + :hover, + :focus, + :focus-visible, + :active +) { border-bottom-color: transparent !important; text-decoration: none !important; outline: none !important; diff --git a/docs/.vitepress/theme/utils/readingBookmark.js b/docs/.vitepress/theme/utils/readingBookmark.js index e47a503..6453fa0 100644 --- a/docs/.vitepress/theme/utils/readingBookmark.js +++ b/docs/.vitepress/theme/utils/readingBookmark.js @@ -27,7 +27,6 @@ export const createReadingBookmark = ({ updatedAt: now() }) - export const createReadingBookmarkSnapshot = ({ path, getTitle = () => '', diff --git a/docs/.vitepress/theme/utils/readingBookmark.test.js b/docs/.vitepress/theme/utils/readingBookmark.test.js index 1e0e15e..9610977 100644 --- a/docs/.vitepress/theme/utils/readingBookmark.test.js +++ b/docs/.vitepress/theme/utils/readingBookmark.test.js @@ -74,13 +74,11 @@ describe('reading bookmarks', () => { } ) assert.equal( - readReadingBookmark(storage, '/easy-vibe/en/stage-1/intro/', 1000) - .title, + readReadingBookmark(storage, '/easy-vibe/en/stage-1/intro/', 1000).title, 'English title' ) }) - it('keeps delayed saves bound to the path captured before navigation', () => { const storage = createStorage() let currentPath = '/easy-vibe/zh-cn/page-a/' @@ -100,22 +98,16 @@ describe('reading bookmarks', () => { }) ) - assert.equal( - readReadingBookmark(storage, currentPath, 1000), - null - ) - assert.deepEqual( - readReadingBookmark(storage, scheduledPath, 1000), - { - version: 1, - path: scheduledPath, - title: '页面 A', - section: '小节 A', - scrollY: 240, - progress: 32, - updatedAt: 777 - } - ) + assert.equal(readReadingBookmark(storage, currentPath, 1000), null) + assert.deepEqual(readReadingBookmark(storage, scheduledPath, 1000), { + version: 1, + path: scheduledPath, + title: '页面 A', + section: '小节 A', + scrollY: 240, + progress: 32, + updatedAt: 777 + }) }) it('normalizes invalid numeric values', () => { diff --git a/docs/public/sitemap.xml b/docs/public/sitemap.xml index 5b96cd5..26fe7e6 100644 --- a/docs/public/sitemap.xml +++ b/docs/public/sitemap.xml @@ -3,7 +3,7 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> https://datawhalechina.github.io/easy-vibe/zh-cn/ - 2026-05-14T12:39:03+08:00 + 2026-05-20T23:20:16+08:00 weekly 1.0