AI-powered webnovel translation workstation — batch-translate Chinese, Japanese, and Korean webnovels into English with persistent character and glossary management.
- 15+ LLM providers — Ollama (local), OpenAI, Anthropic, DeepSeek, Google Gemini, Groq, Mistral, Together, Perplexity, Cohere, OpenCode, xAI, OpenRouter, Fireworks, DeepInfra, custom endpoints
- Batch translation — translate entire chapters at once with configurable batch size (1–10 segments per LLM call)
- Sliding window context — each batch sees 3 previous + 3 upcoming segments for coherent flow
- Persistent character management — auto-detect characters on import; alias tracking; gender/role/status fields; transliteration display
- Glossary — ensure consistent terminology across chapters (cultivation terms, place names, techniques); inline edit in context panel
- QA Queue — ambiguity detection flags pronouns, unknown names, idioms, cultural terms without blocking translation; batch-resolve by type with one click
- Translator instructions — per-project instruction box for name replacements ("Replace Mara Minato with Shinra Minato"), naming conventions ("Keep surname first"), style rules; commands auto-update character aliases and glossary
- Transliteration — pinyin with accent marks (nǐ hǎo), Japanese romaji (pykakasi), Korean romanization
- Translation memory — ChromaDB vector store finds similar past translations for style consistency
- Progress tracking — real-time batch progress, segment count, LLM status during chapter translation; cancel button to abort mid-translation
- Resume support — skips already-translated segments when re-translating a chapter
- Configurable timeout — per-provider timeout setting (default 60s) prevents stuck translations
- Export — plain text, HTML, and EPUB formats with source/include options
- Review pane — inline editing, diff view, search, accept/reset per segment, batch select, quality scoring
- Auto-backup — automatic
.novelprojsaves at configurable chapter intervals - Project/chapter rename — inline click-to-edit on project cards and chapter list
Download the latest installer from the releases page or build directly.
Prerequisites: Python 3.11+ with pip installed and on PATH. Run pip install -r requirements.txt after installing Python.
See CHANGELOG.md for the full release history.
git clone https://github.com/your-org/opentranslator.git
cd opentranslator
# Install Python dependencies
pip install -r requirements.txt
# Install Node.js dependencies
npm install
# Start development mode
npm run dev- Launch — OpenTranslator starts a Python backend (FastAPI on port 8712) automatically via Electron
- Create a project — Click "New Project", set source/target language and genre
- Import a chapter — Click the Import button, select a
.txtfile (one paragraph per line = one segment) - Add characters & glossary — Populate the Characters and Glossary tabs (or let the system auto-detect on import)
- Set instructions — Open the right panel, expand "Instructions", add name overrides or style rules
- Translate — Select the chapter and click "Translate" — the status bar shows batch-by-batch progress
- Review — After translation, switch to Review mode to edit, accept, or reset individual segments
- QA Queue — The QA Queue tab shows flagged items (pronouns, unknown names, cultural terms). Batch-resolve by type
| Setting | Description | Default |
|---|---|---|
| Primary Provider | Main LLM provider | ollama |
| Primary Model | Model name for primary provider | llama3:70b |
| Fallback Provider | Backup provider if primary fails | (none) |
| Segments per LLM call | Batch size (1–10) | 4 |
| LLM Timeout | Max seconds per LLM call | 60 |
| Auto-backup interval | Save .novelproj every N chapters | Disabled |
| Source Language | Novel source language | zh |
| Target Language | Translation target | en |
Ollama (local, free):
ollama pull llama3:70bOpenAI / Anthropic / etc.: Set the API key and model name in Settings. Provider-specific base URLs are preconfigured.
┌─────────────────────────────────────────────────┐
│ Electron Shell │
│ ┌───────────────────────────────────────────┐ │
│ │ Renderer (React + TypeScript) │ │
│ │ ┌─────────┐ ┌──────────┐ ┌───────────┐ │ │
│ │ │Translate│ │Review │ │ QA Queue │ │ │
│ │ │ View │ │Pane │ │ Panel │ │ │
│ │ └────┬────┘ └────┬─────┘ └─────┬─────┘ │ │
│ │ │ │ │ │ │
│ │ ┌────▼───────────▼─────────────▼─────┐ │ │
│ │ │ IPC Bridge (electron/ipc/) │ │ │
│ │ │ http:fetch → Node fetch() │ │ │
│ │ └────────────────┬───────────────────┘ │ │
│ └───────────────────┼───────────────────────┘ │
└──────────────────────┼──────────────────────────┘
│ HTTP :8712
┌──────────────────────▼──────────────────────────┐
│ FastAPI Backend (Python 3.11+) │
│ ┌──────────┐ ┌───────────┐ ┌────────────────┐ │
│ │Router │ │Pipeline │ │Ambiguity │ │
│ │(api/) │→│(pipeline/)│→│Detector │ │
│ └──────────┘ └───────────┘ └────────────────┘ │
│ │ │ │ │
│ ┌────▼──────────────▼──────────────▼─────┐ │
│ │ LLMRouter → litellm → Provider API │ │
│ └────────────────────────────────────────┘ │
│ │ │ │
│ ┌────▼──────────────▼──────┐ │
│ │ SQLite (SQLAlchemy) │ ChromaDB (Vector) │
│ │ - novels, chapters │ - translation │
│ │ - segments, characters │ memory │
│ │ - glossary, plot arcs │ │
│ │ - QA items, settings │ │
│ └─────────────────────────┘ │
└─────────────────────────────────────────────────┘
opentranslator/
├── backend/
│ ├── api/ # FastAPI route handlers
│ ├── db/ # SQLAlchemy models, ChromaDB
│ ├── detectors/ # Language-specific rule engines (zh/ja/ko)
│ ├── llm/ # LiteLLM router, prompts, provider config
│ ├── pipeline/ # Translation pipeline (context, translate, post-process)
│ └── utils/ # Transliteration, instructions parser, character detection
├── electron/
│ ├── ipc/ # IPC handlers (http:fetch proxy)
│ └── main/ # Electron main process (backend spawn, window)
├── src/renderer/ # React frontend
│ ├── components/ # UI components (ChapterNav, ContextPanel, etc.)
│ ├── layouts/ # App layout (WorkspaceLayout)
│ ├── pages/ # Route pages (TranslateView, QAPanel, Settings, etc.)
│ ├── services/ # API client (IPC bridge)
│ └── stores/ # Zustand state stores
└── package.json # Electron + React dependencies
# Install everything
pip install -r requirements.txt
npm install
# Run in dev mode (hot reload frontend + backend)
npm run dev
# Backend only (for testing API directly)
npm run backend:dev
# Lint TypeScript
npm run lint
# Build production EXE
npm run dist:win- Add the provider name, base URL, label, and pricing to
backend/api/settings.py - Add the default model to
DEFAULT_MODELSinbackend/llm/providers.py - Add model fetch logic to the
/settings/modelsendpoint if the provider has a/modelsAPI
| Layer | Technology |
|---|---|
| Desktop shell | Electron 31 |
| Frontend | React 18, TypeScript, Tailwind CSS, Zustand |
| Backend | Python 3.11+, FastAPI, Uvicorn |
| Database | SQLite (SQLAlchemy 2.0 async) |
| Vector store | ChromaDB |
| LLM routing | LiteLLM |
| Translation | ChineseDetector, JapaneseDetector, KoreanDetector (regex-based ambiguity) |
| Unicode | pypinyin (Chinese), pykakasi (Japanese) |
MIT