The Discourse Translator plugin allows users to translate posts using Microsoft, Google, Yandex, AWS, or self-hosted LibreTranslate APIs. It offers settings to enable inline translation, manage API keys, and handle locale-based translations. However, the plugin is now considered end-of-life for new features. nat announced that Discourse is transitioning to a new, integrated Content Localization and Automatic Translations system within Discourse Core and Discourse AI, which provides automatic translations for topics, categories, and search engines without requiring on-demand API calls. tobiaseigen and awesomerobot recommend migrating to the new AI-based system, noting it is more robust and potentially cost-effective, though the old plugin will still receive security fixes.
Users discussed various technical issues and feature requests. packman reported errors with self-hosted LibreTranslate, while Maria asked about customizing translations and handling post edits. ludwikc suggested features like auto-translating entire threads or first posts. twofoursixeight reported bugs with untranslated notification titles and incorrect language detection, which nat confirmed would be fixed in future updates. 翔_贺 encountered installation errors on Discourse 3.5.0.beta1, resolved by updating Discourse first. Xichao_Wang asked about moving functions to Discourse Core, which nat explained was part of concluding experimental features to support first-class multilingualism.
Privacy and cost concerns were also raised. satonotdead advocated for DeepL integration, citing superior quality. filipesm and happyhappy expressed concerns about costs and privacy regarding Big Tech AI models. awesomerobot and NateDhaliwal suggested using cheaper or self-hosted open-source models (e.g., via Ollama, OpenRouter) to mitigate costs and privacy issues. infoseek confirmed the new system is preferred, and happyhappy reiterated the need for LibreTranslate support for communities avoiding AI.
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.
Once you’re done, click on credentials in the left menu
I’m using LibreTranslate self-hosted which has worked well in the past, but I’m now getting a lot of repeated “Job exception: The translator service is currently not available” errors. I’ve checked the URL which has been working OK in the past. If I access the URL then the LibreTranslate web page displays. There’s no API/token required because my LibreTranslate instance is private with no access from the Internet.
The backtrace shows:
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'
‘Hindi’ locale option isn’t available in ‘Discourse’ yet. But ‘Hindi’ translation is available by different services (I’m using ‘Microsoft Azure’).
Then how can we setup to translate all/any non-Hindi post into ‘Hindi’ even when discourse interface continues to be in English? Is this even possible?
I was thinking about adding this translator to our forum. However, I have two main concerns:
1. Is it possible to alter the translations?
I want to ensure that certain terms are translated in a specific way. For this, I need the ability to view the available translations and make changes if necessary.
2. When will a post be ‘re-translated’?
Some forum posts are edited quite frequently. How can I ensure that every corrected typo doesn’t lead to exorbitant translation costs? Additionally, how can I ensure that new changes are accurately updated in the translations?
I believe this may not be possible, as you’d have to modify at vendor’s (Microsoft/Google) level. Unless, translated content is subject to the word replacement feature, then you can use that.
Here’s a feature request though:
Autotranslate the first post to English in case it’s written in different language.
Have a button to translate the entire thread at once.
Have autotranslate feature enabled for entire forum on user-level. Meaning, if user selects in their profile that they only speak e.g. Romanian, then translate all content to Romanian. If they select they speak multiple languages, posts would be translated only if not in these languages.
The notification in your screenshot uses the original title of your post’s topic, so it is “correct” for now. We will be ensuring notifications (topic titles) will be translated in the future.
As for the post above, our machine translation was acting up and it got incorrectly detected as “Spanish (es)”, and also had a subsequent bad translation. That’s rectified. We’re iterating through with better prompts for translations.
I got this error when install discourse-translator plugin. my discourse version is 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)