Discourse Übersetzer

:discourse2: Summary Discourse Translator translates posts on Discourse using Microsoft, Google, or Yandex translation APIs.
:hammer_and_wrench: Repository Link https://github.com/discourse/discourse-translator
:open_book: Install Guide How to install plugins in Discourse

Features

  • Each post is only translated once per locale which saves you :moneybag:
    • Note that language detection is also run once for every post. Be careful when enabling this on old and large forums.
  • Access Token is cached server side for faster translations.
  • Translations are rate limited to 3 per minute by default (admins can configure this value)

Translation Services Supported

Configuration Steps

Microsoft
  1. Follow the steps in Microsoft Translator API on Azure to obtain a subscription key. You may pick from any of the available subscription offers.

  2. In your Discourse, under Admin > Settings > Plugins, enter the subscription key that you’ve obtained from the steps above.

enter subscription key

  1. In your Discourse, under Admin > Settings > Basic Setup, enable allow user locale.
Google Translator
  1. Go to https://console.developers.google.com

  2. Click on My Project

my project

  1. Click on the :heavy_plus_sign: to create a new project

  1. Enter your project name and click create

  2. Select Enable API and search for Google Cloud Translator API. Look for the enable button and click it to enable the API. Note that there is no free tier for the Google Translator API so it may prompt you to enable billing.

  3. Once you’re done, click on credentials in the left menu

credentials

  1. Click create credentials and select API key. Copy the API Key and paste it into the translator google api key site setting in Discourse.

  2. In Discourse, under Admin > Settings > Basic Setup, enable allow user locale.

Settings

Name Description
translator enabled Allow inline translation of posts.
translator The provider of the translation service.
translator azure subscription key Azure Subscription Key
translator azure region Azure Region
translator azure custom subdomain Required if using a Virtual Network or Firewall for Azure Cognitive Services. Note: Only enter the custom subdomain not the full custom endpoint.
translator aws region AWS Region
translator aws key id AWS Key ID
translator aws secret access AWS secret access key
translator aws iam role AWS IAM Role
translator google api key Google API Key
translator yandex api key Yandex API Key
translator libretranslate endpoint LibreTranslate Endpoint
translator libretranslate api key LibreTranslate API Key
max translations per minute The number of translations per minute a regular user can perform.
restrict translation by group Only allowlisted groups can translate
restrict translation by poster group Only allow translation of posts made by allowlisted users

Known Issues

  • Does not translate text within polls generated by discourse-poll plugin.
  • Images are enlarged upon translating.

:discourse2: Hosted by us? This plugin is available on our Enterprise plan.

Last edited by @JammyDodger 2024-06-18T14:19:34Z

Check documentPerform check on document:
102 „Gefällt mir“

Ein Beitrag wurde in ein neues Thema aufgeteilt: Ich suche nach einer solchen Lösung, um ein LLM zur Übersetzung der Top-Beiträge meines Forums zu verwenden

Ein Beitrag wurde in ein neues Thema aufgeteilt: Hinzufügen einer Option für eine separate Konfiguration für den Spracherkennungsdienst

Ein Beitrag wurde in ein neues Thema aufgeteilt: Werden von Discourse gehostete Foren eine lokale Instanz von LibreTranslate verwenden?

Ich verwende LibreTranslate selbst gehostet, was in der Vergangenheit gut funktioniert hat, aber jetzt erhalte ich viele wiederholte Fehler wie „Job exception: The translator service is currently not available“. Ich habe die URL überprüft, die in der Vergangenheit in Ordnung war. Wenn ich auf die URL zugreife, wird die LibreTranslate-Webseite angezeigt. Es ist kein API/Token erforderlich, da meine LibreTranslate-Instanz privat ist und keinen Zugriff aus dem Internet hat.

Der Backtrace zeigt:

Nachricht (548 Kopien gemeldet)

Job exception: The translator service is currently not available.

Backtrace

/var/www/discourse/plugins/discourse-translator/services/discourse_translator/libretranslate.rb:168:in `result'
/var/www/discourse/plugins/discourse-translator/services/discourse_translator/libretranslate.rb:85:in `detect'
/var/www/discourse/plugins/discourse-translator/plugin.rb:120: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:119:in `execute'
/var/www/discourse/app/jobs/base.rb:305:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.0.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:292:in `block in perform'
/var/www/discourse/app/jobs/base.rb:288:in `each'
/var/www/discourse/app/jobs/base.rb:288:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in `execute_job'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in `block (2 levels) in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:132:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in `block in invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in `block in process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in `local'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq.rb:44:in `block in <module:Sidekiq>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in `stats'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in `global'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in `prepare'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in `process'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in `process_one'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:8:in `watchdog'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread'

Haben Sie eine Idee, wie ich das beheben kann?

2 „Gefällt mir“

Die Locale-Option „Hindi“ ist in „Discourse“ noch nicht verfügbar. Die Hindi-Übersetzung ist jedoch über verschiedene Dienste verfügbar (ich verwende „Microsoft Azure“).

Wie können wir dann einrichten, dass alle/beliebigen Nicht-Hindi-Beiträge ins „Hindi“ übersetzt werden, auch wenn die Discourse-Oberfläche weiterhin auf Englisch ist? Ist das überhaupt möglich?

1 „Gefällt mir“

Ich versuche, diese Frage auch in ihr Diskursforum zu posten.

3 „Gefällt mir“

Ich habe darüber nachgedacht, diesen Übersetzer zu unserem Forum hinzuzufügen. Ich habe jedoch zwei Hauptbedenken:

1. Ist es möglich, die Übersetzungen zu ändern?
Ich möchte sicherstellen, dass bestimmte Begriffe auf eine bestimmte Weise übersetzt werden. Dazu benötige ich die Möglichkeit, die verfügbaren Übersetzungen einzusehen und bei Bedarf Änderungen vorzunehmen.

2. Wann wird ein Beitrag „neu übersetzt“?
Einige Forenbeiträge werden recht häufig bearbeitet. Wie kann ich sicherstellen, dass jeder korrigierte Tippfehler nicht zu überhöhten Übersetzungskosten führt? Wie kann ich außerdem sicherstellen, dass neue Änderungen korrekt in den Übersetzungen aktualisiert werden?

3 „Gefällt mir“

Ich glaube, das ist nicht möglich, da Sie dies auf der Ebene des Anbieters (Microsoft/Google) ändern müssten. Es sei denn, übersetzte Inhalte unterliegen der Wortersetzungs-Funktion, dann können Sie diese verwenden.

Hier ist jedoch eine Funktionsanfrage:

  1. Die erste Nachricht automatisch ins Englische übersetzen, falls sie in einer anderen Sprache verfasst wurde.
  2. Eine Schaltfläche haben, um den gesamten Thread auf einmal zu übersetzen.
  3. Die automatische Übersetzungsfunktion für das gesamte Forum auf Benutzerebene aktivieren. Das bedeutet, wenn ein Benutzer in seinem Profil angibt, dass er nur z. B. Rumänisch spricht, werden alle Inhalte ins Rumänische übersetzt. Wenn er angibt, mehrere Sprachen zu sprechen, werden Beiträge nur übersetzt, wenn sie nicht in diesen Sprachen verfasst sind.
2 „Gefällt mir“

Als Website-Administrator war ich überrascht, Folgendes zu lesen:

Wo ist diese versteckte Einstellung? :smiling_face_with_sunglasses:

1 „Gefällt mir“
./launcher enter app
rails c
SiteSetting.automatic_translation_backfill_rate = <gewünschter Wert>
exit
exit

Aber ich glaube, das gibt es in neueren Versionen sowieso nicht mehr.

2 „Gefällt mir“

Wie lernen Sie diese Dinge? :sweat_smile: Ok, danke! Ich werde auf eine Antwort vom Team warten, um sicherzugehen.

1 „Gefällt mir“

Zwei Wege: über die Suche und über ask.discourse.com

3 „Gefällt mir“
3 „Gefällt mir“

Benachrichtigungen zu übersetzten Themen erscheinen nicht in der Benachrichtigungsleiste:

1 „Gefällt mir“

Außerdem wurde mein Beitrag über einen Link in die falsche Sprache übersetzt?


Wenn ich in den Composer schaue, ist das, was ich tatsächlich geschrieben habe:

Ich habe bemerkt, dass Oneboxing auch nicht funktionierte, als ich übersetzt habe.

1 „Gefällt mir“

Die Benachrichtigung in Ihrem Screenshot verwendet den ursprünglichen Titel des Themas Ihres Beitrags, daher ist sie vorerst „korrekt“. Wir werden sicherstellen, dass Benachrichtigungen (Thementitel) in Zukunft übersetzt werden.

Was den obigen Beitrag betrifft, so hat unsere maschinelle Übersetzung gesponnen und wurde fälschlicherweise als „Spanisch (es)“ erkannt und anschließend schlecht übersetzt. Das wurde korrigiert. Wir arbeiten mit besseren Prompts für Übersetzungen.

2 „Gefällt mir“

Ich habe diesen Fehler erhalten, als ich das Discourse-Translator-Plugin installiert habe. Meine Discourse-Version ist 3.5.0.beta1.

I, [2025-04-24T01:33:20.510994 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
        82: from /usr/local/bin/bundle:25:in `<main>'
        81: from /usr/local/bin/bundle:25:in `load'
        80: from /usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.5.18/exe/bundle:20:in `<top (required)>'
     ....
        10: from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/lazy_load_hooks.rb:87:in `with_execution_control'
        9: from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/lazy_load_hooks.rb:94:in `block in execute_hook'
        8: from /var/www/discourse/config/application.rb:249:in `block in <class:Application>'
        7: from /var/www/discourse/lib/plugin.rb:6:in `initialization_guard'
        6: from /var/www/discourse/config/application.rb:249:in `block (2 levels) in <class:Application>'
        5: from /var/www/discourse/config/application.rb:249:in `each'
        4: from /var/www/discourse/lib/plugin/instance.rb:629:in `notify_after_initialize'
        3: from /var/www/discourse/lib/plugin/instance.rb:629:in `each'
        2: from /var/www/discourse/lib/plugin/instance.rb:631:in `block in notify_after_initialize'
        1: from /var/www/discourse/plugins/discourse-translator/plugin.rb:40:in `block in activate!'
/var/www/discourse/plugins/discourse-translator/lib/discourse_translator/inline_translation.rb:86:in `inject': protected method `register_topic_preloader_associations' called for an instance of Plugin::Instance (NoMethodError)

Wie kann ich das beheben?

1 „Gefällt mir“

Hallo, der Fehler kann behoben werden, indem Discourse zuerst aktualisiert wird, bevor das Plugin installiert wird.

Die Methode register_topic_preloader_associations wurde von geschützt auf öffentlich erweitert.

4 „Gefällt mir“

Danke, ich habe nach dem Upgrade von Discourse auf die neueste Version erfolgreich installiert.

2 „Gefällt mir“