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

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

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

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

Discourse предоставляет вам доступ к нескольким функциям локализации, которые можно настроить по адресу:

  • <your-site-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

Откуда приходят ваши пользователи

Более хорошим решением, если у вас включены События просмотров страниц браузера (настройка сайта), является этот запрос, который показывает, из какой страны ваш пользователь:

SELECT
  e.country_code AS country_code,
  COUNT(*) AS pageviews
FROM browser_pageview_events e
WHERE e.country_code IS NOT NULL
  AND e.country_code <> ''
GROUP BY e.country_code
ORDER BY pageviews DESC
Пример результатов

Настройка

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

В <your-site-url>/admin/site_settings/category/content_localization начните настройку.

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

Переключатель языка

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

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

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

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

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

Автоматический перевод с Discourse AI :sparkles:

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

Как администратор, вы захотите перейти в наш специальный раздел в Discourse AI для Переводов. Этот специальный раздел охватывает:

  • прогресс перевода
  • настройки AI
  • настройки языка приложения

Чтобы охватить некоторые важные настройки и рекомендации:

  • AI translation backfill hourly rate - эта настройка по умолчанию равна 50 - ваш сайт будет переводить 50 постов, 50 тем, 50 категорий, 50 тегов в час, на локали, которые вы установили в Content localization supported locales. Держите это число низким при начале работы.
  • AI translation category scope - по умолчанию Публичные категории. Вы можете изменить это на все категории или конкретный выбор.
  • AI translation personal messages и AI translation include bot content являются самоочевидными.
  • AI translation backfill start date - это значение пусто по умолчанию. Если вы включите функцию AI перевода “сегодня”, дата автоматически установится на “сегодня - 5 дней”
  • AI translation post raw translator agent (и другие агенты) - В более формальных сообществах администраторы могут выбрать создание собственного агента. Это позволяет вам установить промпт, который более точно настроен на язык или словарь, который вы предпочитаете.

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

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

Поскольку локализация является основной функцией в 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 включена по умолчанию и позволяет авторам постов локализовать свой собственный контент, используя то же меню поста, что и выше.
настройка меню поста

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

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

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

Пользовательская локализация боковой панели

Разделы боковой панели, которые “видны всем”, также показывают дополнительные элементы управления переводами:

Краулеры

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

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

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

Мы тщательно протестировали эту функцию и можем подтвердить, что мы правильно индексируемся после введения 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:
  • У вас должен быть рабочий LLM для каждого агента перевода

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

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

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

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

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


25 лайков
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
Übersetzung wie hier auf Meta
Anonymous user language selector for Discourse
Update or Replace Header Locale Selector for New Discourse Header (widgets-end-of-life) – Is Built-in Support Available?
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`?
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
AI translation of all PMs
Content localization language switcher doesn't work
This Meta Branded theme is special. Can I use it on my forum too?
Feature Request: Translation of FAQ/Terms of Service/Privacy
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 запущенной постоянно.