multi-translate.el 用多个翻译服务翻译当前单词和选区

昨天明明是想把所有的依赖都写上,为什么漏掉一个。可能是写到一半,忽然发现 bing-dict 没有版本号,然后去查了一下该怎么写。接着就把 sdcv 忘了,去处理别的了。

sdcv 的确有些另类,但它响应快,用来查单词很不错,也把它作为默认后端使用了。

或许所有字典都应该是可选安装的,但我还是优先把目前想到的一些功能先实现了吧,比如:

  • 光标所在/选区内容的语言的检测。
  • 可保留多次查询的结果历史。每一次查询结果都可折叠。
  • 查询结果中的【输入内容】可编辑,按回车重查。

语言的检测是个问题啊。以中英文混合为例,我认为中文字数多于英文单词,即判定为中文句子,反之依然。

但这样真的准确么。

可是如果本地不判断,交给远程,结果又会造成各远端判断不一致的问题。

是的,Emacs下判断语言我也一直有这样的疑问。当时我写 kiwix.el 的时候,也纠结了半天。话说我现在代码里面的实现也不是很好。

这个特性,之前有人在 google-translate 上提出来过,但是我想不到应该如何实现,不知道你有什么好的想法?

这种可以考虑顶一个一个 defcustom 列表,到时候对于用户设定的值按需加载字典。我在别的地方看到是这样做的。可能有其他办法。

可以用widgets.el

这个问题好像论坛上之前有人说过,Google Translate API 和网页的翻译结果不一样,并且是网页的结果更好。

搜了一下,说是 expected behavior。

https://groups.google.com/g/google-translate-api/c/heAHkWEJtGQ?pli=1

原本也打算用 widget,但是它似乎有问题。同一个 buffer 擦除之后再利用,就会出现错乱。

应该是我使用方式不对,同样没搞清楚 widget 用法的还有有内置的 eudc.el,它也有同样的问题,重现步骤:

  1. M-x eudic-query-form
  2. 在 minibuffer 随便输入点什么。
  3. 在弹出的窗口中点 [Reset]
  4. 重复步骤 1,然后整个 buffer 变成了一个大号的 editable-field

现在想是不是可以用 overlay 标记一块区域(例如 my-editable-field),然后拦截 self-insert-command 来,当光标处在 my-editable-filed 内,就暂时把 read-only 去掉。

再不行就把内容提取到 minibuffer 来编辑。


目前观察到的有两个问题:

  1. 添加了 widget 之后必须调用 widget-setup 才能生效。如果后续追加了 widget,再调用 widget-setup,就会使得之前的 widget 丢失部分属性。
  2. 有 widget 的 buffer 擦出不干净,最终会剩下一个空白 editable-field,接着就导致上面所述的问题。

看来widget还是不太行,widget作者写完之后跑路了,现在也没人维护。我之前想研究下,发现完全没用EIEIO,而是用symbol propery,结构挺碎片的,也就没改进的兴趣了。


不知道你用没用过deft?deft的输入栏就只允许两个操作:输入和删除,光标默认在最后面不能移动。跟isearch的minibuffer一样。或许可以整个overlay,上面用keymap限制只能在末尾输入和删除。这样还有个好处:输入栏可以做成固定长度,超出长度的话可以把最前面的截掉不显示,变短了再显示回来。不知道我描述地清楚不清楚。


当然更简单的是像你说的用minibufer,在输入框上回车就弹出minibuffer编辑,讲道理效果也不差。

为什么有道翻译那一行 是一段代码?

图片

异步请求结果的占位符。

大概也可以用marker做占位符?不知道和uuid比起来有什么缺点

可以把那个占位符颜色设置为背景颜色,不就不那么突兀了么?

可不可以把查过的词和意思自动保存到org文档中。

这种最好还是自己写一个函数,因为和主要功能关系不大

最近看到一篇博文说可以在Emacs里看Webster’s 1913 dictionary:

http://mbork.pl/2017-01-14_I’m_now_using_the_right_dictionary

正好这个用的是scdv格式。我在苹果的Dictionary.app上用这个词典,还是很不错的。具体优点可以在 You’re probably using the wrong dictionary « the jsomers.net blog 看到,文章写得挺好的(除了有点罗嗦)。

2 个赞

那个词典的链接不太好找,在这里:https://s3.amazonaws.com/jsomers/dictionary.zip 解压出来再解压就是stardict能用的格式了。

我就是从那个链接下载的,已经用上了。这个字典是破解的吗?

1 个赞

1913年写的,没有版权啥的了吧。应该是public domain。

最终决定采用 minibuffer 方案,增加快捷键以修改/交换语言参数,我感觉使用起来比在 widget 上跳来跳去更流畅:

Screenshot_2020-07-29_at_8.25.23_PM--multi-translate-amend-query

新增函数:

  • multi-translate
  • multi-translate-amend-query
3 个赞

支持保留多次查询结果(默认关闭),并提供了相应的函数和 Imenu 以便在各段落之间跳转和折叠段落。

@stardiviner 另,google-translate 的异步改造有在继续码?如果比较麻烦的话,我想我可以考虑写一个基于 web 返回结果的简单实现。毕竟这个包主要还是用来对比长句翻译的(单词有一个词典能翻译就够了),而且的确 web 翻译的结果更好