astro 中英文站点生成的参考方案
做一下测试
你计划将 Astro 博客打造成中英文双语站点,并通过国内(腾讯 COS + CDN)+ 国际(Cloudflare Pages)双部署,实现:
🌐 浏览器语言自动切换
🔄 用户手动切换语言
✅ 中英文内容各自独立、结构清晰
🚀 部署兼容中英文用户访问体验(国内外访问均顺畅)
这是一个成熟国际站点架构的典型需求,以下是详细的实现方案和注意事项,帮助你从项目结构、构建策略、部署优化、用户体验到 SEO 和缓存机制全面落地。
🧱 一、整体架构设计:双语 Astro 博客的核心结构
✅ 推荐结构:多语言目录分离
/src/pages/
├── index.astro # 默认语言首页 (可重定向)
├── zh/
│ ├── index.astro # 中文首页
│ ├── blog/[slug].astro
│ └── categories/[category].astro
├── en/
│ ├── index.astro # 英文首页
│ ├── blog/[slug].astro
│ └── categories/[category].astro📦 内容目录(建议分目录管理)
/src/content/
├── zh/
│ └── blog/
│ └── xxx.md
├── en/
│ └── blog/
│ └── xxx.md🛠️ 二、关键功能模块与改造点
1.
语言路由设计
使用 /zh/* 和 /en/* 来区分中英文页面。
在根路径 / 处进行语言重定向(见下面“自动语言切换”)。
// pages/index.astro
const lang = Astro.request.headers.get("accept-language")
if (lang?.startsWith("zh")) {
return Astro.redirect("/zh/")
} else {
return Astro.redirect("/en/")
}2.
页面模板组件 i18n 处理
将 UI 元素(如“阅读全文”“分类”“标签”等)放入语言文件:
// src/i18n/zh.ts
export default {
readMore: "阅读全文",
category: "分类",
tags: "标签"
}
// src/i18n/en.ts
export default {
readMore: "Read more",
category: "Category",
tags: "Tags"
}在页面中按当前语言导入使用:
import zh from "@/i18n/zh";
import en from "@/i18n/en";
const dict = Astro.url.pathname.startsWith("/zh") ? zh : en;3.
多语言切换组件
用户可点击手动切换语言
当前页面语言对照路径跳转,例如:
- /zh/blog/my-post ←→ /en/blog/my-post
<a href={Astro.url.pathname.replace('/zh/', '/en/')}>English</a>
<a href={Astro.url.pathname.replace('/en/', '/zh/')}>中文</a>若 slug 不一致,则需要维护 slug 对应表。
4.
文章 frontmatter 支持语言信息
---
title: "我的第一篇中文文章"
lang: zh
slug: "my-first-post"
relatedSlug: "en/my-first-post"
---英文文章相同方式标注 lang: en,可通过 relatedSlug 实现语言跳转精确对应。
🌐 三、部署策略:国内外双部署分流
✅ 国际站(Cloudflare Pages)
支持自动构建和缓存控制
默认可识别浏览器语言并支持访问 /zh/ 和 /en/
利用 /_redirects 或 astro.config 实现根路径重定向
✅ 国内站(腾讯 COS + CDN)
建议构建两份内容,分别上传:
astro build --site https://blog.l-souljourney.cn/zh/
astro build --site https://blog.l-souljourney.cn/en/- COS 上传 /zh/、/en/ 到指定目录,根路径 / 做 JS 自动跳转或用静态 /index.html 实现重定向
🔁 CDN 缓存配置优化:
| 路径类型 | 缓存建议 |
|---|---|
| /zh/, /en/ | max-age=86400 或 cache-control: public |
| / | 建议短缓存或不缓存,避免语言识别重定向失效 |
🤖 四、自动语言切换实现(浏览器语言识别)
方式一:构建时自动重定向(推荐)
Astro 的 / 页面逻辑中通过 accept-language 重定向:
Astro.redirect(
Astro.request.headers.get("accept-language")?.startsWith("zh")
? "/zh/"
: "/en/"
);适用于 SSR 或 Cloudflare Pages。
方式二:前端 JavaScript 识别 + 跳转(适合纯静态部署如 COS)
<script>
const lang = navigator.language || navigator.userLanguage;
if (lang.startsWith("zh")) {
location.href = "/zh/";
} else {
location.href = "/en/";
}
</script>📌 五、你可能容易忽略的关键点与优化建议
| 问题 | 建议与应对 |
|---|---|
| 🔁 双语 slug 不一致 | 建立 slug 映射表(可放在 frontmatter) |
| 🔎 SEO 多语言策略 | 使用 / en,并加上 |
| 📤 构建时如何管理双语内容 | 使用 Astro 集合函数按语言分组渲染 |
| 🚀 构建时间翻倍 | 可考虑使用并行构建或合并构建结构(如用脚本合并) |
| 🧩 Markdown 插件国际化 | 自定义插件处理 toc, image, link 等,避免中文拼写误差 |
| 🔐 搜索 / 评论系统国际化 | 若接入 Algolia、Giscus、Valine 等,要配置语言切换参数 |
✅ 最终落地方案建议总结
| 项目 | 推荐做法 |
|---|---|
| 页面结构 | /zh/ 和 /en/ 路由前缀分离 |
| 语言切换 | 自动语言跳转 + 手动切换组件 |
| 内容结构 | /src/content/zh 和 /en 分开维护 |
| slug 路径 | 建议使用英文 slug,前台展示为中文 |
| 构建方式 | 单项目双语言构建(可并行) |
| 部署方式 | COS + Cloudflare 双部署,独立缓存策略 |
| SEO 支持 | 多语言 hreflang 标签、语言 meta 标签 |
| 自动刷新 | 云函数 CDN 精确刷新、构建产物自动上传 |
如果你需要我进一步帮你:
✍️ 设计完整目录结构模板(支持 Astro 自动识别)
🔧 编写语言切换组件 + i18n 基础配置
🛠️ 写一个完整的双语言构建 + 双端部署脚本(COS + GitHub Actions)
告诉我你现在项目目录和构建方式,我可以帮你一站式搭建好中英文双语站点基础架构。