Mova0.5 pre-release⌕
☰
home / docs / tools / translate — Mova's translator through a meta-world

translate — Mova's translator through a meta-world

translate is the first version of Mova's own deterministic translator, and its hard test. A text is read down the standard stack of its language into a world, read from there into a meta-world that belongs to no language and no author, and written out of the meta-world by the standard encoder of the target language with the target author's delta. The standard stack of that language then takes it down to the text. The test is byte for byte. Whole blocks of verse-aligned Bibles must come back exactly: runs of chapters up to 2 500 words, with their layout (blocks.rs). What that takes, the residual, is measured in bits per block, per 1 000 words and per verse, by stage and by class. No large model translates or teaches here: every table is counted from the texts, and every choice says why.

How it works

source text ─► tokens ─► UD tree ─► frames ─► world            (the standard stack of the source: tools/roundtrip)
                                      │
                         reader into the meta-world             (the interlingua lexicon; for Hebrew, the Hebrew reader)
                                      ▼
                                 meta-world                     (concepts, coarse grammar, tree: no author, no language)
                                      │
               standard encoder of the target language + the author's delta
                                      ▼
target words ─► UD tree ─► tokens ─► text                       (the standard stack of the target, with the encoder's
                                                                 order and forms as hints)

The meta-world

The meta-world of a verse is a graph of meta tokens. Each token has a concept, the coarse grammar the standard parse gives it (PTB tag), its head and its relation. With --meta-rel coarse the relation is a frame role (subject, object, oblique, a noun's modifier, a verb's modifier, a clause link, a function word, punctuation, root), and a punctuation mark hangs on the token before it. With --clauses flat a sentence's root and every coordinated or paratactic predicate hang on the top of the verse, so how an author joins clauses («…, and he said» or «…. He said») is not in the meta-world's tree.

Function words between two authors (fwt.rs, --fwt on) are the one part learned per author pair. For each trained pair, a small table holds the function tokens of the source the target drops in a context, and the runs of function tokens it inserts between two source tokens. A rule is kept with at least 3 cases and half of its context's. The table is applied to the source's meta-world before the target's encoder. Each token also keeps the source words it was read from, so an encoder can learn how an author writes it. What belongs to one author is left out:

The interlingua lexicon (meta.rs) is learned once, for all authors, on the training verses of pairs of authors. The pairs are around two hubs: JPS–KJV, KJV–WEB and KJV–ASV, and with --hub2 on also JPS–ASV and ASV–WEB. JPS↔WEB is never paired. For each pair:

  1. Each verse is read as a sequence of reading keys: the lemma in lower case; a punctuation mark as written; LORD and GOD (the divine name in capitals) in capitals.
  2. The longest common subsequence of the two key sequences anchors the verse. The gaps between anchors are the places where the two authors differ.
  3. Gap pairs of one to four keys on each side give word and phrase pairs. A word next to punctuation does not form a pair.
  4. A pair is a candidate when it holds for at least 3 occurrences, 20% of the word's differing places and 2% of all its occurrences.
  5. Each candidate is judged by the residual it moves (--lexicon judged, the default). What a merge saves the reader is measured (--judge measured): the reader's bits on up to 12 sampled training verse pairs where the two differ, with the merge and without it, times the merge's count (without the flag: an assumed 17 bits a word for every differing place it makes equal). With --judge-pairs on, a merge must also not cost any author pair more than it saves that pair's reader. A pair's cost counts its two authors' occurrences whose member the author and the tag no longer tell. It costs the encoder 17 bits a word for every occurrence, in all the judged corpora, whose member its context no longer tells: author, tag and relation for a word, author alone for a phrase. Candidates go in order of their counts, and a cluster's cost is recomputed as it grows. A merge is kept when it saves at least 51 bits more than it costs. --lexicon mutual is the earlier rule: each must be the other's most frequent partner, with 5 occurrences, 30% and 5%.

The concept is named after the most frequent member. The reader reads a verse with the longest known phrase first, then the word. A phrase's tree position is that of its word whose head lies outside it.

The Hebrew reader (hebrew.rs) is also learned, not written. It reads the Leningrad Codex as MACULA's UD trees.

  1. It learns on two kinds of training verse pairs:
    • Hebrew with the meta-world read from JPS 1917, cut at the Hebrew verse numbers. Meta tokens align to Hebrew words by IBM Model 1. MACULA's English glosses act as a prior: 2 pseudo-counts per gloss word in each of 5 iterations. A place prior favours words at the same relative position.
    • Hebrew with the meta-world read from the KJV, where its verse numbers are the Hebrew ones (--strong <eng-kjv>). eBible's KJV writes each translated word with the Strong's number of the Hebrew word it renders, and MACULA writes the same numbers on the Hebrew words (strong.rs). A meta token with a number aligns to the Hebrew word with that number; the rest align by IBM Model 1.
  2. The meta tokens aligned to a Hebrew word, and the unaligned tokens after them, form that word's chunk: וַיְהִי reads as it come_to_pass, and אֵת reads as nothing.
  3. A Hebrew word reads as its most frequent chunk, in the most specific context seen at least twice: lemma, part of speech, verb type, person and number; then lemma, part of speech and verb type; then the lemma alone.
  4. A lemma never seen reads as MACULA's gloss through the lexicon.
  5. Chunk heads hang on the chunk of their Hebrew head.
  6. With --heb-grammar on (grammar_plan), the reader also writes what Hebrew says by structure and English by words:
    • an of before a construct dependent;
    • a the before a construct head whose chain is definite;
    • each possessive suffix as a possessive before its noun;
    • a subject that follows its verb, moved before the verb.

The Hebrew world level uses MACULA's verbs and their frame arguments (Frame=A0/A1/A2), and the negation of macula prag.

The standard encoder and the authors

The standard encoder (profile.rs) is learned on all the English we have:

That comes to 3.6 M meta tokens. Each text is read into the meta-world, and each meta token is seen next to the chunk of words written for it. The sentence capital is taken off, because it is the stack's rule. To encode a token, the standard takes the most specific context that was seen often enough and writes its most frequent chunk. The contexts, from most to least specific, are:

  1. concept, tag and both neighbours;
  2. concept, tag and relation;
  3. concept and tag;
  4. the concept alone.

A concept never seen gets its bare form: the concept inflected by morph from its tag.

An author is a delta over the standard: a sparse set of overrides, learned only from what the standard gets wrong on that author's training text. The overrides are learned from the coarsest context to the finest. An override «in this context write this chunk» is kept only when both of these hold:

A finer override wins over a coarser one. Where the delta says nothing, the standard decides. «Author» can be any style. Here there are eight: JPS 1917, KJV, WEB, ASV, the school's book lines (school-plain: explain, fact), its conversational test questions (school-talk: the voice that is half slang), its formal exam questions (school-exam), and the tales.

Exact mode: the split code and the gate

For each target verse, the residual is split by stage (measure.rs):

The decoder runs the stages down: meta-world, encoder, parse, script, tree decoder, text. The gate compares the meta-world, the tree, the tokens and the text on the way. The direct code is gated too: it sends the target from the translation's own normal-mode output, with a tree script and the stack, the way the baselines are measured.

Classes are roundtrip's, in six groups:

Bits follow roundtrip's fixed rules: a dictionary lemma is 17 bits, a function word 8, a mark 5, a position log2(n+1).

Normal mode

In normal mode the encoder with the target author's delta writes the source's meta-world, with no residual. The output is scored against the target verse by exact match, chrF, and roundtrip's divergence classes on the parsed output.

Data

How to run

cargo build --release -p school-sents -p translate -p jobs
E=$RESEARCH_RAW/scripture/4-translations/ebible
P=$MOVA_DATA/runs/translate-<date>/pools
OT=GEN,EXO,LEV,NUM,DEU,JOS,JDG,RUT,1SA,2SA,1KI,2KI,1CH,2CH,EZR,NEH,EST,JOB,PSA,PRO,ECC,SNG,ISA,JER,LAM,EZK,DAN,HOS,JOL,AMO,OBA,JON,MIC,NAM,HAB,ZEP,HAG,ZEC,MAL
for a in jps:engjps kjv:eng-kjv web:eng-web asv:eng-asv; do
  target/release/school-sents usfm $E/${a#*:} $P/${a%%:*}.tsv ${a%%:*} $OT; done
target/release/school-sents usfm $E/engjps $P/jps-heb.tsv jps $OT --hebrew-verses
J=$MOVA_BIG/corpora/judaism
target/release/jobs run --name translate --mem-gb 14 -- target/release/translate eval \
  --pools $P --wlc $J/text/tanakh-wlc-macula --prag $J/parsedb-hbo/prag.tsv \
  --school world/data/school --tales <corpus-0.3>/treebanks/mova-tales-silver-en.conllu \
  --talmud $MOVA_BIG/runs/cycle-talmud-2026-10-18/talmud.tsv \
  --strong $RESEARCH_RAW/scripture/4-translations/ebible/eng-kjv \
  --meta-rel coarse --judge measured --lb on --judge-pairs on --hub2 on --clauses flat --fwt on --heb-grammar on \
  --own-words 0.8 --typo on \
  --usfm $RESEARCH_RAW/scripture/4-translations/ebible \
  --out $MOVA_DATA/runs/translate-<date>/run1 --split dev --threads 10
# measured alternatives: --lexicon mutual, --feats on, --meta-tree frames, --fw on, --clauses on|joined, --lattice on, --std-vote corpus|context, --reorder on
cargo test --release -p translate

A run writes report.md (every table below and more), examples.md (verses with the reason of every choice), numbers.tsv, lexicon.tsv (each concept's members and the pair that linked them) and deltas.tsv (every override with its counts). The test split runs with --split test, once.

Measured (2026-10-18)

Model en.bin of 2026-10-15; repo at the merge of main of 2026-10-18. The current system is:

--lexicon judged --judge measured --lb on --judge-pairs on --hub2 on --meta-rel coarse --clauses flat --fwt on --heb-grammar on --own-words 0.8 --typo on --strong <eng-kjv> --usfm <ebible>

Runs are in translate-2026-10-18:

A run takes about 9 minutes on the shared 20-core server, 10 threads, and peaks at 8.4 GB.

The test split has been opened four times in all, once at the end of each of the first three rounds, and once on 2026-10-19 for the Tanakh pages (tr-test, the system with --pages below; its Bible tables are in that run's report.md). From now on it is read once per release. Every decision was made on dev.

Determinism. r8-final3 and r8-final4 gave byte-identical report.md, examples.md, numbers.tsv, lexicon.tsv and deltas.tsv.

The gate. Every block and every verse of every system came back byte for byte. The gate control fails on every verse and every block.

Blocks. The dev books (JOS, NEH, EZK, ZEP) cut into 37 blocks: whole chapters up to 2 500 words, cut at chapter boundaries. The cut uses roundtrip blocks' own rule (roundtrip::blocks::group); this crate's earlier maker and roundtrip::blocks::jps give the same runs, checked in every run.

Normal mode (dev): the translation as written

chrF and exact match of the translation against the target, per block (a block's whole text, layout included) and per verse.

systemblocks: chrFverses: chrFverses exact %
jps → kjv86.183.74.9
jps → kjv: copy the source85.984.14.1
jps → kjv: word by word86.784.56.1
kjv → web78.574.21.0
kjv → web: copy the source73.269.00.9
kjv → web: word by word77.974.21.2
jps → web (pair never trained)76.773.30.4
jps → web: copy the source75.272.31.6
jps → web: word by word80.378.11.1
jps → asv90.890.09.4
kjv → meta → kjv (autoencoder)—97.545.5
wlc → jps54.544.40.0
wlc → jps: MACULA glosses word by word55.547.30.0

No block is exact.

Live examples from r8-final3/examples.md (JOS 1:1, 5:15, 9:9):

JPS → KJV

KJV → WEB

JPS → WEB (never trained)

WLC → JPS

What is still wrong:

Exact mode (dev): bits to give the target back

systemblock, verse-anchoredper 1 000 wordsblock, one readerverse: splitverse: direct
jps → kjv9 6975 08012 415147.1153.1
jps → kjv: copy the source9 6935 078——147.1
jps → kjv: word by word9 4484 950——143.3
kjv → web15 6838 72120 511236.6263.6
kjv → web: copy the source19 56610 881——296.7
kjv → web: word by word16 9459 423——256.1
jps → web (never trained)15 1788 44119 739227.1244.9
jps → web: copy the source17 2649 601——259.4
jps → web: word by word14 8128 237——221.4
wlc → jps40 98921 44153 893633.3621.5
wlc → jps: MACULA glosses word by word37 91119 831——585.7

What normal mode gained, the bits lost in part:

The changes, each measured on dev (per verse)

Bits per verse of the split code (the Hebrew column is WLC→JPS). The mean is over the twelve any→any pairs of the four Bibles.

changerunmeanJPS→KJVKJV→WEBJPS→WEBWLC→JPSkept
first version (mutual lexicon)run4212.2183.3263.7232.0738.2—
residual-driven lexicon (judge assumes 17 bits saved a place)r2-lex1197.0158.7268.9240.1733.2yes
pronoun number and person on meta tokensr2-feats209.0162.9287.1257.4—no (--feats on)
Hebrew reader aligned by Strong's numbersr2-strong197.0158.7268.9240.1723.7yes
chunks keep their inner tree (words re-parsed)r2-chunks200.0162.2270.7241.9727.1no
the encoder writes its own treer2-tree202.3164.8278.1249.3725.4no
meta relations as frame roles, marks on the word beforer3-coarse187.5150.7254.9228.0706.8yes
the judge measures what a merge saves the readerr3-judge195.8160.1262.0231.4704.2yes
the meta-world's tree through the frames' anchorsr4-anchor187.4153.3249.6220.4691.5no (--meta-tree frames)
the judge per author pairr4-pairs186.4147.5249.6219.9683.5yes
determiners and prepositions as features of meta tokensr4-fw278.2233.8371.1322.1953.6no (--fw on)
clause level: joiners on the clause's first word, clauses side by sider5-clauses3258.6225.3330.1292.9804.5no (--clauses on)
clauses side by side onlyr5-flat183.4146.2244.2215.2683.1yes (--clauses flat)
a second hub (ASV) and per-pair savings from the pair's own samplesr5-hub185.2147.5245.8215.4680.8yes (--hub2 on)
function words: a per-pair insert/drop tabler5-fwt185.9147.6248.6219.9683.5yes (--fwt on)
round 5's systemr5-final1181.0146.3239.5210.7680.5—
the 95% lower bound of a merge's measured savingr6-lb180.8146.2239.0210.0678.9yes (--lb on)
the verse lattice: the standard learns on the four renderings' backboner6-lattice182.3147.4240.4211.5682.2no (--lattice on)
joining as a choice conditioned on the source's joining and the clause relationr6-joined272.3241.2339.9298.1862.6no (--clauses joined)
modals never glued to a concept («may Yahweh»)r7-modal180.6146.0238.5209.4679.2yes
the standard weighted one vote per corpusr7-vote180.6146.2238.3209.2679.3no (--std-vote corpus)
the Hebrew reader's grammar: construct «of»/«the», possessive suffixes, subject before verbr7-heb180.6146.2238.3209.2636.0yes (--heb-grammar on)
the standard voted per context (each corpus one vote in every context)r7-ctx180.7145.4238.6209.5636.2no (--std-vote context)
the same, a context used only when two corpora wrote itr7-ctx2181.2146.1239.3210.2636.3no
where clause parts go, a table per target authorr7-reo2180.6146.0238.5209.5635.9no (--reorder on)
no doubled «of»/«the», no mark at a Hebrew verse's start (round 7's system)r7-final3180.6146.0238.5209.4630.6—
the author's own words at share 0.5, and the swap of concepts the target never writesr8-own05189.1161.0231.7222.3645.8no
the same at share 0.8r8-own08176.4147.4219.1209.7633.5yes (--own-words 0.8)
each author's typography (quotes, possessives)r8-typo179.5145.8236.3226.9631.9yes (--typo on)
both, with Hebrew idioms (came to pass, did so) and of the (the current system)r8-final3180.5147.1236.6227.1633.3—

What each change of round 8 is:

What each change of round 7 is:

Measured in earlier rounds and kept as they were:

The residual by class, and meta-world agreement (dev, per verse)

systemlexicalconstructionorderfunctionpunct/casemorphology
jps → kjv49.640.45.221.015.814.0
jps → kjv: copy51.442.54.218.323.07.6
kjv → web84.959.012.738.133.010.8
kjv → web: copy90.971.69.337.876.310.8
jps → web70.153.410.230.135.410.2
wlc → jps254.6137.235.3129.459.114.9
wlc → jps: glosses197.4122.727.090.6118.329.6

The reader stage alone (bits per verse): JPS→KJV 121.2, JPS→WEB 188.2, KJV→WEB 217.3, WLC→JPS 597.7. The Hebrew reader's grammar took the function class from 185 to 129 and order from 42 to 35.

At the world level, two English translations share 77–88% of a verse's events and 57–75% of its entities. The Hebrew reading finds 33% of JPS's events.

Authors as deltas (dev, encoder stage on the author's held-out text, bits per unit)

With the own words, a delta is mostly the author's word list: 5 500–5 800 overrides for a Bible.

authoroverridesstandard → + delta+ wrong delta+ shuffled delta
JPS 19175 64814.9 → 12.633.9 (WEB's)23.8
KJV5 54713.1 → 8.632.5 (WEB's)20.0
WEB5 76713.2 → 12.745.0 (KJV's)22.8
ASV5 48512.8 → 9.736.5 (WEB's)22.7
school-plain18 07410.2 → 10.310.6 (talk's)11.7
school-talk6 8358.1 → 7.77.9 (plain's)9.3
school-exam3 5947.2 → 7.57.4 (talk's)10.3
tales1 16111.8 → 13.430.0 (KJV's)14.6

Controls (dev)

What normal mode needs next

In order of what the examples show:

  1. Quotes across verses. Learn the quote state per block, not per verse, so a quote that opens in one verse and closes in another comes out right; that is most of what typography cost JPS→WEB.
  2. Swaps for pairs never trained. Compose the trained pairs' swap tables through the hub (JPS→KJV→WEB), so JPS→WEB writes to and you too.
  3. Own words that yield to a finer context the author has seen (KJV's standest after thou), and a lower bound on the share instead of a flat 0.8. That would make the shuffled-lexicon control red again on JPS→KJV.
  4. The Hebrew clause order inside quotes and objects, and the of: where an inserted article still meets a chunk's of.
  5. The one-reader block code: a position code that names the verse first.

The parallel Tanakh as site pages, both ways (--pages)

The Tanakh corpus pages of the site (corpora/<part>/<BOOK>.<c>.<v>/: a verse in Hebrew with its MACULA tree, its pragmatics, its Targum and links to its English; corpora/<part>/jps/<BOOK>.<n>/: a JPS sentence with its tree and frames) are translated as page blocks, Hebrew pages → meta-world → English pages and English pages → meta-world → Hebrew pages (pages.rs). A chapter is its verse pages on one side and the sentence pages that begin in it on the other; the blocks are the JPS's chapter runs of roundtrip blocks (blocks::jps, blocks::group, 2,500 words), the other side cut the same (blocks::like).

A target page block costs the translation of its texts — each Hebrew verse, or each English unit (the JPS sentences that begin in a verse), with the split code (reader, encoder, stack) — and the page around them: the target pages through roundtrip blocks' site decoder (roundtrip::blocks::site_md) with the translated texts and the source's own texts given (site_md::give, class given), so the markup, the other prose, the trees and tables it writes from the layers, and the Targum are what is left.

English → Hebrew (heb_enc.rs). The Hebrew encoder is the Hebrew reader turned round, learned on the same training verse pairs: the reader's alignment gives each meta token to a Hebrew word (its chunk); the first token of a word's chunk emits the word (lemma, UPOS, XPOS, FEATS, relation), the others nothing; to encode, each meta token emits what it emitted most often in the most specific context seen twice (profile::ctx_keys), and a word hangs on the word its meta head's chain emitted first. The split code onto a Hebrew verse: reader — the script from the meta-world read from the English to the one the Hebrew reader reads from the target verse; encoder — the Hebrew tree script from what the encoder writes for the target's own meta-world to MACULA's words (roundtrip::mixed::heb::frames_encode), with the words out of place; stack — the words to their forms by the lookup generator of the training books' trees, a form looked up with the word before it in its written word (Lookup::from_conllu_ctx, --heb-forms ctx: the dagesh after וַ, the article's vowel), and the written words to the verse (mixed::heb::tree_encode, tokens_up); a verse whose written words are not its tree's (a paragraph mark glued to a word) stores its text. The gate decodes the meta-world, the words, the written words and the verse.

Run

roundtrip site-learn --site-md $S --site-target 1000 --out $L --model <en.bin> --lin-every 2   # tools/roundtrip README
jobs run --name translate --mem-gb 16 -- translate eval … (the current system's flags) \
  --pages $S --site-dict $L/markup.tsv --site-heb $L/hebrew.tsv --site-english $L/english.tsv --heb-forms ctx \
  --model $L/en-lin.bin --out <dir> --split dev

--site-english adds the site's train pages' English (english.tsv, 105,624 sentences; the Tanakh's held-out books left out) to the standard encoder's training text. The run appends «The parallel Tanakh as pages, both ways» to report.md and writes pages.tsv (a row per block and direction: verses, words, gate, the bits of each stage and of the page).

Measured (2026-10-19)

The site's pages from a copy of the md twin taken at 12:10 (md-snapshot); the tables of roundtrip site-learn in learn5/; runs in ae-md-2026-10-19 (tr.sh; tr-before, tr-after3, tr-after4, tr-test): 8 minutes each, 10 threads, 12.8 GB. The dev books (JOS, NEH, EZK, ZEP): 37 blocks, 2,389 Hebrew verse pages and 2,493 English sentence pages. Before: the current system as in «Measured (2026-10-18)», en.bin, no table of the site's train pages; after: --site-english, --heb-forms ctx, the site's tables and the adapted order (en-lin.bin).

The gate. Every block of both directions came back byte for byte, the translated texts and the pages around them (37/37 and 37/37 each way). Determinism: tr-after3 and tr-after4 gave byte-identical report.md, examples.md, numbers.tsv, lexicon.tsv, deltas.tsv and pages.tsv.

direction (dev)translation, per blockpage, per blocktotal per blockper 1,000 target wordstranslation per versechrF per verse
Hebrew → English pages, before40,878478,973519,851272,097633.144.4
Hebrew → English pages, after40,813476,770517,583270,909632.144.4
English → Hebrew pages, before100,8241,827,8671,928,6912,338,0371,561.520.7
English → Hebrew pages, after95,562795,983891,5451,080,7671,480.020.6
English → Hebrew, Hebrew encoder learned on shuffled pairs (control)109,1641,690.72.2

The target words are the translated texts' (70,690 English, 30,522 Hebrew). The page dominates: a sentence page is about 190 bits of text against 3,500 of template, trees and tables. The Hebrew pages' page bits fell by 56% with the site's Hebrew trees' lexicon (their CoNLL-U 1,335,518 → 309,468 bits a block; the Hebrew verbs' table, 65 bits a block, is rebuilt from the tree).

By stage and class group (bits per verse, after):

directionreaderencoderstacklexicalconstructionorderfunctionpunct/casemorphology
Hebrew → English599.011.821.3255.3136.635.3129.458.916.4
English → Hebrew453.5466.7559.8415.0177.046.2221.153.7567.2
English → Hebrew, shuffled encoder453.5677.4559.8616.5125.329.9307.750.6560.6

What each trained part removed (dev, bits per verse):

The test split, once (NUM, 1SA, 2CH, PSA, JER, JOL, NAM, MAL; tr-test, after): see the table below.

direction (test)blocksversesgate / page exacttranslation, per blockpage, per blocktotal per blockper 1,000 target wordstranslation per versechrF per verse
Hebrew → English pages906,98690/90, 90/9042,260563,999606,259310,868544.441.8
English → Hebrew pages906,98790/90, 90/9093,684885,741979,4251,166,6461,206.719.7
English → Hebrew, shuffled encoder (control)906,98790/90107,4001,383.42.3

By stage (bits per verse): Hebrew → English reader 512.9, encoder 10.4, stack 21.2; English → Hebrew reader 369.5, encoder 379.6, stack 457.6. The first attempt stopped at the 16 GB limit while it wrote the pages (the test split has 90 blocks); the run that counts had 24 GB (peak 18.6 GB, 19 minutes).

What the residual asks for next. Hebrew → English: the reader (599 bits a verse: dropped 213, function 129, attachment 110) — the Hebrew reader's chunks and its grammar plan. English → Hebrew: the stack's forms (366) and accents (108) — a Hebrew generator of pointing from lemma, binyan and the prefix, the accents as a layer of the verse's syntax; the encoder's dropped words (239) — Hebrew words no meta token emits (אֵת, prefixes, suffix pronouns), learned as inserts conditioned on the head they attach to, not as chunk tails (measured worse); the page's template (≈ 190,000 bits a block of markup on both sides) — markup from the page id.

Limits

This page in Markdown → https://md.mova.elamur.ai/free/en/docs/tools/translate/