go-translate 更新到 v3

进行了大量的修改。如果有使用旧版本的,需要更新配置文件。

主要:

  • 优化了多段多引擎多语种翻译
  • 更新了大量的解析器
  • 增加了 ChatGPT 支持
  • 增加了代理配置等等等

详情见 https://github.com/lorniu/go-translate

附几张粗略的截图:

单词翻译:

按照段落翻译:

同时使用多引擎翻译成多语言:

灵活的渲染方式。比如基于 Overlay 进行展示:

下一步计划:

  • 基于此框架实现一个完整的 ChatGPT 客户端 (chat分支)
5 个赞

之前一直断断续续用着来着,奈何总是不知道什么时候出问题就翻译不了了,然后删了就没再用过了

目前用的最稳的 fanyi

试了下,有几个问题

  1. 文档中 openai 描述前面应该是少了个 machine
  2. 我在 authinfo 中添加了 deepl 和 openai 的 key 但是会报错没有设置 key
  3. youdao 翻译的时候说不支持段落翻译,这个是预期的行为吗

应该是因为 Emacs 内置的 url.el 太拉了。现在的版本支持通过 curl 发送请求,体验完全不一样。

设置的格式如下,谢谢指正:

有道翻译不支持分段翻译,就是不能一次翻译多个段落。默认你的文本有多个段落的话,是要尝试分段翻译的。当然可以通过 (setq gt-taker-pick nil) 等方式关闭掉,具体请看 README。

如果自定义过 gt-chatgpt-host,那 authinfo 需要对应的修改吗

api.openai.com 改成对应的 host (不要带 https) 即可。

2 个赞

非常好用,分享一下我的配置

;;; go-translate
;;
;; Write to ~/.authinfo
;; machine api.deepl.com login auth-key password ****
;; machine api.openai.com login apikey password ****
(install-package 'go-translate)

(setq gt-langs '(en zh)
      gt-chatgpt-model "gpt-3.5-turbo-16k")

(with-eval-after-load 'go-translate
  (setq my/gt-engine
        (append (when (auth-source-search :host "api.openai-sb.com" :user "apikey")
                  (setq gt-chatgpt-host "https://api.openai-sb.com")
                  (list (gt-chatgpt-engine)))
                (when (auth-source-search :host "api.deepl.com" :user "auth-key")
                  (list (gt-deepl-engine)))
                (list (gt-google-engine) (gt-bing-engine))))
  ;; NOTE youdao 不支持分段翻译
  (setq gt-default-translator (gt-translator :engines my/gt-engine :render  (gt-buffer-render))))

(defun my/gt-immersive-translate ()
  "Overlay render gt-do-translate.
Default to translate buffer, or select region."
  (interactive)
  (require 'go-translate)
  (gt-start (gt-translator
             :taker (gt-taker :text 'buffer)
             :engines (car my/gt-engine)
             :render (gt-overlay-render))))

(add-hook 'gt-buffer-render-init-hook #'visual-fill-column-mode)


;;; fanyi
(install-package 'fanyi)

(defun my/translate ()
  (interactive)
  (if (use-region-p)
      (gt-do-translate)
    (fanyi-dwim2)))
(keymap-global-set "C-c y" #'my/translate)

(defun my/context-translate (menu click)
  "My context MENU to translate text."
  (define-key-after menu [dictionary-lookup]
    '(menu-item "Translate" my/translate))
  menu)
(add-hook 'context-menu-functions #'my/context-translate)

v3 版本的功能太强大了。很喜欢多引擎切掉的功能,不同的组合应于在不同的应用场景。

@lorniu 关于 gt-overlay-render, 请问下要取消显示的 overlay 是怎么操作?

我现在是要删除原文的最后一个字符,overlay才会消失。

命令 gt-delete-render-overlays, 默认绑定到了鼠标左键,即点击源文本 overlay 就被删除。

详情见 M-x describe-keymap gt-overlay-render-mapC-h f gt-delete-render-overlays.

1 个赞

GPT支持可以试试集成:GitHub - ahyatt/llm: A package abstracting llm capabilities for emacs. 这个包,各种gpt(chatGPT ollama等)都抽象了个统一接口

感觉抽象得不够好,请求、输出等太耦合。不过很好的项目,学习了。

:sweat_smile: 写的真好,我elisp看的少,第一次见到在elisp里用面向对象的,很棒,之前都不知道还有这个特性,我以为都是面条代码

V3里如何快捷的转换翻译语言,比如之前,从en到cn,想反过来从cn到en,只要M-n就可以了。V3里边有类似的操作吗?

(gt-taker :langs '(en zh) :text 'word :pick 'paragraph :prompt t)

确实class在elisp中用得少,看着挺清晰,就是不知道怎么advice,好多hack没法用了。

原来是自动识别

go-translate 是不是停止更新到melpa了?编译出问题了吗?

感觉 melpa 最近更新一直很慢,咱也不懂,等等看吧

给函数增加 around 是这样的:

(defun aaa (x y) (message "i am function aaa"))
(advice-add #'aaa :around (lambda (fn &rest args) (apply fn args)))

给方法添加 around 是这样的:

(cl-defmethod bbb (x y) (message "i am method bbb"))
(cl-defmethod bbb :around (x y) (cl-call-next-method x y))

没啥本质区别。

1 个赞

非常好用, 因为我日常使用 evil, 打开 gt-buffer 之后顺手就关闭了, 增强了一下


  (defun my/goto-gt-result-buffer (&rest _args)
    "Switch to the *gt-result* buffer after translation without changing the window layout."
    (when-let ((buf (get-buffer "*gt-result*")))
      (pop-to-buffer buf '(display-buffer-reuse-window (inhibit-same-window . nil)))))
  (advice-add 'gt-do-translate :after #'my/goto-gt-result-buffer)
  
  (add-hook 'gt-buffer-render-output-hook (lambda () (define-key evil-normal-state-local-map (kbd "q") 'kill-buffer-and-window)))

是否有更好的native 的实现方式