go-translate 更新到 v3

;; pop-to-buffer
(setq gt-buffer-render-follow-p t)

;; window config
(setq gt-buffer-prompt-window-config
      '(display-buffer-reuse-window (inhibit-same-window . nil)))

在 evil 中,默认情况下使用 , 作为前缀触发快捷键。比如 , q 表示关闭。 当前,你那样绑定也没问题,但最好在 gt-buffer-render-init-hook 中绑定。

1 个赞

Add support for LibreTranslate.

2 个赞

有感于 【讨论】一种提升英文阅读体验的可能性, 增加了透析翻译的基本实现:

道友好,添加 Libre translate 后,翻译结果显示 http 400(如下图所示)

image

配置文件如下:

  (use-package go-translate
    :config
    (setq gt-langs '(en zh))
    (setq gt-default-translator
          (gt-translator
           :taker   (gt-taker :text 'buffer :pick 'paragraph)       ; 配置拾取器
           :engines (list
                     (gt-bing-engine)
                     (gt-youdao-dict-engine)
                     (gt-libre-engine))                             ;指定多引擎
           :render  (gt-buffer-render)))                            ; 配置渲染器
    )

LibreTranslate 可以使用官方服务,也可以使用第三方或本地服务。

官方服务需要购买 token,所以我就随便设置了一个第三方(https://translate.disroot.org/)。在我这里,它能正常使用,你的上述配置不会报错。

对于你的出错,应该跟 disroot.org 有关。因此建议你搜索并使用你那里可用的 LibreTranslate 服务。比如:

配置 host:

  (setq gt-libre-host "https://translate.terraprint.co/")

或指定 host:

  ... 
  :engines
  (gt-libre-engine :host "https://translate.terraprint.co/")
  ...

增加新接口,简化适用于多场景的翻译器的配置。

现在 :taker/engines/render 都可以是列表。对于 engines,使用所有可用的;对于 taker/render,使用第一个可用的。根据 :if 值进行可用性判定。

示例:

;; 对于选中的文本,不分段,并使用 posframe 渲染
;; 对于 Info,翻译当前段落,使用 overlay 显示结果
;; 对于只读文本,翻译整个 buffer 中的生词,并使用 overlay 渲染
;; 对于 Magit commit buffer,将翻译结果插入到光标位置
;; 对于单词,使用 google 引擎翻译; 其他使用 deepl 引擎
(setq gt-default-translator
      (gt-translator
       :taker   (list (gt-taker :pick nil :if 'selection)
                      (gt-taker :text 'paragraph :if '(Info-mode help-mode))
                      (gt-taker :text 'buffer :pick 'fresh-word :if 'read-only)
                      (gt-taker :text 'word))
       :engines (list (gt-google-engine :if 'word)
                      (gt-deepl-engine :if 'no-word))
       :render  (list (gt-posframe-pop-render :if 'selection)
                      (gt-overlay-render :if 'read-only)
                      (gt-insert-render :if (lambda (translator) (member (buffer-name) '("COMMIT_EDITMSG"))))
                      (gt-alert-render :if '(and xxx-mode (or not-selection (and read-only parts))))
                      (gt-buffer-render))))

3 个赞

这个好评,原来我是设置了 3 个 gt-preset-translators 的,现在只需要设置一个,不用频繁切换了。

有个体验上的小问题。gt-overlay-render 翻译之后光标在overlay 之后,导致 直接执行 M-x:gt-delete-render-overlays 无效, 能否让光标一直在原文区域。 我想实现的效果是翻译之后 C-g 可以马上delete overlay

  (defun vmacs-gt-delete-render-overlays()
    (call-interactively #'gt-delete-render-overlays))
  (advice-add 'keyboard-quit :before #'vmacs-gt-delete-render-overlays))

要是go-translate 能和 fanyi 结合就好了 :grinning:

目前两个都用, :joy:

我也是,zsbd

为啥这么说,我两个都没用过,正在纠结😂

各有优缺点啊,go-translate 灵活,可自己定制扩展,用child frame,overlay,buffer等展示;fanyi只能在buffer展示,但是翻译源多,还带语音等信息,翻译很全。可以 自己试试。

你说的很有道理。

不需要使用 advice,直接绑定按键到 gt-overlay-render-map 即可:

(define-key gt-overlay-render-map 
            (kbd "C-g") #'gt-delete-render-overlays)

请测试。

1 个赞

还带语音等信息

在我看来,命令 gt-do-speak 很好用,可以通过 C-nC-p 切换不同语音引擎。

http 400

可能是同样的原因: overlay render not working in devdocs buffers · Issue #78 · lorniu/go-translate · GitHub

思路不一样吧,fanyi用的是在线语音,显示比较直观。

这个issue是我提的 :joy:

fanyi用的是在线语音

也是在线的。在 buffer-render 中,直接按 y 或选中文本按 y 实现用当前 engine 提供的 tts 服务进行在线播报。

也可以在任意地方调用命令 gt-do-speak 并选择服务进行播报。

我自己用起来挺顺的。

显示比较只管

我有时会在终端下使用,所以更偏向使用快捷键,那样更简洁。当然,也确实不够直观

请问这个错误怎么解呢?mpv 已经安装,Windows11

[BING-TTS] error in request, (user-error You should install ‘mpv’ first or config ‘gt-tts-speaker’ correctly)