How to Translate an EPUB and Still Get a Book That Opens
To translate an e-book, use a tool that translates the text inside the EPUB package and rebuilds the same package, rather than converting your book into a Word file or a PDF. The EPUB Book Translator does that: what you download is still an .epub, and it still opens in Apple Books, Kobo, or Calibre.
That is the part worth measuring. With most formats the question is whether the translation is any good. With EPUB there is a question underneath it, which is whether the file you get back is still a book at all.
An EPUB is a small website in a zip
Rename any .epub to .zip and open it. Inside you will find one XHTML document per chapter, a stylesheet, the fonts, the cover image, a manifest listing every file, a spine giving the reading order, and, usually, two separate tables of contents.
Two, because of history. EPUB 2 used a file called toc.ncx. EPUB 3 replaced it with a nav.xhtml page. Most real books in circulation ship both so they work in old and new readers alike.
That structure is why the naive approaches fail in the two ways they do.
The first way is conversion. A lot of “translate my book” workflows flatten everything into a Word document, translate that, and hand it back. The text may be perfect. You no longer have an e-book: no reading order, no chapter navigation, no cover, no stylesheet.
The second way is a broken package. A tool returns something with an .epub extension that a strict reader rejects, because a chapter came out as invalid XML, or because a zip detail the spec is fussy about got rebuilt wrong. You cannot tell by looking at it. You find out when the book will not open.
The four things that decide whether it still works
The mimetype entry. The EPUB spec requires it to be the very first entry in the zip and stored uncompressed. It is one of the easiest things to lose when a tool rebuilds a package, and losing it is enough on its own to make a reader refuse the file. It is written back first and uncompressed, every time.
Valid XML in every chapter. After a chapter is translated it is re-parsed as XML before it is accepted. If the result is not well-formed for any reason, that chapter’s original bytes are kept instead and the count is reported to you. A chapter still in English is a disappointment. A book that will not open is a broken product, and given the choice between the two, this takes the first one and tells you.
Both tables of contents. If a tool translates only one, you get a book whose chapter list is Spanish inside the reader but English in your library, or the reverse. Both are handled here, along with the title and description your reader displays.
The language tag. dc:language is rewritten to the target language’s code, and so is the lang attribute on each chapter. Readers use that for hyphenation, for choosing a font, and for picking the text-to-speech voice. Leaving a Spanish book tagged en is a real bug, just an invisible one until your reader hyphenates Spanish by English rules or reads it aloud in the wrong accent.
Translating the book
- Open the EPUB Book Translator.
- Drop your
.epubin, or click to browse for it. - Pick your target language. Choose the specific variant you want, since Latin American and European Spanish have noticeably different voices.
- Click Translate Book.

The glossary matters more in a book than anywhere else
A book is long. That is the whole problem. A character called Orion can come back as three different spellings across three chapters, because each chapter is a fresh decision for the model, and nothing carries a name from one to the next.
That inconsistency is the classic tell of a machine-translated novel, and it is the one thing a reader notices immediately. The glossary fixes it before it happens:
Orion = Orión
Elena Marsh = Elena Marsh

Pinning a name to itself, like the author line above, keeps it out of the translation entirely. Do this for character names, place names, invented words, and anything else the book made up.
What comes back

The heading reads 24/24 passages translated (100%) across 3 chapters. When a passage comes back in the source language the tool says so before you download, rather than presenting a partial job as a finished one.
Since the tool hands you a file rather than a preview, here is what was actually inside the download.
The metadata your reader shows in its library
<dc:identifier id="bookid">urn:uuid:6f1a2c48-9d3e-4b77-8f21-0c5ad9e41b30</dc:identifier>
<dc:title>El cielo de invierno</dc:title>
<dc:creator>Elena Marsh</dc:creator>
<dc:description>Una breve guía para orientarse después del anochecer</dc:description>
<dc:language>es</dc:language>
The title and description are translated. The author’s name is not, because a name is not a phrase. The identifier is untouched, which matters because that is what your library uses to recognise the book. And the language tag moved from en to es.
Both tables of contents
The old NCX:
<docTitle><text>El cielo de invierno</text></docTitle>
<navLabel><text>Encontrando a Orión</text></navLabel>
<navLabel><text>Qué llevar contigo</text></navLabel>
And the EPUB 3 nav page:
<h1>Tabla de contenido</h1>
<li><a href="ch1.xhtml">Encontrando a Orión</a></li>
<li><a href="ch2.xhtml">Qué llevar contigo</a></li>
Both translated, the glossary term held in both, and the href values untouched so the links still go where they went before.
Emphasis lands on the right word
This is the detail that separates a book from a wall of translated text. In the original:
<p>The trick is to stop looking for a hunter. Look instead for the <em>belt</em>, and let the
rest of the figure arrive on its own.</p>
And what came back:
<p>El truco está en dejar de buscar un cazador. Busca en cambio el <em>cinturón</em>, y deja
que el resto de la figura aparezca por sí sola.</p>
The <em> did not stay in the position it occupied in the English sentence. It moved to the Spanish noun, because inline tags are handed to the model as markers it is allowed to reposition, and then rebuilt as real tags afterwards. A tool that pins formatting to word order italicises whatever happens to land in slot four.
Alt text is translated too
<p><img alt="Las tres estrellas del cinturón en una corta fila recta" src="images/cover.png"/></p>
Image alt text is text a person reads, just through a screen reader rather than with their eyes. It gets translated. The src does not, so the image still resolves.
URLs and email addresses survive inside translated sentences
<p>Los pronósticos de nubes para la semana entrante se publican en https://example.org/skies
cada lunes. Si prefieres que te avisen cuando el cielo se despeje, escribe a
notices@example.org y pregunta.</p>
The sentence around them is fully Spanish. The address and the URL are character for character what they were.
What is byte-identical, and what is not
Worth being precise here rather than claiming more than is true.
Every file the tool does not need to touch comes back byte for byte. In this book that was the mimetype entry, META-INF/container.xml, the stylesheet, and the cover image. They are not re-serialized at all, they are copied. That is the guarantee that covers your fonts, your illustrations, and your CSS, which is to say everything that decides what the book looks like.
The chapters the tool did translate are rebuilt, so they are not byte-identical to the originals. The tags, the attributes, the values and the structure are all preserved, but attribute order and indentation come out normalized by the serializer. It is invisible in a reader and it changes nothing about how the book renders. If you diff the package you will see it, so it is better to know now than to wonder later.
The entry list and its order are unchanged, mimetype is still first and still uncompressed, and the spine still reads nav, ch1, ch2.
Tested, not promised
The EPUB engine has a public test harness. As of the run on 2026-07-29 it passes 56 of 56 checks, offline.
They are not vanity checks. Among them: mimetype first and stored, the cover and stylesheet byte-identical, every document still valid XML, NCX labels translated, EPUB 3 nav links translated with hrefs untouched, dc:creator untouched, dc:language rewritten, spine order unchanged, and a set that deliberately feeds the engine damaged marker output to confirm that a dropped inline tag keeps its text, gets counted rather than hidden, and still produces a valid document. Full results are on the evals page.
What people actually use this for
One piece of feedback left on the tool page in August 2026:
“Translated a Gutenberg text from French to English. Worked extremely well. Was a 1913 short technical aviation book by Roland Garros. EXCELLENT!”
That is a good picture of the real use case. Public domain books, out-of-print technical writing, and works that were never commercially translated because the audience was too small to justify it.
The other audience is language learners, and it is the one we are building for next. Reading a book you already know in a language you are learning is one of the oldest and best ways to pick it up, and a side-by-side bilingual output would make that far easier than flipping between two files. That is not shipped yet. It is the next thing planned for this tool, and it is the reason the engine keeps passages aligned rather than just producing fluent output.
What it will not do
Said plainly, so you do not find out halfway through:
- DRM-protected books cannot be translated by anyone. If the file came from Kindle or through an Adobe
.acsmlink, its text is encrypted. This is not a limitation of this tool, it is the point of DRM. - Text baked into a picture stays in the original language. A cover, a map, a scanned page. It is a picture. If your book is scanned pages, the PDF translator can OCR them.
- Read-along audio narration keeps its original timing, so the narration will not match translated text.
- Kindle formats need converting first.
.mobiand.azware not EPUB. Calibre converts them for free. - 25 MB per book, one book at a time, and one target language per run. There is no batch mode and no multi-language run on this tool yet.
If your job does not fit inside that, tell us about it.
A checklist before you read it
- Put character names, place names and invented words in the glossary before the first run.
- Pick a specific language variant rather than the generic one.
- Check the passage count in the heading. If it is not 100%, run it again before you commit to reading it.
- Open the download in your actual reader, not just a preview, and check that the table of contents navigates.
- Skim a chapter from the middle of the book, not just the first page. The first page is the one that is always fine.
Ready when you are: the EPUB Book Translator is free, needs no account, and keeps no copy of your book.
If your book is a PDF rather than an EPUB, the PDF Translator handles those, including scanned pages. For a single chapter or a passage you want to compare, the Text Translator is quicker.