Multilingual Routing

How language is expressed in the API — path-prefix mirror.

≈ 3 min read 475 words Updated 2026-08-29

On this page

The API mirrors the www site’s multilingual convention:

  • English is the default. URLs have no language prefix: /v1/wiki/elohim/.
  • Other languages prefix the language code: /v1/de/wiki/elohim/, /v1/ja/wiki/elohim/, /v1/zh-Hant/wiki/elohim/.

Each /v1/{lang}/... is a separate set of pre-built files; the language tree is wholly parallel to the English tree.

Supported languages#

CodeNative nameEnglish name
enEnglishEnglish (default)
deDeutschGerman
frFrançaisFrench
esEspañolSpanish
ruРусскийRussian
ja日本語Japanese
zh简体中文Simplified Chinese
zh-Hant繁體中文Traditional Chinese
ko한국어Korean
heעבריתHebrew (reserved; empty until translations land)

The canonical list is at /v1/enums/languages/.

What’s mirrored#

SectionEnglish-only fallback?
/v1/wiki/No — all 9 active languages have full or partial coverage.
/v1/timeline/No — 6 of 8 active languages have full coverage; ko and zh-Hant have only framing pages currently.
/v1/articles/Yes — articles currently only ship in English.
/v1/news/Yes — Newsroom dispatches currently only ship in English.
/v1/sources/traditions/English only for now.
/v1/library/URL mirror under /v1/{lang}/library/... for languages with translation coverage. Per-language listings (/v1/{lang}/library/books/) are filtered to books whose availableLangs includes {lang}; the full corpus is at /v1/library/. Chapter titles and paragraph text resolve to the requested language; the parallel i18n maps are not returned in the response payload — the URL prefix already implies the language, so clients that want another language hit a different URL.

What’s not mirrored#

These endpoints are language-agnostic and live only at their root paths:

  • /v1/schema/* (schemas are English-described JSON Schemas)
  • /v1/enums/* (enum values are language-agnostic identifiers; enum labels in the response are English)
  • /v1/sources/{id}/ (bibliography records are stored once; their internal description.{lang} map is multilingual)
  • /v1/glossary/{term_id}/ (already multilingual in a single response)
  • /v1/translations/{slug}/ (multilingual in a single response)
  • /v1/context/* (English curated narrative; translations may follow)

Translation status#

Every content response includes a translation_status field per Decision 12:

ValueMeaning
en_onlySource language only; no translations published yet.
partialSome languages translated.
completeAll supported languages translated.

When a translation doesn’t exist#

Requesting a language-prefixed URL for a page that isn’t translated returns the standard 404 page (HTML) at the moment. The planned NotTranslated JSON envelope (see Envelope) will follow once Cloudflare 404 routing is configured.

URL hints in responses#

Every content response’s links.canonical_html points at the corresponding www HTML URL in the same language:

"links": {
  "self": "/v1/de/wiki/elohim/",
  "canonical_html": "https://www.wheelofheaven.world/de/wiki/elohim/"
}

Why path-prefix instead of ?lang=#

Path-prefix mirrors www, gives every language its own cacheable file on the CDN edge, and makes the URL self-describing. A query parameter would have shared cache keys with English and obscured which language a URL was for.

Edit this page on GitHub