Плагин LibreTranslate — бесплатный и открытый API для перевода

Продолжение обсуждения из Discourse Translator:

LibreTranslate — страница проекта на Github
Обсуждение проекта по адресу https://community.libretranslate.com/

Бесплатный и с открытым исходным кодом API машинного перевода. Полностью размещается на собственном сервере, работает автономно и легко настраивается. Работает на базе проекта с открытым исходным кодом Argos Translate.

Установка Discourse

скопировано из README на Github

Вы можете использовать этот плагин для перевода Discourse, чтобы переводить темы в Discourse. Для установки просто отредактируйте файл /var/discourse/containers/app.yml:

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
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» в качестве провайдера перевода и настройте соответствующие параметры конечной точки.

Я не автор, но только что обнаружил этот удивительный плагин. Насколько мне известно, о нём ещё никто не упоминал на форуме. Нужно создать отдельную тему для этого плагина, и, возможно, нам удастся привлечь разработчика к этому обсуждению… если только я не упустил, что этот плагин уже где-то перечислен в разделе meta.*

Я попытался настроить это, но на последнем шаге (получение перевода) возникла ошибка со следующим сообщением:

Произошла ошибка: #<Excon::Response:0x00007f25419e6818 @data={:body=>"<!doctype html>\n<html lang=en>\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 lang=en>\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-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-контейнер с помощью команды docker run -d --restart unless-stopped -ti -p 5000:5000 --name="libretranslate" libretranslate/libretranslate, что, согласно документации, должно было работать, и настроил translator libretranslate endpoint на http://172.17.0.1:5000 (IP-адрес хоста Docker).

Судя по сообщению об ошибке, Discourse может подключаться к LibreTranslate, но что-то не работает.

Есть какие-нибудь идеи?

Это решено :slight_smile: : Problem with LibreTranslate as Docker for Discourse - #3 by pierotofy - LibreTranslate API - LibreTranslate Community

Вам нужно обновить плагин Discourse до последней версии с GitHub.

@Roi, не могли бы вы, пожалуйста, прояснить, как это настроено? Я запутался. Я нашел IP-адрес своего контейнера Docker, выполнив sudo docker inspect libretranslate.

Согласно вашему связанному посту, конечная точка API рассматривается как:

http://dockerip:5000

без необходимости API-ключа? Я запускаю libretranslate в контейнере вместе с Discourse. Спасибо!

@sunjam да, я использую:

http://172.17.0.1:5000/

где 172.17.0.1 — это IP-адрес контейнера Docker Libretranslate.

И я не использую API-ключ.

@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 с плагинами Multilingual и Translator я сталкиваюсь с ошибкой и предупреждением.

Исключение задачи: достигнут тайм-аут connect_write
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”): удерживался слишком долго, ожидаемый максимум: 60 сек, потребовалось дополнительно 1 сек”]

DistributedMutex("detect_translation_15"): удерживался слишком долго, ожидаемый максимум: 60 сек, потребовалось дополнительно 1 сек

Backtrace

/var/www/discourse/lib/distributed_mutex.rb:103:in `warn'
/var/www/discourse/lib/distributed_mutex.rb:57:in `ensure 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]

Продолжаю тестировать плагин LibreTranslate с использованием бесплатных экземпляров, которые они рекомендуют. В логе tests-passed вижу эту ошибку:

[details="Исключение задачи: {“error”=>“Неверный запрос: отсутствует параметр 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]