Maggiora Duccio71 downloadsTranslate a selection or a whole note with any OpenAI-compatible LLM. The translation opens in a side panel for review, so the note only changes when you insert it. YAML front-matter is left intact.
An Obsidian plugin that translates a selection or a whole note with any OpenAI-compatible LLM, and shows the result in a side panel so you can read it against the original before it touches your note.
Desktop only —
isDesktopOnly: true. Mobile has not been tested.
You clip an English article or a YouTube transcript into Obsidian and want to read it in your own language, without leaving the editor.
Most translation plugins overwrite your note with the result. That leaves you with no way to check the translation against the source, and nothing to go back to if it is wrong. TranslateNote sends the translation to a side panel instead: you read it next to the original, edit it if you want, and the note changes only when you press Insert.
Italian, Japanese, Brazilian Portuguese; the model does the rest.{{targetLanguage}} placeholder and a one-click restore.The plugin is not yet listed in the Obsidian Community Plugin directory. To install it manually:
main.js, manifest.json and styles.css from the latest release.<your-vault>/.obsidian/plugins/translate-note/.Under Translation you set the target language (any language name) and, if you want, edit the system prompt.
| Provider | Sign up | Pre-filled model |
|---|---|---|
| DeepSeek | platform.deepseek.com | deepseek-chat |
| OpenAI | platform.openai.com | gpt-5.4-mini |
| Gemini | aistudio.google.com | gemini-3.5-flash-lite |
| Kimi (Moonshot) | platform.moonshot.ai | kimi-k2.6 |
| Qwen | Alibaba Cloud Model Studio | qwen-turbo |
| Z.AI (GLM) | z.ai | glm-4.7-flash |
| OpenRouter | openrouter.ai | (set manually) |
| Custom | any OpenAI-compatible endpoint | (set manually) |
Model names move fast. If a pre-filled model has been retired, the plugin tells you so — change the Model name field to a current one from your provider's model list.
| Command | What it does |
|---|---|
| Translate selection | Translates the selected text into the panel |
| Translate full note (preserve front-matter) | Translates the note body into the panel |
| Switch API provider | Picks the active provider from a list |
All three are also in the editor's right-click menu, and can be bound to hotkeys under Settings → Hotkeys.
The translation appears in the right sidebar. From there:
This is what the model is told by default:
You are a professional translation engine. Translate the following content into {{targetLanguage}}.
Rules:
- Preserve the paragraph structure and Markdown formatting of the source
- The first time a proper noun or technical term appears, keep it in the source language and put the translation in parentheses right after it
- Do not add explanations, summaries or comments; output the translation only
- Preserve the tone and register of the source
- Leave numbers, URLs and code snippets untouched
{{targetLanguage}} is replaced by the Target language setting. Edit the prompt to suit your material — a glossary line, a register instruction, a rule about how to handle quotations — and use Restore default prompt to go back.
Does it modify my note while translating? No. The translation goes to the panel. The note changes only when you press Insert.
What if I edit the note while a translation is open in the panel? The insert is refused, with a notice explaining why. Copy the text out of the panel, or run the translation again.
Is the front-matter translated?
No. For a full note, only the body after the closing --- is sent to the model, and the front-matter is preserved on insert.
Which languages can I translate into?
Any language the model supports. Target language is a free-text field, so it works in every direction — set it to English to go the other way.
Where are my API keys stored?
Unencrypted, in data.json inside the plugin folder of your vault. This is how Obsidian plugins store settings. Keep it in mind if your vault is synced or shared.
Can I use a local model?
Yes. Pick Custom and point the base URL at your endpoint — for example http://localhost:11434/v1 for Ollama.
What happens with very long notes? Over 20,000 characters you get a confirmation first. The request is sent in one go, so a long note means a large single request: worth knowing if your plan has tight limits.
Does it work on mobile?
Untested. The manifest says isDesktopOnly: true.
TranslateNote is a fork of LLM Translate by 陈与小金, which is itself derived from obsidian-llm-shortcut by chernodub — the OpenAI-compatible request adapter and the loading indicator come from that lineage.
This fork exists because the original is a Chinese-only plugin: its interface, its error messages and its default prompt were all in Chinese, which put a good translator out of reach for anyone who does not read it. What changed here: the whole plugin is in English, the provider presets point at globally reachable endpoints, and translations go through a review panel instead of overwriting the note.