lorniu / go-translate

Translator on Emacs. Supports multiple engines such as Google, Bing, deepL, ChatGPT, StarDict, Youdao and so on.
GNU General Public License v3.0
274 stars 37 forks source link

如何提供翻译的api? #48

Closed lyjdwh closed 1 year ago

lyjdwh commented 1 year ago

有没有办法实现一个函数,待翻译文本作为输入,翻译结果作为输出呢?

似乎要修改picker和render,picker如何传参数呢,render能让它返回一个值么

lorniu commented 1 year ago

如果向 gts-translate 方法直接传递 text 和 path,是会跳过 picker 进行翻译的。

这样的函数实现不太容易,因为翻译是异步进行的,不是立即返回结果。

不过尝试写了一下,曲线救国,通过轮询的方式获取最后的返回值。仅供参考:

;; 定义一个 render,用于将结果插入到当前 buffer
(defclass your-insert-at-point-render (gts-render) ())
(cl-defmethod gts-out ((_ your-insert-at-point-render) task)
  (insert (oref task parsed)))

;; 定义的函数
(defun your-function-return-result-directly (input)
  (let ((translator (gts-translator :engines (gts-stardict-engine)
                                    :render (your-insert-at-point-render))))
    (with-temp-buffer
      (gts-translate translator input (cons "en" "zh"))

       ;; 轮询,不断检查当前 Buffer 是否有内容,如果有则返回。需要判断出错或超时
       ;; (while t ... (sleep 0.1))

      (buffer-string))))

;; 调用函数
(your-function-return-result-directly "hello, world")
lyjdwh commented 1 year ago

感谢大佬的方案!