Локализация контента: ручная и автоматическая с помощью Discourse AI

В этой теме мы подробно рассмотрим функции локализации контента и способы их включения. Функции разделены на две части: то, что доступно по умолчанию в Discourse, и Discourse AI для автоматических переводов.

:warning: Для быстрого доступа к соответствующим разделам используйте заголовки вики :backhand_index_pointing_right:t2:

Локализация контента вашего сообщества

Обновленная версия Discourse (3.5.0.beta7-dev) предоставляет доступ к нескольким функциям локализации, которые можно настроить по адресу:

  • <ваш-url-сайта>/admin/site_settings/category/content_localization
Новая локализация контента в настройках сайта 📸

Получение информации о пользователях

Сначала полезно получить некоторую информацию о вашем сообществе. Следующий запрос к Data Explorer поможет понять, сколько пользователей установили свой локаль в разделе /my/preferences/interface.

SELECT locale, count(*) as count
FROM users
WHERE (locale IS NOT null AND locale <> '')
GROUP BY locale
ORDER BY count DESC
Пример результатов из Data Explorer

Настройка поддерживаемых сообществом локалей

С полученной выше информацией мы теперь лучше понимаем, какие локали должно поддерживать ваше сообщество.

В разделе <ваш-url-сайта>/admin/site_settings/category/content_localization вы можете выбрать поддерживаемые локали.

  • Content localization enabled — включает функцию замены оригинального пользовательского контента на локализованный. Читайте дальше, чтобы узнать об автоматическом и ручном режимах локализации.
  • Content localization supported locales — список языков, поддерживаемых вашим сайтом.
  • Content localization crawler param — описано в разделе о роботах ниже.
  • Content localization language switcher — описано ниже.
Список локалей в настройках сайта 📸

Включение последующей настройки Content localization language switcher также позволяет сделать ваше сообщество более доступным для пользователей, не вошедших в систему, показывая список выбранных вами языков в перечне поддерживаемых локалей:

Переключатель языков в правом верхнем углу страницы

Просмотр локализованного контента


Локализованная тема приветствия на meta.discourse.org

Для зрителей локализованного контента (все посетители сайта) они могут навести курсор на индикатор рядом с датой публикации, чтобы увидеть оригинальный язык поста. Этот индикатор отображается только в том случае, если пост не на их языке.

Если пользователь хочет видеть только оригинальный контент, он может использовать переключатель над временной шкалой темы, чтобы отключить локализацию для всего сайта.

Автоматические переводы с помощью Discourse AI :sparkles:

Discourse AI — это витамины, необходимые для функции локализации, которые избавляют от необходимости делать переводы вручную.

Как администратор, вам следует перейти в новый раздел функций ИИ для Перевод.

Функции Discourse AI в настройках администратора 📸

Прокрутите вниз в разделе /admin/plugins/discourse-ai/ai-features

Некоторые важные настройки и рекомендации:

  • AI translation backfill hourly rate — эта настройка по умолчанию равна 50. Предполагая ставку 50, ваш сайт будет переводить 50 постов, 50 тем и 50 категорий в час на локали, указанные в Content localization supported locales. При начале работы держите это значение низким.
  • AI translation target categories — по умолчанию не выбрано ни одной категории. Переводится только контент в выбранных категориях. Подкатегории должны быть добавлены отдельно. Оставьте пустым, чтобы отключить перевод тем в категориях.
  • AI translation personal messages — по умолчанию none. Контролирует, какие личные сообщения переводятся. ‘none’ отключает перевод личных сообщений. ‘group’ переводит только групповые личные сообщения. ‘all’ переводит все личные сообщения.
  • AI translation include bot content — по умолчанию false. При включении переводятся также посты от пользователей-ботов (user id < 0). По умолчанию контент ботов исключается из перевода.
  • AI translation max post length — по умолчанию 10000. Это мера предосторожности, предотвращающая перевод постов выше определенной длины.
  • AI translation backfill max age days — по умолчанию 5. Это означает, что темы и посты старше 5 дней не будут переведены. Вы можете увеличить это значение до большого числа, чтобы перевести все темы и посты.
  • AI translation post raw translator agent (и другие агенты) — в более формальных сообществах администраторы могут создать собственного агента. Это позволяет установить промпт, более точно настроенный под предпочитаемый вами язык или лексику.

Вы можете обратиться к AI bot - Agents, чтобы узнать, как настроить подходящих агентов и уточнить промпты для каждой функции.

Прогресс перевода

Вы можете найти больше информации о прогрессе автоматических переводов на графике “Прогресс перевода” в разделе /admin/plugins/discourse-ai/ai-translations.

Этот график появится, если:

  • у всех агентов перевода есть валидная LLM
  • discourse ai enabled :check_mark:
  • ai translation enabled :check_mark:
  • content localization supported locales заполнен
  • ai translation backfill max age days больше 0
  • ai translation backfill hourly rate больше 0

Ручная локализация

Поскольку локализация является основной функцией в Discourse, мы предоставляем возможность заполнять и редактировать локализации вручную в случае недоступности автоматических переводов с помощью Discourse AI.

По умолчанию администраторы и модераторы настроены на редактирование локализаций.

Разрешенные группы для локализации в настройках сайта 📸


Настройка сайта администратора для локализации контента

В настоящее время поддерживаются локализации содержимого постов, заголовков тем, названий категорий, описаний категорий и тегов. Следующие разделы ниже покажут, как они работают.

Локализация категорий

Локализованные категории видны в следующих областях, при этом название и описание категории локализованы:

Места, где локализованы категории 📸
  1. Главная страница, боковая панель и выпадающий список категорий
  1. Страница категорий
  1. Конкретная категория с подкатегориями

Как администратор, вы должны иметь возможность получить доступ к настройкам категории как обычно и найти новый элемент навигации “Локализации” слева.

Редактирование локализаций категорий в настройках категории 📸

Локализация тем и постов

Из скриншотов выше в разделе Локализация категорий вы могли заметить, что заголовки тем и отрывки также локализованы.

Существуют некоторые предварительные настройки:

  • Убедитесь, что ваш пользователь находится в группе content localization allowed groups.
  • Кнопка addTranslation автоматически добавляется в post menu и post menu hidden items, когда включена настройка Content localization enabled. Это позволяет отображать значок :globe_with_meridians: в меню поста для пользователей из content localization allowed groups.
  • Content localization allow author localization включена по умолчанию и позволяет авторам постов локализовать свой собственный контент, используя то же меню поста, что и выше.
3 настройки сайта 📸


:backhand_index_pointing_down:t2:

Опять же, список языков, которые можно локализовать, находится в настройке Content localization supported locales, упомянутой выше.

Редактирование локализованного поста

В случае, если пользователь просматривает локализованный пост и хочет его отредактировать, появится диалоговое окно с вопросом, какую версию они предпочитают редактировать:

После выбора появится соответствующий редактор.

Удаление перевода поста для определенного локала

Если вы правильно следовали инструкциям выше относительно настройки post menu, вы должны иметь возможность сделать следующее, если находитесь в группе Content localization allowed groups:

Роботы (Crawlers)

Вы можете разрешить роботам видеть ваш сайт на различных языках, настроенных в Content localization supported locales. Настройка сайта находится в разделе “Локализация контента” под названием Content localization crawler param:

Результатом будет то, что роботы увидят следующее, где для каждого поддерживаемого языка есть соответствующий hreflang в заголовке каждой темы:

Для дополнительной проверки / подтверждения

Мы extensively протестировали эту функцию и можем подтвердить, что после внедрения X количества поддерживаемых языков мы правильно индексируемся.

Часто задаваемые вопросы (FAQ)

Я всё настроил, но автоматический перевод всё еще не работает
Убедитесь, что у вас настроено следующее:

  • Content localization supported locales содержит хотя бы один язык
  • Content localization enabled :check_mark:
    • Allow user locale :check_mark: (включено по умолчанию)
    • Set locale from cookie :check_mark:
  • Ai translation enabled :check_mark:
  • Ai translation backfill max age days не равен 0
  • Ai translation backfill hourly rate больше 12
  • У вас должен быть настроен рабочий LLM для каждого агента перевода

Если ничего не помогает, вы можете включить SiteSetting.ai_translation_verbose_logs.

Переводится ли каждый пост?
Если AI translation backfill limit to public content :check_mark:, то все посты в публичных категориях будут переведены. По умолчанию посты ботов (user id < 0) исключаются, если не включена настройка AI translation include bot content.

Сохраняются ли автоматические переводы или они отправляются в LLM каждый раз, когда кто-то просматривает тему?
Переводы сохраняются; каждый пост отправляется только один раз для каждого языка, и переводы используются повторно.

Если мой форум поддерживает английский и японский (через Content localization supported locales), и кто-то пишет на испанском, будет ли его пост переведен?
Да. Все темы и посты будут переведены на английский и японский, независимо от языка написания.

Если оригинальный пост отредактирован, будет ли он переведен заново?
Да — максимум 2 раза в день. При редактировании поста он отправляется на повторный перевод с задержкой, равной большему из 5 минут или SiteSetting.editing_grace_period, чтобы учесть быстрые правки. Авторизованные пользователи из Content localization allowed groups имеют возможность отправить пост на повторный перевод немедленно.

Будут ли удалены переводы, если я изменю Агента или LLM?
Нет, переводы обычно сохраняются при изменении настроек, если они явно не удалены через элемент меню поста или редактор переводов.


24 лайка
Content Localization and Automatic Translations for Your Community
I can't find discourse AI as a provider in the discourse translator plugin
2 language site
Machine-translate messages so users can read without knowing sender's language
Update or Replace Header Locale Selector for New Discourse Header (widgets-end-of-life) – Is Built-in Support Available?
Anonymous user language selector for Discourse
Übersetzung wie hier auf Meta
Translate Discourse automatically (without a button)
Help which plugin is in the screenshot
About auto translation
Auto Country Translation
How to Add Automatic Multilingual Translation Interface in Discourse?
3.6.0.beta2: Built-in palette editing, live AI translation progress, and better wiki tracking
The usage problem after using AI translation
AI translation backfill not working after all settings configured
AI translation backfill not working after all settings configured
Single post/header only partially translated -issue
Language Switcher Problem, Not Translating Posts
配置好 ai 翻译后,帖子已经被自动翻译,但是在帖子顶部和右侧没有显示语言切换按钮
Feature Request: Allow Users to Localize Only Their Own Topics
How to configure ai translate of `Ai translation backfill hourly rate`?
AI translation of all PMs
Seeking experience: Supporting a multilingual Discourse community
Ongoing translation in threads
I need help to configure LLM DeepSeek R1 0528 - free for Automatic translations with Discourse AI
I need help to configure LLM DeepSeek R1 0528 - free for Automatic translations with Discourse AI
Not sure how to juggle languages while setting up my francophone community
Structuring a multilingual community
Why is Discourse AI translation not working
How to set up Discourse AI for internal-only usage
Single post/header only partially translated -issue
Header Locale Selector
为啥的布署的discourse不支持修改语言
Topic list is shown in a language (DE) but has one (DE) topic not translated
If topic info is too long, tags are cut off and create a blank line
Content Localization and Automatic Translations for Your Community
Images break when the page is auto-translated by a browser translation extension (S3/R2 + CDN is configured correctly)
Bearbeitung von Übersetzen Beiträgen verbessern
Why Is the Discourse AI Translation Icon Not Appearing?
Why are posts in Swedish un-translated to Finnish, default locale?
Discourse AI Translator, Planet Icon Missing
Language switcher and language content
Multilingual user feedback on Automatic Translations
Sharing approaches to using automation to send messages to members

Есть ли какие-либо рекомендации по выполнению этого действия массово для существующих категорий? В худшем случае, возможно, через API?

2 лайка

Хм, отличный вопрос. Я позабочусь о том, чтобы документация API для конечной точки обновления категории была обновлена. :memo:

4 лайка

Будет ли поддержка модераторов (переводчиков) для каждого языка? Я думаю о meta, где я мог бы добровольно проверять посты на конкретном языке и вручную обновлять их. Особенно документацию, которая могла бы выиграть от человеческого подхода. Но вы говорите, что это могут делать только модераторы, а я, вероятно, никогда не стану модератором.

3 лайка

Хм, интересное предложение. Думаю, это можно реализовать, но нам нужно продумать детали настройки.

У нас сейчас есть следующее, но позвольте мне проверить, можно ли расширить это до группы под названием «локализационные модераторы».

3 лайка

Как получить к ней доступ? Можете ли вы предоставить команду?

Есть ли у Sidekiq связанная задача? Можно ли запустить её вручную?

1 лайк
2 лайка

В дополнение к посту Moin выше: после входа в консоль достаточно использовать SiteSetting.ai_translation_backfill_hourly_rate. Задача выполняется каждые пять минут, с учётом соответствующих ограничений по частоте запросов.

3 лайка

Я вижу, что в документации теперь доступна локализация. Спасибо @nat!

3 лайка

Это замечательно, спасибо команде! Я прямо сейчас тестирую и поделюсь своими мыслями и общим впечатлением.

*При переходе с плагина Discourse Translator мы не видим эсперанто.

Можно ли просто добавить его, или сначала нужно реализовать поддержку в discourse-languages?*

Вау, вы очень оперативно — я как раз собирался сообщить об этом здесь. :laughing:

Да, отчасти. Мы стремимся к полноценному локализованному опыту, где элементы управления (кнопки, метки и т. д.) корректно и достаточно (70% — это было бы отлично) переведены через Crowdin (см. Translations - Discourse Meta), и тогда мы сможем оказывать поддержку этому языку.

2 лайка

Работает ли локализация контента с категориями документации? Мне кажется, что содержимое боковой панели не переводится, даже если я локализую индексную тему.

Также я заметил странное поведение. Когда я просматриваю локализованную тему на исходном языке и обновляю страницу, она переключается на локализованную версию. Мне приходится вручную переключаться обратно на исходную версию.

3 лайка

Отличное замечание, да, это пока не работает, но @nat это отслежит!

Интересно, не станет ли это толчком к созданию более удачной абстракции или модели данных для ссылок на документы в боковой панели.

2 лайка

Да, всё верно — во многих местах Discourse потребуется явный перевод, поэтому я фиксирую их по мере обнаружения. Совсем недавно мы локализовали уведомления для заголовков тем. Вот пример темы-предложения, которую я создал: Show translated user bios.

Я создам новую тему и отмечу вас (@), чтобы убедиться, что мы охватим все аспекты боковой панели.

РЕДАКТИРОВАНИЕ: @tvavrda уже затронул эту тему здесь — Translate sidebar documentation links. Пожалуйста, посмотрите и скажите, имеет ли это смысл.

Что вы имеете в виду под «переключиться обратно»?

Не могли бы вы в следующий раз, когда это произойдёт, поделиться видеозаписью (включая адресную строку)? :folded_hands:t2: Если контент не подходит для публикации, не стесняйтесь написать мне в личные сообщения. Также, были ли вы авторизованы? Технически говоря, эти вещи отслеживаются через куки, поэтому для меня это немного загадочно.

1 лайк

Отправил вам видео.

Ещё одно замечание — я не вижу разницы в переведённом контенте, верно? Это могло бы быть полезно, если в нём будут обновления. Не очень важно, но, думаю, логично.

И ещё — обратные ссылки под темой не показывают локализованное название темы.

И вопрос: в чём смысл локализации описаний категорий в настройках категорий? Описание категории должно браться из локализованной версии темы «О нас», не так ли? Локализованная версия не поддерживает markdown, поэтому я не могу добавить ссылку, которую хотел бы использовать.

В остальном всё работает превосходно! :heart: :heart: :heart:

1 лайк

Что ж… старый компонент GitHub - discourse/discourse-docs-sidebar · GitHub на самом деле поддерживает локализацию :slight_smile: Я временно переключился на него.

Да, это тоже в настоящее время не поддерживается, и реализация такой функции потребовала бы значительных усилий.

У нас есть небольшой цветовой индикатор (похожий на индикатор редактирования поста рядом с ним), который появляется, когда перевод может быть устаревшим из-за изменения версии поста.

1 лайк

Я также вижу непереведённый контент в аннотациях закрепленных тем. Таким образом, я вижу список тем на переведенном языке, но аннотация закрепленной темы отображается на оригинальном.

1 лайк

Мы можем вручную выполнять или исправлять переводы, но можем ли мы вручную запускать сборку переводов? Что-то вроде задачи по требованию.

Я думаю о следующем: я разрешил перевод тем, которым уже год. Но если этот год отсчитывается от текущей даты, то этот предел будет постоянно смещаться в сторону уже переведённого контента. Однако наибольший спрос возникает на старый ценный контент, который я хотел бы охватить быстро и без довольно медленных массовых действий.

Мне интересно, есть ли у кого-то данные о затратах после включения переводов? Наш сайт работает уже давно, и хотя я хотел бы, по возможности, перевести весь сайт, стоимость, безусловно, вызывает беспокойство. Поэтому, если у кого-то есть примерное представление о расходах из собственного опыта, например, 1000 постов за 1 доллар, это очень помогло бы составить примерную оценку затрат.

Локализация контента выполняется один раз и затем сохраняется где-то, то есть не по требованию? Если да, то что мешает мне запустить Ollama и какую-нибудь открытую большую языковую модель (LLM) на своём компьютере, например Llama 3 или Deepseek 3, и просто дать задаче выполниться до конца?

Редактирование: Я предполагаю, что это может помочь снизить первоначальные затраты на перевод, но для новых постов это не сработает, если только не решиться держать локальную LLM запущенной постоянно.