GPTMap

Bilingual Content Production: zh Master Drafts, en Rewrites, and Consistency Checks

In a bilingual knowledge base the en version is a rewrite for English readers, not a translation: shared vs independent frontmatter fields, target-language link titles, and a two-round tightening method for over-length fields.

TL;DR
The en version is a rewrite for English readers, not a translation: slug, dates, and facts stay identical while titles, SEO fields, and lists are written per language. Three rules prevent most failures: link text verbatim matches the target title; en overruns length limits -- keep descending candidates; unescaped quotes break frontmatter YAML. Closing checks: parity, link titles, recomputed stats.
The bilingual content workflow is the production model for zh/en knowledge bases: the zh draft is finalized as the factual master, then the en version is produced as an independent rewrite for English readers -- same structure, same facts, independently written wording and SEO fields -- and the batch is closed with field-by-field parity checks, verbatim link-title comparison, and recomputed statistics.

How to

  1. Finalize the zh master draft

    Facts, structure, and internal links are all settled and source-verified in the zh version; the zh draft is the single factual source and the en version changes no facts.

  2. Independently rewrite in English

    Rewrite in English along the zh structural skeleton: SEO fields rebuilt for English search behavior, examples adjusted for English readers, every factual number preserved.

  3. Align the fields

    Verify identity fields (slug / category / dates / reference URLs) match field by field, and wording-field counts match (the number of keyPoints and faqs).

  4. Check links and quotes

    Compare internal-link text verbatim against the target-language file's actual title; scan frontmatter values for unescaped English double quotes.

  5. Seal lengths and statistics

    Tighten over-limit fields with descending candidates, recompute self-referential statistics with closing values after the last file, and seal with lint and build.

A bilingual knowledge base has a hidden cost structure: every article is really two -- a zh version and an en version that share facts but face entirely different readers and search engines. Treating the en version as a translation of the zh version is the most common and most expensive starting mistake. This article documents GPTMap's complete bilingual production workflow: which frontmatter fields are shared versus independent, why internal links must use the target language's actual titles, the systematic fix for over-length en fields, and the closing triple check. Every rule comes from the actual production of this site's 80 bilingual articles (verified 2026-09-04).

1. Positioning: en Is a Rewrite, Not a Translation

Translation thinking produces "English counterparts of zh sentences"; rewrite thinking produces "the same facts expressed for English readers". The difference concentrates in three places:

  • SEO fields are rebuilt entirely: seoTitle, seoDescription, and keywords are written independently for English search terms and length habits, not decoded from the zh fields;
  • Examples and references localize: the cases, comparison targets, and background cited for en readers may differ, as long as the factual numbers stay identical;
  • Information density differs: the same fact runs longer in English (see section 4), so the structure must compress deliberately rather than map point for point.

The only invariant is the facts themselves: every number, date, version, and reference URL must be strictly identical across the two versions -- which is what the closing checks focus on.

2. The Field Split: Shared versus Independent

Using this site's frontmatter as the example, fields divide into two groups:

GroupFieldsRule
Identity (shared)slug, category, contentType, publishedAt, updatedAt, openaiVersion, lastTestedAt, dataSourcedAt, articleType, official-reference URLsField-for-field identical in zh and en
Wording (independent)title, excerpt, seoTitle, seoDescription, keywords, tldr, definition, keyPoints, faqs, tagsWritten per language; item counts match (keyPoints, faqs, officialReferences), wording and length free
# Bilingual frontmatter example (the two language versions of one article)
slug:            mcp-oauth-2-1          <- shared
category:        mcp                    <- shared
publishedAt:     2026-09-03             <- shared
title (zh):      (the zh-language title)      <- independent
title (en):      MCP Authorization Explained: …   <- independent
tldr (zh/en):    same facts, each language at its own length
officialReferences: URL list identical   <- shared (title text may differ per language)

Bilingual internal links follow two symmetric rules:

  1. When a zh article links another article, the link text equals the target file's zh title, wrapped in book-title marks;
  2. When an en article links another article, the link text equals the target file's en title, no marks.

The most dangerous trap for en links is translating the zh title as the link text -- the two titles are genuinely different (the zh and en titles genuinely differ in wording, structure, and punctuation), so any "translated link text" mismatches the target page's H1. The solution is a scripted verbatim comparison: extract each internal link's text and compare against the target file's title, flagging every mismatch. This rule is scripted on this site, run once for zh and once for en.

4. Language-Specific Traps

zh traps: unescaped English double quotes inside frontmatter values break YAML parsing (the error message is obscure -- see section 3's lesson); fullwidth quotes have no such problem and are safe in prose.

en traps: length overruns are systemic, not occasional -- the same information runs 30-100% more characters in English (empirical), and the seoTitle (at most 60) and tldr (at most 400) caps are hit almost every time. The systematic solution is candidate selection:

# en field tightening: descending candidates, assert-select the first that fits
candidates = [long_draft, trimmed_v2, trimmed_v3]
value = next(c for c in candidates if len(c) <= 400)

Plus two craft rules: the first tightening pass restructures (cut modifier clauses, merge parallels, drop lists), and only the second pass cuts substance; never start by deleting facts -- a deleted fact is gone.

Apostrophes: en drafts should standardize on straight (') or curly (') apostrophes; YAML accepts both, but straight apostrophes can conflict with code blocks in some rendering pipelines, so pick one convention.

5. The Closing Triple Check

After each pair, and before every batch seals, three checks run scripted:

  1. Bilingual frontmatter parity: identity fields equal field-for-field; wording-field counts equal (the number of keyPoints / faqs / officialReferences matches zh = en);
  2. Verbatim link-title comparison: the comparison script runs once for zh and once for en (section 3);
  3. Closing statistics: the batch changes numbers like "this site has N articles" -- the command re-runs after the last file is written and the final value goes into the text (80 articles on this writing day).
# Verbatim link-title comparison (the scripted form of closing check 2)
python3 - <<'PYEOF'
import re, glob, os
titles = {f[:-6]: re.search(r'^title: "(.*)"', open(f, encoding='utf-8').read(), re.M).group(1)
          for f in glob.glob('*.md')}
# ...for each internal link: compare link text to the target title verbatim
PYEOF

6. Common Mistakes and Troubleshooting

  • Direct-translating the zh title into the en seoTitle: produces titles English readers never search for, and desyncs from the en internal-link system.
  • Fixing zh and forgetting en: a factual revision lands only in the zh version while the en version ships old numbers. Revisions must sync both versions, with the closing parity check as the backstop.
  • Hand-counting en overruns: eyeballing character counts is always wrong; let the length assertion auto-select from candidates.
  • Translating tags: a word-for-word zh tag does not necessarily map to the terms en users search -- tags are drafted per language.
  • Adding a backlink only in zh: new links land in the zh version while the en version misses them -- include internal-link counts in the parity check.

7. Next Steps

Key points

  • The en version is a rewrite, not a translation: same structure, same facts, independent wording -- SEO fields (seoTitle / seoDescription / keywords) are rebuilt for English search behavior
  • Field split: slug / category / contentType / publishedAt / updatedAt / openaiVersion / official-reference URLs are strictly identical across languages; title / excerpt / tldr / definition / keyPoints / faqs / tags are written per language
  • Internal-link text must verbatim equal the target file's actual title in that language -- an en link never translates the zh title, and zh links wrap the full title in book-title marks
  • en text runs 30-100% longer than zh (empirical): overruns on the seoTitle (at most 60) and tldr (at most 400) caps are the norm, so prepare descending candidates for two tightening rounds
  • Unescaped English double quotes inside frontmatter values break YAML parsing; zh fullwidth quotes are safe in YAML, and en apostrophes should be consistently straight or curly
  • Closing triple check: field-by-field bilingual parity, verbatim link-title comparison (zh and en each), and self-referential statistics recomputed with closing values

Frequently asked questions

Because the two audiences search with different priors. zh readers need certain background, terminology habits, and comparison targets that en readers do not. This site's approach: after the zh draft is final, the en version keeps the structural skeleton and every factual number, but the wording, cited examples, and SEO fields are all rebuilt for English search behavior. The telltale symptoms of translation thinking are an over-long en seoTitle, a stiff tldr, and misaligned keywords.

Official references

Related articles

Subscribe to GPTMap Weekly

One email every Monday: curated OpenAI updates, deep dives, and best practices. No ads, unsubscribe anytime.

GPTMap EditorialPublished 2026-09-04 6 min read
Test environment (EEAT)
Last tested: 2026-09-04
Model used: gpt-5.6