Каждое сообщение переводится только один раз для каждой локали, что экономит ваши
Обратите внимание, что определение языка также выполняется один раз для каждого сообщения. Будьте осторожны при включении этой функции на старых и крупных форумах.
Токен доступа кэшируется на стороне сервера для более быстрого перевода.
По умолчанию переводы ограничены 3 запросами в минуту (администраторы могут изменить это значение).
Выберите Включить API и найдите Google Cloud Translator API. Найдите кнопку enable (включить) и нажмите её, чтобы активировать API. Обратите внимание, что у API Google Translator нет бесплатного тарифа, поэтому может потребоваться включить биллинг.
После завершения нажмите на Credentials (Учетные данные) в левом меню.
Нажмите create credentials (создать учетные данные) и выберите API key (Ключ API). Скопируйте ключ API и вставьте его в настройку сайта translator google api key в Discourse.
В Discourse перейдите в Администрирование > Настройки > Основные настройки и включите параметр allow user locale.
Настройки
Название
Описание
translator enabled
Разрешить встроенный перевод сообщений.
translator
Провайдер сервиса перевода.
translator azure subscription key
Ключ подписки Azure
translator azure region
Регион Azure
translator azure custom subdomain
Требуется при использовании виртуальной сети или брандмауэра для Azure Cognitive Services. Примечание: вводите только пользовательское поддоменное имя, а не полный пользовательский конечный пункт.
translator aws region
Регион AWS
translator aws key id
ID ключа AWS
translator aws secret access
Секретный ключ доступа AWS
translator aws iam role
Роль AWS IAM
translator google api key
Ключ API Google
translator yandex api key
Ключ API Yandex
translator libretranslate endpoint
Конечный пункт LibreTranslate
translator libretranslate api key
Ключ API LibreTranslate
max translations per minute
Количество переводов в минуту, которое может выполнить обычный пользователь.
restrict translation by group
Разрешить перевод только для групп из белого списка.
restrict translation by poster group
Разрешить перевод только сообщений, созданных пользователями из белого списка.
Известные проблемы
Не переводит текст внутри опросов, созданных плагином discourse-poll.
Изображения увеличиваются при переводе.
Размещено нами? Этот плагин доступен в нашем плане Enterprise.
Я использую саморазмещённую версию LibreTranslate, которая раньше работала отлично, но сейчас я получаю множество повторяющихся ошибок «Job exception: The translator service is currently not available» (Исключение задания: сервис перевода в настоящее время недоступен). Я проверил URL-адрес, который раньше работал без проблем. Если открыть этот URL, страница веб-интерфейса LibreTranslate отображается корректно. API-токен не требуется, так как мой экземпляр LibreTranslate является приватным и не доступен из интернета.
Вот трассировка стека:
Сообщение (548 дубликатов)
Исключение задания: сервис перевода в настоящее время недоступен.
Трассировка стека
/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» пока недоступен в «Discourse». Однако перевод на «Hindi» доступен через другие сервисы (я использую «Microsoft Azure»).
Как тогда настроить автоматический перевод всех/любых постов, не на «Hindi», на «Hindi», даже если интерфейс Discourse остаётся на английском? Возможно ли это вообще?
Я подумываю о добавлении этого переводчика на наш форум. Однако у меня есть два основных опасения:
1. Можно ли изменять переводы?
Я хочу убедиться, что определённые термины переводятся нужным образом. Для этого мне нужна возможность просматривать доступные переводы и при необходимости вносить в них изменения.
2. Когда пост будет переведён заново?
Некоторые сообщения на форуме редактируются довольно часто. Как мне гарантировать, что каждая исправленная опечатка не приведёт к непомерным затратам на перевод? Кроме того, как обеспечить, чтобы новые изменения точно отражались в переводах?
Полагаю, это невозможно, так как потребовалось бы вмешательство на уровне поставщика услуг (Microsoft/Google). Если только переведённый контент не подпадает под функцию замены слов, тогда можно воспользоваться ею.
Вот предложение по улучшению:
Автоматически переводить первый пост на английский язык, если он написан на другом языке.
Добавить кнопку для перевода всей темы сразу.
Включить функцию автоматического перевода для всего форума на уровне пользователя. Это означает, что если пользователь укажет в своём профиле, что он говорит, например, только на румынском, то весь контент будет переводиться на румынский. Если он укажет, что владеет несколькими языками, посты будут переводиться только в том случае, если они не на этих языках.
Уведомление на вашем скриншоте использует оригинальное название темы вашего поста, поэтому сейчас оно «верное». В будущем мы обеспечим перевод уведомлений (названий тем).
Что касается поста выше, наша машинная система перевода дала сбой: пост был ошибочно определен как «испанский (es)», а затем переведён некорректно. Это исправлено. Мы работаем над улучшением переводов, используя более качественные промпты.
Я получил эту ошибку при установке плагина 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)