مترجم 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 إعجاب

تم تقسيم منشور إلى موضوع جديد: أبحث عن حل لاستخدام نموذج لغوي كبير لترجمة أهم منشورات منتداي

تم تقسيم مشاركة إلى موضوع جديد: إضافة خيار لتكوين منفصل لخدمة اكتشاف اللغة

تم تقسيم مشاركة إلى موضوع جديد: هل تستضيف منتديات ديسكورس مثيلًا محليًا لـ LibreTranslate؟

أنا أستخدم LibreTranslate المستضاف ذاتيًا والذي عمل بشكل جيد في الماضي، ولكني الآن أتلقى الكثير من أخطاء “Job exception: The translator service is currently not available” المتكررة. لقد تحققت من عنوان URL الذي كان يعمل بشكل جيد في الماضي. إذا قمت بالوصول إلى عنوان URL، فستعرض صفحة الويب LibreTranslate. لا توجد حاجة لواجهة برمجة التطبيقات/رمز مميز لأن مثيل LibreTranslate الخاص بي خاص ولا يمكن الوصول إليه من الإنترنت.

تُظهر تتبع المكدس:

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'

هل لديك أي أفكار حول كيفية إصلاح هذا؟

إعجابَين (2)

خيار اللغة ‘الهندية’ غير متاح في ‘Discourse’ بعد. ولكن الترجمة ‘الهندية’ متاحة عبر خدمات مختلفة (أنا أستخدم ‘Microsoft Azure’).

إذًا، كيف يمكننا الإعداد لترجمة جميع المشاركات غير الهندية / أي مشاركات غير هندية إلى ‘الهندية’ حتى عندما تستمر واجهة Discourse باللغة الإنجليزية؟ هل هذا ممكن حتى؟

إعجاب واحد (1)

أحاول نشر هذا السؤال عبر المنتديات إلى منتدى المناقشة الخاص بهم أيضًا.

3 إعجابات

كنت أفكر في إضافة هذا المترجم إلى منتدانا. ومع ذلك، لدي شاغلان رئيسيان:

1. هل من الممكن تغيير الترجمات؟
أريد التأكد من ترجمة مصطلحات معينة بطريقة محددة. لهذا، أحتاج إلى القدرة على عرض الترجمات المتاحة وإجراء التغييرات إذا لزم الأمر.

2. متى سيتم “إعادة ترجمة” المنشور؟
يتم تحرير بعض منشورات المنتدى بشكل متكرر. كيف يمكنني التأكد من أن كل خطأ إملائي مصحح لا يؤدي إلى تكاليف ترجمة باهظة؟ بالإضافة إلى ذلك، كيف يمكنني التأكد من تحديث التغييرات الجديدة بدقة في الترجمات؟

3 إعجابات

أعتقد أن هذا قد لا يكون ممكنًا، حيث سيتعين عليك التعديل على مستوى البائع (Microsoft/Google). إلا إذا كان المحتوى المترجم يخضع لميزة استبدال الكلمات، فيمكنك استخدامها.

إليك طلب ميزة:

  1. ترجمة المنشور الأول تلقائيًا إلى الإنجليزية في حال كان مكتوبًا بلغة مختلفة.
  2. وجود زر لترجمة الموضوع بأكمله دفعة واحدة.
  3. تمكين ميزة الترجمة التلقائية للمنتدى بأكمله على مستوى المستخدم. بمعنى، إذا اختار المستخدم في ملفه الشخصي أنه يتحدث الرومانية فقط، على سبيل المثال، فسيتم ترجمة جميع المحتويات إلى الرومانية. إذا اختار أنه يتحدث لغات متعددة، فسيتم ترجمة المنشورات فقط إذا لم تكن بهذه اللغات.
إعجابَين (2)

بصفتي مسؤول الموقع، فوجئت بقراءة هذا:

أين يوجد هذا الإعداد المخفي؟ :smiling_face_with_sunglasses:

إعجاب واحد (1)
./launcher enter app
rails c
SiteSetting.automatic_translation_backfill_rate = <القيمة المطلوبة>
exit
exit

ولكن أعتقد أنه لم يعد موجودًا، على الأقل في الإصدارات الأحدث.

إعجابَين (2)

كيف تتعلم هذه الأشياء؟ :sweat_smile: حسنا، شكرا لك! سأنتظر ردا من الفريق، للتأكد.

إعجاب واحد (1)

طريقتان: باستخدام البحث و ask.discourse.com

3 إعجابات
3 إعجابات

لا تظهر الإشعارات الخاصة بالموضوع المترجم في شريط الإشعارات:

إعجاب واحد (1)

هل تم ترجمة منشوري أيضًا إلى اللغة غير الصحيحة عبر رابط؟


بالنظر إلى المحرر، هذا ما كتبته بالفعل:

لاحظت أن oneboxing لم يعمل أيضًا عند الترجمة.

إعجاب واحد (1)

يستخدم الإشعار في لقطة الشاشة الخاصة بك العنوان الأصلي لموضوع منشورك، لذا فهو “صحيح” في الوقت الحالي. سنتأكد من ترجمة الإشعارات (عناوين الموضوع) في المستقبل.

بالنسبة للمنشور أعلاه، كانت الترجمة الآلية لدينا تواجه مشكلة وتم اكتشافها بشكل غير صحيح على أنها “إسبانية (es)”، كما حدثت ترجمة سيئة لاحقة. تم تصحيح ذلك. نحن نكرر ذلك بمطالبات أفضل للترجمات.

إعجابَين (2)

لقد تلقيت هذا الخطأ عند تثبيت إضافة discourse-translator. إصدار 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)

كيف يمكنني إصلاح ذلك؟

إعجاب واحد (1)

مرحبًا، يمكن التخفيف من الخطأ عن طريق تحديث Discourse أولًا قبل تثبيت الإضافة.

تم ترقية طريقة register_topic_preloader_associations من محمية إلى عامة.

4 إعجابات

شكرا، لقد نجحت في التثبيت بعد ترقية Discourse إلى أحدث إصدار.

إعجابَين (2)