EN

DeepL-gestützte Übersetzungen in Neovim

Dokumentationen, Artikel und Blogs stehen häufig in verschiedenen Sprachen zur Verfügung. Bei der Übertragung von Texten können maschinelle Übersetzungen dabei helfen, schnell zu ersten Entwürfen zu gelangen.

Die Ergebnisse von Online-Diensten wie DeepL oder Google Translate sind nicht perfekt; auf ihre Hilfe zurückzugreifen ist aber häufig effektiver als die Übersetzung gänzlich per Hand vorzunehmen. Mit translate.nvim können sie in Neovim integriert werden.

DeepL

Das genannte Plugin greift standardmäßig auf Google Translate zurück, unterstützt jedoch auch das in Benchmarks besser bewertete DeepL. Zusätzlich kann Translate Shell eingebunden werden, das eine Schnittstelle zu vielen weiteren Diensten bietet.

Für DeepL wird ein API-Key benötigt, weshalb eine Registrierung erforderlich ist. Nach der Anmeldung können registrierte Nutzer oben auf die Initialen ihres Namens und dann auf Konto klicken. Unter dem Tab API-Schlüssel wird der Schlüssel erstellt, der in der Plugin-Konfiguration benötigt werden wird.

Nutzer der kostenfreien Version können auf alle Funktionen zugreifen und bis zu 500.000 Zeichen pro Monat übersetzen. Für die meisten Zwecke dürfte das mehr als ausreichen. DeepL Write ist noch nicht Teil der API, weshalb LSP-gestützte Style-Diagnosen zum gegenwärtigen Zeitpunkt leider noch nicht möglich sind.

Konfiguration

Wie üblich kann translate.nvim bequem über einen Plugin-Manager installiert werden. Hier exemplarisch die Konfiguration für lazy.nvim:

  {
    "uga-rosa/translate.nvim",
    lazy = true,
  },

Die bereitgestellten Übersetzungen können auf verschiedene Weisen ausgegeben werden, etwa in einem Popup-Fenster, in einem neuen Split oder im Buffer neben der zu übersetzenden Zeile. Wir wollen das Plugin so nutzen, dass der Input-Text im Buffer durch die Übersetzung ersetzt wird. Dazu wird "replace" als Output gesetzt.

Der benötigte API-Key muss global in der deepl_api_auth_key-Variable gespeichert werden. Der Schlüssel sollte nicht direkt in die Konfiguration eingetragen werden, natürlich vor allem dann nicht, wenn man seine Dotfiles in einem öffentlichen Repository ablegt. Stattdessen können wir ihn in einer separaten Datei speichern und von dort auslesen.

Die überschaubare Konfiguration kann etwa unter after/plugins/translate.lua gespeichert werden:

local filepath_to_authkey = vim.fn.expand("~/.secrets/deepl")
vim.g.deepl_api_auth_key = vim.fn.readfile(filepath_to_authkey)[1]

require("translate").setup({
  default = {
    command = "deepl_free",
    output = "replace",
  },
})

Verwendung

Für Übersetzungen stellt das Plugin einen Befehl mit folgender Synopsis bereit:

:[range]Translate {target-lang} [{-options}...]

Mit der obigen Konfiguration wird standardmäßig die aktuelle Zeile durch die zurückgegebene Übersetzung ersetzt. :Translate en würde demnach die englische Übersetzung der markierten Zeile in den Buffer einfügen. Die Ausgangssprache wird dabei automatisch erkannt.

Neben dem zeilenbasierten Aufruf kann auch beliebiger Text markiert und übersetzt werden. Der erforderliche Bereich (range) wird automatisch eingefügt, wenn vom visuellen Modus zum Kommandozeilen-Modus gewechselt wird: man sollte sich also nicht vom vorangestellten '<,'> verunsichern lassen. Dabei können mehrere Zeilen oder einzelne Teile einer Zeile markiert und übersetzt werden.

Für eine bequemere Handhabung und für Textobjekt-basierte Übersetzungen können Tastenbelegungen definiert werden:

vim.keymap.set("n", "tee", ":Translate EN<CR>", { desc = 'Translate line into English', noremap = true, silent = true })
vim.keymap.set("v", "tee", ":'<,'>Translate EN<CR>", { desc = 'Translate selection into English', noremap = true, silent = true })
vim.keymap.set("n", "tce", ":Translate EN -comment<CR>", { desc = 'Translate comments into English', noremap = true, silent = true })
vim.keymap.set("n", "tw", "viw:Translate EN<CR>", { desc = 'Translate word into English', noremap = true, silent = true })

Artikel vom 26. November 2024.