LibreTranslate Plugin -- Free and Open Source Translation API

Continuing the discussion from Discourse Translator:

LibreTranslate - Github project page
Project discussion at https://community.libretranslate.com/

Free and Open Source Machine Translation API. 100% self-hosted, offline capable and easy to setup. Powered by the open source Argos Translate

Discourse Installation

copy-pasted from the Github readme

You can use this discourse translator plugin to translate Discourse topics. To install it simply modify /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
	  ...

Then issue ./launcher rebuild app . From the Discourse’s admin panel then select “LibreTranslate” as a translation provider and set the relevant endpoint configurations.

I’m not the author, but just discovered this amazing plugin. Afaik no one has mentioned it on the forum. This will need to be turned into a plugin topic and hopefully we can get the dev on this chat… unless I’m totally missing where this plugin is already listed in meta.*

I tried to set this up but in the final step (getting a translation) I fail with the following error message:

An error occurred: #<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-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">

I set up a docker container with docker run -d --restart unless-stopped -ti -p 5000:5000 --name="libretranslate" libretranslate/libretranslate which seemed to be fine for me according to the docs and set up translator libretranslate endpoint to http://172.17.0.1:5000 (the IP is the docker host IP).

According to the error message Discourse can also connect to LibreTranslate but something is not working.

Any ideas?

It’s solved :slight_smile: : Problem with LibreTranslate as Docker for Discourse - #3 by pierotofy - LibreTranslate API - LibreTranslate Community

You need to update to the latest Github version of the Discourse plugin.

@Roi could you please help clarify how this is setup. I’m confused. I found my docker container ip using sudo docker inspect libretranslate

From your linked post, is the API endpoint treated as:

http://dockerip:5000

with no API key needed? I’m running libretranslate in a container alongside Discourse. Thanks!

@sunjam yes I use:

http://172.17.0.1:5000/

Where 172.17.0.1 is the IP if the Libretranslate Docker container.

And I do not use an API key.

@Roi Thanks, seems this is your run command:

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

Somehow yes:

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

Also reporting to Libretranslate here, but I’m encountering an error and warning when attempting to use Libretranslate with Multilingual and Translator apps.

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'
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 `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'

Continuing to test Libretranslate plugin with the free instances they recommend. Seeing this error in tests-passed

Job exception: {"error"=>"Invalid request: missing q parameter"}
Message (2 copies reported)
Job exception: {"error"=>"Invalid request: missing q parameter"}


Backtrace

/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'