Jay Leimer26 downloadsSwitch a note's display between the original text, English and German using any OpenAI-compatible LLM. The file on disk never changes.
Write your notes in any mix of German and English, then read them in either language with one click.
The file on disk never changes.
Website with the demo and install steps
| Original (as written) | English view |
|---|---|
![]() |
![]() |
Transparent Translate adds a language switch to every note: Original → English → German. Translations are made by any OpenAI-compatible LLM (a local server such as LM Studio, or a cloud provider), cached sentence by sentence in your vault, and shown on top of your text. Search, backlinks, sync and other tools keep seeing exactly what you wrote.
Schein → course credit applies to Scheinkriterien, Scheinen and every other sentence that contains the term, per note, folder, frontmatter property, tag or the whole vault. Let the model list the terms it was unsure about and settle them in one dialog. See The glossary.The command Open user guide (also a button at the top of the settings) opens a guide inside Obsidian: setup, switching languages, editing, the glossary, file names, storage, mobile, privacy and troubleshooting, in English or German to match Obsidian's language. The same text is in docs/guide.en.md and docs/guide.de.md.

| You do | What happens |
|---|---|
| Type between sentences, at the end of a block or on a new line | Text goes straight into the file, in the language you type. |
| Click into a translated sentence, or start typing over one | An inline editor opens; nothing is written yet. |
| Enter, or click elsewhere | Your edited text replaces the original sentence on disk. |
| Ctrl/Cmd+Shift+Enter | Switches to Original and puts the cursor in that sentence. |
| Esc | Cancels. The file is untouched. |
| Delete a translated sentence | Deleted without a dialog; a notice offers Undo. |
Replaced and deleted originals are also kept in a short history, so Restore replaced original… works even after the undo history is gone. "Click elsewhere applies", "Ask before deleting" and the default choice can be changed in the settings.
Once the plugin is listed in the community directory: Settings → Community plugins → Browse, search for "Transparent Translate", then Install and Enable.
main.js, manifest.json and styles.css from the latest release.<your vault>/.obsidian/plugins/transparent-translate/.Requires Obsidian 1.11.4 or later (the API key is kept in Obsidian's secret storage, which arrived in that version).
Then open a note and select the language button in the note header (or the OG · EN · DE item in the status bar), or run Show English / Show German from the command palette. Nothing is translated until you switch a note.
| Provider preset | Base URL |
|---|---|
| LM Studio (local) | http://localhost:1234/v1 |
| OpenAI | https://api.openai.com/v1 |
| OpenRouter | https://openrouter.ai/api/v1 |
| Meta Model API | https://api.meta.ai/v1 |
| Custom | any OpenAI-compatible /v1 root |
[!TIP] Reasoning models bill their reasoning as output tokens. If your provider supports it, add
{"reasoning_effort": "low"}under Extra request parameters: translation does not need deep reasoning.
No command has a default hotkey; bind your own under Settings → Hotkeys.
| Command | |
|---|---|
| Show original / Show English / Show German | Set the display language of the current note. |
| Cycle display language | Original → English → German. |
| Show file and folder names in original / English / German | Sets the language of names in the explorer, tabs and titles. Off by default. |
| Open user guide | Opens the guide inside Obsidian. |
| Fix the translation of a sentence… | Pick a translated sentence and correct a term (also available from the right-click menu of a translated sentence). |
| Review terms in this note… | Asks the model which terms were a judgment call and lets you settle them. |
| Manage translation glossary | List, add, edit and delete glossary entries and the subject area of a scope. |
| Update translations affected by glossary changes | Translates again the sentences of this note whose glossary entries changed (automatic by default). |
| Re-translate this note | Drops this note's cached translations and requests them again. |
| Translate folder… | Counts what is missing, shows a token and cost estimate, and asks before starting. |
| Copy original text | Copies the selection (or the note) as it is on disk. Normal copy copies what you see. |
| Restore replaced original… | Puts back a sentence that an edit replaced or deleted. |
| Clear translation cache for this note / Clear the entire translation cache | Removes cached translations. |
| Prune unused translations | Removes cached sentences that no longer appear in their notes. |
[!IMPORTANT] Note text is sent to the endpoint you configure. When a note is switched to English or German (or a folder is bulk-translated), the text of its sentences, the note title and your glossary are sent to that endpoint for translation. With File and folder names turned on, the names that are visible in the explorer, tabs and titles (without extension) and the folder they are in are sent as well. Glossary entries, subject areas and meanings are sent only together with the sentences they match. Links, code, math, tags and other protected syntax are replaced by placeholders before sending. Frontmatter and code blocks are never sent.
data.json only holds the secret's name.Translations live in a visible folder, _Translations/ by default, one .md file per translated note at the same relative path:
_Translations/Informatik/Lektion 1.md
These files are plain JSON behind a one-line "generated, do not edit" warning. They are regular Markdown files on purpose: Obsidian Sync only syncs visible folders and, by default, only notes and media, so this is what lets your phone show translations made on your desktop. Translations are stored with placeholders instead of links and tags, so cache files never add backlinks, tags or graph edges.
FROM -"_Translations"._Translations/ as generated output, not as your notes._Translations/_names.md, keyed by the name (so renaming or moving a note needs no migration).Models pick plausible but wrong words for domain terms (a German Schein is not a certificate, LP are ECTS credits). The glossary lets you settle a term once.
course: SYS), a tag, a folder, or the whole vault. The most specific entry wins, so the same word can mean different things in different subjects. The dialog suggests the folder of the note.Schein also matches inside Scheinkriterien and Scheinen; short terms like LP match only as whole words. A longer entry overrides a shorter one inside it.Translation glossary.md by default. It is a visible note like the cache, so it syncs and can be reviewed, but it lives outside the cache folder, so clearing the cache never deletes what you taught the plugin. It is never translated.On Obsidian mobile the plugin is view-only: switch between Original, English and German and read translations that already exist in the synced cache. Sentences without a cached translation are shown in the original language with a dotted underline. No requests are made, no key is needed, and editing works as usual in Original mode.
Intl.Segmenter plus an abbreviation list (configurable). Unusual punctuation can split or join sentences differently than you would.flowchart LR
A[Note on disk] --> B[Split into blocks and sentences]
B --> C[Protect links, code, math, tags]
C --> D{In cache or already in the target language?}
D -- yes --> F[Render over the note]
D -- no --> E[LLM: numbered sentences in, numbered translations out]
E --> G[Validate count and placeholders]
G --> H[_Translations cache]
H --> F
Each sentence is keyed by a SHA-256 of its normalised text. The model returns one <<n>> {de} … line per sentence (or JSON in JSON mode): the number keeps sentences aligned, and the tag reports the sentence's language so the other direction never needs a request.
npm install
npm run dev # watch build; set OBSIDIAN_PLUGIN_DIR to copy each build into a vault's plugin folder
npm run check # typecheck, lint, guideline check, unit tests
npm run test:e2e # end-to-end tests in a sandboxed Obsidian (minAppVersion, latest, mobile emulation)
npm run test:live # optional: real endpoint from .llm_connection_details.json (git-ignored)
npm run screenshots # regenerate the README screenshots
npm run demo # record the demo GIF (needs ffmpeg), see docs/showcase.md
See CONTRIBUTING.md for the project layout, the test setup and the release process.
Transparent Translate is free and open source. If it saves you time, you can buy me a coffee. Thank you!
Built on the official Obsidian sample plugin template and API. End-to-end tests use wdio-obsidian-service. No third-party code is bundled into the plugin. The website's background music was made with Strudel.
MIT © Jay Leimer