diff --git a/cms/djangoapps/cms_user_tasks/signals.py b/cms/djangoapps/cms_user_tasks/signals.py index 8011f2be1c55..b4f86807fd68 100644 --- a/cms/djangoapps/cms_user_tasks/signals.py +++ b/cms/djangoapps/cms_user_tasks/signals.py @@ -2,6 +2,7 @@ Receivers of signals sent from django-user-tasks """ import logging +import re from urllib.parse import urljoin from django.dispatch import receiver @@ -15,6 +16,7 @@ from .tasks import send_task_complete_email LOGGER = logging.getLogger(__name__) +LIBRARY_CONTENT_TASK_NAME_TEMPLATE = 'updating .*type@library_content.* from library' @receiver(user_task_stopped, dispatch_uid="cms_user_task_stopped") @@ -33,6 +35,22 @@ def user_task_stopped_handler(sender, **kwargs): # pylint: disable=unused-argum Returns: None """ + + def is_library_content_update(task_name: str) -> bool: + """ + Decides whether to suppress an end-of-task email on the basis that the just-ended task was a library content + XBlock update operation, and that emails following such operations amount to spam + Arguments: + task_name: The name of the just-ended task. By convention, if this was a library content XBlock update + task, then the task name follows the pattern prescribed in LibrarySyncChildrenTask + (content_libraries under openedx) 'Updating {key} from library'. Moreover, the block type + in the task name is always of type 'library_content' for such operations + Returns: + True if the end-of-task email should be suppressed + """ + p = re.compile(LIBRARY_CONTENT_TASK_NAME_TEMPLATE) + return p.match(task_name) + def get_olx_validation_from_artifact(): """ Get olx validation error if available for current task. @@ -47,9 +65,17 @@ def get_olx_validation_from_artifact(): return olx_artifact.text status = kwargs['status'] + # Only send email when the entire task is complete, should only send when # a chain / chord / etc completes, not on sub-tasks. if status.parent is None: + task_name = status.name.lower() + + # Also suppress emails on library content XBlock updates (too much like spam) + if is_library_content_update(task_name): + LOGGER.info(f"Suppressing end-of-task email on task {task_name}") + return + # `name` and `status` are not unique, first is our best guess artifact = UserTaskArtifact.objects.filter(status=status, name="BASE_URL").first() @@ -61,7 +87,6 @@ def get_olx_validation_from_artifact(): ) user_email = status.user.email - task_name = status.name.lower() olx_validation_text = get_olx_validation_from_artifact() task_args = [task_name, str(status.state_text), user_email, detail_url, olx_validation_text] try: diff --git a/cms/djangoapps/cms_user_tasks/tests.py b/cms/djangoapps/cms_user_tasks/tests.py index f50e5002feff..feeac4db0986 100644 --- a/cms/djangoapps/cms_user_tasks/tests.py +++ b/cms/djangoapps/cms_user_tasks/tests.py @@ -208,6 +208,19 @@ def test_email_sent_with_site(self): self.assert_msg_subject(msg) self.assert_msg_body_fragments(msg, body_fragments) + def test_email_not_sent_with_libary_content_update(self): + """ + Check the signal receiver and email sending. + """ + UserTaskArtifact.objects.create( + status=self.status, name='BASE_URL', url='https://test.edx.org/' + ) + end_of_task_status = self.status + end_of_task_status.name = "updating block-v1:course+type@library_content+block@uuid from library" + user_task_stopped.send(sender=UserTaskStatus, status=end_of_task_status) + + self.assertEqual(len(mail.outbox), 0) + def test_email_sent_with_olx_validations_with_config_enabled(self): """ Tests that email is sent with olx validation errors. diff --git a/cms/djangoapps/contentstore/asset_storage_handlers.py b/cms/djangoapps/contentstore/asset_storage_handlers.py index 3f77a934f946..281258e03a8d 100644 --- a/cms/djangoapps/contentstore/asset_storage_handlers.py +++ b/cms/djangoapps/contentstore/asset_storage_handlers.py @@ -126,28 +126,41 @@ def _get_asset_usage_path(course_key, assets): asset_key_string = str(asset_key) static_path = StaticContent.get_static_path_from_location(asset_key) is_video_block = getattr(block, 'category', '') == 'video' - if is_video_block: - handout = getattr(block, 'handout', '') - if handout and asset_key_string in handout: - unit = block.get_parent() - subsection = unit.get_parent() - subsection_display_name = getattr(subsection, 'display_name', '') - unit_display_name = getattr(unit, 'display_name', '') - xblock_display_name = getattr(block, 'display_name', '') - current_locations = usage_locations[asset_key_string] - new_location = f'{subsection_display_name} - {unit_display_name} / {xblock_display_name}' - usage_locations[asset_key_string] = [*current_locations, new_location] - else: - data = getattr(block, 'data', '') - if static_path in data or asset_key_string in data: - unit = block.get_parent() - subsection = unit.get_parent() - subsection_display_name = getattr(subsection, 'display_name', '') - unit_display_name = getattr(unit, 'display_name', '') - xblock_display_name = getattr(block, 'display_name', '') - current_locations = usage_locations[asset_key_string] - new_location = f'{subsection_display_name} - {unit_display_name} / {xblock_display_name}' - usage_locations[asset_key_string] = [*current_locations, new_location] + try: + if is_video_block: + handout = getattr(block, 'handout', '') + if handout and asset_key_string in handout: + usage_dict = {'display_location': '', 'url': ''} + xblock_display_name = getattr(block, 'display_name', '') + xblock_location = str(block.location) + unit = block.get_parent() + unit_location = str(block.parent) + unit_display_name = getattr(unit, 'display_name', '') + subsection = unit.get_parent() + subsection_display_name = getattr(subsection, 'display_name', '') + current_locations = usage_locations[asset_key_string] + usage_dict['display_location'] = (f'{subsection_display_name} - ' + f'{unit_display_name} / {xblock_display_name}') + usage_dict['url'] = f'/container/{unit_location}#{xblock_location}' + usage_locations[asset_key_string] = [*current_locations, usage_dict] + else: + data = getattr(block, 'data', '') + if static_path in data or asset_key_string in data: + usage_dict = {'display_location': '', 'url': ''} + xblock_display_name = getattr(block, 'display_name', '') + xblock_location = str(block.location) + unit = block.get_parent() + unit_location = str(block.parent) + unit_display_name = getattr(unit, 'display_name', '') + subsection = unit.get_parent() + subsection_display_name = getattr(subsection, 'display_name', '') + current_locations = usage_locations[asset_key_string] + usage_dict['display_location'] = (f'{subsection_display_name} - ' + f'{unit_display_name} / {xblock_display_name}') + usage_dict['url'] = f'/container/{unit_location}#{xblock_location}' + usage_locations[asset_key_string] = [*current_locations, usage_dict] + except AttributeError: + continue return usage_locations diff --git a/cms/djangoapps/contentstore/helpers.py b/cms/djangoapps/contentstore/helpers.py index c2cc876f19da..0d66070b1120 100644 --- a/cms/djangoapps/contentstore/helpers.py +++ b/cms/djangoapps/contentstore/helpers.py @@ -302,6 +302,16 @@ def _import_xml_node_to_parent( # and VAL will thus make the transcript available. child_nodes = [] + + if issubclass(xblock_class, XmlMixin): + # Hack: XBlocks that use "XmlMixin" have their own XML parsing behavior, and in particular if they encounter + # an XML node that has no children and has only a "url_name" attribute, they'll try to load the XML data + # from an XML file in runtime.resources_fs. But that file doesn't exist here. So we set at least one + # additional attribute here to make sure that url_name is not the only attribute; otherwise in some cases, + # XmlMixin.parse_xml will try to load an XML file that doesn't exist, giving an error. The name and value + # of this attribute don't matter and should be ignored. + node.attrib["x-is-pointer-node"] = "no" + if not xblock_class.has_children: # No children to worry about. The XML may contain child nodes, but they're not XBlocks. temp_xblock = xblock_class.parse_xml(node, runtime, keys, id_generator) @@ -314,14 +324,6 @@ def _import_xml_node_to_parent( # serialization of a child block, in order. For blocks that don't support children, their XML content/nodes # could be anything (e.g. HTML, capa) node_without_children = etree.Element(node.tag, **node.attrib) - if issubclass(xblock_class, XmlMixin): - # Hack: XBlocks that use "XmlMixin" have their own XML parsing behavior, and in particular if they encounter - # an XML node that has no children and has only a "url_name" attribute, they'll try to load the XML data - # from an XML file in runtime.resources_fs. But that file doesn't exist here. So we set at least one - # additional attribute here to make sure that url_name is not the only attribute; otherwise in some cases, - # XmlMixin.parse_xml will try to load an XML file that doesn't exist, giving an error. The name and value - # of this attribute don't matter and should be ignored. - node_without_children.attrib["x-is-pointer-node"] = "no" temp_xblock = xblock_class.parse_xml(node_without_children, runtime, keys, id_generator) child_nodes = list(node) if xblock_class.has_children and temp_xblock.children: diff --git a/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py b/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py index 04f508eedfd7..50100f6a2b05 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py +++ b/cms/djangoapps/contentstore/rest_api/v1/serializers/videos.py @@ -57,7 +57,7 @@ class VideoModelSerializer(serializers.Serializer): child=serializers.CharField() ) usage_locations = serializers.ListField( - child=serializers.CharField() + child=serializers.DictField() ) @@ -89,6 +89,7 @@ class CourseVideosSerializer(serializers.Serializer): video_upload_max_file_size = serializers.CharField() video_image_settings = VideoImageSettingsSerializer(required=True, allow_null=False) is_video_transcript_enabled = serializers.BooleanField() + is_ai_translations_enabled = serializers.BooleanField() active_transcript_preferences = VideoActiveTranscriptPreferencesSerializer(required=False, allow_null=True) transcript_credentials = serializers.DictField( child=serializers.BooleanField() @@ -110,7 +111,7 @@ class CourseVideosSerializer(serializers.Serializer): class VideoUsageSerializer(serializers.Serializer): """Serializer for video usage""" usage_locations = serializers.ListField( - child=serializers.CharField() + child=serializers.DictField() ) diff --git a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py index d5d277c498dc..993072e0717f 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py +++ b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_videos.py @@ -56,6 +56,7 @@ def test_course_videos_response(self): "supported_file_formats": settings.VIDEO_IMAGE_SUPPORTED_FILE_FORMATS }, "is_video_transcript_enabled": False, + "is_ai_translations_enabled": False, "active_transcript_preferences": None, "transcript_credentials": None, "transcript_available_languages": get_all_transcript_languages(), @@ -126,3 +127,10 @@ def test_VideoTranscriptEnabledFlag_enabled(self): ) self.assertIn("transcript_credentials_handler_url", transcript_settings) self.assertEqual(expected_credentials_handler, transcript_settings["transcript_credentials_handler_url"]) + with patch( + 'openedx.core.djangoapps.video_config.toggles.XPERT_TRANSLATIONS_UI.is_enabled' + ) as xpertTranslationfeature: + xpertTranslationfeature.return_value = True + response = self.client.get(self.url) + self.assertIn("is_ai_translations_enabled", response.data) + self.assertTrue(response.data["is_ai_translations_enabled"]) diff --git a/cms/djangoapps/contentstore/tasks.py b/cms/djangoapps/contentstore/tasks.py index 69c9057966ee..8cf1f3172832 100644 --- a/cms/djangoapps/contentstore/tasks.py +++ b/cms/djangoapps/contentstore/tasks.py @@ -715,6 +715,7 @@ def read_chunk(): from .views.entrance_exam import add_entrance_exam_milestone add_entrance_exam_milestone(course.id, entrance_exam_chapter) LOGGER.info(f'Course import {course.id}: Entrance exam imported') + if is_course: sync_discussion_settings(courselike_key, user) diff --git a/cms/djangoapps/contentstore/tests/test_libraries.py b/cms/djangoapps/contentstore/tests/test_libraries.py index e7dcc3647886..376ba56d8dd9 100644 --- a/cms/djangoapps/contentstore/tests/test_libraries.py +++ b/cms/djangoapps/contentstore/tests/test_libraries.py @@ -440,10 +440,6 @@ def test_sync_if_source_library_changed(self): html_block_2 = modulestore().get_item(lc_block.children[0]) self.assertEqual(html_block_2.data, data2) - @patch( - 'openedx.core.djangoapps.content_libraries.tasks.SearchEngine.get_search_engine', - Mock(return_value=None, autospec=True), - ) def test_sync_if_capa_type_changed(self): """ Tests that children are automatically refreshed if capa type field changes """ name1, name2 = "Option Problem", "Multiple Choice Problem" diff --git a/cms/djangoapps/contentstore/utils.py b/cms/djangoapps/contentstore/utils.py index e5f73b8137e0..5f2015ffa0fc 100644 --- a/cms/djangoapps/contentstore/utils.py +++ b/cms/djangoapps/contentstore/utils.py @@ -74,6 +74,7 @@ use_new_video_uploads_page, use_new_custom_pages, use_tagging_taxonomy_list_page, + # use_xpert_translations_component, ) from cms.djangoapps.models.settings.course_grading import CourseGradingModel from xmodule.library_tools import LibraryToolsService @@ -1537,6 +1538,7 @@ def get_course_videos_context(course_block, pagination_conf, course_key=None): get_transcript_preferences, ) from openedx.core.djangoapps.video_config.models import VideoTranscriptEnabledFlag + from openedx.core.djangoapps.video_config.toggles import use_xpert_translations_component from xmodule.video_block.transcripts_utils import Transcript # lint-amnesty, pylint: disable=wrong-import-order from .video_storage_handlers import ( @@ -1561,6 +1563,7 @@ def get_course_videos_context(course_block, pagination_conf, course_key=None): course = modulestore().get_course(course_key) is_video_transcript_enabled = VideoTranscriptEnabledFlag.feature_enabled(course.id) + is_ai_translations_enabled = use_xpert_translations_component(course.id) previous_uploads, pagination_context = _get_index_videos(course, pagination_conf) course_video_context = { 'context_course': course, @@ -1581,6 +1584,7 @@ def get_course_videos_context(course_block, pagination_conf, course_key=None): 'supported_file_formats': settings.VIDEO_IMAGE_SUPPORTED_FILE_FORMATS }, 'is_video_transcript_enabled': is_video_transcript_enabled, + 'is_ai_translations_enabled': is_ai_translations_enabled, 'active_transcript_preferences': None, 'transcript_credentials': None, 'transcript_available_languages': get_all_transcript_languages(), diff --git a/cms/djangoapps/contentstore/video_storage_handlers.py b/cms/djangoapps/contentstore/video_storage_handlers.py index 4d546aab3de5..f68d71a6bf6b 100644 --- a/cms/djangoapps/contentstore/video_storage_handlers.py +++ b/cms/djangoapps/contentstore/video_storage_handlers.py @@ -234,15 +234,26 @@ def get_video_usage_path(course_key, edx_video_id): 'category': 'video' }, ) + for video in videos: video_id = getattr(video, 'edx_video_id', '') - if video_id == edx_video_id: - unit = video.get_parent() - subsection = unit.get_parent() - subsection_display_name = getattr(subsection, 'display_name', '') - unit_display_name = getattr(unit, 'display_name', '') - xblock_display_name = getattr(video, 'display_name', '') - usage_locations.append(f'{subsection_display_name} - {unit_display_name} / {xblock_display_name}') + try: + if video_id == edx_video_id: + usage_dict = {'display_location': '', 'url': ''} + video_location = str(video.location) + xblock_display_name = getattr(video, 'display_name', '') + unit = video.get_parent() + unit_location = str(video.parent) + unit_display_name = getattr(unit, 'display_name', '') + subsection = unit.get_parent() + subsection_display_name = getattr(subsection, 'display_name', '') + usage_dict['display_location'] = (f'{subsection_display_name} - ' + f'{unit_display_name} / {xblock_display_name}') + usage_dict['url'] = f'/container/{unit_location}#{video_location}' + usage_locations.append(usage_dict) + except AttributeError: + continue + return {'usage_locations': usage_locations} @@ -666,12 +677,12 @@ def videos_index_html(course, pagination_conf=None): """ Returns an HTML page to display previous video uploads and allow new ones """ + if use_new_video_uploads_page(course.id): + return redirect(get_video_uploads_url(course.id)) context = get_course_videos_context( course, pagination_conf, ) - if use_new_video_uploads_page(course.id): - return redirect(get_video_uploads_url(course.id)) return render_to_response('videos_index.html', context) diff --git a/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py b/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py index 429630ac8d1b..170c98d1eb09 100644 --- a/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py +++ b/cms/djangoapps/contentstore/views/tests/test_clipboard_paste.py @@ -3,6 +3,7 @@ allow users to paste XBlocks that were copied using the staged_content/clipboard APIs. """ +import ddt from opaque_keys.edx.keys import UsageKey from rest_framework.test import APIClient from xmodule.modulestore.django import contentstore @@ -13,6 +14,7 @@ XBLOCK_ENDPOINT = "/xblock/" +@ddt.ddt class ClipboardPasteTestCase(ModuleStoreTestCase): """ Test Clipboard Paste functionality @@ -99,6 +101,42 @@ def test_copy_and_paste_unit(self): # The new block should store a reference to where it was copied from assert dest_unit.copied_from_block == str(unit_key) + @ddt.data( + # A problem with absolutely no fields set. A previous version of copy-paste had an error when pasting this. + {"category": "problem", "display_name": None, "data": ""}, + {"category": "problem", "display_name": "Emoji Land 😎", "data": "emoji in the body 😎"}, + ) + def test_copy_and_paste_component(self, block_args): + """ + Test copying a component (XBlock) from one course into another + """ + source_course = CourseFactory.create(display_name='Destination Course') + source_block = BlockFactory.create(parent_location=source_course.location, **block_args) + + dest_course = CourseFactory.create(display_name='Destination Course') + with self.store.bulk_operations(dest_course.id): + dest_chapter = BlockFactory.create(parent=dest_course, category='chapter', display_name='Section') + dest_sequential = BlockFactory.create(parent=dest_chapter, category='sequential', display_name='Subsection') + + # Copy the block + client = APIClient() + client.login(username=self.user.username, password=self.user_password) + copy_response = client.post(CLIPBOARD_ENDPOINT, {"usage_key": str(source_block.location)}, format="json") + assert copy_response.status_code == 200 + + # Paste the unit + paste_response = client.post(XBLOCK_ENDPOINT, { + "parent_locator": str(dest_sequential.location), + "staged_content": "clipboard", + }, format="json") + assert paste_response.status_code == 200 + dest_block_key = UsageKey.from_string(paste_response.json()["locator"]) + + dest_block = self.store.get_item(dest_block_key) + assert dest_block.display_name == source_block.display_name + # The new block should store a reference to where it was copied from + assert dest_block.copied_from_block == str(source_block.location) + def test_paste_with_assets(self): """ When pasting into a different course, any required static assets should diff --git a/cms/envs/common.py b/cms/envs/common.py index 11afd870a016..e4d23241bf4a 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -115,7 +115,6 @@ ENTERPRISE_BACKEND_SERVICE_EDX_OAUTH2_PROVIDER_URL, # Blockstore - BLOCKSTORE_USE_BLOCKSTORE_APP_API, BUNDLE_ASSET_STORAGE_SETTINGS, # Methods to derive settings @@ -298,9 +297,6 @@ # Enable content libraries (modulestore) search functionality 'ENABLE_LIBRARY_INDEX': False, - # Enable content libraries (blockstore) indexing - 'ENABLE_CONTENT_LIBRARY_INDEX': False, - # .. toggle_name: FEATURES['ALLOW_COURSE_RERUNS'] # .. toggle_implementation: DjangoSetting # .. toggle_default: True @@ -2606,8 +2602,7 @@ PROCTORING_SETTINGS = {} ################## BLOCKSTORE RELATED SETTINGS ######################### -BLOCKSTORE_PUBLIC_URL_ROOT = 'http://localhost:18250' -BLOCKSTORE_API_URL = 'http://localhost:18250/api/v1/' + # Which of django's caches to use for storing anonymous user state for XBlocks # in the blockstore-based XBlock runtime XBLOCK_RUNTIME_V2_EPHEMERAL_DATA_CACHE = 'default' diff --git a/cms/envs/devstack-experimental.yml b/cms/envs/devstack-experimental.yml index 8aa2c304af81..54f6edf8f9f2 100644 --- a/cms/envs/devstack-experimental.yml +++ b/cms/envs/devstack-experimental.yml @@ -40,8 +40,6 @@ AWS_SES_REGION_ENDPOINT: email.us-east-1.amazonaws.com AWS_SES_REGION_NAME: us-east-1 AWS_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name) BASE_COOKIE_DOMAIN: localhost -BLOCKSTORE_API_URL: http://localhost:18250/api/v1 -BLOCKSTORE_PUBLIC_URL_ROOT: http://localhost:18250 BLOCK_STRUCTURES_SETTINGS: COURSE_PUBLISH_TASK_DELAY: 30 TASK_DEFAULT_RETRY_DELAY: 30 diff --git a/cms/envs/devstack.py b/cms/envs/devstack.py index 275a1fd31e72..7deb16c7eb67 100644 --- a/cms/envs/devstack.py +++ b/cms/envs/devstack.py @@ -147,7 +147,6 @@ def should_show_debug_toolbar(request): # lint-amnesty, pylint: disable=missing ################################ SEARCH INDEX ################################ FEATURES['ENABLE_COURSEWARE_INDEX'] = True FEATURES['ENABLE_LIBRARY_INDEX'] = False -FEATURES['ENABLE_CONTENT_LIBRARY_INDEX'] = False SEARCH_ENGINE = "search.elastic.ElasticSearchEngine" ELASTIC_SEARCH_CONFIG = [ diff --git a/cms/envs/production.py b/cms/envs/production.py index d0a846d3da21..262d0d4c4629 100644 --- a/cms/envs/production.py +++ b/cms/envs/production.py @@ -510,7 +510,7 @@ def get_env_setting(setting): # Example: {'CN': 'http://api.xuetangx.com/edx/video?s3_url='} VIDEO_CDN_URL = ENV_TOKENS.get('VIDEO_CDN_URL', {}) -if FEATURES['ENABLE_COURSEWARE_INDEX'] or FEATURES['ENABLE_LIBRARY_INDEX'] or FEATURES['ENABLE_CONTENT_LIBRARY_INDEX']: +if FEATURES['ENABLE_COURSEWARE_INDEX'] or FEATURES['ENABLE_LIBRARY_INDEX']: # Use ElasticSearch for the search engine SEARCH_ENGINE = "search.elastic.ElasticSearchEngine" diff --git a/cms/envs/test.py b/cms/envs/test.py index e7be26b73c0e..118d7e27a79c 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -27,8 +27,6 @@ # import settings from LMS for consistent behavior with CMS from lms.envs.test import ( # pylint: disable=wrong-import-order - BLOCKSTORE_USE_BLOCKSTORE_APP_API, - BLOCKSTORE_API_URL, COMPREHENSIVE_THEME_DIRS, # unimport:skip DEFAULT_FILE_STORAGE, ECOMMERCE_API_URL, @@ -184,10 +182,6 @@ } ############################### BLOCKSTORE ##################################### -# Blockstore tests -RUN_BLOCKSTORE_TESTS = os.environ.get('EDXAPP_RUN_BLOCKSTORE_TESTS', 'no').lower() in ('true', 'yes', '1') -BLOCKSTORE_API_URL = os.environ.get('EDXAPP_BLOCKSTORE_API_URL', "http://edx.devstack.blockstore-test:18251/api/v1/") -BLOCKSTORE_API_AUTH_TOKEN = os.environ.get('EDXAPP_BLOCKSTORE_API_AUTH_TOKEN', 'edxapp-test-key') BUNDLE_ASSET_STORAGE_SETTINGS = dict( STORAGE_CLASS='django.core.files.storage.FileSystemStorage', STORAGE_KWARGS=dict( @@ -265,21 +259,10 @@ # Courseware Search Index FEATURES['ENABLE_COURSEWARE_INDEX'] = True FEATURES['ENABLE_LIBRARY_INDEX'] = True -FEATURES['ENABLE_CONTENT_LIBRARY_INDEX'] = False SEARCH_ENGINE = "search.tests.mock_search_engine.MockSearchEngine" FEATURES['ENABLE_ENROLLMENT_TRACK_USER_PARTITION'] = True -####################### ELASTICSEARCH TESTS ####################### -# Enable this when testing elasticsearch-based code which couldn't be tested using the mock engine -ENABLE_ELASTICSEARCH_FOR_TESTS = os.environ.get( - 'EDXAPP_ENABLE_ELASTICSEARCH_FOR_TESTS', 'no').lower() in ('true', 'yes', '1') - -TEST_ELASTICSEARCH_USE_SSL = os.environ.get( - 'EDXAPP_TEST_ELASTICSEARCH_USE_SSL', 'no').lower() in ('true', 'yes', '1') -TEST_ELASTICSEARCH_HOST = os.environ.get('EDXAPP_TEST_ELASTICSEARCH_HOST', 'edx.devstack.elasticsearch710') -TEST_ELASTICSEARCH_PORT = int(os.environ.get('EDXAPP_TEST_ELASTICSEARCH_PORT', '9200')) - ########################## AUTHOR PERMISSION ####################### FEATURES['ENABLE_CREATOR_GROUP'] = False diff --git a/cms/static/js/i18n/el/djangojs.js b/cms/static/js/i18n/el/djangojs.js index b285dc7c78cf..ea7d101fd4f8 100644 --- a/cms/static/js/i18n/el/djangojs.js +++ b/cms/static/js/i18n/el/djangojs.js @@ -75,6 +75,8 @@ "April": "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2", "Are you sure you want to delete this post?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03c1\u03c4\u03b7\u03c3\u03b7;", "Are you sure you want to delete this response?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7;", + "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});", + "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});", "Are you sure you want to unenroll from {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {courseName} ({courseNumber});", "Assessment": "\u0391\u03be\u03b9\u03bf\u03bb\u03cc\u03b3\u03b7\u03c3\u03b7", "Assessments": "\u0391\u03be\u03b9\u03bf\u03bb\u03bf\u03b3\u03ae\u03c3\u03b5\u03b9\u03c2", @@ -126,6 +128,7 @@ "Course Name": "\u03a4\u03af\u03c4\u03bb\u03bf\u03c2 \u03bc\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2", "Course Number": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u039c\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2", "Create Account": "\u03a0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03b5\u03b4\u03ce \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b7 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03b1\u03c2", + "Create a report of problem responses": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2", "Create an Account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd", "Create an Account.": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd", "Create an account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd", @@ -153,7 +156,7 @@ "Engage with posts": "\u0394\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 \u03b1\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd", "Enter Due Date and Time": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03ba\u03b1\u03b9 \u03ce\u03c1\u03b1 \u03bb\u03ae\u03be\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03c0\u03c1\u03bf\u03b8\u03b5\u03c3\u03bc\u03af\u03b1\u03c2 \u03c5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae\u03c2", "Enter a student's username or email address.": "\u03a0\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5 \u03c3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae..", - "Enter a username or email.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail", + "Enter a username or email.": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail", "Enter and confirm your new password.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf \u03bd\u03ad\u03bf \u03c3\u03b1\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc.", "Enter username or email": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03c3\u03b1\u03c2", "Enter your {platform_display_name} username or the URL to your {platform_display_name} page. Delete the URL to remove the link.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name} \u03ae \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name}. \u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c6\u03b1\u03b9\u03c1\u03ad\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf.", @@ -174,6 +177,7 @@ "Full Name": "\u039f\u03bd\u03bf\u03bc\u03b1\u03c4\u03b5\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf", "Full Profile": "\u03a4\u03b7\u03bd \u03c0\u03bb\u03ae\u03c1\u03b7 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ae \u03bc\u03bf\u03c5 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1", "Gender": "\u03a6\u03cd\u03bb\u03bf", + "Generate Exception Certificates": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03b5\u03c9\u03bd", "Grading": "\u0392\u0391\u0398\u039c\u039f\u039b\u039f\u0393\u0399\u0391", "Heading": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1", "Heading (Ctrl+H)": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 (Ctrl+H)", @@ -310,9 +314,11 @@ "Student": "\u03a3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae\u03c2", "Submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae", "Successfully enrolled and sent email to the following users:": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2 \u03b4\u03ae\u03bb\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03b5\u03be\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2:", + "Successfully started task to reset attempts for problem '<%- problem_id %>'. Click the 'Show Task Status' button to see the status of the task.": "\u039e\u03b5\u03ba\u03af\u03bd\u03b7\u03c3\u03b5 \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1 \u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u03b3\u03b9\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03c9\u03bd \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03b5\u03b9\u03ce\u03bd \u03b3\u03b9\u03b1 \u03c4\u03bf \u03c4\u03b5\u03c3\u03c4 \"<%- problem_id %>\". \u039a\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2\", \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2.", "Support education research by providing additional information": "\u03a3\u03c5\u03bd\u03b5\u03b9\u03c3\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7\u03bd \u03b5\u03ba\u03c0\u03b1\u03b9\u03b4\u03b5\u03c5\u03c4\u03b9\u03ba\u03ae \u03ad\u03c1\u03b5\u03c5\u03bd\u03b1 \u03b4\u03af\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b5\u03c2 \u03b5\u03c0\u03b9\u03c0\u03bb\u03ad\u03bf\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2.", "Supported file types: {supportedVideoTypes}": "\u03a3\u03c5\u03bc\u03b2\u03b1\u03c4\u03bf\u03af \u03c4\u03cd\u03c0\u03bf\u03b9 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd: {supportedVideoTypes}", "TOTAL": "\u03a3\u03a5\u039d\u039f\u039b\u039f", + "Task Status": "\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2", "Team Description (Required) *": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*", "Team Name (Required) *": "\u038c\u03bd\u03bf\u03bc\u03b1 \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*", "Terms of Service and Honor Code": "\u038c\u03c1\u03bf\u03b9 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03a4\u03b9\u03bc\u03ae\u03c2", @@ -356,7 +362,7 @@ "URL": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL", "Undo (Ctrl+Z)": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl+Z)", "Undo Changes": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd", - "Unendorse": "\u0394\u03b5\u03bd \u03c0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9", + "Unendorse": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 \"\u03a0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9\"", "Unit": "\u039a\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03bf", "Upload File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5", "Upload New File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03bd\u03ad\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5", diff --git a/cms/static/js/i18n/eo/djangojs.js b/cms/static/js/i18n/eo/djangojs.js index 1d127306f289..fd3ea5bef809 100644 --- a/cms/static/js/i18n/eo/djangojs.js +++ b/cms/static/js/i18n/eo/djangojs.js @@ -479,6 +479,7 @@ "Copy": "\u00c7\u00f6p\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9#", "Copy Component Location": "\u00c7\u00f6p\u00fd \u00c7\u00f6mp\u00f6n\u00e9nt L\u00f6\u00e7\u00e4t\u00ef\u00f6n \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3#", "Copy Email To Editor": "\u00c7\u00f6p\u00fd \u00c9m\u00e4\u00efl T\u00f6 \u00c9d\u00eft\u00f6r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #", + "Copy Unit": "\u00c7\u00f6p\u00fd \u00dbn\u00eft \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#", "Copy of '{componentDisplayName}'": "\u00c7\u00f6p\u00fd \u00f6f '{componentDisplayName}' \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#", "Copy row": "\u00c7\u00f6p\u00fd r\u00f6w \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#", "Copy to Clipboard": "\u00c7\u00f6p\u00fd t\u00f6 \u00c7l\u00efp\u00df\u00f6\u00e4rd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#", diff --git a/cms/static/js/i18n/es-419/djangojs.js b/cms/static/js/i18n/es-419/djangojs.js index 549e97e0b542..587d4c2077cd 100644 --- a/cms/static/js/i18n/es-419/djangojs.js +++ b/cms/static/js/i18n/es-419/djangojs.js @@ -599,6 +599,7 @@ "Copy Component Location": "Copiar la ubicaci\u00f3n del Componente", "Copy Email To Editor": "Copiar el correo al editor", "Copy Exam Code": "Copia el C\u00f3digo de el Examen", + "Copy Unit": "Copiar unidad", "Copy of '{componentDisplayName}'": "Copia de '{componentDisplayName}'", "Copy row": "Copiar la fila", "Copy to Clipboard": "Copiar al portapapeles", @@ -1232,6 +1233,7 @@ "Manage Learners": "Manejar Estudiantes", "Manage Tags": "Administrar etiquetas", "Manage my subscription": "Gestionar mi suscripci\u00f3n", + "Manage tags": "Administrar etiquetas", "Manual": "Manual", "March": "Marzo", "Mark Exam As Completed": "Marcar el examen como completado", diff --git a/cms/static/js/i18n/rtl/djangojs.js b/cms/static/js/i18n/rtl/djangojs.js index 7e60d7631cf1..193b0b1d599c 100644 --- a/cms/static/js/i18n/rtl/djangojs.js +++ b/cms/static/js/i18n/rtl/djangojs.js @@ -444,6 +444,7 @@ "Copy": "\u023b\u00f8d\u028e", "Copy Component Location": "\u023b\u00f8d\u028e \u023b\u00f8\u026fd\u00f8n\u01ddn\u0287 \u0141\u00f8\u0254\u0250\u0287\u1d09\u00f8n", "Copy Email To Editor": "\u023b\u00f8d\u028e \u0246\u026f\u0250\u1d09l \u0166\u00f8 \u0246d\u1d09\u0287\u00f8\u0279", + "Copy Unit": "\u023b\u00f8d\u028e \u0244n\u1d09\u0287", "Copy of '{componentDisplayName}'": "\u023b\u00f8d\u028e \u00f8\u025f '{componentDisplayName}'", "Copy row": "\u023b\u00f8d\u028e \u0279\u00f8\u028d", "Copy to Clipboard": "\u023b\u00f8d\u028e \u0287\u00f8 \u023bl\u1d09db\u00f8\u0250\u0279d", diff --git a/cms/static/js/views/pages/container.js b/cms/static/js/views/pages/container.js index 9a15c779df1a..cea6eb856bd3 100644 --- a/cms/static/js/views/pages/container.js +++ b/cms/static/js/views/pages/container.js @@ -177,6 +177,12 @@ function($, _, Backbone, gettext, BasePage, self.initializePasteButton(); } + var targetId = window.location.hash.slice(1); + if (targetId) { + var target = document.getElementById(targetId); + target.scrollIntoView({ behavior: 'smooth', inline: 'center' }); + } + }, block_added: options && options.block_added }); diff --git a/cms/templates/studio_xblock_wrapper.html b/cms/templates/studio_xblock_wrapper.html index 4c73f940b9d6..19d9c876ed48 100644 --- a/cms/templates/studio_xblock_wrapper.html +++ b/cms/templates/studio_xblock_wrapper.html @@ -43,9 +43,9 @@ % if not is_root: % if is_reorderable: -
  • +
  • % else: -
    +
    % endif
    , 2022\n" "Language-Team: Arabic (http://app.transifex.com/open-edx/edx-platform/language/ar/)\n" @@ -320,7 +320,8 @@ msgstr "اختر الملف" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6486,6 +6487,7 @@ msgstr "هل أنت واثق من رغبتك في حذف هذا التحديث؟ #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6495,26 +6497,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6522,21 +6529,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11266,6 +11277,10 @@ msgstr "إخفاء من المتعلمين" msgid "Note: Do not hide graded assignments after they have been released." msgstr "ملاحظة: لا تقم بإخفاء المهام المتدرجة بعد إطلاقها. " +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "تاريخ وتوقيت الإصدار" @@ -11457,6 +11472,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "الدور الحالي:" diff --git a/conf/locale/ca/LC_MESSAGES/django.po b/conf/locale/ca/LC_MESSAGES/django.po index 40b0e7c860ff..3ca71863e871 100644 --- a/conf/locale/ca/LC_MESSAGES/django.po +++ b/conf/locale/ca/LC_MESSAGES/django.po @@ -10287,6 +10287,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10321,7 +10334,8 @@ msgid "Select a Library." msgstr "" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12363,14 +12377,6 @@ msgstr "Requisits" msgid "Details" msgstr "Detalls" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Vista" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13147,6 +13153,14 @@ msgstr "Seqüència" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Inscriviu-vos a {platform_name}" @@ -19055,6 +19069,11 @@ msgstr "Ho tinc!" msgid "Learn more" msgstr "Aprèn més" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Vista" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -19766,6 +19785,10 @@ msgstr "Veure versió en directe" msgid "Preview the courseware in the LMS" msgstr "Previsualitzeu el material informàtic al LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Addició de components" @@ -22737,14 +22760,26 @@ msgstr "" "També podeu crear tipus d'assignacions, com ara tasques, laboratoris, proves" " i exàmens, i especificar quant val la pena la qualificació d'un alumne." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Amplia o redueix" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/ca/LC_MESSAGES/djangojs.po b/conf/locale/ca/LC_MESSAGES/djangojs.po index 7900887d2461..4163a7819aae 100644 --- a/conf/locale/ca/LC_MESSAGES/djangojs.po +++ b/conf/locale/ca/LC_MESSAGES/djangojs.po @@ -48,7 +48,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Waheed Ahmed , 2019\n" "Language-Team: Catalan (http://app.transifex.com/open-edx/edx-platform/language/ca/)\n" @@ -169,7 +169,8 @@ msgstr "Escull arxiu" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -1850,6 +1851,7 @@ msgstr "Resultats de la cerca" msgid "[no tags]" msgstr "" +#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# #. Translators: 'Tags' is the name of the view (noun) within the Student Notes #. page that shows all #. notes organized by the tags the student has associated with them (if any). @@ -1858,6 +1860,7 @@ msgstr "" #. with the note #. in order to group similar notes together and help with search. #: lms/static/js/edxnotes/views/tabs/tags.js +#: cms/templates/js/tag-list.underscore msgid "Tags" msgstr "" @@ -5819,6 +5822,7 @@ msgstr "Segur que vols esborrar aquesta actualització?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5828,26 +5832,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5855,21 +5864,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10560,6 +10573,10 @@ msgstr "" "Nota: No amagueu les assignacions graduades després d'haver estat " "alliberades." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Data i hora de publicació" @@ -10759,6 +10776,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Rol actual:" diff --git a/conf/locale/de_DE/LC_MESSAGES/django.mo b/conf/locale/de_DE/LC_MESSAGES/django.mo index 922823b66a5a..5abc0f1668b7 100644 Binary files a/conf/locale/de_DE/LC_MESSAGES/django.mo and b/conf/locale/de_DE/LC_MESSAGES/django.mo differ diff --git a/conf/locale/de_DE/LC_MESSAGES/django.po b/conf/locale/de_DE/LC_MESSAGES/django.po index 1bfcdc1dbc6a..a45a2eb18875 100644 --- a/conf/locale/de_DE/LC_MESSAGES/django.po +++ b/conf/locale/de_DE/LC_MESSAGES/django.po @@ -11576,6 +11576,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Die Aufgabe ist abgelaufen. Die Bibliothek hat neue Inhalte." @@ -11612,8 +11625,9 @@ msgid "Select a Library." msgstr "Wählen Sie eine Bibliothek." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "In den angegebenen Bibliotheken gab es keine passenden Aufgabentypen." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -13896,14 +13910,6 @@ msgstr "Vorraussetzungen" msgid "Details" msgstr "Details" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Ansicht" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -14684,6 +14690,14 @@ msgstr "Ablauf" msgid "Completed" msgstr "Beendet" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Registrieren bei {platform_name}" @@ -20759,6 +20773,11 @@ msgstr "Verstanden!" msgid "Learn more" msgstr "Lernen Sie mehr" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Ansicht" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(aktiv){span_end}" @@ -21483,6 +21502,10 @@ msgstr "Live-Version betrachten" msgid "Preview the courseware in the LMS" msgstr "Vorschau der Kursinhalte im LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Komponenten werden hinzugefügt" @@ -24501,14 +24524,26 @@ msgstr "" "und Klausuren erstellen. Dann kannst du festlegen, wie viel die Note des " "Teilnehmers für die jeweilige Aufgabe wert ist." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Aufklappen oder zusammenlegen" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/de_DE/LC_MESSAGES/djangojs.po b/conf/locale/de_DE/LC_MESSAGES/djangojs.po index 51e8e52edebb..e35cba117f03 100644 --- a/conf/locale/de_DE/LC_MESSAGES/djangojs.po +++ b/conf/locale/de_DE/LC_MESSAGES/djangojs.po @@ -134,7 +134,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Alfredo Guillem, 2022\n" "Language-Team: German (Germany) (http://app.transifex.com/open-edx/edx-platform/language/de_DE/)\n" @@ -260,7 +260,8 @@ msgstr "Datei auswählen" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6499,6 +6500,7 @@ msgstr "Wollen Sie wirklich die Aktualisierungen löschen?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6508,26 +6510,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6535,21 +6542,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11416,6 +11427,10 @@ msgstr "" "Hinweis: Blenden Sie benotete Aufgaben nicht aus, nachdem sie freigegeben " "wurden." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Freigabedatum und Uhrzeit" @@ -11614,6 +11629,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Aktuelle Rolle:" diff --git a/conf/locale/el/LC_MESSAGES/django.mo b/conf/locale/el/LC_MESSAGES/django.mo index 7e2fe4b064ba..2468bcb2939f 100644 Binary files a/conf/locale/el/LC_MESSAGES/django.mo and b/conf/locale/el/LC_MESSAGES/django.mo differ diff --git a/conf/locale/el/LC_MESSAGES/django.po b/conf/locale/el/LC_MESSAGES/django.po index 73da7b9dbc43..5b7fc37c372a 100644 --- a/conf/locale/el/LC_MESSAGES/django.po +++ b/conf/locale/el/LC_MESSAGES/django.po @@ -72,6 +72,7 @@ # Konstantina Samara , 2015 # kostas kalatzis , 2015 # Nick Gikopoulos, 2014-2015 +# Ειρήνη Απέργη, 2023 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/) # Copyright (C) 2023 edX @@ -273,7 +274,7 @@ msgstr "" #: common/djangoapps/course_modes/helpers.py #: lms/templates/instructor/instructor_dashboard_2/course_info.html msgid "Verified" -msgstr "Με πιστοποίηση ταυτότητας" +msgstr "Επαληθευμένοι" #: common/djangoapps/course_modes/helpers.py msgid "ID Verified Ribbon/Badge" @@ -2888,6 +2889,10 @@ msgid "" " course content but can no longer participate in graded assignments or work " "towards earning a certificate." msgstr "" +"Μετά από αυτήν την ημερομηνία, το μάθημα θα μπει σε καθεστώς αυτομελέτης, " +"που σημαίνει ότι θα μπορείτε να δείτε το περιεχόμενο του μαθήματος, αλλά δε " +"θα μπορείτε πλέον να υποβάλετε τα τεστ και την τελική εξέταση για την " +"απόκτηση της βεβαίωσης παρακολούθησης." #: lms/djangoapps/courseware/date_summary.py msgid "" @@ -3439,6 +3444,8 @@ msgid "" "The {report_type} report is being created. To view the status of the report," " see Pending Tasks below." msgstr "" +"Η αναφορά {report_type} δημιουργείται. Για να δείτε την κατάσταση της " +"αναφοράς, ανατρέξτε στην ενότητα 'Εκκρεμείς διεργασίες' παρακάτω." #: lms/djangoapps/instructor/views/api.py msgid "" @@ -3710,7 +3717,7 @@ msgstr "" #: lms/djangoapps/instructor/views/api.py #: lms/djangoapps/instructor_task/api_helper.py msgid "enrollment" -msgstr "εγγραφή" +msgstr "\"Εγγραφή\"" #: lms/djangoapps/instructor/views/api.py msgid "The file must contain a 'cohort' column containing cohort names." @@ -4221,6 +4228,9 @@ msgid "" " see Pending Tasks below. You will be able to download the report when it is" " complete." msgstr "" +"Η αναφορά {report_type} δημιουργείται. Για να δείτε την κατάσταση της " +"αναφοράς, ανατρέξτε στην ενότητα 'Εκκρεμείς διεργασίες' παρακάτω. Θα " +"μπορείτε να κάνετε λήψη της αναφοράς, όταν ολοκληρωθεί." #: lms/djangoapps/instructor_task/api_helper.py msgid "This component cannot be rescored." @@ -10533,6 +10543,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10567,7 +10590,8 @@ msgid "Select a Library." msgstr "" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12565,12 +12589,6 @@ msgstr "" msgid "Details" msgstr "" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Προβολή" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -12786,7 +12804,7 @@ msgstr "" #: lms/templates/dashboard.html lms/templates/header/user_dropdown.html #: lms/templates/user_dropdown.html msgid "Dashboard" -msgstr "" +msgstr "Μαθήματα" #: lms/templates/dashboard.html msgid "results successfully populated," @@ -13341,6 +13359,14 @@ msgstr "" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "" @@ -13468,12 +13494,12 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html #: lms/templates/staff_problem_info.html msgid "Delete Learner's State" -msgstr "" +msgstr "Διαγραφή απαντήσεων και βαθμών" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html #: lms/templates/staff_problem_info.html msgid "Rescore Learner's Submission" -msgstr "" +msgstr "Υποβολή αναβαθμολόγησης" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html #: lms/templates/staff_problem_info.html @@ -13503,6 +13529,8 @@ msgstr "" #: lms/templates/staff_problem_info.html msgid "Enter the learner email address or username" msgstr "" +"Εισαγάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου ή το όνομα χρήστη του " +"φοιτητή" #: lms/templates/staff_problem_info.html msgid "View History" @@ -14701,7 +14729,7 @@ msgstr "" #: lms/templates/ccx/student_admin.html msgid "View gradebook" -msgstr "" +msgstr "Προβολή βαθμών" #: lms/templates/ccx/student_admin.html msgid "Download student grades" @@ -15634,7 +15662,7 @@ msgstr "" #: lms/templates/dashboard/_dashboard_certificate_information.html msgid "View my {cert_name_short}" -msgstr "" +msgstr "Δείτε τη {cert_name_short} " #: lms/templates/dashboard/_dashboard_certificate_information.html msgid "Complete our course feedback survey" @@ -16368,6 +16396,11 @@ msgid "" "your verification was successful.You can also check the status of the " "verification process on your dashboard." msgstr "" +"Λάβαμε τα στοιχεία σας και ξεκίνησε η διαδικασία επαλήθευσης ταυτότητας. " +"Ελέγξτε αν θα λάβετε μήνυμα ηλεκτρονικού ταχυδρομείου από εμάς τις επόμενες " +"ημέρες, για να επιβεβαιώσετε αν η επαλήθευσή σας ήταν επιτυχής. Μπορείτε " +"επίσης να ελέγξετε την κατάσταση της διαδικασίας επαλήθευσης στην καρτέλα " +"\"Μαθήματα\"." #: lms/templates/emails/reject_name_change.txt msgid "" @@ -16562,7 +16595,7 @@ msgstr "Αναζήτηση Μαθημάτων" #: lms/templates/header/navbar-logo-header.html msgid "{name} Dashboard" -msgstr "" +msgstr "{name} Μαθήματα" #: lms/templates/header/navbar-not-authenticated.html msgid "Supplemental Links" @@ -16580,7 +16613,7 @@ msgstr "" #: lms/templates/header/navbar-not-authenticated.html msgid "Register for free" -msgstr "" +msgstr "Εγγραφή" #: lms/templates/header/user_dropdown.html msgid "Profile" @@ -16693,7 +16726,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/send_email.html #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Pending Tasks" -msgstr "" +msgstr "Εκκρεμείς διαδικασίες" #: lms/templates/instructor/instructor_dashboard_2/certificates.html #: lms/templates/instructor/instructor_dashboard_2/course_info.html @@ -16760,7 +16793,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/certificates.html msgid "Invalidate Certificates" -msgstr "" +msgstr "Ακύρωση βεβαιώσεων" #: lms/templates/instructor/instructor_dashboard_2/course_info.html msgid "Enrollment Information" @@ -16776,7 +16809,7 @@ msgstr "Ακροατές" #: lms/templates/instructor/instructor_dashboard_2/course_info.html msgid "Honor" -msgstr "Με Κώδικα Τιμής." +msgstr "Με κώδικα τιμής" #: lms/templates/instructor/instructor_dashboard_2/course_info.html msgid "Professional" @@ -16861,10 +16894,14 @@ msgid "" "exams and problem sets), and can be changed on the 'Grading' page (under " "'Settings') in Studio." msgstr "" +"Κάντε κλικ, για να εμφανίσετε τη διαμόρφωση βαθμολογίας για το μάθημα. Η " +"διαμόρφωση βαθμολογίας είναι η ανάλυση των βαθμολογούμενων κεφαλαίων του " +"μαθήματος (όπως τεστ και τελική εξέταση) και μπορεί να αλλάξει στη σελίδα " +"\"Βαθμολογία\" (στην καρτέλα \"Ρυθμίσεις\") στο Studio." #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Grading Configuration" -msgstr "" +msgstr "Διαμόρφωση βαθμολογίας" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" @@ -16884,18 +16921,30 @@ msgid "" "background, meaning it is OK to navigate away from this page while your " "report is generating." msgstr "" +"Για μεγάλα μαθήματα, η δημιουργία ορισμένων αναφορών μπορεί να διαρκέσει " +"αρκετές ώρες. Όταν ολοκληρωθεί η δημιουργία αναφορών, ένας σύνδεσμος που " +"περιλαμβάνει την ημερομηνία και την ώρα δημιουργίας εμφανίζεται στον " +"παρακάτω πίνακα. Αυτές οι αναφορές δημιουργούνται στο παρασκήνιο, που " +"σημαίνει ότι μπορείτε να απομακρυνθείτε από αυτήν τη σελίδα κατά τη " +"δημιουργία της αναφοράς σας." #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" "Please be patient and do not click these buttons multiple times. Clicking " "these buttons multiple times will significantly slow the generation process." msgstr "" +"Παρακαλούμε να είστε υπομονετικοί και μην κάνετε πολλές φορές κλικ σε αυτά " +"τα κουμπιά. Εάν κάνετε πολλές φορές κλικ σε αυτά τα κουμπιά, θα επιβραδυνθεί" +" σημαντικά η διαδικασία δημιουργίας." #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" "Click to generate a CSV file of all students enrolled in this course, along " "with profile information such as email address and username:" msgstr "" +"Κάνετε κλικ, για να δημιουργήσετε ένα αρχείο CSV όλων των φοιτητών που είναι" +" εγγεγραμμένοι σε αυτό το μάθημα, μαζί με πληροφορίες της προσωπικής σελίδας" +" τους, όπως email και όνομα χρήστη:" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Download profile information as a CSV" @@ -16906,18 +16955,20 @@ msgid "" "Click to generate a CSV file that lists learners who can enroll in the " "course but have not yet done so." msgstr "" +"Κάνετε κλικ, για να δημιουργήσετε ένα αρχείο CSV με τη λίστα φοιτητών που " +"μπορούν να εγγραφούν στο μάθημα, αλλά δεν το έχουν κάνει ακόμη." #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Download a CSV of learners who can enroll" -msgstr "" +msgstr "Λήψη CSV " #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Click to download a CSV of anonymized student IDs:" -msgstr "" +msgstr "Κάνετε κλικ για λήψη ενός αρχείου CSV με τα ανώνυμα IDs των φοιτητών:" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Get Student Anonymized IDs CSV" -msgstr "" +msgstr "Λήψη CSV" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" @@ -16942,6 +16993,9 @@ msgid "" "the problem. You also select a section or chapter to include results of all " "problems in that section or chapter." msgstr "" +"Επιλέξτε ένα τεστ, για να δημιουργήσετε ένα αρχείο CSV με όλες τις " +"απαντήσεις των μαθητών στο συγκεκριμένο τεστ. Μπορείτε επίσης να επιλέξετε " +"μια ενότητα ή κεφάλαιο, για να συμπεριλάβετε τα αποτελέσματα όλων των τεστ." #: lms/templates/instructor/instructor_dashboard_2/data_download.html #: lms/templates/instructor/instructor_dashboard_2/data_download_2/problem_report.html @@ -16961,14 +17015,16 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/data_download_2/certificates.html msgid "Click to list certificates that are issued for this course:" msgstr "" +"Κάνετε κλικ, για να δημιουργήσετε μια λίστα των βεβαιώσεων που εκδόθηκαν για" +" αυτό το μάθημα:" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "View Certificates Issued" -msgstr "" +msgstr "Προβολή βεβαιώσεων" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Download CSV of Certificates Issued" -msgstr "" +msgstr "Λήψη CSV" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" @@ -16985,6 +17041,8 @@ msgstr "" msgid "" "Click to generate a CSV grade report for all currently enrolled students." msgstr "" +"Κάνετε κλικ, για να δημιουργήσετε μια αναφορά βαθμολογίας σε μορφή CSV για " +"όλους τους εγγεγραμμένους φοιτητές." #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Generate Grade Report" @@ -16992,7 +17050,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Generate Problem Grade Report" -msgstr "" +msgstr "Δημιουργία αναφοράς βαθμολογίας τεστ" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Generate ORA Data Report" @@ -17007,6 +17065,8 @@ msgid "" "Click to generate a ZIP file that contains all submission texts and " "attachments." msgstr "" +"Κάντε κλικ για να δημιουργήσετε ένα αρχείο ZIP με όλα τα κείμενα και τα " +"συνημμένα που έχουν υποβληθεί." #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Generate Submission Files Archive" @@ -17104,6 +17164,8 @@ msgstr "" msgid "" "Specify the {platform_name} email address or username of a student here:" msgstr "" +"Συμπληρώστε τη διεύθυνση ηλεκτρονικού ταχυδρομείου που έχει δηλωθεί στο " +"{platform_name} ή το όνομα χρήστη του φοιτητή, εδώ:" #: lms/templates/instructor/instructor_dashboard_2/extensions.html msgid "Student Email or Username" @@ -17147,7 +17209,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/extensions.html msgid "List all students with due date extensions" -msgstr "" +msgstr "Λίστα φοιτητών" #: lms/templates/instructor/instructor_dashboard_2/extensions.html msgid "Specify a student to see all of that student's extensions." @@ -17167,6 +17229,9 @@ msgid "" "on a particular subsection. This will revert the due date for the student " "back to the problem's original due date." msgstr "" +"Η επαναφορά της ημερομηνίας λήξης ενός τεστ ακυρώνει την παράταση προθεσμίας" +" για έναν φοιτητή σε ένα συγκεκριμένο κεφάλαιο. Αυτό θα επαναφέρει την " +"ημερομηνία λήξης για τον μαθητή στην αρχική ημερομηνία λήξης του τεστ." #: lms/templates/instructor/instructor_dashboard_2/extensions.html msgid "Reason for reset" @@ -17715,7 +17780,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "View Gradebook" -msgstr "" +msgstr "Προβολή βαθμών" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "" @@ -17725,7 +17790,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "View a specific learner's enrollment status" -msgstr "" +msgstr "Δείτε την κατάσταση εγγραφής ενός συγκεκριμένου φοιτητή" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Learner's {platform_name} email address or username *" @@ -17733,7 +17798,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Learner email address or username" -msgstr "" +msgstr "Διεύθυνση ηλεκτρονικού ταχυδρομείου ή όνομα χρήστη φοιτητή" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "View Enrollment Status" @@ -17753,7 +17818,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Adjust a learner's grade for a specific problem" -msgstr "" +msgstr "Προσαρμόστε τη βαθμολογία ενός φοιτητή για ένα συγκεκριμένο τεστ" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Location of problem in course" @@ -17790,6 +17855,9 @@ msgid "" "Only If Score Improves' option updates the learner's score only if it " "improves in the learner's favor." msgstr "" +"Για το καθορισμένο πρόβλημα, βαθμολογήστε ξανά τις απαντήσεις του φοιτητή. Η" +" επιλογή \"Αναβαθμολόγηση μόνο για βελτίωση της βαθμολογίας\" ενημερώνει τη " +"βαθμολογία του φοιτητή, μόνο εάν βελτιωθεί προς όφελός του." #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Score Override" @@ -17803,6 +17871,8 @@ msgstr "" msgid "" "New score for problem, out of the total points available for the problem" msgstr "" +"Νέα βαθμολογία για το τεστ, από τους συνολικούς διαθέσιμους βαθμούς για το " +"τεστ" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Score" @@ -17814,7 +17884,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Problem History" -msgstr "" +msgstr "Ιστορικό ενός τεστ" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "" @@ -17824,7 +17894,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Task Status" -msgstr "" +msgstr "Κατάσταση διαδικασίας" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "" @@ -17890,6 +17960,8 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Adjust all enrolled learners' grades for a specific problem" msgstr "" +"Προσαρμόστε τους βαθμούς όλων των εγγεγραμμένων φοιτητών για ένα " +"συγκεκριμένο τεστ" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Allows all learners to work on the problem again." @@ -17900,6 +17972,9 @@ msgid "" "Rescore submitted responses. The 'Rescore Only If Scores Improve' option " "updates a learner's score only if it improves in the learner's favor." msgstr "" +"Αναβαθμολογήστε τις απαντήσεις που υποβλήθηκαν. Η επιλογή \"Αναβαθμολόγηση " +"μόνο για βελτίωση της βαθμολογίας\" ενημερώνει τη βαθμολογία ενός φοιτητή, " +"μόνο εάν βελτιωθεί προς όφελός του." #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Rescore All Learners' Submissions" @@ -17907,7 +17982,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Rescore Only If Scores Improve" -msgstr "" +msgstr "Αναβαθμολόγηση μόνο για τη βελτίωση της βαθμολογίας" #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Show the status for the tasks that you submitted for this problem." @@ -17933,10 +18008,14 @@ msgid "" "course (such as exams and problem sets), and can be changed " "on the 'Grading' page (under 'Settings') in Studio." msgstr "" +"Κάντε κλικ, για να εμφανίσετε τη διαμόρφωση βαθμολογίας για το μάθημα. Η " +"διαμόρφωση βαθμολογίας είναι η ανάλυση των βαθμολογούμενων κεφαλαίων του " +"μαθήματος (όπως τεστ και τελική εξέταση) και μπορεί να αλλάξει στη σελίδα " +"\"Βαθμολόγηση\" (στην καρτέλα \"Ρυθμίσεις\") στο Studio." #: lms/templates/instructor/instructor_dashboard_2/data_download_2/reports.html msgid "Click to download a CSV of anonymized student IDs:" -msgstr "" +msgstr "Κάνετε κλικ για λήψη ενός αρχείου CSV με τα ανώνυμα IDs των φοιτητών:" #: lms/templates/instructor/instructor_dashboard_2/data_download_2/reports.html msgid "" @@ -17954,6 +18033,9 @@ msgid "" "times. Clicking these buttons multiple times will significantly slow the " "generation process." msgstr "" +"Παρακαλούμε να είστε υπομονετικοί και μην κάνετε πολλές φορές κλικ σε αυτά " +"τα κουμπιά. Εάν κάνετε πολλές φορές κλικ σε αυτά τα κουμπιά, θα επιβραδυνθεί" +" σημαντικά η διαδικασία δημιουργίας." #: lms/templates/instructor/instructor_dashboard_2/data_download_2/reports.html msgid "" @@ -18545,6 +18627,10 @@ msgstr "" msgid "Learn more" msgstr "" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Προβολή" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "" @@ -19226,6 +19312,10 @@ msgstr "" msgid "Preview the courseware in the LMS" msgstr "" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "" @@ -21775,14 +21865,26 @@ msgid "" "worth." msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" @@ -22110,7 +22212,7 @@ msgstr "" #: cms/templates/widgets/header.html msgid "Export" -msgstr "" +msgstr "Εξαγωγή" #: cms/templates/widgets/header.html msgid "Current Library:" diff --git a/conf/locale/el/LC_MESSAGES/djangojs.mo b/conf/locale/el/LC_MESSAGES/djangojs.mo index 0a6baa057d0f..3da828bf34e1 100644 Binary files a/conf/locale/el/LC_MESSAGES/djangojs.mo and b/conf/locale/el/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/el/LC_MESSAGES/djangojs.po b/conf/locale/el/LC_MESSAGES/djangojs.po index e28fab6adb2c..d288f0525f57 100644 --- a/conf/locale/el/LC_MESSAGES/djangojs.po +++ b/conf/locale/el/LC_MESSAGES/djangojs.po @@ -20,6 +20,7 @@ # Rafaela Polykandrioti , 2015 # STERGIOU IOANNIS , 2014 # kafroulitsa , 2014 +# Ειρήνη Απέργη, 2023 # #-#-#-#-# djangojs-studio.po (edx-platform) #-#-#-#-# # edX community translations have been downloaded from Greek (http://app.transifex.com/open-edx/edx-platform/language/el/). # Copyright (C) 2023 EdX @@ -41,6 +42,7 @@ # STERGIOU IOANNIS , 2014 # Theofilos Chamalis , 2014-2015 # Vassia Kouremenou , 2016 +# Ειρήνη Απέργη, 2023 # #-#-#-#-# djangojs-account-settings-view.po (0.1a) #-#-#-#-# # edX community translations have been downloaded from Greek (https://app.transifex.com/open-edx/teams/6205/el/). # Copyright (C) 2023 EdX @@ -83,13 +85,14 @@ # kostas kalatzis , 2015 # STERGIOU IOANNIS , 2014 # Vassia Kouremenou , 2016 +# Ειρήνη Απέργη, 2023 msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" -"Last-Translator: Angelos Chraniotis, 2023\n" +"Last-Translator: Ειρήνη Απέργη, 2023\n" "Language-Team: Greek (http://app.transifex.com/open-edx/edx-platform/language/el/)\n" "Language: el\n" "MIME-Version: 1.0\n" @@ -193,7 +196,8 @@ msgstr "Επιλέξτε αρχείο" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -687,7 +691,7 @@ msgstr "" #: lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/Main/Main.jsx msgid "Create a report of problem responses" -msgstr "" +msgstr "Δημιουργία αναφοράς" #: lms/djangoapps/instructor/static/instructor/ProblemBrowser/components/ReportStatus/ReportStatus.jsx msgid "Your report is being generated..." @@ -1681,12 +1685,16 @@ msgid "" "Are you sure you want to unenroll from the verified {certNameLong} track of" " {courseName} ({courseNumber})?" msgstr "" +"Θέλετε σίγουρα να διαγραφείτε από το μάθημα {certNameLong} {courseName} " +"({courseNumber});" #: lms/static/js/dashboard/legacy.js msgid "" "Are you sure you want to unenroll from the verified {certNameLong} track of " "{courseName} ({courseNumber})?" msgstr "" +"Θέλετε σίγουρα να διαγραφείτε από το μάθημα {certNameLong} {courseName} " +"({courseNumber});" #: lms/static/js/dashboard/legacy.js msgid "" @@ -1933,6 +1941,7 @@ msgstr "Αποτελέσματα Αναζήτησης" msgid "[no tags]" msgstr "" +#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# #. Translators: 'Tags' is the name of the view (noun) within the Student Notes #. page that shows all #. notes organized by the tags the student has associated with them (if any). @@ -1941,6 +1950,7 @@ msgstr "" #. with the note #. in order to group similar notes together and help with search. #: lms/static/js/edxnotes/views/tabs/tags.js +#: cms/templates/js/tag-list.underscore msgid "Tags" msgstr "" @@ -1973,7 +1983,7 @@ msgstr "" #: lms/static/js/groups/views/cohort_editor.js msgid "Enter a username or email." -msgstr "Εισάγετε ψευδώνυμο ή e-mail" +msgstr "Εισαγάγετε ψευδώνυμο ή e-mail" #: lms/static/js/groups/views/cohort_editor.js msgid "{numUsersAdded} learner has been added to this cohort. " @@ -2572,6 +2582,9 @@ msgid "" "Successfully started task to reset attempts for problem '<%- problem_id %>'." " Click the 'Show Task Status' button to see the status of the task." msgstr "" +"Ξεκίνησε με επιτυχία η διαδικασία για επαναφορά των προσπαθειών για το τεστ " +"\"<%- problem_id %>\". Κάντε κλικ στο κουμπί \"Εμφάνιση κατάστασης της " +"διαδικασίας\", για να δείτε την κατάσταση της της διαδικασίας." #: lms/static/js/instructor_dashboard/student_admin.js msgid "" @@ -2691,7 +2704,7 @@ msgstr "" #. sending email #: lms/static/js/instructor_dashboard/util.js msgid "Task Status" -msgstr "" +msgstr "Κατάσταση της διαδικασίας" #. Translators: a "Task" is a background process such as grading students or #. sending email @@ -5978,6 +5991,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5987,26 +6001,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6014,21 +6033,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -7304,7 +7327,7 @@ msgstr "Προτείνω" #: common/static/common/templates/discussion/templates.underscore msgid "Unendorse" -msgstr "Δεν προτείνω" +msgstr "Αναίρεση της επιλογής \"Προτείνω\"" #: common/static/common/templates/discussion/templates.underscore msgid "Mark as Answer" @@ -7923,7 +7946,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/certificate-allowlist.underscore msgid "Generate Exception Certificates" -msgstr "" +msgstr "Δημιουργία βεβαιώσεων" #: lms/templates/instructor/instructor_dashboard_2/certificate-allowlist.underscore msgid "Certificate exceptions group selection" @@ -10522,6 +10545,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10700,6 +10727,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/conf/locale/en/LC_MESSAGES/django.po b/conf/locale/en/LC_MESSAGES/django.po index b17083a1e1be..36b7326d387c 100644 --- a/conf/locale/en/LC_MESSAGES/django.po +++ b/conf/locale/en/LC_MESSAGES/django.po @@ -38,8 +38,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-26 20:36+0000\n" -"PO-Revision-Date: 2023-11-26 20:36:15.034816\n" +"POT-Creation-Date: 2023-12-05 14:25+0000\n" +"PO-Revision-Date: 2023-12-05 14:25:08.102305\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -7409,6 +7409,10 @@ msgstr "" msgid "The '{field_name}' field cannot be edited." msgstr "" +#: openedx/core/djangoapps/user_api/accounts/api.py +msgid "Full name can't be longer than 255 symbols" +msgstr "" + #: openedx/core/djangoapps/user_api/accounts/api.py #: openedx/core/djangoapps/user_authn/views/registration_form.py msgid "Enter a valid name" @@ -11678,13 +11682,11 @@ msgid "{previous_groups}, {current_group}" msgstr "" #: cms/djangoapps/contentstore/utils.py -#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py #, python-brace-format msgid "Duplicate of {0}" msgstr "" #: cms/djangoapps/contentstore/utils.py -#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py #, python-brace-format msgid "Duplicate of '{0}'" msgstr "" @@ -13097,6 +13099,14 @@ msgstr "" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "" diff --git a/conf/locale/en/LC_MESSAGES/djangojs.po b/conf/locale/en/LC_MESSAGES/djangojs.po index 824b30d5612b..e4076508b11f 100644 --- a/conf/locale/en/LC_MESSAGES/djangojs.po +++ b/conf/locale/en/LC_MESSAGES/djangojs.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-26 20:36+0000\n" -"PO-Revision-Date: 2023-11-26 20:36:15.164044\n" +"POT-Creation-Date: 2023-12-05 14:24+0000\n" +"PO-Revision-Date: 2023-12-05 14:25:07.995704\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -158,7 +158,8 @@ msgstr "" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -5848,6 +5849,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5857,26 +5859,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5884,21 +5891,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10355,6 +10366,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" diff --git a/conf/locale/eo/LC_MESSAGES/django.mo b/conf/locale/eo/LC_MESSAGES/django.mo index b1f16e0ef6ab..225a11373c3f 100644 Binary files a/conf/locale/eo/LC_MESSAGES/django.mo and b/conf/locale/eo/LC_MESSAGES/django.mo differ diff --git a/conf/locale/eo/LC_MESSAGES/django.po b/conf/locale/eo/LC_MESSAGES/django.po index 7135bb5e5d14..7165b60820fe 100644 --- a/conf/locale/eo/LC_MESSAGES/django.po +++ b/conf/locale/eo/LC_MESSAGES/django.po @@ -38,8 +38,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-26 20:36+0000\n" -"PO-Revision-Date: 2023-11-26 20:36:15.034816\n" +"POT-Creation-Date: 2023-12-05 14:25+0000\n" +"PO-Revision-Date: 2023-12-05 14:25:08.102305\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: eo\n" @@ -9446,6 +9446,12 @@ msgstr "" "Thé '{field_name}' fïéld çännöt ßé édïtéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "¢σηѕє¢тє#" +#: openedx/core/djangoapps/user_api/accounts/api.py +msgid "Full name can't be longer than 255 symbols" +msgstr "" +"Füll nämé çän't ßé löngér thän 255 sýmßöls Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " +"¢σηѕє¢тєтυя #" + #: openedx/core/djangoapps/user_api/accounts/api.py #: openedx/core/djangoapps/user_authn/views/registration_form.py msgid "Enter a valid name" @@ -15113,13 +15119,11 @@ msgid "{previous_groups}, {current_group}" msgstr "{previous_groups}, {current_group} Ⱡ'σяєм ιρѕυм ∂#" #: cms/djangoapps/contentstore/utils.py -#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py #, python-brace-format msgid "Duplicate of {0}" msgstr "Düplïçäté öf {0} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#" #: cms/djangoapps/contentstore/utils.py -#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py #, python-brace-format msgid "Duplicate of '{0}'" msgstr "Düplïçäté öf '{0}' Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт#" @@ -16797,6 +16801,14 @@ msgstr "Séqüénçé Ⱡ'σяєм ιρѕυм ∂#" msgid "Completed" msgstr "Çömplétéd Ⱡ'σяєм ιρѕυм ∂σł#" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "Néw Ûnït Ⱡ'σяєм ιρѕυм ∂#" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "Pästé äs néw ünït Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Sïgn Ûp för {platform_name} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#" diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.mo b/conf/locale/eo/LC_MESSAGES/djangojs.mo index a840206baca8..5be56f498854 100644 Binary files a/conf/locale/eo/LC_MESSAGES/djangojs.mo and b/conf/locale/eo/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.po b/conf/locale/eo/LC_MESSAGES/djangojs.po index 442cc79d83ae..d15f6719eb33 100644 --- a/conf/locale/eo/LC_MESSAGES/djangojs.po +++ b/conf/locale/eo/LC_MESSAGES/djangojs.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-26 20:36+0000\n" -"PO-Revision-Date: 2023-11-26 20:36:15.164044\n" +"POT-Creation-Date: 2023-12-05 14:24+0000\n" +"PO-Revision-Date: 2023-12-05 14:25:07.995704\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: eo\n" @@ -158,7 +158,8 @@ msgstr "Çhöösé Fïlé Ⱡ'σяєм ιρѕυм ∂σłσя #" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -7036,6 +7037,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "Çöpýïng Ⱡ'σяєм ιρѕυм #" @@ -7045,16 +7047,19 @@ msgstr "Çöpý öf '{componentDisplayName}' Ⱡ'σяєм ιρѕυм ∂σłσя #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "Pästïng Ⱡ'σяєм ιρѕυм #" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "Sömé érrörs öççürréd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" "Thé föllöwïng réqüïréd fïlés çöüld nöt ßé äddéd tö thé çöürsé: Ⱡ'σяєм ιρѕυм " @@ -7062,6 +7067,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" "Ýöü mäý nééd tö üpdäté ä fïlé(s) mänüällý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " @@ -7069,6 +7075,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -7078,6 +7085,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" "Néw fïlé(s) äddéd tö Fïlés & Ûplöäds. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " @@ -7085,6 +7093,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" "Thé föllöwïng réqüïréd fïlés wéré ïmpörtéd tö thïs çöürsé: Ⱡ'σяєм ιρѕυм " @@ -7092,11 +7101,13 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "Vïéw fïlés Ⱡ'σяєм ιρѕυм ∂σłσ#" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "Dïsmïss Ⱡ'σяєм ιρѕυм #" @@ -12408,6 +12419,10 @@ msgstr "" "Nöté: Dö nöt hïdé grädéd ässïgnménts äftér théý hävé ßéén réléäséd. Ⱡ'σяєм " "ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "Çöpý Ûnït Ⱡ'σяєм ιρѕυм ∂σł#" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Réléäsé Däté änd Tïmé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #" diff --git a/conf/locale/es_419/LC_MESSAGES/django.mo b/conf/locale/es_419/LC_MESSAGES/django.mo index 4b895e53047c..636186118054 100644 Binary files a/conf/locale/es_419/LC_MESSAGES/django.mo and b/conf/locale/es_419/LC_MESSAGES/django.mo differ diff --git a/conf/locale/es_419/LC_MESSAGES/django.po b/conf/locale/es_419/LC_MESSAGES/django.po index 2623c0224157..67d95d6b27c5 100644 --- a/conf/locale/es_419/LC_MESSAGES/django.po +++ b/conf/locale/es_419/LC_MESSAGES/django.po @@ -5316,6 +5316,10 @@ msgid "" " with the LTI consumer. See the Open edX LTI Provider documentation for more" " details." msgstr "" +"Cuando esté marcado, el contenido LTI se cargará solo para los estudiante " +"que tengan una Cuenta en este caso. Esto es requiere únicamente para " +"vincular cuentas estudiante con el consumidor LTI . Consulte la " +"documentación del proveedor Open edX LTI para obtener más detalles." #: lms/djangoapps/program_enrollments/models.py msgid "One of user or external_user_key must not be null." @@ -12062,6 +12066,21 @@ msgstr "" " que los usuarios puedan restablecer sus respuestas y reorganizar los " "elementos seleccionados." +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "No se ha especificado la librería del contenido fuente." + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" +"Las librerías de contenido no están disponibles en el tiempo de ejecución " +"actual." + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "La librería de contenido fuente no existe: {source_library_id}" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -12099,9 +12118,9 @@ msgid "Select a Library." msgstr "Seleccione una librería" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "" -"No hay problemas que coincidan con este tipo en las librerías especificadas" +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "No hay problemas en la librería especificada de tipo {capa_type} ." #: xmodule/library_content_block.py msgid "Select another problem type." @@ -14418,14 +14437,6 @@ msgstr "Requerimientos" msgid "Details" msgstr "Detalles" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Ver" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -15216,6 +15227,14 @@ msgstr "Secuencia" msgid "Completed" msgstr "Completado" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "Nueva Unidad" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "Pegar como nueva unidad" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Regístrate en {platform_name}" @@ -20737,22 +20756,27 @@ msgstr "Mis cursos" #: lms/templates/lti_provider/user-auth-error.html msgid "There was an error when loading this module!" -msgstr "" +msgstr "¡Hubo un error al cargar este módulo!" #: lms/templates/lti_provider/user-auth-error.html msgid "" "This module is available only for users who are signed into {platform}. " "Kindly sign in and refresh this page to load the content." msgstr "" +"Este módulo está disponible solo para usuarios que hayan iniciado sesión en " +"{platform} . Por favor inicie en y actualice esta página para cargar el " +"contenido en ido." #: lms/templates/lti_provider/user-auth-error.html msgid "NOTE:" -msgstr "" +msgstr "NOTA:" #: lms/templates/lti_provider/user-auth-error.html msgid "" "The email used to sign into this platform and {platform} should be the same." msgstr "" +"El correo electrónico utilizado para iniciar sesión en esta plataforma y " +"{platform} deben ser el mismo." #: lms/templates/modal/_modal-settings-language.html msgid "Change Preferred Language" @@ -21338,6 +21362,11 @@ msgstr "¡Listo!" msgid "Learn more" msgstr "Aprender más" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Ver" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(activo){span_end}" @@ -22059,6 +22088,10 @@ msgstr "Ver la versión publicada" msgid "Preview the courseware in the LMS" msgstr "Previsualizar el contenido del curso en el LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "Colapsar todo" + #: cms/templates/container.html msgid "Adding components" msgstr "Agregando componentes" @@ -25114,14 +25147,26 @@ msgstr "" " exámenes y especificar el peso que tendrá cada actividad en la calificación" " final del estudiante." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "Importar componentes" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Expandir o Colapsar" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "Seleccionar este problema" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "Copiar al portapapeles" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "Administrar etiquetas" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "Administrar acceso" diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.mo b/conf/locale/es_419/LC_MESSAGES/djangojs.mo index eb75d9a7b1d5..7811e58e7ac3 100644 Binary files a/conf/locale/es_419/LC_MESSAGES/djangojs.mo and b/conf/locale/es_419/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.po b/conf/locale/es_419/LC_MESSAGES/djangojs.po index b6f95544de99..65d434123ba1 100644 --- a/conf/locale/es_419/LC_MESSAGES/djangojs.po +++ b/conf/locale/es_419/LC_MESSAGES/djangojs.po @@ -182,7 +182,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Jesica Greco, 2023\n" "Language-Team: Spanish (Latin America) (http://app.transifex.com/open-edx/edx-platform/language/es_419/)\n" @@ -308,7 +308,8 @@ msgstr "Elegir archivo" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -2210,6 +2211,7 @@ msgstr "Resultados de búsqueda" msgid "[no tags]" msgstr "[sin etiquetas]" +#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# #. Translators: 'Tags' is the name of the view (noun) within the Student Notes #. page that shows all #. notes organized by the tags the student has associated with them (if any). @@ -2218,6 +2220,7 @@ msgstr "[sin etiquetas]" #. with the note #. in order to group similar notes together and help with search. #: lms/static/js/edxnotes/views/tabs/tags.js +#: cms/templates/js/tag-list.underscore msgid "Tags" msgstr "Etiquetas" @@ -6567,6 +6570,7 @@ msgstr "¿Está seguro de que quiere borrar esta actualización?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "Copiando" @@ -6576,26 +6580,31 @@ msgstr "Copia de '{componentDisplayName}'" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "Pegando" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "Se produjeron algunos errores" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "Los siguientes archivos obligatorios no se pudieron agregar al curso:" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "Es posible que deba actualizar un archivo (s) manualmente" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6605,21 +6614,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "Nuevos archivos agregados a Archivos y cargas." #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "Los siguientes archivos obligatorios no se pudieron agregar al curso:" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "Archivos de vista" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "Descartar" @@ -11485,6 +11498,10 @@ msgid "Note: Do not hide graded assignments after they have been released." msgstr "" "Nota: No oculte las tareas calificadas después de que han sido liberadas." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "Copiar unidad" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Fecha y hora de liberación" @@ -11691,6 +11708,10 @@ msgstr "Resúmenes de unidades de expertos" msgid "Enable summaries" msgstr "Habilitar resúmenes" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "Administrar etiquetas" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Rol actual:" diff --git a/conf/locale/eu_ES/LC_MESSAGES/django.mo b/conf/locale/eu_ES/LC_MESSAGES/django.mo index 8439317fbfcc..64c7f13bc0ce 100644 Binary files a/conf/locale/eu_ES/LC_MESSAGES/django.mo and b/conf/locale/eu_ES/LC_MESSAGES/django.mo differ diff --git a/conf/locale/eu_ES/LC_MESSAGES/django.po b/conf/locale/eu_ES/LC_MESSAGES/django.po index c6ef7850d6e9..dbe1fa1156d8 100644 --- a/conf/locale/eu_ES/LC_MESSAGES/django.po +++ b/conf/locale/eu_ES/LC_MESSAGES/django.po @@ -10519,6 +10519,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10555,8 +10568,9 @@ msgid "Select a Library." msgstr "Aukeratu liburutegia" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "Ez dago adierazitako ariketa-motarik zehaztutako liburutegietan." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -12585,14 +12599,6 @@ msgstr "Eskakizunak" msgid "Details" msgstr "Xehetasunak" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Ikusi" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13338,6 +13344,14 @@ msgstr "Sekuentzia" msgid "Completed" msgstr "Osatua" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Eman izena hemen: {platform_name}" @@ -18568,6 +18582,11 @@ msgstr "" msgid "Learn more" msgstr "Ikasi gehiago" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Ikusi" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(aktiboa){span_end}" @@ -19243,6 +19262,10 @@ msgstr "Ikusi bertsioa zuzenean" msgid "Preview the courseware in the LMS" msgstr "" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Osagaiak gehitzen" @@ -21793,14 +21816,26 @@ msgid "" "worth." msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Zabaldu edo tolestu" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/eu_ES/LC_MESSAGES/djangojs.po b/conf/locale/eu_ES/LC_MESSAGES/djangojs.po index 0b78c05bc1a6..3fc9ac3f2f28 100644 --- a/conf/locale/eu_ES/LC_MESSAGES/djangojs.po +++ b/conf/locale/eu_ES/LC_MESSAGES/djangojs.po @@ -50,7 +50,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Abel Camacho , 2017,2019-2020\n" "Language-Team: Basque (Spain) (http://app.transifex.com/open-edx/edx-platform/language/eu_ES/)\n" @@ -176,7 +176,8 @@ msgstr "Aukeratu fitxategia" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -5952,6 +5953,7 @@ msgstr "Ziur al zaude eguneraketa hau ezabatu egin nahi duzula?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5961,26 +5963,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5988,21 +5995,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10475,6 +10486,10 @@ msgstr "Ezkutatu ikasleei" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Argitaratze-data eta ordua" @@ -10655,6 +10670,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Oraingo rola:" diff --git a/conf/locale/fa_IR/LC_MESSAGES/django.mo b/conf/locale/fa_IR/LC_MESSAGES/django.mo index d8d34c9228ac..8a0976d63507 100644 Binary files a/conf/locale/fa_IR/LC_MESSAGES/django.mo and b/conf/locale/fa_IR/LC_MESSAGES/django.mo differ diff --git a/conf/locale/fa_IR/LC_MESSAGES/django.po b/conf/locale/fa_IR/LC_MESSAGES/django.po index eaab57b0d65b..3ab3f2ae0f0d 100644 --- a/conf/locale/fa_IR/LC_MESSAGES/django.po +++ b/conf/locale/fa_IR/LC_MESSAGES/django.po @@ -134,7 +134,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-05 20:43+0000\n" +"POT-Creation-Date: 2023-11-26 20:43+0000\n" "PO-Revision-Date: 2019-01-20 20:43+0000\n" "Last-Translator: Somaye Joolaee, 2022\n" "Language-Team: Persian (Iran) (https://app.transifex.com/open-edx/teams/6205/fa_IR/)\n" @@ -11537,6 +11537,19 @@ msgstr "" "تعیین می‌کند که آیا دکمه «بازتنظیم مشکلات» نشان داده شود، بنابراین کاربران " "می‌توانند پاسخ‌های خود را بازتنظیم کنند و موارد انتخابی را تغییر دهند." +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "این مولفه روزآمد نیست. کتابخانه مذکور محتوای جدیدی دارد." @@ -11573,8 +11586,9 @@ msgid "Select a Library." msgstr "انتخاب کتابخانه" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "هیچ نوع مساله منطبقی در کتابخانه‌های مشخص‌شده نیست." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -13809,14 +13823,6 @@ msgstr "موارد ضروری" msgid "Details" msgstr "جزئیات" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "نمایش" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -14598,6 +14604,14 @@ msgstr "توالی" msgid "Completed" msgstr "کامل شده" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "ثبت‌نام در {platform_name}" @@ -19120,7 +19134,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html msgid "Instructor Dashboard" -msgstr "آموزش پیش‌خوان" +msgstr "داشبورد مربی" #: lms/templates/instructor/instructor_dashboard_2/instructor_dashboard_2.html msgid "View Course in Studio" @@ -20551,6 +20565,11 @@ msgstr "متوجه شدم!" msgid "Learn more" msgstr "اطلاعات بیشتر" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "نمایش" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(فعال){span_end}" @@ -21261,6 +21280,10 @@ msgstr "نمایش نسخه زنده" msgid "Preview the courseware in the LMS" msgstr "پیش‌نمایش ابزار درسی در سیستم آموزش مجازی" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "در حال افزودن مولفه‌ها" @@ -24240,14 +24263,26 @@ msgstr "" "امتحاناتی را ایجاد کرده و مشخص کنید که ارزش هر نوع تکلیف برای یادگیرنده چقدر" " است." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "گسترده یا فشرده" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "کپی به کلیپ بورد" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "مدیریت دسترسی" diff --git a/conf/locale/fa_IR/LC_MESSAGES/djangojs.po b/conf/locale/fa_IR/LC_MESSAGES/djangojs.po index ca60204bfbee..2e24de831c29 100644 --- a/conf/locale/fa_IR/LC_MESSAGES/djangojs.po +++ b/conf/locale/fa_IR/LC_MESSAGES/djangojs.po @@ -88,7 +88,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: SeyedMahdi Saeid , 2023\n" "Language-Team: Persian (Iran) (http://app.transifex.com/open-edx/edx-platform/language/fa_IR/)\n" @@ -214,7 +214,8 @@ msgstr "انتخاب پرونده" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6315,6 +6316,7 @@ msgstr "آیا از حذف این روزآمدسازی اطمینان دارید #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "کپی کردن" @@ -6324,26 +6326,31 @@ msgstr "کپی «{componentDisplayName}»" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "الصاق کردن" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "برخی از خطاها رخ داده است" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "فایل های مورد نیاز زیر را نمی توان به دوره اضافه کرد:" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "ممکن است لازم باشد فایل(ها) را به صورت دستی به روز کنید" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6353,21 +6360,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "فایل های مورد نیاز زیر به این دوره وارد شدند:" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11142,6 +11153,10 @@ msgstr "پنهان‌سازی از دید یادگیرندگان" msgid "Note: Do not hide graded assignments after they have been released." msgstr "توجه کنید: پس از انتشار، تکالیف نمره‌گذاری شده را پنهان نکنید." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "تاریخ و زمان انتشار" @@ -11343,6 +11358,10 @@ msgstr "خلاصه واحد Xpert" msgid "Enable summaries" msgstr "فعال کردن خلاصه ها" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "نقش کنونی:" diff --git a/conf/locale/fr/LC_MESSAGES/django.mo b/conf/locale/fr/LC_MESSAGES/django.mo index 056fa90d7fbf..b1887b5919ec 100644 Binary files a/conf/locale/fr/LC_MESSAGES/django.mo and b/conf/locale/fr/LC_MESSAGES/django.mo differ diff --git a/conf/locale/fr/LC_MESSAGES/django.po b/conf/locale/fr/LC_MESSAGES/django.po index ef67981971ef..4ca2c9e1f125 100644 --- a/conf/locale/fr/LC_MESSAGES/django.po +++ b/conf/locale/fr/LC_MESSAGES/django.po @@ -12031,6 +12031,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Ce composant est obsolète. La bibliothèque a de nouveaux contenus." @@ -12067,10 +12080,9 @@ msgid "Select a Library." msgstr "Sélectionner une Bibliothèque." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" -"Il n'y a pas les types de problèmes adaptés dans les bibliothèques " -"spécifiées." #: xmodule/library_content_block.py msgid "Select another problem type." @@ -14376,14 +14388,6 @@ msgstr "Pré-requis" msgid "Details" msgstr "Détails" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Voir" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -15175,6 +15179,14 @@ msgstr "Séquence" msgid "Completed" msgstr "Terminé" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Inscrivez-vous sur {platform_name}" @@ -21310,6 +21322,11 @@ msgstr "OK !" msgid "Learn more" msgstr "En savoir plus" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Voir" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(actif){span_end}" @@ -22030,6 +22047,10 @@ msgstr "Aperçu réel" msgid "Preview the courseware in the LMS" msgstr "Prévisualiser le cours dans le LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Ajout de composants" @@ -25061,14 +25082,26 @@ msgstr "" "laboratoires, des quiz, des examens et préciser la valeur des points pour " "chacune de ces tâches." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Déplier ou Replier" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.po b/conf/locale/fr/LC_MESSAGES/djangojs.po index b9b886ba8a66..3d597c9f424d 100644 --- a/conf/locale/fr/LC_MESSAGES/djangojs.po +++ b/conf/locale/fr/LC_MESSAGES/djangojs.po @@ -220,7 +220,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Pierre Mailhot , 2023\n" "Language-Team: French (http://app.transifex.com/open-edx/edx-platform/language/fr/)\n" @@ -346,7 +346,8 @@ msgstr "Choisir le fichier" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6605,6 +6606,7 @@ msgstr "Êtes vous sur de vouloir supprimer cette mise à jour ?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6614,26 +6616,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6641,21 +6648,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11504,6 +11515,10 @@ msgid "Note: Do not hide graded assignments after they have been released." msgstr "" "Note : Veuillez ne pas masquer les devoirs notés après leur publication." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Date et heure de diffusion" @@ -11709,6 +11724,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Rôle actuel :" diff --git a/conf/locale/id/LC_MESSAGES/django.mo b/conf/locale/id/LC_MESSAGES/django.mo index 516f2f844161..7e6e718da840 100644 Binary files a/conf/locale/id/LC_MESSAGES/django.mo and b/conf/locale/id/LC_MESSAGES/django.mo differ diff --git a/conf/locale/id/LC_MESSAGES/django.po b/conf/locale/id/LC_MESSAGES/django.po index 7e6ce9bad039..76f0e46670e0 100644 --- a/conf/locale/id/LC_MESSAGES/django.po +++ b/conf/locale/id/LC_MESSAGES/django.po @@ -10921,6 +10921,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Komponen ini telah kadaluarsa. Library telah memiliki konten baru" @@ -10957,8 +10970,9 @@ msgid "Select a Library." msgstr "Pilih Library." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "Tidak ditemukan jenis soal yang sesuai untuk library yang dipilih." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -13111,14 +13125,6 @@ msgstr "Kebutuhan" msgid "Details" msgstr "Detil" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Tampilkan" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13889,6 +13895,14 @@ msgstr "Urutan" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Daftar {platform_name}" @@ -19813,6 +19827,11 @@ msgstr "Mengerti!" msgid "Learn more" msgstr "Pelajari lebih lanjut" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Tampilkan" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(aktif){span_end}" @@ -20503,6 +20522,10 @@ msgstr "Lihat Versi Langsung" msgid "Preview the courseware in the LMS" msgstr "Pratinjau perangkat kursus di LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Menambahkan komponen" @@ -23107,14 +23130,26 @@ msgstr "" "Anda dapat membuat beberapa jenis penugasan, seperti pekerjaan rumah, lab, " "kuis, dan ujian, dan menentukan bobot masing-masing terhadap nilai peserta." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/id/LC_MESSAGES/djangojs.po b/conf/locale/id/LC_MESSAGES/djangojs.po index 7b2030626691..2c6455ef6055 100644 --- a/conf/locale/id/LC_MESSAGES/djangojs.po +++ b/conf/locale/id/LC_MESSAGES/djangojs.po @@ -84,7 +84,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Faizar Septiawan , 2023\n" "Language-Team: Indonesian (http://app.transifex.com/open-edx/edx-platform/language/id/)\n" @@ -194,7 +194,8 @@ msgstr "Pilih Berkas" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6141,6 +6142,7 @@ msgstr "Anda yakin hendak menghapus pembaruan ini?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6150,26 +6152,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6177,21 +6184,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10756,6 +10767,10 @@ msgid "Note: Do not hide graded assignments after they have been released." msgstr "" "Catatan: Jangan sembunyikan penugasan yang dinilai setelah diterbitkan." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Penerbitan tanggal dan waktu" @@ -10941,6 +10956,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Peran saat ini" diff --git a/conf/locale/it_IT/LC_MESSAGES/django.mo b/conf/locale/it_IT/LC_MESSAGES/django.mo index d8ee171e2da8..64cf0114b41a 100644 Binary files a/conf/locale/it_IT/LC_MESSAGES/django.mo and b/conf/locale/it_IT/LC_MESSAGES/django.mo differ diff --git a/conf/locale/it_IT/LC_MESSAGES/django.po b/conf/locale/it_IT/LC_MESSAGES/django.po index c561a859a8b6..9ba0564f322c 100644 --- a/conf/locale/it_IT/LC_MESSAGES/django.po +++ b/conf/locale/it_IT/LC_MESSAGES/django.po @@ -11864,6 +11864,19 @@ msgstr "" " in modo che gli utenti possano reimpostare le risposte e rimescolare gli " "elementi selezionati." +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -11901,9 +11914,9 @@ msgid "Select a Library." msgstr "Seleziona una libreria." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" -"Non vi sono tipi di problema corrispondenti nelle librerie specificate." #: xmodule/library_content_block.py msgid "Select another problem type." @@ -14210,14 +14223,6 @@ msgstr "Requisiti" msgid "Details" msgstr "Dettagli" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Visualizza" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -15006,6 +15011,14 @@ msgstr "Sequenza" msgid "Completed" msgstr "Completato" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Registrati su {platform_name}" @@ -21105,6 +21118,11 @@ msgstr "Capito!" msgid "Learn more" msgstr "Per saperne di più" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Visualizza" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -21825,6 +21843,10 @@ msgstr "Vedi Versione Live" msgid "Preview the courseware in the LMS" msgstr "Visualizza in anteprima il materiale didattico in LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Aggiungi componenti" @@ -24878,14 +24900,26 @@ msgstr "" "esami, e specificare il valore di una valutazione dello studente per ciascun" " tipo di compito. " +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Espandi o comprimi " +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/it_IT/LC_MESSAGES/djangojs.po b/conf/locale/it_IT/LC_MESSAGES/djangojs.po index 4bd2712e331e..3acf2d6adb47 100644 --- a/conf/locale/it_IT/LC_MESSAGES/djangojs.po +++ b/conf/locale/it_IT/LC_MESSAGES/djangojs.po @@ -113,7 +113,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Ilaria Botti , 2022\n" "Language-Team: Italian (Italy) (http://app.transifex.com/open-edx/edx-platform/language/it_IT/)\n" @@ -239,7 +239,8 @@ msgstr "Scegli File" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6461,6 +6462,7 @@ msgstr "Sei sicuro di voler cancellare questo aggiornamento?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6470,26 +6472,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6497,21 +6504,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11359,6 +11370,10 @@ msgid "Note: Do not hide graded assignments after they have been released." msgstr "" "Nota: Non nascondere i compiti valutati dopo che sono stati rilasciati." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Data e ora rilascio" @@ -11563,6 +11578,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Ruolo corrente:" diff --git a/conf/locale/ja_JP/LC_MESSAGES/django.mo b/conf/locale/ja_JP/LC_MESSAGES/django.mo index 39cd48b62ee8..1c940cd41c4b 100644 Binary files a/conf/locale/ja_JP/LC_MESSAGES/django.mo and b/conf/locale/ja_JP/LC_MESSAGES/django.mo differ diff --git a/conf/locale/ja_JP/LC_MESSAGES/django.po b/conf/locale/ja_JP/LC_MESSAGES/django.po index 35e5406ddbf8..da71037a3cea 100644 --- a/conf/locale/ja_JP/LC_MESSAGES/django.po +++ b/conf/locale/ja_JP/LC_MESSAGES/django.po @@ -10385,6 +10385,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "このコンポーネントは期限切れです。ライブラリに新しいコンテンツがあります。" @@ -10419,8 +10432,9 @@ msgid "Select a Library." msgstr "ライブラリを選択してください。" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "ご指定のライブラリに合致する問題タイプがありません。" +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -12448,12 +12462,6 @@ msgstr "必須事項" msgid "Details" msgstr "詳細" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "見る" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13199,6 +13207,14 @@ msgstr "順番" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "{platform_name}に登録" @@ -18429,6 +18445,10 @@ msgstr "やったね!" msgid "Learn more" msgstr "詳しく知る" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "見る" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(アクティブ){span_end}" @@ -19092,6 +19112,10 @@ msgstr "現行バージョンを見る" msgid "Preview the courseware in the LMS" msgstr "LMSのコースウェアをプレビュー" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "コンポーネント追加中" @@ -21738,14 +21762,26 @@ msgid "" "worth." msgstr "宿題、実習、小テスト、試験などの課題タイプを作成することができ、それぞれの課題タイプの配点を設定できます。" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "開くまたは閉じる" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po index 4132cfc8f7c5..86e8baca7b5a 100644 --- a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po +++ b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po @@ -78,7 +78,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Kyoto University , 2017\n" "Language-Team: Japanese (Japan) (http://app.transifex.com/open-edx/edx-platform/language/ja_JP/)\n" @@ -184,7 +184,8 @@ msgstr "ファイルを選択" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -5838,6 +5839,7 @@ msgstr "この変更を削除してもよろしいですか?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5847,26 +5849,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5874,21 +5881,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10355,6 +10366,10 @@ msgstr "受講者に非表示" msgid "Note: Do not hide graded assignments after they have been released." msgstr "注: 採点対象の課題を公開後に非表示にしないでください。" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "リリース日時" @@ -10535,6 +10550,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "現在のロール:" diff --git a/conf/locale/ka/LC_MESSAGES/django.mo b/conf/locale/ka/LC_MESSAGES/django.mo index f40779caf872..52270bdfe7f0 100644 Binary files a/conf/locale/ka/LC_MESSAGES/django.mo and b/conf/locale/ka/LC_MESSAGES/django.mo differ diff --git a/conf/locale/ka/LC_MESSAGES/django.po b/conf/locale/ka/LC_MESSAGES/django.po index d56a33bbf410..2bec883db513 100644 --- a/conf/locale/ka/LC_MESSAGES/django.po +++ b/conf/locale/ka/LC_MESSAGES/django.po @@ -10737,6 +10737,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "ეს კომპონენტი ვადაგასულია. ბიბლიოთეკას ახალი შინაარსი აქვს." @@ -10773,8 +10786,9 @@ msgid "Select a Library." msgstr "აირჩიეთ ბიბლიოთეკა." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "განსაზღვრულ ბიბლიოთეკებში ამოცანის ტიპები არ ემთხვევა ერთმანეთს." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -12968,12 +12982,6 @@ msgstr "მოთხოვნები" msgid "Details" msgstr "დეტალები" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "ნახვა" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13734,6 +13742,14 @@ msgstr "" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "დარეგისტრირდით {platform_name}-ზე" @@ -19349,6 +19365,10 @@ msgstr "" msgid "Learn more" msgstr "" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "ნახვა" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(მოქმედი){span_end}" @@ -20032,6 +20052,10 @@ msgstr "მიმდინარე ვერსიის ნახვა" msgid "Preview the courseware in the LMS" msgstr "კურსის გადახედვა LMS-ში" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "კომპონენტების დამატება" @@ -22944,14 +22968,26 @@ msgstr "" "ლაბორატორიული სავარჯიშოები, ქვიზები, გამოცდები. ასევე, თითოეული ტიპის " "დავალებისთვის, შეგიძლიათ განსაზღვროთ სტუდენტის შეფასების ქულები." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "ჩამოშალე ან აკეცე" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/ka/LC_MESSAGES/djangojs.po b/conf/locale/ka/LC_MESSAGES/djangojs.po index 83f050a6495e..80cf17678e65 100644 --- a/conf/locale/ka/LC_MESSAGES/djangojs.po +++ b/conf/locale/ka/LC_MESSAGES/djangojs.po @@ -56,7 +56,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Lasha Kokilashvili, 2018\n" "Language-Team: Georgian (http://app.transifex.com/open-edx/edx-platform/language/ka/)\n" @@ -162,7 +162,8 @@ msgstr "ფაილის არჩევა" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -5972,6 +5973,7 @@ msgstr "დარწმუნებული ხართ, რომ გან #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5981,26 +5983,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6008,21 +6015,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10641,6 +10652,10 @@ msgid "Note: Do not hide graded assignments after they have been released." msgstr "" "გაითვალისწინეთ: არ დამალოთ შეფასებული დავალებები მათი გამოქვეყნების შემდეგ." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "გამოქვეყნების თარიღი და დრო" @@ -10830,6 +10845,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "მიმდინარე როლი:" diff --git a/conf/locale/lt_LT/LC_MESSAGES/django.po b/conf/locale/lt_LT/LC_MESSAGES/django.po index e9e4893178f4..49acbecec5d4 100644 --- a/conf/locale/lt_LT/LC_MESSAGES/django.po +++ b/conf/locale/lt_LT/LC_MESSAGES/django.po @@ -10249,6 +10249,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10283,7 +10296,8 @@ msgid "Select a Library." msgstr "" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12305,12 +12319,6 @@ msgstr "Reikalavimai" msgid "Details" msgstr "Išsamiau" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Žiūrėti" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13071,6 +13079,14 @@ msgstr "" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Prisiregistruokite prie {platform_name} " @@ -18467,6 +18483,10 @@ msgstr "" msgid "Learn more" msgstr "" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Žiūrėti" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -19149,6 +19169,10 @@ msgstr "Žiūrėti tiesiogiai" msgid "Preview the courseware in the LMS" msgstr "Peržiūrėkite kurso medžiagą mokymo valdymo sistemoje" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Pridedami komponentai" @@ -21991,14 +22015,26 @@ msgstr "" "darbai, apklausos ir egzaminai, bei nurodyti, koks yra kiekvieno tipo " "užduoties svoris." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Išskleisti arba suskleisti" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po index 26294d332f15..34706477caaf 100644 --- a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po +++ b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po @@ -50,7 +50,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Riina , 2014-2015\n" "Language-Team: Lithuanian (Lithuania) (http://app.transifex.com/open-edx/edx-platform/language/lt_LT/)\n" @@ -155,7 +155,8 @@ msgstr "" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js msgid "OK" msgstr "Taip" @@ -5938,6 +5939,7 @@ msgstr "Ar jūs tikrai norite pašalinti šį atnaujinimą?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5947,26 +5949,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5974,21 +5981,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10512,6 +10523,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10695,6 +10710,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/conf/locale/lv/LC_MESSAGES/django.mo b/conf/locale/lv/LC_MESSAGES/django.mo index 6ae313136af7..cb882222f3e9 100644 Binary files a/conf/locale/lv/LC_MESSAGES/django.mo and b/conf/locale/lv/LC_MESSAGES/django.mo differ diff --git a/conf/locale/lv/LC_MESSAGES/django.po b/conf/locale/lv/LC_MESSAGES/django.po index 6832fcaa6227..4fa49b729bb3 100644 --- a/conf/locale/lv/LC_MESSAGES/django.po +++ b/conf/locale/lv/LC_MESSAGES/django.po @@ -10963,6 +10963,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Šis komponents ir novecojis. Bibliotēkā ir jauns saturs." @@ -10999,8 +11012,9 @@ msgid "Select a Library." msgstr "Izvēlieties bibliotēku." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "Norādītajās bibliotēkās nav atbilstošu problēmu veidu." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -13147,14 +13161,6 @@ msgstr "Prasības" msgid "Details" msgstr "Detalizēti" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Skatīt" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13929,6 +13935,14 @@ msgstr "Secība" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Reģistrējieties {platform_name}" @@ -19597,6 +19611,11 @@ msgstr "Sapratu!" msgid "Learn more" msgstr "Uzzināt vairāk" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Skatīt" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(aktīvs){span_end}" @@ -20282,6 +20301,10 @@ msgstr "" msgid "Preview the courseware in the LMS" msgstr "" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "" @@ -22826,14 +22849,26 @@ msgid "" "worth." msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Izvērst vai sakļaut" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/lv/LC_MESSAGES/djangojs.po b/conf/locale/lv/LC_MESSAGES/djangojs.po index 721e6b16f7db..9526858a3da5 100644 --- a/conf/locale/lv/LC_MESSAGES/djangojs.po +++ b/conf/locale/lv/LC_MESSAGES/djangojs.po @@ -40,7 +40,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: LTMC Latvijas Tiesnešu mācību centrs , 2019\n" "Language-Team: Latvian (http://app.transifex.com/open-edx/edx-platform/language/lv/)\n" @@ -150,7 +150,8 @@ msgstr "Izvēlēties failu" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6149,6 +6150,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6158,26 +6160,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6185,21 +6192,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10665,6 +10676,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10843,6 +10858,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/conf/locale/mn/LC_MESSAGES/django.po b/conf/locale/mn/LC_MESSAGES/django.po index c582f92f95da..1e5a79ba2154 100644 --- a/conf/locale/mn/LC_MESSAGES/django.po +++ b/conf/locale/mn/LC_MESSAGES/django.po @@ -10351,6 +10351,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10385,7 +10398,8 @@ msgid "Select a Library." msgstr "" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12373,14 +12387,6 @@ msgstr "Шаардлага" msgid "Details" msgstr "Дэлгэрэнгүй" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Харах" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13124,6 +13130,14 @@ msgstr "Дараалал" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "{platform_name} системд бүртгүүлэх" @@ -18283,6 +18297,11 @@ msgstr "" msgid "Learn more" msgstr "Дэлгэрэнгүй" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Харах" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "" @@ -18953,6 +18972,10 @@ msgstr "Одоогийн хувилбарыг нь үзэх" msgid "Preview the courseware in the LMS" msgstr "Хичээлийн материалыг Сургалтын Менежментийн Системд урьдчилан харах" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Бүрдэл нэмэх" @@ -21554,14 +21577,26 @@ msgid "" "worth." msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/mn/LC_MESSAGES/djangojs.po b/conf/locale/mn/LC_MESSAGES/djangojs.po index d99b5673aa3c..0cb684776d28 100644 --- a/conf/locale/mn/LC_MESSAGES/djangojs.po +++ b/conf/locale/mn/LC_MESSAGES/djangojs.po @@ -63,7 +63,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Myagmarjav Enkhbileg , 2018\n" "Language-Team: Mongolian (http://app.transifex.com/open-edx/edx-platform/language/mn/)\n" @@ -173,7 +173,8 @@ msgstr "Файл сонгох" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -1896,6 +1897,7 @@ msgstr "Хайлтын илэрцүүд" msgid "[no tags]" msgstr "" +#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-# #. Translators: 'Tags' is the name of the view (noun) within the Student Notes #. page that shows all #. notes organized by the tags the student has associated with them (if any). @@ -1904,6 +1906,7 @@ msgstr "" #. with the note #. in order to group similar notes together and help with search. #: lms/static/js/edxnotes/views/tabs/tags.js +#: cms/templates/js/tag-list.underscore msgid "Tags" msgstr "" @@ -5844,6 +5847,7 @@ msgstr "Энэ шинэчлэлийг устгах уу?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5853,26 +5857,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5880,21 +5889,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10358,6 +10371,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10536,6 +10553,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/conf/locale/pl/LC_MESSAGES/django.mo b/conf/locale/pl/LC_MESSAGES/django.mo index a34f99446d6c..151894692159 100644 Binary files a/conf/locale/pl/LC_MESSAGES/django.mo and b/conf/locale/pl/LC_MESSAGES/django.mo differ diff --git a/conf/locale/pl/LC_MESSAGES/django.po b/conf/locale/pl/LC_MESSAGES/django.po index 74b06e45d9ff..f3ab335bb9a0 100644 --- a/conf/locale/pl/LC_MESSAGES/django.po +++ b/conf/locale/pl/LC_MESSAGES/django.po @@ -11068,6 +11068,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Ten element jest przestarzały. Biblioteka zawiera nową wersję treści." @@ -11104,8 +11117,9 @@ msgid "Select a Library." msgstr "Wybierz bibliotekę." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "Nie odnaleziono pasujących typów ćwiczeń we wskazanych bibliotekach." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -13322,14 +13336,6 @@ msgstr "Wymagania" msgid "Details" msgstr "Szczegóły" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Pokaż" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -14116,6 +14122,14 @@ msgstr "Sekwencja" msgid "Completed" msgstr "Ukończono" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Zarejestruj się w {platform_name}" @@ -19781,6 +19795,11 @@ msgstr "Rozumiem!" msgid "Learn more" msgstr "Dowiedz się więcej " +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Pokaż" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -20486,6 +20505,10 @@ msgstr "Zobacz wersję próbną" msgid "Preview the courseware in the LMS" msgstr "Zobacz podgląd materiału kursowego w LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Dodawanie elementów" @@ -23438,14 +23461,26 @@ msgstr "" "egzaminy i określać w jakim stopniu dane ćwiczenie wpływa na końcową ocenę " "studenta." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Rozwiń lub zwiń" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/pl/LC_MESSAGES/djangojs.po b/conf/locale/pl/LC_MESSAGES/djangojs.po index 3339cbbe5b9c..b7547547c001 100644 --- a/conf/locale/pl/LC_MESSAGES/djangojs.po +++ b/conf/locale/pl/LC_MESSAGES/djangojs.po @@ -116,7 +116,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Klara Sielicka-Baryłka, 2022\n" "Language-Team: Polish (http://app.transifex.com/open-edx/edx-platform/language/pl/)\n" @@ -238,7 +238,8 @@ msgstr "Wybierz plik" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6227,6 +6228,7 @@ msgstr "Czy na pewno chcesz usunąć tę zmianę?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6236,26 +6238,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6263,21 +6270,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10952,6 +10963,10 @@ msgid "Note: Do not hide graded assignments after they have been released." msgstr "" "Uwaga: nie ukrywaj zadań, które podlegają ocenie, po ich upublicznieniu." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Data i czas upublicznienia" @@ -11152,6 +11167,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Obecna rola:" diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po index 4f78683b89d4..322fa2c462f1 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -246,7 +246,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Rodrigo Rocha , 2020\n" "Language-Team: Portuguese (Brazil) (http://app.transifex.com/open-edx/edx-platform/language/pt_BR/)\n" @@ -351,7 +351,8 @@ msgstr "" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js msgid "OK" msgstr "OK" @@ -6129,6 +6130,7 @@ msgstr "Você tem certeza de que deseja apagar essa atualização?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6138,26 +6140,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6165,21 +6172,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10746,6 +10757,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Data e Horário de Lançamento" @@ -10928,6 +10943,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Papel Atual:" diff --git a/conf/locale/pt_PT/LC_MESSAGES/django.mo b/conf/locale/pt_PT/LC_MESSAGES/django.mo index a7d6755555d8..d41c58a5f3a5 100644 Binary files a/conf/locale/pt_PT/LC_MESSAGES/django.mo and b/conf/locale/pt_PT/LC_MESSAGES/django.mo differ diff --git a/conf/locale/pt_PT/LC_MESSAGES/django.po b/conf/locale/pt_PT/LC_MESSAGES/django.po index c3dce3aee7b0..e864c6f81172 100644 --- a/conf/locale/pt_PT/LC_MESSAGES/django.po +++ b/conf/locale/pt_PT/LC_MESSAGES/django.po @@ -11811,6 +11811,19 @@ msgstr "" "utilizadores possam reiniciar as suas respostas e reordenar os itens " "seleccionados." +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Este componente está desatualizado. A biblioteca tem conteúdo novo." @@ -11847,10 +11860,9 @@ msgid "Select a Library." msgstr "Selecione uma biblioteca." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" -"Não existem tipos de problemas correspondentes nas bibliotecas " -"especificadas." #: xmodule/library_content_block.py msgid "Select another problem type." @@ -14135,14 +14147,6 @@ msgstr "Requisitos" msgid "Details" msgstr "Detalhes" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Ver" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -14928,6 +14932,14 @@ msgstr "Sequência" msgid "Completed" msgstr "Concluído" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Inscrever-se para {platform_name}" @@ -20974,6 +20986,11 @@ msgstr "Compreendido!" msgid "Learn more" msgstr "Saber mais" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Ver" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -21689,6 +21706,10 @@ msgstr "Visualizar Versão Ao Vivo" msgid "Preview the courseware in the LMS" msgstr "Pré-visualizar o material didático no LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Adicionar componentes" @@ -24713,14 +24734,26 @@ msgstr "" "laboratórios, questionários, e exames, e especifique quanto uma nota de cada" " aluno vale para cada tipo de tarefa." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Expandir ou Encolher" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "Gerir o Acesso" diff --git a/conf/locale/pt_PT/LC_MESSAGES/djangojs.po b/conf/locale/pt_PT/LC_MESSAGES/djangojs.po index 908665e804c8..15f9389803e6 100644 --- a/conf/locale/pt_PT/LC_MESSAGES/djangojs.po +++ b/conf/locale/pt_PT/LC_MESSAGES/djangojs.po @@ -113,7 +113,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Ivo Branco , 2021,2023\n" "Language-Team: Portuguese (Portugal) (http://app.transifex.com/open-edx/edx-platform/language/pt_PT/)\n" @@ -239,7 +239,8 @@ msgstr "Escolha um ficheiro" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6450,6 +6451,7 @@ msgstr "Tem certeza que quer eliminar esta atualização?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6459,26 +6461,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6486,21 +6493,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11318,6 +11329,10 @@ msgstr "Ocultar dos estudantes" msgid "Note: Do not hide graded assignments after they have been released." msgstr "Nota: não oculte as tarefas com classificação após a sua divulgação." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Data e Hora de Lançamento" @@ -11523,6 +11538,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Perfil Atual:" diff --git a/conf/locale/rtl/LC_MESSAGES/django.mo b/conf/locale/rtl/LC_MESSAGES/django.mo index 92978710b0d3..fe6356d5adc2 100644 Binary files a/conf/locale/rtl/LC_MESSAGES/django.mo and b/conf/locale/rtl/LC_MESSAGES/django.mo differ diff --git a/conf/locale/rtl/LC_MESSAGES/django.po b/conf/locale/rtl/LC_MESSAGES/django.po index 3b8636d196b3..9a2d358c046d 100644 --- a/conf/locale/rtl/LC_MESSAGES/django.po +++ b/conf/locale/rtl/LC_MESSAGES/django.po @@ -38,8 +38,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-26 20:36+0000\n" -"PO-Revision-Date: 2023-11-26 20:36:15.034816\n" +"POT-Creation-Date: 2023-12-05 14:25+0000\n" +"PO-Revision-Date: 2023-12-05 14:25:08.102305\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: rtl\n" @@ -8181,6 +8181,10 @@ msgstr "" msgid "The '{field_name}' field cannot be edited." msgstr "Ŧɥǝ '{field_name}' ɟᴉǝld ɔɐnnøʇ bǝ ǝdᴉʇǝd." +#: openedx/core/djangoapps/user_api/accounts/api.py +msgid "Full name can't be longer than 255 symbols" +msgstr "Fnll nɐɯǝ ɔɐn'ʇ bǝ lønƃǝɹ ʇɥɐn 255 sʎɯbøls" + #: openedx/core/djangoapps/user_api/accounts/api.py #: openedx/core/djangoapps/user_authn/views/registration_form.py msgid "Enter a valid name" @@ -13016,13 +13020,11 @@ msgid "{previous_groups}, {current_group}" msgstr "{previous_groups}, {current_group}" #: cms/djangoapps/contentstore/utils.py -#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py #, python-brace-format msgid "Duplicate of {0}" msgstr "Đndlᴉɔɐʇǝ øɟ {0}" #: cms/djangoapps/contentstore/utils.py -#: cms/djangoapps/contentstore/xblock_storage_handlers/view_handlers.py #, python-brace-format msgid "Duplicate of '{0}'" msgstr "Đndlᴉɔɐʇǝ øɟ '{0}'" @@ -14516,6 +14518,14 @@ msgstr "Sǝbnǝnɔǝ" msgid "Completed" msgstr "Ȼøɯdlǝʇǝd" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "Nǝʍ Ʉnᴉʇ" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "Ᵽɐsʇǝ ɐs nǝʍ nnᴉʇ" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Sᴉƃn Ʉd ɟøɹ {platform_name}" diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.mo b/conf/locale/rtl/LC_MESSAGES/djangojs.mo index 9dd7f7c6f3f9..03167522402b 100644 Binary files a/conf/locale/rtl/LC_MESSAGES/djangojs.mo and b/conf/locale/rtl/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.po b/conf/locale/rtl/LC_MESSAGES/djangojs.po index 180a4ac9c29e..e80520f30e8f 100644 --- a/conf/locale/rtl/LC_MESSAGES/djangojs.po +++ b/conf/locale/rtl/LC_MESSAGES/djangojs.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-26 20:36+0000\n" -"PO-Revision-Date: 2023-11-26 20:36:15.164044\n" +"POT-Creation-Date: 2023-12-05 14:24+0000\n" +"PO-Revision-Date: 2023-12-05 14:25:07.995704\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: rtl\n" @@ -158,7 +158,8 @@ msgstr "Ȼɥøøsǝ Fᴉlǝ" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6243,6 +6244,7 @@ msgstr "Ⱥɹǝ ʎøn snɹǝ ʎøn ʍɐnʇ ʇø dǝlǝʇǝ ʇɥᴉs nddɐʇǝ?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "Ȼødʎᴉnƃ" @@ -6252,26 +6254,31 @@ msgstr "Ȼødʎ øɟ '{componentDisplayName}'" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "Ᵽɐsʇᴉnƃ" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "Søɯǝ ǝɹɹøɹs øɔɔnɹɹǝd" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "Ŧɥǝ ɟølløʍᴉnƃ ɹǝbnᴉɹǝd ɟᴉlǝs ɔønld nøʇ bǝ ɐddǝd ʇø ʇɥǝ ɔønɹsǝ:" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "Ɏøn ɯɐʎ nǝǝd ʇø nddɐʇǝ ɐ ɟᴉlǝ(s) ɯɐnnɐllʎ" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6281,21 +6288,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "Nǝʍ ɟᴉlǝ(s) ɐddǝd ʇø Fᴉlǝs & Ʉdløɐds." #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "Ŧɥǝ ɟølløʍᴉnƃ ɹǝbnᴉɹǝd ɟᴉlǝs ʍǝɹǝ ᴉɯdøɹʇǝd ʇø ʇɥᴉs ɔønɹsǝ:" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "Vᴉǝʍ ɟᴉlǝs" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "Đᴉsɯᴉss" @@ -11066,6 +11077,10 @@ msgstr "Ħᴉdǝ ɟɹøɯ lǝɐɹnǝɹs" msgid "Note: Do not hide graded assignments after they have been released." msgstr "Nøʇǝ: Đø nøʇ ɥᴉdǝ ƃɹɐdǝd ɐssᴉƃnɯǝnʇs ɐɟʇǝɹ ʇɥǝʎ ɥɐʌǝ bǝǝn ɹǝlǝɐsǝd." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "Ȼødʎ Ʉnᴉʇ" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Ɍǝlǝɐsǝ Đɐʇǝ ɐnd Ŧᴉɯǝ" diff --git a/conf/locale/ru/LC_MESSAGES/djangojs.po b/conf/locale/ru/LC_MESSAGES/djangojs.po index a88694321057..d722f14d35b8 100644 --- a/conf/locale/ru/LC_MESSAGES/djangojs.po +++ b/conf/locale/ru/LC_MESSAGES/djangojs.po @@ -193,7 +193,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: ashed , 2022-2023\n" "Language-Team: Russian (http://app.transifex.com/open-edx/edx-platform/language/ru/)\n" @@ -303,7 +303,8 @@ msgstr "Выберите файл" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6311,6 +6312,7 @@ msgstr "Вы уверены, что хотите удалить это обно #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6320,26 +6322,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6347,21 +6354,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11030,6 +11041,10 @@ msgstr "" "Примечание: не закрывайте доступ к заданиям, выполняемым на оценку, после их" " выпуска." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Дата и время выпуска" @@ -11227,6 +11242,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Текущая роль:" diff --git a/conf/locale/sk/LC_MESSAGES/django.po b/conf/locale/sk/LC_MESSAGES/django.po index 40e4b5d6b4f1..056864f523a1 100644 --- a/conf/locale/sk/LC_MESSAGES/django.po +++ b/conf/locale/sk/LC_MESSAGES/django.po @@ -10369,6 +10369,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10403,7 +10416,8 @@ msgid "Select a Library." msgstr "" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12427,12 +12441,6 @@ msgstr "Požiadavky" msgid "Details" msgstr "Podrobnosti" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Zobraziť" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13180,6 +13188,14 @@ msgstr "" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "" @@ -18333,6 +18349,10 @@ msgstr "" msgid "Learn more" msgstr "" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Zobraziť" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "" @@ -18982,6 +19002,10 @@ msgstr "" msgid "Preview the courseware in the LMS" msgstr "" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "" @@ -21527,14 +21551,26 @@ msgid "" "worth." msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/sk/LC_MESSAGES/djangojs.po b/conf/locale/sk/LC_MESSAGES/djangojs.po index 942a439e6d52..c90d29897f6a 100644 --- a/conf/locale/sk/LC_MESSAGES/djangojs.po +++ b/conf/locale/sk/LC_MESSAGES/djangojs.po @@ -46,7 +46,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: \n" "Language-Team: Slovak (http://app.transifex.com/open-edx/edx-platform/language/sk/)\n" @@ -145,7 +145,8 @@ msgstr "Vybrať súbor" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js msgid "OK" msgstr "OK" @@ -5869,6 +5870,7 @@ msgstr "Skutočne chcete odstrániť túto aktualizáciu?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5878,26 +5880,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5905,21 +5912,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10391,6 +10402,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10569,6 +10584,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/conf/locale/sw_KE/LC_MESSAGES/django.po b/conf/locale/sw_KE/LC_MESSAGES/django.po index 1f3699a31285..a1f9851ea6ea 100644 --- a/conf/locale/sw_KE/LC_MESSAGES/django.po +++ b/conf/locale/sw_KE/LC_MESSAGES/django.po @@ -10485,6 +10485,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10519,7 +10532,8 @@ msgid "Select a Library." msgstr "Chagua Maktaba." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12555,12 +12569,6 @@ msgstr "Yanayohitajika" msgid "Details" msgstr "Utondoti" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Tazama" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13326,6 +13334,14 @@ msgstr "Mfululizo" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Jiandikishe mtandaoni kwa {platform_name}" @@ -18893,6 +18909,10 @@ msgstr "Umeipata!" msgid "Learn more" msgstr "Jifunze zaidi" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Tazama" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -19581,6 +19601,10 @@ msgstr "Tazama toleo mubashara " msgid "Preview the courseware in the LMS" msgstr "Mtazamo kabla wa Maudhui ya kozi katika LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Kuongeza vipengele" @@ -22240,14 +22264,26 @@ msgid "" "worth." msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/sw_KE/LC_MESSAGES/djangojs.po b/conf/locale/sw_KE/LC_MESSAGES/djangojs.po index 29bb2ec03c3b..38532de8dc20 100644 --- a/conf/locale/sw_KE/LC_MESSAGES/djangojs.po +++ b/conf/locale/sw_KE/LC_MESSAGES/djangojs.po @@ -71,7 +71,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: YAHAYA MWAVURIZI , 2017\n" "Language-Team: Swahili (Kenya) (http://app.transifex.com/open-edx/edx-platform/language/sw_KE/)\n" @@ -177,7 +177,8 @@ msgstr "Chagua Faili" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -5971,6 +5972,7 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5980,26 +5982,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6007,21 +6014,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10589,6 +10600,10 @@ msgstr "Ficha isionekane na wanafunzi" msgid "Note: Do not hide graded assignments after they have been released." msgstr "Zingatia: Usifiche mazoezi yalipewa madara baada ya kutolewa kwake." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10784,6 +10799,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Wadhifa wako Hivi sasa:" diff --git a/conf/locale/th/LC_MESSAGES/django.po b/conf/locale/th/LC_MESSAGES/django.po index 4391c2364045..881f02d14dc3 100644 --- a/conf/locale/th/LC_MESSAGES/django.po +++ b/conf/locale/th/LC_MESSAGES/django.po @@ -10165,6 +10165,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10199,7 +10212,8 @@ msgid "Select a Library." msgstr "" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12208,12 +12222,6 @@ msgstr "ความต้องการ" msgid "Details" msgstr "รายละเอียด" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "ดู" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -12958,6 +12966,14 @@ msgstr "" msgid "Completed" msgstr "เสร็จสิ้น" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "สมัครสำหรับ {platform_name}" @@ -18287,6 +18303,10 @@ msgstr "เข้าใจแล้ว!" msgid "Learn more" msgstr "เรียนรู้เพิ่มเติม" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "ดู" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end} " @@ -18961,6 +18981,10 @@ msgstr "เวอร์ชั่นดูสด" msgid "Preview the courseware in the LMS" msgstr "ชมตัวอย่างบทเรียนใน LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "การเพิ่มส่วนประกอบ" @@ -21733,14 +21757,26 @@ msgstr "" "คุณยังสามารถสร้างประเภทของงานที่มอบหมาย เช่น การบ้าน, การทดลอง, ควิซ " "และข้อสอบ และกำหนดว่างานประเภทไหนมีค่าเท่าไร" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "ขยายเพิ่มหรือยุบทิ้ง" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/th/LC_MESSAGES/djangojs.po b/conf/locale/th/LC_MESSAGES/djangojs.po index c5d280129b7a..55997e45c0c5 100644 --- a/conf/locale/th/LC_MESSAGES/djangojs.po +++ b/conf/locale/th/LC_MESSAGES/djangojs.po @@ -73,7 +73,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: edx demo , 2019\n" "Language-Team: Thai (http://app.transifex.com/open-edx/edx-platform/language/th/)\n" @@ -182,7 +182,8 @@ msgstr "" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js msgid "OK" msgstr "ตกลง" @@ -5847,6 +5848,7 @@ msgstr "คุณแน่ใจหรือว่าต้องการที #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5856,26 +5858,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5883,21 +5890,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10381,6 +10392,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10559,6 +10574,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/conf/locale/tr_TR/LC_MESSAGES/django.mo b/conf/locale/tr_TR/LC_MESSAGES/django.mo index 2e412e5e7638..c2f87fb6b977 100644 Binary files a/conf/locale/tr_TR/LC_MESSAGES/django.mo and b/conf/locale/tr_TR/LC_MESSAGES/django.mo differ diff --git a/conf/locale/tr_TR/LC_MESSAGES/django.po b/conf/locale/tr_TR/LC_MESSAGES/django.po index 19b3497d9873..41c638d5da5f 100644 --- a/conf/locale/tr_TR/LC_MESSAGES/django.po +++ b/conf/locale/tr_TR/LC_MESSAGES/django.po @@ -11656,6 +11656,19 @@ msgstr "" "böylece kullanıcılar yanıtlarını sıfırlayabilir ve seçilen öğeleri yeniden " "düzenleyebilirler." +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Bu bileşen güncel değil. Kütüphane yeni içeriğe sahip." @@ -11692,8 +11705,9 @@ msgid "Select a Library." msgstr "Bir Kütüphane Seçin." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "Belirtilen kütüphanelerde, eşleşen problem türleri yoktur." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -13947,14 +13961,6 @@ msgstr "Gereklilikler" msgid "Details" msgstr "Ayrıntılar" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Görüntüle" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -14732,6 +14738,14 @@ msgstr "Sıralı" msgid "Completed" msgstr "Tamamlandı" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "{platform_name} için kaydolun" @@ -20644,6 +20658,11 @@ msgstr "Anladım!" msgid "Learn more" msgstr "Daha fazlasını öğren" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Görüntüle" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(aktif){span_end}" @@ -21359,6 +21378,10 @@ msgstr "Canlı Sürümü Görüntüle" msgid "Preview the courseware in the LMS" msgstr "LMS'deki ders içeriğini önizle" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Bileşenler ekleniyor" @@ -24329,14 +24352,26 @@ msgstr "" "her bir görevin öğrencinin notuna ne kadar katkıda bulunacağını " "belirleyebilirsiniz." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Genişlet veya Daralt" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "Erişimi Yönet" diff --git a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po index 65af4f6cd188..edfec9d786ce 100644 --- a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po +++ b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po @@ -110,7 +110,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Ali Işıngör , 2018,2020-2021,2023\n" "Language-Team: Turkish (Turkey) (http://app.transifex.com/open-edx/edx-platform/language/tr_TR/)\n" @@ -236,7 +236,8 @@ msgstr "Dosya Seç" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6373,6 +6374,7 @@ msgstr "Bu güncellemeyi silmek istediğinize emin misiniz?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "Kopyalıyor" @@ -6382,26 +6384,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "Yapıştırıyor" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6409,21 +6416,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -11174,6 +11185,10 @@ msgstr "Öğrencilerden gizle" msgid "Note: Do not hide graded assignments after they have been released." msgstr "Not: Notlandırılmış görevleri yayınlandıktan sonra gizlemeyin." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Yayım Tarih ve Zamanı" @@ -11372,6 +11387,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Mevcut Rol:" diff --git a/conf/locale/uk/LC_MESSAGES/django.mo b/conf/locale/uk/LC_MESSAGES/django.mo index 8fc5c5c46baa..a90f89d6c87a 100644 Binary files a/conf/locale/uk/LC_MESSAGES/django.mo and b/conf/locale/uk/LC_MESSAGES/django.mo differ diff --git a/conf/locale/uk/LC_MESSAGES/django.po b/conf/locale/uk/LC_MESSAGES/django.po index c6ce14a4243f..fbe950ab64a3 100644 --- a/conf/locale/uk/LC_MESSAGES/django.po +++ b/conf/locale/uk/LC_MESSAGES/django.po @@ -11180,6 +11180,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "Цей компонент застарів. Оновлено вміст бібліотеки." @@ -11216,8 +11229,9 @@ msgid "Select a Library." msgstr "Вибрати бібліотеку." #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "У заданих бібліотеках немає відповідного виду завдань." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -13442,14 +13456,6 @@ msgstr "Вимоги" msgid "Details" msgstr "Деталі" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Дивитися" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -14213,6 +14219,14 @@ msgstr "" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Зареєструватися на {platform_name}" @@ -19433,6 +19447,11 @@ msgstr "" msgid "Learn more" msgstr "Дізнатися більше" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Дивитися" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "" @@ -20088,6 +20107,10 @@ msgstr "" msgid "Preview the courseware in the LMS" msgstr "" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "" @@ -22785,14 +22808,26 @@ msgstr "" " лабораторні роботи, вікторини та іспити, а також визначати, як оцінювати " "кожний тип завдання, виконаний студентом." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/uk/LC_MESSAGES/djangojs.po b/conf/locale/uk/LC_MESSAGES/djangojs.po index afd723afc4cd..9c72edb51510 100644 --- a/conf/locale/uk/LC_MESSAGES/djangojs.po +++ b/conf/locale/uk/LC_MESSAGES/djangojs.po @@ -106,7 +106,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Mykola Melnyk, 2023\n" "Language-Team: Ukrainian (http://app.transifex.com/open-edx/edx-platform/language/uk/)\n" @@ -210,7 +210,8 @@ msgstr "Обрати файл" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js msgid "OK" msgstr "Гаразд" @@ -6233,6 +6234,7 @@ msgstr "Ви впевнені, що хочете видалити це онов #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6242,26 +6244,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6269,21 +6276,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10844,6 +10855,10 @@ msgstr "" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Дата і час випуску" @@ -11024,6 +11039,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/conf/locale/vi/LC_MESSAGES/django.po b/conf/locale/vi/LC_MESSAGES/django.po index a1cd76b74172..42a3dd3ddfd0 100644 --- a/conf/locale/vi/LC_MESSAGES/django.po +++ b/conf/locale/vi/LC_MESSAGES/django.po @@ -10242,6 +10242,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "" @@ -10276,7 +10289,8 @@ msgid "Select a Library." msgstr "" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." msgstr "" #: xmodule/library_content_block.py @@ -12308,12 +12322,6 @@ msgstr "Yêu cầu" msgid "Details" msgstr "Chi tiết" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "Xem " - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13076,6 +13084,14 @@ msgstr "Trình tự" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "Đăng ký với {platform_name}" @@ -18738,6 +18754,10 @@ msgstr "Hiểu rồi!" msgid "Learn more" msgstr "Tìm hiểu thêm" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "Xem " + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -19434,6 +19454,10 @@ msgstr "Xem phiên bản thực" msgid "Preview the courseware in the LMS" msgstr "Xem trước giáo trình trong LMS" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "Thêm các phần" @@ -22358,14 +22382,26 @@ msgstr "" "thí nghiệm, các câu đố, và các kỳ thi, và xác định có bao nhiêu lớp của học " "sinh mỗi loại phân công là phù hợp." +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "Mở rộng hoặc Thu gọn" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/vi/LC_MESSAGES/djangojs.po b/conf/locale/vi/LC_MESSAGES/djangojs.po index 438ad86970fa..2332a604b05a 100644 --- a/conf/locale/vi/LC_MESSAGES/djangojs.po +++ b/conf/locale/vi/LC_MESSAGES/djangojs.po @@ -113,7 +113,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Le Minh Tri , 2020\n" "Language-Team: Vietnamese (http://app.transifex.com/open-edx/edx-platform/language/vi/)\n" @@ -216,7 +216,8 @@ msgstr "Chọn Tệp" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js msgid "OK" msgstr "OK" @@ -6102,6 +6103,7 @@ msgstr "Bạn chắc chắn muốn xóa bản cập nhật này?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6111,26 +6113,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6138,21 +6145,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10757,6 +10768,10 @@ msgid "Note: Do not hide graded assignments after they have been released." msgstr "" "Lưu ý: Không được ẩn những bài tập đã chấm sau khi chúng đã được công bố." +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "Ngày và giờ phát hành" @@ -10954,6 +10969,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "Vai trò hiện tại:" diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.mo b/conf/locale/zh_CN/LC_MESSAGES/django.mo index 6736c4b59e4b..a75505c0bcd9 100644 Binary files a/conf/locale/zh_CN/LC_MESSAGES/django.mo and b/conf/locale/zh_CN/LC_MESSAGES/django.mo differ diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.po b/conf/locale/zh_CN/LC_MESSAGES/django.po index 5b6899edc454..c30c3400fe5a 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/django.po +++ b/conf/locale/zh_CN/LC_MESSAGES/django.po @@ -10826,6 +10826,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "确定是否显示“重置问题”按钮,以便用户可以重置他们的答案并重新排列所选项目。" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "该组件已过时。知识库有新的内容。" @@ -10860,8 +10873,9 @@ msgid "Select a Library." msgstr "选择一个知识库。" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "指定知识库中没有匹配的问题类型。" +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -12894,14 +12908,6 @@ msgstr "修习要求" msgid "Details" msgstr "细节" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "阅览" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13645,6 +13651,14 @@ msgstr "序列" msgid "Completed" msgstr "已完成" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "注册为{platform_name}平台的会员" @@ -18908,6 +18922,11 @@ msgstr "成功了!" msgid "Learn more" msgstr "了解更多" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "阅览" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(激活){span_end}" @@ -19567,6 +19586,10 @@ msgstr "观看在线版本" msgid "Preview the courseware in the LMS" msgstr "在LMS中预览课件" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "添加组件" @@ -22159,14 +22182,26 @@ msgid "" "worth." msgstr "您也可以创建作业类型,比如家庭作业、实验、测验、以及考试,并且指定每个作业是否计入最终的成绩及其评价分值。" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "展开或折叠" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po index efaf309704fc..d8bef9dcb95c 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po @@ -231,7 +231,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Cecilia Liu, 2023\n" "Language-Team: Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" @@ -341,7 +341,8 @@ msgstr "选择文件" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6020,6 +6021,7 @@ msgstr "您确定要删除此更新吗?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6029,26 +6031,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6056,21 +6063,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "解散" @@ -10541,6 +10552,10 @@ msgstr "对学习这隐藏" msgid "Note: Do not hide graded assignments after they have been released." msgstr "注意:请勿在已发布后隐藏已评分作业。" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "公开日期及时间" @@ -10720,6 +10735,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "当前角色:" diff --git a/conf/locale/zh_HANS/LC_MESSAGES/django.mo b/conf/locale/zh_HANS/LC_MESSAGES/django.mo index 6736c4b59e4b..a75505c0bcd9 100644 Binary files a/conf/locale/zh_HANS/LC_MESSAGES/django.mo and b/conf/locale/zh_HANS/LC_MESSAGES/django.mo differ diff --git a/conf/locale/zh_HANS/LC_MESSAGES/django.po b/conf/locale/zh_HANS/LC_MESSAGES/django.po index 5b6899edc454..c30c3400fe5a 100644 --- a/conf/locale/zh_HANS/LC_MESSAGES/django.po +++ b/conf/locale/zh_HANS/LC_MESSAGES/django.po @@ -10826,6 +10826,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "确定是否显示“重置问题”按钮,以便用户可以重置他们的答案并重新排列所选项目。" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "该组件已过时。知识库有新的内容。" @@ -10860,8 +10873,9 @@ msgid "Select a Library." msgstr "选择一个知识库。" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "指定知识库中没有匹配的问题类型。" +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -12894,14 +12908,6 @@ msgstr "修习要求" msgid "Details" msgstr "细节" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -#: wiki/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "阅览" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13645,6 +13651,14 @@ msgstr "序列" msgid "Completed" msgstr "已完成" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "注册为{platform_name}平台的会员" @@ -18908,6 +18922,11 @@ msgstr "成功了!" msgid "Learn more" msgstr "了解更多" +#: lms/templates/wiki/includes/article_menu.html +#: wiki/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "阅览" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(激活){span_end}" @@ -19567,6 +19586,10 @@ msgstr "观看在线版本" msgid "Preview the courseware in the LMS" msgstr "在LMS中预览课件" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "添加组件" @@ -22159,14 +22182,26 @@ msgid "" "worth." msgstr "您也可以创建作业类型,比如家庭作业、实验、测验、以及考试,并且指定每个作业是否计入最终的成绩及其评价分值。" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "展开或折叠" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po index efaf309704fc..d8bef9dcb95c 100644 --- a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po @@ -231,7 +231,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Cecilia Liu, 2023\n" "Language-Team: Chinese (China) (http://app.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" @@ -341,7 +341,8 @@ msgstr "选择文件" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js #: common/static/common/templates/discussion/templates.underscore #: lms/templates/learner_dashboard/verification_popover.underscore msgid "OK" @@ -6020,6 +6021,7 @@ msgstr "您确定要删除此更新吗?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -6029,26 +6031,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -6056,21 +6063,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "解散" @@ -10541,6 +10552,10 @@ msgstr "对学习这隐藏" msgid "Note: Do not hide graded assignments after they have been released." msgstr "注意:请勿在已发布后隐藏已评分作业。" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "公开日期及时间" @@ -10720,6 +10735,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "当前角色:" diff --git a/conf/locale/zh_TW/LC_MESSAGES/django.mo b/conf/locale/zh_TW/LC_MESSAGES/django.mo index b90ecc154cca..6615eefcf1bd 100644 Binary files a/conf/locale/zh_TW/LC_MESSAGES/django.mo and b/conf/locale/zh_TW/LC_MESSAGES/django.mo differ diff --git a/conf/locale/zh_TW/LC_MESSAGES/django.po b/conf/locale/zh_TW/LC_MESSAGES/django.po index 5c2d88806ab2..de35e359eeaf 100644 --- a/conf/locale/zh_TW/LC_MESSAGES/django.po +++ b/conf/locale/zh_TW/LC_MESSAGES/django.po @@ -10383,6 +10383,19 @@ msgid "" "their answers and reshuffle selected items." msgstr "" +#: xmodule/library_content_block.py +msgid "Source content library has not been specified." +msgstr "" + +#: xmodule/library_content_block.py +msgid "Content libraries are not available in the current runtime." +msgstr "" + +#: xmodule/library_content_block.py +#, python-brace-format +msgid "Source content library does not exist: {source_library_id}" +msgstr "" + #: xmodule/library_content_block.py msgid "This component is out of date. The library has new content." msgstr "此組件已過期,課程組件庫中有新的內容。" @@ -10417,8 +10430,9 @@ msgid "Select a Library." msgstr "選擇一個課程組件庫。" #: xmodule/library_content_block.py -msgid "There are no matching problem types in the specified libraries." -msgstr "在指定庫找不到對應的問題型態。" +#, python-brace-format +msgid "There are no problems in the specified library of type {capa_type}." +msgstr "" #: xmodule/library_content_block.py msgid "Select another problem type." @@ -12433,12 +12447,6 @@ msgstr "課程要求" msgid "Details" msgstr "細節" -#. Translators: this is a verb describing the action of viewing more details -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/wiki/includes/article_menu.html -msgid "View" -msgstr "檢視" - #: cms/templates/maintenance/_announcement_edit.html #: lms/templates/problem.html lms/templates/word_cloud.html msgid "Save" @@ -13177,6 +13185,14 @@ msgstr "" msgid "Completed" msgstr "" +#: lms/templates/seq_block.html +msgid "New Unit" +msgstr "" + +#: lms/templates/seq_block.html +msgid "Paste as new unit" +msgstr "" + #: lms/templates/signup_modal.html msgid "Sign Up for {platform_name}" msgstr "註冊加入{platform_name}" @@ -18337,6 +18353,10 @@ msgstr "瞭解!" msgid "Learn more" msgstr "" +#: lms/templates/wiki/includes/article_menu.html +msgid "View" +msgstr "檢視" + #: lms/templates/wiki/includes/article_menu.html msgid "{span_start}(active){span_end}" msgstr "{span_start}(active){span_end}" @@ -18985,6 +19005,10 @@ msgstr "檢視線上版本" msgid "Preview the courseware in the LMS" msgstr "" +#: cms/templates/container.html +msgid "Collapse All" +msgstr "" + #: cms/templates/container.html msgid "Adding components" msgstr "" @@ -21550,14 +21574,26 @@ msgid "" "worth." msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Importing components" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Expand or Collapse" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Select this problem" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Copy to Clipboard" msgstr "" +#: cms/templates/studio_xblock_wrapper.html +msgid "Manage tags" +msgstr "" + #: cms/templates/studio_xblock_wrapper.html msgid "Manage Access" msgstr "" diff --git a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po index fa51b90a954c..d7563ebace03 100644 --- a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po @@ -132,7 +132,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2023-11-19 20:43+0000\n" +"POT-Creation-Date: 2023-12-03 20:43+0000\n" "PO-Revision-Date: 2014-06-11 15:18+0000\n" "Last-Translator: Andrew Lau , 2017\n" "Language-Team: Chinese (Taiwan) (http://app.transifex.com/open-edx/edx-platform/language/zh_TW/)\n" @@ -236,7 +236,8 @@ msgstr "選擇檔案" #: cms/static/js/views/course_info_update.js #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js cms/static/js/views/tabs.js -#: lms/static/js/Markdown.Editor.js xmodule/js/src/html/edit.js +#: cms/static/js/views/utils/xblock_utils.js lms/static/js/Markdown.Editor.js +#: xmodule/js/src/html/edit.js msgid "OK" msgstr "好的" @@ -5863,6 +5864,7 @@ msgstr "您確定要刪除這項更新嗎?" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/pages/container_subviews.js msgid "Copying" msgstr "" @@ -5872,26 +5874,31 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Pasting" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Some errors occurred" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files could not be added to the course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "You may need to update a file(s) manually" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "" "The following files already exist in this course but don't match the version" " used by the component you pasted:" @@ -5899,21 +5906,25 @@ msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "New file(s) added to Files & Uploads." msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "The following required files were imported to this course:" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "View files" msgstr "" #: cms/static/js/views/course_outline.js #: cms/static/js/views/pages/container.js +#: cms/static/js/views/utils/xblock_utils.js msgid "Dismiss" msgstr "" @@ -10368,6 +10379,10 @@ msgstr "對學習者隱藏" msgid "Note: Do not hide graded assignments after they have been released." msgstr "" +#: cms/templates/js/publish-xblock.underscore +msgid "Copy Unit" +msgstr "" + #: cms/templates/js/release-date-editor.underscore msgid "Release Date and Time" msgstr "" @@ -10546,6 +10561,10 @@ msgstr "" msgid "Enable summaries" msgstr "" +#: cms/templates/js/tag-list.underscore +msgid "Manage tags" +msgstr "" + #: cms/templates/js/team-member.underscore msgid "Current Role:" msgstr "" diff --git a/lms/djangoapps/courseware/tests/test_utils.py b/lms/djangoapps/courseware/tests/test_utils.py index 81841f99ad58..f8508f69c90c 100644 --- a/lms/djangoapps/courseware/tests/test_utils.py +++ b/lms/djangoapps/courseware/tests/test_utils.py @@ -135,7 +135,6 @@ def test_create_financial_assistance_application(self): test_form_data = { 'lms_user_id': self.user.id, 'course_id': self.test_course_id, - 'income': '$85,000 - $100,000' } with patch.object(OAuthAPIClient, 'request') as oauth_mock: oauth_mock.return_value = self._mock_response(status.HTTP_200_OK, {'success': True}) @@ -150,7 +149,6 @@ def test_create_financial_assistance_application_bad_request(self): test_form_data = { 'lms_user_id': self.user.id, 'course_id': 'invalid_course_id', - 'income': '$85,000 - $100,000' } error_response = {'message': 'Invalid course id provided'} with patch.object(OAuthAPIClient, 'request') as oauth_mock: diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index bebd4a79fb93..e170e857666e 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -932,27 +932,22 @@ def _submit_financial_assistance_form(self, data, submit_url='submit_financial_a url = reverse(submit_url) return self.client.post(url, json.dumps(data), content_type='application/json', HTTP_REFERER=referrer_url) + @override_settings(ZENDESK_CUSTOM_FIELDS={'course_id': 'custom_123'}) @patch.object(views, 'create_zendesk_ticket', return_value=200) def test_submit_financial_assistance_request(self, mock_create_zendesk_ticket): username = self.user.username course = str(self.course_key) legal_name = 'Jesse Pinkman' country = 'United States' - income = '1234567890' - reason_for_applying = "It's just basic chemistry, yo." - goals = "I don't know if it even matters, but... work with my hands, I guess." - effort = "I'm done, okay? You just give me my money, and you and I, we're done." data = { 'username': username, 'course': course, 'name': legal_name, 'email': self.user.email, 'country': country, - 'income': income, - 'reason_for_applying': reason_for_applying, - 'goals': goals, - 'effort': effort, - 'mktg-permission': False, + 'certify-economic-hardship': False, + 'certify-complete-certificate': False, + 'certify-honor-code': False, } response = self._submit_financial_assistance_form(data) assert response.status_code == 204 @@ -960,17 +955,19 @@ def test_submit_financial_assistance_request(self, mock_create_zendesk_ticket): __, __, ticket_subject, __ = mock_create_zendesk_ticket.call_args[0] mocked_kwargs = mock_create_zendesk_ticket.call_args[1] group_name = mocked_kwargs['group'] - tags = mocked_kwargs['tags'] + custom_fields = mocked_kwargs['custom_fields'] additional_info = mocked_kwargs['additional_info'] private_comment = '\n'.join(list(additional_info.values())) - for info in (country, income, reason_for_applying, goals, effort, username, legal_name, course): + for info in (country, username, legal_name, course): assert info in private_comment - assert additional_info['Allowed for marketing purposes'] == 'No' + assert additional_info['Paying for the course would cause economic hardship'] == 'No' + assert additional_info['Certify work diligently to receive a certificate'] == 'No' + assert additional_info['Certify abide by the honor code'] == 'No' assert ticket_subject == f'Financial assistance request for learner {username} in course {self.course.display_name}' # pylint: disable=line-too-long - self.assertDictContainsSubset({'course_id': course}, tags) + self.assertEqual([{'id': 'custom_123', 'value': course}], custom_fields) assert 'Client IP' in additional_info assert group_name == 'Financial Assistance' @@ -982,11 +979,9 @@ def test_zendesk_submission_failed(self, _mock_create_zendesk_ticket): 'name': '', 'email': '', 'country': '', - 'income': '', - 'reason_for_applying': '', - 'goals': '', - 'effort': '', - 'mktg-permission': False, + 'certify-economic-hardship': False, + 'certify-complete-certificate': False, + 'certify-honor-code': False, }) assert response.status_code == 500 @@ -1002,11 +997,9 @@ def test_submit_financial_assistance_request_v2(self, referrer_url, expected_sta form_data = { 'username': self.user.username, 'course': 'course-v1:test+TestX+Test_Course', - 'income': '$25,000 - $40,000', - 'reason_for_applying': "It's just basic chemistry, yo.", - 'goals': "I don't know if it even matters, but... work with my hands, I guess.", - 'effort': "I'm done, okay? You just give me my money, and you and I, we're done.", - 'mktg-permission': False + 'certify-economic-hardship': False, + 'certify-complete-certificate': False, + 'certify-honor-code': False, } response = self._submit_financial_assistance_form( form_data, diff --git a/lms/djangoapps/courseware/utils.py b/lms/djangoapps/courseware/utils.py index 957f6fd370f1..5409c89f636b 100644 --- a/lms/djangoapps/courseware/utils.py +++ b/lms/djangoapps/courseware/utils.py @@ -183,11 +183,9 @@ def create_financial_assistance_application(form_data): { "lms_user_id": , "course_id": , - "income": , - "learner_reasons": , - "learner_goals": , - "learner_plans": , - "allow_for_marketing": + "certify_economic_hardship": , + "certify_complete_certificate": , + "certify_honor_code": , } """ response = _request_financial_assistance( diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index fdc90a46a513..d0e657775bce 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -26,7 +26,6 @@ from django.utils.text import slugify from django.utils.translation import gettext from django.utils.translation import gettext_lazy as _ -from django.utils.translation import gettext_noop from django.views.decorators.cache import cache_control from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.csrf import ensure_csrf_cookie @@ -1966,13 +1965,13 @@ def get_template_and_context(self, course, video_block): # Translators: "percent_sign" is the symbol "%". "platform_name" is a # string identifying the name of this installation, such as "edX". FINANCIAL_ASSISTANCE_HEADER = _( - '{platform_name} now offers financial assistance for learners who want to earn Verified Certificates but' - ' who may not be able to pay the Verified Certificate fee. Eligible learners may receive up to 90{percent_sign} off' # lint-amnesty, pylint: disable=line-too-long - ' the Verified Certificate fee for a course.\nTo apply for financial assistance, enroll in the' - ' audit track for a course that offers Verified Certificates, and then complete this application.' - ' Note that you must complete a separate application for each course you take.\n We plan to use this' - ' information to evaluate your application for financial assistance and to further develop our' - ' financial assistance program.' + 'We plan to use this information to evaluate your application for financial assistance and to further develop our' + ' financial assistance program. Please note that while \nassistance is available in most courses that offer' + ' verified certificates, a few courses and programs are not eligible. You must complete a separate application' + ' \nfor each course you take. You may be approved for financial assistance five (5) times each year' + ' (based on 12-month period from you first approval). \nTo apply for financial assistance: \n' + '1. Enroll in the audit track for an eligible course that offers Verified Certificates \n2. Complete this' + ' application \n3. Check your email, your application will be reviewed in 3-4 business days' ) @@ -1982,15 +1981,6 @@ def _get_fa_header(header): platform_name=configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME)).split('\n') -FA_INCOME_LABEL = gettext_noop('Annual Household Income') -FA_REASON_FOR_APPLYING_LABEL = gettext_noop('Tell us about your current financial situation. Why do you need assistance?') # lint-amnesty, pylint: disable=line-too-long -FA_GOALS_LABEL = gettext_noop('Tell us about your learning or professional goals. How will a Verified Certificate in this course help you achieve these goals?') # lint-amnesty, pylint: disable=line-too-long - -FA_EFFORT_LABEL = gettext_noop('Tell us about your plans for this course. What steps will you take to help you complete the course work and receive a certificate?') # lint-amnesty, pylint: disable=line-too-long - -FA_SHORT_ANSWER_INSTRUCTIONS = _('Use between 1250 and 2500 characters or so in your response.') - - @login_required def financial_assistance(request, course_id=None): """Render the initial financial assistance page.""" @@ -2024,11 +2014,9 @@ def financial_assistance_request(request): legal_name = data['name'] email = data['email'] country = data['country'] - income = data['income'] - reason_for_applying = data['reason_for_applying'] - goals = data['goals'] - effort = data['effort'] - marketing_permission = data['mktg-permission'] + certify_economic_hardship = data['certify-economic-hardship'] + certify_complete_certificate = data['certify-complete-certificate'] + certify_honor_code = data['certify-honor-code'] ip_address = get_client_ip(request)[0] except ValueError: # Thrown if JSON parsing fails @@ -2048,7 +2036,12 @@ def financial_assistance_request(request): course_name=course.display_name ), 'Financial Assistance Request', - tags={'course_id': course_id}, + custom_fields=[ + { + 'id': settings.ZENDESK_CUSTOM_FIELDS.get('course_id'), + 'value': course_id, + }, + ], # Send the application as additional info on the ticket so # that it is not shown when support replies. This uses # OrderedDict so that information is presented in the right @@ -2057,12 +2050,10 @@ def financial_assistance_request(request): ('Username', username), ('Full Name', legal_name), ('Course ID', course_id), - (FA_INCOME_LABEL, income), ('Country', country), - ('Allowed for marketing purposes', 'Yes' if marketing_permission else 'No'), - (FA_REASON_FOR_APPLYING_LABEL, '\n' + reason_for_applying + '\n\n'), - (FA_GOALS_LABEL, '\n' + goals + '\n\n'), - (FA_EFFORT_LABEL, '\n' + effort + '\n\n'), + ('Paying for the course would cause economic hardship', 'Yes' if certify_economic_hardship else 'No'), + ('Certify work diligently to receive a certificate', 'Yes' if certify_complete_certificate else 'No'), + ('Certify abide by the honor code', 'Yes' if certify_honor_code else 'No'), ('Client IP', ip_address), )), group='Financial Assistance', @@ -2094,11 +2085,9 @@ def financial_assistance_request_v2(request): if course_id and course_id not in request.META.get('HTTP_REFERER'): return HttpResponseBadRequest('Invalid Course ID provided.') lms_user_id = request.user.id - income = data['income'] - learner_reasons = data['reason_for_applying'] - learner_goals = data['goals'] - learner_plans = data['effort'] - allowed_for_marketing = data['mktg-permission'] + certify_economic_hardship = data['certify-economic-hardship'] + certify_complete_certificate = data['certify-complete-certificate'] + certify_honor_code = data['certify-honor-code'] except ValueError: # Thrown if JSON parsing fails @@ -2110,11 +2099,9 @@ def financial_assistance_request_v2(request): form_data = { 'lms_user_id': lms_user_id, 'course_id': course_id, - 'income': income, - 'learner_reasons': learner_reasons, - 'learner_goals': learner_goals, - 'learner_plans': learner_plans, - 'allowed_for_marketing': allowed_for_marketing + 'certify_economic_hardship': certify_economic_hardship, + 'certify_complete_certificate': certify_complete_certificate, + 'certify-honor-code': certify_honor_code, } return create_financial_assistance_application(form_data) @@ -2127,13 +2114,13 @@ def financial_assistance_form(request, course_id=None): if course_id: disabled = True enrolled_courses = get_financial_aid_courses(user, course_id) - incomes = ['Less than $5,000', '$5,000 - $10,000', '$10,000 - $15,000', '$15,000 - $20,000', '$20,000 - $25,000', - '$25,000 - $40,000', '$40,000 - $55,000', '$55,000 - $70,000', '$70,000 - $85,000', - '$85,000 - $100,000', 'More than $100,000'] - annual_incomes = [ - {'name': _(income), 'value': income} for income in incomes # lint-amnesty, pylint: disable=translation-of-non-string - ] + default_course = '' + for enrolled_course in enrolled_courses: + if enrolled_course['value'] == course_id: + default_course = enrolled_course['name'] + break + if course_id and _use_new_financial_assistance_flow(course_id): submit_url = 'submit_financial_assistance_request_v2' else: @@ -2141,7 +2128,7 @@ def financial_assistance_form(request, course_id=None): return render_to_response('financial-assistance/apply.html', { 'header_text': _get_fa_header(FINANCIAL_ASSISTANCE_HEADER), - 'student_faq_url': marketing_link('FAQ'), + 'course_id': course_id, 'dashboard_url': reverse('dashboard'), 'account_settings_url': reverse('account_settings'), 'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME), @@ -2158,7 +2145,7 @@ def financial_assistance_form(request, course_id=None): 'type': 'select', 'label': _('Course'), 'placeholder': '', - 'defaultValue': '', + 'defaultValue': default_course, 'required': True, 'disabled': disabled, 'options': enrolled_courses, @@ -2169,64 +2156,46 @@ def financial_assistance_form(request, course_id=None): ) }, { - 'name': 'income', - 'type': 'select', - 'label': _(FA_INCOME_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string - 'placeholder': '', - 'defaultValue': '', - 'required': True, - 'options': annual_incomes, - 'instructions': _('Specify your annual household income in US Dollars.') - }, - { - 'name': 'reason_for_applying', - 'type': 'textarea', - 'label': _(FA_REASON_FOR_APPLYING_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string - 'placeholder': '', - 'defaultValue': '', - 'required': True, - 'restrictions': { - 'min_length': settings.FINANCIAL_ASSISTANCE_MIN_LENGTH, - 'max_length': settings.FINANCIAL_ASSISTANCE_MAX_LENGTH - }, - 'instructions': FA_SHORT_ANSWER_INSTRUCTIONS + 'name': 'certify-heading', + 'label': _('I certify that: '), + 'type': 'plaintext', }, { - 'name': 'goals', - 'type': 'textarea', - 'label': _(FA_GOALS_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string 'placeholder': '', + 'name': 'certify-economic-hardship', + 'label': _( + 'Paying the verified certificate fee for the above course would cause me economic hardship' + ), 'defaultValue': '', + 'type': 'checkbox', 'required': True, - 'restrictions': { - 'min_length': settings.FINANCIAL_ASSISTANCE_MIN_LENGTH, - 'max_length': settings.FINANCIAL_ASSISTANCE_MAX_LENGTH - }, - 'instructions': FA_SHORT_ANSWER_INSTRUCTIONS + 'instructions': '', + 'restrictions': {} }, { - 'name': 'effort', - 'type': 'textarea', - 'label': _(FA_EFFORT_LABEL), # lint-amnesty, pylint: disable=translation-of-non-string 'placeholder': '', + 'name': 'certify-complete-certificate', + 'label': _( + 'I will work diligently to complete the course work and receive a certificate' + ), 'defaultValue': '', + 'type': 'checkbox', 'required': True, - 'restrictions': { - 'min_length': settings.FINANCIAL_ASSISTANCE_MIN_LENGTH, - 'max_length': settings.FINANCIAL_ASSISTANCE_MAX_LENGTH - }, - 'instructions': FA_SHORT_ANSWER_INSTRUCTIONS + 'instructions': '', + 'restrictions': {} }, { 'placeholder': '', - 'name': 'mktg-permission', - 'label': _( - 'I allow {platform_name} to use the information provided in this application ' - '(except for financial information) for {platform_name} marketing purposes.' - ).format(platform_name=settings.PLATFORM_NAME), + 'name': 'certify-honor-code', + 'label': Text(_( + 'I have read, understand, and will abide by the {honor_code_link} for the edX Site' + )).format(honor_code_link=HTML('{honor_code_label}').format( + honor_code_label=_("Honor Code"), + honor_code_url=marketing_link('TOS') + "#honor", + )), 'defaultValue': '', 'type': 'checkbox', - 'required': False, + 'required': True, 'instructions': '', 'restrictions': {} } @@ -2263,7 +2232,6 @@ def get_financial_aid_courses(user, course_id=None): 'value': str(enrollment.course_id) } ) - if course_id is not None and use_new_flow is False: # We don't want to show financial_aid_courses if the course_id is not found in the enrolled courses. return [] diff --git a/lms/djangoapps/discussion/rest_api/api.py b/lms/djangoapps/discussion/rest_api/api.py index 54878d69ca37..61877f57f06a 100644 --- a/lms/djangoapps/discussion/rest_api/api.py +++ b/lms/djangoapps/discussion/rest_api/api.py @@ -101,7 +101,6 @@ has_discussion_privileges, is_commentable_divided ) -from ..toggles import ENABLE_DISCUSSION_MODERATION_REASON_CODES from .exceptions import CommentNotFoundError, DiscussionBlackOutException, DiscussionDisabledError, ThreadNotFoundError from .forms import CommentActionsForm, ThreadActionsForm, UserOrdering from .pagination import DiscussionAPIPagination @@ -365,7 +364,6 @@ def _format_datetime(dt): "enable_in_context": course_config.enable_in_context, "group_at_subsection": course_config.plugin_configuration.get("group_at_subsection", False), 'learners_tab_enabled': ENABLE_LEARNERS_TAB_IN_DISCUSSIONS_MFE.is_enabled(course_key), - "reason_codes_enabled": ENABLE_DISCUSSION_MODERATION_REASON_CODES.is_enabled(course_key), "edit_reasons": [ {"code": reason_code, "label": label} for (reason_code, label) in EDIT_REASON_CODES.items() diff --git a/lms/djangoapps/discussion/rest_api/tests/test_api.py b/lms/djangoapps/discussion/rest_api/tests/test_api.py index ebe4a429c42c..bf744738b0a2 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_api.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_api.py @@ -212,7 +212,6 @@ def test_basic(self): 'is_user_admin': False, 'user_roles': {'Student'}, 'learners_tab_enabled': False, - 'reason_codes_enabled': False, 'edit_reasons': [{'code': 'test-edit-reason', 'label': 'Test Edit Reason'}], 'post_close_reasons': [{'code': 'test-close-reason', 'label': 'Test Close Reason'}], } diff --git a/lms/djangoapps/discussion/rest_api/tests/test_views.py b/lms/djangoapps/discussion/rest_api/tests/test_views.py index 806cf9b11d31..ded21536e7f6 100644 --- a/lms/djangoapps/discussion/rest_api/tests/test_views.py +++ b/lms/djangoapps/discussion/rest_api/tests/test_views.py @@ -536,7 +536,6 @@ def test_basic(self): 'is_user_admin': False, "user_roles": ["Student"], 'learners_tab_enabled': False, - "reason_codes_enabled": False, "edit_reasons": [{"code": "test-edit-reason", "label": "Test Edit Reason"}], "post_close_reasons": [{"code": "test-close-reason", "label": "Test Close Reason"}], } diff --git a/lms/djangoapps/discussion/toggles.py b/lms/djangoapps/discussion/toggles.py index 85c3cc0bf978..201cd4e7318c 100644 --- a/lms/djangoapps/discussion/toggles.py +++ b/lms/djangoapps/discussion/toggles.py @@ -24,17 +24,6 @@ f'{WAFFLE_FLAG_NAMESPACE}.enable_learners_tab_in_discussions_mfe', __name__ ) -# .. toggle_name: discussions.enable_moderation_reason_codes -# .. toggle_implementation: CourseWaffleFlag -# .. toggle_default: False -# .. toggle_description: Waffle flag to toggle support for the new edit and post close reason codes -# .. toggle_use_cases: temporary, open_edx -# .. toggle_creation_date: 2022-02-22 -# .. toggle_target_removal_date: 2022-09-22 -ENABLE_DISCUSSION_MODERATION_REASON_CODES = CourseWaffleFlag( - f'{WAFFLE_FLAG_NAMESPACE}.enable_moderation_reason_codes', __name__ -) - # .. toggle_name: discussions.enable_reported_content_email_notifications # .. toggle_implementation: CourseWaffleFlag # .. toggle_default: False diff --git a/lms/envs/common.py b/lms/envs/common.py index 59377b67cc5d..d328174a712d 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -5104,12 +5104,6 @@ def _make_locale_paths(settings): # pylint: disable=missing-function-docstring MAILCHIMP_NEW_USER_LIST_ID = "" ########################## BLOCKSTORE ##################################### -BLOCKSTORE_PUBLIC_URL_ROOT = 'http://localhost:18250' -BLOCKSTORE_API_URL = 'http://localhost:18250/api/v1/' - -# Disable the Blockstore app API by default. -# See openedx.core.lib.blockstore_api.config for details. -BLOCKSTORE_USE_BLOCKSTORE_APP_API = False # .. setting_name: XBLOCK_RUNTIME_V2_EPHEMERAL_DATA_CACHE # .. setting_default: default diff --git a/lms/envs/devstack-experimental.yml b/lms/envs/devstack-experimental.yml index 6d24b63cf920..63812686e86a 100644 --- a/lms/envs/devstack-experimental.yml +++ b/lms/envs/devstack-experimental.yml @@ -57,8 +57,6 @@ AWS_SES_REGION_ENDPOINT: email.us-east-1.amazonaws.com AWS_SES_REGION_NAME: us-east-1 AWS_STORAGE_BUCKET_NAME: SET-ME-PLEASE (ex. bucket-name) BASE_COOKIE_DOMAIN: localhost -BLOCKSTORE_API_URL: http://localhost:18250/api/v1 -BLOCKSTORE_PUBLIC_URL_ROOT: http://localhost:18250 BLOCK_STRUCTURES_SETTINGS: COURSE_PUBLISH_TASK_DELAY: 30 TASK_DEFAULT_RETRY_DELAY: 30 diff --git a/lms/envs/test.py b/lms/envs/test.py index 9e18344aa17f..39996e857ac5 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -418,16 +418,6 @@ FACEBOOK_APP_ID = "Test" FACEBOOK_API_VERSION = "v2.8" -####################### ELASTICSEARCH TESTS ####################### -# Enable this when testing elasticsearch-based code which couldn't be tested using the mock engine -ENABLE_ELASTICSEARCH_FOR_TESTS = os.environ.get( - 'EDXAPP_ENABLE_ELASTICSEARCH_FOR_TESTS', 'no').lower() in ('true', 'yes', '1') - -TEST_ELASTICSEARCH_USE_SSL = os.environ.get( - 'EDXAPP_TEST_ELASTICSEARCH_USE_SSL', 'no').lower() in ('true', 'yes', '1') -TEST_ELASTICSEARCH_HOST = os.environ.get('EDXAPP_TEST_ELASTICSEARCH_HOST', 'edx.devstack.elasticsearch710') -TEST_ELASTICSEARCH_PORT = int(os.environ.get('EDXAPP_TEST_ELASTICSEARCH_PORT', '9200')) - ######### custom courses ######### INSTALLED_APPS += ['lms.djangoapps.ccx', 'openedx.core.djangoapps.ccxcon.apps.CCXConnectorConfig'] FEATURES['CUSTOM_COURSES_EDX'] = True @@ -557,11 +547,6 @@ derive_settings(__name__) ############################### BLOCKSTORE ##################################### -# Blockstore tests -RUN_BLOCKSTORE_TESTS = os.environ.get('EDXAPP_RUN_BLOCKSTORE_TESTS', 'no').lower() in ('true', 'yes', '1') -BLOCKSTORE_USE_BLOCKSTORE_APP_API = not RUN_BLOCKSTORE_TESTS -BLOCKSTORE_API_URL = os.environ.get('EDXAPP_BLOCKSTORE_API_URL', "http://edx.devstack.blockstore-test:18251/api/v1/") -BLOCKSTORE_API_AUTH_TOKEN = os.environ.get('EDXAPP_BLOCKSTORE_API_AUTH_TOKEN', 'edxapp-test-key') XBLOCK_RUNTIME_V2_EPHEMERAL_DATA_CACHE = 'blockstore' # This must be set to a working cache for the tests to pass BUNDLE_ASSET_STORAGE_SETTINGS = dict( STORAGE_CLASS='django.core.files.storage.FileSystemStorage', diff --git a/lms/static/js/financial-assistance/views/financial_assistance_form_view.js b/lms/static/js/financial-assistance/views/financial_assistance_form_view.js index 5d37d38ecb73..3ff0b2b9ff2f 100644 --- a/lms/static/js/financial-assistance/views/financial_assistance_form_view.js +++ b/lms/static/js/financial-assistance/views/financial_assistance_form_view.js @@ -43,16 +43,14 @@ fields = context.fields; // Add default option to course array - this.addDefaultOption(fields, 0); - // Add default option to household income array - this.addDefaultOption(fields, 1); + this.addDefaultOption(fields, 0, context.course_id); // Set non-form data needed to render the View this.context = { dashboard_url: context.dashboard_url, header_text: context.header_text, + course_id: context.course_id, platform_name: context.platform_name, - student_faq_url: context.student_faq_url, account_settings_url: context.account_settings_url }; @@ -146,13 +144,16 @@ } }, - addDefaultOption: function(array, index) { - if (array[index].options.length > 1) { - array[index].options.unshift({ - name: '- ' + gettext('Choose one') + ' -', - value: '', - default: true - }); + addDefaultOption: function(array, index, course_id) { + if (array[index].options.length >= 1) { + if (!course_id) { + array[index].options.unshift({ + name: gettext('Choose one'), + value: '', + default: true, + disabled: true, + }); + } } } }); diff --git a/lms/static/js/i18n/el/djangojs.js b/lms/static/js/i18n/el/djangojs.js index b285dc7c78cf..ea7d101fd4f8 100644 --- a/lms/static/js/i18n/el/djangojs.js +++ b/lms/static/js/i18n/el/djangojs.js @@ -75,6 +75,8 @@ "April": "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2", "Are you sure you want to delete this post?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03bd\u03ac\u03c1\u03c4\u03b7\u03c3\u03b7;", "Are you sure you want to delete this response?": "\u0395\u03af\u03c3\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03bf\u03c2 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7;", + "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});", + "Are you sure you want to unenroll from the verified {certNameLong} track of {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {certNameLong} {courseName} ({courseNumber});", "Are you sure you want to unenroll from {courseName} ({courseNumber})?": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03c3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03bd\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03b5\u03af\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf \u03bc\u03ac\u03b8\u03b7\u03bc\u03b1 {courseName} ({courseNumber});", "Assessment": "\u0391\u03be\u03b9\u03bf\u03bb\u03cc\u03b3\u03b7\u03c3\u03b7", "Assessments": "\u0391\u03be\u03b9\u03bf\u03bb\u03bf\u03b3\u03ae\u03c3\u03b5\u03b9\u03c2", @@ -126,6 +128,7 @@ "Course Name": "\u03a4\u03af\u03c4\u03bb\u03bf\u03c2 \u03bc\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2", "Course Number": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u039c\u03b1\u03b8\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2", "Create Account": "\u03a0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 \u03b5\u03b4\u03ce \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b3\u03af\u03bd\u03b5\u03b9 \u03b7 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03b1\u03c2", + "Create a report of problem responses": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2", "Create an Account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd", "Create an Account.": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd", "Create an account": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03bd\u03ad\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd", @@ -153,7 +156,7 @@ "Engage with posts": "\u0394\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 \u03b1\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd", "Enter Due Date and Time": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b1\u03c4\u03b5 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1 \u03ba\u03b1\u03b9 \u03ce\u03c1\u03b1 \u03bb\u03ae\u03be\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03c0\u03c1\u03bf\u03b8\u03b5\u03c3\u03bc\u03af\u03b1\u03c2 \u03c5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae\u03c2", "Enter a student's username or email address.": "\u03a0\u03b1\u03ba\u03b1\u03bb\u03bf\u03cd\u03bc\u03b5 \u03b5\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03ba\u03ac\u03c0\u03bf\u03b9\u03bf\u03c5 \u03c3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae..", - "Enter a username or email.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail", + "Enter a username or email.": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae e-mail", "Enter and confirm your new password.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf \u03bd\u03ad\u03bf \u03c3\u03b1\u03c2 \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc.", "Enter username or email": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c8\u03b5\u03c5\u03b4\u03ce\u03bd\u03c5\u03bc\u03bf \u03ae \u03c4\u03bf e-mail \u03c3\u03b1\u03c2", "Enter your {platform_display_name} username or the URL to your {platform_display_name} page. Delete the URL to remove the link.": "\u0395\u03b9\u03c3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name} \u03ae \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03c0\u03c1\u03bf\u03c2 \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1 \u03c3\u03b1\u03c2 \u03c3\u03c4\u03bf {platform_display_name}. \u0394\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c6\u03b1\u03b9\u03c1\u03ad\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf.", @@ -174,6 +177,7 @@ "Full Name": "\u039f\u03bd\u03bf\u03bc\u03b1\u03c4\u03b5\u03c0\u03ce\u03bd\u03c5\u03bc\u03bf", "Full Profile": "\u03a4\u03b7\u03bd \u03c0\u03bb\u03ae\u03c1\u03b7 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c0\u03b9\u03ba\u03ae \u03bc\u03bf\u03c5 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1", "Gender": "\u03a6\u03cd\u03bb\u03bf", + "Generate Exception Certificates": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03b5\u03c9\u03bd", "Grading": "\u0392\u0391\u0398\u039c\u039f\u039b\u039f\u0393\u0399\u0391", "Heading": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1", "Heading (Ctrl+H)": "\u0395\u03c0\u03b9\u03ba\u03b5\u03c6\u03b1\u03bb\u03af\u03b4\u03b1 (Ctrl+H)", @@ -310,9 +314,11 @@ "Student": "\u03a3\u03c0\u03bf\u03c5\u03b4\u03b1\u03c3\u03c4\u03ae\u03c2", "Submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae", "Successfully enrolled and sent email to the following users:": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2 \u03b4\u03ae\u03bb\u03c9\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5 \u03c3\u03c4\u03bf\u03c5\u03c2 \u03b5\u03be\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2:", + "Successfully started task to reset attempts for problem '<%- problem_id %>'. Click the 'Show Task Status' button to see the status of the task.": "\u039e\u03b5\u03ba\u03af\u03bd\u03b7\u03c3\u03b5 \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1 \u03b7 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1 \u03b3\u03b9\u03b1 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac \u03c4\u03c9\u03bd \u03c0\u03c1\u03bf\u03c3\u03c0\u03b1\u03b8\u03b5\u03b9\u03ce\u03bd \u03b3\u03b9\u03b1 \u03c4\u03bf \u03c4\u03b5\u03c3\u03c4 \"<%- problem_id %>\". \u039a\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \"\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2\", \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2.", "Support education research by providing additional information": "\u03a3\u03c5\u03bd\u03b5\u03b9\u03c3\u03c6\u03ad\u03c1\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7\u03bd \u03b5\u03ba\u03c0\u03b1\u03b9\u03b4\u03b5\u03c5\u03c4\u03b9\u03ba\u03ae \u03ad\u03c1\u03b5\u03c5\u03bd\u03b1 \u03b4\u03af\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03ba\u03ac\u03c0\u03bf\u03b9\u03b5\u03c2 \u03b5\u03c0\u03b9\u03c0\u03bb\u03ad\u03bf\u03bd \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2.", "Supported file types: {supportedVideoTypes}": "\u03a3\u03c5\u03bc\u03b2\u03b1\u03c4\u03bf\u03af \u03c4\u03cd\u03c0\u03bf\u03b9 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd: {supportedVideoTypes}", "TOTAL": "\u03a3\u03a5\u039d\u039f\u039b\u039f", + "Task Status": "\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b4\u03b9\u03b1\u03b4\u03b9\u03ba\u03b1\u03c3\u03af\u03b1\u03c2", "Team Description (Required) *": "\u03a0\u03b5\u03c1\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*", "Team Name (Required) *": "\u038c\u03bd\u03bf\u03bc\u03b1 \u039f\u03bc\u03ac\u03b4\u03b1\u03c2 (\u03a5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf)*", "Terms of Service and Honor Code": "\u038c\u03c1\u03bf\u03b9 \u03c7\u03c1\u03ae\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u039a\u03ce\u03b4\u03b9\u03ba\u03b1\u03c2 \u03a4\u03b9\u03bc\u03ae\u03c2", @@ -356,7 +362,7 @@ "URL": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 URL", "Undo (Ctrl+Z)": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 (Ctrl+Z)", "Undo Changes": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ce\u03bd", - "Unendorse": "\u0394\u03b5\u03bd \u03c0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9", + "Unendorse": "\u0391\u03bd\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae\u03c2 \"\u03a0\u03c1\u03bf\u03c4\u03b5\u03af\u03bd\u03c9\"", "Unit": "\u039a\u03b5\u03c6\u03ac\u03bb\u03b1\u03b9\u03bf", "Upload File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0391\u03c1\u03c7\u03b5\u03af\u03bf\u03c5", "Upload New File": "\u039c\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03bd\u03ad\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5", diff --git a/lms/static/js/i18n/eo/djangojs.js b/lms/static/js/i18n/eo/djangojs.js index 1d127306f289..fd3ea5bef809 100644 --- a/lms/static/js/i18n/eo/djangojs.js +++ b/lms/static/js/i18n/eo/djangojs.js @@ -479,6 +479,7 @@ "Copy": "\u00c7\u00f6p\u00fd \u2c60'\u03c3\u044f\u0454\u043c \u03b9#", "Copy Component Location": "\u00c7\u00f6p\u00fd \u00c7\u00f6mp\u00f6n\u00e9nt L\u00f6\u00e7\u00e4t\u00ef\u00f6n \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3#", "Copy Email To Editor": "\u00c7\u00f6p\u00fd \u00c9m\u00e4\u00efl T\u00f6 \u00c9d\u00eft\u00f6r \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #", + "Copy Unit": "\u00c7\u00f6p\u00fd \u00dbn\u00eft \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142#", "Copy of '{componentDisplayName}'": "\u00c7\u00f6p\u00fd \u00f6f '{componentDisplayName}' \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#", "Copy row": "\u00c7\u00f6p\u00fd r\u00f6w \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#", "Copy to Clipboard": "\u00c7\u00f6p\u00fd t\u00f6 \u00c7l\u00efp\u00df\u00f6\u00e4rd \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454#", diff --git a/lms/static/js/i18n/es-419/djangojs.js b/lms/static/js/i18n/es-419/djangojs.js index 549e97e0b542..587d4c2077cd 100644 --- a/lms/static/js/i18n/es-419/djangojs.js +++ b/lms/static/js/i18n/es-419/djangojs.js @@ -599,6 +599,7 @@ "Copy Component Location": "Copiar la ubicaci\u00f3n del Componente", "Copy Email To Editor": "Copiar el correo al editor", "Copy Exam Code": "Copia el C\u00f3digo de el Examen", + "Copy Unit": "Copiar unidad", "Copy of '{componentDisplayName}'": "Copia de '{componentDisplayName}'", "Copy row": "Copiar la fila", "Copy to Clipboard": "Copiar al portapapeles", @@ -1232,6 +1233,7 @@ "Manage Learners": "Manejar Estudiantes", "Manage Tags": "Administrar etiquetas", "Manage my subscription": "Gestionar mi suscripci\u00f3n", + "Manage tags": "Administrar etiquetas", "Manual": "Manual", "March": "Marzo", "Mark Exam As Completed": "Marcar el examen como completado", diff --git a/lms/static/js/i18n/rtl/djangojs.js b/lms/static/js/i18n/rtl/djangojs.js index 7e60d7631cf1..193b0b1d599c 100644 --- a/lms/static/js/i18n/rtl/djangojs.js +++ b/lms/static/js/i18n/rtl/djangojs.js @@ -444,6 +444,7 @@ "Copy": "\u023b\u00f8d\u028e", "Copy Component Location": "\u023b\u00f8d\u028e \u023b\u00f8\u026fd\u00f8n\u01ddn\u0287 \u0141\u00f8\u0254\u0250\u0287\u1d09\u00f8n", "Copy Email To Editor": "\u023b\u00f8d\u028e \u0246\u026f\u0250\u1d09l \u0166\u00f8 \u0246d\u1d09\u0287\u00f8\u0279", + "Copy Unit": "\u023b\u00f8d\u028e \u0244n\u1d09\u0287", "Copy of '{componentDisplayName}'": "\u023b\u00f8d\u028e \u00f8\u025f '{componentDisplayName}'", "Copy row": "\u023b\u00f8d\u028e \u0279\u00f8\u028d", "Copy to Clipboard": "\u023b\u00f8d\u028e \u0287\u00f8 \u023bl\u1d09db\u00f8\u0250\u0279d", diff --git a/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js b/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js index 64f94368f767..738dd272ef80 100644 --- a/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js +++ b/lms/static/js/spec/financial-assistance/financial_assistance_form_view_spec.js @@ -29,62 +29,29 @@ define([ type: 'select' }, { defaultValue: '', - instructions: 'Specify your annual income in USD.', - label: 'Annual Income', - name: 'income', - options: [ - {name: 'Less than $5,000', value: 'Less than $5,000'}, - {name: '$5,000 - $10,000', value: '$5,000 - $10,000'}, - {name: '$10,000 - $15,000', value: '$10,000 - $15,000'}, - {name: '$15,000 - $20,000', value: '$15,000 - $20,000'}, - {name: '$20,000 - $25,000', value: '$20,000 - $25,000'} - ], - placeholder: '', - required: true, - type: 'select' - }, { - defaultValue: '', - instructions: 'Your response should contain approximately 250 - 500 words.', - label: 'Tell us about your current financial situation, including any unusual circumstances.', - name: 'reason_for_applying', + instructions: '', + label: 'Paying the verified certificate fee for the above course would cause me economic hardship', + name: 'certify-economic-hardship', placeholder: '', required: true, - restrictions: { - min_length: 800, - max_length: 2500 - }, - type: 'textarea' + restrictions: {}, + type: 'checkbox' }, { defaultValue: '', - instructions: 'Use between 250 and 500 words or so in your response.', - label: 'Tell us about your learning or professional goals. How will a Verified Certificate in this course help you achieve these goals?', - name: 'goals', + instructions: '', + label: 'I will work diligently to complete the course work and receive a certificate', + name: 'certify-complete-certificate', placeholder: '', required: true, - restrictions: { - min_length: 800, - max_length: 2500 - }, - type: 'textarea' + restrictions: {}, + type: 'checkbox' }, { defaultValue: '', - instructions: 'Use between 250 and 500 words or so in your response.', - label: 'Tell us about your plans for this course. What steps will you take to help you complete the course work a receive a certificate?', - name: 'effort', + instructions: '', + label: 'I have read, understand, and will abide by the Honor Code for the edX Site', + name: 'certify-honor-code', placeholder: '', required: true, - restrictions: { - min_length: 800, - max_length: 2500 - }, - type: 'textarea' - }, { - defaultValue: '', - instructions: 'Annual income and personal information such as email address will not be shared.', - label: 'I allow edX to use the information provided in this application for edX marketing purposes.', - name: 'mktg-permission', - placeholder: '', - required: false, restrictions: {}, type: 'checkbox' } @@ -96,7 +63,7 @@ define([ username: 'xsy4ever' }, header_text: ['Line one.', 'Line two.'], - student_faq_url: '/faqs', + course_id: 'course-v1:edX+Test+1', dashboard_url: '/dashboard', platform_name: 'edx', submit_url: '/api/financial/v1/assistance' @@ -111,12 +78,11 @@ define([ completeForm = function() { var courseOptions = context.fields[0].options, courseSelectValue = courseOptions[courseOptions.length - 1].value; - var incomeOptions = context.fields[1].options, - incomeSelectValue = incomeOptions[incomeOptions.length - 1].value; view.$('#financial-assistance-course').val(courseSelectValue); - view.$('#financial-assistance-income').val(incomeSelectValue); - view.$('textarea').html(Array(802).join('w')); + view.$('#financial-assistance-certify-economic-hardship').prop('checked', true ); + view.$('#financial-assistance-certify-complete-certificate').prop('checked', true ); + view.$('#financial-assistance-certify-honor-code').prop('checked', true ); }; validSubmission = function() { @@ -179,9 +145,9 @@ define([ var $form = view.$('.financial-assistance-form'); expect($form.find('select').first().attr('name')).toEqual(context.fields[0].name); - expect($form.find('select').last().attr('name')).toEqual(context.fields[1].name); - expect($form.find('textarea').first().attr('name')).toEqual(context.fields[2].name); - expect($form.find('input[type=checkbox]').attr('name')).toEqual(context.fields[5].name); + expect($form.find('input[type=checkbox]')[0].name).toEqual(context.fields[1].name); + expect($form.find('input[type=checkbox]')[1].name).toEqual(context.fields[2].name); + expect($form.find('input[type=checkbox]')[2].name).toEqual(context.fields[3].name); }); it('should not submit the form if the front end validation fails', function() { @@ -204,7 +170,7 @@ define([ }); it('should allow form resubmission after a front end validation failure', function() { - view.$('#financial-assistance-income').val(1312); + view.$('#financial-assistance-course').val(''); expect(view.model.save).not.toHaveBeenCalled(); validSubmission(); }); diff --git a/lms/static/sass/views/_financial-assistance.scss b/lms/static/sass/views/_financial-assistance.scss index 20370aa617da..ce9ad6c24ae7 100644 --- a/lms/static/sass/views/_financial-assistance.scss +++ b/lms/static/sass/views/_financial-assistance.scss @@ -3,42 +3,46 @@ padding: ($baseline/2) 0; margin: 0; - color: $m-gray-d2; + color: $gray-500; } .financial-assistance-wrapper { - margin: auto; padding: $baseline ($baseline/2); - max-width: 1180px; + max-width: 1248px; h1 { - @extend %t-title4; + @extend %t-title3; + @extend %t-ultrastrong; @include text-align(left); margin: 0; padding: ($baseline/2) 0; - border-bottom: 4px solid $gray-l5; - color: $m-gray-d3; + color: $black; } h2 { - @extend %t-title6; - @extend %t-strong; + @extend %t-title4; + @extend %t-ultrastrong; margin-top: ($baseline/2); text-transform: none; + color: $black; } p { - @extend %fa-copy; + line-height: $base-line-height; + margin-top: 0; + color: $gray-700; + font-size: 1em; + } - font-size: 0.875em; + span { + color: $gray-700; } .financial-assistance { padding-bottom: ($baseline/2); - border-bottom: 4px solid $gray-l5; .apply-form-list { padding: 0; @@ -70,29 +74,36 @@ } } + #financial-assistance-course-desc { + padding-bottom: 1rem; + } + + .plaintext-certify-heading .plaintext-field.honor_tos_combined { + font-size: 1rem !important; + } + .financial-assistance-footer { padding: $baseline; - - .faq-link { - padding: $baseline/2; - } + margin-bottom: 1rem; .action-link { - @include float(right); + float: right; + font-weight: 500; + } + } - padding: $baseline/2; - background-color: $m-blue-d2; - color: $gray-l7; - border-radius: 2px; + .financial-assistance-header { + p:nth-child(4) { + margin-top: 1rem; } } // Application form View .intro { - border-bottom: 4px solid $gray-l5; + margin-bottom: 2rem; - p { - margin: 10px 0; + p:nth-child(4) { + margin-top: 1rem; } } @@ -117,8 +128,6 @@ .user-info { @include clearfix(); - border-bottom: 2px solid $gray-l5; - padding: 20px 0; margin-bottom: 20px; .info-column { @@ -143,14 +152,15 @@ padding: 0; color: $black; - font-size: 1.125em; } } .financial-assistance-form { @extend .login-register; - max-width: 800px; + max-width: 1248px; + padding: 0; + margin: inherit; .action-primary { @include float(left); @@ -185,17 +195,13 @@ box-shadow: none; } - textarea { - height: 125px; - } - .checkbox { height: auto; position: absolute; top: 5px; & + label { - @include margin-left(30px); + @include margin-left(24px); display: inline-block; } @@ -204,17 +210,10 @@ } .cta-wrapper { - border-top: 4px solid $gray-l5; padding: 20px 0; } @include media($bp-medium) { - .user-info { - .info-column { - width: 50%; - } - } - .financial-assistance-form { .action-primary { @include float(right); @@ -227,12 +226,6 @@ } @include media($bp-large) { - .user-info { - .info-column { - width: 25%; - } - } - .financial-assistance-form { .action-primary { @include float(right); @@ -245,12 +238,6 @@ } @include media($bp-huge) { - .user-info { - .info-column { - width: 25%; - } - } - .financial-assistance-form { .action-primary { @include float(right); diff --git a/lms/templates/financial-assistance/apply.html b/lms/templates/financial-assistance/apply.html index ca588d264a3d..09787193193b 100644 --- a/lms/templates/financial-assistance/apply.html +++ b/lms/templates/financial-assistance/apply.html @@ -14,7 +14,6 @@ fields: ${fields | n, dump_js_escaped_json}, user_details: ${user_details | n, dump_js_escaped_json}, header_text: ${header_text | n, dump_js_escaped_json}, - student_faq_url: '${student_faq_url | n, js_escaped_string}', dashboard_url: '${dashboard_url | n, js_escaped_string}', account_settings_url: '${account_settings_url | n, js_escaped_string}', platform_name: '${platform_name | n, js_escaped_string}', diff --git a/lms/templates/financial-assistance/financial-assistance.html b/lms/templates/financial-assistance/financial-assistance.html index 88a8d5ff26c1..f44f49e51150 100644 --- a/lms/templates/financial-assistance/financial-assistance.html +++ b/lms/templates/financial-assistance/financial-assistance.html @@ -30,9 +30,6 @@

    ${_("A Note to Learners")}

    ## Translators: This string will not be used in Open edX installations.

    ${_("If you are interested in working toward a Verified Certificate, but cannot afford to pay the fee, please apply now. Please note that financial assistance is limited and may not be awarded to all eligible candidates.")}

    - ## Translators: This string will not be used in Open edX installations. -

    ${_("In order to be eligible for edX Financial Assistance, you must demonstrate that paying the Verified Certificate fee would cause you economic hardship. To apply, you will be asked to answer a few questions about why you are applying and how the Verified Certificate will benefit you.")}

    - ## Translators: This string will not be used in Open edX installations.

    ${_("If your application is approved, we'll give you instructions for verifying your identity on edx.org so you can start working toward completing your edX course.")}

    @@ -45,14 +42,8 @@

    ${_("A Note to Learners")}

    diff --git a/lms/templates/financial-assistance/financial_assessment_form.underscore b/lms/templates/financial-assistance/financial_assessment_form.underscore index e6c76428fc0f..cd41ad6d6161 100644 --- a/lms/templates/financial-assistance/financial_assessment_form.underscore +++ b/lms/templates/financial-assistance/financial_assessment_form.underscore @@ -11,11 +11,11 @@
    -

    <%- gettext('About You') %>

    +

    <%- gettext('Profile Information') %>

    <%- interpolate_text( - gettext("The following information is already a part of your {platform} profile. We've included it here for your application."), + gettext("The following information is already a part of your {platform} profile and is required for your application. To edit this information go to "), {platform: platform_name} - ) %>

    + ) %><%- gettext("Account Settings") %>.

    <%- gettext('Username') %>
    <%- username %>
    @@ -33,15 +33,12 @@
    <%- country %>
    +

    <%- gettext('Application Details') %>

    <% // xss-lint: disable=underscore-not-escaped %> <%= fields %>
    - <%- interpolate_text( - gettext('Back to {platform} FAQs'), - {platform: platform_name} - ) %>
    diff --git a/openedx/core/djangoapps/content_libraries/api.py b/openedx/core/djangoapps/content_libraries/api.py index 33d43cdc64f2..10383de336e5 100644 --- a/openedx/core/djangoapps/content_libraries/api.py +++ b/openedx/core/djangoapps/content_libraries/api.py @@ -67,7 +67,6 @@ from django.core.validators import validate_unicode_slug from django.db import IntegrityError, transaction from django.utils.translation import gettext as _ -from elasticsearch.exceptions import ConnectionError as ElasticConnectionError from lxml import etree from opaque_keys.edx.keys import LearningContextKey, UsageKey from opaque_keys.edx.locator import ( @@ -94,7 +93,6 @@ from openedx.core.djangoapps.content_libraries import permissions from openedx.core.djangoapps.content_libraries.constants import DRAFT_NAME, COMPLEX from openedx.core.djangoapps.content_libraries.library_bundle import LibraryBundle -from openedx.core.djangoapps.content_libraries.libraries_index import ContentLibraryIndexer, LibraryBlockIndexer from openedx.core.djangoapps.content_libraries.models import ( ContentLibrary, ContentLibraryPermission, @@ -290,56 +288,35 @@ def get_libraries_for_user(user, org=None, library_type=None): return permissions.perms[permissions.CAN_VIEW_THIS_CONTENT_LIBRARY].filter(user, qs) -def get_metadata_from_index(queryset, text_search=None): +def get_metadata(queryset, text_search=None): """ - Take a list of ContentLibrary objects and return metadata stored in - ContentLibraryIndex. + Take a list of ContentLibrary objects and return metadata from blockstore. """ - metadata = None - if ContentLibraryIndexer.indexing_is_enabled(): - try: - library_keys = [str(lib.library_key) for lib in queryset] - metadata = ContentLibraryIndexer.get_items(library_keys, text_search=text_search) - metadata_dict = { - item["id"]: item - for item in metadata - } - metadata = [ - metadata_dict[key] - if key in metadata_dict - else None - for key in library_keys - ] - except ElasticConnectionError as e: - log.exception(e) - - # If ContentLibraryIndex is not available, we query blockstore for a limited set of metadata - if metadata is None: - uuids = [lib.bundle_uuid for lib in queryset] - bundles = get_bundles(uuids=uuids, text_search=text_search) - - if text_search: - # Bundle APIs can't apply text_search on a bundle's org, so including those results here - queryset_org_search = queryset.filter(org__short_name__icontains=text_search) - if queryset_org_search.exists(): - uuids_org_search = [lib.bundle_uuid for lib in queryset_org_search] - bundles += get_bundles(uuids=uuids_org_search) - - bundle_dict = { - bundle.uuid: { - 'uuid': bundle.uuid, - 'title': bundle.title, - 'description': bundle.description, - 'version': bundle.latest_version, - } - for bundle in bundles + uuids = [lib.bundle_uuid for lib in queryset] + bundles = get_bundles(uuids=uuids, text_search=text_search) + + if text_search: + # Bundle APIs can't apply text_search on a bundle's org, so including those results here + queryset_org_search = queryset.filter(org__short_name__icontains=text_search) + if queryset_org_search.exists(): + uuids_org_search = [lib.bundle_uuid for lib in queryset_org_search] + bundles += get_bundles(uuids=uuids_org_search) + + bundle_dict = { + bundle.uuid: { + 'uuid': bundle.uuid, + 'title': bundle.title, + 'description': bundle.description, + 'version': bundle.latest_version, } - metadata = [ - bundle_dict[uuid] - if uuid in bundle_dict - else None - for uuid in uuids - ] + for bundle in bundles + } + metadata = [ + bundle_dict[uuid] + if uuid in bundle_dict + else None + for uuid in uuids + ] libraries = [ ContentLibraryMetadata( @@ -648,50 +625,28 @@ def get_library_blocks(library_key, text_search=None, block_types=None) -> list[ Returns a list of LibraryXBlockMetadata objects """ - metadata = None - if LibraryBlockIndexer.indexing_is_enabled(): - try: - filter_terms = { - 'library_key': [str(library_key)], - 'is_child': [False], - } - if block_types: - filter_terms['block_type'] = block_types - metadata = [ - { - **item, - "id": LibraryUsageLocatorV2.from_string(item['id']), - } - for item in LibraryBlockIndexer.get_items(filter_terms=filter_terms, text_search=text_search) - if item is not None - ] - except ElasticConnectionError as e: - log.exception(e) - - # If indexing is disabled, or connection to elastic failed - if metadata is None: - metadata = [] - ref = ContentLibrary.objects.get_by_key(library_key) # type: ignore[attr-defined] - lib_bundle = LibraryBundle(library_key, ref.bundle_uuid, draft_name=DRAFT_NAME) - usages = lib_bundle.get_top_level_usages() - - for usage_key in usages: - # For top-level definitions, we can go from definition key to usage key using the following, but this would - # not work for non-top-level blocks as they may have multiple usages. Top level blocks are guaranteed to - # have only a single usage in the library, which is part of the definition of top level block. - def_key = lib_bundle.definition_for_usage(usage_key) - display_name = get_block_display_name(def_key) - text_match = (text_search is None or - text_search.lower() in display_name.lower() or - text_search.lower() in str(usage_key).lower()) - type_match = (block_types is None or usage_key.block_type in block_types) - if text_match and type_match: - metadata.append({ - "id": usage_key, - "def_key": def_key, - "display_name": display_name, - "has_unpublished_changes": lib_bundle.does_definition_have_unpublished_changes(def_key), - }) + metadata = [] + ref = ContentLibrary.objects.get_by_key(library_key) # type: ignore[attr-defined] + lib_bundle = LibraryBundle(library_key, ref.bundle_uuid, draft_name=DRAFT_NAME) + usages = lib_bundle.get_top_level_usages() + + for usage_key in usages: + # For top-level definitions, we can go from definition key to usage key using the following, but this would + # not work for non-top-level blocks as they may have multiple usages. Top level blocks are guaranteed to + # have only a single usage in the library, which is part of the definition of top level block. + def_key = lib_bundle.definition_for_usage(usage_key) + display_name = get_block_display_name(def_key) + text_match = (text_search is None or + text_search.lower() in display_name.lower() or + text_search.lower() in str(usage_key).lower()) + type_match = (block_types is None or usage_key.block_type in block_types) + if text_match and type_match: + metadata.append({ + "id": usage_key, + "def_key": def_key, + "display_name": display_name, + "has_unpublished_changes": lib_bundle.does_definition_have_unpublished_changes(def_key), + }) return [ LibraryXBlockMetadata( diff --git a/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst b/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst index ed16be84a48f..eb003e1ca6df 100644 --- a/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst +++ b/openedx/core/djangoapps/content_libraries/docs/decisions/0001-index-libraries-in-elasticsearch.rst @@ -4,7 +4,30 @@ Status ------ -Accepted +**Revoked** + +In Dec 2023, we decided to remove the code supporting this decision, because: + +* The index is disabled on edx.org, which will initially be the only user + of Content Libraries V2. +* As we migrate libraries from Modulestore to Blockstore and then from + Blockstore to Learning Core, the unused indexing code increases complexity + and decreases certainty. +* With the decision to migrate from Blockstore-the-service to an in-process + storage backend (that is: Blockstore-the-app or Learning Core), it seems + that we will be able to simply use Django ORM in order to filter/sort/search + Content Library V2 metadata for the library listing page. +* Searching Content Library V2 *block* content would still require indexing, + but we would rather implement that in Learning Core than use the current + implementation in the content_libraries app, which is untested, library- + specific, and doesn't take into account library versioning. It always uses + the latest draft, which is good for Library Authoring purposes, but not good for + Course Authoring purposes. + +It is possible that we will end up re-instating a modified version of this ADR +future. If that happens, we may re-use and adapt the original library index +code. + Context ------- diff --git a/openedx/core/djangoapps/content_libraries/libraries_index.py b/openedx/core/djangoapps/content_libraries/libraries_index.py deleted file mode 100644 index 82a79a652561..000000000000 --- a/openedx/core/djangoapps/content_libraries/libraries_index.py +++ /dev/null @@ -1,346 +0,0 @@ -""" Code to allow indexing content libraries """ - -import logging -from abc import ABC, abstractmethod - -from django.conf import settings -from django.dispatch import receiver -from elasticsearch.exceptions import ConnectionError as ElasticConnectionError -from search.elastic import _translate_hits, RESERVED_CHARACTERS -from search.search_engine_base import SearchEngine -from opaque_keys.edx.locator import LibraryUsageLocatorV2 -from openedx_events.content_authoring.data import ContentLibraryData, LibraryBlockData -from openedx_events.content_authoring.signals import ( - CONTENT_LIBRARY_CREATED, - CONTENT_LIBRARY_DELETED, - CONTENT_LIBRARY_UPDATED, - LIBRARY_BLOCK_CREATED, - LIBRARY_BLOCK_DELETED, - LIBRARY_BLOCK_UPDATED, -) - -from openedx.core.djangoapps.content_libraries.constants import DRAFT_NAME -from openedx.core.djangoapps.content_libraries.library_bundle import LibraryBundle -from openedx.core.djangoapps.content_libraries.models import ContentLibrary -from openedx.core.lib.blockstore_api import get_bundle - -log = logging.getLogger(__name__) - -MAX_SIZE = 10000 # 10000 is the maximum records elastic is able to return in a single result. Defaults to 10. - - -class SearchIndexerBase(ABC): - """ - Abstract Base Class for implementing library search indexers. - """ - INDEX_NAME = None - ENABLE_INDEXING_KEY = None - SCHEMA_VERSION = 0 - SEARCH_KWARGS = { - # Set this to True or 'wait_for' if immediate refresh is required after any update. - # See elastic docs for more information. - 'refresh': False - } - - @classmethod - @abstractmethod - def get_item_definition(cls, item): - """ - Returns a serializable dictionary which can be stored in elasticsearch. - """ - - @classmethod - def index_items(cls, items): - """ - Index the specified libraries. If they already exist, replace them with new ones. - """ - searcher = SearchEngine.get_search_engine(cls.INDEX_NAME) - items = [cls.get_item_definition(item) for item in items] - return searcher.index(items, **cls.SEARCH_KWARGS) - - @classmethod - def get_items(cls, ids=None, filter_terms=None, text_search=None): - """ - Retrieve a list of items from the index. - Arguments: - ids - List of ids to be searched for in the index - filter_terms - Dictionary of filters to be applied - text_search - String which is used to do a text search in the supported indexes. - """ - if filter_terms is None: - filter_terms = {} - if ids is not None: - filter_terms = { - "id": [str(item) for item in ids], - "schema_version": [cls.SCHEMA_VERSION], - **filter_terms, - } - if text_search: - response = cls._perform_elastic_search(filter_terms, text_search) - else: - searcher = SearchEngine.get_search_engine(cls.INDEX_NAME) - response = searcher.search(field_dictionary=filter_terms, size=MAX_SIZE) - - response = [result["data"] for result in response["results"]] - return sorted(response, key=lambda i: i["id"]) - - @classmethod - def remove_items(cls, ids): - """ - Remove the provided ids from the index - """ - searcher = SearchEngine.get_search_engine(cls.INDEX_NAME) - ids_str = [str(i) for i in ids] - searcher.remove(ids_str, **cls.SEARCH_KWARGS) - - @classmethod - def remove_all_items(cls): - """ - Remove all items from the index - """ - searcher = SearchEngine.get_search_engine(cls.INDEX_NAME) - response = searcher.search(filter_dictionary={}, size=MAX_SIZE) - ids = [result["data"]["id"] for result in response["results"]] - searcher.remove(ids, **cls.SEARCH_KWARGS) - - @classmethod - def indexing_is_enabled(cls): - """ - Checks to see if the indexing feature is enabled - """ - return settings.FEATURES.get(cls.ENABLE_INDEXING_KEY, False) - - @classmethod - def _perform_elastic_search(cls, filter_terms, text_search): - """ - Build a query and search directly on elasticsearch - """ - searcher = SearchEngine.get_search_engine(cls.INDEX_NAME) - return _translate_hits(searcher._es.search( # pylint: disable=protected-access - index=searcher.index_name, - body=cls.build_elastic_query(filter_terms, text_search), - size=MAX_SIZE - )) - - @staticmethod - def build_elastic_query(filter_terms, text_search): - """ - Build and return an elastic query for doing text search on a library - """ - # Remove reserved characters (and ") from the text to prevent unexpected errors. - text_search_normalised = text_search.translate(text_search.maketrans('', '', RESERVED_CHARACTERS + '"')) - text_search_normalised = text_search_normalised.replace('-', ' ') - # Wrap with asterix to enable partial matches - text_search_normalised = f"*{text_search_normalised}*" - terms = [ - { - 'terms': { - item: filter_terms[item] - } - } - for item in filter_terms - ] - return { - 'query': { - 'bool': { - 'must': [ - { - 'query_string': { - 'query': text_search_normalised, - "fields": ["content.*"], - 'minimum_should_match': '100%', - }, - }, - ], - 'filter': { - 'bool': { - 'must': terms, - } - } - }, - }, - } - - -class ContentLibraryIndexer(SearchIndexerBase): - """ - Class to perform indexing for blockstore-based content libraries - """ - - INDEX_NAME = "content_library_index" - ENABLE_INDEXING_KEY = "ENABLE_CONTENT_LIBRARY_INDEX" - SCHEMA_VERSION = 0 - - @classmethod - def get_item_definition(cls, item): - ref = ContentLibrary.objects.get_by_key(item) - lib_bundle = LibraryBundle(item, ref.bundle_uuid, draft_name=DRAFT_NAME) - num_blocks = len(lib_bundle.get_top_level_usages()) - last_published = lib_bundle.get_last_published_time() - last_published_str = None - if last_published: - last_published_str = last_published.strftime('%Y-%m-%dT%H:%M:%SZ') - (has_unpublished_changes, has_unpublished_deletes) = lib_bundle.has_changes() - - bundle_metadata = get_bundle(ref.bundle_uuid) - - # NOTE: Increment ContentLibraryIndexer.SCHEMA_VERSION if the following schema is updated to avoid dealing - # with outdated indexes which might cause errors due to missing/invalid attributes. - return { - "schema_version": ContentLibraryIndexer.SCHEMA_VERSION, - "id": str(item), - "uuid": str(bundle_metadata.uuid), - "title": bundle_metadata.title, - "description": bundle_metadata.description, - "num_blocks": num_blocks, - "version": bundle_metadata.latest_version, - "last_published": last_published_str, - "has_unpublished_changes": has_unpublished_changes, - "has_unpublished_deletes": has_unpublished_deletes, - # only 'content' field is analyzed by elasticsearch, and allows text-search - "content": { - "id": str(item), - "title": bundle_metadata.title, - "description": bundle_metadata.description, - }, - } - - -class LibraryBlockIndexer(SearchIndexerBase): - """ - Class to perform indexing on the XBlocks in content libraries. - """ - - INDEX_NAME = "content_library_block_index" - ENABLE_INDEXING_KEY = "ENABLE_CONTENT_LIBRARY_INDEX" - SCHEMA_VERSION = 0 - - @classmethod - def get_item_definition(cls, item): - from openedx.core.djangoapps.content_libraries.api import get_block_display_name, _lookup_usage_key - - def_key, lib_bundle = _lookup_usage_key(item) - is_child = item in lib_bundle.get_bundle_includes().keys() - - # NOTE: Increment LibraryBlockIndexer.SCHEMA_VERSION if the following schema is updated to avoid dealing - # with outdated indexes which might cause errors due to missing/invalid attributes. - return { - "schema_version": LibraryBlockIndexer.SCHEMA_VERSION, - "id": str(item), - "library_key": str(lib_bundle.library_key), - "is_child": is_child, - "def_key": str(def_key), - "display_name": get_block_display_name(def_key), - "block_type": def_key.block_type, - "has_unpublished_changes": lib_bundle.does_definition_have_unpublished_changes(def_key), - # only 'content' field is analyzed by elastisearch, and allows text-search - "content": { - "id": str(item), - "display_name": get_block_display_name(def_key), - }, - } - - -@receiver(CONTENT_LIBRARY_CREATED) -@receiver(CONTENT_LIBRARY_UPDATED) -def index_library(**kwargs): - """ - Index library when created or updated, or when its blocks are modified. - """ - content_library = kwargs.get('content_library', None) - if not content_library or not isinstance(content_library, ContentLibraryData): - log.error('Received null or incorrect data for event') - return - - library_key = content_library.library_key - update_blocks = content_library.update_blocks - if ContentLibraryIndexer.indexing_is_enabled(): - try: - ContentLibraryIndexer.index_items([library_key]) - if update_blocks: - blocks = LibraryBlockIndexer.get_items(filter_terms={ - 'library_key': str(library_key) - }) - usage_keys = [LibraryUsageLocatorV2.from_string(block['id']) for block in blocks] - LibraryBlockIndexer.index_items(usage_keys) - except ElasticConnectionError as e: - log.exception(e) - - -@receiver(LIBRARY_BLOCK_CREATED) -@receiver(LIBRARY_BLOCK_DELETED) -@receiver(LIBRARY_BLOCK_UPDATED) -def index_library_block(**kwargs): - """ - Index library when its blocks are created, modified, or deleted. - """ - library_block = kwargs.get('library_block', None) - if not library_block or not isinstance(library_block, LibraryBlockData): - log.error('Received null or incorrect data for event') - return - - library_key = library_block.library_key - if ContentLibraryIndexer.indexing_is_enabled(): - try: - ContentLibraryIndexer.index_items([library_key]) - except ElasticConnectionError as e: - log.exception(e) - - -@receiver(CONTENT_LIBRARY_DELETED) -def remove_library_index(**kwargs): - """ - Remove from index when library is deleted - """ - content_library = kwargs.get('content_library', None) - if not content_library or not isinstance(content_library, ContentLibraryData): - log.error('Received null or incorrect data for event') - return - - if ContentLibraryIndexer.indexing_is_enabled(): - library_key = content_library.library_key - try: - ContentLibraryIndexer.remove_items([library_key]) - blocks = LibraryBlockIndexer.get_items(filter_terms={ - 'library_key': str(library_key) - }) - LibraryBlockIndexer.remove_items([block['id'] for block in blocks]) - except ElasticConnectionError as e: - log.exception(e) - - -@receiver(LIBRARY_BLOCK_CREATED) -@receiver(LIBRARY_BLOCK_UPDATED) -def index_block(**kwargs): - """ - Index block metadata when created or updated - """ - library_block = kwargs.get('library_block', None) - if not library_block or not isinstance(library_block, LibraryBlockData): - log.error('Received null or incorrect data for event') - return - - usage_key = library_block.usage_key - if LibraryBlockIndexer.indexing_is_enabled(): - try: - LibraryBlockIndexer.index_items([usage_key]) - except ElasticConnectionError as e: - log.exception(e) - - -@receiver(LIBRARY_BLOCK_DELETED) -def remove_block_index(**kwargs): - """ - Remove the block from the index when deleted - """ - library_block = kwargs.get('library_block', None) - if not library_block or not isinstance(library_block, LibraryBlockData): - log.error('Received null or incorrect data for LIBRARY_BLOCK_DELETED') - return - - usage_key = library_block.usage_key - if LibraryBlockIndexer.indexing_is_enabled(): - try: - LibraryBlockIndexer.remove_items([usage_key]) - except ElasticConnectionError as e: - log.exception(e) diff --git a/openedx/core/djangoapps/content_libraries/management/commands/reindex_content_library.py b/openedx/core/djangoapps/content_libraries/management/commands/reindex_content_library.py deleted file mode 100644 index 6c3c8874e895..000000000000 --- a/openedx/core/djangoapps/content_libraries/management/commands/reindex_content_library.py +++ /dev/null @@ -1,81 +0,0 @@ -""" Management command to update content libraries' search index """ # lint-amnesty, pylint: disable=cyclic-import - - -import logging - -from textwrap import dedent - -from django.core.management import BaseCommand -from opaque_keys.edx.locator import LibraryLocatorV2 -from openedx.core.djangoapps.content_libraries.api import DRAFT_NAME -from openedx.core.djangoapps.content_libraries.libraries_index import ContentLibraryIndexer, LibraryBlockIndexer -from openedx.core.djangoapps.content_libraries.library_bundle import LibraryBundle -from openedx.core.djangoapps.content_libraries.models import ContentLibrary - -from cms.djangoapps.contentstore.management.commands.prompt import query_yes_no - - -class Command(BaseCommand): - """ - Command to reindex blockstore-based content libraries (single, multiple or all available). - - This isn't needed on a regular basis as signals in various library APIs update the index when creating, updating or - deleting libraries. - This is usually required when the schema of the index changes, or if indexes are out of sync due to indexing - being previously disabled or any other reason. - - Examples: - - ./manage.py reindex_content_library lib1 lib2 - reindexes libraries with keys lib1 and lib2 - ./manage.py reindex_content_library --all - reindexes all available libraries - ./manage.py reindex_content_library --clear-all - clear all libraries indexes - """ - help = dedent(__doc__) - CONFIRMATION_PROMPT_CLEAR = "This will clear all indexed libraries from elasticsearch. Do you want to continue?" - CONFIRMATION_PROMPT_ALL = "Reindexing all libraries might be a time consuming operation. Do you want to continue?" - - def add_arguments(self, parser): - parser.add_argument( - '--clear-all', - action='store_true', - dest='clear-all', - help='Clear all library indexes' - ) - parser.add_argument( - '--all', - action='store_true', - dest='all', - help='Reindex all libraries' - ) - parser.add_argument( - '--force', - action='store_true', - dest='force', - help='Run command without user prompt for confirmation' - ) - parser.add_argument('library_ids', nargs='*') - - def handle(self, *args, **options): - if options['clear-all']: - if options['force'] or query_yes_no(self.CONFIRMATION_PROMPT_CLEAR, default="no"): - logging.info("Removing all libraries from the index") - ContentLibraryIndexer.remove_all_items() - LibraryBlockIndexer.remove_all_items() - return - - if options['all']: - if options['force'] or query_yes_no(self.CONFIRMATION_PROMPT_ALL, default="no"): - logging.info("Indexing all libraries") - library_keys = [library.library_key for library in ContentLibrary.objects.all()] - else: - return - else: - logging.info("Indexing libraries: {}".format(options['library_ids'])) - library_keys = list(map(LibraryLocatorV2.from_string, options['library_ids'])) - - ContentLibraryIndexer.index_items(library_keys) - - for library_key in library_keys: - ref = ContentLibrary.objects.get_by_key(library_key) - lib_bundle = LibraryBundle(library_key, ref.bundle_uuid, draft_name=DRAFT_NAME) - LibraryBlockIndexer.index_items(lib_bundle.get_all_usages()) diff --git a/openedx/core/djangoapps/content_libraries/tasks.py b/openedx/core/djangoapps/content_libraries/tasks.py index c3c2e82ef556..3c259aaba956 100644 --- a/openedx/core/djangoapps/content_libraries/tasks.py +++ b/openedx/core/djangoapps/content_libraries/tasks.py @@ -28,10 +28,8 @@ from opaque_keys.edx.keys import UsageKey from opaque_keys.edx.locator import ( BlockUsageLocator, - LibraryUsageLocator, LibraryUsageLocatorV2 ) -from search.search_engine_base import SearchEngine from user_tasks.tasks import UserTask, UserTaskStatus from xblock.fields import Scope @@ -80,11 +78,6 @@ def on_progress(block_key, block_num, block_count, exception=None): ) -def _normalize_key_for_search(library_key): - """ Normalizes library key for use with search indexing """ - return library_key.replace(version_guid=None, branch=None) - - def _import_block(store, user_id, source_block, dest_parent_key): """ Recursively import a blockstore block and its children.` @@ -168,21 +161,7 @@ def _filter_child(store, usage_key, capa_type): def _problem_type_filter(store, library, capa_type): """ Filters library children by capa type.""" - try: - search_engine = SearchEngine.get_search_engine(index="library_index") - except: # pylint: disable=bare-except - search_engine = None - if search_engine: - filter_clause = { - "library": str(_normalize_key_for_search(library.location.library_key)), - "content_type": ProblemBlock.INDEX_CONTENT_TYPE, - "problem_types": capa_type - } - search_result = search_engine.search(field_dictionary=filter_clause) - results = search_result.get('results', []) - return [LibraryUsageLocator.from_string(item['data']['id']) for item in results] - else: - return [key for key in library.children if _filter_child(store, key, capa_type)] + return [key for key in library.children if _filter_child(store, key, capa_type)] def _import_from_blockstore(user_id, store, dest_block, blockstore_block_ids): diff --git a/openedx/core/djangoapps/content_libraries/tests/base.py b/openedx/core/djangoapps/content_libraries/tests/base.py index dbf76142a784..63b93509a3cb 100644 --- a/openedx/core/djangoapps/content_libraries/tests/base.py +++ b/openedx/core/djangoapps/content_libraries/tests/base.py @@ -4,24 +4,17 @@ from contextlib import contextmanager from io import BytesIO from urllib.parse import urlencode -from unittest import mock -from django.conf import settings from django.test import LiveServerTestCase -from django.test.utils import override_settings from organizations.models import Organization from rest_framework.test import APITestCase, APIClient -from search.search_engine_base import SearchEngine from common.djangoapps.student.tests.factories import UserFactory -from openedx.core.djangoapps.content_libraries.libraries_index import MAX_SIZE from openedx.core.djangoapps.content_libraries.constants import COMPLEX, ALL_RIGHTS_RESERVED from openedx.core.djangolib.testing.utils import skip_unless_cms from openedx.core.lib import blockstore_api from openedx.core.lib.blockstore_api.tests.base import ( BlockstoreAppTestMixin, - requires_blockstore, - requires_blockstore_app, ) # Define the URLs here - don't use reverse() because we want to detect @@ -53,45 +46,6 @@ URL_BLOCK_XBLOCK_HANDLER = '/api/xblock/v2/xblocks/{block_key}/handler/{user_id}-{secure_token}/{handler_name}/' -def elasticsearch_test(func): - """ - Decorator for tests which connect to elasticsearch when needed - """ - # This is disabled by default. Set to True if the elasticsearch engine is needed to test parts of code. - if settings.ENABLE_ELASTICSEARCH_FOR_TESTS: - func = override_settings(SEARCH_ENGINE="search.elastic.ElasticSearchEngine")(func) - func = override_settings(ELASTIC_SEARCH_CONFIG=[{ - 'use_ssl': settings.TEST_ELASTICSEARCH_USE_SSL, - 'host': settings.TEST_ELASTICSEARCH_HOST, - 'port': settings.TEST_ELASTICSEARCH_PORT, - }])(func) - func = mock.patch( - "openedx.core.djangoapps.content_libraries.libraries_index.SearchIndexerBase.SEARCH_KWARGS", - new={ - 'refresh': 'wait_for' - })(func) - return func - else: - @classmethod - def mock_perform(cls, filter_terms, text_search): - # pylint: disable=no-member - return SearchEngine.get_search_engine(cls.INDEX_NAME).search( - field_dictionary=filter_terms, - query_string=text_search, - size=MAX_SIZE - ) - - func = mock.patch( - "openedx.core.djangoapps.content_libraries.libraries_index.SearchIndexerBase.SEARCH_KWARGS", - new={} - )(func) - func = mock.patch( - "openedx.core.djangoapps.content_libraries.libraries_index.SearchIndexerBase._perform_elastic_search", - new=mock_perform - )(func) - return func - - @skip_unless_cms # Content Libraries REST API is only available in Studio class _ContentLibrariesRestApiTestMixin: """ @@ -355,15 +309,6 @@ def _get_block_handler_url(self, block_key, handler_name): return self._api('get', url, None, expect_response=200)["handler_url"] -@requires_blockstore -class ContentLibrariesRestApiBlockstoreServiceTest(_ContentLibrariesRestApiTestMixin, APITestCase): - """ - Base class for Blockstore-based Content Libraries test that use the REST API - and the standalone Blockstore service. - """ - - -@requires_blockstore_app class ContentLibrariesRestApiTest( _ContentLibrariesRestApiTestMixin, BlockstoreAppTestMixin, diff --git a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py index 42d5bccf3442..69ee1755188f 100644 --- a/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py +++ b/openedx/core/djangoapps/content_libraries/tests/test_content_libraries.py @@ -5,10 +5,8 @@ from unittest.mock import Mock, patch import ddt -from django.conf import settings from django.contrib.auth.models import Group from django.test.client import Client -from django.test.utils import override_settings from organizations.models import Organization from rest_framework.test import APITestCase @@ -22,11 +20,8 @@ LIBRARY_BLOCK_DELETED, LIBRARY_BLOCK_UPDATED, ) -from openedx.core.djangoapps.content_libraries.libraries_index import LibraryBlockIndexer, ContentLibraryIndexer from openedx.core.djangoapps.content_libraries.tests.base import ( - ContentLibrariesRestApiBlockstoreServiceTest, ContentLibrariesRestApiTest, - elasticsearch_test, URL_BLOCK_METADATA_URL, URL_BLOCK_RENDER_VIEW, URL_BLOCK_GET_HANDLER_URL, @@ -62,13 +57,6 @@ class ContentLibrariesTestMixin: library slug and bundle UUID does not because it's assumed to be immutable and cached forever. """ - - def setUp(self): - super().setUp() - if settings.ENABLE_ELASTICSEARCH_FOR_TESTS: - ContentLibraryIndexer.remove_all_items() - LibraryBlockIndexer.remove_all_items() - def test_library_crud(self): """ Test Create, Read, Update, and Delete of a Content Library @@ -211,89 +199,83 @@ def test_library_validation(self): 'slug': ['Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or hyphens.'], } - @ddt.data(True, False) @patch("openedx.core.djangoapps.content_libraries.views.LibraryApiPagination.page_size", new=2) - def test_list_library(self, is_indexing_enabled): + def test_list_library(self): """ Test the /libraries API and its pagination """ - with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}): - lib1 = self._create_library(slug="some-slug-1", title="Existing Library") - lib2 = self._create_library(slug="some-slug-2", title="Existing Library") - if not is_indexing_enabled: - lib1['num_blocks'] = lib2['num_blocks'] = None - lib1['last_published'] = lib2['last_published'] = None - lib1['has_unpublished_changes'] = lib2['has_unpublished_changes'] = None - lib1['has_unpublished_deletes'] = lib2['has_unpublished_deletes'] = None - - result = self._list_libraries() - assert len(result) == 2 - assert lib1 in result - assert lib2 in result - result = self._list_libraries({'pagination': 'true'}) - assert len(result['results']) == 2 - assert result['next'] is None - - # Create another library which causes number of libraries to exceed the page size - self._create_library(slug="some-slug-3", title="Existing Library") - # Verify that if `pagination` param isn't sent, API still honors the max page size. - # This is for maintaining compatibility with older non pagination-aware clients. - result = self._list_libraries() - assert len(result) == 2 - - # Pagination enabled: - # Verify total elements and valid 'next' in page 1 - result = self._list_libraries({'pagination': 'true'}) - assert len(result['results']) == 2 - assert 'page=2' in result['next'] - assert 'pagination=true' in result['next'] - # Verify total elements and null 'next' in page 2 - result = self._list_libraries({'pagination': 'true', 'page': '2'}) - assert len(result['results']) == 1 - assert result['next'] is None - - @ddt.data(True, False) - def test_library_filters(self, is_indexing_enabled): + lib1 = self._create_library(slug="some-slug-1", title="Existing Library") + lib2 = self._create_library(slug="some-slug-2", title="Existing Library") + lib1['num_blocks'] = lib2['num_blocks'] = None + lib1['last_published'] = lib2['last_published'] = None + lib1['has_unpublished_changes'] = lib2['has_unpublished_changes'] = None + lib1['has_unpublished_deletes'] = lib2['has_unpublished_deletes'] = None + + result = self._list_libraries() + assert len(result) == 2 + assert lib1 in result + assert lib2 in result + result = self._list_libraries({'pagination': 'true'}) + assert len(result['results']) == 2 + assert result['next'] is None + + # Create another library which causes number of libraries to exceed the page size + self._create_library(slug="some-slug-3", title="Existing Library") + # Verify that if `pagination` param isn't sent, API still honors the max page size. + # This is for maintaining compatibility with older non pagination-aware clients. + result = self._list_libraries() + assert len(result) == 2 + + # Pagination enabled: + # Verify total elements and valid 'next' in page 1 + result = self._list_libraries({'pagination': 'true'}) + assert len(result['results']) == 2 + assert 'page=2' in result['next'] + assert 'pagination=true' in result['next'] + # Verify total elements and null 'next' in page 2 + result = self._list_libraries({'pagination': 'true', 'page': '2'}) + assert len(result['results']) == 1 + assert result['next'] is None + + def test_library_filters(self): """ Test the filters in the list libraries API """ - suffix = str(is_indexing_enabled) - with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}): - self._create_library( - slug=f"test-lib-filter-{suffix}-1", title="Fob", description=f"Bar-{suffix}", library_type=VIDEO, - ) - self._create_library( - slug=f"test-lib-filter-{suffix}-2", title=f"Library-Title-{suffix}-2", description=f"Bar-{suffix}-2", - ) - self._create_library( - slug=f"l3{suffix}", title=f"Library-Title-{suffix}-3", description="Description", library_type=VIDEO, - ) + self._create_library( + slug="test-lib-filter-1", title="Fob", description="Bar", library_type=VIDEO, + ) + self._create_library( + slug="test-lib-filter-2", title="Library-Title-2", description="Bar-2", + ) + self._create_library( + slug="l3", title="Library-Title-3", description="Description", library_type=VIDEO, + ) - Organization.objects.get_or_create( - short_name=f"org-test-{suffix}", - defaults={"name": "Content Libraries Tachyon Exploration & Survey Team"}, - ) - self._create_library( - slug=f"l4-{suffix}", title=f"Library-Title-{suffix}-4", - description="Library-Description", org=f'org-test-{suffix}', - library_type=VIDEO, - ) - self._create_library( - slug="l5", title=f"Library-Title-{suffix}-5", description="Library-Description", - org=f'org-test-{suffix}', - ) + Organization.objects.get_or_create( + short_name="org-test", + defaults={"name": "Content Libraries Tachyon Exploration & Survey Team"}, + ) + self._create_library( + slug="l4", title="Library-Title-4", + description="Library-Description", org='org-test', + library_type=VIDEO, + ) + self._create_library( + slug="l5", title="Library-Title-5", description="Library-Description", + org='org-test', + ) - assert len(self._list_libraries()) == 5 - assert len(self._list_libraries({'org': f'org-test-{suffix}'})) == 2 - assert len(self._list_libraries({'text_search': f'test-lib-filter-{suffix}'})) == 2 - assert len(self._list_libraries({'text_search': f'test-lib-filter-{suffix}', 'type': VIDEO})) == 1 - assert len(self._list_libraries({'text_search': f'library-title-{suffix}'})) == 4 - assert len(self._list_libraries({'text_search': f'library-title-{suffix}', 'type': VIDEO})) == 2 - assert len(self._list_libraries({'text_search': f'bar-{suffix}'})) == 2 - assert len(self._list_libraries({'text_search': f'org-test-{suffix}'})) == 2 - assert len(self._list_libraries({'org': f'org-test-{suffix}', - 'text_search': f'library-title-{suffix}-4'})) == 1 - assert len(self._list_libraries({'type': VIDEO})) == 3 + assert len(self._list_libraries()) == 5 + assert len(self._list_libraries({'org': 'org-test'})) == 2 + assert len(self._list_libraries({'text_search': 'test-lib-filter'})) == 2 + assert len(self._list_libraries({'text_search': 'test-lib-filter', 'type': VIDEO})) == 1 + assert len(self._list_libraries({'text_search': 'library-title'})) == 4 + assert len(self._list_libraries({'text_search': 'library-title', 'type': VIDEO})) == 2 + assert len(self._list_libraries({'text_search': 'bar'})) == 2 + assert len(self._list_libraries({'text_search': 'org-test'})) == 2 + assert len(self._list_libraries({'org': 'org-test', + 'text_search': 'library-title-4'})) == 1 + assert len(self._list_libraries({'type': VIDEO})) == 3 # General Content Library XBlock tests: @@ -440,65 +422,61 @@ def test_library_blocks_studio_view(self): assert 'resources' in fragment assert 'Hello world!' in fragment['content'] - @ddt.data(True, False) @patch("openedx.core.djangoapps.content_libraries.views.LibraryApiPagination.page_size", new=2) - def test_list_library_blocks(self, is_indexing_enabled): + def test_list_library_blocks(self): """ Test the /libraries/{lib_key_str}/blocks API and its pagination """ - with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}): - lib = self._create_library(slug="list_blocks-slug" + str(is_indexing_enabled), title="Library 1") - block1 = self._add_block_to_library(lib["id"], "problem", "problem1") - block2 = self._add_block_to_library(lib["id"], "unit", "unit1") - - self._add_block_to_library(lib["id"], "problem", "problem2", parent_block=block2["id"]) - - result = self._get_library_blocks(lib["id"]) - assert len(result) == 2 - assert block1 in result - - result = self._get_library_blocks(lib["id"], {'pagination': 'true'}) - assert len(result['results']) == 2 - assert result['next'] is None - - self._add_block_to_library(lib["id"], "problem", "problem3") - # Test pagination - result = self._get_library_blocks(lib["id"]) - assert len(result) == 3 - result = self._get_library_blocks(lib["id"], {'pagination': 'true'}) - assert len(result['results']) == 2 - assert 'page=2' in result['next'] - assert 'pagination=true' in result['next'] - result = self._get_library_blocks(lib["id"], {'pagination': 'true', 'page': '2'}) - assert len(result['results']) == 1 - assert result['next'] is None - - @ddt.data(True, False) - def test_library_blocks_filters(self, is_indexing_enabled): + lib = self._create_library(slug="list_blocks-slug", title="Library 1") + block1 = self._add_block_to_library(lib["id"], "problem", "problem1") + block2 = self._add_block_to_library(lib["id"], "unit", "unit1") + + self._add_block_to_library(lib["id"], "problem", "problem2", parent_block=block2["id"]) + + result = self._get_library_blocks(lib["id"]) + assert len(result) == 2 + assert block1 in result + + result = self._get_library_blocks(lib["id"], {'pagination': 'true'}) + assert len(result['results']) == 2 + assert result['next'] is None + + self._add_block_to_library(lib["id"], "problem", "problem3") + # Test pagination + result = self._get_library_blocks(lib["id"]) + assert len(result) == 3 + result = self._get_library_blocks(lib["id"], {'pagination': 'true'}) + assert len(result['results']) == 2 + assert 'page=2' in result['next'] + assert 'pagination=true' in result['next'] + result = self._get_library_blocks(lib["id"], {'pagination': 'true', 'page': '2'}) + assert len(result['results']) == 1 + assert result['next'] is None + + def test_library_blocks_filters(self): """ Test the filters in the list libraries API """ - with override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': is_indexing_enabled}): - lib = self._create_library(slug="test-lib-blocks" + str(is_indexing_enabled), title="Title") - block1 = self._add_block_to_library(lib["id"], "problem", "foo-bar") - self._add_block_to_library(lib["id"], "video", "vid-baz") - self._add_block_to_library(lib["id"], "html", "html-baz") - self._add_block_to_library(lib["id"], "problem", "foo-baz") - self._add_block_to_library(lib["id"], "problem", "bar-baz") - - self._set_library_block_olx(block1["id"], "") - - assert len(self._get_library_blocks(lib['id'])) == 5 - assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo'})) == 2 - assert len(self._get_library_blocks(lib['id'], {'text_search': 'Display'})) == 1 - assert len(self._get_library_blocks(lib['id'], {'text_search': 'Video'})) == 1 - assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo', 'block_type': 'video'})) == 0 - assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': 'video'})) == 1 - assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': ['video', 'html']})) ==\ - 2 - assert len(self._get_library_blocks(lib['id'], {'block_type': 'video'})) == 1 - assert len(self._get_library_blocks(lib['id'], {'block_type': 'problem'})) == 3 - assert len(self._get_library_blocks(lib['id'], {'block_type': 'squirrel'})) == 0 + lib = self._create_library(slug="test-lib-blocks", title="Title") + block1 = self._add_block_to_library(lib["id"], "problem", "foo-bar") + self._add_block_to_library(lib["id"], "video", "vid-baz") + self._add_block_to_library(lib["id"], "html", "html-baz") + self._add_block_to_library(lib["id"], "problem", "foo-baz") + self._add_block_to_library(lib["id"], "problem", "bar-baz") + + self._set_library_block_olx(block1["id"], "") + + assert len(self._get_library_blocks(lib['id'])) == 5 + assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo'})) == 2 + assert len(self._get_library_blocks(lib['id'], {'text_search': 'Display'})) == 1 + assert len(self._get_library_blocks(lib['id'], {'text_search': 'Video'})) == 1 + assert len(self._get_library_blocks(lib['id'], {'text_search': 'Foo', 'block_type': 'video'})) == 0 + assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': 'video'})) == 1 + assert len(self._get_library_blocks(lib['id'], {'text_search': 'Baz', 'block_type': ['video', 'html']})) ==\ + 2 + assert len(self._get_library_blocks(lib['id'], {'block_type': 'video'})) == 1 + assert len(self._get_library_blocks(lib['id'], {'block_type': 'problem'})) == 3 + assert len(self._get_library_blocks(lib['id'], {'block_type': 'squirrel'})) == 0 @ddt.data( ('video-problem', VIDEO, 'problem', 400), @@ -1232,17 +1210,6 @@ def test_library_block_delete_event(self): ) -@elasticsearch_test -class ContentLibrariesBlockstoreServiceTest( - ContentLibrariesTestMixin, - ContentLibrariesRestApiBlockstoreServiceTest, -): - """ - General tests for Blockstore-based Content Libraries, using the standalone Blockstore service. - """ - - -@elasticsearch_test class ContentLibrariesTest( ContentLibrariesTestMixin, ContentLibrariesRestApiTest, diff --git a/openedx/core/djangoapps/content_libraries/tests/test_libraries_index.py b/openedx/core/djangoapps/content_libraries/tests/test_libraries_index.py deleted file mode 100644 index 0e46680351af..000000000000 --- a/openedx/core/djangoapps/content_libraries/tests/test_libraries_index.py +++ /dev/null @@ -1,325 +0,0 @@ -""" -Testing indexing of blockstore based content libraries -""" -from unittest.mock import patch - -from django.conf import settings -from django.core.management import call_command -from django.test.utils import override_settings -from opaque_keys.edx.locator import LibraryLocatorV2, LibraryUsageLocatorV2 -from search.search_engine_base import SearchEngine - -from openedx.core.djangoapps.content_libraries.libraries_index import ContentLibraryIndexer, LibraryBlockIndexer -from openedx.core.djangoapps.content_libraries.tests.base import ( - ContentLibrariesRestApiBlockstoreServiceTest, - ContentLibrariesRestApiTest, - elasticsearch_test, -) - - -class ContentLibraryIndexerTestMixin: - """ - Tests the operation of ContentLibraryIndexer - """ - - @elasticsearch_test - def setUp(self): - super().setUp() - ContentLibraryIndexer.remove_all_items() - LibraryBlockIndexer.remove_all_items() - self.searcher = SearchEngine.get_search_engine(ContentLibraryIndexer.INDEX_NAME) - - def test_index_libraries(self): - """ - Test if libraries are being indexed correctly - """ - result1 = self._create_library(slug="test-lib-index-1", title="Title 1", description="Description") - result2 = self._create_library(slug="test-lib-index-2", title="Title 2", description="Description") - - for result in [result1, result2]: - library_key = LibraryLocatorV2.from_string(result['id']) - response = ContentLibraryIndexer.get_items([library_key])[0] - - assert response['id'] == result['id'] - assert response['title'] == result['title'] - assert response['description'] == result['description'] - assert response['uuid'] == result['bundle_uuid'] - assert response['num_blocks'] == 0 - assert response['version'] == result['version'] - assert response['last_published'] is None - assert response['has_unpublished_changes'] is False - assert response['has_unpublished_deletes'] is False - - def test_schema_updates(self): - """ - Test that outdated indexes aren't retrieved - """ - with patch("openedx.core.djangoapps.content_libraries.libraries_index.ContentLibraryIndexer.SCHEMA_VERSION", - new=0): - result = self._create_library(slug="test-lib-schemaupdates-1", title="Title 1", description="Description") - library_key = LibraryLocatorV2.from_string(result['id']) - assert len(ContentLibraryIndexer.get_items([library_key])) == 1 - - with patch("openedx.core.djangoapps.content_libraries.libraries_index.ContentLibraryIndexer.SCHEMA_VERSION", - new=1): - assert len(ContentLibraryIndexer.get_items([library_key])) == 0 - - call_command("reindex_content_library", all=True, force=True) - - assert len(ContentLibraryIndexer.get_items([library_key])) == 1 - - def test_remove_all_libraries(self): - """ - Test if remove_all_items() deletes all libraries - """ - lib1 = self._create_library(slug="test-lib-rm-all-1", title="Title 1", description="Description") - lib2 = self._create_library(slug="test-lib-rm-all-2", title="Title 2", description="Description") - library_key1 = LibraryLocatorV2.from_string(lib1['id']) - library_key2 = LibraryLocatorV2.from_string(lib2['id']) - - assert len(ContentLibraryIndexer.get_items([library_key1, library_key2])) == 2 - - ContentLibraryIndexer.remove_all_items() - assert len(ContentLibraryIndexer.get_items()) == 0 - - def test_update_libraries(self): - """ - Test if indexes are updated when libraries are updated - """ - lib = self._create_library(slug="test-lib-update", title="Title", description="Description") - library_key = LibraryLocatorV2.from_string(lib['id']) - - self._update_library(lib['id'], title="New Title", description="New Title") - - response = ContentLibraryIndexer.get_items([library_key])[0] - - assert response['id'] == lib['id'] - assert response['title'] == 'New Title' - assert response['description'] == 'New Title' - assert response['uuid'] == lib['bundle_uuid'] - assert response['num_blocks'] == 0 - assert response['version'] == lib['version'] - assert response['last_published'] is None - assert response['has_unpublished_changes'] is False - assert response['has_unpublished_deletes'] is False - - self._delete_library(lib['id']) - assert ContentLibraryIndexer.get_items([library_key]) == [] - ContentLibraryIndexer.get_items([library_key]) - - def test_update_library_blocks(self): - """ - Test if indexes are updated when blocks in libraries are updated - """ - def commit_library_and_verify(library_key): - """ - Commit library changes, and verify that there are no uncommited changes anymore - """ - last_published = ContentLibraryIndexer.get_items([library_key])[0]['last_published'] - self._commit_library_changes(str(library_key)) - response = ContentLibraryIndexer.get_items([library_key])[0] - assert response['has_unpublished_changes'] is False - assert response['has_unpublished_deletes'] is False - assert response['last_published'] >= last_published - return response - - def verify_uncommitted_libraries(library_key, has_unpublished_changes, has_unpublished_deletes): - """ - Verify uncommitted changes and deletes in the index - """ - response = ContentLibraryIndexer.get_items([library_key])[0] - assert response['has_unpublished_changes'] == has_unpublished_changes - assert response['has_unpublished_deletes'] == has_unpublished_deletes - return response - - lib = self._create_library(slug="test-lib-update-block", title="Title", description="Description") - library_key = LibraryLocatorV2.from_string(lib['id']) - - # Verify uncommitted new blocks - block = self._add_block_to_library(lib['id'], "problem", "problem1") - response = verify_uncommitted_libraries(library_key, True, False) - assert response['last_published'] is None - assert response['num_blocks'] == 1 - # Verify committed new blocks - self._commit_library_changes(lib['id']) - response = verify_uncommitted_libraries(library_key, False, False) - assert response['num_blocks'] == 1 - # Verify uncommitted deleted blocks - self._delete_library_block(block['id']) - response = verify_uncommitted_libraries(library_key, True, True) - assert response['num_blocks'] == 0 - # Verify committed deleted blocks - self._commit_library_changes(lib['id']) - response = verify_uncommitted_libraries(library_key, False, False) - assert response['num_blocks'] == 0 - - block = self._add_block_to_library(lib['id'], "problem", "problem1") - self._commit_library_changes(lib['id']) - - # Verify changes to blocks - # Verify OLX updates on blocks - self._set_library_block_olx(block["id"], "") - verify_uncommitted_libraries(library_key, True, False) - commit_library_and_verify(library_key) - # Verify asset updates on blocks - self._set_library_block_asset(block["id"], "whatever.png", b"data") - verify_uncommitted_libraries(library_key, True, False) - commit_library_and_verify(library_key) - self._delete_library_block_asset(block["id"], "whatever.png") - verify_uncommitted_libraries(library_key, True, False) - commit_library_and_verify(library_key) - - lib2 = self._create_library(slug="test-lib-update-block-2", title="Title 2", description="Description") - self._add_block_to_library(lib2["id"], "problem", "problem1") - self._commit_library_changes(lib2["id"]) - - #Verify new links on libraries - self._link_to_library(lib["id"], "library_2", lib2["id"]) - verify_uncommitted_libraries(library_key, True, False) - #Verify reverting uncommitted changes - self._revert_library_changes(lib["id"]) - verify_uncommitted_libraries(library_key, False, False) - - -@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True}) -@elasticsearch_test -class ContentLibraryIndexerBlockstoreServiceTest( - ContentLibraryIndexerTestMixin, - ContentLibrariesRestApiBlockstoreServiceTest, -): - """ - Tests the operation of ContentLibraryIndexer using the standalone Blockstore service. - """ - - -@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True}) -@elasticsearch_test -class ContentLibraryIndexerTest( - ContentLibraryIndexerTestMixin, - ContentLibrariesRestApiTest, -): - """ - Tests the operation of ContentLibraryIndexer using the installed Blockstore app. - """ - - -class LibraryBlockIndexerTestMixin: - """ - Tests the operation of LibraryBlockIndexer - """ - - @elasticsearch_test - def setUp(self): - super().setUp() - ContentLibraryIndexer.remove_all_items() - LibraryBlockIndexer.remove_all_items() - self.searcher = SearchEngine.get_search_engine(LibraryBlockIndexer.INDEX_NAME) - - def test_index_block(self): - """ - Test if libraries are being indexed correctly - """ - lib = self._create_library(slug="test-lib-index-1", title="Title 1", description="Description") - block1 = self._add_block_to_library(lib['id'], "problem", "problem1") - block2 = self._add_block_to_library(lib['id'], "problem", "problem2") - - assert len(LibraryBlockIndexer.get_items()) == 2 - - for block in [block1, block2]: - usage_key = LibraryUsageLocatorV2.from_string(block['id']) - response = LibraryBlockIndexer.get_items([usage_key])[0] - - assert response['id'] == block['id'] - assert response['def_key'] == block['def_key'] - assert response['block_type'] == block['block_type'] - assert response['display_name'] == block['display_name'] - assert response['has_unpublished_changes'] == block['has_unpublished_changes'] - - def test_schema_updates(self): - """ - Test that outdated indexes aren't retrieved - """ - lib = self._create_library(slug="test-lib--block-schemaupdates-1", title="Title 1", description="Description") - with patch("openedx.core.djangoapps.content_libraries.libraries_index.LibraryBlockIndexer.SCHEMA_VERSION", - new=0): - block = self._add_block_to_library(lib['id'], "problem", "problem1") - assert len(LibraryBlockIndexer.get_items([block['id']])) == 1 - - with patch("openedx.core.djangoapps.content_libraries.libraries_index.LibraryBlockIndexer.SCHEMA_VERSION", - new=1): - assert len(LibraryBlockIndexer.get_items([block['id']])) == 0 - - call_command("reindex_content_library", all=True, force=True) - - assert len(LibraryBlockIndexer.get_items([block['id']])) == 1 - - def test_remove_all_items(self): - """ - Test if remove_all_items() deletes all libraries - """ - lib1 = self._create_library(slug="test-lib-rm-all", title="Title 1", description="Description") - self._add_block_to_library(lib1['id'], "problem", "problem1") - self._add_block_to_library(lib1['id'], "problem", "problem2") - assert len(LibraryBlockIndexer.get_items()) == 2 - - LibraryBlockIndexer.remove_all_items() - assert len(LibraryBlockIndexer.get_items()) == 0 - - def test_crud_block(self): - """ - Test that CRUD operations on blocks are reflected in the index - """ - lib = self._create_library(slug="test-lib-crud-block", title="Title", description="Description") - block = self._add_block_to_library(lib['id'], "problem", "problem1") - - # Update OLX, verify updates in index - self._set_library_block_olx(block["id"], '') - response = LibraryBlockIndexer.get_items([block['id']])[0] - assert response['display_name'] == 'new_name' - assert response['has_unpublished_changes'] is True - - # Verify has_unpublished_changes after committing library - self._commit_library_changes(lib['id']) - response = LibraryBlockIndexer.get_items([block['id']])[0] - assert response['has_unpublished_changes'] is False - - # Verify has_unpublished_changes after reverting library - self._set_library_block_asset(block["id"], "whatever.png", b"data") - response = LibraryBlockIndexer.get_items([block['id']])[0] - assert response['has_unpublished_changes'] is True - - self._revert_library_changes(lib['id']) - response = LibraryBlockIndexer.get_items([block['id']])[0] - assert response['has_unpublished_changes'] is False - - # Verify that deleting block removes it from index - self._delete_library_block(block['id']) - assert LibraryBlockIndexer.get_items([block['id']]) == [] - - # Verify that deleting a library removes its blocks from index too - self._add_block_to_library(lib['id'], "problem", "problem1") - LibraryBlockIndexer.get_items([block['id']]) - self._delete_library(lib['id']) - assert LibraryBlockIndexer.get_items([block['id']]) == [] - - -@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True}) -@elasticsearch_test -class LibraryBlockIndexerBlockstoreServiceTest( - LibraryBlockIndexerTestMixin, - ContentLibrariesRestApiBlockstoreServiceTest, -): - """ - Tests the operation of LibraryBlockIndexer using the standalone Blockstore service. - """ - - -@override_settings(FEATURES={**settings.FEATURES, 'ENABLE_CONTENT_LIBRARY_INDEX': True}) -@elasticsearch_test -class LibraryBlockIndexerTest( - LibraryBlockIndexerTestMixin, - ContentLibrariesRestApiTest, -): - """ - Tests the operation of LibraryBlockIndexer using the installed Blockstore app. - """ diff --git a/openedx/core/djangoapps/content_libraries/tests/test_runtime.py b/openedx/core/djangoapps/content_libraries/tests/test_runtime.py index f166cee546ca..430306d936e2 100644 --- a/openedx/core/djangoapps/content_libraries/tests/test_runtime.py +++ b/openedx/core/djangoapps/content_libraries/tests/test_runtime.py @@ -6,7 +6,7 @@ from completion.test_utils import CompletionWaffleTestMixin from django.db import connections, transaction -from django.test import LiveServerTestCase, TestCase +from django.test import LiveServerTestCase from django.utils.text import slugify from organizations.models import Organization from rest_framework.test import APIClient @@ -16,8 +16,6 @@ from openedx.core.djangoapps.content_libraries import api as library_api from openedx.core.djangoapps.content_libraries.tests.base import ( BlockstoreAppTestMixin, - requires_blockstore, - requires_blockstore_app, URL_BLOCK_RENDER_VIEW, URL_BLOCK_GET_HANDLER_URL, URL_BLOCK_METADATA_URL, @@ -224,14 +222,6 @@ def test_xblock_fields(self): assert xblock_api.get_block_display_name(block_saved) == 'New Display Name' -@requires_blockstore -class ContentLibraryRuntimeBServiceTest(ContentLibraryRuntimeTestMixin, TestCase): - """ - Tests XBlock runtime using XBlocks in a content library using the standalone Blockstore service. - """ - - -@requires_blockstore_app class ContentLibraryRuntimeTest(ContentLibraryRuntimeTestMixin, BlockstoreAppTestMixin, LiveServerTestCase): """ Tests XBlock runtime using XBlocks in a content library using the installed Blockstore app. @@ -545,14 +535,6 @@ def test_i18n(self): assert 'Submit' not in dummy_public_view.data['content'] -@requires_blockstore -class ContentLibraryXBlockUserStateBServiceTest(ContentLibraryXBlockUserStateTestMixin, TestCase): # type: ignore[misc] - """ - Tests XBlock user state for XBlocks in a content library using the standalone Blockstore service. - """ - - -@requires_blockstore_app class ContentLibraryXBlockUserStateTest( # type: ignore[misc] ContentLibraryXBlockUserStateTestMixin, BlockstoreAppTestMixin, @@ -619,19 +601,6 @@ def get_block_completion_status(): assert get_block_completion_status() == 1 -@requires_blockstore -class ContentLibraryXBlockCompletionBServiceTest( - ContentLibraryXBlockCompletionTestMixin, - CompletionWaffleTestMixin, - TestCase, -): - """ - Test that the Blockstore-based XBlocks can track their completion status - using the standalone Blockstore service. - """ - - -@requires_blockstore_app class ContentLibraryXBlockCompletionTest( ContentLibraryXBlockCompletionTestMixin, CompletionWaffleTestMixin, diff --git a/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py b/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py index 7004860f9d4c..e330101eb3bc 100644 --- a/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py +++ b/openedx/core/djangoapps/content_libraries/tests/test_static_assets.py @@ -3,7 +3,6 @@ """ from openedx.core.djangoapps.content_libraries.tests.base import ( - ContentLibrariesRestApiBlockstoreServiceTest, ContentLibrariesRestApiTest, ) @@ -109,15 +108,6 @@ def check_download(): check_download() -class ContentLibrariesStaticAssetsBlockstoreServiceTest( - ContentLibrariesStaticAssetsTestMixin, - ContentLibrariesRestApiBlockstoreServiceTest, -): - """ - Tests for static asset files in Blockstore-based Content Libraries, using the standalone Blockstore service. - """ - - class ContentLibrariesStaticAssetsTest( ContentLibrariesStaticAssetsTestMixin, ContentLibrariesRestApiTest, diff --git a/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py b/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py index 58dd7e9b214a..cb306ebbfe48 100644 --- a/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py +++ b/openedx/core/djangoapps/content_libraries/tests/test_views_lti.py @@ -8,7 +8,6 @@ from openedx.core.djangoapps.content_libraries.constants import PROBLEM from .base import ( - ContentLibrariesRestApiBlockstoreServiceTest, ContentLibrariesRestApiTest, URL_LIB_LTI_JWKS, skip_unless_cms, @@ -81,17 +80,6 @@ def test_block_not_found(self): self._api("get", '/api/libraries/v2/blocks/lb:CL-TEST:libgg:problem:bad-block/lti/', None, expect_response=404) -@override_features(ENABLE_CONTENT_LIBRARIES=True, - ENABLE_CONTENT_LIBRARIES_LTI_TOOL=True) -class LibraryBlockLtiUrlViewBlockstoreServiceTest( - LibraryBlockLtiUrlViewTestMixin, - ContentLibrariesRestApiBlockstoreServiceTest, -): - """ - Test generating LTI URL for a block in a library, using the standalone Blockstore service. - """ - - @override_features(ENABLE_CONTENT_LIBRARIES=True, ENABLE_CONTENT_LIBRARIES_LTI_TOOL=True) class LibraryBlockLtiUrlViewTest( diff --git a/openedx/core/djangoapps/content_libraries/views.py b/openedx/core/djangoapps/content_libraries/views.py index c83a9c4fcb56..bd5f091b136c 100644 --- a/openedx/core/djangoapps/content_libraries/views.py +++ b/openedx/core/djangoapps/content_libraries/views.py @@ -172,12 +172,12 @@ def get(self, request): paginator = LibraryApiPagination() queryset = api.get_libraries_for_user(request.user, org=org, library_type=library_type) if text_search: - result = api.get_metadata_from_index(queryset, text_search=text_search) + result = api.get_metadata(queryset, text_search=text_search) result = paginator.paginate_queryset(result, request) else: # We can paginate queryset early and prevent fetching unneeded metadata paginated_qs = paginator.paginate_queryset(queryset, request) - result = api.get_metadata_from_index(paginated_qs) + result = api.get_metadata(paginated_qs) serializer = ContentLibraryMetadataSerializer(result, many=True) # Verify `pagination` param to maintain compatibility with older diff --git a/openedx/core/djangoapps/content_staging/migrations/0003_olx_unicode.py b/openedx/core/djangoapps/content_staging/migrations/0003_olx_unicode.py new file mode 100644 index 000000000000..1a1c414bf193 --- /dev/null +++ b/openedx/core/djangoapps/content_staging/migrations/0003_olx_unicode.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.23 on 2023-12-07 20:10 + +from django.db import migrations +import openedx_learning.lib.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('content_staging', '0002_stagedcontentfile'), + ] + + operations = [ + migrations.AlterField( + model_name='stagedcontent', + name='display_name', + field=openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, max_length=768), + ), + migrations.AlterField( + model_name='stagedcontent', + name='olx', + field=openedx_learning.lib.fields.MultiCollationTextField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}), + ), + ] diff --git a/openedx/core/djangoapps/content_staging/models.py b/openedx/core/djangoapps/content_staging/models.py index c3db6148c68c..59216912924e 100644 --- a/openedx/core/djangoapps/content_staging/models.py +++ b/openedx/core/djangoapps/content_staging/models.py @@ -10,6 +10,7 @@ from django.utils.translation import gettext_lazy as _ from opaque_keys.edx.django.models import UsageKeyField from opaque_keys.edx.keys import LearningContextKey +from openedx_learning.lib.fields import case_insensitive_char_field, MultiCollationTextField from openedx.core.djangoapps.content.course_overviews.api import get_course_overview_or_none @@ -19,6 +20,11 @@ User = get_user_model() +CASE_SENSITIVE_COLLATIONS = { + "sqlite": "BINARY", + "mysql": "utf8mb4_bin", +} + class StagedContent(models.Model): """ @@ -51,9 +57,9 @@ class Meta: e.g. "video" if a video is staged, or "vertical" for a unit. """), ) - olx = models.TextField(null=False, blank=False) + olx = MultiCollationTextField(null=False, blank=False, db_collations=CASE_SENSITIVE_COLLATIONS) # The display name of whatever item is staged here, i.e. the root XBlock. - display_name = models.CharField(max_length=1024) + display_name = case_insensitive_char_field(max_length=768) # A _suggested_ URL name to use for this content. Since this suggestion may already be in use, it's fine to generate # a new url_name instead. suggested_url_name = models.CharField(max_length=1024) diff --git a/openedx/core/djangoapps/external_user_ids/migrations/0007_remove_mbcoaching_extids.py b/openedx/core/djangoapps/external_user_ids/migrations/0007_remove_mbcoaching_extids.py new file mode 100644 index 000000000000..f9119f55e5bc --- /dev/null +++ b/openedx/core/djangoapps/external_user_ids/migrations/0007_remove_mbcoaching_extids.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.23 on 2023-12-04 18:48 +"""Deletes instances of deprecated mb_coaching external ID type""" + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("external_user_ids", "0006_auto_20230808_0944"), + ] + + mb_coaching_type_name = "mb_coaching" + + def delete_ids(apps, schema_editor): + # The + ExternalIdType = apps.get_model("external_user_ids", "ExternalIdType") + mb_coaching_type_id = ExternalIdType.objects.get( + name=Migration.mb_coaching_type_name + ).id + + ExternalId = apps.get_model("external_user_ids", "ExternalId") + ExternalId.objects.filter(external_id_type=mb_coaching_type_id).delete() + + operations = [ + migrations.RunPython(delete_ids, reverse_code=migrations.RunPython.noop) + ] diff --git a/openedx/core/djangoapps/external_user_ids/migrations/0008_remove_mbcoaching_extid_type.py b/openedx/core/djangoapps/external_user_ids/migrations/0008_remove_mbcoaching_extid_type.py new file mode 100644 index 000000000000..f04ae01cbe0d --- /dev/null +++ b/openedx/core/djangoapps/external_user_ids/migrations/0008_remove_mbcoaching_extid_type.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.23 on 2023-12-05 16:22 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("external_user_ids", "0007_remove_mbcoaching_extids"), + ] + + coaching_name = "mb_coaching" + + def create_mb_coaching_type(apps, schema_editor): + """ + Add a MicroBachelors (MB) coaching type + """ + ExternalIdType = apps.get_model("external_user_ids", "ExternalIdType") + ExternalIdType.objects.update_or_create( + name=Migration.coaching_name, description="MicroBachelors Coaching" + ) + + def delete_mb_coaching_type(apps, schema_editor): + """ + Delete the MicroBachelors (MB) coaching type + """ + ExternalIdType = apps.get_model("external_user_ids", "ExternalIdType") + ExternalIdType.objects.filter(name=Migration.coaching_name).delete() + + operations = [ + migrations.RunPython( + delete_mb_coaching_type, reverse_code=create_mb_coaching_type + ), + ] diff --git a/openedx/core/djangoapps/user_authn/views/registration_form.py b/openedx/core/djangoapps/user_authn/views/registration_form.py index d49e4c439e62..fb0631f0c0c6 100644 --- a/openedx/core/djangoapps/user_authn/views/registration_form.py +++ b/openedx/core/djangoapps/user_authn/views/registration_form.py @@ -93,7 +93,7 @@ def contains_url(value): """ Validator method to check whether full name contains url """ - regex = re.findall(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))*', value) + regex = re.findall(r'://', value) return bool(regex) diff --git a/openedx/core/djangoapps/video_config/toggles.py b/openedx/core/djangoapps/video_config/toggles.py index f417537b547e..9569a00edd7d 100644 --- a/openedx/core/djangoapps/video_config/toggles.py +++ b/openedx/core/djangoapps/video_config/toggles.py @@ -37,3 +37,10 @@ XPERT_TRANSLATIONS_UI = CourseWaffleFlag( f'{WAFFLE_FLAG_NAMESPACE}.xpert_translations_ui', __name__ ) + + +def use_xpert_translations_component(course_key): + """ + Returns a boolean if xpert translations ui component is enabled + """ + return XPERT_TRANSLATIONS_UI.is_enabled(course_key) diff --git a/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py b/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py index 9888487a989d..628f8302b464 100644 --- a/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py +++ b/openedx/core/djangoapps/zendesk_proxy/tests/test_utils.py @@ -88,7 +88,6 @@ def test_financial_assistant_ticket(self): ('Username', 'test'), ('Full Name', 'Legal Name'), ('Course ID', 'course_key'), - ('Annual Household Income', 'Income'), ('Country', 'Country'), ) ), diff --git a/openedx/core/djangoapps/zendesk_proxy/utils.py b/openedx/core/djangoapps/zendesk_proxy/utils.py index 9401949dc995..9ddfa2874686 100644 --- a/openedx/core/djangoapps/zendesk_proxy/utils.py +++ b/openedx/core/djangoapps/zendesk_proxy/utils.py @@ -41,7 +41,8 @@ def create_zendesk_ticket( Create a Zendesk ticket via API. """ if tags: - # Remove duplicates from tags list + # Remove duplicates from tags list. + # Pls note: only use tags for lists and sets, as the below will remove the value of a key/value dictionary. tags = list(set(tags)) data = { @@ -60,11 +61,8 @@ def create_zendesk_ticket( } } - # Encode the data to create a JSON payload - payload = json.dumps(data) - if not (settings.ZENDESK_URL and settings.ZENDESK_OAUTH_ACCESS_TOKEN): - log.error(_std_error_message("zendesk not configured", payload)) + log.error(_std_error_message("zendesk not configured", data)) return status.HTTP_503_SERVICE_UNAVAILABLE if group: @@ -73,9 +71,12 @@ def create_zendesk_ticket( data['ticket']['group_id'] = group_id else: msg = f"Group ID not found for group {group}. Please update ZENDESK_GROUP_ID_MAPPING" - log.error(_std_error_message(msg, payload)) + log.error(_std_error_message(msg, data)) return status.HTTP_400_BAD_REQUEST + # Encode the data to create a JSON payload + payload = json.dumps(data) + # Set the request parameters url = urljoin(settings.ZENDESK_URL, '/api/v2/tickets.json') diff --git a/openedx/core/djangolib/tests/test_blockstore_cache.py b/openedx/core/djangolib/tests/test_blockstore_cache.py index 5c55e07f449b..5ad1993d3ecd 100644 --- a/openedx/core/djangolib/tests/test_blockstore_cache.py +++ b/openedx/core/djangolib/tests/test_blockstore_cache.py @@ -5,11 +5,6 @@ from django.test import TestCase from openedx.core.djangolib.blockstore_cache import BundleCache -from openedx.core.lib.blockstore_api.tests.base import ( - BlockstoreAppTestMixin, - requires_blockstore, - requires_blockstore_app, -) from openedx.core.lib import blockstore_api as api @@ -27,7 +22,7 @@ def setUpClass(cls): @patch('openedx.core.djangolib.blockstore_cache.MAX_BLOCKSTORE_CACHE_DELAY', 0) -class BundleCacheTestMixin(TestWithBundleMixin): +class BundleCacheTestMixin(TestWithBundleMixin, TestCase): """ Tests for BundleCache """ @@ -112,17 +107,3 @@ def test_bundle_cache_clear(self): # Now "clear" the cache, forcing the check of the new version: cache.clear() assert cache.get(key1) is None - - -@requires_blockstore -class BundleCacheBlockstoreServiceTest(BundleCacheTestMixin, TestCase): - """ - Tests BundleCache using the standalone Blockstore service. - """ - - -@requires_blockstore_app -class BundleCacheTest(BundleCacheTestMixin, BlockstoreAppTestMixin, TestCase): - """ - Tests BundleCache using the installed Blockstore app. - """ diff --git a/openedx/core/lib/blockstore_api/__init__.py b/openedx/core/lib/blockstore_api/__init__.py index 50b352578cdf..d9855ef1812f 100644 --- a/openedx/core/lib/blockstore_api/__init__.py +++ b/openedx/core/lib/blockstore_api/__init__.py @@ -4,6 +4,9 @@ This API does not do any caching; consider using BundleCache or (in openedx.core.djangolib.blockstore_cache) together with these API methods for improved performance. + +TODO: This wrapper is extraneous now that Blockstore-as-a-service isn't supported. + This whole directory tree should be removed by https://github.com/openedx/blockstore/issues/296. """ from blockstore.apps.api.data import ( BundleFileData, @@ -16,7 +19,7 @@ BundleFileNotFound, BundleStorageError, ) -from .methods import ( +from blockstore.apps.api.methods import ( # Collections: get_collection, create_collection, diff --git a/openedx/core/lib/blockstore_api/config/__init__.py b/openedx/core/lib/blockstore_api/config/__init__.py deleted file mode 100644 index 4cd2999d2e32..000000000000 --- a/openedx/core/lib/blockstore_api/config/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -Helper method to indicate when the blockstore app API is enabled. -""" -from django.conf import settings -from .waffle import BLOCKSTORE_USE_BLOCKSTORE_APP_API # pylint: disable=invalid-django-waffle-import - - -def use_blockstore_app(): - """ - Use the Blockstore app API if the settings say to (e.g. in test) - or if the waffle switch is enabled. - """ - return settings.BLOCKSTORE_USE_BLOCKSTORE_APP_API or BLOCKSTORE_USE_BLOCKSTORE_APP_API.is_enabled() diff --git a/openedx/core/lib/blockstore_api/config/waffle.py b/openedx/core/lib/blockstore_api/config/waffle.py deleted file mode 100644 index 192d4d5c3ab2..000000000000 --- a/openedx/core/lib/blockstore_api/config/waffle.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -Toggles for blockstore. -""" - -from edx_toggles.toggles import WaffleSwitch - -# .. toggle_name: blockstore.use_blockstore_app_api -# .. toggle_implementation: WaffleSwitch -# .. toggle_default: False -# .. toggle_description: Enable to use the installed blockstore app's Python API directly instead of the -# external blockstore service REST API. -# The blockstore REST API is used by default. -# .. toggle_use_cases: temporary, open_edx -# .. toggle_creation_date: 2022-01-13 -# .. toggle_target_removal_date: None -# .. toggle_tickets: TNL-8705, BD-14 -# .. toggle_warning: This temporary feature toggle does not have a target removal date. -BLOCKSTORE_USE_BLOCKSTORE_APP_API = WaffleSwitch( - 'blockstore.use_blockstore_app_api', __name__ -) diff --git a/openedx/core/lib/blockstore_api/methods.py b/openedx/core/lib/blockstore_api/methods.py deleted file mode 100644 index 86b4730efe1b..000000000000 --- a/openedx/core/lib/blockstore_api/methods.py +++ /dev/null @@ -1,496 +0,0 @@ -""" -API Client methods for working with Blockstore bundles and drafts -""" - -import base64 -from functools import wraps -from urllib.parse import urlencode -from uuid import UUID - -import dateutil.parser -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -import requests - -from blockstore.apps.api.data import ( - BundleData, - CollectionData, - DraftData, - BundleVersionData, - BundleFileData, - DraftFileData, - BundleLinkData, - DraftLinkData, - Dependency, -) -from blockstore.apps.api.exceptions import ( - NotFound, - CollectionNotFound, - BundleNotFound, - DraftNotFound, - BundleFileNotFound, -) -import blockstore.apps.api.methods as blockstore_api_methods - -from .config import use_blockstore_app - - -def toggle_blockstore_api(func): - """ - Decorator function to toggle usage of the Blockstore service - and the in-built Blockstore app dependency. - """ - @wraps(func) - def wrapper(*args, **kwargs): - if use_blockstore_app(): - return getattr(blockstore_api_methods, func.__name__)(*args, **kwargs) - return func(*args, **kwargs) - return wrapper - - -def api_url(*path_parts): - if not settings.BLOCKSTORE_API_URL or not settings.BLOCKSTORE_API_URL.endswith('/api/v1/'): - raise ImproperlyConfigured('BLOCKSTORE_API_URL must be set and should end with /api/v1/') - return settings.BLOCKSTORE_API_URL + '/'.join(path_parts) - - -def api_request(method, url, **kwargs): - """ - Helper method for making a request to the Blockstore REST API - """ - if not settings.BLOCKSTORE_API_AUTH_TOKEN: - raise ImproperlyConfigured("Cannot use Blockstore unless BLOCKSTORE_API_AUTH_TOKEN is set.") - kwargs.setdefault('headers', {})['Authorization'] = f"Token {settings.BLOCKSTORE_API_AUTH_TOKEN}" - response = requests.request(method, url, **kwargs) - if response.status_code == 404: - raise NotFound - response.raise_for_status() - if response.status_code == 204: - return None # No content - return response.json() - - -def _collection_from_response(data): - """ - Given data about a Collection returned by any blockstore REST API, convert it to - a CollectionData instance. - """ - return CollectionData(uuid=UUID(data['uuid']), title=data['title']) - - -def _bundle_from_response(data): - """ - Given data about a Bundle returned by any blockstore REST API, convert it to - a BundleData instance. - """ - return BundleData( - uuid=UUID(data['uuid']), - title=data['title'], - description=data['description'], - slug=data['slug'], - # drafts: Convert from a dict of URLs to a dict of UUIDs: - drafts={draft_name: UUID(url.split('/')[-1]) for (draft_name, url) in data['drafts'].items()}, - # versions field: take the last one and convert it from URL to an int - # i.e.: [..., 'https://blockstore/api/v1/bundle_versions/bundle_uuid,15'] -> 15 - latest_version=int(data['versions'][-1].split(',')[-1]) if data['versions'] else 0, - ) - - -def _bundle_version_from_response(data): - """ - Given data about a BundleVersion returned by any blockstore REST API, convert it to - a BundleVersionData instance. - """ - return BundleVersionData( - bundle_uuid=UUID(data['bundle_uuid']), - version=data.get('version', 0), - change_description=data['change_description'], - created_at=dateutil.parser.parse(data['snapshot']['created_at']), - files={ - path: BundleFileData(path=path, **filedata) - for path, filedata in data['snapshot']['files'].items() - }, - links={ - name: BundleLinkData( - name=name, - direct=Dependency(**link["direct"]), - indirect=[Dependency(**ind) for ind in link["indirect"]], - ) - for name, link in data['snapshot']['links'].items() - } - ) - - -def _draft_from_response(data): - """ - Given data about a Draft returned by any blockstore REST API, convert it to - a DraftData instance. - """ - return DraftData( - uuid=UUID(data['uuid']), - bundle_uuid=UUID(data['bundle_uuid']), - name=data['name'], - created_at=dateutil.parser.parse(data['staged_draft']['created_at']), - updated_at=dateutil.parser.parse(data['staged_draft']['updated_at']), - files={ - path: DraftFileData(path=path, **file) - for path, file in data['staged_draft']['files'].items() - }, - links={ - name: DraftLinkData( - name=name, - direct=Dependency(**link["direct"]), - indirect=[Dependency(**ind) for ind in link["indirect"]], - modified=link["modified"], - ) - for name, link in data['staged_draft']['links'].items() - } - ) - - -@toggle_blockstore_api -def get_collection(collection_uuid): - """ - Retrieve metadata about the specified collection - - Raises CollectionNotFound if the collection does not exist - """ - assert isinstance(collection_uuid, UUID) - try: - data = api_request('get', api_url('collections', str(collection_uuid))) - except NotFound: - raise CollectionNotFound(f"Collection {collection_uuid} does not exist.") # lint-amnesty, pylint: disable=raise-missing-from - return _collection_from_response(data) - - -@toggle_blockstore_api -def create_collection(title): - """ - Create a new collection. - """ - result = api_request('post', api_url('collections'), json={"title": title}) - return _collection_from_response(result) - - -@toggle_blockstore_api -def update_collection(collection_uuid, title): - """ - Update a collection's title - """ - assert isinstance(collection_uuid, UUID) - data = {"title": title} - result = api_request('patch', api_url('collections', str(collection_uuid)), json=data) - return _collection_from_response(result) - - -@toggle_blockstore_api -def delete_collection(collection_uuid): - """ - Delete a collection - """ - assert isinstance(collection_uuid, UUID) - api_request('delete', api_url('collections', str(collection_uuid))) - - -@toggle_blockstore_api -def get_bundles(uuids=None, text_search=None): - """ - Get the details of all bundles. - """ - query_params = {} - data = {} - if uuids: - # Potentially we could have a lot of libraries which will lead to 414 error (Request-URI Too Long) - # if sending uuids in the query_params. So we have to use the request data instead. - data = {'uuid': ','.join(map(str, uuids))} - if text_search: - query_params['text_search'] = text_search - version_url = api_url('bundles') + '?' + urlencode(query_params) - response = api_request('get', version_url, json=data) - # build bundle from response, convert map object to list and return - return [_bundle_from_response(item) for item in response] - - -@toggle_blockstore_api -def get_bundle(bundle_uuid): - """ - Retrieve metadata about the specified bundle - - Raises BundleNotFound if the bundle does not exist - """ - assert isinstance(bundle_uuid, UUID) - try: - data = api_request('get', api_url('bundles', str(bundle_uuid))) - except NotFound: - raise BundleNotFound(f"Bundle {bundle_uuid} does not exist.") # lint-amnesty, pylint: disable=raise-missing-from - return _bundle_from_response(data) - - -@toggle_blockstore_api -def create_bundle(collection_uuid, slug, title="New Bundle", description=""): - """ - Create a new bundle. - - Note that description is currently required. - """ - result = api_request('post', api_url('bundles'), json={ - "collection_uuid": str(collection_uuid), - "slug": slug, - "title": title, - "description": description, - }) - return _bundle_from_response(result) - - -@toggle_blockstore_api -def update_bundle(bundle_uuid, **fields): - """ - Update a bundle's title, description, slug, or collection. - """ - assert isinstance(bundle_uuid, UUID) - data = {} - # Most validation will be done by Blockstore, so we don't worry too much about data validation - for str_field in ("title", "description", "slug"): - if str_field in fields: - data[str_field] = fields.pop(str_field) - if "collection_uuid" in fields: - data["collection_uuid"] = str(fields.pop("collection_uuid")) - if fields: - raise ValueError(f"Unexpected extra fields passed " - f"to update_bundle: {fields.keys()}") - result = api_request('patch', api_url('bundles', str(bundle_uuid)), json=data) - return _bundle_from_response(result) - - -@toggle_blockstore_api -def delete_bundle(bundle_uuid): - """ - Delete a bundle - """ - assert isinstance(bundle_uuid, UUID) - api_request('delete', api_url('bundles', str(bundle_uuid))) - - -@toggle_blockstore_api -def get_draft(draft_uuid): - """ - Retrieve metadata about the specified draft. - If you don't know the draft's UUID, look it up using get_bundle() - """ - assert isinstance(draft_uuid, UUID) - try: - data = api_request('get', api_url('drafts', str(draft_uuid))) - except NotFound: - raise DraftNotFound(f"Draft does not exist: {draft_uuid}") # lint-amnesty, pylint: disable=raise-missing-from - return _draft_from_response(data) - - -@toggle_blockstore_api -def get_or_create_bundle_draft(bundle_uuid, draft_name): - """ - Retrieve metadata about the specified draft. - """ - bundle = get_bundle(bundle_uuid) - try: - return get_draft(bundle.drafts[draft_name]) # pylint: disable=unsubscriptable-object - except KeyError: - # The draft doesn't exist yet, so create it: - response = api_request('post', api_url('drafts'), json={ - "bundle_uuid": str(bundle_uuid), - "name": draft_name, - }) - # The result of creating a draft doesn't include all the fields we want, so retrieve it now: - return get_draft(UUID(response["uuid"])) - - -@toggle_blockstore_api -def commit_draft(draft_uuid): - """ - Commit all of the pending changes in the draft, creating a new version of - the associated bundle. - - Does not return any value. - """ - api_request('post', api_url('drafts', str(draft_uuid), 'commit')) - - -@toggle_blockstore_api -def delete_draft(draft_uuid): - """ - Delete the specified draft, removing any staged changes/files/deletes. - - Does not return any value. - """ - api_request('delete', api_url('drafts', str(draft_uuid))) - - -@toggle_blockstore_api -def get_bundle_version(bundle_uuid, version_number): - """ - Get the details of the specified bundle version - """ - if version_number == 0: - return None - version_url = api_url('bundle_versions', str(bundle_uuid) + ',' + str(version_number)) - return _bundle_version_from_response(api_request('get', version_url)) - - -@toggle_blockstore_api -def get_bundle_version_files(bundle_uuid, version_number): - """ - Get a list of the files in the specified bundle version - """ - if version_number == 0: - return [] - version_info = get_bundle_version(bundle_uuid, version_number) - return list(version_info.files.values()) - - -@toggle_blockstore_api -def get_bundle_version_links(bundle_uuid, version_number): - """ - Get a dictionary of the links in the specified bundle version - """ - if version_number == 0: - return {} - version_info = get_bundle_version(bundle_uuid, version_number) - return version_info.links - - -@toggle_blockstore_api -def get_bundle_files_dict(bundle_uuid, use_draft=None): - """ - Get a dict of all the files in the specified bundle. - - Returns a dict where the keys are the paths (strings) and the values are - BundleFileData or DraftFileData tuples. - """ - bundle = get_bundle(bundle_uuid) - if use_draft and use_draft in bundle.drafts: # pylint: disable=unsupported-membership-test - draft_uuid = bundle.drafts[use_draft] # pylint: disable=unsubscriptable-object - return get_draft(draft_uuid).files - elif not bundle.latest_version: - # This bundle has no versions so definitely does not contain any files - return {} - else: - return {file_meta.path: file_meta for file_meta in get_bundle_version_files(bundle_uuid, bundle.latest_version)} - - -@toggle_blockstore_api -def get_bundle_files(bundle_uuid, use_draft=None): - """ - Get an iterator over all the files in the specified bundle or draft. - """ - return get_bundle_files_dict(bundle_uuid, use_draft).values() - - -@toggle_blockstore_api -def get_bundle_links(bundle_uuid, use_draft=None): - """ - Get a dict of all the links in the specified bundle. - - Returns a dict where the keys are the link names (strings) and the values - are BundleLinkData or DraftLinkData tuples. - """ - bundle = get_bundle(bundle_uuid) - if use_draft and use_draft in bundle.drafts: # pylint: disable=unsupported-membership-test - draft_uuid = bundle.drafts[use_draft] # pylint: disable=unsubscriptable-object - return get_draft(draft_uuid).links - elif not bundle.latest_version: - # This bundle has no versions so definitely does not contain any links - return {} - else: - return get_bundle_version_links(bundle_uuid, bundle.latest_version) - - -@toggle_blockstore_api -def get_bundle_file_metadata(bundle_uuid, path, use_draft=None): - """ - Get the metadata of the specified file. - """ - assert isinstance(bundle_uuid, UUID) - files_dict = get_bundle_files_dict(bundle_uuid, use_draft=use_draft) - try: - return files_dict[path] - except KeyError: - raise BundleFileNotFound( # lint-amnesty, pylint: disable=raise-missing-from - f"Bundle {bundle_uuid} (draft: {use_draft}) does not contain a file {path}" - ) - - -@toggle_blockstore_api -def get_bundle_file_data(bundle_uuid, path, use_draft=None): - """ - Read all the data in the given bundle file and return it as a - binary string. - - Do not use this for large files! - """ - metadata = get_bundle_file_metadata(bundle_uuid, path, use_draft) - with requests.get(metadata.url, stream=True) as r: - return r.content - - -@toggle_blockstore_api -def write_draft_file(draft_uuid, path, contents): - """ - Create or overwrite the file at 'path' in the specified draft with the given - contents. To delete a file, pass contents=None. - - If you don't know the draft's UUID, look it up using - get_or_create_bundle_draft() - - Does not return anything. - """ - api_request('patch', api_url('drafts', str(draft_uuid)), json={ - 'files': { - path: _encode_str_for_draft(contents) if contents is not None else None, - }, - }) - - -@toggle_blockstore_api -def set_draft_link(draft_uuid, link_name, bundle_uuid, version): - """ - Create or replace the link with the given name in the specified draft so - that it points to the specified bundle version. To delete a link, pass - bundle_uuid=None, version=None. - - If you don't know the draft's UUID, look it up using - get_or_create_bundle_draft() - - Does not return anything. - """ - api_request('patch', api_url('drafts', str(draft_uuid)), json={ - 'links': { - link_name: {"bundle_uuid": str(bundle_uuid), "version": version} if bundle_uuid is not None else None, - }, - }) - - -def _encode_str_for_draft(input_str): - """ - Given a string, return UTF-8 representation that is then base64 encoded. - """ - if isinstance(input_str, str): - binary = input_str.encode('utf8') - else: - binary = input_str - return base64.b64encode(binary) - - -@toggle_blockstore_api -def force_browser_url(blockstore_file_url): - """ - Ensure that the given devstack URL is a URL accessible from the end user's browser. - """ - # Hack: on some devstacks, we must necessarily use different URLs for - # accessing Blockstore file data from within and outside of docker - # containers, but Blockstore has no way of knowing which case any particular - # request is for. So it always returns a URL suitable for use from within - # the container. Only this edxapp can transform the URL at the last second, - # knowing that in this case it's going to the user's browser and not being - # read by edxapp. - # In production, the same S3 URLs get used for internal and external access - # so this hack is not necessary. - return blockstore_file_url.replace('http://edx.devstack.blockstore:', 'http://localhost:') diff --git a/openedx/core/lib/blockstore_api/tests/base.py b/openedx/core/lib/blockstore_api/tests/base.py index 0888e8c81dc7..1d202d7671b5 100644 --- a/openedx/core/lib/blockstore_api/tests/base.py +++ b/openedx/core/lib/blockstore_api/tests/base.py @@ -1,17 +1,11 @@ """ Common code for tests that work with Blockstore """ -from unittest import mock, skipUnless +from unittest import mock from urllib.parse import urlparse -from django.conf import settings from django.test.client import RequestFactory -# Decorators for tests that require the blockstore service/app -requires_blockstore = skipUnless(settings.RUN_BLOCKSTORE_TESTS, "Requires a running Blockstore server") - -requires_blockstore_app = skipUnless(settings.BLOCKSTORE_USE_BLOCKSTORE_APP_API, "Requires blockstore app") - class BlockstoreAppTestMixin: """ diff --git a/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py b/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py index 9c15e16668d0..859b24e01d03 100644 --- a/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py +++ b/openedx/core/lib/blockstore_api/tests/test_blockstore_api.py @@ -10,8 +10,6 @@ from openedx.core.lib import blockstore_api as api from openedx.core.lib.blockstore_api.tests.base import ( BlockstoreAppTestMixin, - requires_blockstore, - requires_blockstore_app, ) # A fake UUID that won't represent any real bundle/draft/collection: @@ -197,14 +195,6 @@ def test_links(self): assert not api.get_bundle_links(course_bundle.uuid, use_draft=course_draft.name) -@requires_blockstore -class BlockstoreServiceApiClientTest(BlockstoreApiClientTestMixin, TestCase): - """ - Test the Blockstore API Client, using the standalone Blockstore service. - """ - - -@requires_blockstore_app class BlockstoreAppApiClientTest(BlockstoreApiClientTestMixin, BlockstoreAppTestMixin, TestCase): """ Test the Blockstore API Client, using the installed Blockstore app. diff --git a/requirements/constraints.txt b/requirements/constraints.txt index b4ff68f8f4dd..b175792a0321 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -23,7 +23,7 @@ click>=8.0,<9.0 # The team that owns this package will manually bump this package rather than having it pulled in automatically. # This is to allow them to better control its deployment and to do it in a process that works better # for them. -edx-enterprise==4.8.4 +edx-enterprise==4.8.10 # django-oauth-toolkit version >=2.0.0 has breaking changes. More details # mentioned on this issue https://github.com/openedx/edx-platform/issues/32884 diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 94a428fc95c6..e87a5ba02e97 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -474,7 +474,7 @@ edx-drf-extensions==9.0.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.8.4 +edx-enterprise==4.8.10 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/kernel.in @@ -786,7 +786,7 @@ openedx-mongodbproxy==0.2.0 # via -r requirements/edx/kernel.in optimizely-sdk==4.1.1 # via -r requirements/edx/bundled.in -ora2==6.0.10 +ora2==6.0.12 # via -r requirements/edx/bundled.in packaging==23.2 # via diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 5fb58a44c2ee..96257160d28e 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -755,7 +755,7 @@ edx-drf-extensions==9.0.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.8.4 +edx-enterprise==4.8.10 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/doc.txt @@ -1323,7 +1323,7 @@ optimizely-sdk==4.1.1 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt -ora2==6.0.10 +ora2==6.0.12 # via # -r requirements/edx/doc.txt # -r requirements/edx/testing.txt diff --git a/requirements/edx/doc.txt b/requirements/edx/doc.txt index d81c1c6166e6..ce5161edf894 100644 --- a/requirements/edx/doc.txt +++ b/requirements/edx/doc.txt @@ -552,7 +552,7 @@ edx-drf-extensions==9.0.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.8.4 +edx-enterprise==4.8.10 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt @@ -928,7 +928,7 @@ openedx-mongodbproxy==0.2.0 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via -r requirements/edx/base.txt -ora2==6.0.10 +ora2==6.0.12 # via -r requirements/edx/base.txt packaging==23.2 # via diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 562b0c8a0a88..b001a3273e98 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -580,7 +580,7 @@ edx-drf-extensions==9.0.0 # edx-when # edxval # openedx-learning -edx-enterprise==4.8.4 +edx-enterprise==4.8.10 # via # -c requirements/edx/../constraints.txt # -r requirements/edx/base.txt @@ -988,7 +988,7 @@ openedx-mongodbproxy==0.2.0 # via -r requirements/edx/base.txt optimizely-sdk==4.1.1 # via -r requirements/edx/base.txt -ora2==6.0.10 +ora2==6.0.12 # via -r requirements/edx/base.txt packaging==23.2 # via diff --git a/xmodule/library_tools.py b/xmodule/library_tools.py index 6d8106caeaf3..0e3c3af51063 100644 --- a/xmodule/library_tools.py +++ b/xmodule/library_tools.py @@ -185,7 +185,7 @@ def list_available_libraries(self): for lib in self.store.get_library_summaries() ] v2_query = library_api.get_libraries_for_user(user) - v2_libs_with_meta = library_api.get_metadata_from_index(v2_query) + v2_libs_with_meta = library_api.get_metadata(v2_query) v2_libs = [(lib.key, lib.title) for lib in v2_libs_with_meta] if settings.FEATURES.get('ENABLE_LIBRARY_AUTHORING_MICROFRONTEND'):