[Proposed] Multilingual Proposal
Please note:
This is a pre-proposal, intended as a provisional description of the solution we are proposing. It outlines our initial understanding of the requirements and the approach we recommend based on the information available so far. Further refinements can be made as we gather inputs or align more closely on the scope.
Summary
This proposal introduces a scalable multilingual framework for Open edX, allowing a single course run to support multiple language variants. Instead of duplicating course runs, translated content will be dynamically layered over the base course. This dramatically reduces administrative burden, simplifies content management and enhances learner experience, especially for global deployments.
The solution integrates AI-assisted translation, studio interface for authors to review translated strings, and learner-side language switching, setting a clear path for quick delivery and upstream community adoption.
Challenges
In the current implementation by Edly for Wikimedia project, delivering multilingual courses on Open edX requires creating a separate course run for each language. While functional, this approach introduces several critical pain points:
Authors must duplicate course content and manually manage updates across multiple runs.
Managing multiple SKUs for translated courses complicates pricing, promotion, and catalog integration.
For enterprise and B2B models, enrollment tracking, reporting, and analytics become fragmented across language-specific runs.
A more unified, integrated solution is needed: one where learners can access their preferred language within a single course run, without additional enrollments or administrative burden.
Value & Impact
Implementing dynamic multilingual support within the same course run will create significant value across the board:
For Course Authors:
Reduces duplication in authoring workflows
Ensures consistency across languages through centralized content mapping
Simplifies translations and version control
For Learners:
Offers quick access to translated content without switching course runs
Improves accessibility and usability for international learners
For the Open edX Community:
This upstream contribution will improve internationalization support for Open edX thereby potentially increasing the impact and reach of the platform
Establishes a scalable, reusable multilingual framework
Proposed Solution
i. Studio - For Course Authors and eLearning Developers
Translation Management Panel
A dedicated "Translations" tab in Studio allows:
Authors to enable additional language variants per course run via Translations tab within Studio.
Authors to translate the course in multiple languages and manage those translations.
AI is utilised in the backend to translate entire course content including video subtitles, assessments and certificates.
Authors to display list of course units and their translated strings
Authors to have side-by-side view of base content and translated content for authors to review and approve translations
Ability to edit translations inline.
Approve or revert translations with a simple toggle
Review or navigate to previously translated versions
Disclaimer: This is a screenshot of a prebuilt solution. Actual translations MFE would look different according to the specifications mentioned above.
ii. LMS - For Learners
1. Global Language Selection
If learner’s platform language preference is not the same as the course language:
A prompt will be displayed to the learners to translate course content.
"This course is available in French. Would you like to view it in French?"
→ [Yes] [No, thanks]
Learners can also switch the course language through the course tab of the learning MFE at any time during the course. This would make it possible for learners to view a unit/section/lesson in either base or any other language
User would also be able to switch to source language at any time throughout the course.
3. Language Preferences
Learners will be able to update the default content language of courses from the account MFE. By default, this will be synced with the platform language unless a user explicitly makes a change to this:
"Always view courses in [dropdown: Spanish]"
The setting applies to all courses where a translation is available
If the translation is not available, the course will be displayed in the original language. Learners will be notified of this when they access the course content.
If the platform language and course language have different text directions (e.g., LTR vs. RTL), the user would be warned about potential UI breakage.
4. Assessments and Certificates
Quizzes appear in the selected language, while logic and grading remain unchanged
Certificates are automatically issued in the learner’s chosen language for the platform. Only the course title will be changed through the course translation flow. The rest of it would be translated by the localization flow
Proposed Technical Flow:
This is an outline of the process for creating the multilanguage versions of the course:
1. Course Creation & Translation Request
User creates a course as they normally do and that would be considered the base language for that course.
They can request translations for the content in other languages.
2. String Extraction
Content strings are extracted per block (with context) and stored in a database.
3. AI Translation
Strings for requested translations are sent to an AI service for translation.
Translations are stored as “Pending Review”.
4. Human Review
Translators review AI translations via a graphical user interface.
They can approve, edit, or reject translations.
Only approved translations are used in the course view.
5. Student Language Selection
Students can select a language from available approved ones.
If a translation is missing, content falls back to the base language.
6. Rendering
Course translation has two main parts: outline and course content (XBlocks).
Outline
The Learning MFE calls the outline endpoint, which returns names of sections, subsections, and units. This endpoint can be updated to return translated names based on the user’s selected course language. As a proof of concept, we’ve modified the get_course_outline_block_tree() method to showcase how we can replace display names with their translated names.
XBlocks
XBlocks check the selected language in their render() or student_view() method. The render() function can be updated to extract strings from the block content and replace them with approved translations.
As a proof of concept, we’ve updated the render function of the main XBlock and successfully displayed translated content. The next challenge is optimizing the process of extracting and applying translations. We'll continue refining this for better performance and scalability.
For video xblock, we would serve .srt files from the translations backend which can be used as is for translated subtitles.
Disclaimer: Iframes and dynamic content like SCORM and LTI will not be supported by this approach for now
Architecture Overview
Django Plugin
A Django plugin will handle most of the heavy lifting for translations.
It will:
Translate course content using a third-party LLM model.
Store translations and maintain mappings to the base course.
Expose protected API endpoints for translations.
Listen to platform events to keep translations up-to-date.
It will be available as a Tutor plugin for easy deployment.
Translation MFE (Micro-Frontend)
A React-based MFE will manage translations.
It will:
Consume APIs from the translation backend and the platform.
Allow users to add new languages to a course.
Provide interfaces to review, edit, and approve translations.
Open edX Platform Changes
Modifications are needed at the Open edX level to integrate translations:
Outline API will be updated to fetch and serve translated section, subsection, and unit names.
Before sending course content to the Learning MFE, translations will be swapped in if available.
System Architecture
Open edX Translation System Component Design