LibreTranslate 플러그인 -- 무료 및 오픈소스 번역 API

Discourse Translator에서 이어서 논의합니다:

LibreTranslate - Github 프로젝트 페이지
프로젝트 토론: https://community.libretranslate.com/

무료 및 오픈소스 기계 번역 API입니다. 100% 셀프호스팅 가능하며, 오프라인에서도 작동하고 설정이 쉽습니다. 오픈소스 Argos Translate로 구동됩니다.

Discourse 설치

Github readme에서 복사한 내용입니다

이 discourse translator 플러그인을 사용하여 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"를 번역 제공자로 선택하고 관련 엔드포인트 설정을 구성하십시오.

저는 이 플러그인의 개발자가 아니지만, 이 놀라운 플러그인을 최근에야 발견했습니다. 제 생각에는 포럼에서 아무도 이 플러그인에 대해 언급하지 않은 것 같습니다. 이 내용을 플러그인 관련 주제로 전환해야 하고, 가능하면 개발자를 이 채팅으로 불러야 할 것 같습니다… 아니면 제가 이 플러그인이 이미 메타에 목록에 올라와 있다는 사실을 완전히 놓치고 있는 건 아닌지 모르겠네요.

설치를 시도해 보았지만, 마지막 단계(번역 가져오기)에서 다음과 같은 오류 메시지가 발생합니다:

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">

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 버전으로 업데이트해야 합니다.

@Roi 이 설정이 어떻게 이루어지는지 설명해 주실 수 있을까요? 잘 이해가 가지 않습니다. sudo docker inspect libretranslate 명령어를 사용해 도커 컨테이너의 IP 주소를 확인했습니다.

링크해 주신 게시물에 따르면, API 엔드포인트는 다음과 같이 취급되나요?

http://dockerip:5000

API 키가 필요 없는 건가요? 저는 LibreTranslate를 컨테이너로 실행 중이며, Discourse와 함께 사용하고 있습니다. 감사합니다!

@sunjam 네, 저는 이렇게 사용하고 있습니다:

http://172.17.0.1:5000/

여기서 172.17.0.1은 Libretranslate Docker 컨테이너의 IP입니다.

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에서 보고했지만, Multilingual과 Translator 앱을 Libretranslate와 함께 사용하려고 하면 오류와 경고가 발생합니다.

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'

권장하는 무료 인스턴스로 Libretranslate 플러그인을 계속 테스트하고 있습니다. tests-passed에서 이 오류를 확인했습니다.

[details=" 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'

[/details]