上双语,内容成本和 SEO 工作量都翻倍,但触达也可能翻倍。选不选取决于你能不能持续——以及第一天有没有把 URL、hreflang 和 sitemap 这套技术底子搭对。
问题背景
对面向全球的中文开发者,双语问题很早就会出现。朴素答案是”两个都做”,但写 500 篇单语言已经够难了。诚实答案是:先选你能写得最好的那一种,扎扎实实写出 100 篇,再决定是否加第二种。这个决定一半是编辑层面、一半是技术层面——技术没搭对,第二语言只会拖累你。
判断标准
- 两种语言都能母语级速度产出,不依赖翻译工具——否则第二语言会拖垮你。
- 题材在两个市场都有相近的需求和竞争(Google 和必应都查一下)。
- 能承担 1.5-2 倍的产出量——翻译做得好几乎等于重写。
- 变现路径(AdSense、联盟、App 推广)在两边都成立——中文 AdSense 单价低得多。
- 能长期维护 hreflang、双 sitemap、双 Analytics。
快速结论
除非你两种语言都能写、两个市场都验证过需求,否则只做一种。等第一种语言跑出产品市场契合度再加第二种。
开始前准备
- 用背靠背试写来评估你两种语言的真实写作速度,别凭乐观。
- 第一天就把 URL 结构定好——单语言改双语的迁移成本极高。
- Search Console 和 Analytics 提前按双语形态规划好。
实操步骤
-
评估写作速度。 连续写两篇 1500 字的文章,分别用两种语言,老实计时。超出 1.5 倍那一边,就不该作为站点的主语言。
-
分别验证需求。 用关键词工具查两个市场——Google 看 EN,Baidu Index 或 Bing Webmaster 看 ZH。同一个话题需求差 10 倍是常态。
-
写第一篇之前先定 URL 结构。 Astro 推荐布局:
src/pages/en/articles/[...slug].astro
src/pages/zh/articles/[...slug].astro
src/content/articles/en/<category>/<slug>.mdx
src/content/articles/zh/<category>/<slug>.mdx
输出 /en/articles/foo/ 和 /zh/articles/foo/——Google 视为两个独立 URL,只通过 hreflang 共享信号。
- 在
astro.config.mjs配 i18n。 全局只配一次 site 和 trailing slash:
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://yourdomain.com',
trailingSlash: 'always',
build: { format: 'directory' },
i18n: {
defaultLocale: 'en',
locales: ['en', 'zh'],
routing: { prefixDefaultLocale: true },
},
integrations: [
sitemap({
i18n: {
defaultLocale: 'en',
locales: { en: 'en-US', zh: 'zh-CN' },
},
}),
],
});
- layout 里写 hreflang 配对,让 EN 和 ZH 互指。
ArticleLayout.astro里:
---
const { translationKey, lang } = Astro.props.article;
const site = Astro.site.toString().replace(/\/$/, '');
const path = Astro.url.pathname;
const otherLang = lang === 'en' ? 'zh' : 'en';
const otherPath = path.replace(`/${lang}/`, `/${otherLang}/`);
---
<link rel="canonical" href={`${site}${path}`} />
<link rel="alternate" hreflang={lang} href={`${site}${path}`} />
<link rel="alternate" hreflang={otherLang} href={`${site}${otherPath}`} />
<link rel="alternate" hreflang="x-default" href={`${site}${path.replace(`/${lang}/`, '/en/')}`} />
x-default 一般指向 EN 版本,除非你的主受众是中文。
- 分语言 sitemap + 一个索引 sitemap。 输出结构:
<!-- /sitemap-index.xml -->
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://yourdomain.com/sitemap-en.xml</loc></sitemap>
<sitemap><loc>https://yourdomain.com/sitemap-zh.xml</loc></sitemap>
</sitemapindex>
每个分语言 sitemap 里的 URL 都带 hreflang 标注:
<url>
<loc>https://yourdomain.com/en/articles/foo/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://yourdomain.com/en/articles/foo/" />
<xhtml:link rel="alternate" hreflang="zh" href="https://yourdomain.com/zh/articles/foo/" />
</url>
- 上线后端到端验证。 部署完:
curl -s https://yourdomain.com/en/articles/foo/ | grep -E 'hreflang|canonical'
curl -s https://yourdomain.com/zh/articles/foo/ | grep -E 'hreflang|canonical'
# 两边都应该 self-canonical 并互指另一种语言
-
Search Console 里 EN 和 ZH 分别建 property。 Domain property 管整站,然后再加两个 URL-prefix property——
https://yourdomain.com/en/和https://yourdomain.com/zh/——查询数据就不会混。 -
写到 100 篇时复盘。 如果第二语言把节奏拖到目标线以下,用
noindex,follow优雅暂停,不要直接删:
{frontmatter.lang === 'zh' && pauseZh && (
<meta name="robots" content="noindex,follow" />
)}
执行检查清单
- URL 第一天就带语言段,永远不要事后补改。
- hreflang 由 layout 统一发,不在每个文件里手写。
- 分语言 sitemap + 索引 sitemap 都已提交 Search Console。
- EN 和 ZH 在 Search Console 是独立 URL-prefix property。
- Analytics 事件带
lang维度,报告可分语言切。
上线后验证
- Search Console → Coverage:EN 和 ZH 应各自有独立 indexed 数。
- 对每种语言抽一篇 URL Inspection——另一语言版本应显示为 “alternate page with proper canonical tag”。
- 两个分语言 sitemap 在 Search Console 都是 Success。
curl测试确认hreflangself + cross 都齐。
容易踩的坑
- 用模型自动翻译直接发——Google 能识别机器翻译特征,会压排名。修法是逐篇人工编辑,不是换更好的模型。
- 用一个 URL + 语言切换(cookie),不分 URL——Google 只看一个 URL,只有默认语言被收录。
- 忘配 hreflang,两种语言互相算重复。表现:Search Console 报告 “Duplicate, Google chose different canonical”,且对方语言被选为 canonical。
- 本来就稀薄的内链图被劈成两半。对策:每篇有自己语言的”相关阅读”,不是另一语言的直译。
- 把双语估成 1.5 倍工作量,实际加上编辑和 SEO 维护接近 2 倍。
- 忘了
<html lang="...">属性——读屏软件和 Google 语言识别都会出错。
FAQ
- 能不能先英文,后加中文: 可以,而且通常是正确的路。英文站有稳定流量、确定哪些题目能打之后再加中文。第一天就规划好
/en/,后面加/zh/才是无破坏的扩展。 - Google 会惩罚双语站吗: 不会,前提是 hreflang 正确、内容是人写的。它惩罚机器翻译,不惩罚双语本身。
- 该用子域名还是子目录: 子目录(
/en/、/zh/)好管理,权重共用。除非运营上必须分开,否则别用子域名。 - 为了 AdSense 收入值得做双语吗: 通常不值——中文 AdSense RPM 很低。做双语是为了触达,不是为了 AdSense 数字。
- 语言切换按钮放哪: header 或 footer,用 hreflang 对应的 a 标签。不要按浏览器语言自动跳转——爬虫会困惑,每次访问都被迫重新索引。