Tradutor do Discourse

:discourse2: Resumo Discourse Translator traduz publicações no Discourse usando as APIs de tradução da Microsoft, Google ou Yandex.
:hammer_and_wrench: Link do Repositório https://github.com/discourse/discourse-translator
:open_book: Guia de Instalação Como instalar plugins no Discourse

Recursos

  • Cada publicação é traduzida apenas uma vez por locale, o que economiza :moneybag:
    • Observe que a detecção de idioma também é executada apenas uma vez para cada publicação. Tenha cuidado ao habilitar isso em fóruns antigos e grandes.
  • O Access Token é armazenado em cache no lado do servidor para traduções mais rápidas.
  • As traduções têm limite de taxa de 3 por minuto por padrão (administradores podem configurar esse valor)

Serviços de Tradução Suportados

Etapas de Configuração

Microsoft
  1. Siga as etapas em Microsoft Translator API no Azure para obter uma chave de assinatura. Você pode escolher qualquer uma das ofertas de assinatura disponíveis.

  2. No seu Discourse, em Admin > Configurações > Plugins, insira a chave de assinatura que você obteve nas etapas acima.

  1. No seu Discourse, em Admin > Configurações > Configuração Básica, habilite allow user locale.
Google Translator
  1. Acesse https://console.developers.google.com

  2. Clique em My Project

  1. Clique no :heavy_plus_sign: para criar um novo projeto

  1. Insira o nome do seu projeto e clique em criar

  2. Selecione Enable API e pesquise por Google Cloud Translator API. Procure o botão enable e clique nele para habilitar a API. Observe que não há nível gratuito para a Google Translator API, então pode solicitar que você ative a cobrança.

  3. Quando terminar, clique em credentials no menu à esquerda

  1. Clique em create credentials e selecione API key. Copie a API Key e cole na configuração do site translator google api key no Discourse.

  2. No Discourse, em Admin > Configurações > Configuração Básica, habilite allow user locale.

Configurações

Nome Descrição
translator enabled Permitir tradução inline de publicações.
translator O provedor do serviço de tradução.
translator azure subscription key Chave de Assinatura do Azure
translator azure region Região do Azure
translator azure custom subdomain Necessário se estiver usando uma Rede Virtual ou Firewall para Serviços Cognitivos do Azure. Nota: Insira apenas o subdomínio personalizado, não o endpoint personalizado completo.
translator aws region Região da AWS
translator aws key id ID da Chave da AWS
translator aws secret access Chave de acesso secreto da AWS
translator aws iam role Função IAM da AWS
translator google api key Chave da API do Google
translator yandex api key Chave da API do Yandex
translator libretranslate endpoint Endpoint do LibreTranslate
translator libretranslate api key Chave da API do LibreTranslate
max translations per minute O número de traduções por minuto que um usuário regular pode realizar.
restrict translation by group Apenas grupos na lista de permissões podem traduzir
restrict translation by poster group Permitir apenas a tradução de publicações feitas por usuários na lista de permissões

Problemas Conhecidos

  • Não traduz texto dentro de enquetes geradas pelo plugin discourse-poll.
  • As imagens são ampliadas ao traduzir.

:discourse2: Hospedado por nós? Este plugin está disponível em nosso plano Enterprise.

103 curtidas
Advice for bilingual communities
Inline translation of posts into another language
Language Translation
Can we have have one post with two different language
Plugin for signatures?
Translate plugin installed, but no translate button
LibreTranslate Plugin -- Free and Open Source Translation API
Discourse Translator plugin is not showing for non-logged in users
What exactly are the effects of "allow user locale"
DeepL integration for Translator plugin
How do you use Discourse AI? Tell us and make it even better!
How do I get the forum here in German
Is Google translate really so expensive?
Anyone migrated to version 3 of Microsoft Translator API yet?
Moving up the translator icon
Image zoom is not working
Translating text in polls
Yandex Translation Service
Anyone Using Discourse Translator Plugin on small forum, Cost/month?
FYI, Full translation of Discourse including posts is possible
Mute ALL other languages
How to install a plugin on Discourse-hosted-Discourse?
Make a multi-language forum
How to handle users that don't really read the answers they get?
Localized email templates
Translates to user's local language
DeepL integration for Translator plugin
Javascript pop up block help
No errors, instance not coming back up after rebuild
DeepL support for Discourse Translator
Getting user profile custom field via JS
Google Translate shows "blank" page
What exactly are the effects of "allow user locale"
Virtual Keyboard hides critical editor buttons for 3.3.0-beta
Translation from Lugandan yields uncaught 500 error (in a different Discourse)
Is Automatic Translation for Most Content Now Official?
Everything is translated, help!
Virtual Keyboard hides critical editor buttons for 3.3.0-beta
Translation support about the topic content
Translates to user's local language
Structuring a multilingual community
Translate email notifications and digests into user preferred locale language
Implementing In-House Translation Features on Discourse
Include translated posts in search?
Translate email notifications and digests into user preferred locale language
Changing default language will not change the site TITLE or DESCRIPTION!
Yandex Translation Service
Simple idea for translator-assisted bilingual forum
MKJ's Opinionated Discourse Deployment Configuration
Help which plugin is in the screenshot
Übersetzung wie hier auf Meta

Uma postagem foi dividida em um novo tópico: Estou procurando uma solução para usar um LLM para traduzir as postagens principais do meu fórum

Uma postagem foi dividida em um novo tópico: Adicionando uma opção para uma configuração separada para o serviço de detecção de idioma

Uma postagem foi dividida em um novo tópico: Os fóruns hospedados pelo Discourse usam uma instância local do LibreTranslate?

Estou usando o LibreTranslate auto-hospedado, que funcionou bem no passado, mas agora estou recebendo muitos erros repetidos de "Exceção de trabalho: O serviço de tradução não está disponível no momento". Verifiquei o URL, que tem funcionado bem no passado. Se eu acessar o URL, a página web do LibreTranslate é exibida. Não é necessária API/token porque minha instância do LibreTranslate é privada e não tem acesso à Internet.

O backtrace mostra:

Mensagem (548 cópias relatadas)

Exceção de trabalho: O serviço de tradução não está disponível no momento.

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'

Alguma ideia de como posso consertar isso?

2 curtidas

A opção de localidade ‘Hindi’ ainda não está disponível no ‘Discourse’. Mas a tradução para ‘Hindi’ está disponível por meio de diferentes serviços (estou usando o ‘Microsoft Azure’).

Então, como podemos configurar para traduzir todas/quaisquer postagens não em Hindi para ‘Hindi’, mesmo quando a interface do Discourse continuar em inglês? Isso é possível?

1 curtida

Tentando postar esta pergunta em seu fórum de discussão também.

3 curtidas

Estava pensando em adicionar este tradutor ao nosso fórum. No entanto, tenho duas preocupações principais:

1. É possível alterar as traduções?
Quero garantir que certos termos sejam traduzidos de uma maneira específica. Para isso, preciso ter a capacidade de visualizar as traduções disponíveis e fazer alterações, se necessário.

2. Quando uma postagem será ‘traduzida novamente’?
Algumas postagens do fórum são editadas com bastante frequência. Como posso garantir que cada erro de digitação corrigido não resulte em custos de tradução exorbitantes? Além disso, como posso garantir que as novas alterações sejam atualizadas com precisão nas traduções?

3 curtidas

Acredito que isso não seja possível, pois você teria que modificar no nível do fornecedor (Microsoft/Google). A menos que o conteúdo traduzido esteja sujeito ao recurso de substituição de palavras, então você pode usá-lo.

Aqui está uma solicitação de recurso:

  1. Traduzir automaticamente a primeira postagem para o inglês caso esteja escrita em um idioma diferente.
  2. Ter um botão para traduzir todo o tópico de uma vez.
  3. Ter o recurso de tradução automática habilitado para todo o fórum em nível de usuário. Ou seja, se o usuário selecionar em seu perfil que fala apenas, por exemplo, romeno, então todo o conteúdo será traduzido para o romeno. Se ele selecionar que fala vários idiomas, as postagens só serão traduzidas se não estiverem nesses idiomas.
2 curtidas

Como administrador do site, fiquei surpreso ao ler isto:

Onde está essa configuração oculta? :smiling_face_with_sunglasses:

1 curtida
./launcher enter app
rails c
SiteSetting.automatic_translation_backfill_rate = <valor desejado>
exit
exit

Mas acho que isso não existe mais, em versões mais recentes de qualquer forma.

2 curtidas

Como você aprende essas coisas? :sweat_smile: Ok, obrigado! Vou aguardar uma resposta da equipe, para ter certeza.

1 curtida

Duas maneiras: usando a pesquisa e ask.discourse.com

3 curtidas
3 curtidas

Notificações do tópico intitulado que foi traduzido não parecem ser traduzidas na barra de notificações:

1 curtida

Além disso, minha postagem foi traduzida para o idioma incorreto em um link?


Olhando no editor, foi o que eu realmente escrevi:

Notei que o oneboxing também não funcionou quando traduzi.

1 curtida

A notificação na sua captura de tela usa o título original do tópico da sua postagem, então ela está “correta” por enquanto. Garantiremos que as notificações (títulos de tópicos) sejam traduzidas no futuro.

Quanto à postagem acima, nossa tradução automática estava com problemas e foi incorretamente detectada como “espanhol (es)”, além de ter uma tradução ruim subsequente. Isso foi corrigido. Estamos iterando com melhores prompts para traduções.

2 curtidas

Tive este erro ao instalar o plugin discourse-translator. Minha versão do discourse é 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)

Como posso consertar isso?

1 curtida

Olá, o erro pode ser mitigado atualizando o Discourse primeiro antes de instalar o plugin.

O método register_topic_preloader_associations foi promovido de protegido para público.

4 curtidas

Obrigado, instalei com sucesso após atualizar o Discourse para a versão mais recente.

2 curtidas