Traducteur Discourse

: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 « J'aime »

Un message a été divisé en un nouveau sujet : Je cherche une solution pour utiliser un LLM afin de traduire les meilleurs messages de mon forum

Un message a été divisé en un nouveau sujet : Ajout d’une option pour une configuration distincte pour le service de détection de langue

Un message a été divisé en un nouveau sujet : Les forums hébergés par Discourse utilisent-ils une instance locale de LibreTranslate ?

J’utilise LibreTranslate auto-hébergé, ce qui a bien fonctionné par le passé, mais je reçois maintenant de nombreuses erreurs répétées « Job exception: The translator service is currently not available ». J’ai vérifié l’URL qui fonctionnait correctement par le passé. Si j’accède à l’URL, la page Web LibreTranslate s’affiche. Aucune API/token n’est requis car mon instance LibreTranslate est privée et n’est pas accessible depuis Internet.

Le backtrace montre :

Message (548 copies reported)

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'

Avez-vous des idées sur la façon dont je peux résoudre ce problème ?

2 « J'aime »

L’option de locale ‘Hindi’ n’est pas encore disponible dans ‘Discourse’. Mais la traduction ‘Hindi’ est disponible via différents services (j’utilise ‘Microsoft Azure’).

Alors, comment pouvons-nous configurer pour traduire tous les messages non-hindi en ‘Hindi’ même lorsque l’interface Discourse reste en anglais ? Est-ce même possible ?

1 « J'aime »

J’essaie de publier cette question sur leur forum discourse également.

3 « J'aime »

Je pensais ajouter ce traducteur à notre forum. Cependant, j’ai deux préoccupations principales :

1. Est-il possible de modifier les traductions ?
Je veux m’assurer que certains termes sont traduits d’une manière spécifique. Pour cela, j’ai besoin de pouvoir visualiser les traductions disponibles et d’apporter des modifications si nécessaire.

2. Quand un message sera-t-il « retraduit » ?
Certains messages du forum sont modifiés assez fréquemment. Comment puis-je m’assurer que chaque faute de frappe corrigée n’entraîne pas des coûts de traduction exorbitants ? De plus, comment puis-je m’assurer que les nouveaux changements sont mis à jour avec précision dans les traductions ?

3 « J'aime »

Je pense que cela n’est pas possible, car vous devriez modifier au niveau du fournisseur (Microsoft/Google). À moins que le contenu traduit ne soit soumis à la fonction de remplacement de mots, alors vous pouvez l’utiliser.

Voici une demande de fonctionnalité :

  1. Traduire automatiquement le premier message en anglais s’il est rédigé dans une langue différente.
  2. Avoir un bouton pour traduire l’intégralité du fil de discussion en une seule fois.
  3. Avoir la fonction de traduction automatique activée pour l’ensemble du forum au niveau de l’utilisateur. C’est-à-dire, si un utilisateur sélectionne dans son profil qu’il ne parle que le roumain, par exemple, alors tout le contenu est traduit en roumain. S’il sélectionne qu’il parle plusieurs langues, les messages ne seraient traduits que s’ils ne sont pas dans ces langues.
2 « J'aime »

En tant qu’administrateur du site, j’ai été surpris de lire ceci :

Où se trouve ce paramètre caché ? :smiling_face_with_sunglasses:

1 « J'aime »
./launcher enter app
rails c
SiteSetting.automatic_translation_backfill_rate = <valeur souhaitée>
exit
exit

Mais je pense que ce n’est plus là, du moins dans les versions plus récentes.

2 « J'aime »

Comment apprenez-vous ces choses ? :sweat_smile: Ok, merci ! J’attendrai une réponse de l’équipe, pour être sûr.

1 « J'aime »

Deux façons : en utilisant la recherche et ask.discourse.com

3 « J'aime »
3 « J'aime »

Les notifications du sujet intitulé qui a été traduit n’apparaissent pas dans la barre de notification :

1 « J'aime »

De plus, mon message a été traduit dans la mauvaise langue via un lien ?


En regardant dans l’éditeur, voici ce que j’ai réellement écrit :

J’ai remarqué que le oneboxing ne fonctionnait pas non plus lorsque j’ai traduit.

1 « J'aime »

La notification dans votre capture d’écran utilise le titre original du sujet de votre publication, elle est donc « correcte » pour le moment. Nous veillerons à ce que les notifications (titres de sujets) soient traduites à l’avenir.

Quant à la publication ci-dessus, notre traduction automatique rencontrait des problèmes et a été incorrectement détectée comme « espagnol (es) », et a également fait l’objet d’une mauvaise traduction ultérieure. C’est rectifié. Nous itérons avec de meilleures invites pour les traductions.

2 « J'aime »

J’ai obtenu cette erreur lors de l’installation du plugin discourse-translator. Ma version de discourse est 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)

Comment puis-je résoudre ce problème ?

1 « J'aime »

Salut, l’erreur peut être atténuée en mettant à jour Discourse en premier avant d’installer le plugin.

La méthode register_topic_preloader_associations a été promue de protégée à publique.

4 « J'aime »

Merci, j’ai réussi l’installation après la mise à niveau de Discourse vers la dernière version.

2 « J'aime »