Going bilingual doubles your content cost and your SEO surface, but it can also double your distribution. The right call depends on what you can sustain — and on whether you set up URL structure, hreflang, and sitemaps correctly from day one.
Background
For Chinese-speaking builders aiming at global audiences, the bilingual question shows up early. The naive answer is “do both” — but writing 500 articles is hard enough in one language. The honest answer is: pick the language you can produce best in, ship 100 quality articles in it, and only then consider adding the second. The decision is partly editorial and partly technical — if you skip the technical setup, the second language hurts you instead of helping.
How to tell
- You can write at native-fluency speed in both languages without translation tools — otherwise the second language will drain you.
- Your topic has roughly equal demand and competition in both markets (check both Google and Baidu / Bing).
- You have editorial capacity for 1.5-2x the work; translating well costs nearly as much as writing.
- Your monetization (AdSense, affiliate, app referrals) works in both markets — Chinese AdSense rates are much lower.
- You can stomach managing hreflang, two sitemaps, and split analytics for the life of the site.
Quick verdict
Start with one language unless you can write fluently in both AND have validated demand on both sides. Add the second language only after the first has product-market fit.
Before you start
- Confirm your real writing speed in each language with a back-to-back test, not optimism.
- Decide URL structure first — bilingual built on top of single-language URLs is a forever-painful migration.
- Set Search Console and Analytics up to support either path before you commit.
Step by step
-
Audit your writing speed. Draft two 1500-word articles back to back, one per language, untimed-but-honest. Whichever takes more than 1.5x the other should not be your first language for the site.
-
Validate demand separately. Use a keyword tool on each market — Google for EN, Baidu Index or Bing Webmaster for ZH. Same topic can have 10x asymmetric demand.
-
Pick the URL structure before writing a single article. The recommended layout for Astro is:
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
This gives you /en/articles/foo/ and /zh/articles/foo/ — Google treats them as separate URLs with shared signals only via hreflang.
- Configure i18n in
astro.config.mjs. Set the canonical site and the trailing slash policy once, globally:
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' },
},
}),
],
});
- Wire hreflang pairs in your layout so EN and ZH versions reference each other. In
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/')}`} />
The x-default should point at the EN version unless your primary audience is Chinese.
- Generate per-language sitemaps and an index. Output structure:
<!-- /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>
Each per-language sitemap entry should include hreflang annotations:
<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>
- Verify a published pair end-to-end. After deploy:
curl -s https://yourdomain.com/en/articles/foo/ | grep -E 'hreflang|canonical'
curl -s https://yourdomain.com/zh/articles/foo/ | grep -E 'hreflang|canonical'
# both should self-canonical and reference the other language
-
Add EN and ZH as separate properties in Search Console. Use the Domain property for the whole site, then add two URL-prefix properties for
https://yourdomain.com/en/andhttps://yourdomain.com/zh/so you can compare query data without pollution. -
Re-evaluate at article 100. If the second language is dragging output below your minimum cadence, pause it cleanly with
noindex,followrather than deleting:
{frontmatter.lang === 'zh' && pauseZh && (
<meta name="robots" content="noindex,follow" />
)}
Implementation checklist
- URL structure includes a language segment from day one — no retrofitting.
- hreflang pairs are emitted from layout, not edited per file.
- Per-language sitemaps + an index sitemap are submitted to Search Console.
- EN and ZH are separate URL-prefix properties in Search Console.
- Analytics events include a
langdimension so reports can split.
After-launch verification
- Search Console → Coverage: EN and ZH should each show their own indexed counts.
- URL Inspection on a sample article in each language should show the other version as an “alternate page with proper canonical tag”.
- Sitemap index status is “Success” in Search Console for both per-language sitemaps.
curltest confirmshreflangself-reference + cross-reference is present.
Common pitfalls
- Auto-translating articles with a model and shipping — Google detects machine translation patterns and ranks them poorly. The fix is human editing of every translated article, not just running it through a better model.
- Using a single URL with a language toggle (cookie-based) instead of separate URLs per language; Google sees one URL and only the default language gets indexed.
- Forgetting hreflang and getting two language versions treated as competing duplicates. Detection: Search Console reports “Duplicate, Google chose different canonical” between EN and ZH URLs.
- Splitting an already-thin internal-link graph across two languages. Mitigation: keep cross-links explicit (each article has a “Related” block in its own language, not a literal translation of the other language’s).
- Estimating bilingual as 1.5x the work; in practice it is closer to 2x once you account for editing and SEO maintenance.
- Forgetting to set the
langattribute on the<html>tag, which confuses screen readers and Google’s language detection.
FAQ
- Can I start English-only and add Chinese later?: Yes, and this is usually the right path. Add Chinese after the English site has stable traffic and you have a clear sense of what topics work. Plan the URL structure with
/en/from the start so adding/zh/is non-breaking. - Does Google penalize bilingual sites?: No, as long as hreflang is correct and content is human-quality. It penalizes machine-translated content, not bilingual sites.
- Should I use subdomains or subfolders?: Subfolders (
/en/,/zh/) are easier to manage and inherit domain authority. Use subdomains only if you have a real operational reason to separate. - Is bilingual worth it for AdSense revenue?: Usually not on its own — Chinese AdSense RPMs are very low. Bilingual is worth it for reach, not for AdSense math.
- Where should the language switcher go?: In the header or footer, with
hreflangmatched anchor tags. Avoid auto-redirecting based on browser language — it confuses crawlers and forces re-indexing on every visit.
Related
- When it makes sense to add a second language
- How to pick a niche that has search demand
- Should a new content site go broad or deep first
- hreflang explained for bilingual sites
- Subdomain vs subdirectory
- Content Site Competitor Analysis Before You Build
- Content Site Monetization Paths: Ads, Affiliates, Products
Tags: #Indie dev #Website planning #Bilingual #hreflang #SEO