はっくはっくキッチン
Hack Hack Kitchen

gptel-translate.el: Translation support for gptel

 2026/02/01

gptel-translate.elgptel での翻訳をサポートするためパッケージです。 LLM(大規模言語モデル)に「翻訳したいテキスト」と「入力/出力言語」を渡し、翻訳結果を取得します。

  • gptel が扱う任意の LLM(OpenAI, Gemini, Ollama 等)をそのまま利用できます。

  • モデルに応じてプロンプトを自動調整します。

  • 翻訳のソース言語とターゲット言語は、ミニバッファ補完機能を使用していつでも変更できます。

注意

このパッケージは alpha バージョンであり、大きな変更が入る可能性があります。

インストールと設定

  1. パッケージの取得

    git clone https://github.com/TPKato/gptel-translate.git ~/.emacs.d/site-lisp/gptel-translate
  2. パッケージのロード & カスタマイズ

    ここでは use-package を利用している場合の例を記載します。

    (use-package gptel-translate
      :load-path "site-lisp/gptel-translate"
    
      :config
      ;; 必要であれば gptel 用の設定 (モデルの追加)
      ;; ここで設定することもできますが、(use-package gptel ...) で追加することを推奨します
      (gptel-make-openai "ollama"
        :host "localhost:11434"
        :protocol "http"
        :endpoint "/v1/chat/completions"
        :stream t
        :models '(translategemma:4b mitmul/plamo-2-translate:latest))
    
      :custom
      ;; デフォルト言語 (バッファに設定がない場合に問い合わせのデフォルトとして使用)
      (gptel-translate-default-lang-from "Japanese")
      (gptel-translate-default-lang-to   "English")
    
      :bind            ; optional
      (("C-c t" . gptel-translate-mode)))

使い方 (例)

  1. gptel でのモデルの選択

    まず gptel を起動し、翻訳したい LLM モデルを選択します。

    M-x gptel-menu RET -m  ;; モデル選択
    M-x gptel              ;; gptel の対話モードを起動
  2. gptel-translate-mode の有効化

    M-x gptel-translate-mode

    あるいは、 use-package でバインドしたキー (C-c t など) を押します。

  3. テキストを送信

    1. 翻訳したいテキストを gptel の入力領域に入力します。

    2. M-x gptel-send (C-c C-m)。 この際、入力/出力言語が未設定の場合はミニバッファーで聞かれるので、入力します。

    3. C-u M-x gptel-send (C-u C-c C-m) とすると、言語ペアを対話で 再設定します。入力言語として rev を入力すると、現在の入力/出力言語を入れ替えます。

コマンド

gptel-translate-mode

翻訳モードのオン/オフ

gptel-translate-change-languages

言語ペアを対話で設定します。from 入力時に rev を指定すると、入力/出力言語を入れ替えます。

gptel-translate-swap-languages

現在設定されている入力/出力言語を入れ替えます。

gptel-send の動作

gptel-translate-mode がアクティブな場合、 gptel-send は以下のように動作します。

M-x gptel-send

プロンプトを LLM に送信します。

C-u M-x gptel-send

送信前に翻訳言語をユーザーに問い合わせます。

C-u C-u M-x gptel-send

オリジナルの C-u M-x gptel-send と同じ、 つまり gptel-menu を起動します。

翻訳モデルグループの設定

gptel-translate.el では翻訳モデルグループを定義して、情報を管理しています。 翻訳モデルグループは、

  • 識別子

  • LLMモデル

  • 翻訳言語

  • プロンプト変換関数

で構成されています。

デフォルトの翻訳モデルグループ

デフォルトで以下の翻訳モデルグループが登録されています (言語は省略)。 詳細はソースコードを参照して下さい。

"translategemma"
 :models    '(translategemma:4b translategemma:12b)
 :languages '( ... )
 :transform #'gptel-translate--transform-translategemma
"plamo-translate"
 :models    '(plamo-2-translate mmnga/plamo-2-translate-gguf mitmul/plamo-2-translate)
 :languages '( ... )
 :transform #'gptel-translate--transform-plamo

また、フォールバックとして以下が定義されています。 現在のモデルが含まれる翻訳モデルグループがない場合にはこれが使用されます。

gptel-translate-generic-group-name
 :languages '( ... )
 :transform #'gptel-translate--transform-generic

翻訳モデルグループの追加

gptel-translate.el では下記のように自作グループを定義できます。 すでに同名のグループがある場合は上書きされます。

(defun gptel-translate--transform-mymodel (srclang dstlang)
  ;; ここに必要な処理 (プロンプトの変更) を記述
  ;;
  ;; https://gptel.org/manual.html#orgbd9b14b 参照
  ;; (9. Configuration > 9.1. The anatomy of gptel-send)
  )

(gptel-translate-make-model-group
 "my-model-group"               ; ユニークなモデルグループ名
 :models    '(model-1 model-2)
 :languages '("Japanese" "German" "English" "French")
 :transform #'gptel-translate--transform-mymodel)
識別子 (文字列)

第1引数としてモデルグループ名 (識別子) を指定します。ユニークであれば何でも構いません

:models (シンボルのリスト)

使用したい LLM モデルのリスト

:languages (文字列のリスト)

入出力言語を入力する際の補完候補 (モデルがサポートする全ての言語を列挙する必要はありません)

:transform (文字列のリスト)

プロンプトを変換する関数

翻訳モデルグループの一部更新

定義済みのモデルグループの一部を変更したい場合は、 gptel-translate-update-model-group を使用します。

(gptel-translate-update-model-group
 "my-group"
 :languages '("Japanese" "English")
 :models '(model-1 model-2))

このようにすると、モデルグループ my-group:languages:models を更新 (上書き) しますが :transform は変更しません。

もし、フォールバック時のモデルグループの言語を変更したければ、

(gptel-translate-update-model-group
 gptel-translate-generic-group-name
 :languages '("English" "German"))

のようにできます。

技術的背景(内部構造)

gptel-translate.el が読み込まれると、以下が行われます

  • gptel-send に advice gptel-translate--advice-gptel-send を付与。 これにより、プレフィックス (C-u) の動作を変更しています。

  • gptel-prompt-transform-functions フックに gptel-translate--prompt-transform を追加

gptel-translate-mode が non-nil のときに gptel-send が実行されると、 gptel-prompt-transform-functions フック経由で gptel-translate--prompt-transform が実行されます。 この関数は、定義された翻訳モデルグループから現在のモデルに対応する関数 を取得し、実行します。これにより、送信前に LLM 用のプロンプトを現在の モデルに応じて修正します。

gptel-translate-mode が nil の場合は gptel-translate--advice-gptel-send 及び gptel-translate--prompt-transform はいずれも gptel-send の動作に 影響を与えません。

動作確認環境

  • GNU Emacs 30.2 + gptel 0.9.9.3 on Arch Linux

  • LM Studio 0.3.37 on Windows 11

    • mmnga/plamo-2-translate-gguf

  • Ollama 0.14.0 on Windows 11

    • mitmul/plamo-2-translate:latest

    • translategemma:4b

ライセンス

  • GPL-3.0