콘텐츠 로컬라이제이션 - Discourse AI를 활용한 수동 및 자동 처리

이 주제에서는 콘텐츠 로컬라이제이션(Content Localization) 기능과 이를 활성화하는 방법에 대해 안내해 드리겠습니다. 이 기능은 두 부분으로 나뉩니다: Discourse에서 기본적으로 제공되는 기능과, 자동 번역을 위한 Discourse AI입니다.

:warning: 관련 섹션에 빠르게 접근하려면 위키 제목을 사용하세요 :backhand_index_pointing_right:t2:

커뮤니티 콘텐츠 로컬라이제이션

Discourse는 다음 경로에서 설정할 수 있는 여러 로컬라이제이션 기능에 대한 접근성을 제공합니다:

  • <your-site-url>/admin/site_settings/category/content_localization
사이트 설정의 콘텐츠 로컬라이제이션 📸

준비

먼저, 데이터 탐색기(Data explorer)를 통해 커뮤니티에 대한 정보를 얻는 것이 좋습니다.

사용자 설정을 통한 로케일(Locale)

다음 쿼리는 /my/preferences/interface에서 로케일을 설정했을 가능성이 있는 사용자 수에 대한 아이디어를 제공할 수 있습니다.

SELECT locale, count(*) as count
FROM users
WHERE (locale IS NOT null AND locale <> '')
GROUP BY locale
ORDER BY count DESC
데이터 탐색기 샘플 결과

사용자 유입 지역

Browser pageview events enabled(사이트 설정)이 활성화되어 있다면, 사용자의 국가를 알려주는 다음 쿼리가 더 나은 솔루션입니다:

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는 로컬라이제이션 기능에 매우 필수적이며, 수동 번역의 필요성을 제거합니다.

관리자로서, Translations(번역)을 위한 Discourse AI의 전용 영역으로 이동해야 합니다. 이 전용 영역은 다음을 포함합니다:

  • 번역 진행 상황
  • AI 설정
  • 앱 언어 설정

중요한 설정 및 권장 사항 중 일부를 다루기 위해:

  • AI translation backfill hourly rate - 이 설정의 기본값은 50입니다 - 사이트는 시간당 50개의 게시글, 50개의 주제, 50개의 카테고리, 50개의 태그를 Content localization supported locales에서 설정한 로케일로 번역합니다. 처음 시작할 때는 이 수치를 낮게 유지하세요.
  • AI translation category scope - 기본값은 Public categories(공개 카테고리)입니다. 이를 모든 카테고리 또는 특정 선택으로 변경할 수 있습니다.
  • AI translation personal messagesAI 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. 하위 카테고리가 있는 특정 카테고리

관리자로서, 평소와 같이 카테고리 설정에 접근할 수 있으며 왼쪽에 새로운 “Localizations”(로컬라이제이션) 내비게이션 항목을 찾을 수 있습니다.

카테고리 설정에서 카테고리 로컬라이제이션 편집 📸

주제 및 게시글 로컬라이제이션

카테고리 로컬라이제이션의 스크린샷에서 주제 제목과 발췌문이 로컬라이즈되는 것을 확인했을 수 있습니다.

일부 사전 요구 설정이 있습니다:

  • 사용자가 content localization allowed groups에 있는지 확인하세요.
  • Content localization enabled가 켜지면 addTranslation 버튼이 자동으로 post menupost menu hidden items에 추가됩니다. 이를 통해 content localization allowed groups에 있는 사용자의 게시글 메뉴에 :globe_with_meridians: 가 표시되도록 합니다.
  • Content localization allow author localization은 기본적으로 활성화되어 있으며, 게시글 작성자가 위의 게시글 메뉴를 사용하여 자신의 콘텐츠를 로컬라이즈할 수 있도록 합니다.
게시글 메뉴 설정

로컬라이즈된 게시글 편집

사용자가 로컬라이즈된 게시글을 보고 있고 게시글을 편집하려는 경우, 어떤 버전을 편집할지 묻는 대화 상자가 나타납니다:

결정 후 적절한 컴포저가 나타납니다.

사용자 정의 사이드바 로컬라이제이션

"모두에게 표시됨"인 사이드바 섹션에는 추가적인 번역 컨트롤이 표시됩니다:

크롤러

Content localization supported locales에서 설정한 다양한 언어로 크롤러가 사이트를 볼 수 있도록 허용할 수 있습니다. 사이트 설정은 “Content localization” 섹션의 Content localization crawler param에 있습니다:

그 결과, 크롤러는 각 지원 언어가 각 주제의 head에 해당하는 hreflang을 가진 다음을 볼 수 있습니다:

추가적인 증거 / 검증용

이 기능을 광범위하게 테스트했으며, 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회. 게시글이 편집되면 닌자 편집(ninja edits)을 고려하여 5분 또는 SiteSetting.editing_grace_period 중 더 긴 지연 시간 후에 재번역으로 전송됩니다. Content localization allowed groups의 권한 있는 사용자는 게시글을 즉시 재번역으로 전송할 수 있는 옵션이 있습니다.

에이전트나 LLM을 변경하면 번역이 삭제되나요?
아니요, 번역은 일반적으로 설정 변경에 걸쳐 유지되며, 게시글 메뉴 항목이나 번역 컴포저를 사용하여 명시적으로 삭제되지 않는 한 유지됩니다.


25개의 좋아요
Content Localization and Automatic Translations for Your Community
2 language site
Machine-translate messages so users can read without knowing sender's language
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?
Übersetzung wie hier auf Meta
Multilingual user feedback on Automatic Translations
Sharing approaches to using automation to send messages to members
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
Using Discourse and LibreTranslate without AI
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

기존 카테고리에 대해 일괄 처리하는 방법에 대한 권장 사항이 있나요? 최악의 경우, API를 통해 처리할 수 있을까요?

2개의 좋아요

음, 좋은 질문이네요. 카테고리 업데이트 엔드포인트의 API 문서를 업데이트하도록 하겠습니다. :memo:

4개의 좋아요

언어별 модератор(번역자) 지원 기능이 추가될 예정인가요? 메타 사이트에서 특정 언어로 작성된 게시물을 확인하고 수동으로 업데이트하는 자원봉사를 하고 싶다는 생각을 하고 있습니다. 특히 문서의 경우, 인간적인 손길이 필요한 부분이 있을 수 있거든요. 하지만 모더레이터만 수정할 수 있다고 하셨는데, 저는 아마도 그런 권한을 얻지 못할 것 같습니다.

3개의 좋아요

음, 좋은 제안이네요. 가능할 것 같은데, 어떻게 설정할지에 대한 세부 사항을 생각해 봐야 할 것 같아요.

현재는 다음과 같은 구성을 가지고 있지만, "localization moderators"라는 그룹으로 확장할 수 있는지 확인해 보겠습니다.

3개의 좋아요

어떻게 접근하나요? 명령어를 제공해 주실 수 있을까요?

Sidekiq에 연결된 작업이 있나요? 수동으로 트리거할 수 있나요?

1개의 좋아요
2개의 좋아요

위 Moin의 게시글을 보충하자면, 콘솔에 접근한 후에는 SiteSetting. ai_translation_backfill_hourly_rate만 입력하면 됩니다. 이 작업은 5분마다 실행되며, 이에 따라 속도 제한을 설정해야 합니다.

3개의 좋아요

다큐멘트에서 이제 로컬라이제이션이 사용 가능한 것을 확인했습니다. @nat님 감사합니다!

3개의 좋아요

정말 훌륭합니다, 팀에게 박수를 보냅니다! 지금 바로 테스트 중이며 제 생각과 전반적인 경험을 공유하겠습니다.

*Discourse Translator 플러그인으로 전환하면서 에스페란토가 빠졌습니다.

이걸 ‘단순히’ 추가할 수 있을까요, 아니면 먼저 discourse-languages에 구축되어야 하나요?*

와, 정말 빠르시네요 – 여기서 보고하려던 참이었습니다. :laughing:

네, 그런 셈이죠. 우리는 버튼, 라벨 등 컨트롤이 Crowdin(Translations - Discourse Meta 참조)을 통해 적절하고 충분히(70% 정도면 정말 좋겠습니다) 번역된 완전한 로컬라이제이션 경험을 원합니다. 그렇게 되면 해당 언어에 대한 지원을 제공할 수 있습니다.

2개의 좋아요

콘텐츠 로컬라이제이션이 문서 카테고리(Docmentation Categories)와 함께 작동합니까? 인덱스 토픽을 로컬라이제이션해도 사이드바 콘텐츠가 번역되지 않는 것 같습니다.

또한 이상한 동작도 발견했습니다. 원본 언어로 로컬라이제이션된 토픽을 보고 새로고침하면 로컬라이제이션된 버전으로 전환됩니다. 원본 버전으로 다시 수동으로 전환해야 합니다.

3개의 좋아요

오, 정말 좋은 지적이에요. 네, 아직 작동하지는 않지만 @nat 님이 추적을 시작할 예정이에요.

사이드바 문서 링크에 대해 더 나은 추상화/데이터 모델을 만들어내는 계기가 될 수도 있겠네요.

2개의 좋아요

네, 맞습니다 – Discourse에는 명시적인 번역이 필요한 곳이 많습니다. 그래서 발견할 때마다 기록하고 있습니다. 가장 최근에는 주제 제목에 대한 알림도 현지화했습니다. 제가 만든 기능 주제에 대한 예시입니다 - Show translated user bios.

새로운 주제를 만들고 @를 걸어 드리겠습니다. 이렇게 하면 사이드바에서 모든 사항을 빠짐없이 다룰 수 있습니다.

수정: @tvavrda 님이 여기서 다루었습니다 - Translate sidebar documentation links. 확인해 보시고 의미가 맞는지 봐 주세요.

"다시 전환"이라는 것은 무엇을 의미하시나요?

다음에 그런 일이 발생하면 화면 녹화(주소창 포함)를 공유해 주실 수 있으신가요? :folded_hands:t2: 내용이 공개하기에 적합하지 않은 경우 이 건에 대해 직접 메시지(DM)를 보내 주세요. 또한, 로그인 상태였나요? 기술적으로 말하면 이러한 것들은 쿠키를 통해 추적되므로 저에게는 다소 수수께끼입니다.

1개의 좋아요

영상을 보내드렸습니다.

또 다른 관찰 사항 – 번역된 콘텐츠의 차이(diffs)를 볼 수 없나요? 콘텐츠에 업데이트가 있을 때 유용할 것 같습니다. 아주 중요하지는 않지만, 그럴듯한 기능이라고 생각합니다.

그리고 또 하나 – 주제(topic) 아래에 표시되는 백링크(backlinks)에 로컬라이즈된 주제 이름이 표시되지 않습니다.

그리고 질문 하나: 카테고리 설정에서 카테고리 설명을 로컬라이즈하는 목적은 무엇인가요? 카테고리 설명은 “About” 주제의 로컬라이즈된 버전에서 가져와야 하지 않나요? 로컬라이즈된 버전은 마크다운을 지원하지 않아 링크를 사용할 수 없는데, 저는 링크를 사용하고 싶습니다.

그 외에는 완벽하게 작동합니다! :heart: :heart: :heart:

1개의 좋아요

음… 기존 GitHub - discourse/discourse-docs-sidebar · GitHub 컴포넌트가 실제로는 로컬라이제이션을 준수합니다 :slight_smile: 임시로 해당 컴포넌트로 전환했습니다.

네, 현재 이 기능도 지원되지 않으며 구현하는 데 상당한 노력이 필요합니다.

게시글 버전이 변경되어 번역이 오래되었을 가능성이 있을 때, 이를 나타내는 작은 색상 표시기(게시글 수정 표시기와 유사하게 옆에 위치)를 제공하고 있습니다.

1개의 좋아요

고정된 주제의 요약에서도 번역되지 않은 내용을 확인했습니다. 즉, 주제 목록은 번역된 언어로 표시되지만, 고정된 주제의 요약은 원어로 표시됩니다.

1개의 좋아요

수동으로 번역을 수행하거나 수정할 수는 있지만, 번역 빌드를 수동으로 트리거할 수는 있을까요? 일종의 온디맨드(수요 기반) 작업이요.

제 생각은 다음과 같습니다. 1년 전의 주제에 대한 번역을 허용했습니다. 하지만 그 1년이 현재 날짜로부터 계산된다면, 그 한계는 이미 번역된 콘텐츠 쪽으로 계속 이동하게 됩니다. 그러나 가장 큰 수요는 오래되었지만 가치 있는 콘텐츠이며, 이를 빠르게 도달하고 싶고, 꽤 느린 벌크 액션 없이 처리하고 싶습니다.

호기심이 생겨 여쭤봅니다. 번역 기능을 활성화한 후의 비용에 대한 수치를 아시는 분이 계신가요? 저희 사이트는 이미 꽤 오래 운영되어 왔고, 가능하다면 전체 사이트를 번역하고 싶지만 비용이 확실한 고민거리입니다. 따라서 경험에 기반한 대략적인 비용 추산(예: 1,000개의 게시글당 1달러 등)을 공유해 주시면 예산을 잡는 데 큰 도움이 될 것입니다.

콘텐츠 현지화는 한 번 수행된 후 어딘가에 저장되는 방식인가요? 즉, 요청 시마다 처리되는 방식은 아닌가요? 만약 그렇다면, 데스크톱에 Ollama와 Llama 3이나 Deepseek 3 같은 오픈소스 LLM을 구동하여 작업이 완료될 때까지 그냥 실행을 유지하는 방식이 불가능한지 궁금합니다.

수정: 초기 번역 비용을 줄이는 데는 효과가 있을 수 있겠지만, 새로운 게시글에는 해당 LLM을 지속적으로 실행 상태로 유지하기로 결정하지 않는 한 적용되지 않을 것 같습니다.