Traduttore 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 Mi Piace

Un post è stato diviso in un nuovo argomento: Sto cercando una soluzione per utilizzare un LLM per tradurre i post principali del mio forum

Un post è stato diviso in un nuovo argomento: Aggiunta di un’opzione per una configurazione separata per il servizio di rilevamento della lingua

Un post è stato diviso in un nuovo argomento: I forum ospitati da Discourse utilizzano un’istanza locale di LibreTranslate?

Sto utilizzando LibreTranslate self-hosted che in passato ha funzionato bene, ma ora ricevo molti errori ripetuti di "Eccezione del job: il servizio di traduzione non è attualmente disponibile". Ho controllato l’URL che ha funzionato bene in passato. Se accedo all’URL, la pagina web di LibreTranslate viene visualizzata. Non è richiesta alcuna API/token poiché la mia istanza di LibreTranslate è privata e non accessibile da Internet.

Il backtrace mostra:

Messaggio (548 copie segnalate)

Eccezione del job: il servizio di traduzione non è attualmente disponibile.

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'

Hai qualche idea su come posso risolvere questo problema?

2 Mi Piace

L’opzione locale ‘Hindi’ non è ancora disponibile in ‘Discourse’. Ma la traduzione ‘Hindi’ è disponibile tramite diversi servizi (sto usando ‘Microsoft Azure’).

Quindi, come possiamo impostare la traduzione di tutti/qualsiasi post non in hindi in ‘Hindi’, anche quando l’interfaccia di Discourse continua ad essere in inglese? È anche possibile?

1 Mi Piace

Sto provando a pubblicare questa domanda anche sul loro forum di discourse.

3 Mi Piace

Stavo pensando di aggiungere questo traduttore al nostro forum. Tuttavia, ho due preoccupazioni principali:

1. È possibile modificare le traduzioni?
Voglio assicurarmi che alcuni termini vengano tradotti in un modo specifico. Per questo, ho bisogno della possibilità di visualizzare le traduzioni disponibili e apportare modifiche, se necessario.

2. Quando un post verrà “ritradotto”?
Alcuni post del forum vengono modificati abbastanza frequentemente. Come posso assicurarmi che ogni errore di battitura corretto non comporti costi di traduzione esorbitanti? Inoltre, come posso garantire che le nuove modifiche vengano aggiornate accuratamente nelle traduzioni?

3 Mi Piace

Credo che ciò non sia possibile, poiché dovresti modificare a livello del fornitore (Microsoft/Google). A meno che il contenuto tradotto non sia soggetto alla funzionalità di sostituzione di parole, allora puoi usarla.

Ecco una richiesta di funzionalità:

  1. Tradurre automaticamente il primo post in inglese nel caso in cui sia scritto in una lingua diversa.
  2. Avere un pulsante per tradurre l’intero thread in una volta sola.
  3. Avere la funzionalità di traduzione automatica abilitata per l’intero forum a livello utente. Ciò significa che se un utente seleziona nel proprio profilo di parlare solo, ad esempio, rumeno, allora tutto il contenuto verrà tradotto in rumeno. Se seleziona di parlare più lingue, i post verranno tradotti solo se non in queste lingue.
2 Mi Piace

In qualità di amministratore del sito, sono rimasto sorpreso nel leggere questo:

Dove si trova questa impostazione nascosta? :smiling_face_with_sunglasses:

1 Mi Piace
./launcher enter app
rails c
SiteSetting.automatic_translation_backfill_rate = <valore desiderato>
exit
exit

Ma penso che non ci sia più, almeno nelle versioni più recenti.

2 Mi Piace

Come impari queste cose? :sweat_smile: Ok, grazie! Aspetterò una risposta dal team, per sicurezza.

1 Mi Piace

Due modi: usando la ricerca e ask.discourse.com

3 Mi Piace
3 Mi Piace

Le notifiche dell’argomento tradotto non sembrano essere tradotte nella barra delle notifiche:

1 Mi Piace

Inoltre, il mio post è stato tradotto nella lingua sbagliata tramite un link?


Guardando nel composer, questo è ciò che ho scritto in realtà:

Ho notato che anche il oneboxing non ha funzionato quando ho tradotto.

1 Mi Piace

La notifica nello screenshot utilizza il titolo originale dell’argomento del tuo post, quindi è “corretta” per ora. In futuro, ci assicureremo che le notifiche (titoli degli argomenti) vengano tradotte.

Per quanto riguarda il post qui sopra, la nostra traduzione automatica ha avuto un problema ed è stata erroneamente rilevata come “spagnolo (es)”, e ha anche avuto una successiva traduzione errata. Questo è stato corretto. Stiamo iterando con prompt migliori per le traduzioni.

2 Mi Piace

Ho riscontrato questo errore durante l’installazione del plugin discourse-translator. La mia versione di discourse è la 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)

Come posso risolvere?

1 Mi Piace

Ciao, l’errore può essere mitigato aggiornando prima Discourse prima di installare il plugin.

Il metodo register_topic_preloader_associations è stato promosso da protetto a pubblico.

4 Mi Piace

Grazie, ho installato con successo dopo l’aggiornamento di Discourse all’ultima versione.

2 Mi Piace