- π€ Translate selected text or word under cursor
- πͺ Multiple display modes (float, picker)
- π Auto-detect installed picker
- π Copy translation to clipboard with
y - β‘ Async translation (non-blocking)
| Picker | Status |
|---|---|
| Native float | β |
| snacks.nvim | β |
| telescope.nvim | β |
| fzf-lua | β |
| mini.pick | β |
- Neovim >= 0.9.0
curl
Optional (for picker display):
- snacks.nvim, telescope.nvim, fzf-lua, or mini.pick
{
"acidsugarx/babel.nvim",
version = "*", -- recomended for the latest tag, not main
opts = {
target = "ru", -- target language
},
keys = {
{ "<leader>tr", mode = "v", desc = "Translate selection" },
{ "<leader>tw", desc = "Translate word" },
},
}require("babel").setup({
target = "ru",
})Default Configuration
require("babel").setup({
source = "auto", -- source language (auto-detect)
target = "ru", -- target language
provider = "google", -- translation provider: "google", "deepl"
display = "float", -- "float" or "picker"
picker = "auto", -- "auto", "telescope", "fzf", "snacks", "mini"
float = {
border = "rounded",
max_width = 80,
max_height = 20,
},
keymaps = {
translate = "<leader>tr",
translate_word = "<leader>tw",
},
-- DeepL provider settings (optional)
deepl = {
api_key = nil, -- or use DEEPL_API_KEY env variable
pro = nil, -- nil = auto-detect, true = Pro, false = Free
formality = "default", -- "default", "more", "less", "prefer_more", "prefer_less"
},
})| Option | Type | Default | Description |
|---|---|---|---|
source |
string | "auto" |
Source language (auto-detect) |
target |
string | "ru" |
Target language code |
provider |
string | "google" |
Translation provider: "google", "deepl" |
display |
string | "float" |
Display mode: "float" or "picker" |
picker |
string | "auto" |
Picker: "auto", "telescope", "fzf", "snacks", "mini" |
deepl.api_key |
string | nil |
DeepL API key (or use DEEPL_API_KEY env) |
deepl.pro |
boolean | nil |
Force Pro/Free endpoint (nil = auto-detect by key) |
deepl.formality |
string | "default" |
Formality: "default", "more", "less", "prefer_more", "prefer_less" |
Common language codes
| Code | Language |
|---|---|
en |
English |
ru |
Russian |
de |
German |
fr |
French |
es |
Spanish |
it |
Italian |
pt |
Portuguese |
zh |
Chinese |
ja |
Japanese |
ko |
Korean |
ar |
Arabic |
hi |
Hindi |
tr |
Turkish |
pl |
Polish |
uk |
Ukrainian |
| Keymap | Mode | Description |
|---|---|---|
<leader>tr |
Visual | Translate selection |
<leader>tw |
Normal | Translate word under cursor |
| Command | Description |
|---|---|
:Babel [text] |
Translate provided text |
:BabelWord |
Translate word under cursor |
| Key | Action |
|---|---|
q / <Esc> / <CR> |
Close window |
y |
Copy translation to clipboard |
j / k |
Scroll |
| Provider | Status | API Key | Notes |
|---|---|---|---|
| Google Translate | β | No | Default, unofficial API |
| DeepL | π§ͺ | Yes (free tier) | Best quality, 500k chars/month free |
| LibreTranslate | π | No | Open source, self-hostable |
| Yandex | π | Yes | Great for Russian |
| Lingva | π | No | Google proxy, no rate limits |
π§ͺ Testing: DeepL provider is implemented but needs testing. If you have a DeepL API key and want to help test, please open an issue with your feedback!
DeepL Setup
-
Get a free API key at deepl.com/pro#developer (500k chars/month free)
-
Set up the API key (choose one):
Option A: Environment variable
export DEEPL_API_KEY="your-api-key-here"
Option B: In config
require("babel").setup({ provider = "deepl", deepl = { api_key = "your-api-key-here", }, })
-
The endpoint (Free/Pro) is auto-detected from the key suffix (
:fx= Free). You can override withdeepl.pro = true/false. -
If no API key is found, babel.nvim will automatically fall back to Google Translate with a warning.
Contributions are welcome! Feel free to:
- π Report bugs
- π‘ Suggest features
- π§ Submit pull requests
Thanks to the amazing Neovim plugin ecosystem:
- folke for snacks.nvim and lazy.nvim
- nvim-telescope for telescope.nvim
- ibhagwan for fzf-lua
- echasnovski for mini.nvim
MIT Β© Ilya Gilev