LibreTranslate 插件 —— 免费开源的翻译 API

继续讨论 Discourse 翻译器

LibreTranslate - Github 项目页面
项目讨论请访问 https://community.libretranslate.com/

免费且开源的机器翻译 API。完全支持自托管、离线运行且易于设置。由开源项目 Argos Translate 提供支持。

Discourse 安装

以下内容复制自 Github 的 README 文件

您可以使用此 Discourse 翻译插件 来翻译 Discourse 主题。安装时只需修改 /var/discourse/containers/app.yml 文件:

## 插件放置在此处
## 详见 https://meta.discourse.org/t/19157
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/LibreTranslate/discourse-translator
	  ...

然后执行 ./launcher rebuild app。接着在 Discourse 的管理面板中选择“LibreTranslate”作为翻译提供商,并配置相关的端点设置。

6 个赞

我不是作者,但刚刚发现了这个令人惊叹的插件。据我所知,论坛上还没有人提到过它。这需要将其转化为一个插件主题,希望我们能邀请开发者加入这个聊天……除非我完全错过了该插件在 meta.* 中已有的列表。

2 个赞

我尝试设置这个,但在最后一步(获取翻译)时,我遇到了以下错误消息:

发生错误: #<Excon::Response:0x00007f25419e6818 @data={:body=>"<!doctype html>\n<html>\n<title>405 Method Not Allowed</title>\n<h1>Method Not Allowed</h1>\n<p>The method is not allowed for the requested URL.</p>\n", :cookies=>[], :host=>"172.17.0.1", :headers=>{"Access-Control-Allow-Credentials"=>"true", "Access-Control-Allow-Headers"=>"Authorization, Content-Type", "Access-Control-Allow-Methods"=>"GET, POST", "Access-Control-Allow-Origin"=>"*", "Access-Control-Expose-Headers"=>"Authorization", "Access-Control-Max-Age"=>"1728000", "Allow"=>"HEAD, GET, OPTIONS", "Content-Length"=>"153", "Content-Type"=>"text/html; charset=utf-8", "Date"=>"Sat, 17 Dec 2022 11:18:27 GMT", "Server"=>"waitress"}, :path=>"//languages", :port=>5000, :status=>405, :status_line=>"HTTP/1.1 405 METHOD NOT ALLOWED\r\n", :reason_phrase=>"METHOD NOT ALLOWED", :remote_ip=>"172.17.0.1", :local_port=>50848, :local_address=>"172.17.0.3"}, @body="<!doctype html>\n<html>\n<title>405 Method Not Allowed</title>\n<h1>Method Not Allowed</h1>\n<p>The method is not allowed for the requested URL.</p>\n", @headers={"Access-Control-Allow-Credentials"=>"true", "Access-Control-Allow-Headers"=>"Authorization, Content-Type", "Access-Control-Allow-Methods"=>"GET, POST", "Access-Control-Allow-Origin"=>"*", "Access-Control-Expose-Headers"=>"Authorization", "Access-Control-Max-Age"=>"1728000", "Allow"=>"HEAD, GET, OPTIONS", "Content-Length"=>"153", "Content-Type"=>"text/html; charset=utf-8", "Date"=>"Sat, 17 Dec 2022 11:18:27 GMT", "Server"=>"waitress"}, @status=405, @remote_ip="172.17.0.1", @local_port=50848, @local_address="172.17.0.3">

我根据文档设置了一个带有 docker run -d --restart unless-stopped -ti -p 5000:5000 --name="libretranslate" libretranslate/libretranslate 的 Docker 容器,这对我来说似乎没问题,并将 translator libretranslate endpoint 设置为 http://172.17.0.1:5000(IP 是 Docker 主机 IP)。

根据错误消息,Discourse 也可以连接到 LibreTranslate,但有些东西不起作用。

有什么想法吗?

已解决 :slight_smile: : Problem with LibreTranslate as Docker for Discourse - #3 by pierotofy - LibreTranslate API - LibreTranslate Community

您需要更新到 Discourse 插件的最新 Github 版本。

2 个赞

@Roi 能否请您帮忙澄清一下这是如何设置的。我很困惑。我使用 sudo docker inspect libretranslate 找到了我的 docker 容器 IP。

根据您链接的帖子,API 端点是否被视为:

http://dockerip:5000

并且不需要 API 密钥?我正在与 Discourse 一起运行 libretranslate 容器。谢谢!

@sunjam 是的,我使用:

http://172.17.0.1:5000/

其中 172.17.0.1 是 Libretranslate Docker 容器的 IP 地址。

而且我没有使用 API 密钥。

2 个赞

@Roi 谢谢,看起来这是你的运行命令:

docker run -d --restart unless-stopped -ti -p 5000:5000 --name="libretranslate" libretranslate/libretranslate

某种程度上是的:

docker run -d --restart unless-stopped -ti -p 5000:5000 -e LT_LOAD_ONLY="en,de,fr,it,es,pt,nl,da,sv,pl,cs,ru" --name="libretranslate" libretranslate/libretranslate

也在此处向 Libretranslate 报告,但在尝试将 Libretranslate 与 MultilingualTranslator 应用程序一起使用时,我遇到了一个错误和警告。

Job exception: connect_write timeout reached
Backtrace

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/socket.rb:317:in `select_with_timeout'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/socket.rb:163:in `rescue in block in connect'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/socket.rb:144:in `block in connect'
/usr/local/lib/ruby/3.2.0/resolv.rb:111:in `each_address'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/socket.rb:134:in `connect'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/socket.rb:51:in `initialize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/connection.rb:477:in `new'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/connection.rb:477:in `socket'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/connection.rb:121:in `request_call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/excon-0.104.0/lib/excon/middlewares/mock.rb:57:in `request_call'

[details=“DistributedMutex("detect_translation_15"): held for too long, expected max: 60 secs, took an extra 1 secs”]

DistributedMutex("detect_translation_15"): held for too long, expected max: 60 secs, took an extra 1 secs

Backtrace

/var/www/discourse/lib/distributed_mutex.rb:103:in `warn'
/var/www/discourse/lib/distributed_mutex.rb:57:in `rescue in block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:64:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/plugins/discourse-translator/plugin.rb:98:in `execute'
/var/www/discourse/app/jobs/base.rb:292:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'
/var/www/discourse/app/jobs/base.rb:279:in `block in perform'

[/details]

1 个赞

继续测试 Libretranslate 插件及其推荐的免费实例。在 tests-passed 中看到此错误

[details=“作业异常: {"error"=\u003e"无效请求: 缺少 q 参数"}”]

消息(报告了 2 份副本)
作业异常: {"error"=>"无效请求: 缺少 q 参数"}


回溯

/var/www/discourse/plugins/discourse-translator/services/discourse_translator/libretranslate.rb:150:in `result'
/var/www/discourse/plugins/discourse-translator/services/discourse_translator/libretranslate.rb:84:in `detect'
/var/www/discourse/plugins/discourse-translator/plugin.rb:99:in `block in execute'
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/plugins/discourse-translator/plugin.rb:98:in `execute'
/var/www/discourse/app/jobs/base.rb:292:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-5.0.0/lib/rails_multisite/connection_management.rb:82:in `with_connection'

[/details]