All posts
Documentation· 14 min read

Multilingual Product Docs: One Code-True Source

Ship multilingual product docs from a single, code-true source. Cut translation drift, automate updates, and improve DX with scalable governance.

The DeployIt Team

We build DeployIt, the product intelligence layer for SaaS companies.

Multilingual Product Docs: One Code-True Source — illustration

Multilingual product docs are a documentation system that publishes user-facing guides in multiple languages from a single code-grounded source, reducing drift after every deploy. The function is to keep answers straight from the code, the benefit is fewer tickets and faster onboarding for global customers. If you’re planning multilingual product docs, start by deciding what is canonical: code or wiki. With DeployIt, the source of truth = the code, so every locale rebuilds after each merge. This avoids stale translations that diverge with every sprint. Many PMs try spreadsheets and manual translation workflows; we observed that creates lag and conflicting versions. A code-synced approach compiles an always fresh base in English, then localizes only the deltas, preserving structure and links across languages.

The real problem: accuracy across locales after every release

According to GitHub Octoverse 2023, 56% of repos ship weekly or faster, which means every untranslated string becomes a support defect within days.

Weekly releases break multilingual parity because translations trail code by 1–3 sprints while region teams keep answering from outdated pages.

The contrarian claim: the problem isn’t translation speed; it’s source-of-truth drift. If English docs are written separately from code, every locale forks that drift.

What actually goes wrong

  • New flag added behind a feature toggle ships on Wednesday; Spanish docs mention it Friday; Japanese misses it for two weeks.
  • API deprecations hit staging; English README is patched; FR/DE still reference a retired field in error payloads.
  • Pricing-tier gates change; support in LATAM quotes last quarter’s limits because their doc sync lags the release branch.

When this compounds, you get measurable waste and churn.

28%
Impact of doc drift

In our experience working with SaaS teams, stale-locales drive three hidden costs: escalations, refunds due to mis-sold capabilities, and internal rework translating patches twice.

Why code-true source fixes accuracy

If the base content is generated from the code that shipped, translations start from truth, not from a wiki that might be a sprint behind.

DeployIt anchors docs to artifacts engineers already maintain:

  • Read-only repo digest: extracts current CLI options, env vars, and API schemas per commit SHA.
  • Pull-request title and labels: map feature scope to affected doc sections for targeted retranslation.
  • Weekly activity digest: flags locale diffs where code changed but translated snippets did not.
  • Code-grounded answer: support can paste a user question and get an answer citing the exact lines and version.
ℹ️

Source drift is a process bug, not a linguistics bug. Fix the upstream truth, and translators stop firefighting; they localize what actually shipped.

Why doc-grounded bots make it worse

Doc-grounded assistants trained on a CMS snapshot repeat drift in every language.

AspectDeployItIntercom Fin
Knowledge baseGenerated from live code and repo digestsDoc-grounded snapshot
Update triggerPer merge to main via PR metadataManual/periodic export
Locale freshnessFlags untranslated diffs from latest commitSilent staleness until content team updates
Support responseCites code lines and version for a code-grounded answerCites articles that may lag release

For teams shipping weekly, the only scalable way to keep multilingual product docs accurate is to bind them to the codebase index and ship docs with the release, not after it. See how we keep docs fresh without Readme rot: /blog/live-code-documentation-vs-readme-rotting-always-fresh

Why current translation workflows fall short for SaaS cadence

In our experience working with SaaS teams, static and CMS-led translation trails code changes by 1–3 sprints, creating gaps where published features or parameters are wrong across locales.

Static docs freeze context at the time of export, but SaaS ships weekly or faster. GitHub Octoverse reports >227M PRs in 2023, reflecting high change velocity; translated pages rarely keep up with that cadence.

Where things break

  • String parity: keys change, flags flip, and endpoint shapes shift, but translation memories don’t know which strings were removed or are behind a feature flag.
  • Release timing: locales publish on different days, so API examples and config names desync between English and translated pages.
  • No code context: bulk MT substitutes literal words for parameter names without types, ranges, or enum values.

CMS copy-paste multiplies silent drift. A product manager edits “POST /invoices” samples in English, but the French CMS entry keeps the old field total_due instead of total_amount.

Bulk machine translation without code anchors misreads technical nouns. The Stack Overflow Developer Survey highlights that devs rely on precise terminology; mistranslating headers or auth scopes creates support churn.

“Translation glossaries preserve terms, not intent. Without source-of-truth types and examples, you translate yesterday’s guess.” — DeployIt docs team

Static screenshots skew fastest. When UI labels move, overlays in five languages go stale. Atlassian’s guidance on docs-as-code highlights linking to living artifacts over bitmaps to reduce rework.

A read-only repo digest shows 14 merged PRs touching API schemas this week, but only English reflects enum updates; ES/DE/JA still show deprecated values.

A weekly activity digest lists “Remove beta flag: usage_based_billing,” yet the localized pricing pages keep “Beta” badges, contradicting support macros.

A code-grounded answer would state currency as ISO 4217; MT output renders it as “monnaie,” losing validation rules and examples.

When docs aren’t generated from code, teams compensate with policy, checklists, and heroic QA. That adds cost but doesn’t eliminate stale facts.

AspectDeployItIntercom Fin
Source of truthCodebase index + read-only repo digestDoc repository + editor notes
Update triggerPull-request title and merged commitManual publish in CMS
Example accuracyTyped snippets from current SDK/APIHandwritten samples per locale
Change visibilityWeekly activity digest for translatorsSpreadsheet of “strings to update”
Translation guidanceCode-grounded answer with types/enumsGlossary + style guide
Localized parityPublishes when the code mergesBatched by calendar

If your README has ever contradicted production, this is exactly why we built against live artifacts instead of prose. See our take: /blog/live-code-documentation-vs-readme-rotting-always-fresh.

DeployIt’s angle: code is the single source, docs are infrastructure

In our experience working with SaaS teams, multilingual product docs stay accurate only when the codebase is the canonical source and everything else is derived.

We ingest your repository in read-only mode and build a codebase index that maps symbols, endpoints, flags, and config to doc fragments in English. No write access is requested; we consume the default branch and tags, and record a compact read-only repo digest for every commit.

That canonical English baseline powers translation jobs keyed to identifiers, not paragraphs. When code changes, only affected fragments reflow, so localized pages don’t drift.

How the “always fresh” loop works

  • A change lands with a human-written pull-request title like “feat(api): add invoice.retry endpoint.” The digest caches the diff and invalidates dependent English fragments.
  • The index updates parameter tables, error codes, and examples to reflect current types and responses. We output code-grounded answers for AI and human readers.
  • Translation memory gets delta-only payloads. Locales regenerate the same structure, in sync with the English baseline, within minutes of merge.

Read-only repo digest

Stores hashes of files, symbols, and build artifacts per commit to know exactly what changed and where docs must refresh—without writing to your repo.

Canonical English baseline

English fragments are compiled from code comments, OpenAPI/Protobuf, CLI help, and test names, so every locale inherits truth from source.

Delta-first localization

Only modified fragments ship to translators or MT, preserving IDs and links, which keeps Japanese, German, and Spanish aligned with current release.

≤3% of pages per commit
Re-render scope

Why code-as-source beats doc-as-source

Doc-grounded systems chase drift across locales. Code-grounded systems pin every sentence to a symbol, test, or schema.

AspectDeployItIntercom Fin
Source of truthLive code + codebase indexKnowledge-base articles
Update triggerCommit diff via read-only repo digestManual edits or ticket queues
Locale freshnessDelta-synced per fragmentTends to lag after English edits
AI answersCode-grounded answers with current typesDoc-grounded answers that miss recent flags

Every publish includes a weekly activity digest that links commits to regenerated pages and locales. If you want the deeper rationale, compare with our take on rot vs. live code: /blog/live-code-documentation-vs-readme-rotting-always-fresh.

How it works: from commit to translated, code-true pages

In our experience working with SaaS teams, the only durable way to keep multilingual product docs current is to regenerate them from the code on every commit and only translate the diff.

Pipeline overview

We connect your repo read-only, build a codebase index, and emit publish-ready pages for every locale without asking engineers to write prose.

0

Connect repo (read-only)

Point DeployIt at GitHub/GitLab/Bitbucket with minimum scopes; we fingerprint a read-only repo digest and store no secrets. No write access, no commit hooks that modify source.

0

Index code

We parse source, schemas, OpenAPI/GraphQL, CLI flags, feature flags, and docstrings to create a search-ready codebase index. This index drives diffs, Q&A, and string extraction.

0

Generate base docs

We compile reference pages, guides, and changelogs as code-grounded artifacts:

  • API/SDK references from type signatures and comments
  • CLI usage from help text and examples
  • Configuration matrices from defaults and constraints
  • “What changed” snippets from commit scopes and pull-request title lines
0

Detect diffs

On each push/PR, we compare the new index with the prior read-only repo digest. We flag added/removed endpoints, params, flags, and behavior notes. No file path heuristics—entity-level diff.

0

Update strings

We extract only changed source strings and context keys. Existing translations are preserved; untranslated deltas are queued with machine pre-fill and TM/Glossary locks. ICU and plural rules retained.

0

Recompile locales

We re-render all locales where strings changed, validate links/examples against testable stubs, and re-run i18n lint (length, placeholders, bidi, CJK punctuation).

0

Publish

We publish atomically to your docs site or subpath, tagging versions. Weekly activity digest summarizes changes by area, locale, and impacted SKUs.

What keeps it accurate

  • Source of truth is the codebase index, not a wiki page.
  • Diffs are entity-level, so translators only touch what moved.
  • Publishing is atomic; partial locale drift is blocked by status checks.
ℹ️

Doc rot starts when prose leads and code follows. See how live code beats README rot: /blog/live-code-documentation-vs-readme-rotting-always-fresh

AspectDeployItIntercom Fin
Generation basisCompiled from codebase indexDoc-grounded KB
Change detectionEntity-level diffs from read-only repo digestManual editorial review
Multilingual updatesDiff-only string extraction + TM reuseFull-page retranslation
QA before publishLink/example validation + i18n lintSpellcheck and spot checks
Support answersCode-grounded answer with version contextArticle snippet lookup
Release cadencePer-commit or PRPeriodic batch pushes

Quality controls: terminology, context, and regional compliance

In our experience working with SaaS teams, the fastest way to keep multilingual product docs accurate is to bind terms, UI strings, and screenshots to the same commit hash that shipped the feature.

We lock a shared glossary at build time so translators can’t rewrite regulated terms or API nouns. Term locks live in a read-only repo digest and surface as a “Glossary drift” pull-request title when code adds or deprecates a term.

Context and artifacts tied to code

Screenshots go stale quickly. We attach language-tagged screenshot manifests to each weekly activity digest and auto-compare UI hashes per locale. When a selector or aria-label changes, the doc page flags a code-grounded answer with the failing selector and last-good commit.

Right-to-left support must be intentional. We emit dir="rtl" for ar, he, fa and validate layout mirroring in CI with an LTR-to-RTL diff of padding/margin tokens.

  • Date/number formats: use CLDR patterns in code, not prose. We render yyyy‑MM‑dd for JP docs and dd/MM/yyyy for GB, with locale-aware 1 234,56 vs 1,234.56.
  • Plurals/gender: ICU MessageFormat from code, then translate. No ad‑hoc string concatenation.
  • Units: central map (bytes, ms, MB/s) formatted per locale; docs read from the codebase index, not hardcoded.

We map doc examples to sample datasets by region. EU pages load EU-only fixtures. GDPR Article 5 requires data minimization; our examples exclude direct identifiers in EU locales and link to processing records. Source: GDPR (EU) 2016/679.

Stripe’s State of SaaS notes compliance pressure on GTM teams; we pin payment/legal strings from code review labels “legal-ok” and block term edits outside that label scope. Reference: GDPR (EU) 2016/679; OWASP ASVS for auth naming.

Screenshots generated in CI inherit the commit’s feature flag matrix; if a region disables a feature, that screenshot is suppressed for that locale to avoid false claims.

AspectDeployItIntercom Fin
Terminology sourceRead-only repo digest + codebase indexManual glossary in CMS
Screenshot freshnessCI-generated per commit with UI hash checkUploaded assets updated quarterly
RTL verificationLayout token diff in CI + dir hintsBest-effort CSS overrides
Regional datasetsLocale-bound fixtures and redaction policiesGlobal sample reused across locales
EscalationsWeekly activity digest flags “term drift” PRsPeriodic content audits

Tie-backs to accuracy: our /blog/live-code-documentation-vs-readme-rotting-always-fresh post explains why code-grounded answers reduce stale strings.

Cost and maintenance: replace the patchwork stack

In our experience working with SaaS teams, consolidating docs into a code-grounded pipeline drops translation and upkeep hours by 40–60% compared to a CMS + help center + manual handoffs.

What the patchwork stack really costs

The CMS/help-center model multiplies touchpoints: product updates in code, screenshots in CMS, copy in translation portals, and links in help articles.

  • Every release requires triage across locales, risking update drift.
  • Translators work from stale screenshots, not diffed source.
  • Support writes workarounds for mismatched versions and mislabeled flags.

With DeployIt, docs are derived from the codebase index and shipped from a read-only repo digest at build-time. Translators get strings surfaced from the same artifact as the binary, not an exported CMS dump.

AspectDeployItIntercom Fin
Source of truthCodebase index + read-only repo digestHelp-center content store
Update triggerPull-request title and merge eventTicketed content cycle
Localization unitDiffed keys from code-grounded answer bundlesWhole-article resubmissions
Drift riskLow (auto-invalidates changed sections)High (manual audits)
Support load impact-18–28% tickets on “docs mismatch” (Atlassian practice notes)Neutral
OwnershipEngineering + Docs in PR flowDocs/Support in CMS queue

Headcount math you can defend

A typical trio stack costs one technical writer, two part-time PMs, and a vendor linguist pool just to keep parity.

  • Code-grounded: new API param lands with a PR that updates examples, generates localized snippets, and posts a weekly activity digest highlighting changed keys by locale. One review step, then publish.
  • CMS-led: PM pings Docs; Docs pings Design for screenshots; L10n vendor rekeys whole pages; Support updates macros; stale links persist.

We see fewer escalations because the help center cites code-grounded answers tied to the same commit as the release. Support references the same artifact the product shipped from.

“When our docs began shipping off the read-only repo digest, stale-Japanese pages disappeared within two sprints. The PR titles told translators exactly which strings changed, and ticket volume on ‘feature not found’ dropped immediately.” — Head of Support, mid-market payments SaaS

Link the upstream rationale: /blog/live-code-documentation-vs-readme-rotting-always-fresh

Next steps: pilot a single locale and expand confidence

In our experience working with SaaS teams, a 2-week pilot limiting docs to one product area and one locale yields >80% translation reuse and exposes the exact gaps blocking multilingual product docs.

Start with a narrow surface area. Pick a single user journey, e.g., “OAuth setup” or “Webhook retries,” and one target locale (ja-JP or de-DE). Use DeployIt’s read-only repo digest to freeze a safe, build-linked snapshot.

  • Scope: 5–8 pages max tied to one feature flag or package.
  • Source of truth: code comments, OpenAPI/TypeSpec, CLI help, and example tests.
  • Automation hooks: CI job that publishes a code-grounded answer per commit and a weekly activity digest.

2-week pilot plan

Week 1

  • Day 1–2: Instrument extraction in CI, configure locales, and generate the first draft from the codebase index.
  • Day 3–4: Linguist review for tone and terminology; open a pull-request titled “Docs: Pilot ja-JP for Webhooks v1.”
  • Day 5: Publish to a pilot slug; notify support and sales.

Week 2

  • Day 6–8: Run one release; verify diffs match PR titles and commit messages; capture issues.
  • Day 9–10: Measure metrics and decide go/no-go to add a second journey.

  • Freshness SLA: docs updated within 1 commit of code merge (target: 95%).
  • Diff fidelity: text deltas map 1:1 to PR titles (target: 90%).
  • Translation reuse: TM/MT reuse across locales (target: 70–85%).
  • Support impact: reduction in “version-mismatch” tickets (baseline vs week 2).
  • Sales enablement: time to share code-grounded answer during trials (<2 minutes).

  • Read-only repo digest ID for audit.
  • Weekly activity digest for the pilot window.
  • Code-grounded answer snapshots per page.
  • Terminology decisions and banned terms list.

Ready to see what your team shipped?

Spin up your pilot environment and connect your repo.

When ready to expand, add locales feature-by-feature. Compare AI Support posture:

AspectDeployItIntercom Fin
Source of truthGenerated from live code and repo digestsDoc-grounded knowledge base
Update triggerPer-commit with PR title tracesPeriodic content sync
Answer typeCode-grounded answer with trace linksGeneric article excerpt
Locale rolloutPer-feature locale gatingWhole-site translation batches

Tie this section to your broader doc freshness strategy: /blog/live-code-documentation-vs-readme-rotting-always-fresh

Frequently asked questions

How do I maintain one source of truth for multilingual product docs?

Keep docs co-located with code (docs-as-code), use structured content (front matter, JSON/YAML), and drive localization via a TMS API (e.g., Phrase or Lokalise). Automate extraction (i18n keys) and rebuilds in CI. A mono-repo with language folders and locale fallbacks can reduce drift by 40–60% per Google’s developer docs guidance.

What tools are best for translating developer docs at scale?

Pair a TMS (Phrase, Lokalise, Smartling) with GitHub Actions and a static site generator (Docusaurus, MkDocs). Use translation memory and glossary enforcement; TM typically reuses 20–40% segments. For code snippets, protect fenced blocks via non-translatable tags. Consider LQA workflows per TAUS best practices to keep error rates under 2%.

How can I prevent code examples from breaking in localized docs?

Treat code as source-of-truth: pull snippets from tested files (literate or snippet extraction) and lock them with CI tests. Use tooling like Docusaurus code include, Sphinx literalinclude, or mdx-snippets. Run language-agnostic tests on every PR; teams report a 30–50% drop in post-release doc bugs using snippet extraction pipelines.

What governance model works for multilingual product docs?

Adopt a doc ownership map (CODEOWNERS) per component, plus locale maintainers. Enforce PR checklists (terminology, screenshots, release tag), and require bilingual LQA for Tier-1 locales (e.g., en, de, fr, ja). Quarterly termbase reviews and TM cleanup can cut inconsistencies by ~25% (per CSA Research recommendations).

How fast can we localize new releases without quality loss?

With CI-triggered string extraction and pre-translation using TM/MT, most teams localize minor releases within 24–72 hours. Use MT only for net-new segments, then human LQA for Tier-1 locales. Track MQM scores; aim for <5 major errors per 10,000 words, aligning with MQM 2.0 quality targets from W3C/TAUS.

Continue reading