{"id":20037809,"url":"https://github.com/openedx/xblock-drag-and-drop-v2","last_synced_at":"2025-05-16T03:06:31.296Z","repository":{"id":37854425,"uuid":"21356168","full_name":"openedx/xblock-drag-and-drop-v2","owner":"openedx","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-12T12:36:22.000Z","size":3448,"stargazers_count":20,"open_issues_count":4,"forks_count":70,"subscribers_count":28,"default_branch":"master","last_synced_at":"2025-05-12T13:46:07.013Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openedx.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2014-06-30T15:30:30.000Z","updated_at":"2025-05-12T12:36:24.000Z","dependencies_parsed_at":"2023-10-24T01:15:28.402Z","dependency_job_id":"4635510f-ad41-4240-95f0-0b3c33913b5e","html_url":"https://github.com/openedx/xblock-drag-and-drop-v2","commit_stats":null,"previous_names":[],"tags_count":74,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openedx%2Fxblock-drag-and-drop-v2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openedx%2Fxblock-drag-and-drop-v2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openedx%2Fxblock-drag-and-drop-v2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openedx%2Fxblock-drag-and-drop-v2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openedx","download_url":"https://codeload.github.com/openedx/xblock-drag-and-drop-v2/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254459088,"owners_count":22074605,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T10:22:37.790Z","updated_at":"2025-05-16T03:06:26.278Z","avatar_url":"https://github.com/openedx.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Drag and Drop XBlock v2\n=======================\n\nThis XBlock implements a friendly drag-and-drop style problem, where\nthe learner has to drag items to zones on a target image.\n\nThe editor is fully guided. Features include:\n\n* custom target image\n* free target zone positioning and sizing\n* custom zone labels\n* ability to show or hide zone borders\n* custom text and background colors for items\n* auto-alignment for items: left, right, center\n* image items\n* decoy items that don't have a zone\n* feedback popups for both correct and incorrect attempts\n* introductory and final feedback\n\nThe XBlock supports progressive grading and keeps progress across\nrefreshes. All checking and record keeping is done on the server side.\n\nThe following screenshot shows the Drag and Drop XBlock rendered\ninside the edX LMS before the user starts solving the problem:\n\n![Student view start](doc/img/student-view-start.png)\n\nThis screenshot shows the XBlock after the learner successfully\ncompleted the Drag and Drop problem:\n\n![Student view finish](doc/img/student-view-finish.png)\n\nInstallation\n------------\n\nInstall the requirements into the Python virtual environment of your\n`edx-platform` installation by running the following command from the\nroot folder:\n\n```bash\n$ pip install -r requirements.txt\n```\n\nTheming\n-------\n\nThe Drag and Drop XBlock ships with an alternate theme called \"Apros\"\nthat you can enable by adding the following entry to `XBLOCK_SETTINGS`\nin `lms.env.json`:\n\n```json\n        \"drag-and-drop-v2\": {\n            \"theme\": {\n                \"package\": \"drag_and_drop_v2\",\n                \"locations\": [\"public/themes/apros.css\"]\n            }\n        }\n```\n\nYou can use the same approach to apply a custom theme:\n\n`\"package\"` can refer to any Python package in your virtualenv, which\nmeans you can develop and maintain your own theme in a separate\npackage. There is no need to fork or modify this repository in any way\nto customize the look and feel of your Drag and Drop problems.\n\n`\"locations\"` is a list of relative paths pointing to CSS files\nbelonging to your theme. While the XBlock loads, files will be added\nto it in the order that they appear in this list. (This means that if\nthere are rules with identical selectors spread out over different\nfiles, rules in files that appear later in the list will take\nprecedence over those that appear earlier.)\n\nFinally, note that the default (unthemed) appearance of the Drag and\nDrop XBlock has been optimized for accessibility, so its use is\nencouraged -- especially for courses targeting large and/or\npotentially diverse audiences.\n\nEnabling in Studio\n------------------\n\nDrag and Drop v2 XBlock is already included in Open edX.\n\nYou will find it in `\"Add New Component\"` box in Studio:\nclick the green `Problem` button, choose the the `Advanced` tab\nand choose `Drag and Drop`.\n\nUsage\n-----\n\nThe Drag and Drop XBlock features an interactive editor. Add the Drag\nand Drop component to a lesson, then click the `EDIT` button.\n\n![Edit view](doc/img/edit-view.png)\n\nIn the first step, you can set some basic properties of the component, such as\nthe title, the problem mode, the maximum number of attempts, the maximum score,\nthe problem text to render above the background image, the introductory feedback\n(shown initially), and the final feedback (shown after the learner successfully\ncompletes the drag and drop problem, or when the learner runs out of attempts).\n\nThere are two problem modes available:\n\n* **Standard**: In this mode, the learner gets immediate feedback on each\n  attempt to place an item, and the number of attempts is not limited.\n* **Assessment**: In this mode, the learner places all items on the board and\n  then clicks a \"Submit\" button to get feedback.\n  * The number of attempts can be limited.\n  * The learner can click a \"Show Answer\" button to temporarily place items on their correct drop zones.    \n    You can select one of the pre-defined conditions for displaying this button. They work in the same way as in the\n    Problem XBlock, so you can read about each them in the [Problem Component documentation][capa-show-answer].  \n    By default, the value from the course \"Advanced Settings\" configuration is used. If you have modified this for\n    a specific XBlock but want to switch back to using the default value, select the \"Default\" option.\n\n[capa-show-answer]: https://docs.openedx.org/en/latest/educators/references/course_development/problem_settings.html#show-answer\n\n![Drop zone edit](doc/img/edit-view-zones.png)\n\nIn the next step, you set the URL and description for the background\nimage and define the properties of the drop zones. For each zone you\ncan specify the text that should be rendered inside it (the \"zone\nlabel\"), how wide and tall it should be, and where it should be placed\non the background image. In this step you can also specify whether you\nwould like zone labels to be shown to learners or not, as well as\nwhether or not to display borders outlining the zones. It is possible\nto define an arbitrary number of drop zones as long as their labels\nare unique.\n\nYou can specify the alignment for items once they are dropped in\nthe zone. Centered alignment is the default, and places items from top to bottom\nalong the center of the zone. Left alignment causes dropped items to be placed from left\nto right across the zone. Right alignment causes the items to be placed from\nright to left across the zone. Items dropped in a zone will not overlap,\nbut if the zone is not made large enough for all its items, they will overflow the bottom\nof the zone, and potentially overlap the zones below.\n\n![Drag item edit](doc/img/edit-view-items.png)\n\nIn the final step, you define the background and text color for drag items, as\nwell as the drag items themselves. A drag item can contain either text or an\nimage. You can define custom success and error feedback for each item. In\nstandard mode, the feedback text is displayed in a popup after the learner drops\nthe item on a zone - the success feedback is shown if the item is dropped on a\ncorrect zone, while the error feedback is shown when dropping the item on an\nincorrect drop zone.  In assessment mode, the success feedback texts\nare not used, while error feedback texts are shown when learner submits a solution.\n\nYou can select any number of zones for an item to belong to using\nthe checkboxes; all zones defined in the previous step are available.\nYou can leave all of the checkboxes unchecked in order to create a\n\"decoy\" item that doesn't belong to any zone.\n\nYou can define an arbitrary number of drag items, each of which may\nbe attached to any number of zones.\n\n\"Maximum items per Zone\" setting controls how many items can be dropped into a\nsingle zone, allowing some degree of control over items overlapping zones below.\n\nScoring\n-------\n\nStudent assessment scores for the Drag and Drop XBlock are calculated according\nto the following formula:\n\n    score = (C + D) / T\n\nWhere *C* is the number of correctly placed regular items, *D* is the number of\ndecoy items that were correctly left unplaced, and *T* is the total number of\nitems available.\n\nExample: consider a Drag and Drop instance configured with a total of four\nitems, of which three are regular items and one is a decoy.  If a learner\nplaces two of the normal items correctly and one incorrectly (`C = 2`), and\nwrongly places the decoy item onto a drop zone (`D = 0`), that learner's score\nwill be `50%`, as given by:\n\n    score = (2 + 0) / 4\n\nIf the learner were to then move the decoy item back to the bank (`D = 1`) and\nmove the wrongly placed regular item to the correct dropzone (`C = 3`), their\nscore would be `100%`:\n\n    score = (3 + 1) / 4\n\nOptionally, there is an alternative grading that can be enabled, by setting the\nwaffle flag `drag_and_drop_v2.grading_ignore_decoys`, which will drop\nthe decoy items entirely from the score calculation. The formula will change to:\n\n    score = C / R\n\nWhere *C* is the number of correctly placed regular items, *R* is the number of\nrequired regular items.\n\nDemo Course\n-----------\n\nExport of a demo course that showcases various Drag and Drop v2\nfeatures is available at\n[github.com/open-craft/demo-courses/archive/drag-and-drop-v2.tar.gz](https://github.com/open-craft/demo-courses/archive/drag-and-drop-v2.tar.gz).\n\nAnalytics Events\n----------------\n\nThe following analytics events are provided by this block.\n\n## `edx.drag_and_drop_v2.loaded`\n\nFired when the Drag and Drop XBlock is finished loading.\n\nExample (\"common\" fields that are not interesting in this context have been left out):\n\n```\n{\n...\n    \"event\": {},\n    \"event_source\": \"server\",                              --  Common field, contains event source.\n    \"event_type\": \"edx.drag_and_drop_v2.loaded\",           --  Common field, contains event name.\n...\n```\n\nReal event example (taken from a devstack):\n```\n{\n    \"username\": \"staff\",\n    \"event_type\": \"edx.drag_and_drop_v2.loaded\",\n    \"ip\": \"10.0.2.2\",\n    \"agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0\",\n    \"host\": \"precise64\",\n    \"referer\": \"http://example.com/courses/course-v1:DnD+DnD+DnD/courseware/ec546c58d2f447b7a9223c57b5de7344/756071f8de7f47c3b0ae726586ebbe16/1?activate_block_id=block-v1%3ADnD%2BDnD%2BDnD%2Btype%40vertical%2Bblock%40d2fc47476ca14c55816c4a1264a27280\",\n    \"accept_language\": \"en;q=1.0, en;q=0.5\",\n    \"event\": {},\n    \"event_source\": \"server\",\n    \"context\": {\n        \"course_user_tags\": {},\n        \"user_id\": 5,\n        \"org_id\": \"DnD\",\n        \"module\": {\n            \"usage_key\": \"block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3\",\n            \"display_name\": \"Drag and Drop\"\n        },\n        \"course_id\": \"course-v1:DnD+DnD+DnD\",\n        \"path\": \"/courses/course-v1:DnD+DnD+DnD/xblock/block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3/handler/publish_event\"\n    },\n    \"time\": \"2016-01-13T01:52:41.330049+00:00\",\n    \"page\": \"x_module\"\n}\n```\n\n## `edx.drag_and_drop_v2.item.picked_up`\n\nFired when a learner picks up a draggable item.\n\nExample (\"common\" fields that are not interesting in this context have been left out):\n\n```\n{\n...\n    \"event\": {\n      \"item_id\": 0,                                        --  ID of the draggable item.\n    },\n    \"event_source\": \"server\",                              --  Common field, contains event source.\n    \"event_type\": \"edx.drag_and_drop_v2.picked_up\",        --  Common field, contains event name.\n...\n```\n\nReal event example (taken from a devstack):\n\n```\n{\n    \"username\": \"staff\",\n    \"event_type\": \"edx.drag_and_drop_v2.item.picked_up\",\n    \"ip\": \"10.0.2.2\",\n    \"agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0\",\n    \"host\": \"precise64\",\n    \"referer\": \"http://example.com/courses/course-v1:DnD+DnD+DnD/courseware/ec546c58d2f447b7a9223c57b5de7344/756071f8de7f47c3b0ae726586ebbe16/1?activate_block_id=block-v1%3ADnD%2BDnD%2BDnD%2Btype%40vertical%2Bblock%40d2fc47476ca14c55816c4a1264a27280\",\n    \"accept_language\": \"en;q=1.0, en;q=0.5\",\n    \"event\": {\n        \"item_id\": 0,\n    },\n    \"event_source\": \"server\",\n    \"context\": {\n        \"course_user_tags\": {},\n        \"user_id\": 5,\n        \"org_id\": \"DnD\",\n        \"module\": {\n            \"usage_key\": \"block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3\",\n            \"display_name\": \"Drag and Drop\"\n        },\n        \"course_id\": \"course-v1:DnD+DnD+DnD\",\n        \"path\": \"/courses/course-v1:DnD+DnD+DnD/xblock/block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3/handler/publish_event\"\n    },\n    \"time\": \"2016-01-13T01:58:44.395935+00:00\",\n    \"page\": \"x_module\"\n}\n```\n\n## `edx.drag_and_drop_v2.item.dropped`\n\nFired when a learner drops a draggable item.\n\nThis event will be emitted when a learner drops a draggable item.\n\nExample (\"common\" fields that are not interesting in this context have been left out):\n\n```\n{\n...\n    \"event\": {\n      \"is_correct\": true,                                  --  Whether the draggable item has been placed in the correct location.\n      \"item\": \"Goes to the top\",                           --  Name, or in the absence thereof, image URL of the draggable item.\n      \"item_id\": 0,                                        --  ID of the draggable item.\n      \"location\": \"The Top Zone\",                          --  Name of the location the item was dragged to.\n      \"location_id\": 1,                                    --  ID of the location the item was dragged to.\n    },\n    \"event_source\": \"server\",                              --  Common field, contains event source.\n    \"event_type\": \"edx.drag_and_drop_v2.dropped\",          --  Common field, contains event name.\n...\n```\n\nReal event example (taken from a devstack):\n\n```\n{\n    \"username\": \"staff\",\n    \"event_type\": \"edx.drag_and_drop_v2.item.dropped\",\n    \"ip\": \"10.0.2.2\",\n    \"agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0\",\n    \"host\": \"precise64\",\n    \"referer\": \"http://example.com/courses/course-v1:DnD+DnD+DnD/courseware/ec546c58d2f447b7a9223c57b5de7344/756071f8de7f47c3b0ae726586ebbe16/1?activate_block_id=block-v1%3ADnD%2BDnD%2BDnD%2Btype%40vertical%2Bblock%40d2fc47476ca14c55816c4a1264a27280\",\n    \"accept_language\": \"en;q=1.0, en;q=0.5\",\n    \"event\": {\n        \"is_correct\": true,\n        \"location\": \"The Top Zone\",\n        \"location_id\": 1,\n        \"item\": \"Goes to the top\",\n        \"item_id\": 0,\n    },\n    \"event_source\": \"server\",\n    \"context\": {\n        \"course_user_tags\": {},\n        \"user_id\": 5,\n        \"org_id\": \"DnD\",\n        \"module\": {\n            \"usage_key\": \"block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3\",\n            \"display_name\": \"Drag and Drop\"\n        },\n        \"course_id\": \"course-v1:DnD+DnD+DnD\",\n        \"path\": \"/courses/course-v1:DnD+DnD+DnD/xblock/block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3/handler/do_attempt\"\n    },\n    \"time\": \"2016-01-13T01:58:45.202313+00:00\",\n    \"page\": \"x_module\"\n}\n```\n\n## `edx.drag_and_drop_v2.feedback.opened`\n\nFired when the feedback pop-up is opened.\n\nExample (\"common\" fields that are not interesting in this context have been left out):\n\n```\n{\n...\n    \"event\": {\n      \"content\": \"Correct! This one belongs to The Top Zone.\",  --  Content of the feedback popup.\n      \"truncated\": false,                                       --  Boolean indicating whether \"content\" field was truncated.\n    },\n    \"event_source\": \"server\",                                   --  Common field, contains event source.\n    \"event_type\": \"edx.drag_and_drop_v2.feedback.opened\",       --  Common field, contains event name.\n...\n```\n\nReal event example (taken from a devstack):\n\n```\n{\n    \"username\": \"staff\",\n    \"event_type\": \"edx.drag_and_drop_v2.feedback.opened\",\n    \"ip\": \"10.0.2.2\",\n    \"agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0\",\n    \"host\": \"precise64\",\n    \"referer\": \"http://example.com/courses/course-v1:DnD+DnD+DnD/courseware/ec546c58d2f447b7a9223c57b5de7344/756071f8de7f47c3b0ae726586ebbe16/1?activate_block_id=block-v1%3ADnD%2BDnD%2BDnD%2Btype%40vertical%2Bblock%40d2fc47476ca14c55816c4a1264a27280\",\n    \"accept_language\": \"en;q=1.0, en;q=0.5\",\n    \"event\": {\n        \"content\": \"Correct! This one belongs to The Top Zone.\",\n        \"truncated\": false,\n    },\n    \"event_source\": \"server\",\n    \"context\": {\n        \"course_user_tags\": {},\n        \"user_id\": 5,\n        \"org_id\": \"DnD\",\n        \"module\": {\n            \"usage_key\": \"block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3\",\n            \"display_name\": \"Drag and Drop\"\n        },\n        \"course_id\": \"course-v1:DnD+DnD+DnD\",\n        \"path\": \"/courses/course-v1:DnD+DnD+DnD/xblock/block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@6b80ce1e8b78426898b47a834d72ffd3/handler/publish_event\"\n    },\n    \"time\": \"2016-01-13T01:58:45.844986+00:00\",\n    \"page\": \"x_module\"\n}\n```\n\n## `edx.drag_and_drop_v2.feedback.closed`\n\nFired when the feedback popup is closed.\n\nExample (\"common\" fields that are not interesting in this context have been left out):\n\n```\n{\n...\n    \"event\": {\n      \"content\": \"No, this item does not belong here. Try again.\" --  Message of the feedback popup that was closed.\n      \"manually\": true,                                           --  Whether or not the user closed the feedback window manually or if it was auto-closed.\n      \"truncated\": false,                                         --  Boolean indicating whether \"content\" field was truncated.\n    },\n    \"event_source\": \"server\",                                     --  Common field, contains event source.\n    \"event_type\": \"edx.drag_and_drop_v2.feedback.closed\",         --  Common field, contains event name.\n...\n```\n\nReal event example (taken from a devstack):\n\n```\n{\n    \"username\": \"staff\",\n    \"event_type\": \"edx.drag_and_drop_v2.feedback.closed\",\n    \"ip\": \"10.0.2.2\",\n    \"agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:43.0) Gecko/20100101 Firefox/43.0\",\n    \"host\": \"precise64\",\n    \"referer\": \"http://example.com/courses/course-v1:DnD+DnD+DnD/courseware/ec546c58d2f447b7a9223c57b5de7344/756071f8de7f47c3b0ae726586ebbe16/1?activate_block_id=block-v1%3ADnD%2BDnD%2BDnD%2Btype%40vertical%2Bblock%40d2fc47476ca14c55816c4a1264a27280\",\n    \"accept_language\": \"en;q=1.0, en;q=0.5\",\n    \"event\": {\n        \"content\": \"No, this item does not belong here. Try again.\"\n        \"manually\": true\n        \"truncated\": false,\n    },\n    \"event_source\": \"server\",\n    \"context\": {\n        \"course_user_tags\": {},\n        \"user_id\": 5,\n        \"org_id\": \"DnD\",\n        \"module\": {\n            \"usage_key\": \"block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@13d1b859a2304c858e1810ccc23f29b2\",\n            \"display_name\": \"Drag and Drop\"\n        },\n        \"course_id\": \"course-v1:DnD+DnD+DnD\",\n        \"path\": \"/courses/course-v1:DnD+DnD+DnD/xblock/block-v1:DnD+DnD+DnD+type@drag-and-drop-v2+block@13d1b859a2304c858e1810ccc23f29b2/handler/publish_event\"\n    },\n    \"time\": \"2016-01-13T02:07:00.988534+00:00\",\n    \"page\": \"x_module\"\n}\n```\n\n\nTesting with tox\n----------------\n\nInside a fresh virtualenv, `cd` into the root folder of this repository\n(`xblock-drag-and-drop-v2`) and run:\n\n```bash\n$ make requirements\n```\n\n\nYou can then run the entire test suite via:\n\n```bash\n$ make test\n```\n\nTo run specific test groups, use one of the following commands:\n\n```bash\n$ make test.unit\n$ make test.quality\n$ make test.translations\n```\n\nTo run individual unit tests, use:\n\n```bash\n$ make test.unit TEST=tests/unit/test_basics.py::BasicTests::test_student_view_data\n```\n\nManual testing (without tox)\n----------------------------\n\nTo run tests without tox, use:\n\n```bash\n$ make requirements_python\n$ make test.python TEST=tests/unit/test_basics.py::BasicTests::test_student_view_data\n```\n\n\ni18n compatibility\n==================\n\nAccording to [edX docs on XBlock i18n][edx-docs-i18n], LMS runtime is capable of supporting XBlock i18n and l10n.\nTo comply with l10n requirements, XBlock is supposed to provide translations in\n`xblock_package_root/translations/locale_code/LC_MESSAGES/text.po` folder in GNU Gettext Portable Object file format.\n\n[edx-docs-i18n]: https://docs.openedx.org/projects/xblock/en/latest/xblock-tutorial/edx_platform/edx_lms.html#internationalization-support\n\nDrag and Drop v2 XBlock aims to comply with i18n requirements for Open edX platform, including a stricter set of\nrequirements for `edx.org` itself, thus providing the required files. So far only two translations are available:\n\n* Default English translation\n* Fake \"Esperanto\" translation used to test i18n/l10n.\n\nUpdates to translated strings are supposed to be propagated to `text.po` files. EdX [i18n_tools][edx-i18n-tools] is used here along GNU Gettext and a Makefile for automation.\n\n[edx-i18n-tools]: https://github.com/openedx/i18n-tools\n\nNote: currently `translations` directory is a symbolic link to `conf/locale` directory. Also, 'text.po' file for locale code `en` is a symbolic link to `conf/locale/en/LC_MESSAGES/django.po` file. Both links works as a transition step to fully moving translation files to [openedx-translations](https://github.com/openedx/openedx-translations) repository\n\nTranslatable strings\n--------------------\n```bash\n$ make extract_translations\n```\n\nNote that this command generates `text.po` which is supposed to contain\nall translatable strings.\n\nTo check if `text.po` is correct, one can run:\n\n```bash\n$ make compile_translations\n```\n\nIf everything is correct, it will create `translations/en/LC_MESSAGES/text.mo` and `locale/en/LC_MESSAGES/text.js` files.\n\nBuilding fake \"Esperanto\" translation\n-------------------------------------\n\nAs previously said, this fake translation mainly exists for testing reasons. For edX platform it is built using Dummy\ntranslator from edX i18n-tools.\n\n```bash\n$ make dummy_translations\n```\n\nNative API\n----------\n\nFurther information on the API for native mobile applications can be found [here][native-api-doc].\n\n[native-api-doc]: ./Native_API.md\n\nReleasing\n-------------------------------------\nTo release a new version, update .travis.yml and setup.py to point to your new intended version number and create a new release with that version tag via Github.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenedx%2Fxblock-drag-and-drop-v2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenedx%2Fxblock-drag-and-drop-v2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenedx%2Fxblock-drag-and-drop-v2/lists"}