进行了大量的修改。如果有使用旧版本的,需要更新配置文件。
主要:
- 优化了多段多引擎多语种翻译
- 更新了大量的解析器
- 增加了 ChatGPT 支持
- 增加了代理配置等等等
详情见 https://github.com/lorniu/go-translate
附几张粗略的截图:
单词翻译:
按照段落翻译:
同时使用多引擎翻译成多语言:
灵活的渲染方式。比如基于 Overlay 进行展示:
下一步计划:
- 基于此框架实现一个完整的 ChatGPT 客户端 (chat分支)
进行了大量的修改。如果有使用旧版本的,需要更新配置文件。
主要:
详情见 https://github.com/lorniu/go-translate
附几张粗略的截图:
单词翻译:
按照段落翻译:
同时使用多引擎翻译成多语言:
灵活的渲染方式。比如基于 Overlay 进行展示:
下一步计划:
之前一直断断续续用着来着,奈何总是不知道什么时候出问题就翻译不了了,然后删了就没再用过了
目前用的最稳的 fanyi
试了下,有几个问题
应该是因为 Emacs 内置的 url.el 太拉了。现在的版本支持通过 curl 发送请求,体验完全不一样。
设置的格式如下,谢谢指正:
有道翻译不支持分段翻译,就是不能一次翻译多个段落。默认你的文本有多个段落的话,是要尝试分段翻译的。当然可以通过 (setq gt-taker-pick nil)
等方式关闭掉,具体请看 README。
如果自定义过 gt-chatgpt-host,那 authinfo 需要对应的修改吗
把 api.openai.com
改成对应的 host (不要带 https) 即可。
非常好用,分享一下我的配置
;;; 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-map
和 C-h f gt-delete-render-overlays
.
GPT支持可以试试集成:GitHub - ahyatt/llm: A package abstracting llm capabilities for emacs. 这个包,各种gpt(chatGPT ollama等)都抽象了个统一接口
感觉抽象得不够好,请求、输出等太耦合。不过很好的项目,学习了。
写的真好,我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))
没啥本质区别。
非常好用, 因为我日常使用 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 的实现方式