Traductor de 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 Me gusta

Se dividió una publicación en un nuevo tema: Busco una solución para usar un LLM para traducir las publicaciones principales de mi foro

Se dividió una publicación en un nuevo tema: Añadir una opción para una configuración separada para el servicio de detección de idioma

Se dividió una publicación en un nuevo tema: ¿Los foros alojados por Discourse utilizan una instancia local de LibreTranslate?

Estoy usando LibreTranslate autoalojado, que ha funcionado bien en el pasado, pero ahora estoy recibiendo muchos errores repetidos de "Excepción de trabajo: El servicio de traducción no está disponible actualmente". He comprobado la URL, que ha estado funcionando bien en el pasado. Si accedo a la URL, se muestra la página web de LibreTranslate. No se requiere API/token porque mi instancia de LibreTranslate es privada y no tiene acceso desde Internet.

La traza inversa muestra:

Mensaje (548 copias reportadas)

Excepción de trabajo: El servicio de traducción no está disponible actualmente.

Traza inversa

/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'

¿Alguna idea sobre cómo puedo solucionar esto?

2 Me gusta

La opción de idioma ‘hindi’ aún no está disponible en ‘Discourse’. Pero la traducción al ‘hindi’ está disponible a través de diferentes servicios (estoy usando ‘Microsoft Azure’).

Entonces, ¿cómo podemos configurar para traducir todas las publicaciones que no sean en hindi a ‘hindi’ incluso cuando la interfaz de Discourse continúe en inglés? ¿Es esto siquiera posible?

1 me gusta

Intentando publicar esta pregunta también en su foro de discourse.

3 Me gusta

Estaba pensando en agregar este traductor a nuestro foro. Sin embargo, tengo dos preocupaciones principales:

1. ¿Es posible alterar las traducciones?
Quiero asegurarme de que ciertos términos se traduzcan de una manera específica. Para ello, necesito la capacidad de ver las traducciones disponibles y realizar cambios si es necesario.

2. ¿Cuándo se “volverá a traducir” una publicación?
Algunas publicaciones del foro se editan con bastante frecuencia. ¿Cómo puedo asegurarme de que cada error tipográfico corregido no genere costos de traducción exorbitantes? Además, ¿cómo puedo garantizar que los nuevos cambios se actualicen con precisión en las traducciones?

3 Me gusta

Creo que esto no es posible, ya que tendrías que modificar a nivel del proveedor (Microsoft/Google). A menos que el contenido traducido esté sujeto a la función de reemplazo de palabras, entonces puedes usarla.

Aquí tienes una solicitud de función:

  1. Traducir automáticamente la primera publicación al inglés en caso de que esté escrita en un idioma diferente.
  2. Tener un botón para traducir todo el hilo a la vez.
  3. Tener la función de traducción automática habilitada para todo el foro a nivel de usuario. Es decir, si el usuario selecciona en su perfil que solo habla, por ejemplo, rumano, entonces se traducirá todo el contenido al rumano. Si selecciona que habla varios idiomas, las publicaciones solo se traducirán si no están en esos idiomas.
2 Me gusta

Como administrador del sitio, me sorprendió leer esto:

¿Dónde está esta configuración oculta? :smiling_face_with_sunglasses:

1 me gusta
./launcher enter app
rails c
SiteSetting.automatic_translation_backfill_rate = <valor deseado>
exit
exit

Pero creo que ya no está, al menos en versiones más recientes.

2 Me gusta

¿Cómo aprendes estas cosas? :sweat_smile: ¡Ok, gracias! Esperaré una respuesta del equipo, para estar seguro.

1 me gusta

Dos maneras: usando la búsqueda y ask.discourse.com

3 Me gusta
3 Me gusta

Notifications of topic titled that got translated don’t appear to translate in the notification bar:

1 me gusta

Además, ¿mi publicación se tradujo al idioma incorrecto a través de un enlace?


Mirando en el editor, esto es lo que realmente escribí:

Noté que el oneboxing tampoco funcionó cuando traduje.

1 me gusta

La notificación en tu captura de pantalla utiliza el título original del tema de tu publicación, por lo que es “correcto” por ahora. Nos aseguraremos de que las notificaciones (títulos de temas) se traduzcan en el futuro.

En cuanto a la publicación anterior, nuestra traducción automática estaba fallando y se detectó incorrectamente como “español (es)”, y también tuvo una mala traducción posterior. Eso está rectificado. Estamos iterando con mejores indicaciones para las traducciones.

2 Me gusta

Recibí este error al instalar el plugin discourse-translator. Mi versión de discourse es 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)

¿Cómo puedo solucionarlo?

1 me gusta

Hola, el error puede mitigarse actualizando Discourse primero antes de instalar el plugin.

El método register_topic_preloader_associations ha sido promovido de protegido a público.

4 Me gusta

Gracias, instalé con éxito después de actualizar Discourse a la última versión.

2 Me gusta