diff --git a/AUTHORS b/AUTHORS index e2ec83c3bf63..3f6af3d3758a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -141,3 +141,4 @@ William Desloge Marco Re Jonas Jelten Christine Lytwynec +John Cox diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 42156ede4057..b3a6331f7ffa 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,11 @@ These are notable changes in edx-platform. This is a rolling list of changes, in roughly chronological order, most recent first. Add your entries at or near the top. Include a label indicating the component affected. +Common: Add extensible third-party auth module. + +Blades: Handle situation if no response were sent from XQueue to LMS in Matlab +problem after Run Code button press. BLD-994. + Blades: Set initial video quality to large instead of default to avoid automatic switch to HD when iframe resizes. BLD-981. Blades: Add an upload button for authors to provide students with an option to diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 8c76a85e2aec..2d1af894cf46 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -4,9 +4,11 @@ Contributing to edx-platform Contributions to edx-platform are very welcome, and strongly encouraged! The easiest way is to fork the repo and then make a pull request from your fork. -Read on for details on how to become a contributor, edx-platform code quality, -testing, making a pull request, and more. +Check out our `process documentation`_, or read on for details on how to +become a contributor, edx-platform code quality, testing, making a pull +request, and more. +.. _process documentation: https://github.com/edx/edx-platform/blob/master/docs/en_us/developers/source/process/index.rst Becoming a Contributor ====================== diff --git a/cms/djangoapps/contentstore/features/textbooks.feature b/cms/djangoapps/contentstore/features/textbooks.feature index 85c9ee12a7fb..79b6c66d52e4 100644 --- a/cms/djangoapps/contentstore/features/textbooks.feature +++ b/cms/djangoapps/contentstore/features/textbooks.feature @@ -19,9 +19,9 @@ Feature: CMS.Textbooks And I upload the textbook "textbook.pdf" And I wait for "2" seconds And I save the textbook - Then I should see a textbook named "Economics" with a chapter path containing "/c4x/MITx/999/asset/textbook.pdf" + Then I should see a textbook named "Economics" with a chapter path containing "/static/textbook.pdf" And I reload the page - Then I should see a textbook named "Economics" with a chapter path containing "/c4x/MITx/999/asset/textbook.pdf" + Then I should see a textbook named "Economics" with a chapter path containing "/static/textbook.pdf" Scenario: Create a textbook with multiple chapters Given I have opened a new course in Studio diff --git a/cms/djangoapps/contentstore/features/video.py b/cms/djangoapps/contentstore/features/video.py index a19d7c2e6768..9e7b2f3151f7 100644 --- a/cms/djangoapps/contentstore/features/video.py +++ b/cms/djangoapps/contentstore/features/video.py @@ -37,8 +37,6 @@ def configure_youtube_api(_step, action): @step('I have created a Video component$') def i_created_a_video_component(_step): - assert_less(world.youtube.config['youtube_api_response'].status_code, 400, "Real Youtube server is unavailable") - world.create_course_with_unit() world.create_component_instance( step=_step, diff --git a/cms/djangoapps/contentstore/management/commands/import.py b/cms/djangoapps/contentstore/management/commands/import.py index bb410105802f..724886621d88 100644 --- a/cms/djangoapps/contentstore/management/commands/import.py +++ b/cms/djangoapps/contentstore/management/commands/import.py @@ -53,5 +53,5 @@ def handle(self, *args, **options): for module in course_items: course_id = module.location.course_id if not are_permissions_roles_seeded(course_id): - self.stdout.write('Seeding forum roles for course {0}'.format(course_id)) + self.stdout.write('Seeding forum roles for course {0}\n'.format(course_id)) seed_permissions_roles(course_id) diff --git a/cms/djangoapps/contentstore/management/commands/tests/test_import.py b/cms/djangoapps/contentstore/management/commands/tests/test_import.py index 3a3cac70d11e..055d132f1201 100644 --- a/cms/djangoapps/contentstore/management/commands/tests/test_import.py +++ b/cms/djangoapps/contentstore/management/commands/tests/test_import.py @@ -12,6 +12,7 @@ from contentstore.tests.modulestore_config import TEST_MODULESTORE from django_comment_common.utils import are_permissions_roles_seeded +from xmodule.modulestore.django import modulestore from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase @@ -22,6 +23,7 @@ class TestImport(ModuleStoreTestCase): """ COURSE_ID = ['EDx', '0.00x', '2013_Spring', ] + DIFF_RUN = ['EDx', '0.00x', '2014_Spring', ] def setUp(self): """ @@ -41,6 +43,16 @@ def setUp(self): with open(os.path.join(self.good_dir, "course", "{0[2]}.xml".format(self.COURSE_ID)), "w+") as f: f.write('') + # Create run changed course xml + self.dupe_dir = tempfile.mkdtemp(dir=self.content_dir) + os.makedirs(os.path.join(self.dupe_dir, "course")) + with open(os.path.join(self.dupe_dir, "course.xml"), "w+") as f: + f.write(''.format(self.DIFF_RUN)) + + with open(os.path.join(self.dupe_dir, "course", "{0[2]}.xml".format(self.DIFF_RUN)), "w+") as f: + f.write('') + def test_forum_seed(self): """ Tests that forum roles were created with import. @@ -48,3 +60,18 @@ def test_forum_seed(self): self.assertFalse(are_permissions_roles_seeded('/'.join(self.COURSE_ID))) call_command('import', self.content_dir, self.good_dir) self.assertTrue(are_permissions_roles_seeded('/'.join(self.COURSE_ID))) + + def test_duplicate_with_url(self): + """ + Check to make sure an import doesn't import courses that have the + same org and course, but they have different runs in order to + prevent modulestore "findone" exceptions on deletion + """ + # Load up base course and verify it is available + call_command('import', self.content_dir, self.good_dir) + store = modulestore() + self.assertIsNotNone(store.get_course('/'.join(self.COURSE_ID))) + + # Now load up duped course and verify it doesn't load + call_command('import', self.content_dir, self.dupe_dir) + self.assertIsNone(store.get_course('/'.join(self.DIFF_RUN))) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index 6d6fe3215567..2539a4efbfd0 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -1809,10 +1809,10 @@ def test_import_into_new_course_id(self): # first check PDF textbooks, to make sure the url paths got updated course_module = module_store.get_instance(target_course_id, target_location) - self.assertEquals(len(course_module.pdf_textbooks), 1) - self.assertEquals(len(course_module.pdf_textbooks[0]["chapters"]), 2) - self.assertEquals(course_module.pdf_textbooks[0]["chapters"][0]["url"], '/c4x/MITx/999/asset/Chapter1.pdf') - self.assertEquals(course_module.pdf_textbooks[0]["chapters"][1]["url"], '/c4x/MITx/999/asset/Chapter2.pdf') + self.assertEqual(len(course_module.pdf_textbooks), 1) + self.assertEqual(len(course_module.pdf_textbooks[0]["chapters"]), 2) + self.assertEqual(course_module.pdf_textbooks[0]["chapters"][0]["url"], '/static/Chapter1.pdf') + self.assertEqual(course_module.pdf_textbooks[0]["chapters"][1]["url"], '/static/Chapter2.pdf') def test_import_into_new_course_id_wiki_slug_renamespacing(self): module_store = modulestore('direct') diff --git a/cms/envs/bok_choy.py b/cms/envs/bok_choy.py index a3411dc7a8b2..526f404d70a4 100644 --- a/cms/envs/bok_choy.py +++ b/cms/envs/bok_choy.py @@ -49,3 +49,9 @@ # Unfortunately, we need to use debug mode to serve staticfiles DEBUG = True + +# Point the URL used to test YouTube availability to our stub YouTube server +YOUTUBE_PORT = 9080 +YOUTUBE['API'] = "127.0.0.1:{0}/get_youtube_api/".format(YOUTUBE_PORT) +YOUTUBE['TEST_URL'] = "127.0.0.1:{0}/test_youtube/".format(YOUTUBE_PORT) +YOUTUBE['TEXT_API']['url'] = "127.0.0.1:{0}/test_transcripts_youtube/".format(YOUTUBE_PORT) diff --git a/cms/static/js/views/edit_chapter.js b/cms/static/js/views/edit_chapter.js index 2a6fcf4b6026..c15eb1b19f94 100644 --- a/cms/static/js/views/edit_chapter.js +++ b/cms/static/js/views/edit_chapter.js @@ -65,7 +65,7 @@ define(["js/views/baseview", "underscore", "underscore.string", "jquery", "gette if(!that.model.get('name')) { options.name = response.asset.displayname; } - options.asset_path = response.asset.url; + options.asset_path = response.asset.portable_url; that.model.set(options); } }); diff --git a/cms/static/js/views/modals/edit_xblock.js b/cms/static/js/views/modals/edit_xblock.js index c6c5ec107855..0e5e83fbefa5 100644 --- a/cms/static/js/views/modals/edit_xblock.js +++ b/cms/static/js/views/modals/edit_xblock.js @@ -135,6 +135,12 @@ define(["jquery", "underscore", "gettext", "js/views/modals/base_modal", var parent = $(event.target.parentElement), mode = parent.data('mode'); event.preventDefault(); + var $cheatsheet = $('.simple-editor-cheatsheet'); + if ($cheatsheet.hasClass("shown")) { + $(".CodeMirror").removeAttr("style"); + $(".modal-content").removeAttr("style"); + $cheatsheet.removeClass('shown'); + } this.selectMode(mode); }, diff --git a/cms/static/js/views/xblock.js b/cms/static/js/views/xblock.js index 0a7f3ce4bbad..7b2a0dff5785 100644 --- a/cms/static/js/views/xblock.js +++ b/cms/static/js/views/xblock.js @@ -25,18 +25,23 @@ define(["jquery", "underscore", "js/views/baseview", "xblock/runtime.v1"], }, handleXBlockFragment: function(fragment, options) { - var wrapper = this.$el, + var self = this, + wrapper = this.$el, xblockElement, success = options ? options.success : null, - xblock; - this.renderXBlockFragment(fragment, wrapper); - xblockElement = this.$('.xblock').first(); - xblock = XBlock.initializeBlock(xblockElement); - this.xblock = xblock; - this.xblockReady(xblock); - if (success) { - success(xblock); - } + xblock, + fragmentsRendered; + + fragmentsRendered = this.renderXBlockFragment(fragment, wrapper); + fragmentsRendered.done(function() { + xblockElement = self.$('.xblock').first(); + xblock = XBlock.initializeBlock(xblockElement); + self.xblock = xblock; + self.xblockReady(xblock); + if (success) { + success(xblock); + } + }); }, /** diff --git a/common/djangoapps/student/models.py b/common/djangoapps/student/models.py index fc6ea6e344dc..6dd5e7e00420 100644 --- a/common/djangoapps/student/models.py +++ b/common/djangoapps/student/models.py @@ -22,6 +22,7 @@ from django.conf import settings from django.utils import timezone +from django.utils.dateparse import parse_datetime from django.contrib.auth.models import User from django.contrib.auth.hashers import make_password from django.contrib.auth.signals import user_logged_in, user_logged_out @@ -392,6 +393,16 @@ def is_student_forced_password_reset_enabled(cls): 'MIN_DAYS_FOR_STUDENT_ACCOUNTS_PASSWORD_RESETS', None ) + @classmethod + def is_password_reset_time_defined(cls): + """ + Returns whether on not a time is defined for how old a password can be. + """ + return settings.FEATURES['ADVANCED_SECURITY'] and \ + settings.ADVANCED_SECURITY_CONFIG.get( + 'OLDEST_VALID_PASSWORD_TIME', None + ) + @classmethod def should_user_reset_password_now(cls, user): """ @@ -410,7 +421,7 @@ def should_user_reset_password_now(cls, user): days_before_password_reset = \ settings.ADVANCED_SECURITY_CONFIG['MIN_DAYS_FOR_STUDENT_ACCOUNTS_PASSWORD_RESETS'] - if days_before_password_reset: + if days_before_password_reset or cls.is_password_reset_time_defined(): history = PasswordHistory.objects.filter(user=user).order_by('-time_set') time_last_reset = None @@ -423,6 +434,12 @@ def should_user_reset_password_now(cls, user): now = timezone.now() + if cls.is_password_reset_time_defined(): + naive_time = parse_datetime(settings.ADVANCED_SECURITY_CONFIG['OLDEST_VALID_PASSWORD_TIME']) + oldest_valid = timezone.get_current_timezone().localize(naive_time) + delta = time_last_reset - oldest_valid + return delta.days < 0 + delta = now - time_last_reset return delta.days >= days_before_password_reset diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index d2e8b32d6b25..34c30c45035a 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -16,6 +16,7 @@ from django.contrib.auth.models import User, AnonymousUser from django.contrib.auth.decorators import login_required from django.contrib.auth.views import password_reset_confirm +from django.contrib import messages from django.core.cache import cache from django.core.context_processors import csrf from django.core.mail import send_mail @@ -85,6 +86,8 @@ validate_password_dictionary ) +from third_party_auth import pipeline, provider + log = logging.getLogger("edx.student") AUDIT_LOG = logging.getLogger("audit") @@ -363,11 +366,16 @@ def signin_user(request): context = { 'course_id': request.GET.get('course_id'), 'enrollment_action': request.GET.get('enrollment_action'), + # Bool injected into JS to submit form if we're inside a running third- + # party auth pipeline; distinct from the actual instance of the running + # pipeline, if any. + 'pipeline_running': 'true' if pipeline.running(request) else 'false', 'platform_name': microsite.get_value( 'platform_name', settings.PLATFORM_NAME ), } + return render_to_response('login.html', context) @@ -385,17 +393,34 @@ def register_user(request, extra_context=None): context = { 'course_id': request.GET.get('course_id'), + 'email': '', 'enrollment_action': request.GET.get('enrollment_action'), + 'name': '', + 'running_pipeline': None, 'platform_name': microsite.get_value( 'platform_name', settings.PLATFORM_NAME ), + 'selected_provider': '', + 'username': '', } + if extra_context is not None: context.update(extra_context) if context.get("extauth_domain", '').startswith(external_auth.views.SHIBBOLETH_DOMAIN_PREFIX): return render_to_response('register-shib.html', context) + + # If third-party auth is enabled, prepopulate the form with data from the + # selected provider. + if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH') and pipeline.running(request): + running_pipeline = pipeline.get(request) + current_provider = provider.Registry.get_by_backend_name(running_pipeline.get('backend')) + overrides = current_provider.get_register_form_data(running_pipeline.get('kwargs')) + overrides['running_pipeline'] = running_pipeline + overrides['selected_provider'] = current_provider.NAME + context.update(overrides) + return render_to_response('register.html', context) @@ -532,8 +557,17 @@ def dashboard(request): 'language_options': language_options, 'current_language': current_language, 'current_language_code': cur_lang_code, + 'user': user, + 'duplicate_provider': None, + 'logout_url': reverse(logout_user), + 'platform_name': settings.PLATFORM_NAME, + 'provider_states': [], } + if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): + context['duplicate_provider'] = pipeline.get_duplicate_provider(messages.get_messages(request)) + context['provider_user_states'] = pipeline.get_provider_user_states(user) + return render_to_response('dashboard.html', context) @@ -690,6 +724,7 @@ def accounts_login(request): return external_auth.views.course_specific_login(request, course_id) context = { + 'pipeline_running': 'false', 'platform_name': settings.PLATFORM_NAME, } return render_to_response('login.html', context) @@ -697,24 +732,62 @@ def accounts_login(request): # Need different levels of logging @ensure_csrf_cookie -def login_user(request, error=""): +def login_user(request, error=""): # pylint: disable-msg=too-many-statements,unused-argument """AJAX request to log in the user.""" - if 'email' not in request.POST or 'password' not in request.POST: - return JsonResponse({ - "success": False, - "value": _('There was an error receiving your login information. Please email us.'), # TODO: User error message - }) # TODO: this should be status code 400 # pylint: disable=fixme - email = request.POST['email'] - password = request.POST['password'] - try: - user = User.objects.get(email=email) - except User.DoesNotExist: - if settings.FEATURES['SQUELCH_PII_IN_LOGS']: - AUDIT_LOG.warning(u"Login failed - Unknown user email") - else: - AUDIT_LOG.warning(u"Login failed - Unknown user email: {0}".format(email)) - user = None + backend_name = None + email = None + password = None + redirect_url = None + response = None + running_pipeline = None + third_party_auth_requested = settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH') and pipeline.running(request) + third_party_auth_successful = False + trumped_by_first_party_auth = bool(request.POST.get('email')) or bool(request.POST.get('password')) + user = None + + if third_party_auth_requested and not trumped_by_first_party_auth: + # The user has already authenticated via third-party auth and has not + # asked to do first party auth by supplying a username or password. We + # now want to put them through the same logging and cookie calculation + # logic as with first-party auth. + running_pipeline = pipeline.get(request) + username = running_pipeline['kwargs'].get('username') + backend_name = running_pipeline['backend'] + requested_provider = provider.Registry.get_by_backend_name(backend_name) + + try: + user = pipeline.get_authenticated_user(username, backend_name) + third_party_auth_successful = True + except User.DoesNotExist: + AUDIT_LOG.warning( + u'Login failed - user with username {username} has no social auth with backend_name {backend_name}'.format( + username=username, backend_name=backend_name)) + return JsonResponse({ + "success": False, + # Translators: provider_name is the name of an external, third-party user authentication service (like + # Google or LinkedIn). + "value": _('There is no {platform_name} account associated with your {provider_name} account. Please use your {platform_name} credentials or pick another provider.').format( + platform_name=settings.PLATFORM_NAME, provider_name=requested_provider.NAME) + }) # TODO: this should be a status code 401 # pylint: disable=fixme + + else: + + if 'email' not in request.POST or 'password' not in request.POST: + return JsonResponse({ + "success": False, + "value": _('There was an error receiving your login information. Please email us.'), # TODO: User error message + }) # TODO: this should be status code 400 # pylint: disable=fixme + + email = request.POST['email'] + password = request.POST['password'] + try: + user = User.objects.get(email=email) + except User.DoesNotExist: + if settings.FEATURES['SQUELCH_PII_IN_LOGS']: + AUDIT_LOG.warning(u"Login failed - Unknown user email") + else: + AUDIT_LOG.warning(u"Login failed - Unknown user email: {0}".format(email)) # check if the user has a linked shibboleth account, if so, redirect the user to shib-login # This behavior is pretty much like what gmail does for shibboleth. Try entering some @stanford.edu @@ -753,14 +826,17 @@ def login_user(request, error=""): # username so that authentication is guaranteed to fail and we can take # advantage of the ratelimited backend username = user.username if user else "" - try: - user = authenticate(username=username, password=password, request=request) - # this occurs when there are too many attempts from the same IP address - except RateLimitException: - return JsonResponse({ - "success": False, - "value": _('Too many failed login attempts. Try again later.'), - }) # TODO: this should be status code 429 # pylint: disable=fixme + + if not third_party_auth_successful: + try: + user = authenticate(username=username, password=password, request=request) + # this occurs when there are too many attempts from the same IP address + except RateLimitException: + return JsonResponse({ + "success": False, + "value": _('Too many failed login attempts. Try again later.'), + }) # TODO: this should be status code 429 # pylint: disable=fixme + if user is None: # tick the failed login counters if the user exists in the database if user_found_by_email_lookup and LoginFailures.is_feature_enabled(): @@ -801,7 +877,9 @@ def login_user(request, error=""): redirect_url = try_change_enrollment(request) - dog_stats_api.increment("common.student.successful_login") + if third_party_auth_successful: + redirect_url = pipeline.get_complete_url(backend_name) + response = JsonResponse({ "success": True, "redirect_url": redirect_url, @@ -1027,16 +1105,20 @@ def _do_create_account(post_vars): @ensure_csrf_cookie -def create_account(request, post_override=None): +def create_account(request, post_override=None): # pylint: disable-msg=too-many-statements """ JSON call to create new edX account. Used by form in signup_modal.html, which is included into navigation.html """ - js = {'success': False} + js = {'success': False} # pylint: disable-msg=invalid-name post_vars = post_override if post_override else request.POST extra_fields = getattr(settings, 'REGISTRATION_EXTRA_FIELDS', {}) + if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH') and pipeline.running(request): + post_vars = dict(post_vars.items()) + post_vars.update({'password': pipeline.make_random_password()}) + # if doing signup for an external authorization, then get email, password, name from the eamap # don't use the ones from the form, since the user could have hacked those # unless originally we didn't get a valid email or name from the external auth @@ -1234,9 +1316,17 @@ def create_account(request, post_override=None): login_user.save() AUDIT_LOG.info(u"Login activated on extauth account - {0} ({1})".format(login_user.username, login_user.email)) + dog_stats_api.increment("common.student.account_created") + redirect_url = try_change_enrollment(request) + + # Resume the third-party-auth pipeline if necessary. + if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH') and pipeline.running(request): + running_pipeline = pipeline.get(request) + redirect_url = pipeline.get_complete_url(running_pipeline['backend']) + response = JsonResponse({ 'success': True, - 'redirect_url': try_change_enrollment(request), + 'redirect_url': redirect_url, }) # set the login cookie for the edx marketing site diff --git a/common/djangoapps/terrain/start_stubs.py b/common/djangoapps/terrain/start_stubs.py index a4dd93ad4c06..f1ce715bcddb 100644 --- a/common/djangoapps/terrain/start_stubs.py +++ b/common/djangoapps/terrain/start_stubs.py @@ -1,7 +1,6 @@ """ Initialize and teardown stub and video HTTP services for use in acceptance tests. """ -import requests from lettuce import before, after, world from django.conf import settings from terrain.stubs.youtube import StubYouTubeService @@ -16,8 +15,6 @@ "lti": {"port": settings.LTI_PORT, "class": StubLtiService}, } -YOUTUBE_API_RESPONSE = requests.get('http://www.youtube.com/iframe_api') - @before.all # pylint: disable=E1101 def start_video_server(): @@ -49,8 +46,6 @@ def start_stubs(_scenario): """ for name, service in SERVICES.iteritems(): fake_server = service['class'](port_num=service['port']) - if name == 'youtube': - fake_server.config['youtube_api_response'] = YOUTUBE_API_RESPONSE setattr(world, name, fake_server) diff --git a/common/djangoapps/terrain/stubs/comments.py b/common/djangoapps/terrain/stubs/comments.py index eaca957935ec..80d209abf441 100644 --- a/common/djangoapps/terrain/stubs/comments.py +++ b/common/djangoapps/terrain/stubs/comments.py @@ -8,8 +8,14 @@ class StubCommentsServiceHandler(StubHttpRequestHandler): + + @property + def _params(self): + return urlparse.parse_qs(urlparse.urlparse(self.path).query) + def do_GET(self): pattern_handlers = { + "/api/v1/users/(?P\\d+)/active_threads$": self.do_user_profile, "/api/v1/users/(?P\\d+)$": self.do_user, "/api/v1/threads$": self.do_threads, "/api/v1/threads/(?P\\w+)$": self.do_thread, @@ -34,12 +40,34 @@ def do_DELETE(self): self.send_json_response({}) def do_user(self, user_id): - self.send_json_response({ + response = { "id": user_id, "upvoted_ids": [], "downvoted_ids": [], "subscribed_thread_ids": [], - }) + } + if 'course_id' in self._params: + response.update({ + "threads_count": 1, + "comments_count": 2 + }) + self.send_json_response(response) + + def do_user_profile(self, user_id): + if 'active_threads' in self.server.config: + user_threads = self.server.config['active_threads'][:] + params = self._params + page = int(params.get("page", ["1"])[0]) + per_page = int(params.get("per_page", ["20"])[0]) + num_pages = max(len(user_threads) - 1, 1) / per_page + 1 + user_threads = user_threads[(page - 1) * per_page:page * per_page] + self.send_json_response({ + "collection": user_threads, + "page": page, + "num_pages": num_pages + }) + else: + self.send_response(404, content="404 Not Found") def do_thread(self, thread_id): if thread_id in self.server.config.get('threads', {}): diff --git a/common/djangoapps/terrain/stubs/tests/test_youtube_stub.py b/common/djangoapps/terrain/stubs/tests/test_youtube_stub.py index e2603a82fe8b..aded4808f0c9 100644 --- a/common/djangoapps/terrain/stubs/tests/test_youtube_stub.py +++ b/common/djangoapps/terrain/stubs/tests/test_youtube_stub.py @@ -60,3 +60,17 @@ def test_transcript_url_not_equal(self): def test_transcript_not_found(self): response = requests.get(self.url + 'test_transcripts_youtube/some_id') self.assertEqual(404, response.status_code) + + def test_reset_configuration(self): + + reset_config_url = self.url + 'del_config' + + # add some configuration data + self.server.config['test_reset'] = 'This is a reset config test' + + # reset server configuration + response = requests.delete(reset_config_url) + self.assertEqual(response.status_code, 200) + + # ensure that server config dict is empty after successful reset + self.assertEqual(self.server.config, {}) diff --git a/common/djangoapps/terrain/stubs/youtube.py b/common/djangoapps/terrain/stubs/youtube.py index a5b5db864497..d165fdee2cef 100644 --- a/common/djangoapps/terrain/stubs/youtube.py +++ b/common/djangoapps/terrain/stubs/youtube.py @@ -17,6 +17,7 @@ you get "Unused url" message inside the browser. """ +import textwrap from .http import StubHttpRequestHandler, StubHttpService import json import time @@ -25,6 +26,17 @@ from collections import OrderedDict +IFRAME_API_RESPONSE = textwrap.dedent( + "if (!window['YT']) {var YT = {loading: 0,loaded: 0};}if (!window['YTConfig']) {var YTConfig" + " = {};}if (!YT.loading) {YT.loading = 1;(function(){var l = [];YT.ready = function(f) {if (" + "YT.loaded) {f();} else {l.push(f);}};window.onYTReady = function() {YT.loaded = 1;for (var " + "i = 0; i < l.length; i++) {try {l[i]();} catch (e) {}}};YT.setConfig = function(c) {for (var" + " k in c) {if (c.hasOwnProperty(k)) {YTConfig[k] = c[k];}}};var a = document.createElement" + "('script');a.id = 'www-widgetapi-script';a.src = 'http:' + '" + "//s.ytimg.com/yts/jsbin/www-widgetapi-vflxHr_AR.js';a.async = true;var b = " + "document.getElementsByTagName('script')[0];b.parentNode.insertBefore(a, b);})();}") + + class StubYouTubeHandler(StubHttpRequestHandler): """ A handler for Youtube GET requests. @@ -33,6 +45,17 @@ class StubYouTubeHandler(StubHttpRequestHandler): # Default number of seconds to delay the response to simulate network latency. DEFAULT_DELAY_SEC = 0.5 + def do_DELETE(self): # pylint: disable=C0103 + """ + Allow callers to delete all the server configurations using the /del_config URL. + """ + if self.path == "/del_config" or self.path == "/del_config/": + self.server.config = dict() + self.log_message("Reset Server Configuration.") + self.send_response(200) + else: + self.send_response(404) + def do_GET(self): """ Handle a GET request from the client and sends response back. @@ -80,8 +103,7 @@ def do_GET(self): if self.server.config.get('youtube_api_blocked'): self.send_response(404, content='', headers={'Content-type': 'text/plain'}) else: - response = self.server.config['youtube_api_response'] - self.send_response(200, content=response.text, headers={'Content-type': 'text/html'}) + self.send_response(200, content=IFRAME_API_RESPONSE, headers={'Content-type': 'text/html'}) else: self.send_response( diff --git a/common/djangoapps/third_party_auth/middleware.py b/common/djangoapps/third_party_auth/middleware.py new file mode 100644 index 000000000000..677534d0fc1a --- /dev/null +++ b/common/djangoapps/third_party_auth/middleware.py @@ -0,0 +1,18 @@ +"""Middleware classes for third_party_auth.""" + +from social.apps.django_app.middleware import SocialAuthExceptionMiddleware + +from . import pipeline + + +class ExceptionMiddleware(SocialAuthExceptionMiddleware): + """Custom middleware that handles conditional redirection.""" + + def get_redirect_uri(self, request, exception): + # Safe because it's already been validated by + # pipeline.parse_query_params. If that pipeline step ever moves later + # in the pipeline stack, we'd need to validate this value because it + # would be an injection point for attacker data. + auth_entry = request.session.get(pipeline.AUTH_ENTRY_KEY) + # Fall back to django settings's SOCIAL_AUTH_LOGIN_ERROR_URL. + return '/' + auth_entry if auth_entry else super(ExceptionMiddleware, self).get_redirect_uri(request, exception) diff --git a/common/djangoapps/third_party_auth/pipeline.py b/common/djangoapps/third_party_auth/pipeline.py index 1f9c56906c19..3da391c729f9 100644 --- a/common/djangoapps/third_party_auth/pipeline.py +++ b/common/djangoapps/third_party_auth/pipeline.py @@ -1,9 +1,362 @@ -"""Auth pipeline definitions.""" +"""Auth pipeline definitions. +Auth pipelines handle the process of authenticating a user. They involve a +consumer system and a provider service. The general pattern is: + + 1. The consumer system exposes a URL endpoint that starts the process. + 2. When a user visits that URL, the client system redirects the user to a + page served by the provider. The user authenticates with the provider. + The provider handles authentication failure however it wants. + 3. On success, the provider POSTs to a URL endpoint on the consumer to + invoke the pipeline. It sends back an arbitrary payload of data about + the user. + 4. The pipeline begins, executing each function in its stack. The stack is + defined on django's settings object's SOCIAL_AUTH_PIPELINE. This is done + in settings._set_global_settings. + 5. Each pipeline function is variadic. Most pipeline functions are part of + the pythons-social-auth library; our extensions are defined below. The + pipeline is the same no matter what provider is used. + 6. Pipeline functions can return a dict to add arguments to the function + invoked next. They can return None if this is not necessary. + 7. Pipeline functions may be decorated with @partial.partial. This pauses + the pipeline and serializes its state onto the request's session. When + this is done they may redirect to other edX handlers to execute edX + account registration/sign in code. + 8. In that code, redirecting to get_complete_url() resumes the pipeline. + This happens by hitting a handler exposed by the consumer system. + 9. In this way, execution moves between the provider, the pipeline, and + arbitrary consumer system code. + +Gotcha alert!: + +Bear in mind that when pausing and resuming a pipeline function decorated with +@partial.partial, execution resumes by re-invoking the decorated function +instead of invoking the next function in the pipeline stack. For example, if +you have a pipeline of + + A + B + C + +with an implementation of + + @partial.partial + def B(*args, **kwargs): + [...] + +B will be invoked twice: once when initially proceeding through the pipeline +before it is paused, and once when other code finishes and the pipeline +resumes. Consequently, many decorated functions will first invoke a predicate +to determine if they are in their first or second execution (usually by +checking side-effects from the first run). + +This is surprising but important behavior, since it allows a single function in +the pipeline to consolidate all the operations needed to establish invariants +rather than spreading them across two functions in the pipeline. + +See http://psa.matiasaguirre.net/docs/pipeline.html for more docs. +""" + +import random +import string # pylint: disable-msg=deprecated-module + +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse +from django.shortcuts import redirect +from social.apps.django_app.default import models +from social.exceptions import AuthException from social.pipeline import partial +from . import provider + + +AUTH_ENTRY_KEY = 'auth_entry' +AUTH_ENTRY_DASHBOARD = 'dashboard' +AUTH_ENTRY_LOGIN = 'login' +AUTH_ENTRY_REGISTER = 'register' +_AUTH_ENTRY_CHOICES = frozenset([ + AUTH_ENTRY_DASHBOARD, + AUTH_ENTRY_LOGIN, + AUTH_ENTRY_REGISTER +]) +_DEFAULT_RANDOM_PASSWORD_LENGTH = 12 +_PASSWORD_CHARSET = string.letters + string.digits + + +class AuthEntryError(AuthException): + """Raised when auth_entry is missing or invalid on URLs. + + auth_entry tells us whether the auth flow was initiated to register a new + user (in which case it has the value of AUTH_ENTRY_REGISTER) or log in an + existing user (in which case it has the value of AUTH_ENTRY_LOGIN). + + This is necessary because the edX code we hook into the pipeline to + redirect to the existing auth flows needs to know what case we are in in + order to format its output correctly (for example, the register code is + invoked earlier than the login code, and it needs to know if the login flow + was requested to dispatch correctly). + """ + + +class ProviderUserState(object): + """Object representing the provider state (attached or not) for a user. + + This is intended only for use when rendering templates. See for example + lms/templates/dashboard.html. + """ + + def __init__(self, enabled_provider, user, state): + # Boolean. Whether the user has an account associated with the provider + self.has_account = state + # provider.BaseProvider child. Callers must verify that the provider is + # enabled. + self.provider = enabled_provider + # django.contrib.auth.models.User. + self.user = user + + def get_unlink_form_name(self): + """Gets the name used in HTML forms that unlink a provider account.""" + return self.provider.NAME + '_unlink_form' + + +def get(request): + """Gets the running pipeline from the passed request.""" + return request.session.get('partial_pipeline') + + +def get_authenticated_user(username, backend_name): + """Gets a saved user authenticated by a particular backend. + + Between pipeline steps User objects are not saved. We need to reconstitute + the user and set its .backend, which is ordinarily monkey-patched on by + Django during authenticate(), so it will function like a user returned by + authenticate(). + + Args: + username: string. Username of user to get. + backend_name: string. The name of the third-party auth backend from + the running pipeline. + + Returns: + User if user is found and has a social auth from the passed + backend_name. + + Raises: + User.DoesNotExist: if no user matching user is found, or the matching + user has no social auth associated with the given backend. + AssertionError: if the user is not authenticated. + """ + user = models.DjangoStorage.user.user_model().objects.get(username=username) + match = models.DjangoStorage.user.get_social_auth_for_user(user, provider=backend_name) + + if not match: + raise User.DoesNotExist + + user.backend = provider.Registry.get_by_backend_name(backend_name).get_authentication_backend() + return user + + +def _get_enabled_provider_by_name(provider_name): + """Gets an enabled provider by its NAME member or throws.""" + enabled_provider = provider.Registry.get(provider_name) + + if not enabled_provider: + raise ValueError('Provider %s not enabled' % provider_name) + + return enabled_provider + + +def _get_url(view_name, backend_name, auth_entry=None): + """Creates a URL to hook into social auth endpoints.""" + kwargs = {'backend': backend_name} + url = reverse(view_name, kwargs=kwargs) + + if auth_entry: + url += '?%s=%s' % (AUTH_ENTRY_KEY, auth_entry) + + return url + + +def get_complete_url(backend_name): + """Gets URL for the endpoint that returns control to the auth pipeline. + + Args: + backend_name: string. Name of the python-social-auth backend from the + currently-running pipeline. + + Returns: + String. URL that finishes the auth pipeline for a provider. + + Raises: + ValueError: if no provider is enabled with the given backend_name. + """ + enabled_provider = provider.Registry.get_by_backend_name(backend_name) + + if not enabled_provider: + raise ValueError('Provider with backend %s not enabled' % backend_name) + + return _get_url('social:complete', backend_name) + + +def get_disconnect_url(provider_name): + """Gets URL for the endpoint that starts the disconnect pipeline. + + Args: + provider_name: string. Name of the provider.BaseProvider child you want + to disconnect from. + + Returns: + String. URL that starts the disconnection pipeline. + + Raises: + ValueError: if no provider is enabled with the given backend_name. + """ + enabled_provider = _get_enabled_provider_by_name(provider_name) + return _get_url('social:disconnect', enabled_provider.BACKEND_CLASS.name) + + +def get_login_url(provider_name, auth_entry): + """Gets the login URL for the endpoint that kicks off auth with a provider. + + Args: + provider_name: string. The name of the provider.Provider that has been + enabled. + auth_entry: string. Query argument specifying the desired entry point + for the auth pipeline. Used by the pipeline for later branching. + Must be one of _AUTH_ENTRY_CHOICES. + + Returns: + String. URL that starts the auth pipeline for a provider. + + Raises: + ValueError: if no provider is enabled with the given provider_name. + """ + assert auth_entry in _AUTH_ENTRY_CHOICES + enabled_provider = _get_enabled_provider_by_name(provider_name) + return _get_url('social:begin', enabled_provider.BACKEND_CLASS.name, auth_entry=auth_entry) + + +def get_duplicate_provider(messages): + """Gets provider from message about social account already in use. + + python-social-auth's exception middleware uses the messages module to + record details about duplicate account associations. It records exactly one + message there is a request to associate a social account S with an edX + account E if S is already associated with an edX account E'. + + This messaging approach is stringly-typed and the particular string is + unfortunately not in a reusable constant. + + Returns: + provider.BaseProvider child instance. The provider of the duplicate + account, or None if there is no duplicate (and hence no error). + """ + social_auth_messages = [m for m in messages if m.message.endswith('is already in use.')] + + if not social_auth_messages: + return + + assert len(social_auth_messages) == 1 + return provider.Registry.get_by_backend_name(social_auth_messages[0].extra_tags.split()[1]) + + +def get_provider_user_states(user): + """Gets list of states of provider-user combinations. + + Args: + django.contrib.auth.User. The user to get states for. + + Returns: + List of ProviderUserState. The list of states of a user's account with + each enabled provider. + """ + states = [] + found_user_backends = [ + social_auth.provider for social_auth in models.DjangoStorage.user.get_social_auth_for_user(user) + ] + + for enabled_provider in provider.Registry.enabled(): + states.append( + ProviderUserState(enabled_provider, user, enabled_provider.BACKEND_CLASS.name in found_user_backends) + ) + + return states + + +def make_random_password(length=None, choice_fn=random.SystemRandom().choice): + """Makes a random password. + + When a user creates an account via a social provider, we need to create a + placeholder password for them to satisfy the ORM's consistency and + validation requirements. Users don't know (and hence cannot sign in with) + this password; that's OK because they can always use the reset password + flow to set it to a known value. + + Args: + choice_fn: function or method. Takes an iterable and returns a random + element. + length: int. Number of chars in the returned value. None to use default. + + Returns: + String. The resulting password. + """ + length = length if length is not None else _DEFAULT_RANDOM_PASSWORD_LENGTH + return ''.join(choice_fn(_PASSWORD_CHARSET) for _ in xrange(length)) + + +def running(request): + """Returns True iff request is running a third-party auth pipeline.""" + return request.session.get('partial_pipeline') is not None # Avoid False for {}. + + +# Pipeline functions. +# Signatures are set by python-social-auth; prepending 'unused_' causes +# TypeError on dispatch to the auth backend's authenticate(). +# pylint: disable-msg=unused-argument + + +def parse_query_params(strategy, response, *args, **kwargs): + """Reads whitelisted query params, transforms them into pipeline args.""" + auth_entry = strategy.session.get(AUTH_ENTRY_KEY) + + if not (auth_entry and auth_entry in _AUTH_ENTRY_CHOICES): + raise AuthEntryError(strategy.backend, 'auth_entry missing or invalid') + + return { + # Whether the auth pipeline entered from /dashboard. + 'is_dashboard': auth_entry == AUTH_ENTRY_DASHBOARD, + # Whether the auth pipeline entered from /login. + 'is_login': auth_entry == AUTH_ENTRY_LOGIN, + # Whether the auth pipeline entered from /register. + 'is_register': auth_entry == AUTH_ENTRY_REGISTER, + } + @partial.partial -def step(*args, **kwargs): - """Fake pipeline step; just throws loudly for now.""" - raise NotImplementedError('%s, %s' % (args, kwargs)) +def redirect_to_supplementary_form(strategy, details, response, uid, is_dashboard=None, is_login=None, is_register=None, user=None, *args, **kwargs): + """Dispatches user to views outside the pipeline if necessary.""" + + # We're deliberately verbose here to make it clear what the intended + # dispatch behavior is for the three pipeline entry points, given the + # current state of the pipeline. Keep in mind the pipeline is re-entrant + # and values will change on repeated invocations (for example, the first + # time through the login flow the user will be None so we dispatch to the + # login form; the second time it will have a value so we continue to the + # next pipeline step directly). + # + # It is important that we always execute the entire pipeline. Even if + # behavior appears correct without executing a step, it means important + # invariants have been violated and future misbehavior is likely. + + user_inactive = user and not user.is_active + user_unset = user is None + dispatch_to_login = (is_login and user_unset) or user_inactive + + if is_dashboard: + return + + if dispatch_to_login: + return redirect('/login', name='signin_user') + + if is_register and user_unset: + return redirect('/register', name='register_user') diff --git a/common/djangoapps/third_party_auth/provider.py b/common/djangoapps/third_party_auth/provider.py index 1b1e17796d43..4067db832f5e 100644 --- a/common/djangoapps/third_party_auth/provider.py +++ b/common/djangoapps/third_party_auth/provider.py @@ -4,6 +4,10 @@ invoke the Django armature. """ +from social.backends import google, linkedin + +_DEFAULT_ICON_CLASS = 'icon-signin' + class BaseProvider(object): """Abstract base class for third-party auth providers. @@ -12,22 +16,96 @@ class BaseProvider(object): in the provider Registry. """ - # String. Dot-delimited module.Class. The name of the backend - # implementation to load. - AUTHENTICATION_BACKEND = None + # Class. The provider's backing social.backends.base.BaseAuth child. + BACKEND_CLASS = None + # String. Name of the FontAwesome glyph to use for sign in buttons (or the + # name of a user-supplied custom glyph that is present at runtime). + ICON_CLASS = _DEFAULT_ICON_CLASS # String. User-facing name of the provider. Must be unique across all - # enabled providers. + # enabled providers. Will be presented in the UI. NAME = None - # Dict of string -> object. Settings that will be merged into Django's # settings instance. In most cases the value will be None, since real # values are merged from .json files (foo.auth.json; foo.env.json) onto the # settings instance during application initialization. SETTINGS = {} + @classmethod + def get_authentication_backend(cls): + """Gets associated Django settings.AUTHENTICATION_BACKEND string.""" + return '%s.%s' % (cls.BACKEND_CLASS.__module__, cls.BACKEND_CLASS.__name__) + + @classmethod + def get_email(cls, unused_provider_details): + """Gets user's email address. + + Provider responses can contain arbitrary data. This method can be + overridden to extract an email address from the provider details + extracted by the social_details pipeline step. + + Args: + unused_provider_details: dict of string -> string. Data about the + user passed back by the provider. + + Returns: + String or None. The user's email address, if any. + """ + return None + + @classmethod + def get_name(cls, unused_provider_details): + """Gets user's name. + + Provider responses can contain arbitrary data. This method can be + overridden to extract a full name for a user from the provider details + extracted by the social_details pipeline step. + + Args: + unused_provider_details: dict of string -> string. Data about the + user passed back by the provider. + + Returns: + String or None. The user's full name, if any. + """ + return None + + @classmethod + def get_register_form_data(cls, pipeline_kwargs): + """Gets dict of data to display on the register form. + + common.djangoapps.student.views.register_user uses this to populate the + new account creation form with values supplied by the user's chosen + provider, preventing duplicate data entry. + + Args: + pipeline_kwargs: dict of string -> object. Keyword arguments + accumulated by the pipeline thus far. + + Returns: + Dict of string -> string. Keys are names of form fields; values are + values for that field. Where there is no value, the empty string + must be used. + """ + # Details about the user sent back from the provider. + details = pipeline_kwargs.get('details') + + # Get the username separately to take advantage of the de-duping logic + # built into the pipeline. The provider cannot de-dupe because it can't + # check the state of taken usernames in our system. Note that there is + # technically a data race between the creation of this value and the + # creation of the user object, so it is still possible for users to get + # an error on submit. + suggested_username = pipeline_kwargs.get('username') + + return { + 'email': cls.get_email(details) or '', + 'name': cls.get_name(details) or '', + 'username': suggested_username, + } + @classmethod def merge_onto(cls, settings): - """Merge class-level settings onto a django `settings` module.""" + """Merge class-level settings onto a django settings module.""" for key, value in cls.SETTINGS.iteritems(): setattr(settings, key, value) @@ -35,30 +113,41 @@ def merge_onto(cls, settings): class GoogleOauth2(BaseProvider): """Provider for Google's Oauth2 auth system.""" - AUTHENTICATION_BACKEND = 'social.backends.google.GoogleOAuth2' + BACKEND_CLASS = google.GoogleOAuth2 + ICON_CLASS = 'icon-google-plus' NAME = 'Google' SETTINGS = { 'SOCIAL_AUTH_GOOGLE_OAUTH2_KEY': None, 'SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET': None, } + @classmethod + def get_email(cls, provider_details): + return provider_details.get('email') + + @classmethod + def get_name(cls, provider_details): + return provider_details.get('fullname') + class LinkedInOauth2(BaseProvider): """Provider for LinkedIn's Oauth2 auth system.""" - AUTHENTICATION_BACKEND = 'social.backends.linkedin.LinkedinOAuth2' + BACKEND_CLASS = linkedin.LinkedinOAuth2 + ICON_CLASS = 'icon-linkedin' NAME = 'LinkedIn' SETTINGS = { 'SOCIAL_AUTH_LINKEDIN_OAUTH2_KEY': None, 'SOCIAL_AUTH_LINKEDIN_OAUTH2_SECRET': None, } + @classmethod + def get_email(cls, provider_details): + return provider_details.get('email') -class MozillaPersona(BaseProvider): - """Provider for Mozilla's Persona auth system.""" - - AUTHENTICATION_BACKEND = 'social.backends.persona.PersonaAuth' - NAME = 'Mozilla Persona' + @classmethod + def get_name(cls, provider_details): + return provider_details.get('fullname') class Registry(object): @@ -84,7 +173,7 @@ def _get_all(cls): @classmethod def _enable(cls, provider): - """Enables a single `provider`.""" + """Enables a single provider.""" if provider.NAME in cls._ENABLED: raise ValueError('Provider %s already enabled' % provider.NAME) cls._ENABLED[provider.NAME] = provider @@ -93,10 +182,17 @@ def _enable(cls, provider): def configure_once(cls, provider_names): """Configures providers. - Takes `provider_names`, a list of string. + Args: + provider_names: list of string. The providers to configure. + + Raises: + ValueError: if the registry has already been configured, or if any + of the passed provider_names does not have a corresponding + BaseProvider child implementation. """ if cls._CONFIGURED: raise ValueError('Provider registry already configured') + # Flip the bit eagerly -- configure() should not be re-callable if one # _enable call fails. cls._CONFIGURED = True @@ -114,10 +210,27 @@ def enabled(cls): @classmethod def get(cls, provider_name): - """Gets provider named `provider_name` string if enabled, else None.""" + """Gets provider named provider_name string if enabled, else None.""" cls._check_configured() return cls._ENABLED.get(provider_name) + @classmethod + def get_by_backend_name(cls, backend_name): + """Gets provider (or None) by backend name. + + Args: + backend_name: string. The python-social-auth + backends.base.BaseAuth.name (for example, 'google-oauth2') to + try and get a provider for. + + Raises: + RuntimeError: if the registry has not been configured. + """ + cls._check_configured() + for enabled in cls._ENABLED.values(): + if enabled.BACKEND_CLASS.name == backend_name: + return enabled + @classmethod def _reset(cls): """Returns the registry to an unconfigured state; for tests only.""" diff --git a/common/djangoapps/third_party_auth/settings.py b/common/djangoapps/third_party_auth/settings.py index 0ff55e1213d8..bb4fc71415c9 100644 --- a/common/djangoapps/third_party_auth/settings.py +++ b/common/djangoapps/third_party_auth/settings.py @@ -46,8 +46,15 @@ from . import provider +_FIELDS_STORED_IN_SESSION = ['auth_entry'] +_MIDDLEWARE_CLASSES = ( + 'third_party_auth.middleware.ExceptionMiddleware', +) +_SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/dashboard' + + def _merge_auth_info(django_settings, auth_info): - """Merge `auth_info` dict onto `django_settings` module.""" + """Merge auth_info dict onto django_settings module.""" enabled_provider_names = [] to_merge = [] @@ -66,39 +73,77 @@ def _merge_auth_info(django_settings, auth_info): def _set_global_settings(django_settings): """Set provider-independent settings.""" + + # Whitelisted URL query parameters retrained in the pipeline session. + # Params not in this whitelist will be silently dropped. + django_settings.FIELDS_STORED_IN_SESSION = _FIELDS_STORED_IN_SESSION + # Register and configure python-social-auth with Django. django_settings.INSTALLED_APPS += ( 'social.apps.django_app.default', 'third_party_auth', ) - django_settings.TEMPLATE_CONTEXT_PROCESSORS += ( - 'social.apps.django_app.context_processors.backends', - 'social.apps.django_app.context_processors.login_redirect', - ) + + # Inject exception middleware to make redirects fire. + django_settings.MIDDLEWARE_CLASSES += _MIDDLEWARE_CLASSES + + # Where to send the user if there's an error during social authentication + # and we cannot send them to a more specific URL + # (see middleware.ExceptionMiddleware). + django_settings.SOCIAL_AUTH_LOGIN_ERROR_URL = '/' + + # Where to send the user once social authentication is successful. + django_settings.SOCIAL_AUTH_LOGIN_REDIRECT_URL = _SOCIAL_AUTH_LOGIN_REDIRECT_URL + # Inject our customized auth pipeline. All auth backends must work with # this pipeline. django_settings.SOCIAL_AUTH_PIPELINE = ( - 'third_party_auth.pipeline.step', + 'third_party_auth.pipeline.parse_query_params', + 'social.pipeline.social_auth.social_details', + 'social.pipeline.social_auth.social_uid', + 'social.pipeline.social_auth.auth_allowed', + 'social.pipeline.social_auth.social_user', + 'social.pipeline.user.get_username', + 'third_party_auth.pipeline.redirect_to_supplementary_form', + 'social.pipeline.user.create_user', + 'social.pipeline.social_auth.associate_user', + 'social.pipeline.social_auth.load_extra_data', + 'social.pipeline.user.user_details', + ) + + # We let the user specify their email address during signup. + django_settings.SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['email'] + + # Disable exceptions by default for prod so you get redirect behavior + # instead of a Django error page. During development you may want to + # enable this when you want to get stack traces rather than redirections. + django_settings.SOCIAL_AUTH_RAISE_EXCEPTIONS = False + + # Context processors required under Django. + django_settings.SOCIAL_AUTH_UUID_LENGTH = 4 + django_settings.TEMPLATE_CONTEXT_PROCESSORS += ( + 'social.apps.django_app.context_processors.backends', + 'social.apps.django_app.context_processors.login_redirect', ) def _set_provider_settings(django_settings, enabled_providers, auth_info): - """Set provider-specific settings.""" + """Sets provider-specific settings.""" # Must prepend here so we get called first. django_settings.AUTHENTICATION_BACKENDS = ( - tuple(enabled_provider.AUTHENTICATION_BACKEND for enabled_provider in enabled_providers) + + tuple(enabled_provider.get_authentication_backend() for enabled_provider in enabled_providers) + django_settings.AUTHENTICATION_BACKENDS) # Merge settings from provider classes, and configure all placeholders. for enabled_provider in enabled_providers: enabled_provider.merge_onto(django_settings) - # Merge settings from .auth.json. + # Merge settings from .auth.json, overwriting placeholders. _merge_auth_info(django_settings, auth_info) def apply_settings(auth_info, django_settings): - """Apply settings from `auth_info` dict to `django_settings` module.""" + """Applies settings from auth_info dict to django_settings module.""" provider_names = auth_info.keys() provider.Registry.configure_once(provider_names) enabled_providers = provider.Registry.enabled() diff --git a/common/djangoapps/third_party_auth/tests/specs/__init__.py b/common/djangoapps/third_party_auth/tests/specs/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/common/djangoapps/third_party_auth/tests/specs/base.py b/common/djangoapps/third_party_auth/tests/specs/base.py new file mode 100644 index 000000000000..d5e2e93ded9f --- /dev/null +++ b/common/djangoapps/third_party_auth/tests/specs/base.py @@ -0,0 +1,717 @@ +"""Base integration test for provider implementations.""" + +import re +import unittest + +import json +import mock + +from django import test +from django.contrib import auth +from django.contrib.auth import models as auth_models +from django.contrib.messages.storage import fallback +from django.contrib.sessions.backends import cache +from django.test import utils as django_utils +from django.conf import settings as django_settings +from social import actions, exceptions +from social.apps.django_app import utils as social_utils +from social.apps.django_app import views as social_views +from student import models as student_models +from student import views as student_views + +from third_party_auth import middleware, pipeline +from third_party_auth import settings as auth_settings +from third_party_auth.tests import testutil + + +@unittest.skipUnless( + testutil.AUTH_FEATURES_KEY in django_settings.FEATURES, testutil.AUTH_FEATURES_KEY + ' not in settings.FEATURES') +@django_utils.override_settings() # For settings reversion on a method-by-method basis. +class IntegrationTest(testutil.TestCase, test.TestCase): + """Abstract base class for provider integration tests.""" + + # Configuration. You will need to override these values in your test cases. + + # Class. The third_party_auth.provider.BaseProvider child we are testing. + PROVIDER_CLASS = None + + # Dict of string -> object. Settings that will be merged onto Django's + # settings object before test execution. In most cases, this is + # PROVIDER_CLASS.SETTINGS with test values. + PROVIDER_SETTINGS = {} + + # Methods you must override in your children. + + def get_response_data(self): + """Gets a dict of response data of the form given by the provider. + + To determine what the provider returns, drop into a debugger in your + provider's do_auth implementation. Providers may merge different kinds + of data (for example, data about the user and data about the user's + credentials). + """ + raise NotImplementedError + + def get_username(self): + """Gets username based on response data from a provider. + + Each provider has different logic for username generation. Sadly, + this is not extracted into its own method in python-social-auth, so we + must provide a getter ourselves. + + Note that this is the *initial* value the framework will attempt to use. + If it collides, the pipeline will generate a new username. We extract + it here so we can force collisions in a polymorphic way. + """ + raise NotImplementedError + + # Asserts you can optionally override and make more specific. + + def assert_redirect_to_provider_looks_correct(self, response): + """Asserts the redirect to the provider's site looks correct. + + When we hit /auth/login/, we should be redirected to the + provider's site. Here we check that we're redirected, but we don't know + enough about the provider to check what we're redirected to. Child test + implementations may optionally strengthen this assertion with, for + example, more details about the format of the Location header. + """ + self.assertEqual(302, response.status_code) + self.assertTrue(response.has_header('Location')) + + def assert_register_response_in_pipeline_looks_correct(self, response, pipeline_kwargs): + """Performs spot checks of the rendered register.html page. + + When we display the new account registration form after the user signs + in with a third party, we prepopulate the form with values sent back + from the provider. The exact set of values varies on a provider-by- + provider basis and is generated by + provider.BaseProvider.get_register_form_data. We provide some stock + assertions based on the provider's implementation; if you want more + assertions in your test, override this method. + """ + self.assertEqual(200, response.status_code) + # Check that the correct provider was selected. + self.assertIn('successfully signed in with %s' % self.PROVIDER_CLASS.NAME, response.content) + # Expect that each truthy value we've prepopulated the register form + # with is actually present. + for prepopulated_form_value in self.PROVIDER_CLASS.get_register_form_data(pipeline_kwargs).values(): + if prepopulated_form_value: + self.assertIn(prepopulated_form_value, response.content) + + # Implementation details and actual tests past this point -- no more + # configuration needed. + + def setUp(self): + super(IntegrationTest, self).setUp() + self.configure_runtime() + self.backend_name = self.PROVIDER_CLASS.BACKEND_CLASS.name + self.client = test.Client() + self.request_factory = test.RequestFactory() + + def assert_dashboard_response_looks_correct(self, response, user, duplicate=False, linked=None): + """Asserts the user's dashboard is in the expected state. + + We check unconditionally that the dashboard 200s and contains the + user's info. If duplicate is True, we expect the duplicate account + association error to be present. If linked is passed, we conditionally + check the content and controls in the Account Links section of the + sidebar. + """ + duplicate_account_error_needle = '
' + assert_duplicate_presence_fn = self.assertIn if duplicate else self.assertNotIn + + self.assertEqual(200, response.status_code) + self.assertIn(user.email, response.content) + self.assertIn(user.username, response.content) + assert_duplicate_presence_fn(duplicate_account_error_needle, response.content) + + if linked is not None: + + if linked: + expected_control_text = pipeline.ProviderUserState( + self.PROVIDER_CLASS, user, False).get_unlink_form_name() + else: + expected_control_text = pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_DASHBOARD) + + icon_state = re.search(r'third-party-auth.+icon icon-(\w+)', response.content, re.DOTALL).groups()[0] + provider_name = re.search(r'([^<]+)', response.content, re.DOTALL).groups()[0] + + self.assertIn(expected_control_text, response.content) + self.assertEqual('link' if linked else 'unlink', icon_state) + self.assertEqual(self.PROVIDER_CLASS.NAME, provider_name) + + def assert_exception_redirect_looks_correct(self, auth_entry=None): + """Tests middleware conditional redirection. + + middleware.ExceptionMiddleware makes sure the user ends up in the right + place when they cancel authentication via the provider's UX. + """ + exception_middleware = middleware.ExceptionMiddleware() + request, _ = self.get_request_and_strategy(auth_entry=auth_entry) + response = exception_middleware.process_exception( + request, exceptions.AuthCanceled(request.social_strategy.backend)) + location = response.get('Location') + + self.assertEqual(302, response.status_code) + self.assertIn('canceled', location) + self.assertIn(self.backend_name, location) + + if auth_entry: + # Custom redirection to form. + self.assertTrue(location.startswith('/' + auth_entry)) + else: + # Stock framework redirection to root. + self.assertTrue(location.startswith('/?')) + + def assert_first_party_auth_trumps_third_party_auth(self, email=None, password=None, success=None): + """Asserts first party auth was used in place of third party auth. + + Args: + email: string. The user's email. If not None, will be set on POST. + password: string. The user's password. If not None, will be set on + POST. + success: None or bool. Whether we expect auth to be successful. Set + to None to indicate we expect the request to be invalid (meaning + one of username or password will be missing). + """ + _, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + self.create_user_models_for_existing_account( + strategy, email, password, self.get_username(), skip_social_auth=True) + + strategy.request.POST = dict(strategy.request.POST) + + if email: + strategy.request.POST['email'] = email + if password: + strategy.request.POST['password'] = 'bad_' + password if success is False else password + + self.assert_pipeline_running(strategy.request) + payload = json.loads(student_views.login_user(strategy.request).content) + + if success is None: + # Request malformed -- just one of email/password given. + self.assertFalse(payload.get('success')) + self.assertIn('There was an error receiving your login information', payload.get('value')) + elif success: + # Request well-formed and credentials good. + self.assertTrue(payload.get('success')) + else: + # Request well-formed but credentials bad. + self.assertFalse(payload.get('success')) + self.assertIn('incorrect', payload.get('value')) + + def assert_javascript_would_submit_login_form(self, boolean, response): + """Asserts we pass form submit JS the right boolean string.""" + argument_string = re.search( + r'function\ post_form_if_pipeline_running.*\(([a-z]+)\)', response.content, re.DOTALL).groups()[0] + self.assertIn(argument_string, ['true', 'false']) + self.assertEqual(boolean, True if argument_string == 'true' else False) + + def assert_json_failure_response_is_inactive_account(self, response): + """Asserts failure on /login for inactive account looks right.""" + self.assertEqual(200, response.status_code) # Yes, it's a 200 even though it's a failure. + payload = json.loads(response.content) + self.assertFalse(payload.get('success')) + self.assertIn('This account has not been activated', payload.get('value')) + + def assert_json_failure_response_is_missing_social_auth(self, response): + """Asserts failure on /login for missing social auth looks right.""" + self.assertEqual(200, response.status_code) # Yes, it's a 200 even though it's a failure. + payload = json.loads(response.content) + self.assertFalse(payload.get('success')) + self.assertIn('associated with your %s account' % self.PROVIDER_CLASS.NAME, payload.get('value')) + + def assert_json_failure_response_is_username_collision(self, response): + """Asserts the json response indicates a username collision.""" + self.assertEqual(400, response.status_code) + payload = json.loads(response.content) + self.assertFalse(payload.get('success')) + self.assertIn('already exists', payload.get('value')) + + def assert_json_success_response_looks_correct(self, response): + """Asserts the json response indicates success and redirection.""" + self.assertEqual(200, response.status_code) + payload = json.loads(response.content) + self.assertTrue(payload.get('success')) + self.assertEqual(pipeline.get_complete_url(self.PROVIDER_CLASS.BACKEND_CLASS.name), payload.get('redirect_url')) + + def assert_login_response_before_pipeline_looks_correct(self, response): + """Asserts a GET of /login not in the pipeline looks correct.""" + self.assertEqual(200, response.status_code) + self.assertIn('Sign in with ' + self.PROVIDER_CLASS.NAME, response.content) + self.assert_javascript_would_submit_login_form(False, response) + self.assert_signin_button_looks_functional(response.content, pipeline.AUTH_ENTRY_LOGIN) + + def assert_login_response_in_pipeline_looks_correct(self, response): + """Asserts a GET of /login in the pipeline looks correct.""" + self.assertEqual(200, response.status_code) + # Make sure the form submit JS is told to submit the form: + self.assert_javascript_would_submit_login_form(True, response) + + def assert_password_overridden_by_pipeline(self, username, password): + """Verifies that the given password is not correct. + + The pipeline overrides POST['password'], if any, with random data. + """ + self.assertIsNone(auth.authenticate(password=password, username=username)) + + def assert_pipeline_running(self, request): + """Makes sure the given request is running an auth pipeline.""" + self.assertTrue(pipeline.running(request)) + + def assert_redirect_to_dashboard_looks_correct(self, response): + """Asserts a response would redirect to /dashboard.""" + self.assertEqual(302, response.status_code) + # pylint: disable-msg=protected-access + self.assertEqual(auth_settings._SOCIAL_AUTH_LOGIN_REDIRECT_URL, response.get('Location')) + + def assert_redirect_to_login_looks_correct(self, response): + """Asserts a response would redirect to /login.""" + self.assertEqual(302, response.status_code) + self.assertEqual('/' + pipeline.AUTH_ENTRY_LOGIN, response.get('Location')) + + def assert_redirect_to_register_looks_correct(self, response): + """Asserts a response would redirect to /register.""" + self.assertEqual(302, response.status_code) + self.assertEqual('/' + pipeline.AUTH_ENTRY_REGISTER, response.get('Location')) + + def assert_register_response_before_pipeline_looks_correct(self, response): + """Asserts a GET of /register not in the pipeline looks correct.""" + self.assertEqual(200, response.status_code) + self.assertIn('Sign in with ' + self.PROVIDER_CLASS.NAME, response.content) + self.assert_signin_button_looks_functional(response.content, pipeline.AUTH_ENTRY_REGISTER) + + def assert_signin_button_looks_functional(self, content, auth_entry): + """Asserts JS is available to signin buttons and has the right args.""" + self.assertTrue(re.search(r'function thirdPartySignin', content)) + self.assertEqual( + pipeline.get_login_url(self.PROVIDER_CLASS.NAME, auth_entry), + re.search(r"thirdPartySignin\(event, '([^']+)", content).groups()[0]) + + def assert_social_auth_does_not_exist_for_user(self, user, strategy): + """Asserts a user does not have an auth with the expected provider.""" + social_auths = strategy.storage.user.get_social_auth_for_user( + user, provider=self.PROVIDER_CLASS.BACKEND_CLASS.name) + self.assertEqual(0, len(social_auths)) + + def assert_social_auth_exists_for_user(self, user, strategy): + """Asserts a user has a social auth with the expected provider.""" + social_auths = strategy.storage.user.get_social_auth_for_user( + user, provider=self.PROVIDER_CLASS.BACKEND_CLASS.name) + self.assertEqual(1, len(social_auths)) + self.assertEqual(self.backend_name, social_auths[0].provider) + + def configure_runtime(self): + """Configures settings details.""" + auth_settings.apply_settings({self.PROVIDER_CLASS.NAME: self.PROVIDER_SETTINGS}, django_settings) + # Force settings to propagate into cached members on + # social.apps.django_app.utils. + reload(social_utils) + + def create_user_models_for_existing_account(self, strategy, email, password, username, skip_social_auth=False): + """Creates user, profile, registration, and (usually) social auth. + + This synthesizes what happens during /register. + See student.views.register and student.views._do_create_account. + """ + response_data = self.get_response_data() + uid = strategy.backend.get_user_id(response_data, response_data) + user = social_utils.Storage.user.create_user(email=email, password=password, username=username) + profile = student_models.UserProfile(user=user) + profile.save() + registration = student_models.Registration() + registration.register(user) + registration.save() + + if not skip_social_auth: + social_utils.Storage.user.create_social_auth(user, uid, self.PROVIDER_CLASS.BACKEND_CLASS.name) + + return user + + def fake_auth_complete(self, strategy): + """Fake implementation of social.backends.BaseAuth.auth_complete. + + Unlike what the docs say, it does not need to return a user instance. + Sometimes (like when directing users to the /register form) it instead + returns a response that 302s to /register. + """ + args = () + kwargs = { + 'request': strategy.request, + 'backend': strategy.backend, + 'user': None, + 'response': self.get_response_data(), + } + return strategy.authenticate(*args, **kwargs) + + def get_registration_post_vars(self, overrides=None): + """POST vars generated by the registration form.""" + defaults = { + 'username': 'username', + 'name': 'First Last', + 'gender': '', + 'year_of_birth': '', + 'level_of_education': '', + 'goals': '', + 'honor_code': 'true', + 'terms_of_service': 'true', + 'password': 'password', + 'mailing_address': '', + 'email': 'user@email.com', + } + + if overrides: + defaults.update(overrides) + + return defaults + + def get_request_and_strategy(self, auth_entry=None, redirect_uri=None): + """Gets a fully-configured request and strategy. + + These two objects contain circular references, so we create them + together. The references themselves are a mixture of normal __init__ + stuff and monkey-patching done by python-social-auth. See, for example, + social.apps.django_apps.utils.strategy(). + """ + request = self.request_factory.get( + pipeline.get_complete_url(self.backend_name) + + '?redirect_state=redirect_state_value&code=code_value&state=state_value') + request.user = auth_models.AnonymousUser() + request.session = cache.SessionStore() + request.session[self.backend_name + '_state'] = 'state_value' + + if auth_entry: + request.session[pipeline.AUTH_ENTRY_KEY] = auth_entry + + strategy = social_utils.load_strategy(backend=self.backend_name, redirect_uri=redirect_uri, request=request) + request.social_strategy = strategy + + return request, strategy + + def get_user_by_email(self, strategy, email): + """Gets a user by email, using the given strategy.""" + return strategy.storage.user.user_model().objects.get(email=email) + + # Actual tests, executed once per child. + + def test_canceling_authentication_redirects_to_login_when_auth_entry_login(self): + self.assert_exception_redirect_looks_correct(auth_entry=pipeline.AUTH_ENTRY_LOGIN) + + def test_canceling_authentication_redirects_to_register_when_auth_entry_register(self): + self.assert_exception_redirect_looks_correct(auth_entry=pipeline.AUTH_ENTRY_REGISTER) + + def test_canceling_authentication_redirects_to_root_when_auth_entry_not_set(self): + self.assert_exception_redirect_looks_correct() + + def test_full_pipeline_succeeds_for_linking_account(self): + # First, create, the request and strategy that store pipeline state, + # configure the backend, and mock out wire traffic. + request, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + request.user = self.create_user_models_for_existing_account( + strategy, 'user@example.com', 'password', self.get_username(), skip_social_auth=True) + + # Instrument the pipeline to get to the dashboard with the full + # expected state. + self.client.get( + pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN)) + actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access + student_views.signin_user(strategy.request) + student_views.login_user(strategy.request) + actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access + + # First we expect that we're in the unlinked state, and that there + # really is no association in the backend. + self.assert_dashboard_response_looks_correct(student_views.dashboard(request), request.user, linked=False) + self.assert_social_auth_does_not_exist_for_user(request.user, strategy) + + # Fire off the auth pipeline to link. + self.assert_redirect_to_dashboard_looks_correct(actions.do_complete( + request.social_strategy, social_views._do_login, request.user, None, # pylint: disable-msg=protected-access + redirect_field_name=auth.REDIRECT_FIELD_NAME)) + + # Now we expect to be in the linked state, with a backend entry. + self.assert_social_auth_exists_for_user(request.user, strategy) + self.assert_dashboard_response_looks_correct(student_views.dashboard(request), request.user, linked=True) + + def test_full_pipeline_succeeds_for_unlinking_account(self): + # First, create, the request and strategy that store pipeline state, + # configure the backend, and mock out wire traffic. + request, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + user = self.create_user_models_for_existing_account( + strategy, 'user@example.com', 'password', self.get_username()) + self.assert_social_auth_exists_for_user(user, strategy) + + # Instrument the pipeline to get to the dashboard with the full + # expected state. + self.client.get( + pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN)) + actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access + student_views.signin_user(strategy.request) + student_views.login_user(strategy.request) + actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access + + # First we expect that we're in the linked state, with a backend entry. + self.assert_dashboard_response_looks_correct(student_views.dashboard(request), user, linked=True) + self.assert_social_auth_exists_for_user(request.user, strategy) + + # Fire off the disconnect pipeline to unlink. + self.assert_redirect_to_dashboard_looks_correct(actions.do_disconnect( + request.social_strategy, request.user, None, redirect_field_name=auth.REDIRECT_FIELD_NAME)) + + # Now we expect to be in the unlinked state, with no backend entry. + self.assert_dashboard_response_looks_correct(student_views.dashboard(request), user, linked=False) + self.assert_social_auth_does_not_exist_for_user(user, strategy) + + def test_linking_already_associated_account_raises_auth_already_associated(self): + # This is of a piece with + # test_already_associated_exception_populates_dashboard_with_error. It + # verifies the exception gets raised when we expect; the latter test + # covers exception handling. + email = 'user@example.com' + password = 'password' + username = self.get_username() + _, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + linked_user = self.create_user_models_for_existing_account(strategy, email, password, username) + unlinked_user = social_utils.Storage.user.create_user( + email='other_' + email, password=password, username='other_' + username) + + self.assert_social_auth_exists_for_user(linked_user, strategy) + self.assert_social_auth_does_not_exist_for_user(unlinked_user, strategy) + + with self.assertRaises(exceptions.AuthAlreadyAssociated): + actions.do_complete(strategy, social_views._do_login, user=unlinked_user) # pylint: disable-msg=protected-access + + def test_already_associated_exception_populates_dashboard_with_error(self): + # Instrument the pipeline with an exception. We test that the + # exception is raised correctly separately, so it's ok that we're + # raising it artificially here. This makes the linked=True artificial + # in the final assert because in practice the account would be + # unlinked, but getting that behavior is cumbersome here and already + # covered in other tests. Using linked=True does, however, let us test + # that the duplicate error has no effect on the state of the controls. + request, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + user = self.create_user_models_for_existing_account( + strategy, 'user@example.com', 'password', self.get_username()) + self.assert_social_auth_exists_for_user(user, strategy) + + self.client.get('/login') + self.client.get(pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN)) + actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access + student_views.signin_user(strategy.request) + student_views.login_user(strategy.request) + actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access + + # Monkey-patch storage for messaging; pylint: disable-msg=protected-access + request._messages = fallback.FallbackStorage(request) + middleware.ExceptionMiddleware().process_exception( + request, + exceptions.AuthAlreadyAssociated(self.PROVIDER_CLASS.BACKEND_CLASS.name, 'account is already in use.')) + + self.assert_dashboard_response_looks_correct( + student_views.dashboard(request), user, duplicate=True, linked=True) + + def test_full_pipeline_succeeds_for_signing_in_to_existing_active_account(self): + # First, create, the request and strategy that store pipeline state, + # configure the backend, and mock out wire traffic. + request, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + user = self.create_user_models_for_existing_account( + strategy, 'user@example.com', 'password', self.get_username()) + self.assert_social_auth_exists_for_user(user, strategy) + self.assertTrue(user.is_active) + + # Begin! Ensure that the login form contains expected controls before + # the user starts the pipeline. + self.assert_login_response_before_pipeline_looks_correct(self.client.get('/login')) + + # The pipeline starts by a user GETting /auth/login/. + # Synthesize that request and check that it redirects to the correct + # provider page. + self.assert_redirect_to_provider_looks_correct(self.client.get( + pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))) + + # Next, the provider makes a request against /auth/complete/ + # to resume the pipeline. + # pylint: disable-msg=protected-access + self.assert_redirect_to_login_looks_correct(actions.do_complete(strategy, social_views._do_login)) + + # At this point we know the pipeline has resumed correctly. Next we + # fire off the view that displays the login form and posts it via JS. + self.assert_login_response_in_pipeline_looks_correct(student_views.signin_user(strategy.request)) + + # Next, we invoke the view that handles the POST, and expect it + # redirects to /auth/complete. In the browser ajax handlers will + # redirect the user to the dashboard; we invoke it manually here. + self.assert_json_success_response_looks_correct(student_views.login_user(strategy.request)) + self.assert_redirect_to_dashboard_looks_correct( + actions.do_complete(strategy, social_views._do_login, user=user)) + self.assert_dashboard_response_looks_correct(student_views.dashboard(request), user) + + def test_signin_fails_if_account_not_active(self): + _, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + user = self.create_user_models_for_existing_account(strategy, 'user@example.com', 'password', self.get_username()) + + user.is_active = False + user.save() + + self.assert_json_failure_response_is_inactive_account(student_views.login_user(strategy.request)) + + def test_signin_fails_if_no_account_associated(self): + _, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_LOGIN, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + self.create_user_models_for_existing_account( + strategy, 'user@example.com', 'password', self.get_username(), skip_social_auth=True) + + self.assert_json_failure_response_is_missing_social_auth(student_views.login_user(strategy.request)) + + def test_first_party_auth_trumps_third_party_auth_but_is_invalid_when_only_email_in_request(self): + self.assert_first_party_auth_trumps_third_party_auth(email='user@example.com') + + def test_first_party_auth_trumps_third_party_auth_but_is_invalid_when_only_password_in_request(self): + self.assert_first_party_auth_trumps_third_party_auth(password='password') + + def test_first_party_auth_trumps_third_party_auth_and_fails_when_credentials_bad(self): + self.assert_first_party_auth_trumps_third_party_auth( + email='user@example.com', password='password', success=False) + + def test_first_party_auth_trumps_third_party_auth_and_succeeds_when_credentials_good(self): + self.assert_first_party_auth_trumps_third_party_auth( + email='user@example.com', password='password', success=True) + + def test_full_pipeline_succeeds_registering_new_account(self): + # First, create, the request and strategy that store pipeline state. + # Mock out wire traffic. + request, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_REGISTER, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + + # Begin! Grab the registration page and check the login control on it. + self.assert_register_response_before_pipeline_looks_correct(self.client.get('/register')) + + # The pipeline starts by a user GETting /auth/login/. + # Synthesize that request and check that it redirects to the correct + # provider page. + self.assert_redirect_to_provider_looks_correct(self.client.get( + pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))) + + # Next, the provider makes a request against /auth/complete/. + # pylint:disable-msg=protected-access + self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login)) + + # At this point we know the pipeline has resumed correctly. Next we + # fire off the view that displays the registration form. + self.assert_register_response_in_pipeline_looks_correct( + student_views.register_user(strategy.request), pipeline.get(request)['kwargs']) + + # Next, we invoke the view that handles the POST. Not all providers + # supply email. Manually add it as the user would have to; this + # also serves as a test of overriding provider values. Always provide a + # password for us to check that we override it properly. + overridden_password = strategy.request.POST.get('password') + email = 'new@example.com' + + if not strategy.request.POST.get('email'): + strategy.request.POST = self.get_registration_post_vars({'email': email}) + + # The user must not exist yet... + with self.assertRaises(auth_models.User.DoesNotExist): + self.get_user_by_email(strategy, email) + + # ...but when we invoke create_account the existing edX view will make + # it, but not social auths. The pipeline creates those later. + self.assert_json_success_response_looks_correct(student_views.create_account(strategy.request)) + # We've overridden the user's password, so authenticate() with the old + # value won't work: + created_user = self.get_user_by_email(strategy, email) + self.assert_password_overridden_by_pipeline(overridden_password, created_user.username) + + # The user's account isn't created yet, so an attempt to complete the + # pipeline will error out on /login: + self.assert_redirect_to_login_looks_correct( + actions.do_complete(strategy, social_views._do_login, user=created_user)) + # So we activate the account in order to verify the redirect to /dashboard: + created_user.is_active = True + created_user.save() + + # Last step in the pipeline: we re-invoke the pipeline and expect to + # end up on /dashboard, with the correct social auth object now in the + # backend and the correct user's data on display. + self.assert_redirect_to_dashboard_looks_correct( + actions.do_complete(strategy, social_views._do_login, user=created_user)) + self.assert_social_auth_exists_for_user(created_user, strategy) + self.assert_dashboard_response_looks_correct(student_views.dashboard(request), created_user) + + def test_new_account_registration_assigns_distinct_username_on_collision(self): + original_username = self.get_username() + request, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_REGISTER, redirect_uri='social:complete') + + # Create a colliding username in the backend, then proceed with + # assignment via pipeline to make sure a distinct username is created. + strategy.storage.user.create_user(username=self.get_username(), email='user@email.com', password='password') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + # pylint:disable-msg=protected-access + self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login)) + distinct_username = pipeline.get(request)['kwargs']['username'] + self.assertNotEqual(original_username, distinct_username) + + def test_new_account_registration_fails_if_email_exists(self): + request, strategy = self.get_request_and_strategy( + auth_entry=pipeline.AUTH_ENTRY_REGISTER, redirect_uri='social:complete') + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + # pylint:disable-msg=protected-access + self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login)) + self.assert_register_response_in_pipeline_looks_correct( + student_views.register_user(strategy.request), pipeline.get(request)['kwargs']) + strategy.request.POST = self.get_registration_post_vars() + # Create twice: once successfully, and once causing a collision. + student_views.create_account(strategy.request) + self.assert_json_failure_response_is_username_collision(student_views.create_account(strategy.request)) + + def test_pipeline_raises_auth_entry_error_if_auth_entry_invalid(self): + auth_entry = 'invalid' + self.assertNotIn(auth_entry, pipeline._AUTH_ENTRY_CHOICES) # pylint: disable-msg=protected-access + + _, strategy = self.get_request_and_strategy(auth_entry=auth_entry, redirect_uri='social:complete') + + with self.assertRaises(pipeline.AuthEntryError): + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + + def test_pipeline_raises_auth_entry_error_if_auth_entry_missing(self): + _, strategy = self.get_request_and_strategy(auth_entry=None, redirect_uri='social:complete') + + with self.assertRaises(pipeline.AuthEntryError): + strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy)) + + +class Oauth2IntegrationTest(IntegrationTest): # pylint: disable-msg=abstract-method + """Base test case for integration tests of Oauth2 providers.""" + + # Dict of string -> object. Information about the token granted to the + # user. Override with test values in subclass; None to force a throw. + TOKEN_RESPONSE_DATA = None + + # Dict of string -> object. Information about the user themself. Override + # with test values in subclass; None to force a throw. + USER_RESPONSE_DATA = None + + def get_response_data(self): + """Gets dict (string -> object) of merged data about the user.""" + response_data = dict(self.TOKEN_RESPONSE_DATA) + response_data.update(self.USER_RESPONSE_DATA) + return response_data diff --git a/common/djangoapps/third_party_auth/tests/specs/test_google.py b/common/djangoapps/third_party_auth/tests/specs/test_google.py new file mode 100644 index 000000000000..320739b81e6a --- /dev/null +++ b/common/djangoapps/third_party_auth/tests/specs/test_google.py @@ -0,0 +1,34 @@ +"""Integration tests for Google providers.""" + +from third_party_auth import provider +from third_party_auth.tests.specs import base + + +class GoogleOauth2IntegrationTest(base.Oauth2IntegrationTest): + """Integration tests for provider.GoogleOauth2.""" + + PROVIDER_CLASS = provider.GoogleOauth2 + PROVIDER_SETTINGS = { + 'SOCIAL_AUTH_GOOGLE_OAUTH2_KEY': 'google_oauth2_key', + 'SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET': 'google_oauth2_secret', + } + TOKEN_RESPONSE_DATA = { + 'access_token': 'access_token_value', + 'expires_in': 'expires_in_value', + 'id_token': 'id_token_value', + 'token_type': 'token_type_value', + } + USER_RESPONSE_DATA = { + 'email': 'email_value@example.com', + 'family_name': 'family_name_value', + 'given_name': 'given_name_value', + 'id': 'id_value', + 'link': 'link_value', + 'locale': 'locale_value', + 'name': 'name_value', + 'picture': 'picture_value', + 'verified_email': 'verified_email_value', + } + + def get_username(self): + return self.get_response_data().get('email').split('@')[0] diff --git a/common/djangoapps/third_party_auth/tests/specs/test_linkedin.py b/common/djangoapps/third_party_auth/tests/specs/test_linkedin.py new file mode 100644 index 000000000000..e51cc2ecc7d4 --- /dev/null +++ b/common/djangoapps/third_party_auth/tests/specs/test_linkedin.py @@ -0,0 +1,27 @@ +"""Integration tests for LinkedIn providers.""" + +from third_party_auth import provider +from third_party_auth.tests.specs import base + + +class LinkedInOauth2IntegrationTest(base.Oauth2IntegrationTest): + """Integration tests for provider.LinkedInOauth2.""" + + PROVIDER_CLASS = provider.LinkedInOauth2 + PROVIDER_SETTINGS = { + 'SOCIAL_AUTH_LINKEDIN_OAUTH2_KEY': 'linkedin_oauth2_key', + 'SOCIAL_AUTH_LINKEDIN_OAUTH2_SECRET': 'linkedin_oauth2_secret', + } + TOKEN_RESPONSE_DATA = { + 'access_token': 'access_token_value', + 'expires_in': 'expires_in_value', + } + USER_RESPONSE_DATA = { + 'lastName': 'lastName_value', + 'id': 'id_value', + 'firstName': 'firstName_value', + } + + def get_username(self): + response_data = self.get_response_data() + return response_data.get('firstName') + response_data.get('lastName') diff --git a/common/djangoapps/third_party_auth/tests/test_pipeline.py b/common/djangoapps/third_party_auth/tests/test_pipeline.py new file mode 100644 index 000000000000..66c11d904375 --- /dev/null +++ b/common/djangoapps/third_party_auth/tests/test_pipeline.py @@ -0,0 +1,42 @@ +"""Unit tests for third_party_auth/pipeline.py.""" + +import random + +from third_party_auth import pipeline, provider +from third_party_auth.tests import testutil + + +# Allow tests access to protected methods (or module-protected methods) under +# test. pylint: disable-msg=protected-access + + +class MakeRandomPasswordTest(testutil.TestCase): + """Tests formation of random placeholder passwords.""" + + def setUp(self): + super(MakeRandomPasswordTest, self).setUp() + self.seed = 1 + + def test_default_args(self): + self.assertEqual(pipeline._DEFAULT_RANDOM_PASSWORD_LENGTH, len(pipeline.make_random_password())) + + def test_probably_only_uses_charset(self): + # This is ultimately probablistic since we could randomly select a good character 100000 consecutive times. + for char in pipeline.make_random_password(length=100000): + self.assertIn(char, pipeline._PASSWORD_CHARSET) + + def test_pseudorandomly_picks_chars_from_charset(self): + random_instance = random.Random(self.seed) + expected = ''.join( + random_instance.choice(pipeline._PASSWORD_CHARSET) + for _ in xrange(pipeline._DEFAULT_RANDOM_PASSWORD_LENGTH)) + random_instance.seed(self.seed) + self.assertEqual(expected, pipeline.make_random_password(choice_fn=random_instance.choice)) + + +class ProviderUserStateTestCase(testutil.TestCase): + """Tests ProviderUserState behavior.""" + + def test_get_unlink_form_name(self): + state = pipeline.ProviderUserState(provider.GoogleOauth2, object(), False) + self.assertEqual(provider.GoogleOauth2.NAME + '_unlink_form', state.get_unlink_form_name()) diff --git a/common/djangoapps/third_party_auth/tests/test_pipeline_integration.py b/common/djangoapps/third_party_auth/tests/test_pipeline_integration.py new file mode 100644 index 000000000000..8d1f3b7019ae --- /dev/null +++ b/common/djangoapps/third_party_auth/tests/test_pipeline_integration.py @@ -0,0 +1,179 @@ +"""Integration tests for pipeline.py.""" + +import unittest + +from django.conf import settings +from django import test +from django.contrib.auth import models + +from third_party_auth import pipeline, provider +from third_party_auth.tests import testutil +from social.apps.django_app.default import models as social_models + + +# Get Django User model by reference from python-social-auth. Not a type +# constant, pylint. +User = social_models.DjangoStorage.user.user_model() # pylint: disable-msg=invalid-name + + +class TestCase(testutil.TestCase, test.TestCase): + """Base test case.""" + + def setUp(self): + super(TestCase, self).setUp() + self.enabled_provider_name = provider.GoogleOauth2.NAME + provider.Registry.configure_once([self.enabled_provider_name]) + self.enabled_provider = provider.Registry.get(self.enabled_provider_name) + + +@unittest.skipUnless( + testutil.AUTH_FEATURES_KEY in settings.FEATURES, testutil.AUTH_FEATURES_KEY + ' not in settings.FEATURES') +class GetAuthenticatedUserTestCase(TestCase): + """Tests for get_authenticated_user.""" + + def setUp(self): + super(GetAuthenticatedUserTestCase, self).setUp() + self.user = social_models.DjangoStorage.user.create_user(username='username', password='password') + + def get_by_username(self, username): + """Gets a User by username.""" + return social_models.DjangoStorage.user.user_model().objects.get(username=username) + + def test_raises_does_not_exist_if_user_missing(self): + with self.assertRaises(models.User.DoesNotExist): + pipeline.get_authenticated_user('new_' + self.user.username, 'backend') + + def test_raises_does_not_exist_if_user_found_but_no_association(self): + backend_name = 'backend' + + self.assertIsNotNone(self.get_by_username(self.user.username)) + self.assertIsNone(provider.Registry.get_by_backend_name(backend_name)) + + with self.assertRaises(models.User.DoesNotExist): + pipeline.get_authenticated_user(self.user.username, 'backend') + + def test_raises_does_not_exist_if_user_and_association_found_but_no_match(self): + self.assertIsNotNone(self.get_by_username(self.user.username)) + social_models.DjangoStorage.user.create_social_auth( + self.user, 'uid', 'other_' + self.enabled_provider.BACKEND_CLASS.name) + + with self.assertRaises(models.User.DoesNotExist): + pipeline.get_authenticated_user(self.user.username, self.enabled_provider.BACKEND_CLASS.name) + + def test_returns_user_with_is_authenticated_and_backend_set_if_match(self): + social_models.DjangoStorage.user.create_social_auth(self.user, 'uid', self.enabled_provider.BACKEND_CLASS.name) + user = pipeline.get_authenticated_user(self.user.username, self.enabled_provider.BACKEND_CLASS.name) + + self.assertEqual(self.user, user) + self.assertEqual(self.enabled_provider.get_authentication_backend(), user.backend) + + +@unittest.skipUnless( + testutil.AUTH_FEATURES_KEY in settings.FEATURES, testutil.AUTH_FEATURES_KEY + ' not in settings.FEATURES') +class GetProviderUserStatesTestCase(testutil.TestCase, test.TestCase): + """Tests generation of ProviderUserStates.""" + + def setUp(self): + super(GetProviderUserStatesTestCase, self).setUp() + self.user = social_models.DjangoStorage.user.create_user(username='username', password='password') + + def test_returns_empty_list_if_no_enabled_providers(self): + provider.Registry.configure_once([]) + self.assertEquals([], pipeline.get_provider_user_states(self.user)) + + def test_state_not_returned_for_disabled_provider(self): + disabled_provider = provider.GoogleOauth2 + enabled_provider = provider.LinkedInOauth2 + provider.Registry.configure_once([enabled_provider.NAME]) + social_models.DjangoStorage.user.create_social_auth(self.user, 'uid', disabled_provider.BACKEND_CLASS.name) + states = pipeline.get_provider_user_states(self.user) + + self.assertEqual(1, len(states)) + self.assertNotIn(disabled_provider, (state.provider for state in states)) + + def test_states_for_enabled_providers_user_has_accounts_associated_with(self): + provider.Registry.configure_once([provider.GoogleOauth2.NAME, provider.LinkedInOauth2.NAME]) + social_models.DjangoStorage.user.create_social_auth(self.user, 'uid', provider.GoogleOauth2.BACKEND_CLASS.name) + social_models.DjangoStorage.user.create_social_auth( + self.user, 'uid', provider.LinkedInOauth2.BACKEND_CLASS.name) + states = pipeline.get_provider_user_states(self.user) + + self.assertEqual(2, len(states)) + + google_state = [state for state in states if state.provider == provider.GoogleOauth2][0] + linkedin_state = [state for state in states if state.provider == provider.LinkedInOauth2][0] + + self.assertTrue(google_state.has_account) + self.assertEqual(provider.GoogleOauth2, google_state.provider) + self.assertEqual(self.user, google_state.user) + + self.assertTrue(linkedin_state.has_account) + self.assertEqual(provider.LinkedInOauth2, linkedin_state.provider) + self.assertEqual(self.user, linkedin_state.user) + + def test_states_for_enabled_providers_user_has_no_account_associated_with(self): + provider.Registry.configure_once([provider.GoogleOauth2.NAME, provider.LinkedInOauth2.NAME]) + states = pipeline.get_provider_user_states(self.user) + + self.assertEqual([], [x for x in social_models.DjangoStorage.user.objects.all()]) + self.assertEqual(2, len(states)) + + google_state = [state for state in states if state.provider == provider.GoogleOauth2][0] + linkedin_state = [state for state in states if state.provider == provider.LinkedInOauth2][0] + + self.assertFalse(google_state.has_account) + self.assertEqual(provider.GoogleOauth2, google_state.provider) + self.assertEqual(self.user, google_state.user) + + self.assertFalse(linkedin_state.has_account) + self.assertEqual(provider.LinkedInOauth2, linkedin_state.provider) + self.assertEqual(self.user, linkedin_state.user) + + +@unittest.skipUnless( + testutil.AUTH_FEATURES_KEY in settings.FEATURES, testutil.AUTH_FEATURES_KEY + ' not in settings.FEATURES') +class UrlFormationTestCase(TestCase): + """Tests formation of URLs for pipeline hook points.""" + + def test_complete_url_raises_value_error_if_provider_not_enabled(self): + provider_name = 'not_enabled' + + self.assertIsNone(provider.Registry.get(provider_name)) + + with self.assertRaises(ValueError): + pipeline.get_complete_url(provider_name) + + def test_complete_url_returns_expected_format(self): + complete_url = pipeline.get_complete_url(self.enabled_provider.BACKEND_CLASS.name) + + self.assertTrue(complete_url.startswith('/auth/complete')) + self.assertIn(self.enabled_provider.BACKEND_CLASS.name, complete_url) + + def test_disconnect_url_raises_value_error_if_provider_not_enabled(self): + provider_name = 'not_enabled' + + self.assertIsNone(provider.Registry.get(provider_name)) + + with self.assertRaises(ValueError): + pipeline.get_disconnect_url(provider_name) + + def test_disconnect_url_returns_expected_format(self): + disconnect_url = pipeline.get_disconnect_url(self.enabled_provider.NAME) + + self.assertTrue(disconnect_url.startswith('/auth/disconnect')) + self.assertIn(self.enabled_provider.BACKEND_CLASS.name, disconnect_url) + + def test_login_url_raises_value_error_if_provider_not_enabled(self): + provider_name = 'not_enabled' + + self.assertIsNone(provider.Registry.get(provider_name)) + + with self.assertRaises(ValueError): + pipeline.get_login_url(provider_name, pipeline.AUTH_ENTRY_LOGIN) + + def test_login_url_returns_expected_format(self): + login_url = pipeline.get_login_url(self.enabled_provider.NAME, pipeline.AUTH_ENTRY_LOGIN) + + self.assertTrue(login_url.startswith('/auth/login')) + self.assertIn(self.enabled_provider.BACKEND_CLASS.name, login_url) + self.assertTrue(login_url.endswith(pipeline.AUTH_ENTRY_LOGIN)) diff --git a/common/djangoapps/third_party_auth/tests/test_provider.py b/common/djangoapps/third_party_auth/tests/test_provider.py index 18774eb61a74..20120d73290c 100644 --- a/common/djangoapps/third_party_auth/tests/test_provider.py +++ b/common/djangoapps/third_party_auth/tests/test_provider.py @@ -1,6 +1,4 @@ -""" -Test configuration of providers. -""" +"""Unit tests for provider.py.""" from third_party_auth import provider from third_party_auth.tests import testutil @@ -10,8 +8,7 @@ class RegistryTest(testutil.TestCase): """Tests registry discovery and operation.""" # Allow access to protected methods (or module-protected methods) under - # test. - # pylint: disable-msg=protected-access + # test. pylint: disable-msg=protected-access def test_calling_configure_once_twice_raises_value_error(self): provider.Registry.configure_once([provider.GoogleOauth2.NAME]) @@ -68,4 +65,18 @@ def test_get_returns_enabled_provider(self): def test_get_returns_none_if_provider_not_enabled(self): provider.Registry.configure_once([]) - self.assertIsNone(provider.Registry.get(provider.MozillaPersona.NAME)) + self.assertIsNone(provider.Registry.get(provider.LinkedInOauth2.NAME)) + + def test_get_by_backend_name_raises_runtime_error_if_not_configured(self): + with self.assertRaisesRegexp(RuntimeError, '^.*not configured$'): + provider.Registry.get_by_backend_name('') + + def test_get_by_backend_name_returns_enabled_provider(self): + provider.Registry.configure_once([provider.GoogleOauth2.NAME]) + self.assertIs( + provider.GoogleOauth2, + provider.Registry.get_by_backend_name(provider.GoogleOauth2.BACKEND_CLASS.name)) + + def test_get_by_backend_name_returns_none_if_provider_not_enabled(self): + provider.Registry.configure_once([]) + self.assertIsNone(provider.Registry.get_by_backend_name(provider.GoogleOauth2.BACKEND_CLASS.name)) diff --git a/common/djangoapps/third_party_auth/tests/test_settings.py b/common/djangoapps/third_party_auth/tests/test_settings.py index 05f502928430..b75e4bc032ae 100644 --- a/common/djangoapps/third_party_auth/tests/test_settings.py +++ b/common/djangoapps/third_party_auth/tests/test_settings.py @@ -1,18 +1,17 @@ -""" -Unit tests for settings code. -""" +"""Unit tests for settings.py.""" -from third_party_auth import provider -from third_party_auth import settings +from third_party_auth import provider, settings from third_party_auth.tests import testutil _ORIGINAL_AUTHENTICATION_BACKENDS = ('first_authentication_backend',) _ORIGINAL_INSTALLED_APPS = ('first_installed_app',) +_ORIGINAL_MIDDLEWARE_CLASSES = ('first_middleware_class',) _ORIGINAL_TEMPLATE_CONTEXT_PROCESSORS = ('first_template_context_preprocessor',) _SETTINGS_MAP = { 'AUTHENTICATION_BACKENDS': _ORIGINAL_AUTHENTICATION_BACKENDS, 'INSTALLED_APPS': _ORIGINAL_INSTALLED_APPS, + 'MIDDLEWARE_CLASSES': _ORIGINAL_MIDDLEWARE_CLASSES, 'TEMPLATE_CONTEXT_PROCESSORS': _ORIGINAL_TEMPLATE_CONTEXT_PROCESSORS, } @@ -20,6 +19,8 @@ class SettingsUnitTest(testutil.TestCase): """Unit tests for settings management code.""" + # Allow access to protected methods (or module-protected methods) under + # test. pylint: disable-msg=protected-access # Suppress sprurious no-member warning on fakes. # pylint: disable-msg=no-member @@ -27,6 +28,15 @@ def setUp(self): super(SettingsUnitTest, self).setUp() self.settings = testutil.FakeDjangoSettings(_SETTINGS_MAP) + def test_apply_settings_adds_exception_middleware(self): + settings.apply_settings({}, self.settings) + for middleware_name in settings._MIDDLEWARE_CLASSES: + self.assertIn(middleware_name, self.settings.MIDDLEWARE_CLASSES) + + def test_apply_settings_adds_fields_stored_in_session(self): + settings.apply_settings({}, self.settings) + self.assertEqual(settings._FIELDS_STORED_IN_SESSION, self.settings.FIELDS_STORED_IN_SESSION) + def test_apply_settings_adds_third_party_auth_to_installed_apps(self): settings.apply_settings({}, self.settings) self.assertIn('third_party_auth', self.settings.INSTALLED_APPS) @@ -50,9 +60,9 @@ def test_apply_settings_initializes_stubs_and_merges_settings_from_auth_info(sel def test_apply_settings_prepends_auth_backends(self): self.assertEqual(_ORIGINAL_AUTHENTICATION_BACKENDS, self.settings.AUTHENTICATION_BACKENDS) - settings.apply_settings({provider.GoogleOauth2.NAME: {}, provider.MozillaPersona.NAME: {}}, self.settings) + settings.apply_settings({provider.GoogleOauth2.NAME: {}, provider.LinkedInOauth2.NAME: {}}, self.settings) self.assertEqual(( - provider.GoogleOauth2.AUTHENTICATION_BACKEND, provider.MozillaPersona.AUTHENTICATION_BACKEND) + + provider.GoogleOauth2.get_authentication_backend(), provider.LinkedInOauth2.get_authentication_backend()) + _ORIGINAL_AUTHENTICATION_BACKENDS, self.settings.AUTHENTICATION_BACKENDS) @@ -66,3 +76,9 @@ def test_apply_settings_raises_value_error_if_provider_contains_uninitialized_se } with self.assertRaisesRegexp(ValueError, '^.*not initialized$'): settings.apply_settings(auth_info, self.settings) + + def test_apply_settings_turns_off_raising_social_exceptions(self): + # Guard against submitting a conf change that's convenient in dev but + # bad in prod. + settings.apply_settings({}, self.settings) + self.assertFalse(self.settings.SOCIAL_AUTH_RAISE_EXCEPTIONS) diff --git a/common/djangoapps/third_party_auth/tests/test_settings_integration.py b/common/djangoapps/third_party_auth/tests/test_settings_integration.py index 15cff5605a18..8992f9fb79c9 100644 --- a/common/djangoapps/third_party_auth/tests/test_settings_integration.py +++ b/common/djangoapps/third_party_auth/tests/test_settings_integration.py @@ -1,9 +1,4 @@ -""" -Integration tests for settings code. -""" - -import mock -import unittest +"""Integration tests for settings.py.""" from django.conf import settings @@ -11,29 +6,22 @@ from third_party_auth import settings as auth_settings from third_party_auth.tests import testutil -_AUTH_FEATURES_KEY = 'ENABLE_THIRD_PARTY_AUTH' - class SettingsIntegrationTest(testutil.TestCase): - """Integration tests of auth settings pipeline.""" + """Integration tests of auth settings pipeline. - @unittest.skipUnless(_AUTH_FEATURES_KEY in settings.FEATURES, _AUTH_FEATURES_KEY + ' not in settings.FEATURES') - def test_enable_third_party_auth_is_disabled_by_default(self): - self.assertIs(False, settings.FEATURES.get(_AUTH_FEATURES_KEY)) + Note that ENABLE_THIRD_PARTY_AUTH is True in lms/envs/test.py and False in + cms/envs/test.py. This implicitly gives us coverage of the full settings + mechanism with both values, so we do not have explicit test methods as they + are superfluous. + """ - @mock.patch.dict(settings.FEATURES, {'ENABLE_THIRD_PARTY_AUTH': True}) def test_can_enable_google_oauth2(self): auth_settings.apply_settings({'Google': {'SOCIAL_AUTH_GOOGLE_OAUTH2_KEY': 'google_key'}}, settings) self.assertEqual([provider.GoogleOauth2], provider.Registry.enabled()) self.assertEqual('google_key', settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEY) - @mock.patch.dict(settings.FEATURES, {'ENABLE_THIRD_PARTY_AUTH': True}) def test_can_enable_linkedin_oauth2(self): auth_settings.apply_settings({'LinkedIn': {'SOCIAL_AUTH_LINKEDIN_OAUTH2_KEY': 'linkedin_key'}}, settings) self.assertEqual([provider.LinkedInOauth2], provider.Registry.enabled()) self.assertEqual('linkedin_key', settings.SOCIAL_AUTH_LINKEDIN_OAUTH2_KEY) - - @mock.patch.dict(settings.FEATURES, {'ENABLE_THIRD_PARTY_ATUH': True}) - def test_can_enable_mozilla_persona(self): - auth_settings.apply_settings({'Mozilla Persona': {}}, settings) - self.assertEqual([provider.MozillaPersona], provider.Registry.enabled()) diff --git a/common/djangoapps/third_party_auth/tests/testutil.py b/common/djangoapps/third_party_auth/tests/testutil.py index a431aaca02fd..6907cea26eb7 100644 --- a/common/djangoapps/third_party_auth/tests/testutil.py +++ b/common/djangoapps/third_party_auth/tests/testutil.py @@ -9,11 +9,14 @@ from third_party_auth import provider +AUTH_FEATURES_KEY = 'ENABLE_THIRD_PARTY_AUTH' + + class FakeDjangoSettings(object): """A fake for Django settings.""" def __init__(self, mappings): - """Initializes the fake from `mappings`, a dict.""" + """Initializes the fake from mappings dict.""" for key, value in mappings.iteritems(): setattr(self, key, value) diff --git a/common/djangoapps/third_party_auth/urls.py b/common/djangoapps/third_party_auth/urls.py index 05322a680d2a..dc02425ef393 100644 --- a/common/djangoapps/third_party_auth/urls.py +++ b/common/djangoapps/third_party_auth/urls.py @@ -2,6 +2,8 @@ from django.conf.urls import include, patterns, url + urlpatterns = patterns( - '', url(r'^auth/', include('social.apps.django_app.urls', namespace='social')), + '', + url(r'^auth/', include('social.apps.django_app.urls', namespace='social')), ) diff --git a/common/lib/capa/capa/inputtypes.py b/common/lib/capa/capa/inputtypes.py index a0631a12db04..f66abf9134e9 100644 --- a/common/lib/capa/capa/inputtypes.py +++ b/common/lib/capa/capa/inputtypes.py @@ -39,6 +39,7 @@ # makes sense, but a bunch of problems have markup that assumes block. Bigger TODO: figure out a # general css and layout strategy for capa, document it, then implement it. +import time import json import logging from lxml import etree @@ -53,6 +54,7 @@ from chem import chemcalc from calc.preview import latex_preview import xqueue_interface +from xqueue_interface import XQUEUE_TIMEOUT from datetime import datetime from xmodule.stringify import stringify_children @@ -821,6 +823,15 @@ def setup(self): self.status = 'queued' self.queue_len = 1 self.msg = self.submitted_msg + # Handle situation if no response from xqueue arrived during specified time. + if ('queuetime' not in self.input_state or + time.time() - self.input_state['queuetime'] > XQUEUE_TIMEOUT): + self.queue_len = 0 + self.status = 'unsubmitted' + self.msg = _( + 'No response from Xqueue within {xqueue_timeout} seconds. Aborted.' + ).format(xqueue_timeout=XQUEUE_TIMEOUT) + def handle_ajax(self, dispatch, data): """ @@ -945,6 +956,7 @@ def _plot_data(self, data): if error == 0: self.input_state['queuekey'] = queuekey self.input_state['queuestate'] = 'queued' + self.input_state['queuetime'] = time.time() return {'success': error == 0, 'message': msg} diff --git a/common/lib/capa/capa/tests/test_inputtypes.py b/common/lib/capa/capa/tests/test_inputtypes.py index cba14ff0f27b..c1240c73bf7a 100644 --- a/common/lib/capa/capa/tests/test_inputtypes.py +++ b/common/lib/capa/capa/tests/test_inputtypes.py @@ -28,6 +28,8 @@ from mock import ANY, patch from pyparsing import ParseException +from capa.xqueue_interface import XQUEUE_TIMEOUT + # just a handy shortcut lookup_tag = inputtypes.registry.get_class_for_tag @@ -524,10 +526,11 @@ def test_rendering_when_completed(self): self.assertEqual(context, expected) - def test_rendering_while_queued(self): + @patch('capa.inputtypes.time.time', return_value=10) + def test_rendering_while_queued(self, time): state = {'value': 'print "good evening"', 'status': 'incomplete', - 'input_state': {'queuestate': 'queued'}, + 'input_state': {'queuestate': 'queued', 'queuetime': 5}, } elt = etree.fromstring(self.xml) @@ -576,9 +579,10 @@ def test_plot_data_failure(self): self.assertTrue('queuekey' not in self.the_input.input_state) self.assertTrue('queuestate' not in self.the_input.input_state) - def test_ungraded_response_success(self): + @patch('capa.inputtypes.time.time', return_value=10) + def test_ungraded_response_success(self, time): queuekey = 'abcd' - input_state = {'queuekey': queuekey, 'queuestate': 'queued'} + input_state = {'queuekey': queuekey, 'queuestate': 'queued', 'queuetime': 5} state = {'value': 'print "good evening"', 'status': 'incomplete', 'input_state': input_state, @@ -594,9 +598,10 @@ def test_ungraded_response_success(self): self.assertTrue(input_state['queuestate'] is None) self.assertEqual(input_state['queue_msg'], inner_msg) - def test_ungraded_response_key_mismatch(self): + @patch('capa.inputtypes.time.time', return_value=10) + def test_ungraded_response_key_mismatch(self, time): queuekey = 'abcd' - input_state = {'queuekey': queuekey, 'queuestate': 'queued'} + input_state = {'queuekey': queuekey, 'queuestate': 'queued', 'queuetime': 5} state = {'value': 'print "good evening"', 'status': 'incomplete', 'input_state': input_state, @@ -612,6 +617,41 @@ def test_ungraded_response_key_mismatch(self): self.assertEqual(input_state['queuestate'], 'queued') self.assertFalse('queue_msg' in input_state) + @patch('capa.inputtypes.time.time', return_value=20) + def test_matlab_response_timeout_not_exceeded(self, time): + + state = {'input_state': {'queuestate': 'queued', 'queuetime': 5}} + elt = etree.fromstring(self.xml) + + the_input = self.input_class(test_capa_system(), elt, state) + context = the_input._get_render_context() + self.assertEqual(the_input.status, 'queued') + + + @patch('capa.inputtypes.time.time', return_value=45) + def test_matlab_response_timeout_exceeded(self, time): + + state = {'input_state': {'queuestate': 'queued', 'queuetime': 5}} + elt = etree.fromstring(self.xml) + + the_input = self.input_class(test_capa_system(), elt, state) + context = the_input._get_render_context() + self.assertEqual(the_input.status, 'unsubmitted') + self.assertEqual(the_input.msg, 'No response from Xqueue within {} seconds. Aborted.'.format(XQUEUE_TIMEOUT)) + + @patch('capa.inputtypes.time.time', return_value=20) + def test_matlab_response_migration_of_queuetime(self, time): + """ + Test if problem was saved before queuetime was introduced. + """ + state = {'input_state': {'queuestate': 'queued'}} + elt = etree.fromstring(self.xml) + + the_input = self.input_class(test_capa_system(), elt, state) + context = the_input._get_render_context() + self.assertEqual(the_input.status, 'unsubmitted') + + def test_get_html(self): # usual output output = self.the_input.get_html() @@ -651,7 +691,7 @@ def test_malformed_queue_msg(self): queue_msg = textwrap.dedent("""
if Conditionally execute statements. The general form of the if statement is - + if expression statements ELSEIF expression @@ -659,11 +699,11 @@ def test_malformed_queue_msg(self): ELSE statements END - - The statements are executed if the real part of the expression + + The statements are executed if the real part of the expression has all non-zero elements. The ELSE and ELSEIF parts are optional. Zero or more ELSEIF parts can be used as well as nested if's. - The expression is usually of the form expr rop expr where + The expression is usually of the form expr rop expr where rop is ==, <, >, <=, >=, or ~=. @@ -675,7 +715,7 @@ def test_malformed_queue_msg(self): else A(I,J) = 0; end - + See also relop, else, elseif, end, for, while, switch. Reference page in Help browser @@ -693,7 +733,7 @@ def test_malformed_queue_msg(self): the_input = self.input_class(test_capa_system(), elt, state) context = the_input._get_render_context() # pylint: disable=W0212 self.maxDiff = None - expected = u'\n
if Conditionally execute statements.\nThe general form of the if statement is\n\n if expression\n statements\n ELSEIF expression\n statements\n ELSE\n statements\n END\n\nThe statements are executed if the real part of the expression \nhas all non-zero elements. The ELSE and ELSEIF parts are optional.\nZero or more ELSEIF parts can be used as well as nested if\'s.\nThe expression is usually of the form expr rop expr where \nrop is ==, <, >, <=, >=, or ~=.\n\n\nExample\n if I == J\n A(I,J) = 2;\n elseif abs(I-J) == 1\n A(I,J) = -1;\n else\n A(I,J) = 0;\n end\n\nSee also relop, else, elseif, end, for, while, switch.\n\nReference page in Help browser\n doc if\n\n
    \n' + expected = u'\n
    if Conditionally execute statements.\nThe general form of the if statement is\n\n if expression\n statements\n ELSEIF expression\n statements\n ELSE\n statements\n END\n\nThe statements are executed if the real part of the expression\nhas all non-zero elements. The ELSE and ELSEIF parts are optional.\nZero or more ELSEIF parts can be used as well as nested if\'s.\nThe expression is usually of the form expr rop expr where\nrop is ==, <, >, <=, >=, or ~=.\n\n\nExample\n if I == J\n A(I,J) = 2;\n elseif abs(I-J) == 1\n A(I,J) = -1;\n else\n A(I,J) = 0;\n end\n\nSee also relop, else, elseif, end, for, while, switch.\n\nReference page in Help browser\n doc if\n\n
      \n' self.assertEqual(context['queue_msg'], expected) diff --git a/common/lib/capa/capa/xqueue_interface.py b/common/lib/capa/capa/xqueue_interface.py index 10c63946540d..0603b65237be 100644 --- a/common/lib/capa/capa/xqueue_interface.py +++ b/common/lib/capa/capa/xqueue_interface.py @@ -13,6 +13,9 @@ XQUEUE_METRIC_NAME = 'edxapp.xqueue' +# Wait time for response from Xqueue. +XQUEUE_TIMEOUT = 35 # seconds + def make_hashkey(seed): """ diff --git a/common/lib/mail_utils.py b/common/lib/mail_utils.py new file mode 100644 index 000000000000..35881bd25a72 --- /dev/null +++ b/common/lib/mail_utils.py @@ -0,0 +1,22 @@ +""" +Utilities related to mailing. +""" + +import textwrap + +MAX_LINE_LENGTH = 900 + + +def wrap_message(message, width=MAX_LINE_LENGTH): + """ + RFC 2822 states that line lengths in emails must be less than 998. Some MTA's add newlines to messages if any line + exceeds a certain limit (the exact limit varies). Sendmail goes so far as to add '!\n' after the 990th character in + a line. To ensure that messages look consistent this helper function wraps long lines to a conservative length. + """ + lines = message.split('\n') + wrapped_lines = [textwrap.fill( + line, width, expand_tabs=False, replace_whitespace=False, drop_whitespace=False, break_on_hyphens=False + ) for line in lines] + wrapped_message = '\n'.join(wrapped_lines) + + return wrapped_message diff --git a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee index 53c484ad79ed..29e95dade5f8 100644 --- a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee +++ b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee @@ -48,6 +48,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor ### onShowXMLButton: (e) => e.preventDefault(); + @addRemoveCheatsheetCSS() if @confirmConversionToXml() @createXMLEditor(MarkdownEditingDescriptor.markdownToXml(@markdown_editor.getValue())) # Need to refresh to get line numbers to display properly (and put cursor position to 0) @@ -94,11 +95,22 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor @cheatsheet = $($('#simple-editor-cheatsheet').html()) $(@markdown_editor.getWrapperElement()).append(@cheatsheet) - $(".CodeMirror").css({"overflow": "visible"}) - $(".modal-content").css({"overflow-y": "visible", "overflow-x": "visible"}) + @addRemoveCheatsheetCSS() setTimeout (=> @cheatsheet.toggleClass('shown')), 10 + + ### + Function to add/remove CSS for cheatsheet. + ### + addRemoveCheatsheetCSS: () => + if !@cheatsheet.hasClass("shown") + $(".CodeMirror").css({"overflow": "visible"}) + $(".modal-content").css({"overflow-y": "visible", "overflow-x": "visible"}) + else + $(".CodeMirror").removeAttr("style") + $(".modal-content").removeAttr("style") + ### Stores the current editor and hides the one that is not displayed. ### diff --git a/common/lib/xmodule/xmodule/modulestore/xml_importer.py b/common/lib/xmodule/xmodule/modulestore/xml_importer.py index b9dd91d09e79..2902d3f6f816 100644 --- a/common/lib/xmodule/xmodule/modulestore/xml_importer.py +++ b/common/lib/xmodule/xmodule/modulestore/xml_importer.py @@ -176,6 +176,32 @@ def import_from_xml( if module.scope_ids.block_type == 'course': course_data_path = path(data_dir) / module.data_dir course_location = module.location + course_prefix = u'{0.org}/{0.course}'.format(course_location) + + # Check to see if a course with the same + # pseudo_course_id, but different run exists in + # the passed store to avoid broken courses + courses = store.get_courses() + bad_run = False + for course in courses: + if course.location.course_id.startswith(course_prefix): + log.debug('Import is overwriting existing course') + # Importing over existing course, check + # that runs match or fail + if course.location.name != module.location.name: + log.error( + 'A course with ID %s exists, and this ' + 'course has the same organization and ' + 'course number, but a different term that ' + 'is fully identified as %s.', + course.location.course_id, + module.location.course_id + ) + bad_run = True + break + if bad_run: + # Skip this course, but keep trying to import courses + continue log.debug('======> IMPORTING course to location {loc}'.format( loc=course_location @@ -517,12 +543,13 @@ def remap_namespace(module, target_location_namespace): # There is more re-namespacing work we have to do when # importing course modules - # remap pdf_textbook urls + # remap pdf_textbook urls to portable static URLs for entry in module.pdf_textbooks: for chapter in entry.get('chapters', []): if StaticContent.is_c4x_path(chapter.get('url', '')): - chapter['url'] = StaticContent.renamespace_c4x_path( - chapter['url'], target_location_namespace + chapter_loc = StaticContent.get_location_from_path(chapter['url']) + chapter['url'] = StaticContent.get_static_path_from_location( + chapter_loc ) # Original wiki_slugs had value location.course. To make them unique this was changed to 'org.course.name'. diff --git a/common/lib/xmodule/xmodule/video_module/video_xfields.py b/common/lib/xmodule/xmodule/video_module/video_xfields.py index f70e5e2841f4..32aace782ff7 100644 --- a/common/lib/xmodule/xmodule/video_module/video_xfields.py +++ b/common/lib/xmodule/xmodule/video_module/video_xfields.py @@ -7,6 +7,9 @@ from xmodule.fields import RelativeTime +# Make '_' a no-op so we can scrape strings +_ = lambda text: text + class VideoFields(object): """Fields for `VideoModule` and `VideoDescriptor`.""" @@ -121,8 +124,9 @@ class VideoFields(object): help="Transcript file format to download by user.", scope=Scope.preferences, values=[ - {"display_name": "SubRip (.srt) file", "value": "srt"}, - {"display_name": "Text (.txt) file", "value": "txt"} + # Translators: This is a type of file used for captioning in the video player. + {"display_name": _("SubRip (.srt) file"), "value": "srt"}, + {"display_name": _("Text (.txt) file"), "value": "txt"} ], default='srt', ) diff --git a/common/test/acceptance/fixtures/discussion.py b/common/test/acceptance/fixtures/discussion.py index e9104f199cd2..4d3061a15c73 100644 --- a/common/test/acceptance/fixtures/discussion.py +++ b/common/test/acceptance/fixtures/discussion.py @@ -87,3 +87,19 @@ def push(self): "comments": json.dumps(self._get_comment_map()) } ) + +class UserProfileViewFixture(object): + + def __init__(self, threads): + self.threads = threads + + def push(self): + """ + Push the data to the stub comments service. + """ + requests.put( + '{}/set_config'.format(COMMENTS_STUB_URL), + data={ + "active_threads": json.dumps(self.threads), + } + ) diff --git a/common/test/acceptance/pages/lms/discussion.py b/common/test/acceptance/pages/lms/discussion.py index 5652ccfcca63..2ec289413164 100644 --- a/common/test/acceptance/pages/lms/discussion.py +++ b/common/test/acceptance/pages/lms/discussion.py @@ -231,3 +231,76 @@ def expand(self): "Thread expanded" ).fulfill() + +class DiscussionUserProfilePage(CoursePage): + + TEXT_NEXT = u'Next >' + TEXT_PREV = u'< Previous' + PAGING_SELECTOR = "a.discussion-pagination[data-page-number]" + + def __init__(self, browser, course_id, user_id, username, page=1): + super(DiscussionUserProfilePage, self).__init__(browser, course_id) + self.url_path = "discussion/forum/dummy/users/{}?page={}".format(user_id, page) + self.username = username + + def is_browser_on_page(self): + return ( + self.q(css='section.discussion-user-threads[data-course-id="{}"]'.format(self.course_id)).present + and + self.q(css='section.user-profile div.sidebar-username').present + and + self.q(css='section.user-profile div.sidebar-username').text[0] == self.username + ) + + def get_shown_thread_ids(self): + elems = self.q(css="article.discussion-thread") + return [elem.get_attribute("id")[7:] for elem in elems] + + def get_current_page(self): + return int(self.q(css="nav.discussion-paginator li.current-page").text[0]) + + def _check_pager(self, text, page_number=None): + """ + returns True if 'text' matches the text in any of the pagination elements. If + page_number is provided, only return True if the element points to that result + page. + """ + elems = self.q(css=self.PAGING_SELECTOR).filter(lambda elem: elem.text == text) + if page_number: + elems = elems.filter(lambda elem: int(elem.get_attribute('data-page-number')) == page_number) + return elems.present + + def get_clickable_pages(self): + return sorted([ + int(elem.get_attribute('data-page-number')) + for elem in self.q(css=self.PAGING_SELECTOR) + if str(elem.text).isdigit() + ]) + + def is_prev_button_shown(self, page_number=None): + return self._check_pager(self.TEXT_PREV, page_number) + + def is_next_button_shown(self, page_number=None): + return self._check_pager(self.TEXT_NEXT, page_number) + + def _click_pager_with_text(self, text, page_number): + """ + click the first pagination element with whose text is `text` and ensure + the resulting page number matches `page_number`. + """ + targets = [elem for elem in self.q(css=self.PAGING_SELECTOR) if elem.text == text] + targets[0].click() + EmptyPromise( + lambda: self.get_current_page() == page_number, + "navigated to desired page" + ).fulfill() + + def click_prev_page(self): + self._click_pager_with_text(self.TEXT_PREV, self.get_current_page() - 1) + + def click_next_page(self): + self._click_pager_with_text(self.TEXT_NEXT, self.get_current_page() + 1) + + def click_on_page(self, page_number): + self._click_pager_with_text(unicode(page_number), page_number) + diff --git a/common/test/acceptance/pages/lms/video.py b/common/test/acceptance/pages/lms/video.py index 0974cea65c34..fe07f4d1bab4 100644 --- a/common/test/acceptance/pages/lms/video.py +++ b/common/test/acceptance/pages/lms/video.py @@ -47,7 +47,6 @@ } - @js_defined('window.Video', 'window.RequireJS.require', 'window.jQuery') class VideoPage(PageObject): """ diff --git a/common/test/acceptance/tests/test_discussion.py b/common/test/acceptance/tests/test_discussion.py index cad4779bb2bf..49813948bab6 100644 --- a/common/test/acceptance/tests/test_discussion.py +++ b/common/test/acceptance/tests/test_discussion.py @@ -10,10 +10,11 @@ from ..pages.lms.discussion import ( DiscussionTabSingleThreadPage, InlineDiscussionPage, - InlineDiscussionThreadPage + InlineDiscussionThreadPage, + DiscussionUserProfilePage ) from ..fixtures.course import CourseFixture, XBlockFixtureDesc -from ..fixtures.discussion import SingleThreadViewFixture, Thread, Response, Comment +from ..fixtures.discussion import SingleThreadViewFixture, UserProfileViewFixture, Thread, Response, Comment class DiscussionResponsePaginationTestMixin(object): @@ -301,3 +302,106 @@ def test_initial_render(self): def test_expand_discussion_empty(self): self.discussion_page.expand_discussion() self.assertEqual(self.discussion_page.get_num_displayed_threads(), 0) + + +class DiscussionUserProfileTest(UniqueCourseTest): + """ + Tests for user profile page in discussion tab. + """ + + PAGE_SIZE = 20 # django_comment_client.forum.views.THREADS_PER_PAGE + PROFILED_USERNAME = "profiled-user" + + def setUp(self): + super(DiscussionUserProfileTest, self).setUp() + CourseFixture(**self.course_info).install() + # The following line creates a user enrolled in our course, whose + # threads will be viewed, but not the one who will view the page. + # It isn't necessary to log them in, but using the AutoAuthPage + # saves a lot of code. + self.profiled_user_id = AutoAuthPage( + self.browser, + username=self.PROFILED_USERNAME, + course_id=self.course_id + ).visit().get_user_id() + # now create a second user who will view the profile. + self.user_id = AutoAuthPage( + self.browser, + course_id=self.course_id + ).visit().get_user_id() + + def check_pages(self, num_threads): + # set up the stub server to return the desired amount of thread results + threads = [Thread(id=uuid4().hex) for _ in range(num_threads)] + UserProfileViewFixture(threads).push() + # navigate to default view (page 1) + page = DiscussionUserProfilePage( + self.browser, + self.course_id, + self.profiled_user_id, + self.PROFILED_USERNAME + ) + page.visit() + + current_page = 1 + total_pages = max(num_threads - 1, 1) / self.PAGE_SIZE + 1 + all_pages = range(1, total_pages + 1) + + def _check_page(): + # ensure the page being displayed as "current" is the expected one + self.assertEqual(page.get_current_page(), current_page) + # ensure the expected threads are being shown in the right order + threads_expected = threads[(current_page - 1) * self.PAGE_SIZE:current_page * self.PAGE_SIZE] + self.assertEqual(page.get_shown_thread_ids(), [t["id"] for t in threads_expected]) + # ensure the clickable page numbers are the expected ones + self.assertEqual(page.get_clickable_pages(), [ + p for p in all_pages + if p != current_page + and p - 2 <= current_page <= p + 2 + or (current_page > 2 and p == 1) + or (current_page < total_pages and p == total_pages) + ]) + # ensure the previous button is shown, but only if it should be. + # when it is shown, make sure it works. + if current_page > 1: + self.assertTrue(page.is_prev_button_shown(current_page - 1)) + page.click_prev_page() + self.assertEqual(page.get_current_page(), current_page - 1) + page.click_next_page() + self.assertEqual(page.get_current_page(), current_page) + else: + self.assertFalse(page.is_prev_button_shown()) + # ensure the next button is shown, but only if it should be. + if current_page < total_pages: + self.assertTrue(page.is_next_button_shown(current_page + 1)) + else: + self.assertFalse(page.is_next_button_shown()) + + # click all the way up through each page + for i in range(current_page, total_pages): + _check_page() + if current_page < total_pages: + page.click_on_page(current_page + 1) + current_page += 1 + + # click all the way back down + for i in range(current_page, 0, -1): + _check_page() + if current_page > 1: + page.click_on_page(current_page - 1) + current_page -= 1 + + def test_0_threads(self): + self.check_pages(0) + + def test_1_thread(self): + self.check_pages(1) + + def test_20_threads(self): + self.check_pages(20) + + def test_21_threads(self): + self.check_pages(21) + + def test_151_threads(self): + self.check_pages(151) diff --git a/conf/locale/ar/LC_MESSAGES/django.mo b/conf/locale/ar/LC_MESSAGES/django.mo index 90df62fedada..cd89d039ae17 100644 Binary files a/conf/locale/ar/LC_MESSAGES/django.mo and b/conf/locale/ar/LC_MESSAGES/django.mo differ diff --git a/conf/locale/ar/LC_MESSAGES/django.po b/conf/locale/ar/LC_MESSAGES/django.po index 17b1b08d83f7..c55259856236 100644 --- a/conf/locale/ar/LC_MESSAGES/django.po +++ b/conf/locale/ar/LC_MESSAGES/django.po @@ -50,6 +50,7 @@ # may , 2014 # najwan , 2013 # najwan , 2013 +# sarina , 2014 # #-#-#-#-# mako-studio.po (edx-platform) #-#-#-#-# # edX translation file # Copyright (C) 2014 edX @@ -62,6 +63,7 @@ # jkfreij , 2014 # khateeb , 2013 # najwan , 2013 +# sarina , 2014 # #-#-#-#-# messages.po (edx-platform) #-#-#-#-# # edX translation file # Copyright (C) 2013 edX @@ -83,7 +85,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-11 14:11+0000\n" "Last-Translator: Almaazon \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/edx-platform/language/ar/)\n" @@ -216,6 +218,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -856,6 +868,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3849,7 +3865,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4190,11 +4207,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4743,6 +4796,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5069,6 +5137,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5539,6 +5627,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6470,6 +6562,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7141,10 +7237,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7168,6 +7260,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7207,6 +7303,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7309,10 +7410,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/ar/LC_MESSAGES/djangojs.mo b/conf/locale/ar/LC_MESSAGES/djangojs.mo index 2fed1367cf44..9a005f6a8f9c 100644 Binary files a/conf/locale/ar/LC_MESSAGES/djangojs.mo and b/conf/locale/ar/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/ar/LC_MESSAGES/djangojs.po b/conf/locale/ar/LC_MESSAGES/djangojs.po index c444669b4257..595804891f8d 100644 --- a/conf/locale/ar/LC_MESSAGES/djangojs.po +++ b/conf/locale/ar/LC_MESSAGES/djangojs.po @@ -36,8 +36,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-17 10:24+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-26 09:40+0000\n" "Last-Translator: may \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/edx-platform/language/ar/)\n" "MIME-Version: 1.0\n" @@ -379,6 +379,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -565,6 +566,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1639,6 +1644,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/ca/LC_MESSAGES/django.mo b/conf/locale/ca/LC_MESSAGES/django.mo index 1e3a86b04974..74e668efe0e2 100644 Binary files a/conf/locale/ca/LC_MESSAGES/django.mo and b/conf/locale/ca/LC_MESSAGES/django.mo differ diff --git a/conf/locale/ca/LC_MESSAGES/django.po b/conf/locale/ca/LC_MESSAGES/django.po index 2bb6da514ca2..fcc30902e9c3 100644 --- a/conf/locale/ca/LC_MESSAGES/django.po +++ b/conf/locale/ca/LC_MESSAGES/django.po @@ -21,6 +21,7 @@ # # Translators: # claudi , 2014 +# mcolomer , 2014 # #-#-#-#-# mako-studio.po (edx-platform) #-#-#-#-# # edX translation file # Copyright (C) 2014 edX @@ -42,13 +43,14 @@ # # Translators: # claudi , 2014 +# mcolomer , 2014 msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" -"PO-Revision-Date: 2014-03-23 19:30+0000\n" -"Last-Translator: claudi \n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" +"PO-Revision-Date: 2014-04-25 17:00+0000\n" +"Last-Translator: mcolomer \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/edx-platform/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -75,15 +77,15 @@ msgstr "Inscripcions tancades" #: common/djangoapps/course_modes/views.py msgid "Enrollment mode not supported" -msgstr "" +msgstr "Mode d'inscripció insuportable." #: common/djangoapps/course_modes/views.py msgid "Invalid amount selected." -msgstr "" +msgstr "Quantitat sel·leccionada invàlida." #: common/djangoapps/course_modes/views.py msgid "No selected price or selected price is too low." -msgstr "" +msgstr "Preu no sel·leccionat o massa baix." #: common/djangoapps/django_comment_common/models.py msgid "Administrator" @@ -179,6 +181,16 @@ msgstr "No estàs inscrit en aquest curs" msgid "Enrollment action is invalid" msgstr "La inscripció no és vàlida" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -202,7 +214,7 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "Massa errors per entrar. Prova-ho de nou més tard." -#: common/djangoapps/student/views.py +#: common/djangoapps/student/views.py lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "Email contrasenya incorrectes." @@ -826,6 +838,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -948,11 +964,11 @@ msgstr "" #: common/lib/xmodule/xmodule/capa_base.py msgid "Check" -msgstr "" +msgstr "Comprovar" #: common/lib/xmodule/xmodule/capa_base.py msgid "Final Check" -msgstr "" +msgstr "Comprovació final" #: common/lib/xmodule/xmodule/capa_base.py msgid "Checking..." @@ -1089,8 +1105,10 @@ msgstr "" msgid "Course Info" msgstr "" +#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# #. Translators: "Progress" is the name of the student's course progress page #: common/lib/xmodule/xmodule/tabs.py +#: lms/templates/peer_grading/peer_grading.html msgid "Progress" msgstr "Progrés" @@ -1126,9 +1144,10 @@ msgstr "" msgid "Peer grading" msgstr "" +#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# #. Translators: "Syllabus" appears on a tab that, when clicked, opens the #. syllabus of the course. -#: common/lib/xmodule/xmodule/tabs.py +#: common/lib/xmodule/xmodule/tabs.py lms/templates/courseware/syllabus.html msgid "Syllabus" msgstr "Síl·laba" @@ -1379,10 +1398,13 @@ msgstr "Índex" #: common/static/js/vendor/mathjax-MathJax-c9db6ac/docs/source/mjtheme/layout.html #: lms/templates/wiki/plugins/attachments/index.html +#: lms/templates/discussion/_thread_list_template.html msgid "Search" msgstr "Cerca" #: common/static/js/vendor/mathjax-MathJax-c9db6ac/docs/source/mjtheme/layout.html +#: lms/templates/static_templates/copyright.html +#: lms/templates/static_templates/copyright.html msgid "Copyright" msgstr "Copyright" @@ -1440,7 +1462,7 @@ msgstr "" msgid "User {username} has never accessed problem {location}" msgstr "" -#: lms/djangoapps/courseware/features/video.py +#: lms/djangoapps/courseware/features/video.py lms/templates/video.html msgid "ERROR: No playable video sources found!" msgstr "ERROR: no s'han trobat fonts de vídeo visibles!" @@ -1791,15 +1813,23 @@ msgstr "La tasca ja s'està executant." #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/tools.py +#: lms/templates/instructor/instructor_dashboard_2/metrics.html +#: lms/templates/instructor/instructor_dashboard_2/metrics.html msgid "Username" msgstr "Nom d'usuari" -#: lms/djangoapps/instructor/views/api.py +#: lms/djangoapps/instructor/views/api.py lms/templates/help_modal.html +#: lms/templates/instructor/instructor_dashboard_2/metrics.html +#: lms/templates/instructor/instructor_dashboard_2/metrics.html +#: lms/templates/open_ended_problems/open_ended_flagged_problems.html msgid "Name" msgstr "Nom" #: lms/djangoapps/instructor/views/api.py #: lms/djangoapps/instructor/views/instructor_dashboard.py +#: lms/templates/dashboard.html +#: lms/templates/courseware/instructor_dashboard.html +#: lms/templates/university_profile/edge.html msgid "Email" msgstr "Email" @@ -1885,10 +1915,12 @@ msgid "Extensions" msgstr "" #: lms/djangoapps/instructor/views/instructor_dashboard.py +#: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Data Download" msgstr "Descàrrega de dades" #: lms/djangoapps/instructor/views/instructor_dashboard.py +#: lms/templates/courseware/instructor_dashboard.html msgid "Analytics" msgstr "Analítica" @@ -2198,10 +2230,11 @@ msgstr "" msgid "reset" msgstr "" +#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# #. Translators: This is a past-tense verb that is inserted into task progress #. messages as {action}. #: lms/djangoapps/instructor_task/tasks.py -#: lms/templates/wiki/plugins/attachments/index.html +#: lms/templates/wiki/plugins/attachments/index.html wiki/models/article.py msgid "deleted" msgstr "esborrat" @@ -2372,72 +2405,82 @@ msgstr "" #: lms/djangoapps/open_ended_grading/utils.py msgid "AI Assessment" -msgstr "" +msgstr "Avaluació d'Al" #: lms/djangoapps/open_ended_grading/utils.py msgid "Peer Assessment" -msgstr "" +msgstr "Avaluació per parelles" #: lms/djangoapps/open_ended_grading/utils.py msgid "Not yet available" -msgstr "" +msgstr "Encara no està disponible" #: lms/djangoapps/open_ended_grading/utils.py msgid "Automatic Checker" -msgstr "" +msgstr "Comprovador automàtic" #: lms/djangoapps/open_ended_grading/utils.py msgid "Instructor Assessment" -msgstr "" +msgstr "Avaluació de l'instructor" #: lms/djangoapps/open_ended_grading/utils.py msgid "" "Error occurred while contacting the grading service. Please notify course " "staff." msgstr "" +"Hi ha hagut un error mentre es contactava amb el servei de qualificacions. " +"Si us plau, notifica-ho al personal del curs." #: lms/djangoapps/open_ended_grading/utils.py msgid "" "Error occurred while contacting the grading service. Please notify your edX" " point of contact." msgstr "" +"Hi ha hagut un error mentre es contactava amb el servei de qualificacions. " +"Si us plau, notifica-ho al teu punt de contacte de l'edX." #: lms/djangoapps/open_ended_grading/utils.py msgid "for course {0} and student {1}." -msgstr "" +msgstr "pel curs {0} i l'estudiant {1}." #: lms/djangoapps/open_ended_grading/views.py msgid "" "View all problems that require peer assessment in this particular course." msgstr "" +"Veure tots els problemes que requereixen avaluació per parelles en aquest " +"curs en particular." #: lms/djangoapps/open_ended_grading/views.py msgid "" "View ungraded submissions submitted by students for the open ended problems " "in the course." msgstr "" +"Veure les presentacions sense qualificar dels estudiants per els problemes " +"oberts en el curs." #: lms/djangoapps/open_ended_grading/views.py msgid "" "View open ended problems that you have previously submitted for grading." -msgstr "" +msgstr "Veure els problemes oberts que prèviament ha presentat per avaluar." #: lms/djangoapps/open_ended_grading/views.py msgid "View submissions that have been flagged by students as inappropriate." msgstr "" +"Veure els submissions que han estat bandejades pels estudiants com a " +"inapropiades." #: lms/djangoapps/open_ended_grading/views.py #: lms/djangoapps/open_ended_grading/views.py msgid "New submissions to grade" -msgstr "" +msgstr "Noves submissions per avaluar" #: lms/djangoapps/open_ended_grading/views.py msgid "New grades have been returned" -msgstr "" +msgstr "Noves avaluacions han sigut tornades" #: lms/djangoapps/open_ended_grading/views.py msgid "Submissions have been flagged for review" -msgstr "" +msgstr "Les submissions han sigut etiquetades per revisió" #: lms/djangoapps/open_ended_grading/views.py msgid "" @@ -2447,6 +2490,10 @@ msgid "" " Please check back later for this.\n" " " msgstr "" +"\n" +"Error inicialitzant l'avaluació per parelles.\n" +"No s'ha creat un mòdul d'avaluació per parelles en el curs que t'autoritzi a avaluar altres persones.\n" +"Sisplau, torna-ho a provar més tard." #: lms/djangoapps/shoppingcart/models.py msgid "Order Payment Confirmation" @@ -2542,7 +2589,11 @@ msgstr "" msgid "Currency" msgstr "" -#: lms/djangoapps/shoppingcart/reports.py +#: lms/djangoapps/shoppingcart/reports.py lms/templates/shoppingcart/list.html +#: lms/templates/shoppingcart/receipt.html +#: lms/templates/shoppingcart/verified_cert_receipt.html +#: lms/templates/shoppingcart/verified_cert_receipt.html +#: wiki/plugins/attachments/forms.py msgid "Description" msgstr "Descripció" @@ -2637,7 +2688,7 @@ msgstr "Ha d'iniciar la sessió per afegir una cistella de compra" #: lms/djangoapps/shoppingcart/views.py #: lms/djangoapps/shoppingcart/tests/test_views.py msgid "The course you requested does not exist." -msgstr "" +msgstr "El curs que ha demanat no existeix." #: lms/djangoapps/shoppingcart/views.py #: lms/djangoapps/shoppingcart/tests/test_views.py @@ -2651,7 +2702,7 @@ msgstr "Vostè ja està afegit al curs {0}." #: lms/djangoapps/shoppingcart/views.py msgid "Course added to cart." -msgstr "" +msgstr "Curs afegit a la cistella." #: lms/djangoapps/shoppingcart/views.py msgid "You do not have permission to view this page." @@ -2659,23 +2710,29 @@ msgstr "" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The payment processor did not return a required parameter: {0}" -msgstr "" +msgstr "El processedor de pagament no retorna un paràmetre obligatori: {0}" #: lms/djangoapps/shoppingcart/processors/CyberSource.py #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The payment processor returned a badly-typed value {0} for param {1}." msgstr "" +"El processedor de pagament ha retornat un valor mal escrit {0} per el param " +"{1}." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" "The payment processor accepted an order whose number is not in our system." msgstr "" +"El processedor de pagaments ha acceptat una ordre el número de la qual no " +"està al nostre sistema." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" "The amount charged by the processor {0} {1} is different than the total cost" " of the order {2} {3}." msgstr "" +"La quantitat carregada per el processador {0} {1} és diferent que el cost " +"total de la comanda {2} {3}." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2728,15 +2785,15 @@ msgstr "" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "Successful transaction." -msgstr "" +msgstr "Transacció exitosa." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The request is missing one or more required fields." -msgstr "" +msgstr "Falten un o més camps requerits a la sol·licitud." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "One or more fields in the request contains invalid data." -msgstr "" +msgstr "Un o més camps de la sol·licitud contenen informació no vàlida." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2752,6 +2809,8 @@ msgid "" "Error: General system failure. Possible fix: retry the payment after a few " "minutes." msgstr "" +"Error: fallada del sistema general. Torni a provar de fer el pagament d'aquí" +" uns quants minuts." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2775,6 +2834,8 @@ msgid "" "The issuing bank has questions about the request. Possible fix: retry with " "another form of payment" msgstr "" +"El banc emissor té qüestions sobre la sol·licitud. Pot tornar-ho a intentar " +"mitjançant una altra forma de pagament." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2798,16 +2859,18 @@ msgid "" "Insufficient funds in the account. Possible fix: retry with another form of " "payment" msgstr "" +"Fons insuficients en el compte. Pot tornar-ho a provar mitjançant una altra " +"forma de pagament." #: lms/djangoapps/shoppingcart/processors/CyberSource.py #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "Unknown reason" -msgstr "" +msgstr "Raó desconeguda" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" "Issuing bank unavailable. Possible fix: retry again after a few minutes" -msgstr "" +msgstr "Banc emissor no disponible. Pot tornar-ho a provar d'aquí uns minuts." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2822,17 +2885,23 @@ msgid "" "The card has reached the credit limit. Possible fix: retry with another form" " of payment" msgstr "" +"La tarjeta ha arribat al límit de crèdit. Pot tornar-ho a provar amb una " +"altra forma de pagament." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" "Invalid card verification number. Possible fix: retry with another form of " "payment" msgstr "" +"Número de verificació de la tarjeta invàlid. Pot tornar-ho a provar amb una " +"altra forma de pagament." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" "Invalid account number. Possible fix: retry with another form of payment" msgstr "" +"Número de compte no vàlid. Pot tornar-ho a provar amb una altra forma de " +"pagament" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2847,6 +2916,8 @@ msgid "" "General decline by the processor. Possible fix: retry with another form of " "payment" msgstr "" +"Disminució general del processador. Pot tornar-ho a provar mitjançant una " +"altra forma de pagament" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2857,20 +2928,22 @@ msgstr "" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The requested amount exceeds the originally authorized amount." -msgstr "" +msgstr "La quantitat demanada sobrepassa la quantitat originalment permesa." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "Processor Failure. Possible fix: retry the payment" -msgstr "" +msgstr "Fallada del processedor. Torni a provar el pagament" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The authorization has already been captured" -msgstr "" +msgstr "L'autorització ja ha sigut capturada" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" "The requested transaction amount must match the previous transaction amount." msgstr "" +"La quantitat demanada de transacció ha de concordar amb la quantitat prèvia " +"de transacció." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2882,7 +2955,7 @@ msgstr "" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The request ID is invalid." -msgstr "" +msgstr "L'ID sol·licitat és invàlid." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2893,7 +2966,7 @@ msgstr "" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The transaction has already been settled or reversed." -msgstr "" +msgstr "La transacció ja ha estat col·locada o invertida." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2906,6 +2979,8 @@ msgstr "" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "You requested a credit for a capture that was previously voided" msgstr "" +"Vostè ha sol·licitat un crèdit per una captura que ha sigut prèviament " +"anul·lada." #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -3062,6 +3137,8 @@ msgstr "" "(*)." #: lms/templates/registration/password_reset_confirm.html +#: lms/templates/forgot_password_modal.html lms/templates/login.html +#: lms/templates/register-shib.html lms/templates/register.html msgid "Required Information" msgstr "Informació obligatòria" @@ -3095,6 +3172,8 @@ msgid "Password Reset Help" msgstr "Ajuda sobre restablir la contrasenya" #: lms/templates/registration/password_reset_confirm.html +#: cms/templates/login.html lms/templates/login-sidebar.html +#: lms/templates/register-sidebar.html msgid "Need Help?" msgstr "Necessites ajuda?" @@ -3165,6 +3244,11 @@ msgstr "Esborrar article" #: lms/templates/wiki/delete.html #: lms/templates/wiki/plugins/attachments/index.html +#: cms/templates/component.html cms/templates/studio_xblock_wrapper.html +#: cms/templates/studio_xblock_wrapper.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/mustache/_inline_thread_show.mustache msgid "Delete" msgstr "Esborrar" @@ -3200,7 +3284,14 @@ msgstr "... i més!" msgid "You are deleting an article. Please confirm." msgstr "Estàs esborrant un article. Si us plau, confirma-ho." -#: lms/templates/wiki/edit.html +#: lms/templates/wiki/edit.html cms/templates/component.html +#: cms/templates/studio_xblock_wrapper.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/mustache/_inline_thread_show.mustache +#: lms/templates/wiki/includes/article_menu.html msgid "Edit" msgstr "Editar" @@ -3208,12 +3299,26 @@ msgstr "Editar" msgid "Save changes" msgstr "Guardar els canvis" -#: lms/templates/wiki/edit.html +#: lms/templates/wiki/edit.html cms/templates/unit.html msgid "Preview" msgstr "Previsualitzar" +#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# +#. Translators: this is a control to allow users to exit out of this modal +#. interface (a menu or piece of UI that takes the full focus of the screen) #: lms/templates/wiki/edit.html lms/templates/wiki/history.html #: lms/templates/wiki/history.html lms/templates/wiki/includes/cheatsheet.html +#: lms/templates/dashboard.html lms/templates/dashboard.html +#: lms/templates/dashboard.html lms/templates/dashboard.html +#: lms/templates/dashboard.html lms/templates/forgot_password_modal.html +#: lms/templates/help_modal.html lms/templates/help_modal.html +#: lms/templates/help_modal.html lms/templates/signup_modal.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/_underscore_templates.html +#: lms/templates/discussion/mustache/_inline_thread_show.mustache +#: lms/templates/instructor/instructor_dashboard_2/metrics.html +#: lms/templates/modal/_modal-settings-language.html +#: lms/templates/modal/accessible_confirm.html msgid "Close" msgstr "Tancar" @@ -3455,6 +3560,7 @@ msgid "" msgstr "" #: lms/templates/wiki/plugins/attachments/index.html +#: wiki/plugins/attachments/wiki_plugin.py msgid "Attachments" msgstr "Adjunts" @@ -3541,98 +3647,114 @@ msgstr "No hi ha dades adjuntes per aquest article." #: cms/djangoapps/contentstore/course_info_model.py #: cms/djangoapps/contentstore/course_info_model.py msgid "Invalid course update id." -msgstr "" +msgstr "Id d'actualització de curs invàlid" #: cms/djangoapps/contentstore/course_info_model.py msgid "Course update not found." -msgstr "" +msgstr "No s'ha trobat l'actualització del curs." #: cms/djangoapps/contentstore/git_export_utils.py msgid "" "GIT_REPO_EXPORT_DIR not set or path {0} doesn't exist, please create it, or " "configure a different path with GIT_REPO_EXPORT_DIR" msgstr "" +"No s'ha configurat GIT_REPO_EXPORT_DIR o el camí {0} no existeix. Si us " +"plau, crea'l o configura un camí diferent mitjançant GIT_REPO_EXPORT_DIR " #: cms/djangoapps/contentstore/git_export_utils.py msgid "" "Non writable git url provided. Expecting something like: " "git@github.com:mitocw/edx4edx_lite.git" msgstr "" +"No s'ha indicat cap url git amb permisos d'escriptura. S'esperava quelcom " +"similar a: git@github.com:mitocw/edx4edx_lite.git" #: cms/djangoapps/contentstore/git_export_utils.py msgid "" "If using http urls, you must provide the username and password in the url. " "Similar to https://user:pass@github.com/user/course." msgstr "" +"Si utilitzes urls http has d'indicar el nom d'usuari i contrasenya en la " +"url. Similar a https://user:pass@github.com/user/course." #: cms/djangoapps/contentstore/git_export_utils.py msgid "Unable to determine branch, repo in detached HEAD mode" -msgstr "" +msgstr "No s'ha pogut determinar la branca, repositori en mode HEAD detached." #: cms/djangoapps/contentstore/git_export_utils.py msgid "Unable to update or clone git repository." -msgstr "" +msgstr "No s'ha pogut actualitzar o clonar el repositori git." #: cms/djangoapps/contentstore/git_export_utils.py msgid "Unable to export course to xml." -msgstr "" +msgstr "No s'ha pogut exportar el curs a xml." #: cms/djangoapps/contentstore/git_export_utils.py msgid "Unable to configure git username and password" -msgstr "" +msgstr "No s'ha pogut configurar el nom d'usuari i contrasenya del git" #: cms/djangoapps/contentstore/git_export_utils.py msgid "" "Unable to commit changes. This is usually because there are no changes to be" " committed" msgstr "" +"No s'han pogut enviar els canvis. Segurament perquè no hi ha canvis a " +"enviar." #: cms/djangoapps/contentstore/git_export_utils.py msgid "" "Unable to push changes. This is usually because the remote repository " "cannot be contacted" msgstr "" +"No s'han pogut posar els canvis. Normalment es deu que no es pot accedir al " +"repositori remot." #: cms/djangoapps/contentstore/git_export_utils.py msgid "Bad course location provided" -msgstr "" +msgstr "S'ha indicat una localització de curs incorrecta" #: cms/djangoapps/contentstore/git_export_utils.py msgid "Missing branch on fresh clone" -msgstr "" +msgstr "Falta branca en clonació recent" #: cms/djangoapps/contentstore/git_export_utils.py msgid "Command was: {0!r}. Working directory was: {1!r}" -msgstr "" +msgstr "La comanda ha estat: {0!r}. El directori de treball ha estat: {1!r}" #: cms/djangoapps/contentstore/git_export_utils.py msgid "Command output was: {0!r}" -msgstr "" +msgstr "El resultat de la comanda ha estat: {0!r}" #: cms/djangoapps/contentstore/git_export_utils.py msgid "" "Directory already exists, doing a git reset and pull instead of git clone." msgstr "" +"El directori ja existeix. Aplicant un reset al git i fent \"pull\" en lloc " +"de clonar." #: cms/djangoapps/contentstore/utils.py lms/templates/notes.html msgid "My Notes" -msgstr "" +msgstr "Les meves notes" #: cms/djangoapps/contentstore/management/commands/git_export.py msgid "" "Take the specified course and attempt to export it to a git repository\n" ". Course directory must already be a git repository. Usage: git_export " msgstr "" +"Prendre el curs especificat i provar d'exportar-lo a un repositori git\n" +". El directori del curs ha de ser un repositori git. Ús: git_export " #: cms/djangoapps/contentstore/views/assets.py msgid "Upload completed" -msgstr "" +msgstr "Càrrega completada" #: cms/djangoapps/contentstore/views/course.py msgid "" "Special characters not allowed in organization, course number, and course " "run." msgstr "" +"No es permeten caràcters especials en l'organització, número de curs i " +"progrés del curs." #: cms/djangoapps/contentstore/views/course.py msgid "" @@ -3640,6 +3762,9 @@ msgid "" "\n" "{err}" msgstr "" +"No s'ha pogut crear el curs '{name}'.\n" +"\n" +"{err}" #: cms/djangoapps/contentstore/views/course.py msgid "" @@ -3647,6 +3772,9 @@ msgid "" " and course run. Please change either organization or course number to be " "unique." msgstr "" +"Ja existeix un curs definit amb la mateixa organització, número de curs i " +"progrés. Si us plau, canvia o bé l'organització o bé el número de curs per a" +" que sigui únic." #: cms/djangoapps/contentstore/views/course.py #: cms/djangoapps/contentstore/views/course.py @@ -3655,106 +3783,112 @@ msgstr "" msgid "" "Please change either the organization or course number so that it is unique." msgstr "" +"Si us plau, canvia l'organització o el número de curs per a que sigui únic." #: cms/djangoapps/contentstore/views/course.py msgid "" "There is already a course defined with the same organization and course " "number. Please change at least one field to be unique." msgstr "" +"Ja existeix un curs definit amb la mateixa organització i número de curs. Si" +" us plau, canvia almenys un dels camps per a que sigui únic." #: cms/djangoapps/contentstore/views/export_git.py msgid "Course successfully exported to git repository" -msgstr "" +msgstr "Curs exportat correctament a repositori git" #: cms/djangoapps/contentstore/views/import_export.py msgid "We only support uploading a .tar.gz file." -msgstr "" +msgstr "Només se suporta la càrrega de fitxers .tar.gz." #: cms/djangoapps/contentstore/views/import_export.py msgid "File upload corrupted. Please try again" -msgstr "" +msgstr "Càrrega de fitxer corrupta. Si us plau, intenta-ho de nou." #: cms/djangoapps/contentstore/views/import_export.py msgid "Could not find the course.xml file in the package." -msgstr "" +msgstr "No s'ha trobat el fitxer course.xml en el paquet." #: cms/djangoapps/contentstore/views/item.py msgid "Duplicate of {0}" -msgstr "" +msgstr "Duplicat de {0}" #: cms/djangoapps/contentstore/views/item.py msgid "Duplicate of '{0}'" -msgstr "" +msgstr "Duplicat de '{0}'" #: cms/djangoapps/contentstore/views/transcripts_ajax.py msgid "Incoming video data is empty." -msgstr "" +msgstr "No s'han rebut dades del vídeo." #: cms/djangoapps/contentstore/views/transcripts_ajax.py msgid "Can't find item by locator." -msgstr "" +msgstr "No s'ha trobat l'element per localitzador." #: cms/djangoapps/contentstore/views/transcripts_ajax.py msgid "Transcripts are supported only for \"video\" modules." -msgstr "" +msgstr "Només se suporten les transcripcions per a mòduls \"vídeo\"." #: cms/djangoapps/contentstore/views/user.py msgid "Insufficient permissions" -msgstr "" +msgstr "Permisos insuficients" #: cms/djangoapps/contentstore/views/user.py msgid "Could not find user by email address '{email}'." -msgstr "" +msgstr "No s'ha trobat l'usuari a partir de l'adreça d'email '{email}'" #: cms/djangoapps/contentstore/views/user.py msgid "User {email} has registered but has not yet activated his/her account." msgstr "" +"L'usuari {email} s'ha enregistrat però encara no ha activat el seu compte." #: cms/djangoapps/contentstore/views/user.py msgid "`role` is required" -msgstr "" +msgstr "es requereix `rol`" #: cms/djangoapps/contentstore/views/user.py msgid "Only instructors may create other instructors" -msgstr "" +msgstr "Només els instructors poden crear altres instructors" #: cms/djangoapps/contentstore/views/user.py msgid "You may not remove the last instructor from a course" -msgstr "" +msgstr "No hauries d'eliminar l'últim instructor d'un curs" #: cms/djangoapps/course_creators/models.py msgid "unrequested" -msgstr "" +msgstr "no sol·licitat" #: cms/djangoapps/course_creators/models.py msgid "pending" -msgstr "" +msgstr "pendent" #: cms/djangoapps/course_creators/models.py msgid "granted" -msgstr "" +msgstr "permès" #: cms/djangoapps/course_creators/models.py msgid "denied" -msgstr "" +msgstr "denegat" #: cms/djangoapps/course_creators/models.py msgid "Studio user" -msgstr "" +msgstr "Usuari d'Studio" #: cms/djangoapps/course_creators/models.py msgid "The date when state was last updated" -msgstr "" +msgstr "Data de quan es va actualitzar l'estat per últim cop" #: cms/djangoapps/course_creators/models.py msgid "Current course creator state" -msgstr "" +msgstr "Estat del creador del curs actual" #: cms/djangoapps/course_creators/models.py msgid "" "Optional notes about this user (for example, why course creation access was " "denied)" msgstr "" +"Notes opcionals sobre aquest usuari (per exemple, per què l'accés a la " +"creació del curs es va denegar)" #: cms/templates/404.html cms/templates/error.html #: lms/templates/static_templates/404.html @@ -3775,7 +3909,7 @@ msgstr "" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/instructor/instructor_dashboard_2/metrics.html msgid "Loading..." -msgstr "" +msgstr "Carregant...." #. Translators: this is a verb describing the action of viewing more details #: cms/templates/container_xblock_component.html @@ -3803,7 +3937,7 @@ msgstr "" #: lms/templates/discussion/mustache/_inline_discussion_cohorted.mustache #: lms/templates/verify_student/face_upload.html msgid "Cancel" -msgstr "" +msgstr "Cancel·lar" #: cms/templates/index.html #: lms/templates/instructor/instructor_dashboard_2/course_info.html @@ -3829,7 +3963,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -3839,7 +3974,7 @@ msgstr "" #: cms/templates/widgets/header.html #: lms/templates/wiki/includes/article_menu.html msgid "Settings" -msgstr "" +msgstr "Configuració" #: cms/templates/manage_users.html #: lms/templates/courseware/instructor_dashboard.html @@ -3853,7 +3988,7 @@ msgstr "" #: lms/templates/combinedopenended/selfassessment/self_assessment_prompt.html #: lms/templates/verify_student/face_upload.html msgid "Save" -msgstr "" +msgstr "Guardar" #: cms/templates/register.html cms/templates/widgets/header.html #: lms/templates/index.html @@ -3901,7 +4036,7 @@ msgstr "" #: lms/templates/navigation.html lms/templates/static_templates/help.html #: lms/templates/static_templates/help.html wiki/plugins/help/wiki_plugin.py msgid "Help" -msgstr "" +msgstr "Ajuda" #: common/templates/course_modes/choose.html msgid "Upgrade Your Registration for {} | Choose Your Track" @@ -4032,7 +4167,7 @@ msgstr "" #: common/templates/course_modes/choose.html msgid "or" -msgstr "" +msgstr "o" #: common/templates/course_modes/choose.html msgid "Audit This Course" @@ -4048,7 +4183,7 @@ msgstr "" #: lms/templates/admin_dashboard.html msgid "{platform_name}-wide Summary" -msgstr "" +msgstr "Resum {platform_name}" #: lms/templates/annotatable.html lms/templates/textannotation.html #: lms/templates/videoannotation.html @@ -4058,43 +4193,43 @@ msgstr "" #: lms/templates/open_ended_problems/open_ended_problems.html #: lms/templates/peer_grading/peer_grading.html msgid "Instructions" -msgstr "" +msgstr "Instruccions" #: lms/templates/annotatable.html lms/templates/textannotation.html #: lms/templates/videoannotation.html msgid "Collapse Instructions" -msgstr "" +msgstr "Col·lapsar instruccions" #: lms/templates/annotatable.html msgid "Guided Discussion" -msgstr "" +msgstr "Discussió guiada" #: lms/templates/annotatable.html msgid "Hide Annotations" -msgstr "" +msgstr "Ocultar anotacions" #: lms/templates/contact.html lms/templates/static_templates/about.html #: lms/templates/static_templates/about.html msgid "Vision" -msgstr "" +msgstr "Visió" #: lms/templates/contact.html msgid "Faq" -msgstr "" +msgstr "FAQ" #: lms/templates/contact.html lms/templates/footer.html msgid "Press" -msgstr "" +msgstr "Premsa" #: lms/templates/contact.html lms/templates/footer.html #: lms/templates/static_templates/contact.html #: lms/templates/static_templates/contact.html msgid "Contact" -msgstr "" +msgstr "Contacte" #: lms/templates/contact.html msgid "Class Feedback" -msgstr "" +msgstr "Comentaris i suggeriments de la classe" #: lms/templates/contact.html msgid "" @@ -4103,10 +4238,14 @@ msgid "" " issues specific to a particular class, please post on the discussion forums" " of that class." msgstr "" +"Et demanem que ens facis comentaris i suggeriments per millorar els nostres " +"cursos. Si ets usuari enregistrat i tens alguna pregunta o dubtes sobre " +"alguna classe particular, fes-nos-ho saber enviant un missatge als fòrums de" +" discussió de la classe en qüestió." #: lms/templates/contact.html msgid "General Inquiries and Feedback" -msgstr "" +msgstr "Preguntes generals i suggeriments" #: lms/templates/contact.html msgid "" @@ -4119,7 +4258,7 @@ msgstr "" #: lms/templates/contact.html msgid "Technical Inquiries and Feedback" -msgstr "" +msgstr "Preguntes tècniques i suggeriments" #: lms/templates/contact.html msgid "" @@ -4134,17 +4273,20 @@ msgstr "" #: lms/templates/contact.html msgid "Media" -msgstr "" +msgstr "Mitjans de comunicació" #: lms/templates/contact.html msgid "" "Please visit our {link_start}media/press page{link_end} for more " "information. For any media or press inquiries, please email {email}." msgstr "" +"Si us plau, visit el nostre {link_start}media/press page{link_end} per més " +"informació. Per qualsevol consulta dels mitjans de comunicació, si us plau, " +"envieu un correu a {email}." #: lms/templates/contact.html msgid "Universities" -msgstr "" +msgstr "Universitats" #: lms/templates/contact.html msgid "" @@ -4170,11 +4312,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4373,7 +4551,7 @@ msgstr "" #: lms/templates/folditbasic.html #: lms/templates/courseware/instructor_dashboard.html msgid "Submitted" -msgstr "" +msgstr "Enviat" #: lms/templates/folditchallenge.html msgid "Puzzle Leaderboard" @@ -4524,7 +4702,7 @@ msgstr "" #: lms/templates/instructor/staff_grading.html #: lms/templates/peer_grading/peer_grading_problem.html msgid "Submit" -msgstr "" +msgstr "Enviar" #: lms/templates/help_modal.html msgid "Thank You!" @@ -4723,6 +4901,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -4887,11 +5080,11 @@ msgstr "" #: lms/templates/problem.html msgid "Show Answer" -msgstr "" +msgstr "Mostrar resposta" #: lms/templates/problem.html msgid "Reveal Answer" -msgstr "" +msgstr "Revelar resposta" #: lms/templates/problem.html msgid "You have used {num_used} of {num_total} submissions" @@ -5049,6 +5242,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5264,11 +5477,11 @@ msgstr "" #: lms/templates/staticbook.html msgid "Previous page" -msgstr "" +msgstr "Pàgina anterior" #: lms/templates/staticbook.html msgid "Next page" -msgstr "" +msgstr "Pàgina següent" #: lms/templates/sysadmin_dashboard.html #: lms/templates/sysadmin_dashboard_gitlogs.html @@ -5463,11 +5676,11 @@ msgstr "" #: lms/templates/video.html msgid "Video position" -msgstr "" +msgstr "Posició del vídeo" #: lms/templates/video.html msgid "Play" -msgstr "" +msgstr "Iniciar" #: lms/templates/video.html msgid "Speeds" @@ -5479,19 +5692,19 @@ msgstr "" #: lms/templates/video.html msgid "Volume" -msgstr "" +msgstr "Volum" #: lms/templates/video.html msgid "Fill browser" -msgstr "" +msgstr "Navegador complet" #: lms/templates/video.html msgid "HD off" -msgstr "" +msgstr "HD desactivat" #: lms/templates/video.html lms/templates/video.html msgid "Turn off captions" -msgstr "" +msgstr "Desactivar textos" #: lms/templates/video.html msgid "Skip to end of transcript." @@ -5519,6 +5732,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -5538,7 +5755,7 @@ msgstr "" #: lms/templates/combinedopenended/combined_open_ended.html #: lms/templates/peer_grading/peer_grading_problem.html msgid "Hide Question" -msgstr "" +msgstr "Ocultar pregunta" #: lms/templates/combinedopenended/combined_open_ended.html msgid "New Submission" @@ -5844,7 +6061,7 @@ msgstr "" #: lms/templates/courseware/courseware.html msgid "Open Calculator" -msgstr "" +msgstr "Obrir la calculadora" #: lms/templates/courseware/courseware.html msgid "Calculator Input Field" @@ -6355,11 +6572,11 @@ msgstr "" #: lms/templates/courseware/instructor_dashboard.html msgid "Task Type" -msgstr "" +msgstr "Tipus de tasca" #: lms/templates/courseware/instructor_dashboard.html msgid "Task inputs" -msgstr "" +msgstr "Entrades de tasca" #: lms/templates/courseware/instructor_dashboard.html msgid "Task Id" @@ -6367,7 +6584,7 @@ msgstr "" #: lms/templates/courseware/instructor_dashboard.html msgid "Requester" -msgstr "" +msgstr "Sol·licitant" #: lms/templates/courseware/instructor_dashboard.html msgid "Task State" @@ -6375,11 +6592,11 @@ msgstr "" #: lms/templates/courseware/instructor_dashboard.html msgid "Duration (sec)" -msgstr "" +msgstr "Durada (segons)" #: lms/templates/courseware/instructor_dashboard.html msgid "Task Progress" -msgstr "" +msgstr "Progrés de tasca" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/courseware/instructor_dashboard.html @@ -6442,6 +6659,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -6737,7 +6958,7 @@ msgstr "" #: lms/templates/discussion/_discussion_module.html msgid "Show Discussion" -msgstr "" +msgstr "Mostrar discussió" #: lms/templates/discussion/_discussion_module_studio.html msgid "To view live discussions, click Preview or View Live in Unit Settings." @@ -6811,7 +7032,7 @@ msgstr "" #: lms/templates/discussion/mustache/_inline_discussion_cohorted.mustache #: wiki/forms.py wiki/forms.py wiki/forms.py msgid "Title" -msgstr "" +msgstr "Títol" #: lms/templates/discussion/_inline_new_post.html #: lms/templates/discussion/_new_post.html @@ -6849,7 +7070,7 @@ msgstr "" #: lms/templates/discussion/_similar_posts.html msgid "Hide" -msgstr "" +msgstr "Ocultar" #: lms/templates/discussion/_thread_list_template.html msgid "Discussion Home" @@ -6919,7 +7140,7 @@ msgstr "" #: lms/templates/discussion/mustache/_inline_thread_show.mustache #: lms/templates/discussion/mustache/_profile_thread.mustache msgid "anonymous" -msgstr "" +msgstr "anònim" #: lms/templates/discussion/_underscore_templates.html msgid "• This thread is closed." @@ -6938,16 +7159,16 @@ msgstr "" #: lms/templates/discussion/_underscore_templates.html #: lms/templates/discussion/_underscore_templates.html msgid "Report Misuse" -msgstr "" +msgstr "Informar de mal ús" #: lms/templates/discussion/_underscore_templates.html msgid "Pin Thread" -msgstr "" +msgstr "Fixar fil" #: lms/templates/discussion/_underscore_templates.html #: lms/templates/discussion/mustache/_inline_thread_show.mustache msgid "Pinned" -msgstr "" +msgstr "Fixat" #: lms/templates/discussion/_underscore_templates.html msgid "(this post is about %(courseware_title_linked)s)" @@ -7072,7 +7293,7 @@ msgstr "" #: lms/templates/discussion/_user_profile.html msgid ", " -msgstr "" +msgstr "," #: lms/templates/discussion/_user_profile.html msgid "%s discussion started" @@ -7105,10 +7326,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7126,12 +7343,16 @@ msgstr "" #: lms/templates/discussion/mustache/_pagination.mustache #: lms/templates/discussion/mustache/_pagination.mustache msgid "…" -msgstr "" +msgstr "..." #: lms/templates/discussion/mustache/_profile_thread.mustache msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7171,6 +7392,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7273,10 +7499,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" @@ -7422,7 +7644,7 @@ msgstr "" #: lms/templates/instructor/staff_grading.html msgid "(Hide)" -msgstr "" +msgstr "(Ocultar)" #: lms/templates/instructor/staff_grading.html #: lms/templates/peer_grading/peer_grading_problem.html @@ -8141,7 +8363,7 @@ msgstr "" #: lms/templates/open_ended_problems/open_ended_problems.html #: lms/templates/peer_grading/peer_grading.html msgid "Problem Name" -msgstr "" +msgstr "Nom del problema" #: lms/templates/open_ended_problems/open_ended_problems.html msgid "Grader Type" @@ -8177,7 +8399,7 @@ msgstr "" #: lms/templates/peer_grading/peer_grading.html msgid "Graded" -msgstr "" +msgstr "Puntuat" #: lms/templates/peer_grading/peer_grading.html msgid "Available" @@ -8185,7 +8407,7 @@ msgstr "" #: lms/templates/peer_grading/peer_grading.html msgid "Required" -msgstr "" +msgstr "Requerit" #: lms/templates/peer_grading/peer_grading.html msgid "No due date" @@ -8297,11 +8519,11 @@ msgstr "" #: lms/templates/registration/activation_complete.html msgid "Activation Complete!" -msgstr "" +msgstr "Activació completa!" #: lms/templates/registration/activation_complete.html msgid "Account already active!" -msgstr "" +msgstr "El compte ja està actiu!" #: lms/templates/registration/activation_complete.html msgid "You can now {link_start}log in{link_end}." @@ -8309,7 +8531,7 @@ msgstr "" #: lms/templates/registration/activation_invalid.html msgid "Activation Invalid" -msgstr "" +msgstr "Activació no vàlida" #: lms/templates/registration/activation_invalid.html msgid "" @@ -8317,10 +8539,14 @@ msgid "" "e-mail programs will sometimes split it into two lines. If you still have " "issues, e-mail us to let us know what happened at {email}." msgstr "" +"Alguna cosa ha anat malament. Comprova que la URL a la que has anat és " +"correcta -- els programes d'email de vegades les trenquen en dues línies. Si" +" encara tens problemes, envia'ns un email i fes-nos saber què passa a " +"{email}." #: lms/templates/registration/activation_invalid.html msgid "Or you can go back to the {link_start}home page{link_end}." -msgstr "" +msgstr "O bé pots anar enrere a {link_start}la pàgina d'inici{link_end}." #: lms/templates/registration/password_reset_done.html msgid "Password reset successful" @@ -9575,60 +9801,69 @@ msgstr "" #: cms/templates/404.html msgid "The page that you were looking for was not found." -msgstr "" +msgstr "No s'ha trobat la pàgina que estaves buscant." #: cms/templates/404.html msgid "" "Go back to the {homepage} or let us know about any pages that may have been " "moved at {email}." msgstr "" +"Vés enrere a la {homepage} o informa'ns de qualsevol pàgina que hagi estat " +"moguda a {email}." #: cms/templates/500.html msgid "Studio Server Error" -msgstr "" +msgstr "Error de Studio Server" #: cms/templates/500.html msgid "The Studio servers encountered an error" -msgstr "" +msgstr "Els servidors Studio trobat un error" #: cms/templates/500.html msgid "" "An error occurred in Studio and the page could not be loaded. Please try " "again in a few moments." msgstr "" +"Ha succeït un error en l'Studio i la pàgina no s'ha pogut carregar. Si us " +"plau, torna-ho a intentar en breu." #: cms/templates/500.html msgid "" "We've logged the error and our staff is currently working to resolve this " "error as soon as possible." msgstr "" +"Hem pres nota de l'error i el nostre personal hi està treballant per " +"solucionar-lo el més aviat possible." #: cms/templates/500.html msgid "If the problem persists, please email us at {email_link}." msgstr "" +"Si el problema persisteix, si us plau envia'ns un correu a {email_link}." #: cms/templates/activation_active.html cms/templates/activation_complete.html #: cms/templates/activation_invalid.html msgid "Studio Account Activation" -msgstr "" +msgstr "Activació del compte Studio" #: cms/templates/activation_active.html msgid "Your account is already active" -msgstr "" +msgstr "El teu compte ja està actiu" #: cms/templates/activation_active.html msgid "" "This account, set up using {0}, has already been activated. Please sign in " "to start working within edX Studio." msgstr "" +"Aquest compte, configurat utilitzant {0}, ja ha estat activat. Si us plau, " +"entra per començar a treballar en edX Studio." #: cms/templates/activation_active.html cms/templates/activation_complete.html msgid "Sign into Studio" -msgstr "" +msgstr "Entrar a Studio" #: cms/templates/activation_complete.html msgid "Your account activation is complete!" -msgstr "" +msgstr "El teu compte ha estat activat!" #: cms/templates/activation_complete.html msgid "" @@ -9738,7 +9973,7 @@ msgstr "" #: cms/templates/asset_index.html msgid "Your file has been deleted." -msgstr "" +msgstr "El teu fitxer s'ha esborrat." #: cms/templates/asset_index.html msgid "close alert" @@ -11014,7 +11249,7 @@ msgstr "" #: cms/templates/overview.html msgid "Collapse All Sections" -msgstr "" +msgstr "Col·lapsa totes les seccions" #: cms/templates/overview.html msgid "New Section" @@ -11030,11 +11265,11 @@ msgstr "" #: cms/templates/overview.html msgid "Release date:" -msgstr "" +msgstr "Data de lliurament:" #: cms/templates/overview.html msgid "Edit section release date" -msgstr "" +msgstr "Edita la data de lliurament de la secció" #: cms/templates/overview.html msgid "Delete section" @@ -11396,7 +11631,7 @@ msgstr "" #: cms/templates/settings_advanced.html msgid "Your policy changes have been saved." -msgstr "" +msgstr "Els teus canvis de política s'han guardat." #: cms/templates/settings_advanced.html msgid "There was an error saving your information. Please see below." @@ -11815,7 +12050,7 @@ msgstr "" #: cms/templates/widgets/sock.html msgid "Looking for Help with Studio?" -msgstr "" +msgstr "Busques ajuda amb l'Studio?" #: cms/templates/widgets/sock.html msgid "edX Studio Help" @@ -11872,23 +12107,24 @@ msgstr "" # empty msgid "This is a key string." -msgstr "" +msgstr "Aquesta és una cadena clau" #: wiki/admin.py wiki/models/article.py msgid "created" -msgstr "" +msgstr "creat" #: wiki/forms.py msgid "Only localhost... muahahaha" -msgstr "" +msgstr "Només hostes locals... muahahaha" #: wiki/forms.py msgid "Initial title of the article. May be overridden with revision titles." msgstr "" +"Títol inicial de l'article. Pot ser sobreescrit amb revisions de títols." #: wiki/forms.py msgid "Type in some contents" -msgstr "" +msgstr "Escriu un contingut" #: wiki/forms.py msgid "" @@ -11896,19 +12132,24 @@ msgid "" "can use more complex features like adding plugins, meta data, related " "articles etc..." msgstr "" +"Aquest és només el contingut inicial del teu article. Després de crear-lo, " +"pots utilitzar característiques més complexes com afegir plugins, meta " +"dades, articles relacionats, etc..." #: wiki/forms.py wiki/forms.py msgid "Contents" -msgstr "" +msgstr "Contingut" #: wiki/forms.py wiki/forms.py msgid "Summary" -msgstr "" +msgstr "Resum" #: wiki/forms.py msgid "" "Give a short reason for your edit, which will be stated in the revision log." msgstr "" +"Dóna un motiu breu de la teva edició, la qual es mostrarà en el diari de " +"revisions." #: wiki/forms.py msgid "" @@ -11916,18 +12157,21 @@ msgid "" "have been automatically merged with the new contents. Please review the text" " below." msgstr "" +"Mentre estaves editant, algú altre ha canviat la revisió. El teu contingut " +"ha estat automàticament fusionat amb el nou contingut. Si us plau, revisa el" +" text següent." #: wiki/forms.py msgid "No changes made. Nothing to save." -msgstr "" +msgstr "No s'han fet canvis. Res a guardar." #: wiki/forms.py msgid "Select an option" -msgstr "" +msgstr "Selecciona una opció" #: wiki/forms.py msgid "Slug" -msgstr "" +msgstr "URL amigable" #: wiki/forms.py msgid "" @@ -11935,30 +12179,33 @@ msgid "" "alphanumeric characters and - or _. Note that you cannot change the slug " "after creating the article." msgstr "" +"Aquesta serà l'adreça on el teu article serà trobat. Utilitza només " +"caràcters alfanumèrics i - o _. Tingues en compte que no podràs canviar la " +"URL amigable després de crear l'article." #: wiki/forms.py msgid "Write a brief message for the article's history log." -msgstr "" +msgstr "Escriu un missatge breu per al diari de l'article." #: wiki/forms.py msgid "A slug may not begin with an underscore." -msgstr "" +msgstr "La URL amigable no hauria de començar amb guionet baix." #: wiki/forms.py msgid "A deleted article with slug \"%s\" already exists." -msgstr "" +msgstr "Un article esborrat amb URL amigable \"%s\" ja existeix." #: wiki/forms.py msgid "A slug named \"%s\" already exists." -msgstr "" +msgstr "Una URL amigable \"%s\" ja existeix." #: wiki/forms.py msgid "Yes, I am sure" -msgstr "" +msgstr "Sí, n'estic segur" #: wiki/forms.py msgid "Purge" -msgstr "" +msgstr "Purgar" #: wiki/forms.py msgid "" @@ -11966,236 +12213,254 @@ msgid "" " Purging is a good idea if you want to free the slug such that users can " "create new articles in its place." msgstr "" +"Purgar l'article: esborrar-lo completament (i tot el seu contingut) sense " +"possibilitat de desfer els canvis. Purgar és una bona idea si vols alliberar" +" URL amigables per a que siguin utilitzades per altres usuaris que creïn " +"nous articles." #: wiki/forms.py wiki/plugins/attachments/forms.py #: wiki/plugins/images/forms.py msgid "You are not sure enough!" -msgstr "" +msgstr "No estàs prou segur!" #: wiki/forms.py msgid "While you tried to delete this article, it was modified. TAKE CARE!" msgstr "" +"Mentre provaves d'esborrar aquest article, ha estat modificat. VIGILA!" #: wiki/forms.py msgid "Lock article" -msgstr "" +msgstr "Bloquejar l'article" #: wiki/forms.py msgid "Deny all users access to edit this article." -msgstr "" +msgstr "Denegar l'accés de tots els usuaris a editar aquest article." #: wiki/forms.py msgid "Permissions" -msgstr "" +msgstr "Permisos" #: wiki/forms.py msgid "Owner" -msgstr "" +msgstr "Propietari" #: wiki/forms.py msgid "Enter the username of the owner." -msgstr "" +msgstr "Entra el nom d'usuari del propietari." #: wiki/forms.py msgid "(none)" -msgstr "" +msgstr "(cap)" #: wiki/forms.py msgid "Inherit permissions" -msgstr "" +msgstr "Heretar permisos" #: wiki/forms.py msgid "" "Check here to apply the above permissions recursively to articles under this" " one." msgstr "" +"Marca aquí per aplicar els permisos anteriors als articles per sota d'aquest" +" de manera recursiva." #: wiki/forms.py msgid "Permission settings for the article were updated." -msgstr "" +msgstr "S'han actualitzat els permisos de l'article." #: wiki/forms.py msgid "Your permission settings were unchanged, so nothing saved." -msgstr "" +msgstr "No s'han canviat els teus permisos. Res a guardar." #: wiki/forms.py msgid "No user with that username" -msgstr "" +msgstr "No hi ha cap usuari amb aquest nom" #: wiki/forms.py msgid "Article locked for editing" -msgstr "" +msgstr "Article bloquejat per editar" #: wiki/forms.py msgid "Article unlocked for editing" -msgstr "" +msgstr "Article desbloquejat per editar" #: wiki/forms.py msgid "Filter..." -msgstr "" +msgstr "Filtre..." #: wiki/core/plugins/base.py msgid "Settings for plugin" -msgstr "" +msgstr "Configuració del plugin" #: wiki/models/article.py wiki/models/pluginbase.py #: wiki/plugins/attachments/models.py msgid "current revision" -msgstr "" +msgstr "revisió actual" #: wiki/models/article.py msgid "" "The revision being displayed for this article. If you need to do a roll-" "back, simply change the value of this field." msgstr "" +"La revisió mostrada per aquest article. Si necessites tirar enrere, " +"simplement canvia el valor d'aquest camp." #: wiki/models/article.py msgid "modified" -msgstr "" +msgstr "modificat" #: wiki/models/article.py msgid "Article properties last modified" -msgstr "" +msgstr "Propietats de l'article darrerament modificades" #: wiki/models/article.py msgid "owner" -msgstr "" +msgstr "propietari" #: wiki/models/article.py msgid "" "The owner of the article, usually the creator. The owner always has both " "read and write access." msgstr "" +"El propietari de l'article, normalment el creador. El propietari sempre té " +"permisos de lectura i escriptura." #: wiki/models/article.py msgid "group" -msgstr "" +msgstr "grup" #: wiki/models/article.py msgid "" "Like in a UNIX file system, permissions can be given to a user according to " "group membership. Groups are handled through the Django auth system." msgstr "" +"Com en un sistema d'arxius UNIX, els permisos es poden donar a un usuari " +"d'acord amb la seva pertinença a un grup. Els grups es mantenen a través el " +"sistema auth de Django." #: wiki/models/article.py msgid "group read access" -msgstr "" +msgstr "accés de lectura del grup" #: wiki/models/article.py msgid "group write access" -msgstr "" +msgstr "accés d'escriptura del grup" #: wiki/models/article.py msgid "others read access" -msgstr "" +msgstr "accés de lectura d'altres" #: wiki/models/article.py msgid "others write access" -msgstr "" +msgstr "accés d'escriptura d'altres" #: wiki/models/article.py msgid "Article without content (%(id)d)" -msgstr "" +msgstr "Article sense contingut (%(id)d)" #: wiki/models/article.py msgid "content type" -msgstr "" +msgstr "tipus de contingut" #: wiki/models/article.py msgid "object ID" -msgstr "" +msgstr "ID d'objecte" #: wiki/models/article.py msgid "Article for object" -msgstr "" +msgstr "Article per l'objecte" #: wiki/models/article.py msgid "Articles for object" -msgstr "" +msgstr "Articles per l'objecte" #: wiki/models/article.py msgid "revision number" -msgstr "" +msgstr "número de revisió" #: wiki/models/article.py msgid "IP address" -msgstr "" +msgstr "Adreça IP" #: wiki/models/article.py msgid "user" -msgstr "" +msgstr "usuari" #: wiki/models/article.py msgid "locked" -msgstr "" +msgstr "bloquejat" #: wiki/models/article.py wiki/models/pluginbase.py msgid "article" -msgstr "" +msgstr "article" #: wiki/models/article.py msgid "article contents" -msgstr "" +msgstr "contingut de l'article" #: wiki/models/article.py msgid "article title" -msgstr "" +msgstr "títol d'article" #: wiki/models/article.py msgid "" "Each revision contains a title field that must be filled out, even if the " "title has not changed" msgstr "" +"Cada revisió conté un camp de títol que s'ha d'omplir, inclús si el títol no" +" ha canviat" #: wiki/models/pluginbase.py msgid "original article" -msgstr "" +msgstr "article original" #: wiki/models/pluginbase.py msgid "Permissions are inherited from this article" -msgstr "" +msgstr "Els permisos s'hereten d'aquest article" #: wiki/models/pluginbase.py msgid "A plugin was changed" -msgstr "" +msgstr "S'ha canviat un plugin" #: wiki/models/pluginbase.py msgid "" "The revision being displayed for this plugin.If you need to do a roll-back, " "simply change the value of this field." msgstr "" +"La revisió mostrada per aquest plugin. Si necessites fer-te enrere, " +"simplement canvia el valor d'aquest camp." #: wiki/models/urlpath.py msgid "Cache lookup value for articles" -msgstr "" +msgstr "Valor de cerca d'articles en memòria" #: wiki/models/urlpath.py msgid "slug" -msgstr "" +msgstr "url amigable" #: wiki/models/urlpath.py msgid "(root)" -msgstr "" +msgstr "(arrel)" #: wiki/models/urlpath.py msgid "URL path" -msgstr "" +msgstr "Camí URL" #: wiki/models/urlpath.py msgid "URL paths" -msgstr "" +msgstr "Camins URL" #: wiki/models/urlpath.py msgid "Sorry but you cannot have a root article with a slug." -msgstr "" +msgstr "Ho sentim, no pots tenir un article arrel amb url amigable." #: wiki/models/urlpath.py msgid "A non-root note must always have a slug." -msgstr "" +msgstr "Una nota no-arrel ha de tenir sempre una url amigable." #: wiki/models/urlpath.py msgid "There is already a root node on %s" -msgstr "" +msgstr "Ja hi ha un node arrel en %s" #: wiki/models/urlpath.py msgid "" @@ -12204,273 +12469,290 @@ msgid "" "\n" "The children of this article have had their parents deleted. You should probably find a new home for them." msgstr "" +"Articles que han perdut els seus pares\n" +"===============================\n" +"\n" +"Als fills d'aquest article se'ls ha esborrat els pares. Els hi hauràs de buscar un nou origen." #: wiki/models/urlpath.py msgid "Lost and found" -msgstr "" +msgstr "Perduts i trobats" #: wiki/plugins/attachments/forms.py msgid "A short summary of what the file contains" -msgstr "" +msgstr "Resum breu del contingut del fitxer" #: wiki/plugins/attachments/forms.py msgid "Yes I am sure..." -msgstr "" +msgstr "Sí, n'estic segur..." #: wiki/plugins/attachments/markdown_extensions.py msgid "Click to download file" -msgstr "" +msgstr "Clica per descarregar fitxer" #: wiki/plugins/attachments/models.py msgid "" "The revision of this attachment currently in use (on all articles using the " "attachment)" msgstr "" +"La revisió d'aquest adjunt actualment en ús (en tots els articles que " +"utilitzen l'adjunt)" #: wiki/plugins/attachments/models.py msgid "original filename" -msgstr "" +msgstr "nom de fitxer original" #: wiki/plugins/attachments/models.py msgid "attachment" -msgstr "" +msgstr "adjunt" #: wiki/plugins/attachments/models.py msgid "attachments" -msgstr "" +msgstr "adjunts" #: wiki/plugins/attachments/models.py msgid "file" -msgstr "" +msgstr "fitxer" #: wiki/plugins/attachments/models.py msgid "attachment revision" -msgstr "" +msgstr "revisió de l'adjunt" #: wiki/plugins/attachments/models.py msgid "attachment revisions" -msgstr "" +msgstr "revisions dels adjunts" #: wiki/plugins/attachments/views.py msgid "%s was successfully added." -msgstr "" +msgstr "%s correctament afegit." #: wiki/plugins/attachments/views.py wiki/plugins/attachments/views.py msgid "Your file could not be saved: %s" -msgstr "" +msgstr "El teu fitxer no s'ha pogut guardar: %s" #: wiki/plugins/attachments/views.py wiki/plugins/attachments/views.py msgid "" "Your file could not be saved, probably because of a permission error on the " "web server." msgstr "" +"El teu fitxer no s'ha pogut guardar, probablement perquè hi ha hagut un " +"error de permisos en el servidor web." #: wiki/plugins/attachments/views.py msgid "%s uploaded and replaces old attachment." -msgstr "" +msgstr "%s carregat i substitueix l'antic adjunt." #: wiki/plugins/attachments/views.py msgid "" "Your new file will automatically be renamed to match the file already " "present. Files with different extensions are not allowed." msgstr "" +"El teu nou fitxer es reanomenarà automàticament perquè coincideixi amb el " +"fitxer present actualment. No es permeten fitxers amb diferents extensions." #: wiki/plugins/attachments/views.py msgid "Current revision changed for %s." -msgstr "" +msgstr "La revisió actual ha canviat per %s." #: wiki/plugins/attachments/views.py msgid "Added a reference to \"%(att)s\" from \"%(art)s\"." -msgstr "" +msgstr "Referència afegida a \"%(att)s\" des de \"%(art)s\"." #: wiki/plugins/attachments/views.py msgid "The file %s was deleted." -msgstr "" +msgstr "El fitxer %s s'ha esborrat." #: wiki/plugins/attachments/views.py msgid "This article is no longer related to the file %s." -msgstr "" +msgstr "Aquest article ja no està relacionat amb el fitxer %s." #: wiki/plugins/attachments/wiki_plugin.py msgid "A file was changed: %s" -msgstr "" +msgstr "S'ha canviat un fitxer: %s" #: wiki/plugins/attachments/wiki_plugin.py msgid "A file was deleted: %s" -msgstr "" +msgstr "S'ha esborrat un fitxer: %s" #: wiki/plugins/images/forms.py msgid "" "New image %s was successfully uploaded. You can use it by selecting it from " "the list of available images." msgstr "" +"S'ha carregat una nova imatge %s. Pots utilitzar-la seleccionant-la de la " +"llista d'imatges disponibles." #: wiki/plugins/images/forms.py msgid "Are you sure?" -msgstr "" +msgstr "Segur?" #: wiki/plugins/images/models.py msgid "image" -msgstr "" +msgstr "imatge" #: wiki/plugins/images/models.py msgid "images" -msgstr "" +msgstr "imatges" #: wiki/plugins/images/models.py msgid "Image: %s" -msgstr "" +msgstr "Imatge: %s" #: wiki/plugins/images/models.py msgid "Current revision not set!!" -msgstr "" +msgstr "No s'ha establert la revisió actual!!" #: wiki/plugins/images/models.py msgid "image revision" -msgstr "" +msgstr "revisió d'imatge" #: wiki/plugins/images/models.py msgid "image revisions" -msgstr "" +msgstr "revisions d'imatge" #: wiki/plugins/images/models.py msgid "Image Revsion: %d" -msgstr "" +msgstr "Revisió d'imatge: %d" #: wiki/plugins/images/views.py msgid "%s has been restored" -msgstr "" +msgstr "%s ha estat restablert" #: wiki/plugins/images/views.py msgid "%s has been marked as deleted" -msgstr "" +msgstr "%s ha estat marcat com esborrat" #: wiki/plugins/images/views.py msgid "%(file)s has been changed to revision #%(revision)d" -msgstr "" +msgstr "%(file)s ha estat canviat a la revisió #%(revision)d" #: wiki/plugins/images/views.py msgid "%(file)s has been saved." -msgstr "" +msgstr "%(file)s ha estat guardat." #: wiki/plugins/images/wiki_plugin.py msgid "Images" -msgstr "" +msgstr "Imatges" #: wiki/plugins/images/wiki_plugin.py msgid "An image was added: %s" -msgstr "" +msgstr "S'ha afegit una imatge: %s" #: wiki/plugins/links/wiki_plugin.py msgid "Links" -msgstr "" +msgstr "Enllaços" #: wiki/plugins/notifications/forms.py msgid "Notifications" -msgstr "" +msgstr "Notificacions" #: wiki/plugins/notifications/forms.py msgid "When this article is edited" -msgstr "" +msgstr "Quan aquest article és editat" #: wiki/plugins/notifications/forms.py msgid "Also receive emails about article edits" -msgstr "" +msgstr "Rebre també emails sobre edicions d'article" #: wiki/plugins/notifications/forms.py msgid "Your notification settings were updated." -msgstr "" +msgstr "S'ha actualitzat la configuració de notificacions." #: wiki/plugins/notifications/forms.py msgid "Your notification settings were unchanged, so nothing saved." -msgstr "" +msgstr "La teva configuració de notificacions no han canviat. Res a guardar." #: wiki/plugins/notifications/models.py msgid "%(user)s subscribing to %(article)s (%(type)s)" -msgstr "" +msgstr "%(user)s subscrit a %(article)s (%(type)s)" #: wiki/plugins/notifications/models.py msgid "Article deleted: %s" -msgstr "" +msgstr "Article esborrat: %s" #: wiki/plugins/notifications/models.py msgid "Article modified: %s" -msgstr "" +msgstr "Article modificat: %s" #: wiki/plugins/notifications/models.py msgid "New article created: %s" -msgstr "" +msgstr "Nou article creat: %s" #: wiki/views/accounts.py msgid "You are now sign up... and now you can sign in!" -msgstr "" +msgstr "Ja estàs enregistrat... ara pots entrar!" #: wiki/views/accounts.py msgid "You are no longer logged in. Bye bye!" -msgstr "" +msgstr "Has sortit del sistema. Adéu!" #: wiki/views/accounts.py msgid "You are now logged in! Have fun!" -msgstr "" +msgstr "Ja ets dins! Diverteix-te!" #: wiki/views/article.py msgid "New article '%s' created." -msgstr "" +msgstr "S'ha creat un nou article '%s'." #: wiki/views/article.py msgid "There was an error creating this article: %s" -msgstr "" +msgstr "Hi ha hagut un error creant l'article: %s" #: wiki/views/article.py msgid "There was an error creating this article." -msgstr "" +msgstr "Error creant l'article." #: wiki/views/article.py msgid "" "This article cannot be deleted because it has children or is a root article." msgstr "" +"No s'ha pogut esborrar l'article perquè té fills o no és un article arrel." #: wiki/views/article.py msgid "" "This article together with all its contents are now completely gone! Thanks!" -msgstr "" +msgstr "L'article juntament amb el seu contingut s'han eliminat. Gràcies!" #: wiki/views/article.py msgid "" "The article \"%s\" is now marked as deleted! Thanks for keeping the site " "free from unwanted material!" msgstr "" +"L'article \"%s\" s'ha marcat com esborrat! Gràcies per mantenir el lloc " +"lliure de material indesitjat!" #: wiki/views/article.py msgid "Your changes were saved." -msgstr "" +msgstr "S'han guardat els teus canvis." #: wiki/views/article.py msgid "A new revision of the article was succesfully added." -msgstr "" +msgstr "S'ha afegit correctament una nova revisió de l'article." #: wiki/views/article.py msgid "Restoring article" -msgstr "" +msgstr "Restablint l'article" #: wiki/views/article.py msgid "The article \"%s\" and its children are now restored." -msgstr "" +msgstr "L'article \"%s\" i els seus fills s'han restablert." #: wiki/views/article.py msgid "The article %s is now set to display revision #%d" -msgstr "" +msgstr "L'article %s s'ha configurat per mostrar la revisió #%d" #: wiki/views/article.py msgid "New title" -msgstr "" +msgstr "Nou títol" #: wiki/views/article.py msgid "Merge between Revision #%(r1)d and Revision #%(r2)d" -msgstr "" +msgstr "Fusiona la Revisió #%(r1)d i la Revisió #%(r2)d" #: wiki/views/article.py msgid "" "A new revision was created: Merge between Revision #%(r1)d and Revision " "#%(r2)d" msgstr "" +"S'ha creat una nova revisió: fusió entre la Revisió #%(r1)d i la Revisió " +"#%(r2)d" diff --git a/conf/locale/ca/LC_MESSAGES/djangojs.mo b/conf/locale/ca/LC_MESSAGES/djangojs.mo index 16965bcd1fd8..b5938cdf4ffc 100644 Binary files a/conf/locale/ca/LC_MESSAGES/djangojs.mo and b/conf/locale/ca/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/ca/LC_MESSAGES/djangojs.po b/conf/locale/ca/LC_MESSAGES/djangojs.po index 857f0943f648..6ce311e022b2 100644 --- a/conf/locale/ca/LC_MESSAGES/djangojs.po +++ b/conf/locale/ca/LC_MESSAGES/djangojs.po @@ -18,9 +18,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:18+0000\n" -"Last-Translator: sarina \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-25 16:10+0000\n" +"Last-Translator: mcolomer \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/edx-platform/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,7 +33,7 @@ msgstr "" #: cms/static/js/views/modals/edit_xblock.js #: common/static/coffee/src/discussion/utils.js msgid "OK" -msgstr "" +msgstr "D'acord" #: cms/static/coffee/src/views/tabs.js cms/static/coffee/src/views/unit.js #: cms/static/js/base.js cms/static/js/views/asset.js @@ -44,35 +44,35 @@ msgstr "" #: lms/static/admin/js/admin/DateTimeShortcuts.js #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Cancel" -msgstr "" +msgstr "Cancel·lar" #: cms/static/js/base.js lms/static/js/verify_student/photocapture.js msgid "This link will open in a new browser window/tab" -msgstr "" +msgstr "Aquest enllaç s'obrirà en una nova finestra/pestanya del navegador" #: common/lib/xmodule/xmodule/js/src/annotatable/display.js msgid "Show Annotations" -msgstr "" +msgstr "Mostrar anotacions" #: common/lib/xmodule/xmodule/js/src/annotatable/display.js msgid "Hide Annotations" -msgstr "" +msgstr "Ocultar anotacions" #: common/lib/xmodule/xmodule/js/src/annotatable/display.js msgid "Expand Instructions" -msgstr "" +msgstr "Expandir instruccions" #: common/lib/xmodule/xmodule/js/src/annotatable/display.js msgid "Collapse Instructions" -msgstr "" +msgstr "Col·lapsar instruccions" #: common/lib/xmodule/xmodule/js/src/annotatable/display.js msgid "Commentary" -msgstr "" +msgstr "Comentaris" #: common/lib/xmodule/xmodule/js/src/annotatable/display.js msgid "Reply to Annotation" -msgstr "" +msgstr "Respondre anotació" #. Translators: %(earned)s is the number of points earned. %(total)s is the #. total number of points (examples: 0/1, 1/1, 2/3, 5/10). The total number of @@ -81,59 +81,59 @@ msgstr "" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "(%(earned)s/%(possible)s point)" msgid_plural "(%(earned)s/%(possible)s points)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "(%(earned)s/%(possible)s punt)" +msgstr[1] "(%(earned)s/%(possible)s punts)" #. Translators: %(num_points)s is the number of points possible (examples: 1, #. 3, 10). There will always be at least 1 point possible.; #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "(%(num_points)s point possible)" msgid_plural "(%(num_points)s points possible)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "(%(num_points)s punt possible)" +msgstr[1] "(%(num_points)s punts possibles)" #: common/lib/xmodule/xmodule/js/src/capa/display.js #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Answer:" -msgstr "" +msgstr "Resposta:" #. Translators: the word Answer here refers to the answer to a problem the #. student must solve.; #: common/lib/xmodule/xmodule/js/src/capa/display.js #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Hide Answer" -msgstr "" +msgstr "Ocultar resposta" #. Translators: the word Answer here refers to the answer to a problem the #. student must solve.; #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Show Answer" -msgstr "" +msgstr "Mostrar resposta" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Reveal Answer" -msgstr "" +msgstr "Revelar resposta" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Answer hidden" -msgstr "" +msgstr "Resposta oculta" #. Translators: the word unanswered here is about answering a problem the #. student must solve.; #: common/lib/xmodule/xmodule/js/src/capa/display.js #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "unanswered" -msgstr "" +msgstr "no respostes" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Status: unsubmitted" -msgstr "" +msgstr "Estat: no enviat" #. Translators: A "rating" is a score a student gives to indicate how well #. they feel they were graded on this problem #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "You need to pick a rating before you can submit." -msgstr "" +msgstr "Necessites seleccionar una valoració abans d'enviar la sol·licitud." #. Translators: this message appears when transitioning between openended #. grading @@ -142,55 +142,62 @@ msgstr "" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Your score did not meet the criteria to move to the next step." -msgstr "" +msgstr "La teva puntuació no compleix els criteris per anar al següent pas." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Submit" -msgstr "" +msgstr "Enviar" #. Translators: one clicks this button after one has finished filling out the #. grading #. form for an openended assessment #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Submit assessment" -msgstr "" +msgstr "Sol·licita avaluació" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" "Your response has been submitted. Please check back later for your grade." msgstr "" +"La teva resposta ha estat enviada. Si us plau, comprova més tard la teva " +"puntuació." #. Translators: this button is clicked to submit a student's rating of #. an evaluator's assessment #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Submit post-assessment" -msgstr "" +msgstr "Envia post-avaluació" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Answer saved, but not yet submitted." -msgstr "" +msgstr "Resposta guardada, però encara no enviada." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" "Please confirm that you wish to submit your work. You will not be able to " "make any changes after submitting." msgstr "" +"Si us plau, confirma que vols enviar la teva feina. No podràs fer cap canvi " +"un cop enviada." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" "You are trying to upload a file that is too large for our system. Please " "choose a file under 2MB or paste a link to it into the answer box." msgstr "" +"Estàs intentant carregar un fitxer massa gran per al nostre sistema. Si us " +"plau, selecciona un fitxer de menys de 2MB o enganxa un enllaç extern en el " +"requadre de resposta." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" "Are you sure you want to remove your previous response to this question?" -msgstr "" +msgstr "Segur que vols eliminar la resposta anterior a aquesta pregunta?" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Moved to next step." -msgstr "" +msgstr "Avançat al següent pas." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" @@ -199,6 +206,10 @@ msgid "" " uploaded the image to another website, you can paste a link to it into the " "answer box." msgstr "" +"Aquesta pregunta requereix la càrrega de fitxers, però el teu navegador no " +"les suporta. Prova la versió més nova de Google Chrome. Alternativament, si " +"has carregat la imatge a un altre lloc web, pots enganxar un enllaça a ella " +"en el requadre de resposta." #. Translators: "Show Question" is some text that, when clicked, shows a #. question's @@ -206,133 +217,136 @@ msgstr "" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Show Question" -msgstr "" +msgstr "Mostrar pregunta" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Hide Question" -msgstr "" +msgstr "Ocultar pregunta" #: common/lib/xmodule/xmodule/js/src/sequence/display.js msgid "" "Sequence error! Cannot navigate to tab %(tab_name)s in the current " "SequenceModule. Please contact the course staff." msgstr "" +"Error de seqüència! No s'ha pogut navegar a la pestanya %(tab_name)s en el " +"mòdul de seqüència actual. Si us plau, posa't en contacte amb el personal " +"del curs." #: common/lib/xmodule/xmodule/js/src/video/04_video_control.js msgid "Video slider" -msgstr "" +msgstr "Slider de vídeo" #: common/lib/xmodule/xmodule/js/src/video/04_video_control.js msgid "Pause" -msgstr "" +msgstr "Pausa" #: common/lib/xmodule/xmodule/js/src/video/04_video_control.js msgid "Play" -msgstr "" +msgstr "Iniciar" #: common/lib/xmodule/xmodule/js/src/video/04_video_control.js msgid "Fill browser" -msgstr "" +msgstr "Navegador complet" #: common/lib/xmodule/xmodule/js/src/video/04_video_control.js msgid "Exit full browser" -msgstr "" +msgstr "Surt del navegador complet" #: common/lib/xmodule/xmodule/js/src/video/05_video_quality_control.js msgid "HD on" -msgstr "" +msgstr "HD activat" #: common/lib/xmodule/xmodule/js/src/video/05_video_quality_control.js msgid "HD off" -msgstr "" +msgstr "HD desactivat" #: common/lib/xmodule/xmodule/js/src/video/06_video_progress_slider.js #: common/lib/xmodule/xmodule/js/src/video/06_video_progress_slider.js msgid "Video position" -msgstr "" +msgstr "Posició del vídeo" #: common/lib/xmodule/xmodule/js/src/video/06_video_progress_slider.js msgid "Video ended" -msgstr "" +msgstr "Video finalitzat" #: common/lib/xmodule/xmodule/js/src/video/06_video_progress_slider.js msgid "%(value)s hour" msgid_plural "%(value)s hours" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(value)s hora" +msgstr[1] "%(value)s hores" #: common/lib/xmodule/xmodule/js/src/video/06_video_progress_slider.js msgid "%(value)s minute" msgid_plural "%(value)s minutes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(value)s minut" +msgstr[1] "%(value)s minuts" #: common/lib/xmodule/xmodule/js/src/video/06_video_progress_slider.js msgid "%(value)s second" msgid_plural "%(value)s seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(value)s segon" +msgstr[1] "%(value)s segons" #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Volume" -msgstr "" +msgstr "Volum" #. Translators: Volume level equals 0%. #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Muted" -msgstr "" +msgstr "Mut" #. Translators: Volume level in range (0,20]% #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Very low" -msgstr "" +msgstr "Molt baix" #. Translators: Volume level in range (20,40]% #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Low" -msgstr "" +msgstr "Baix" #. Translators: Volume level in range (40,60]% #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Average" -msgstr "" +msgstr "Mig" #. Translators: Volume level in range (60,80]% #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Loud" -msgstr "" +msgstr "Alt" #. Translators: Volume level in range (80,100)% #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Very loud" -msgstr "" +msgstr "Molt alt" #. Translators: Volume level equals 100%. #: common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js msgid "Maximum" -msgstr "" +msgstr "Màxim" #: common/lib/xmodule/xmodule/js/src/video/09_video_caption.js msgid "Caption will be displayed when " -msgstr "" +msgstr "El text es mostrarà quan" #: common/lib/xmodule/xmodule/js/src/video/09_video_caption.js msgid "Turn on captions" -msgstr "" +msgstr "Activar textos" #: common/lib/xmodule/xmodule/js/src/video/09_video_caption.js msgid "Turn off captions" -msgstr "" +msgstr "Desactivar textos" #: common/static/coffee/src/discussion/discussion_module_view.js #: common/static/coffee/src/discussion/discussion_module_view.js msgid "Hide Discussion" -msgstr "" +msgstr "Ocultar discussió" #: common/static/coffee/src/discussion/discussion_module_view.js msgid "Show Discussion" -msgstr "" +msgstr "Mostrar discussió" #: common/static/coffee/src/discussion/discussion_module_view.js #: common/static/coffee/src/discussion/discussion_module_view.js @@ -341,32 +355,40 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" -msgstr "" +msgstr "Ho sentim" #: common/static/coffee/src/discussion/discussion_module_view.js msgid "We had some trouble loading the discussion. Please try again." msgstr "" +"Hem tingut problemes carregant la discussió. Si us plau, prova-ho de nou." #: common/static/coffee/src/discussion/discussion_module_view.js msgid "" "We had some trouble loading the threads you requested. Please try again." msgstr "" +"Hem tingut problemes carregant els fils que has sol·licitat. Si us plau, " +"intenta-ho de nou." #: common/static/coffee/src/discussion/utils.js msgid "Loading content" -msgstr "" +msgstr "Carregant el contingut" #: common/static/coffee/src/discussion/utils.js msgid "" "We had some trouble processing your request. Please ensure you have copied " "any unsaved work and then reload the page." msgstr "" +"Hem tingut problemes processant la teva sol·licitud. Si us plau, assegura't " +"que hagis copiat qualsevol feina no guardada i torna a carregar la pàgina." #: common/static/coffee/src/discussion/utils.js msgid "We had some trouble processing your request. Please try again." msgstr "" +"Hem tingut problemes processant la teva sol·licitud. Si us plau, intenta-ho " +"de nou." #: common/static/coffee/src/discussion/utils.js #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js @@ -376,63 +398,64 @@ msgstr "" #: common/static/coffee/src/discussion/views/new_post_view.js #: common/static/coffee/src/discussion/views/new_post_view.js msgid "…" -msgstr "" +msgstr "..." #: common/static/coffee/src/discussion/views/discussion_content_view.js #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "Close" -msgstr "" +msgstr "Tancar" #: common/static/coffee/src/discussion/views/discussion_content_view.js #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "Open" -msgstr "" +msgstr "Obrir" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "remove vote" -msgstr "" +msgstr "eliminar vot" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "vote" -msgstr "" +msgstr "vot" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "vote (click to remove your vote)" msgid_plural "votes (click to remove your vote)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "vots (clica aquí per esborrar el teu vot)" +msgstr[1] "vots (clica aquí per esborrar el teu vot)" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "vote (click to vote)" msgid_plural "votes (click to vote)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "vots (clica aquí per votar)" +msgstr[1] "vots (clica aquí per votar)" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "Load more" -msgstr "" +msgstr "Carrega més" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "Loading more threads" -msgstr "" +msgstr "Carregant més fils" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "We had some trouble loading more threads. Please try again." msgstr "" +"Hem tingut problemes carregant més fils. Si us plau, intenta-ho de nou." #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "%(unread_count)s new comment" msgid_plural "%(unread_count)s new comments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(unread_count)s comentari nou" +msgstr[1] "%(unread_count)s comentaris nous" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "Loading thread list" -msgstr "" +msgstr "Carregant llista de fils" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Click to remove report" -msgstr "" +msgstr "Clica per eliminar l'informe" #. Translators: The text between start_sr_span and end_span is not shown #. in most browsers but will be read by screen readers. @@ -440,230 +463,253 @@ msgstr "" #: common/static/coffee/src/discussion/views/thread_response_show_view.js msgid "Misuse Reported%(start_sr_span)s, click to remove report%(end_span)s" msgstr "" +"S'ha informat d'un mal ús %(start_sr_span)s, clica per eliminar " +"l'informe%(end_span)s" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js #: common/static/coffee/src/discussion/views/response_comment_show_view.js #: common/static/coffee/src/discussion/views/response_comment_show_view.js #: common/static/coffee/src/discussion/views/thread_response_show_view.js msgid "Report Misuse" -msgstr "" +msgstr "Informar de mal ús" #. Translators: The text between start_sr_span and end_span is not shown #. in most browsers but will be read by screen readers. #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Pinned%(start_sr_span)s, click to unpin%(end_span)s" -msgstr "" +msgstr "Fixat%(start_sr_span)s, clica per alliberar%(end_span)s" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Click to unpin" -msgstr "" +msgstr "Clica per alliberar" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Pinned" -msgstr "" +msgstr "Fixat" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Pin Thread" -msgstr "" +msgstr "Fixar fil" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "" "The thread you selected has been deleted. Please select another thread." msgstr "" +"El fil que ha seleccionat ha sigut esborrat. Si us plau, seleccioneu-ne un " +"altre." #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "We had some trouble loading responses. Please reload the page." msgstr "" +"Hem tingut problemes carregant les respostes. Si us plau, recarrega la " +"pàgina." #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "We had some trouble loading more responses. Please try again." msgstr "" +"Hem tingut problemes carregant més respostes. Si us plau, intenta-ho de nou." #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "%(numResponses)s response" msgid_plural "%(numResponses)s responses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(numResponses)s resposta" +msgstr[1] "%(numResponses)s respostes" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Showing all responses" -msgstr "" +msgstr "Mostrant totes les respostes" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Showing first response" msgid_plural "Showing first %(numResponses)s responses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Mostrant la primera resposta" +msgstr[1] "Mostrant les primeres %(numResponses)s respostes" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Load all responses" -msgstr "" +msgstr "Carrega totes les respostes" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Load next %(numResponses)s responses" -msgstr "" +msgstr "Carrega les següents %(numResponses)s respostes" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Are you sure you want to delete this post?" +msgstr "Segur que vols esborrar aquest post?" + +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." msgstr "" +"Estem tenint alguns problemes carregant la pàgina que ha demanat. Si us " +"plau, torna-ho a provar." #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" -msgstr "" +msgstr "anònim" #: common/static/coffee/src/discussion/views/response_comment_show_view.js #: common/static/coffee/src/discussion/views/thread_response_show_view.js msgid "staff" -msgstr "" +msgstr "personal" #: common/static/coffee/src/discussion/views/response_comment_show_view.js #: common/static/coffee/src/discussion/views/thread_response_show_view.js msgid "Community TA" -msgstr "" +msgstr "Comunitat TA" #: common/static/coffee/src/discussion/views/response_comment_show_view.js #: common/static/coffee/src/discussion/views/response_comment_show_view.js #: common/static/coffee/src/discussion/views/thread_response_show_view.js msgid "Misuse Reported, click to remove report" -msgstr "" +msgstr "Informe de mal ús enviat, feu clic per eliminar-lo." #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Are you sure you want to delete this comment?" -msgstr "" +msgstr "Segur que vols esborrar aquest comentari?" #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "We had some trouble deleting this comment. Please try again." msgstr "" +"Hem tingut problemes esborrant aquest comentari. Si us plau, intenta-ho de " +"nou." #: common/static/coffee/src/discussion/views/thread_response_view.js msgid "Are you sure you want to delete this response?" -msgstr "" +msgstr "Segur que vols esborrar aquesta resposta?" #: common/static/js/src/jquery.timeago.locale.js msgid "%s ago" -msgstr "" +msgstr "fa %s" #: common/static/js/src/jquery.timeago.locale.js msgid "%s from now" -msgstr "" +msgstr "%s des d'ara" #: common/static/js/src/jquery.timeago.locale.js msgid "less than a minute" -msgstr "" +msgstr "menys d'un minut" #: common/static/js/src/jquery.timeago.locale.js msgid "about a minute" -msgstr "" +msgstr "aproximadament un minut" #: common/static/js/src/jquery.timeago.locale.js msgid "%d minute" msgid_plural "%d minutes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d minut" +msgstr[1] "%d minuts" #: common/static/js/src/jquery.timeago.locale.js msgid "about an hour" -msgstr "" +msgstr "aproximadament una hora" #: common/static/js/src/jquery.timeago.locale.js msgid "about %d hour" msgid_plural "about %d hours" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "aproximadament %d hora" +msgstr[1] "aproximadament %d hores" #: common/static/js/src/jquery.timeago.locale.js msgid "a day" -msgstr "" +msgstr "un dia" #: common/static/js/src/jquery.timeago.locale.js msgid "%d day" msgid_plural "%d days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d dia" +msgstr[1] "%d dies" #: common/static/js/src/jquery.timeago.locale.js msgid "about a month" -msgstr "" +msgstr "aproximadament un mes" #: common/static/js/src/jquery.timeago.locale.js msgid "%d month" msgid_plural "%d months" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d mes" +msgstr[1] "%d mesos" #: common/static/js/src/jquery.timeago.locale.js msgid "about a year" -msgstr "" +msgstr "aproximadament un any" #: common/static/js/src/jquery.timeago.locale.js msgid "%d year" msgid_plural "%d years" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d any" +msgstr[1] "%d anys" #: lms/static/admin/js/SelectFilter2.js msgid "Available %s" -msgstr "" +msgstr "Disponible %s" #: lms/static/admin/js/SelectFilter2.js msgid "" "This is the list of available %s. You may choose some by selecting them in " "the box below and then clicking the \"Choose\" arrow between the two boxes." msgstr "" +"Aquesta és la llista dels %s disponibles. Pots triar-ne alguns seleccionant-" +"los al requadre inferior i clicant a continuació la fletxa \"Escollir\" " +"entre els dos requadres." #: lms/static/admin/js/SelectFilter2.js msgid "Type into this box to filter down the list of available %s." -msgstr "" +msgstr "Escriu en aquest requadre per filtrar la llista dels %s disponibles." #: lms/static/admin/js/SelectFilter2.js msgid "Filter" -msgstr "" +msgstr "Filtrar" #: lms/static/admin/js/SelectFilter2.js msgid "Choose all" -msgstr "" +msgstr "Escollir-ho tot" #: lms/static/admin/js/SelectFilter2.js msgid "Click to choose all %s at once." -msgstr "" +msgstr "Clica per escollir-los tots els %s a la vegada." #: lms/static/admin/js/SelectFilter2.js msgid "Choose" -msgstr "" +msgstr "Escollir" #: lms/static/admin/js/SelectFilter2.js msgid "Remove" -msgstr "" +msgstr "Eliminar" #: lms/static/admin/js/SelectFilter2.js msgid "Chosen %s" -msgstr "" +msgstr "Escollit %s" #: lms/static/admin/js/SelectFilter2.js msgid "" "This is the list of chosen %s. You may remove some by selecting them in the " "box below and then clicking the \"Remove\" arrow between the two boxes." msgstr "" +"Aquesta és la llista dels %s escollits. Pots esborrar-ne alguns " +"seleccionant-los en el requadre inferior i clicant a continuació la fletxa " +"\"Eliminar\" entre els dos requadres." #: lms/static/admin/js/SelectFilter2.js msgid "Remove all" -msgstr "" +msgstr "Elimina-ho tot" #: lms/static/admin/js/SelectFilter2.js msgid "Click to remove all chosen %s at once." -msgstr "" +msgstr "Clica per eliminar tots els %s escollits a la vegada." #: lms/static/admin/js/actions.js lms/static/admin/js/actions.min.js msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(sel)s de %(cnt)s seleccionats" +msgstr[1] "%(sel)s de %(cnt)s seleccionades" #: lms/static/admin/js/actions.js lms/static/admin/js/actions.min.js msgid "" "You have unsaved changes on individual editable fields. If you run an " "action, your unsaved changes will be lost." msgstr "" +"No has guardat els canvis en els camps editables individuals. Si realitzes " +"una acció, els teus canvis es perdran." #: lms/static/admin/js/actions.js lms/static/admin/js/actions.min.js msgid "" @@ -671,6 +717,9 @@ msgid "" "individual fields yet. Please click OK to save. You'll need to re-run the " "action." msgstr "" +"Has seleccionat una acció, però encara no has guardat els canvis en els " +"camps individuals. Si us plau, clica \"D'acord\" per guardar-ho. Hauràs de " +"tornar a realitzar l'acció." #: lms/static/admin/js/actions.js lms/static/admin/js/actions.min.js msgid "" @@ -678,235 +727,250 @@ msgid "" "fields. You're probably looking for the Go button rather than the Save " "button." msgstr "" +"Has seleccionat una acció, però encara no has guardat els canvis en els " +"camps individuals. Deus buscar el botó Anar en lloc del de Guardar." #. Translators: the names of months, keep the pipe (|) separators. #: lms/static/admin/js/calendar.js lms/static/admin/js/dateparse.js msgid "" "January|February|March|April|May|June|July|August|September|October|November|December" msgstr "" +"Gener|Febrer|Març|Abril|Maig|Juny|Juliol|Agost|Setembre|Octubre|Novembre|Desembre" #. Translators: abbreviations for days of the week, keep the pipe (|) #. separators. #: lms/static/admin/js/calendar.js msgid "S|M|T|W|T|F|S" -msgstr "" +msgstr "Dg|Dl|Dm|Dc|Dj|Dv|Ds" #: lms/static/admin/js/collapse.js lms/static/admin/js/collapse.js.c #: lms/static/admin/js/collapse.min.js msgid "Show" -msgstr "" +msgstr "Mostrar" #: lms/static/admin/js/collapse.js lms/static/admin/js/collapse.min.js msgid "Hide" -msgstr "" +msgstr "Ocultar" #. Translators: the names of days, keep the pipe (|) separators. #: lms/static/admin/js/dateparse.js msgid "Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday" -msgstr "" +msgstr "Diumenge|Dilluns|Dimarts|Dimecres|Dijous|Divendres|Dissabte" #: lms/static/admin/js/admin/DateTimeShortcuts.js #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Now" -msgstr "" +msgstr "Ara" #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Clock" -msgstr "" +msgstr "Rellotge" #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Choose a time" -msgstr "" +msgstr "Escull una hora" #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Midnight" -msgstr "" +msgstr "Mitjanit" #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "6 a.m." -msgstr "" +msgstr "6 a.m." #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Noon" -msgstr "" +msgstr "Migdia" #: lms/static/admin/js/admin/DateTimeShortcuts.js #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Today" -msgstr "" +msgstr "Avui" #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Calendar" -msgstr "" +msgstr "Calendari" #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Yesterday" -msgstr "" +msgstr "Ahir" #: lms/static/admin/js/admin/DateTimeShortcuts.js msgid "Tomorrow" -msgstr "" +msgstr "Demà" #: lms/static/coffee/src/calculator.js msgid "Open Calculator" -msgstr "" +msgstr "Obrir la calculadora" #: lms/static/coffee/src/calculator.js msgid "Close Calculator" -msgstr "" +msgstr "Tancar la calculadora" #: lms/static/coffee/src/customwmd.js msgid "Preview" -msgstr "" +msgstr "Previsualitzar" #: lms/static/coffee/src/customwmd.js msgid "Post body" -msgstr "" +msgstr "Cos del missatge" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Error fetching distribution." -msgstr "" +msgstr "Error obtenint distribució." #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Unavailable metric display." -msgstr "" +msgstr "Mètrica de visualització no disponible" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Error fetching grade distributions." -msgstr "" +msgstr "Error obtenint distribució de puntuacions." #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Last Updated: <%= timestamp %>" -msgstr "" +msgstr "Darrera actualització: <%= timestamp %>" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "<%= num_students %> students scored." -msgstr "" +msgstr "<%= num_students %> estudiants puntuats." #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "Loading..." -msgstr "" +msgstr "Carregant...." #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "Error getting student list." -msgstr "" +msgstr "Error obtenint la llista d'estudiants." #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "Error retrieving grading configuration." -msgstr "" +msgstr "Error obtenint la configuració de graus" #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "Error generating grades. Please try again." -msgstr "" +msgstr "Error generant puntuacions. Si us plau, intenta-ho de nou." #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "File Name" -msgstr "" +msgstr "Nom del fitxer" #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "" "Links are generated on demand and expire within 5 minutes due to the " "sensitive nature of student information." msgstr "" +"Els enllaços es generen sota demanda i caduquen en 5 minuts degut a la " +"naturalesa sensible de la informació de l'estudiant." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Username" -msgstr "" +msgstr "Nom d'usuari" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Email" -msgstr "" +msgstr "Email" #: lms/static/coffee/src/instructor_dashboard/membership.js #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Revoke access" -msgstr "" +msgstr "Revocar l'accés" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Enter username or email" -msgstr "" +msgstr "Entra el nom d'usuari o email" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Please enter a username or email." -msgstr "" +msgstr "Si us plau, entra el nom d'usuari o email." #. Translators: A rolename appears this sentence.; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error fetching list for role" -msgstr "" +msgstr "Error obtenint la llista per al perfil" #: lms/static/coffee/src/instructor_dashboard/membership.js #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error changing user's permissions." -msgstr "" +msgstr "Error canviant els permisos d'usuari." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Could not find a user with username or email address '<%= identifier %>'." msgstr "" +"No s'ha pogut trobar l'usuari amb el nom d'usuari o adreça d'email '<%= " +"identifier %>'." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Error: User '<%= username %>' has not yet activated their account. Users " "must create and activate their accounts before they can be assigned a role." msgstr "" +"Error: l'usuari'<%= username %>' encara no ha activat el seu compte. Els " +"usuaris han de crear i activar els seus comptes abans de poder assignar-los " +"un rol." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error: You cannot remove yourself from the Instructor group!" -msgstr "" +msgstr "Error: no pots eliminar-te tu mateix del grup d'instructors!" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error adding/removing users as beta testers." -msgstr "" +msgstr "Error afegint o eliminant usuaris com a beta testers." #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were successfully added as beta testers:" -msgstr "" +msgstr "Aquests usuaris s'han afegit correctament com a beta testers:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were successfully removed as beta testers:" -msgstr "" +msgstr "Aquests usuaris han estat correctament eliminats com a beta testers:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were not added as beta testers:" -msgstr "" +msgstr "Aquests usuaris no s'han afegit com a beta testers:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were not removed as beta testers:" -msgstr "" +msgstr "Aquests usuaris no s'han esborrat com a beta testers:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Users must create and activate their account before they can be promoted to " "beta tester." msgstr "" +"Els usuaris han de crear i activar els seus comptes abans de poder ser " +"promoguts a beta tester." #. Translators: A list of identifiers (which are email addresses and/or #. usernames) appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Could not find users associated with the following identifiers:" msgstr "" +"No s'han pogut trobar usuaries associats amb el següents identificadors:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error enrolling/unenrolling users." -msgstr "" +msgstr "Error donant d'alta/baixa usuaris." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "The following email addresses and/or usernames are invalid:" -msgstr "" +msgstr "Les següents adreces de correu i/o noms d'usuaris són invàlids:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Successfully enrolled and sent email to the following users:" msgstr "" +"Els següents usuaris han estat donats d'alta correctament i se'ls ha enviat " +"un email:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Successfully enrolled the following users:" -msgstr "" +msgstr "Els següents usuaris han estat donats d'alta correctament:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -914,11 +978,13 @@ msgid "" "Successfully sent enrollment emails to the following users. They will be " "allowed to enroll once they register:" msgstr "" +"S'han enviat correctament els emails d'alta dels següents usuaris. Es podran" +" donar d'alta un cop s'enregistrin:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users will be allowed to enroll once they register:" -msgstr "" +msgstr "Aquests usuaris poden donar-se d'alta un cop s'enregistrin:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -926,11 +992,13 @@ msgid "" "Successfully sent enrollment emails to the following users. They will be " "enrolled once they register:" msgstr "" +"S'han enviat correctament els emails d'alta als següents usuaris. Seran " +"donats d'alta un cop s'enregistrin:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users will be enrolled once they register:" -msgstr "" +msgstr "Aquests usuaris seran donats d'alta un cop s'enregistrin:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -938,47 +1006,58 @@ msgid "" "Emails successfully sent. The following users are no longer enrolled in the " "course:" msgstr "" +"Emails enviats correctament. Els següents usuaris ja no estan donats d'alta " +"al curs:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "The following users are no longer enrolled in the course:" -msgstr "" +msgstr "Els usuaris següents ja no estan donats d'alta al curs:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "These users were not affiliated with the course so could not be unenrolled:" msgstr "" +"Aquests usuaris no han estat afiliats al curs i, per tant, no han pogut ser " +"donats de baixa:" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "Your message must have a subject." -msgstr "" +msgstr "El teu missatge ha de tenir un tema." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "Your message cannot be blank." -msgstr "" +msgstr "El teu missatge no pot estar en blanc." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "Your email was successfully queued for sending." -msgstr "" +msgstr "El teu email s'ha posat en cua per ser enviat." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" "You are about to send an email titled '<%= subject %>' to yourself. Is this " "OK?" msgstr "" +"Estàs a punt d'enviar un email titulat '<%= subject %>' a tu mateix. És " +"correcte?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" "You are about to send an email titled '<%= subject %>' to everyone who is " "staff or instructor on this course. Is this OK?" msgstr "" +"Estàs a punt d'enviar un email titulat '<%= subject %>' a tothom que sigui " +"personal o instructor d'aquest curs. És correcte?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" "You are about to send an email titled '<%= subject %>' to ALL (everyone who " "is enrolled in this course as student, staff, or instructor). Is this OK?" msgstr "" +"Estàs a punt d'enviar un email titulat '<%= subject %>' a TOTHOM (qualsevol " +"que estigui enregistrat al curs com estudiant, personal o instructor). És " +"correcte?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" @@ -986,18 +1065,23 @@ msgid "" "classes, it may take up to an hour (or more, if other courses are " "simultaneously sending email) to send all emails." msgstr "" +"El teu email ha estat posat en cua per ser enviat. Si us plau, tingues en " +"compte que per a classes nombroses, pot portar fins a una hora (o més si " +"altres cursos estan enviant emails simultàniament) per enviar tots els " +"emails." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "Error sending email." -msgstr "" +msgstr "Error enviant email." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "There is no email history for this course." -msgstr "" +msgstr "No hi ha històric d'emails per aquest curs." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "There was an error obtaining email task history for this course." msgstr "" +"Hi ha hagut un error obtenint l'email d'històric de tasques per aquest curs." #: lms/static/coffee/src/instructor_dashboard/student_admin.js #: lms/static/coffee/src/instructor_dashboard/student_admin.js @@ -1005,13 +1089,15 @@ msgstr "" #: lms/static/coffee/src/instructor_dashboard/student_admin.js #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Please enter a student email address or username." -msgstr "" +msgstr "Si us plau entra una adreça d'email d'estudiant o nom d'usuari." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error getting student progress url for '<%= student_id %>'. Check that the " "student identifier is spelled correctly." msgstr "" +"Error obtenint el progrés de l'estudiant '<%= student_id %>'. Comprova que " +"l'identificador d'estudiant està correctament escrit." #: lms/static/coffee/src/instructor_dashboard/student_admin.js #: lms/static/coffee/src/instructor_dashboard/student_admin.js @@ -1021,13 +1107,15 @@ msgstr "" #: lms/static/coffee/src/instructor_dashboard/student_admin.js #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Please enter a problem urlname." -msgstr "" +msgstr "Si us plau, entra un nom per al problema." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Success! Problem attempts reset for problem '<%= problem_id %>' and student " "'<%= student_id %>'." msgstr "" +"Correcte! Els intents de problema han estat re-iniciats per al problema '<%=" +" problem_id %>' i l'estudiant '<%= student_id %>'." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1035,21 +1123,29 @@ msgid "" " '<%= student_id %>'. Check that the problem and student identifiers are " "spelled correctly." msgstr "" +"Error reiniciant els intents de problema per al problema '<%= problem_id %>'" +" i l'estudiant '<%= student_id %>'. Comprova que els identificadors del " +"problema i d'estudiant han estat escrits correctament." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Delete student '<%= student_id %>'s state on problem '<%= problem_id %>'?" msgstr "" +"Vols esborrar l'estat de l'estudiant '<%= student_id %>' per al problema " +"'<%= problem_id %>'?" #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error deleting student '<%= student_id %>'s state on problem '<%= problem_id" " %>'. Check that the problem and student identifiers are spelled correctly." msgstr "" +"Error esborrant l'estat de l'estudiant '<%= student_id %>' sobre el problema" +" '<%= problem_id %>'. Comprova que els identificadors d'estudiant i problema" +" estan correctament escrits." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Module state successfully deleted." -msgstr "" +msgstr "Estat del mòdul esborrat correctament." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1057,6 +1153,10 @@ msgid "" "'<%= student_id %>'. Click the 'Show Background Task History for Student' " "button to see the status of the task." msgstr "" +"Iniciada la tasca de re-puntuació de problema per al problema '<%= " +"problem_id %>' i estudiant '<%= student_id %>'. Feu clic al botó 'Mostrar " +"Històric de Tasques en Segon Pla per a l'Estudiant' per veure l'estat de la " +"tasca." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1064,6 +1164,9 @@ msgid "" "'<%= student_id %>'. Check that the problem and student identifiers are " "spelled correctly." msgstr "" +"Error iniciant una tasca de re-puntuació de problema per al problema '<%= " +"problem_id %>' per a l'estudiant '<%= student_id %>'. Comprova que els " +"identificadors de problema i estudiant estiguin escrits correctament." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1071,10 +1174,15 @@ msgid "" "student_id %>'. Check that the problem and student identifiers are spelled " "correctly." msgstr "" +"Error obtenint l'històric de tasques per al problema '<%= problem_id %> i " +"estudiant '<%= student_id %>'. Comprova que els identificadors de problema i" +" estudiant estan escrits correctament." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Reset attempts for all students on problem '<%= problem_id %>'?" msgstr "" +"Vols reiniciar els intents de tots els estudiants sobre el problema '<%= " +"problem_id %>'?" #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1082,16 +1190,23 @@ msgid "" " Click the 'Show Background Task History for Problem' button to see the " "status of the task." msgstr "" +"S'ha iniciat correctament la tasca per reiniciar els intents del problema " +"'<%= problem_id %>'. Feu clic al botó 'Mostrar Històric de Tasques en Segon " +"Pla per a l'Estudiant' per veure l'estat de la tasca." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error starting a task to reset attempts for all students on problem '<%= " "problem_id %>'. Check that the problem identifier is spelled correctly." msgstr "" +"Error iniciant una tasca per re-iniciar els intents de tots els estudiants " +"per al problema '<%= problem_id %>'. Comprova que l'identificador de " +"problema està escrit correctament." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Rescore problem '<%= problem_id %>' for all students?" msgstr "" +"Vols re-puntuar el problema '<%= problem_id %>' per a tots els estudiants?" #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1099,245 +1214,252 @@ msgid "" "students. Click the 'Show Background Task History for Problem' button to see" " the status of the task." msgstr "" +"S'ha iniciat correctament la tasca per re-puntuar el problema '<%= " +"problem_id %>' per a tots els estudiants. Clica el botó 'Mostrar Històric de" +" Tasques en Segon Pla del Problema' per veure l'estat de la tasca." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error starting a task to rescore problem '<%= problem_id %>'. Check that the" " problem identifier is spelled correctly." msgstr "" +"Error iniciant una tasca per re-puntuar el problema '<%= problem_id %>'. " +"Comprova que l'identificador de problema està escrit correctament." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Error listing task history for this student and problem." -msgstr "" +msgstr "Error llistant l'històric de tasques per aquest estudiant i problema." #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task Type" -msgstr "" +msgstr "Tipus de tasca" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task inputs" -msgstr "" +msgstr "Entrades de tasca" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task ID" -msgstr "" +msgstr "ID de tasca" #. Translators: a "Requester" is a username that requested a task such as #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Requester" -msgstr "" +msgstr "Sol·licitant" #. Translators: A timestamp of when a task (eg, sending email) was submitted #. appears after this #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Submitted" -msgstr "" +msgstr "Enviat" #. Translators: The length of a task (eg, sending email) in seconds appears #. this #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Duration (sec)" -msgstr "" +msgstr "Durada (segons)" #. Translators: The state (eg, "In progress") of a task (eg, sending email) #. appears after this. #: lms/static/coffee/src/instructor_dashboard/util.js msgid "State" -msgstr "" +msgstr "Estat" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task Status" -msgstr "" +msgstr "Estat de tasca" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task Progress" -msgstr "" +msgstr "Progrés de tasca" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Grades saved. Fetching the next submission to grade." msgstr "" +"Puntuacions guardades. Obtenint la següent sol·licitud per valorar-la." #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Problem Name" -msgstr "" +msgstr "Nom del problema" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Graded" -msgstr "" +msgstr "Puntuat" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Available to Grade" -msgstr "" +msgstr "Disponible per puntuar" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Required" -msgstr "" +msgstr "Requerit" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Progress" -msgstr "" +msgstr "Progrés" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Back to problem list" -msgstr "" +msgstr "Tornar a la llista de problemes" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Try loading again" -msgstr "" +msgstr "Prova de carregar-ho de nou" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "<%= num %> available " -msgstr "" +msgstr "<%= num %> disponible" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "<%= num %> graded " -msgstr "" +msgstr "<%= num %> puntuat" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "<%= num %> more needed to start ML" -msgstr "" +msgstr "Es necessiten <%= num %> més per iniciar ML" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Re-check for submissions" -msgstr "" +msgstr "Re-comprova sol·licituds" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "System got into invalid state: <%= state %>" -msgstr "" +msgstr "El sistema ha obtingut un estat invàlid: <%= state %>" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "System got into invalid state for submission: " -msgstr "" +msgstr "El sistema ha obtingut un estat invàlid per a la sol·licitud:" #: lms/static/coffee/src/staff_grading/staff_grading.js #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "(Hide)" -msgstr "" +msgstr "(Ocultar)" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "(Show)" -msgstr "" +msgstr "(Mostrar)" #: lms/static/js/Markdown.Editor.js msgid "Insert Hyperlink" -msgstr "" +msgstr "Inserta l'hipervincle" #. Translators: Please keep the quotation marks (") around this text #: lms/static/js/Markdown.Editor.js lms/static/js/Markdown.Editor.js.c msgid "\"optional title\"" -msgstr "" +msgstr "\"títol opcional\"" #: lms/static/js/Markdown.Editor.js msgid "Insert Image (upload file or type url)" -msgstr "" +msgstr "Inserta una imatge (puja un fitxer o escriu una url)" #: lms/static/js/Markdown.Editor.js msgid "Markdown Editing Help" -msgstr "" +msgstr "Ajuda d'edició amb etiquetes" #: lms/static/js/Markdown.Editor.js msgid "Bold (Ctrl+B)" -msgstr "" +msgstr "Negreta (Ctrl+B)" #: lms/static/js/Markdown.Editor.js msgid "Italic (Ctrl+I)" -msgstr "" +msgstr "Cursiva (Ctrl+I)" #: lms/static/js/Markdown.Editor.js msgid "Hyperlink (Ctrl+L)" -msgstr "" +msgstr "Enllaç (Ctrl+L)" #: lms/static/js/Markdown.Editor.js msgid "Blockquote (Ctrl+Q)" -msgstr "" +msgstr "Cita (Ctrl+Q)" #: lms/static/js/Markdown.Editor.js msgid "Code Sample (Ctrl+K)" -msgstr "" +msgstr "Exemple de codi (Ctrl+K)" #: lms/static/js/Markdown.Editor.js msgid "Image (Ctrl+G)" -msgstr "" +msgstr "Imatge (Ctrl+G)" #: lms/static/js/Markdown.Editor.js msgid "Numbered List (Ctrl+O)" -msgstr "" +msgstr "Llista numerada (Ctrl+O)" #: lms/static/js/Markdown.Editor.js msgid "Bulleted List (Ctrl+U)" -msgstr "" +msgstr "Llista amb pics (Ctrl+U)" #: lms/static/js/Markdown.Editor.js msgid "Heading (Ctrl+H)" -msgstr "" +msgstr "Capçalera (Ctrl+H)" #: lms/static/js/Markdown.Editor.js msgid "Horizontal Rule (Ctrl+R)" -msgstr "" +msgstr "Línia horitzontal (Ctrl+R)" #: lms/static/js/Markdown.Editor.js msgid "Undo (Ctrl+Z)" -msgstr "" +msgstr "Desfer (Ctrl+Z)" #: lms/static/js/Markdown.Editor.js msgid "Redo (Ctrl+Y)" -msgstr "" +msgstr "Refer (Ctrl+Y)" #: lms/static/js/Markdown.Editor.js msgid "Redo (Ctrl+Shift+Z)" -msgstr "" +msgstr "Refer (Ctrl+Shift+Z)" #: lms/static/js/Markdown.Editor.js msgid "strong text" -msgstr "" +msgstr "text en negreta" #: lms/static/js/Markdown.Editor.js msgid "emphasized text" -msgstr "" +msgstr "text emfatitzat" #: lms/static/js/Markdown.Editor.js msgid "enter image description here" -msgstr "" +msgstr "entreu aquí la descripció de la imatge" #: lms/static/js/Markdown.Editor.js msgid "enter link description here" -msgstr "" +msgstr "entra aquí la descripció de l'enllaç" #: lms/static/js/Markdown.Editor.js msgid "Blockquote" -msgstr "" +msgstr "Cita" #: lms/static/js/Markdown.Editor.js lms/static/js/Markdown.Editor.js msgid "enter code here" -msgstr "" +msgstr "entra el codi aquí" #: lms/static/js/Markdown.Editor.js msgid "List item" -msgstr "" +msgstr "Item de llista" #: lms/static/js/Markdown.Editor.js msgid "Heading" -msgstr "" +msgstr "Capçalera" #: lms/templates/class_dashboard/all_section_metrics.js #: lms/templates/class_dashboard/all_section_metrics.js msgid "Unable to retrieve data, please try again later." msgstr "" +"No s'ha pogut obtenir les dades. Si us plau, intenta-ho més endavant." #: lms/templates/class_dashboard/d3_stacked_bar_graph.js msgid "Number of Students" -msgstr "" +msgstr "Nombre d'estudiants" #: cms/static/coffee/src/main.js msgid "" @@ -1554,7 +1676,7 @@ msgstr "Carregar un nou PDF a “<%= name %>”" #: cms/static/js/views/edit_chapter.js msgid "Please select a PDF file to upload." -msgstr "" +msgstr "Si us plau, seleccioneu un fitxer PDF per pujar-lo." #: cms/static/js/views/edit_textbook.js #: cms/static/js/views/overview_assignment_grader.js @@ -1573,6 +1695,10 @@ msgstr "" "Format de fitxer no suportat. Si us plau, carregueu un fitxer amb una " "extensió tar.gz." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "Carregar fitxer" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Col·lapsa totes les seccions" @@ -1641,7 +1767,7 @@ msgstr "Esborrant" #: cms/static/js/views/uploads.js msgid "Upload" -msgstr "" +msgstr "Pujar" #: cms/static/js/views/uploads.js msgid "We're sorry, there was an error" @@ -1676,23 +1802,23 @@ msgstr "Els canvis s'han guardat" #: cms/static/js/views/xblock_editor.js msgid "Editor" -msgstr "" +msgstr "Editor" #: cms/static/js/views/xblock_editor.js msgid "Settings" -msgstr "" +msgstr "Configuració" #: cms/static/js/views/modals/base_modal.js msgid "Save" -msgstr "" +msgstr "Guardar" #: cms/static/js/views/modals/edit_xblock.js msgid "Component" -msgstr "" +msgstr "Component" #: cms/static/js/views/modals/edit_xblock.js msgid "Editing: %(title)s" -msgstr "" +msgstr "Editant: %(title)s" #: cms/static/js/views/settings/advanced.js msgid "" @@ -1734,4 +1860,4 @@ msgstr "" #: cms/static/js/views/video/translations_editor.js msgid "Upload translation" -msgstr "" +msgstr "Pujar traducció" diff --git a/conf/locale/cs/LC_MESSAGES/django.mo b/conf/locale/cs/LC_MESSAGES/django.mo index dbe1c7065da2..69f63e9ec642 100644 Binary files a/conf/locale/cs/LC_MESSAGES/django.mo and b/conf/locale/cs/LC_MESSAGES/django.mo differ diff --git a/conf/locale/cs/LC_MESSAGES/django.po b/conf/locale/cs/LC_MESSAGES/django.po index 89c891ead969..9bd4a33fcd9c 100644 --- a/conf/locale/cs/LC_MESSAGES/django.po +++ b/conf/locale/cs/LC_MESSAGES/django.po @@ -53,7 +53,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-02-24 17:06+0000\n" "Last-Translator: Slamic \n" "Language-Team: Czech (http://www.transifex.com/projects/p/edx-platform/language/cs/)\n" @@ -186,6 +186,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -826,6 +836,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3825,7 +3839,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4166,11 +4181,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4719,6 +4770,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5045,6 +5111,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5515,6 +5601,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6440,6 +6530,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7105,10 +7199,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7132,6 +7222,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7171,6 +7265,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7273,10 +7372,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/cs/LC_MESSAGES/djangojs.mo b/conf/locale/cs/LC_MESSAGES/djangojs.mo index 99aa55a88783..62a16ac7ecf2 100644 Binary files a/conf/locale/cs/LC_MESSAGES/djangojs.mo and b/conf/locale/cs/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/cs/LC_MESSAGES/djangojs.po b/conf/locale/cs/LC_MESSAGES/djangojs.po index 0f9153c3dce3..f3e1ab11f5c2 100644 --- a/conf/locale/cs/LC_MESSAGES/djangojs.po +++ b/conf/locale/cs/LC_MESSAGES/djangojs.po @@ -20,8 +20,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Czech (http://www.transifex.com/projects/p/edx-platform/language/cs/)\n" "MIME-Version: 1.0\n" @@ -348,6 +348,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -519,6 +520,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1575,6 +1580,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/de_DE/LC_MESSAGES/django.mo b/conf/locale/de_DE/LC_MESSAGES/django.mo index 0f3c52df1dd2..c05b8c826c14 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 3879dd09db17..f44371ad73f2 100644 --- a/conf/locale/de_DE/LC_MESSAGES/django.po +++ b/conf/locale/de_DE/LC_MESSAGES/django.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: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-04-10 11:30+0000\n" "Last-Translator: andreas.frey \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/edx-platform/language/de_DE/)\n" @@ -206,6 +206,16 @@ msgstr "Sie sind nicht in diesem Kurs eingeschrieben" msgid "Enrollment action is invalid" msgstr "Die Einschreibung ist ungültig" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -857,6 +867,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3912,7 +3926,8 @@ msgstr "Passwort vergessen?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "Passwort" @@ -4254,11 +4269,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4815,6 +4866,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5141,6 +5207,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5611,6 +5697,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6534,6 +6624,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7197,10 +7291,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7224,6 +7314,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7263,6 +7357,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7365,10 +7464,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/de_DE/LC_MESSAGES/djangojs.mo b/conf/locale/de_DE/LC_MESSAGES/djangojs.mo index f5d01a02f5c2..24ec2cdc5c6e 100644 Binary files a/conf/locale/de_DE/LC_MESSAGES/djangojs.mo and b/conf/locale/de_DE/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/de_DE/LC_MESSAGES/djangojs.po b/conf/locale/de_DE/LC_MESSAGES/djangojs.po index e1abdecf724d..912df334b8f3 100644 --- a/conf/locale/de_DE/LC_MESSAGES/djangojs.po +++ b/conf/locale/de_DE/LC_MESSAGES/djangojs.po @@ -26,8 +26,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/edx-platform/language/de_DE/)\n" "MIME-Version: 1.0\n" @@ -351,6 +351,7 @@ msgstr "Diskussion anzeigen" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Entschuldigung" @@ -528,6 +529,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "Sind Sie sich sicher das Sie den Beitrag löschen wollen?" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "Anonym" @@ -1632,6 +1637,10 @@ msgstr "" "Das Dateiformat wird nicht unterstützt. Bitte laden Sie eine Datei mit der " "Endung tar.gz hoch." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Alle Sektionen verbergen" diff --git a/conf/locale/en@lolcat/LC_MESSAGES/django.mo b/conf/locale/en@lolcat/LC_MESSAGES/django.mo index b62efec5d962..9ea55dfedf99 100644 Binary files a/conf/locale/en@lolcat/LC_MESSAGES/django.mo and b/conf/locale/en@lolcat/LC_MESSAGES/django.mo differ diff --git a/conf/locale/en@lolcat/LC_MESSAGES/django.po b/conf/locale/en@lolcat/LC_MESSAGES/django.po index bac3c3ac8cca..e098a6cbda2b 100644 --- a/conf/locale/en@lolcat/LC_MESSAGES/django.po +++ b/conf/locale/en@lolcat/LC_MESSAGES/django.po @@ -47,7 +47,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-02-06 03:04+0000\n" "Last-Translator: nedbat \n" "Language-Team: LOLCAT English (http://www.transifex.com/projects/p/edx-platform/language/en@lolcat/)\n" @@ -180,6 +180,16 @@ msgstr "U R NOT ENROLLD IN DIS COURSE" msgid "Enrollment action is invalid" msgstr "ENROLLMENT ACSHUN IZ INVALID" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "THAR WUZ AN ERROR RECEIVIN UR LOGIN INFORMASHUN. PLZ EMAIL US. " @@ -827,6 +837,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3839,7 +3853,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4187,11 +4202,47 @@ msgstr "O NOES D: ERROR OKURD CUD U PLZ TRI AGAN L8R??!?" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "EDIT" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "RESET PASWORD" @@ -4771,6 +4822,21 @@ msgstr "AKOWNT PREFERENCEZ" msgid "Remember me" msgstr "PLZ 2 B MEMBERIN ME" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5117,6 +5183,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "CUD U PLZ COMPLEET TEH FOLLOWIN FIELDZ 2 REGISTR 4 AN AKOWNT?" @@ -5595,6 +5681,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "UR WORDZ:" @@ -6531,6 +6621,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "COURSE PROGRES 4 STUDENT '{username}' ({email})" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7203,10 +7297,6 @@ msgstr "" msgid "User Profile" msgstr "USR PROFIEL" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "ACTIVE FWEDZ" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7230,6 +7320,10 @@ msgstr "..." msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "ACTIVE FWEDZ" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7269,6 +7363,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7371,10 +7470,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/en@lolcat/LC_MESSAGES/djangojs.mo b/conf/locale/en@lolcat/LC_MESSAGES/djangojs.mo index 62b32826fe39..ef02b84aade6 100644 Binary files a/conf/locale/en@lolcat/LC_MESSAGES/djangojs.mo and b/conf/locale/en@lolcat/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/en@lolcat/LC_MESSAGES/djangojs.po b/conf/locale/en@lolcat/LC_MESSAGES/djangojs.po index 705f6bc00ed3..26c05568cf15 100644 --- a/conf/locale/en@lolcat/LC_MESSAGES/djangojs.po +++ b/conf/locale/en@lolcat/LC_MESSAGES/djangojs.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:18+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:00+0000\n" "Last-Translator: sarina \n" "Language-Team: LOLCAT English (http://www.transifex.com/projects/p/edx-platform/language/en@lolcat/)\n" "MIME-Version: 1.0\n" @@ -341,6 +341,7 @@ msgstr "SHOW DISCUSHUN" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "OMG!1!! SRY SRY!1!" @@ -521,6 +522,10 @@ msgstr "LOAD NEXT %(numResponses)s RESPONSEZ" msgid "Are you sure you want to delete this post?" msgstr "O HAI. R U SHUR U WANT 2 DELET DIS POST??" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "ANYMOUZ" @@ -1600,6 +1605,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/en@pirate/LC_MESSAGES/django.mo b/conf/locale/en@pirate/LC_MESSAGES/django.mo index 8795bf991c4d..5cfb943a8b34 100644 Binary files a/conf/locale/en@pirate/LC_MESSAGES/django.mo and b/conf/locale/en@pirate/LC_MESSAGES/django.mo differ diff --git a/conf/locale/en@pirate/LC_MESSAGES/django.po b/conf/locale/en@pirate/LC_MESSAGES/django.po index d80e739766c6..1243a430404a 100644 --- a/conf/locale/en@pirate/LC_MESSAGES/django.po +++ b/conf/locale/en@pirate/LC_MESSAGES/django.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: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-04-10 20:10+0000\n" "Last-Translator: Diana Huang \n" "Language-Team: Pirate English (http://www.transifex.com/projects/p/edx-platform/language/en@pirate/)\n" @@ -183,6 +183,16 @@ msgstr "Ye not be enrolled in this course" msgid "Enrollment action is invalid" msgstr "Ye enrollment action 'tis invalid" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -828,6 +838,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3841,7 +3855,8 @@ msgstr "Forgot yer secret code?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4191,11 +4206,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "correctin' meself" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Reset Me Secret Code" @@ -4758,6 +4809,21 @@ msgstr "" msgid "Remember me" msgstr "Keep me afloat" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5088,6 +5154,26 @@ msgstr "Ahoy, matey!" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5569,6 +5655,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "Yer words:" @@ -6499,6 +6589,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7165,10 +7259,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7192,6 +7282,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7236,6 +7330,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7338,10 +7437,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/en@pirate/LC_MESSAGES/djangojs.mo b/conf/locale/en@pirate/LC_MESSAGES/djangojs.mo index 5892ebe64fed..9fefa46462a6 100644 Binary files a/conf/locale/en@pirate/LC_MESSAGES/djangojs.mo and b/conf/locale/en@pirate/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/en@pirate/LC_MESSAGES/djangojs.po b/conf/locale/en@pirate/LC_MESSAGES/djangojs.po index e751b6eaa6df..066979c24a60 100644 --- a/conf/locale/en@pirate/LC_MESSAGES/djangojs.po +++ b/conf/locale/en@pirate/LC_MESSAGES/djangojs.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:00+0000\n" "Last-Translator: sarina \n" "Language-Team: Pirate English (http://www.transifex.com/projects/p/edx-platform/language/en@pirate/)\n" "MIME-Version: 1.0\n" @@ -339,6 +339,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -505,6 +506,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1558,6 +1563,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/eo/LC_MESSAGES/django.mo b/conf/locale/eo/LC_MESSAGES/django.mo index 9dfbe37d4853..4a3711230be8 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 b2ef8914ad56..34762505bd77 100644 --- a/conf/locale/eo/LC_MESSAGES/django.po +++ b/conf/locale/eo/LC_MESSAGES/django.po @@ -37,8 +37,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 10:03-0400\n" -"PO-Revision-Date: 2014-04-22 14:03:27.086386\n" +"POT-Creation-Date: 2014-04-27 17:15-0400\n" +"PO-Revision-Date: 2014-04-27 21:15:36.951764\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "MIME-Version: 1.0\n" @@ -173,6 +173,19 @@ msgstr "Ýöü äré nöt énrölléd ïn thïs çöürsé Ⱡ'σяєм ιρ#" msgid "Enrollment action is invalid" msgstr "Énröllmént äçtïön ïs ïnvälïd Ⱡ'σяєм #" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" +"Théré ïs nö {platform_name} äççöünt ässöçïätéd wïth ýöür {provider_name} " +"äççöünt. Pléäsé üsé ýöür {platform_name} çrédéntïäls ör pïçk änöthér " +"prövïdér. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -846,6 +859,12 @@ msgstr "" "Süßmïttéd. Às söön äs ä réspönsé ïs rétürnéd, thïs méssägé wïll ßé répläçéd " "ßý thät féédßäçk. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" +"Nö réspönsé fröm Xqüéüé wïthïn {xqueue_timeout} séçönds. Àßörtéd. Ⱡ'σяєм " +"ιρѕυм ∂σ#" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "Érrör {err} ïn évälüätïng hïnt fünçtïön {hintfn}. Ⱡ'σяєм ιρѕυ#" @@ -4286,7 +4305,8 @@ msgstr "Förgöt pässwörd? Ⱡ'σ#" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "Pässwörd #" @@ -4696,11 +4716,50 @@ msgstr "Àn érrör öççürréd. Pléäsé trý ägäïn lätér. Ⱡ'σяєм msgid "Please verify your new email" msgstr "Pléäsé vérïfý ýöür néw émäïl Ⱡ'σяєм #" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" +"Thé séléçtéd {provider_name} äççöünt ïs älréädý lïnkéd tö änöthér " +"{platform_name} äççöünt. Pléäsé {link_start}lög öüt{link_end}, thén lög ïn " +"wïth ýöür {provider_name} äççöünt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "édït Ⱡ'σяєм#" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "Àççöünt Lïnks Ⱡ'#" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "ünlïnk Ⱡ'σяєм ιρѕ#" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "lïnk Ⱡ'σяєм#" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Rését Pässwörd Ⱡ'#" @@ -5313,6 +5372,23 @@ msgstr "Àççöünt Préférénçés Ⱡ'σя#" msgid "Remember me" msgstr "Rémémßér mé Ⱡ#" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" +"ör, ïf ýöü hävé çönnéçtéd öné öf thésé prövïdérs, lög ïn ßélöw. Ⱡ'σяєм ιρѕυм" +" ∂σłσя#" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "Sïgn ïn wïth {provider_name} Ⱡ'σ#" + #: lms/templates/lti.html msgid "External resource" msgstr "Éxtérnäl résöürçé Ⱡ'σ#" @@ -5685,6 +5761,29 @@ msgstr "Wélçömé! #" msgid "Register below to create your {platform_name} account" msgstr "Régïstér ßélöw tö çréäté ýöür {platform_name} äççöünt Ⱡ'σяєм ιρѕυ#" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "Régïstér tö stärt léärnïng tödäý! Ⱡ'σяєм ι#" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" +"ör çréäté ýöür öwn {platform_name} äççöünt ßý çömplétïng äll " +"réqüïréd* fïélds ßélöw. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт #" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "Ýöü'vé süççéssfüllý sïgnéd ïn wïth {selected_provider}. Ⱡ'σяєм ιρѕ#" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" +"Fïnïsh ýöür äççöünt régïsträtïön ßélöw tö stärt léärnïng. Ⱡ'σяєм ιρѕυм ∂σł#" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -6182,6 +6281,10 @@ msgstr "Döwnlöäd tränsçrïpt Ⱡ'σя#" msgid "{file_format}" msgstr "{file_format} Ⱡ'σя#" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "Döwnlöäd Händöüt Ⱡ'σ#" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "Ýöür wörds: Ⱡ#" @@ -7204,6 +7307,10 @@ msgstr "Vïéw Grädïng ïn stüdïö Ⱡ'σяє#" msgid "Course Progress for Student '{username}' ({email})" msgstr "Çöürsé Prögréss för Stüdént '{username}' ({email}) Ⱡ'σяєм ιρѕ#" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "Döwnlöäd ýöür çértïfïçäté Ⱡ'σяєм#" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "{earned:.3n} öf {total:.3n} pössïßlé pöïnts Ⱡ'σяєм#" @@ -7926,10 +8033,6 @@ msgstr "" msgid "User Profile" msgstr "Ûsér Pröfïlé Ⱡ#" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "Àçtïvé Thréäds Ⱡ'#" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7953,6 +8056,10 @@ msgstr "… #" msgid "View discussion" msgstr "Vïéw dïsçüssïön Ⱡ'#" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "Àçtïvé Thréäds Ⱡ'#" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.mo b/conf/locale/eo/LC_MESSAGES/djangojs.mo index 2122903fdaf1..6828c5d8b362 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 d24d31a7696f..3d1e9365c3ed 100644 --- a/conf/locale/eo/LC_MESSAGES/djangojs.po +++ b/conf/locale/eo/LC_MESSAGES/djangojs.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 10:02-0400\n" -"PO-Revision-Date: 2014-04-22 14:03:27.561369\n" +"POT-Creation-Date: 2014-04-27 17:14-0400\n" +"PO-Revision-Date: 2014-04-27 21:15:37.413475\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "MIME-Version: 1.0\n" @@ -349,6 +349,7 @@ msgstr "Shöw Dïsçüssïön Ⱡ'#" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Sörrý Ⱡ'σяєм ι#" @@ -534,6 +535,12 @@ msgstr "Löäd néxt %(numResponses)s réspönsés Ⱡ'σяє#" msgid "Are you sure you want to delete this post?" msgstr "Àré ýöü süré ýöü wänt tö délété thïs pöst? Ⱡ'σяєм ιρѕυ#" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" +"Wé häd sömé tröüßlé löädïng thé pägé ýöü réqüéstéd. Pléäsé trý ägäïn. Ⱡ'σяєм" +" ιρѕυм ∂σłσя ѕ#" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "änönýmöüs #" @@ -1713,6 +1720,10 @@ msgstr "" "Fïlé förmät nöt süppörtéd. Pléäsé üplöäd ä fïlé wïth ä tär.gz " "éxténsïön. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт #" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "Ûplöäd Fïlé Ⱡ#" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Çölläpsé Àll Séçtïöns Ⱡ'σя#" diff --git a/conf/locale/es_419/LC_MESSAGES/django.mo b/conf/locale/es_419/LC_MESSAGES/django.mo index 539d08d9eb6f..8a16fa97b0cf 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 85e79e4adb8c..39ed199ef63b 100644 --- a/conf/locale/es_419/LC_MESSAGES/django.po +++ b/conf/locale/es_419/LC_MESSAGES/django.po @@ -6,6 +6,7 @@ # Translators: # apardo , 2013 # apardo , 2013 +# ovnicraft , 2014 # dsalazar , 2014 # diegobe , 2014 # dsalazar , 2014 @@ -26,6 +27,7 @@ # # Translators: # apardo , 2013 +# ovnicraft , 2014 # ferabra , 2014 # juancamilom , 2013-2014 # juancamilom , 2014 @@ -48,6 +50,7 @@ # ferabra , 2013 # ferabra , 2013 # Herty Nava , 2013 +# jimenaianina , 2014 # juancamilom , 2013-2014 # juancamilom , 2013-2014 # juancamilom , 2013 @@ -59,6 +62,7 @@ # Natalia_m, 2013-2014 # ovnicraft , 2013 # preteric, 2014 +# Santiagoz , 2014 # #-#-#-#-# mako-studio.po (edx-platform) #-#-#-#-# # edX translation file # Copyright (C) 2014 edX @@ -98,7 +102,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-01 15:39+0000\n" "Last-Translator: ovnicraft \n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/projects/p/edx-platform/language/es_419/)\n" @@ -185,23 +189,23 @@ msgstr "Doctorado" #: common/djangoapps/student/models.py msgid "Master's or professional degree" -msgstr "" +msgstr "Master o postgrado" #: common/djangoapps/student/models.py msgid "Bachelor's degree" -msgstr "" +msgstr "Pregrado" #: common/djangoapps/student/models.py msgid "Associate's degree" -msgstr "" +msgstr "Grado técnico - tecnológico" #: common/djangoapps/student/models.py msgid "Secondary/high school" -msgstr "" +msgstr "Bachillerato" #: common/djangoapps/student/models.py msgid "Junior secondary/junior high/middle school" -msgstr "" +msgstr "Formación media" #: common/djangoapps/student/models.py msgid "Elementary/primary school" @@ -210,7 +214,7 @@ msgstr "Primaria" #. Translators: 'None' refers to the student's level of education #: common/djangoapps/student/models.py msgid "None" -msgstr "" +msgstr "Ninguno" #: common/djangoapps/student/views.py msgid "Course id not specified" @@ -233,6 +237,16 @@ msgstr "Usted no está inscrito en este curso" msgid "Enrollment action is invalid" msgstr "La Inscripción es inválida" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -861,15 +875,15 @@ msgstr "incorrecto" #: common/lib/capa/capa/inputtypes.py msgid "incomplete" -msgstr "" +msgstr "imcompleto" #: common/lib/capa/capa/inputtypes.py common/lib/capa/capa/inputtypes.py msgid "unanswered" -msgstr "" +msgstr "sin responder" #: common/lib/capa/capa/inputtypes.py msgid "queued" -msgstr "" +msgstr "en cola" #: common/lib/capa/capa/inputtypes.py msgid "" @@ -895,6 +909,10 @@ msgstr "" "Enviado. Tan pronto se reciba una respuesta, este mensaje será reemplazado " "por los comentarios correspondientes." +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "Error {err} al evaluar la función de ayuda contextual {hintfn}." @@ -922,7 +940,7 @@ msgstr "" #. translated. #: common/lib/capa/capa/responsetypes.py msgid "answer-pool value should be an integer" -msgstr "" +msgstr "Valores de lista de respuestas deben ser números enteros." #. Translators: 'Choicegroup' is an input type and should not be translated. #: common/lib/capa/capa/responsetypes.py @@ -1623,6 +1641,8 @@ msgstr "La rama remota especificada no está disponible." #: lms/djangoapps/dashboard/git_import.py msgid "Unable to switch to specified branch. Please check your branch name." msgstr "" +"No fue posible cambiar la la rama especificada. Por favor verifique el " +"nombre de la misma." #: lms/djangoapps/dashboard/sysadmin.py msgid "Failed in authenticating {0}, error {1}\n" @@ -1775,6 +1795,8 @@ msgstr "" msgid "" "Unable to clone or pull repository. Please check your url. Output was: {0!r}" msgstr "" +"No fue posible clonar o halar el repositorio. Por favor verifique la url. La" +" respuesta fue: {0!r}" #: lms/djangoapps/dashboard/sysadmin.py msgid "Failed to clone repository to {0}" @@ -1782,7 +1804,7 @@ msgstr "Falló la clonación del repositorio a {0}" #: lms/djangoapps/dashboard/sysadmin.py msgid "Successfully switched to branch: {branch_name}" -msgstr "" +msgstr "Se cambió exitosamente la rama: {branch_name}" #: lms/djangoapps/dashboard/sysadmin.py msgid "Loaded course {0} {1}
      Errors:" @@ -1970,32 +1992,34 @@ msgstr "Ubicación" #: lms/djangoapps/instructor/views/api.py msgid "Birth Year" -msgstr "" +msgstr "Año de nacimiento" -#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/djangoapps/instructor/views/api.py lms/templates/register.html +#: lms/templates/signup_modal.html msgid "Gender" msgstr "Género" +#: lms/djangoapps/instructor/views/api.py #: lms/templates/instructor/instructor_dashboard_2/analytics.html msgid "Level of Education" msgstr "Nivel educativo" -#: lms/templates/register.html +#: lms/djangoapps/instructor/views/api.py lms/templates/register.html msgid "Mailing Address" msgstr "Dirección de correspondencia" #: lms/djangoapps/instructor/views/api.py msgid "Goals" -msgstr "" +msgstr "Objetivos" #: lms/djangoapps/instructor/views/api.py msgid "Module does not exist." -msgstr "" +msgstr "No existe el módulo." #: lms/djangoapps/instructor/views/api.py #: lms/djangoapps/instructor/views/legacy.py msgid "An error occurred while deleting the score." -msgstr "" +msgstr "Ha ocurrido un error borrando la calificación." #: lms/djangoapps/instructor/views/api.py #: lms/templates/verify_student/midcourse_reverify_dash.html @@ -2057,15 +2081,17 @@ msgstr "Analíticas" #: lms/djangoapps/instructor/views/legacy.py msgid "Course Statistics At A Glance" -msgstr "" +msgstr "Resumen de estadísticas del curso" #: lms/djangoapps/instructor/views/legacy.py msgid "Found a single student. " -msgstr "" +msgstr "Un estudiante encontrado." #: lms/djangoapps/instructor/views/legacy.py msgid "Couldn't find student with that email or username." msgstr "" +"No se encontró ningún estudiante con ese nombre de usuario o correo " +"electrónico." #: lms/djangoapps/instructor/views/legacy.py msgid "List of students enrolled in {course_id}" @@ -2091,7 +2117,7 @@ msgstr "" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to create a background task for rescoring \"{url}\": {message}." -msgstr "" +msgstr "Falló al crear la tarea para repuntuar \"{url}\": {message}." #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to create a background task for resetting \"{problem_url}\"." @@ -2109,7 +2135,7 @@ msgstr "" #: lms/djangoapps/instructor/views/legacy.py msgid "Found module. " -msgstr "" +msgstr "Módulo encontrado." #: lms/djangoapps/instructor/views/legacy.py msgid "Couldn't find module with that urlname: {url}. " @@ -2125,7 +2151,7 @@ msgstr "" #: lms/djangoapps/instructor/views/legacy.py msgid "Module state successfully reset!" -msgstr "" +msgstr "El estado del módulo ha sido reiniciado!" #: lms/djangoapps/instructor/views/legacy.py msgid "Couldn't reset module state for {id}/{url}. " @@ -2652,7 +2678,7 @@ msgstr "Intentando añadir una moneda diferente en el carrito" #: lms/djangoapps/shoppingcart/models.py msgid "Registration for Course: {course_name}" -msgstr "" +msgstr "Registro para Curso: {course_name}" #: lms/djangoapps/shoppingcart/models.py msgid "" @@ -3555,8 +3581,11 @@ msgstr "Guardar cambios" msgid "Preview" msgstr "Vista previa" +#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# #. Translators: this is a control to allow users to exit out of this modal #. interface (a menu or piece of UI that takes the full focus of the screen) +#: lms/templates/wiki/edit.html lms/templates/wiki/history.html +#: lms/templates/wiki/history.html lms/templates/wiki/includes/cheatsheet.html #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard.html lms/templates/forgot_password_modal.html @@ -4003,6 +4032,8 @@ msgid "" "Special characters not allowed in organization, course number, and course " "run." msgstr "" +"No se permiten caracteres especiales en los campos de organización, número " +"del curso, y número de ejecución del curso." #: cms/djangoapps/contentstore/views/course.py msgid "" @@ -4212,7 +4243,8 @@ msgstr "¿Olvidó su contraseña?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "Contraseña" @@ -4595,11 +4627,47 @@ msgstr "Ocurrió un error. Por favor intente nuevamente más tarde." msgid "Please verify your new email" msgstr "Por favor verifique su correo" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "editar" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Restablecer Contraseña" @@ -5202,6 +5270,21 @@ msgstr "Preferencias de la Cuenta" msgid "Remember me" msgstr "Recordarme" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "Recurso externo" @@ -5565,6 +5648,26 @@ msgstr "Bienvenido!" msgid "Register below to create your {platform_name} account" msgstr "Regístrese a continuación para crear su cuenta en {platform_name}" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "Por favor complete los siguientes campos para crear su cuenta." @@ -6057,6 +6160,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "Tus palabras:" @@ -7054,6 +7161,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "Progreso del curso para el estudiante '{username}' ({email})" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "{earned:.3n} de {total:.3n} puntos posibles" @@ -7763,10 +7874,6 @@ msgstr "" msgid "User Profile" msgstr "Perfil de Usuario" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "Hilos Activos" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7790,6 +7897,10 @@ msgstr "..." msgid "View discussion" msgstr "Ver discusión" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "Hilos Activos" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7829,6 +7940,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7931,10 +8047,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" @@ -10644,7 +10756,7 @@ msgstr "Acciones de página" #: cms/templates/asset_index.html msgid "Loading…" -msgstr "" +msgstr "Cargando…" #: cms/templates/asset_index.html msgid "What files are listed here?" @@ -10766,31 +10878,35 @@ msgstr "Contenedor" #: cms/templates/container.html msgid "This page has no content yet." -msgstr "" +msgstr "Esta página no tiene contenidos aún" #: cms/templates/container.html cms/templates/container.html msgid "Publishing Status" -msgstr "" +msgstr "Estado de publicación" #: cms/templates/container.html msgid "Published" -msgstr "" +msgstr "Publicado" #: cms/templates/container.html msgid "" "To make changes to the content of this page, you need to edit unit " "{unit_link} as a draft." msgstr "" +"Para realizar cambios al contenido de esta página, necesita editar la " +"unidad {unit_link} como un borrador." #: cms/templates/container.html msgid "Draft" -msgstr "" +msgstr "Borrador" #: cms/templates/container.html msgid "" "You can edit the content of this page, and your changes will be published " "with unit {unit_link}." msgstr "" +"Puede editar el contenido de esta página, y sus cambios serán publicados con" +" la unidad {unit_link}." #: cms/templates/container.html msgid "" @@ -10799,6 +10915,10 @@ msgid "" " you have properly configured your experiment groups and make changes to " "existing content." msgstr "" +"Puede ver y editar los componentes del curso que contengan otros componentes" +" en esta pagina. En el caso de bloques de experimentos, esto le permite " +"confirmar que ha configurado correctamente los grupos de su experimento y " +"hacer cambios al contenido existente." #: cms/templates/course_info.html cms/templates/course_info.html msgid "Course Updates" @@ -10825,7 +10945,7 @@ msgstr "" #: cms/templates/edit-tabs.html cms/templates/edit-tabs.html #: cms/templates/export.html cms/templates/widgets/header.html msgid "Pages" -msgstr "" +msgstr "Páginas" #: cms/templates/edit-tabs.html msgid "New Page" @@ -10843,30 +10963,33 @@ msgid "" "view the page even if they are not registered for or logged in to your " "course." msgstr "" +"Nota: Las páginas estarán disponibles públicamente. Si los usuarios conocen " +"la dirección url de la página, podrán visitarla, incluso si no están " +"registrados o no han iniciado sesión en el curso." #: cms/templates/edit-tabs.html msgid "Show this page" -msgstr "" +msgstr "Mostrar esta página" #: cms/templates/edit-tabs.html cms/templates/edit-tabs.html msgid "Show/hide page" -msgstr "" +msgstr "Mostrar/esconder página" #: cms/templates/edit-tabs.html cms/templates/edit-tabs.html msgid "This page cannot be reordered" -msgstr "" +msgstr "Esta página no puede ser reordenada" #: cms/templates/edit-tabs.html msgid "You can add additional custom pages to your course." -msgstr "" +msgstr "Usted puede agregar páginas personalizadas adicionales en su curso." #: cms/templates/edit-tabs.html msgid "Add a New Page" -msgstr "" +msgstr "Agregar nueva página" #: cms/templates/edit-tabs.html msgid "What are pages?" -msgstr "" +msgstr "¿Qué son páginas?" #: cms/templates/edit-tabs.html msgid "" @@ -10874,10 +10997,14 @@ msgid "" "(Courseware, Course info, Discussion, Wiki, and Progress) are followed by " "textbooks and custom pages that you create." msgstr "" +"Las páginas se listan en forma horizontal en la parte superior del curso. " +"Las páginas por defecto (Contenidos, información, discusión, wiki y " +"progreso) vienen seguidas por los libros de texto y las páginas " +"personalizadas que usted crea." #: cms/templates/edit-tabs.html msgid "Custom pages" -msgstr "" +msgstr "Páginas personalizadas" #: cms/templates/edit-tabs.html msgid "" @@ -10885,28 +11012,35 @@ msgid "" "course content. For example, you can create pages for the grading policy, " "course slides, and a course calendar. " msgstr "" +"Puede crear y editar páginas personalizadas para dar a los estudiantes " +"contenidos adicionales dentro del curso. Por ejemplo, puede crear páginas " +"para presentar la política de calificaciones, las diapositivas del curso, el" +" calendario, entre otras." #: cms/templates/edit-tabs.html msgid "How do pages look to students in my course?" -msgstr "" +msgstr "¿Como verán las páginas los estudiantes del curso?" #: cms/templates/edit-tabs.html msgid "" "Students see the default and custom pages at the top of your course and use " "these links to navigate." msgstr "" +"Los estudiantes ven las páginas por defecto y las páginas personalizadas en " +"la parte superior del curso, y usan estos vínculos para navegar por las " +"diferentes areas del curso." #: cms/templates/edit-tabs.html msgid "See an example" -msgstr "" +msgstr "Ver un ejemplo" #: cms/templates/edit-tabs.html msgid "Pages in Your Course" -msgstr "" +msgstr "Páginas en su curso" #: cms/templates/edit-tabs.html msgid "Preview of Pages in your course" -msgstr "" +msgstr "Vista previa de páginas en su curso" #: cms/templates/edit-tabs.html msgid "" @@ -10914,6 +11048,9 @@ msgid "" "(Courseware, Course Info, Discussion, Wiki, and Progress) are followed by " "textbooks and custom pages." msgstr "" +"Las páginas aparecen en la parte superior del curso. Las páginas por defecto" +" (Contenidos, información, discusión, wiki y progreso) vienen seguidas por " +"los libros de texto y las páginas personalizadas." #: cms/templates/edit-tabs.html cms/templates/howitworks.html #: cms/templates/howitworks.html cms/templates/howitworks.html @@ -12447,6 +12584,13 @@ msgid "" " Manager\">PM or Conrad Warre (conrad@edx.org)." msgstr "" +"Estas fechas afectan el momento en que su curso puede ser " +"visto pero no son las fechas que se mostrarán en la página " +"de resumen del curso. Para ingresar las fechas de inicio y las " +"fechas de registro que se mostrarán en la página de resumen del curso, siga " +"las instrucciones dadas por su Administrador" +" de Programa o Conrad Warre (conrad@edx.org)." #: cms/templates/settings.html msgid "Introducing Your Course" @@ -12833,12 +12977,18 @@ msgid "" "This unit is scheduled to be released to students on " "{date} with the subsection {link_start}{name}{link_end}" msgstr "" +"Esta unidad ya está programada para ser liberada a los " +"estudiantes el {date} dentro de la " +"subsección {link_start}{name}{link_end}" #: cms/templates/unit.html msgid "" "This unit is scheduled to be released to students with the " "subsection {link_start}{name}{link_end}" msgstr "" +"Esta unidad ya está programada para ser liberada a los " +"estudiantes dentro de la subsección " +"{link_start}{name}{link_end}" #: cms/templates/unit.html msgid "Delete Draft" @@ -12884,6 +13034,8 @@ msgid "" "User '{user}' with e-mail {email} has requested Studio course creator " "privileges on edge." msgstr "" +"El usuario '{user}' con el correo electrónico {email} ha solicitado " +"privilegios de creador de cursos Studio a través de edge." #: cms/templates/emails/course_creator_admin_user_pending.txt msgid "To grant or deny this request, use the course creator admin table." diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.mo b/conf/locale/es_419/LC_MESSAGES/djangojs.mo index b6778e57bd59..81cb612f37ff 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 46b864201c14..b352c90d677d 100644 --- a/conf/locale/es_419/LC_MESSAGES/djangojs.po +++ b/conf/locale/es_419/LC_MESSAGES/djangojs.po @@ -39,9 +39,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-11 05:40+0000\n" -"Last-Translator: juancamilom \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 15:04+0000\n" +"Last-Translator: ovnicraft \n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/projects/p/edx-platform/language/es_419/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -116,28 +116,28 @@ msgstr[1] "(%(num_points)s puntos posibles)" #: common/lib/xmodule/xmodule/js/src/capa/display.js #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Answer:" -msgstr "" +msgstr "Respuesta:" #. Translators: the word Answer here refers to the answer to a problem the #. student must solve.; #: common/lib/xmodule/xmodule/js/src/capa/display.js #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Hide Answer" -msgstr "" +msgstr "Ocultar Respuesta" #. Translators: the word Answer here refers to the answer to a problem the #. student must solve.; #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Show Answer" -msgstr "" +msgstr "Mostrar Respuesta" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Reveal Answer" -msgstr "" +msgstr "Mostrar respuesta" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Answer hidden" -msgstr "" +msgstr "Respuesta oculta" #. Translators: the word unanswered here is about answering a problem the #. student must solve.; @@ -378,6 +378,7 @@ msgstr "Mostrar Discusión" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Lo sentimos" @@ -442,14 +443,14 @@ msgstr "votar" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "vote (click to remove your vote)" msgid_plural "votes (click to remove your vote)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "voto (Haga clic para borrar su voto)" +msgstr[1] "votos (Haga clic para borrar su voto)" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "vote (click to vote)" msgid_plural "votes (click to vote)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "voto (Haga clic para votar)" +msgstr[1] "votos (Haga clic para votar)" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "Load more" @@ -518,6 +519,8 @@ msgstr "Marcar conversación" msgid "" "The thread you selected has been deleted. Please select another thread." msgstr "" +"La discusión que seleccionó ha sido borrada. Por favor seleccione otra " +"discusión." #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "We had some trouble loading responses. Please reload the page." @@ -559,6 +562,10 @@ msgstr "Cargar las siguientes %(numResponses)s respuestas" msgid "Are you sure you want to delete this post?" msgstr "¿Está seguro de que desea borrar esta publicación?" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "anónimo" @@ -833,23 +840,23 @@ msgstr "Cuerpo de la publicación" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Error fetching distribution." -msgstr "" +msgstr "Error al generar la distribución." #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Unavailable metric display." -msgstr "" +msgstr "Métrica no disponible para visualización" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Error fetching grade distributions." -msgstr "" +msgstr "Error al generar las distribuciones de calificaciones." #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Last Updated: <%= timestamp %>" -msgstr "" +msgstr "Última actualización: <%= timestamp %>" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "<%= num_students %> students scored." -msgstr "" +msgstr "<%= num_students %> estudiantes calificados." #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "Loading..." @@ -869,112 +876,129 @@ msgstr "Error al generar las calificaciones. Por favor inténtelo nuevamente." #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "File Name" -msgstr "" +msgstr "Nombre de archivo" #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "" "Links are generated on demand and expire within 5 minutes due to the " "sensitive nature of student information." msgstr "" +"Los vínculos se generan por demanda y expiran en los siguientes 5 minutos " +"dado a la naturaleza sensible de la información de calificaciones de " +"estudiantes." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Username" -msgstr "" +msgstr "Nombre de usuario" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Email" -msgstr "" +msgstr "Correo electrónico" #: lms/static/coffee/src/instructor_dashboard/membership.js #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Revoke access" -msgstr "" +msgstr "Quitar el acceso" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Enter username or email" -msgstr "" +msgstr "Ingrese el nombre de usuario o el correo electrónico." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Please enter a username or email." msgstr "" +"Por favor ingrese su nombre de usuario o dirección de correo electrónico." #. Translators: A rolename appears this sentence.; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error fetching list for role" -msgstr "" +msgstr "Error al generar la lista para el rol" #: lms/static/coffee/src/instructor_dashboard/membership.js #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error changing user's permissions." -msgstr "" +msgstr "Error al cambiar los permisos del usuario." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Could not find a user with username or email address '<%= identifier %>'." msgstr "" +"No se encontró ningún usuario con nombre de usuario o dirección '<%= " +"identifier %>'." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Error: User '<%= username %>' has not yet activated their account. Users " "must create and activate their accounts before they can be assigned a role." msgstr "" +"Error: El usuario '<%= username %>' aún no ha activado su cuenta. Los " +"usuarios deben crear y activar su cuenta antes de que puedan tener un rol " +"asignado." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error: You cannot remove yourself from the Instructor group!" -msgstr "" +msgstr "Error: No puede eliminarse a usted mismo del grupo de instructores!" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error adding/removing users as beta testers." -msgstr "" +msgstr "Error añadiendo o eliminando usuarios de pruebas." #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were successfully added as beta testers:" msgstr "" +"Los siguientes usuarios fueron añadidos exitósamente como usuarios de " +"prueba:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were successfully removed as beta testers:" msgstr "" +"Los siguientes usuarios fueron eliminados exitósamente como usuarios de " +"prueba:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were not added as beta testers:" -msgstr "" +msgstr "Los siguientes usuarios no fueron añadidos como usuarios de prueba:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were not removed as beta testers:" -msgstr "" +msgstr "Los siguientes usuarios no fueron eliminados como usuarios de prueba:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Users must create and activate their account before they can be promoted to " "beta tester." msgstr "" +"Los usuarios deben crear y activar su cuenta antes de que puedan ser " +"promovidos a usuarios de prueba." #. Translators: A list of identifiers (which are email addresses and/or #. usernames) appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Could not find users associated with the following identifiers:" -msgstr "" +msgstr "No se puede encontrar el usuario asociado al siguiente identificador:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error enrolling/unenrolling users." -msgstr "" +msgstr "Error al inscribir o des inscribir usuarios." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "The following email addresses and/or usernames are invalid:" -msgstr "" +msgstr "El correo electrónico y/o el nombre de usuario no son válidos:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Successfully enrolled and sent email to the following users:" msgstr "" +"Se inscribió exitósamente y se le envió el correo electrónico a los " +"siguientes usuarios:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Successfully enrolled the following users:" -msgstr "" +msgstr "Se inscribió exitósamente a los siguientes usuarios:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -982,11 +1006,13 @@ msgid "" "Successfully sent enrollment emails to the following users. They will be " "allowed to enroll once they register:" msgstr "" +"Se envió el correo electrónico a los siguientes usuarios. Podrán inscribirse" +" una vez se hayan registrado:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users will be allowed to enroll once they register:" -msgstr "" +msgstr "Estos usuarios podrán inscribirse una vez que se hayan registrado:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -994,11 +1020,13 @@ msgid "" "Successfully sent enrollment emails to the following users. They will be " "enrolled once they register:" msgstr "" +"Se envió el correo electrónico a los siguientes usuarios. Estarán inscritos " +"al curso una vez se hayan registrado:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users will be enrolled once they register:" -msgstr "" +msgstr "Estos usuarios quedarán inscritos una vez que se hayan registrado:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -1006,17 +1034,21 @@ msgid "" "Emails successfully sent. The following users are no longer enrolled in the " "course:" msgstr "" +"Los correos electrónicos fueron enviados exitósamente. Los siguientes " +"usuarios ya no están inscritos en el curso:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "The following users are no longer enrolled in the course:" -msgstr "" +msgstr "Los siguientes usuarios ya no están inscritos en el curso:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "These users were not affiliated with the course so could not be unenrolled:" msgstr "" +"Estos usuarios no estaban vinculados con el curso, por lo que no pudieron " +"ser retirados:" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "Your message must have a subject." @@ -1035,18 +1067,25 @@ msgid "" "You are about to send an email titled '<%= subject %>' to yourself. Is this " "OK?" msgstr "" +"Está a punto de enviarse un correo electrónico con asunto '<%= subject %>' " +"a usted mismo. ¿Está seguro de proceder?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" "You are about to send an email titled '<%= subject %>' to everyone who is " "staff or instructor on this course. Is this OK?" msgstr "" +"Está a punto de enviarse un correo electrónico con asunto '<%= subject %>' " +"a todos los instructores y funcionarios del curso. ¿Está seguro de proceder?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" "You are about to send an email titled '<%= subject %>' to ALL (everyone who " "is enrolled in this course as student, staff, or instructor). Is this OK?" msgstr "" +"Está a punto de enviarse un correo electrónico con asunto '<%= subject %>' " +"a todos los usuarios asociados al curso (estudiantes, instructores y " +"funcionarios). ¿Está seguro de proceder?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" @@ -1229,55 +1268,55 @@ msgstr "" #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task Type" -msgstr "" +msgstr "Tipo de Tarea" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task inputs" -msgstr "" +msgstr "Valores de entrada para la tarea" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task ID" -msgstr "" +msgstr "Id de la tarea" #. Translators: a "Requester" is a username that requested a task such as #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Requester" -msgstr "" +msgstr "Solicitante" #. Translators: A timestamp of when a task (eg, sending email) was submitted #. appears after this #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Submitted" -msgstr "" +msgstr "Enviado" #. Translators: The length of a task (eg, sending email) in seconds appears #. this #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Duration (sec)" -msgstr "" +msgstr "Duración (segundos)" #. Translators: The state (eg, "In progress") of a task (eg, sending email) #. appears after this. #: lms/static/coffee/src/instructor_dashboard/util.js msgid "State" -msgstr "" +msgstr "Estado" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task Status" -msgstr "" +msgstr "Estado de la tarea" #. Translators: a "Task" is a background process such as grading students or #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task Progress" -msgstr "" +msgstr "Progreso de la Tarea" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Grades saved. Fetching the next submission to grade." @@ -1346,16 +1385,16 @@ msgstr "(Mostrar)" #: lms/static/js/Markdown.Editor.js msgid "Insert Hyperlink" -msgstr "" +msgstr "Insertar hipervínculo" #. Translators: Please keep the quotation marks (") around this text #: lms/static/js/Markdown.Editor.js lms/static/js/Markdown.Editor.js.c msgid "\"optional title\"" -msgstr "" +msgstr "\"título opcional\"" #: lms/static/js/Markdown.Editor.js msgid "Insert Image (upload file or type url)" -msgstr "" +msgstr "Insertar imagen (subir archivo o escribir url)" #: lms/static/js/Markdown.Editor.js msgid "Markdown Editing Help" @@ -1540,6 +1579,7 @@ msgstr "Por favor, no usar espacios o caracteres especiales en este campo." #: cms/static/js/index.js msgid "Please do not use any spaces or special characters in this field." msgstr "" +"Por favor, no utilizar espacios o caracteres especiales en este campo." #: cms/static/js/index.js msgid "" @@ -1677,7 +1717,7 @@ msgstr "Subiendo un nuevo PDF a “<%= name %>”" #: cms/static/js/views/edit_chapter.js msgid "Please select a PDF file to upload." -msgstr "" +msgstr "Por favor seleccione un archivo PDF para subir." #: cms/static/js/views/edit_textbook.js #: cms/static/js/views/overview_assignment_grader.js @@ -1696,6 +1736,10 @@ msgstr "" "Formato de archivo no soportado. Por favor cargue un archivo con extensión " "tar.gz." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "Subir archivo" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Colapsar todas las secciones" @@ -1764,7 +1808,7 @@ msgstr "Borrando" #: cms/static/js/views/uploads.js msgid "Upload" -msgstr "" +msgstr "Subir" #: cms/static/js/views/uploads.js msgid "We're sorry, there was an error" @@ -1798,23 +1842,23 @@ msgstr "Sus cambios han sido guardados." #: cms/static/js/views/xblock_editor.js msgid "Editor" -msgstr "" +msgstr "Editor" #: cms/static/js/views/xblock_editor.js msgid "Settings" -msgstr "" +msgstr "Configuración" #: cms/static/js/views/modals/base_modal.js msgid "Save" -msgstr "" +msgstr "Guardar" #: cms/static/js/views/modals/edit_xblock.js msgid "Component" -msgstr "" +msgstr "Componente" #: cms/static/js/views/modals/edit_xblock.js msgid "Editing: %(title)s" -msgstr "" +msgstr "Editando: %(title)s" #: cms/static/js/views/settings/advanced.js msgid "" @@ -1852,7 +1896,9 @@ msgid "" "Sorry, there was an error parsing the subtitles that you uploaded. Please " "check the format and try again." msgstr "" +"Lo sentimos. Ocurrió un error en la interpretación de los subtítulos " +"enviados. Por favor revise el formato e intente nuevamente." #: cms/static/js/views/video/translations_editor.js msgid "Upload translation" -msgstr "" +msgstr "Subir traducción" diff --git a/conf/locale/es_ES/LC_MESSAGES/django.mo b/conf/locale/es_ES/LC_MESSAGES/django.mo index 10d988d66543..31caf85bd2b7 100644 Binary files a/conf/locale/es_ES/LC_MESSAGES/django.mo and b/conf/locale/es_ES/LC_MESSAGES/django.mo differ diff --git a/conf/locale/es_ES/LC_MESSAGES/django.po b/conf/locale/es_ES/LC_MESSAGES/django.po index 1c697bfdc681..4fa83ce59d18 100644 --- a/conf/locale/es_ES/LC_MESSAGES/django.po +++ b/conf/locale/es_ES/LC_MESSAGES/django.po @@ -82,14 +82,15 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: +# spentamanyu , 2014 # jorts , 2014 # juanan , 2014 msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" -"PO-Revision-Date: 2014-04-22 13:33+0000\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" +"PO-Revision-Date: 2014-04-25 10:00+0000\n" "Last-Translator: spentamanyu \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/edx-platform/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -221,6 +222,16 @@ msgstr "No está inscrito en este curso" msgid "Enrollment action is invalid" msgstr "La inscripción no es válida" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -368,6 +379,8 @@ msgstr "Se requiere un e-mail válido." #: common/djangoapps/student/views.py msgid "Username should only consist of A-Z and 0-9, with no spaces." msgstr "" +"El nombre de usuario ha de estar formado por caracteres A-Z y 0-9 sin " +"espacios." #: common/djangoapps/student/views.py common/djangoapps/student/views.py msgid "Password: " @@ -380,6 +393,8 @@ msgstr "No se ha podido enviar el e-mail de activación." #: common/djangoapps/student/views.py msgid "Unknown error. Please e-mail us to let us know how it happened." msgstr "" +"Error desconocido. Por favor, póngase en contacto por e-mail para hacernos " +"saber cómo se ha producido." #: common/djangoapps/student/views.py msgid "" @@ -399,11 +414,11 @@ msgstr "" #: common/djangoapps/student/views.py msgid "No inactive user with this e-mail exists" -msgstr "" +msgstr "No existe ningún usuario inactivo con ese e-mail." #: common/djangoapps/student/views.py msgid "Unable to send reactivation email" -msgstr "" +msgstr "No ha sido posible enviar el e-mail de reactivación." #: common/djangoapps/student/views.py msgid "Invalid password" @@ -411,15 +426,15 @@ msgstr "Password no válido" #: common/djangoapps/student/views.py msgid "Valid e-mail address required." -msgstr "" +msgstr "Se requiere una dirección de e-mail válida." #: common/djangoapps/student/views.py msgid "An account with this e-mail already exists." -msgstr "" +msgstr "Ya existe una cuenta con ese e-mail." #: common/djangoapps/student/views.py msgid "Old email is the same as the new email." -msgstr "" +msgstr "El anterior e-mail es el mismo que el nuevo." #: common/djangoapps/student/views.py msgid "Name required" @@ -866,6 +881,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -1405,11 +1424,11 @@ msgstr "" #: common/static/js/vendor/mathjax-MathJax-c9db6ac/docs/source/mjtheme/layout.html msgid "Navigation" -msgstr "" +msgstr "Navegación" #: common/static/js/vendor/mathjax-MathJax-c9db6ac/docs/source/mjtheme/layout.html msgid "About these documents" -msgstr "" +msgstr "Acerca de estos documentos" #: common/static/js/vendor/mathjax-MathJax-c9db6ac/docs/source/mjtheme/layout.html msgid "Index" @@ -1793,16 +1812,18 @@ msgstr "" #: lms/djangoapps/django_comment_client/base/views.py msgid "allowed file types are '%(file_types)s'" -msgstr "" +msgstr "los tipos de ficheros permitidos son '%(file_types)s'" #: lms/djangoapps/django_comment_client/base/views.py msgid "maximum upload file size is %(file_size)sK" -msgstr "" +msgstr "el tamaño máximo de fichero para subir es %(file_size)sK" #: lms/djangoapps/django_comment_client/base/views.py msgid "" "Error uploading file. Please contact the site administrator. Thank you." msgstr "" +"Error subiendo el fichero. Por favor, contacte con el administrador del " +"sitio. Gracias." #: lms/djangoapps/django_comment_client/base/views.py msgid "Good" @@ -2238,13 +2259,9 @@ msgstr "" msgid "reset" msgstr "" -#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# -#. Translators: This is a past-tense verb that is inserted into task progress -#. messages as {action}. -#: lms/djangoapps/instructor_task/tasks.py -#: lms/templates/wiki/plugins/attachments/index.html wiki/models/article.py +#: wiki/models/article.py msgid "deleted" -msgstr "" +msgstr "eliminado" #. Translators: This is a past-tense verb that is inserted into task progress #. messages as {action}. @@ -2583,13 +2600,9 @@ msgstr "" msgid "Currency" msgstr "" -#: lms/djangoapps/shoppingcart/reports.py lms/templates/shoppingcart/list.html -#: lms/templates/shoppingcart/receipt.html -#: lms/templates/shoppingcart/verified_cert_receipt.html -#: lms/templates/shoppingcart/verified_cert_receipt.html #: wiki/plugins/attachments/forms.py msgid "Description" -msgstr "" +msgstr "Descripción" #: lms/djangoapps/shoppingcart/reports.py msgid "Comments" @@ -3140,10 +3153,12 @@ msgid "" "You're receiving this e-mail because you requested a password reset for your" " user account at edx.org." msgstr "" +"Usted ha recibido este correo porque solicitó un reinicio de la contraseña " +"para su cuenta en edx.org" #: lms/templates/registration/password_reset_email.html msgid "Please go to the following page and choose a new password:" -msgstr "" +msgstr "Por favor, vaya a la siguiente página y elija una nueva contraseña:" #: lms/templates/registration/password_reset_email.html msgid "" @@ -3153,7 +3168,7 @@ msgstr "" #: lms/templates/registration/password_reset_email.html msgid "Thanks for using our site!" -msgstr "" +msgstr "Gracias por utilizar nuestro sitio!" #: lms/templates/registration/password_reset_email.html msgid "The edX Team" @@ -3169,82 +3184,75 @@ msgstr "" #: lms/templates/wiki/article.html msgid "This article was last modified:" -msgstr "" +msgstr "El artículo se modificó por última vez:" #: lms/templates/wiki/create.html lms/templates/wiki/create.html.py msgid "Add new article" -msgstr "" +msgstr "Añadir un nuevo artículo" #: lms/templates/wiki/create.html msgid "Create article" -msgstr "" +msgstr "Crear artículo" #: lms/templates/wiki/create.html lms/templates/wiki/delete.html #: lms/templates/wiki/delete.html.py msgid "Go back" -msgstr "" +msgstr "Volver atrás" #: lms/templates/wiki/delete.html lms/templates/wiki/delete.html.py #: lms/templates/wiki/edit.html msgid "Delete article" -msgstr "" +msgstr "Eliminar artículo" #: lms/templates/wiki/delete.html #: lms/templates/wiki/plugins/attachments/index.html -#: cms/templates/component.html cms/templates/studio_xblock_wrapper.html -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/discussion/_underscore_templates.html -#: lms/templates/discussion/_underscore_templates.html -#: lms/templates/discussion/mustache/_inline_thread_show.mustache msgid "Delete" -msgstr "" +msgstr "Eliminar" #: lms/templates/wiki/delete.html msgid "You cannot delete a root article." -msgstr "" +msgstr "No puede eliminar un artículo raíz." #: lms/templates/wiki/delete.html msgid "" "You cannot delete this article because you do not have permission to delete " "articles with children. Try to remove the children manually one-by-one." msgstr "" +"No puede eliminar este artículo porque no tiene permisos para eliminar " +"artículos con artículos hijo. Intente eliminar los artículos hijo " +"manualmente uno por uno." #: lms/templates/wiki/delete.html msgid "" "You are deleting an article. This means that its children will be deleted as" " well. If you choose to purge, children will also be purged!" msgstr "" +"Va a eliminar un artículo. Los artículos hijo también serán eliminados. Si " +"elige purgar, los artículos hijo también serán purgados!" #: lms/templates/wiki/delete.html msgid "Articles that will be deleted" -msgstr "" +msgstr "Artículos que serán eliminados" #: lms/templates/wiki/delete.html msgid "...and more!" -msgstr "" +msgstr "...y más!" #: lms/templates/wiki/delete.html msgid "You are deleting an article. Please confirm." -msgstr "" +msgstr "Va a eliminar un artículo. Por favor, confírmelo." -#: lms/templates/wiki/edit.html cms/templates/component.html -#: cms/templates/studio_xblock_wrapper.html -#: lms/templates/discussion/_underscore_templates.html -#: lms/templates/discussion/_underscore_templates.html -#: lms/templates/discussion/_underscore_templates.html -#: lms/templates/discussion/_underscore_templates.html -#: lms/templates/discussion/mustache/_inline_thread_show.mustache -#: lms/templates/wiki/includes/article_menu.html +#: lms/templates/wiki/edit.html msgid "Edit" -msgstr "" +msgstr "Editar" #: lms/templates/wiki/edit.html lms/templates/wiki/edit.html.py msgid "Save changes" -msgstr "" +msgstr "Guardar cambios" -#: lms/templates/wiki/edit.html cms/templates/unit.html +#: lms/templates/wiki/edit.html msgid "Preview" -msgstr "" +msgstr "Previsualizar" #. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# #. Translators: this is a control to allow users to exit out of this modal @@ -3283,11 +3291,11 @@ msgstr "" #: lms/templates/wiki/edit.html msgid "Back to editor" -msgstr "" +msgstr "Volver al editor" #: lms/templates/wiki/history.html msgid "History" -msgstr "" +msgstr "Historial" #: lms/templates/wiki/history.html msgid "" @@ -3303,23 +3311,23 @@ msgstr "" #: lms/templates/wiki/history.html msgid "Preview this revision" -msgstr "" +msgstr "Previsualizar esta revisión" #: lms/templates/wiki/history.html msgid "Auto log:" -msgstr "" +msgstr "Auto registro:" #: lms/templates/wiki/history.html msgid "Change" -msgstr "" +msgstr "Cambiar" #: lms/templates/wiki/history.html lms/templates/wiki/history.html msgid "Merge selected with current..." -msgstr "" +msgstr "Fusionar lo seleccionado con lo actual..." #: lms/templates/wiki/history.html msgid "Switch to selected version" -msgstr "" +msgstr "Cambiar a la versión seleccionada" #: lms/templates/wiki/history.html msgid "Wiki Revision Preview" @@ -3327,11 +3335,11 @@ msgstr "" #: lms/templates/wiki/history.html lms/templates/wiki/history.html msgid "Back to history view" -msgstr "" +msgstr "Volver a la vista de historial" #: lms/templates/wiki/history.html lms/templates/wiki/history.html msgid "Switch to this version" -msgstr "" +msgstr "Cambiar a esta versión" #: lms/templates/wiki/history.html msgid "Merge Revision" @@ -3339,21 +3347,23 @@ msgstr "" #: lms/templates/wiki/history.html msgid "Merge with current" -msgstr "" +msgstr "Combinar con la actual" #: lms/templates/wiki/history.html msgid "" "When you merge a revision with the current, all data will be retained from " "both versions and merged at its approximate location from each revision." msgstr "" +"Al combinar una revisión con la actual, todos los datos de ambas versiones " +"se mantienen y se combinan en su posición aproximada. " #: lms/templates/wiki/history.html msgid "After this, it's important to do a manual review." -msgstr "" +msgstr "Después de esto, es importante hacer una revisión manual." #: lms/templates/wiki/history.html lms/templates/wiki/history.html msgid "Create new merged version" -msgstr "" +msgstr "Creada una nueva versión combinada" #: lms/templates/wiki/preview_inline.html msgid "Previewing revision:" @@ -3377,10 +3387,12 @@ msgid "" " You need to log in or sign up to use this function.\n" " " msgstr "" +"\n" +"Debes identificarte o registrarte para usar esta función." #: lms/templates/wiki/includes/anonymous_blocked.html msgid "You need to log in or sign up to use this function." -msgstr "" +msgstr "Necesita iniciar sesión o registrarse para usar esta función." #: lms/templates/wiki/includes/cheatsheet.html msgid "Wiki Cheatsheet" @@ -3491,7 +3503,7 @@ msgstr "" #: lms/templates/wiki/plugins/attachments/index.html #: wiki/plugins/attachments/wiki_plugin.py msgid "Attachments" -msgstr "" +msgstr "Adjuntos" #: lms/templates/wiki/plugins/attachments/index.html msgid "Upload new file" @@ -3860,7 +3872,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -3928,11 +3941,9 @@ msgstr "" msgid "Privacy Policy" msgstr "" -#: cms/templates/widgets/header.html lms/templates/help_modal.html -#: lms/templates/navigation.html lms/templates/static_templates/help.html -#: lms/templates/static_templates/help.html wiki/plugins/help/wiki_plugin.py +#: wiki/plugins/help/wiki_plugin.py msgid "Help" -msgstr "" +msgstr "Ayuda" #: common/templates/course_modes/choose.html msgid "Upgrade Your Registration for {} | Choose Your Track" @@ -4211,11 +4222,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "editar" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Restablecer Contraseña" @@ -4787,6 +4834,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5113,6 +5175,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5583,6 +5665,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6506,6 +6592,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7166,10 +7256,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7193,6 +7279,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7232,6 +7322,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7334,10 +7429,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" @@ -12095,14 +12186,16 @@ msgid "" "Check here to apply the above permissions recursively to articles under this" " one." msgstr "" +"Comprueba aquí para aplicar los permisos de arriba recursivamente a los " +"artículos por debajo de este." #: wiki/forms.py msgid "Permission settings for the article were updated." -msgstr "" +msgstr "Se actualizaron los permisos para el artículo." #: wiki/forms.py msgid "Your permission settings were unchanged, so nothing saved." -msgstr "" +msgstr "Los permisos no se cambiaron, no se ha guardado nada." #: wiki/forms.py msgid "No user with that username" @@ -12110,178 +12203,189 @@ msgstr "No hay ningún usuario con ese nombre de usuario." #: wiki/forms.py msgid "Article locked for editing" -msgstr "" +msgstr "Artículo bloqueado para edición" #: wiki/forms.py msgid "Article unlocked for editing" -msgstr "" +msgstr "Artículo desbloqueado para edición" #: wiki/forms.py msgid "Filter..." -msgstr "" +msgstr "Filtrar..." #: wiki/core/plugins/base.py msgid "Settings for plugin" -msgstr "" +msgstr "Ajustes del plugin" #: wiki/models/article.py wiki/models/pluginbase.py #: wiki/plugins/attachments/models.py msgid "current revision" -msgstr "" +msgstr "revisión actual" #: wiki/models/article.py msgid "" "The revision being displayed for this article. If you need to do a roll-" "back, simply change the value of this field." msgstr "" +"Se está mostrando la revisión para este artículo. Si necesitas hacer un " +"roll-back, simplemente cambia el valor de este campo." #: wiki/models/article.py msgid "modified" -msgstr "" +msgstr "modificado" #: wiki/models/article.py msgid "Article properties last modified" -msgstr "" +msgstr "Propiedades del artículo modificadas por última vez" #: wiki/models/article.py msgid "owner" -msgstr "" +msgstr "propietario" #: wiki/models/article.py msgid "" "The owner of the article, usually the creator. The owner always has both " "read and write access." msgstr "" +"El propietario del artículo, normalmente el creador. El propietario siempre " +"tiene permisos de lectura y escritura." #: wiki/models/article.py msgid "group" -msgstr "" +msgstr "grupo" #: wiki/models/article.py msgid "" "Like in a UNIX file system, permissions can be given to a user according to " "group membership. Groups are handled through the Django auth system." msgstr "" +"Al igual que ocurre en el sistema de archivos UNIX, los permisos pueden ser " +"otorgados a un usuario de acuerdo a su pertenencia a ciertos grupos. Los " +"grupos se gestionan a través del sistema de autenticación Django." #: wiki/models/article.py msgid "group read access" -msgstr "" +msgstr "acceso de lectura al grupo" #: wiki/models/article.py msgid "group write access" -msgstr "" +msgstr "acceso de escritura al grupo" #: wiki/models/article.py msgid "others read access" -msgstr "" +msgstr "acceso de lectura a otros" #: wiki/models/article.py msgid "others write access" -msgstr "" +msgstr "acceso de escritura a otros" #: wiki/models/article.py msgid "Article without content (%(id)d)" -msgstr "" +msgstr "Artículo sin contenido (%(id)d)" #: wiki/models/article.py msgid "content type" -msgstr "" +msgstr "tipo de contenido" #: wiki/models/article.py msgid "object ID" -msgstr "" +msgstr "ID del objeto" #: wiki/models/article.py msgid "Article for object" -msgstr "" +msgstr "Artículo para el objeto" #: wiki/models/article.py msgid "Articles for object" -msgstr "" +msgstr "Artículos para el objeto" #: wiki/models/article.py msgid "revision number" -msgstr "" +msgstr "número de revisión" #: wiki/models/article.py msgid "IP address" -msgstr "" +msgstr "dirección IP" #: wiki/models/article.py msgid "user" -msgstr "" +msgstr "usuario" #: wiki/models/article.py msgid "locked" -msgstr "" +msgstr "bloqueado" #: wiki/models/article.py wiki/models/pluginbase.py msgid "article" -msgstr "" +msgstr "artículo" #: wiki/models/article.py msgid "article contents" -msgstr "" +msgstr "contenido del artículo" #: wiki/models/article.py msgid "article title" -msgstr "" +msgstr "título del artículo" #: wiki/models/article.py msgid "" "Each revision contains a title field that must be filled out, even if the " "title has not changed" msgstr "" +"Cada revisión contiene un campo título que debe ser cumplimentado, incluso " +"si el título no ha sido cambiado" #: wiki/models/pluginbase.py msgid "original article" -msgstr "" +msgstr "artículo original" #: wiki/models/pluginbase.py msgid "Permissions are inherited from this article" -msgstr "" +msgstr "Los permisos son heredados de este artículo" #: wiki/models/pluginbase.py msgid "A plugin was changed" -msgstr "" +msgstr "Un plugin fue modificado" #: wiki/models/pluginbase.py msgid "" "The revision being displayed for this plugin.If you need to do a roll-back, " "simply change the value of this field." msgstr "" +"La revisión está siendo mostrada para este plugin. Si necesitas hacer un " +"roll-back, simplemente cambia el valor de este campo." #: wiki/models/urlpath.py msgid "Cache lookup value for articles" -msgstr "" +msgstr "Valor de la búsqueda en cache para los artículos" #: wiki/models/urlpath.py msgid "slug" -msgstr "" +msgstr "indicador" #: wiki/models/urlpath.py msgid "(root)" -msgstr "" +msgstr "(raíz)" #: wiki/models/urlpath.py msgid "URL path" -msgstr "" +msgstr "dirección URL" #: wiki/models/urlpath.py msgid "URL paths" -msgstr "" +msgstr "direcciones URL" #: wiki/models/urlpath.py msgid "Sorry but you cannot have a root article with a slug." -msgstr "" +msgstr "Lo sentimos, pero no puedes tener un artículo raíz con enlace." #: wiki/models/urlpath.py msgid "A non-root note must always have a slug." -msgstr "" +msgstr "Una nota que no sea raíz debe tener siempre un enlace." #: wiki/models/urlpath.py msgid "There is already a root node on %s" -msgstr "" +msgstr "Ya existe un nodo raíz en %s" #: wiki/models/urlpath.py msgid "" @@ -12290,273 +12394,294 @@ msgid "" "\n" "The children of this article have had their parents deleted. You should probably find a new home for them." msgstr "" +"Artículos que perdieron su artículo padre\n" +"===============================\n" +"\n" +"El artículo padre de estos artículos fue eliminado. Es aconsejable asignarlos a otro artículo." #: wiki/models/urlpath.py msgid "Lost and found" -msgstr "" +msgstr "Objetos Perdidos" #: wiki/plugins/attachments/forms.py msgid "A short summary of what the file contains" -msgstr "" +msgstr "Un pequeño resumen del contenido del archivo" #: wiki/plugins/attachments/forms.py msgid "Yes I am sure..." -msgstr "" +msgstr "Sí, estoy seguro..." #: wiki/plugins/attachments/markdown_extensions.py msgid "Click to download file" -msgstr "" +msgstr "Click para descargar" #: wiki/plugins/attachments/models.py msgid "" "The revision of this attachment currently in use (on all articles using the " "attachment)" msgstr "" +"La revisión de este adjunto esta actualmente en uso (en todos los artículos " +"usando el adjunto)" #: wiki/plugins/attachments/models.py msgid "original filename" -msgstr "" +msgstr "nombre del archivo original" #: wiki/plugins/attachments/models.py msgid "attachment" -msgstr "" +msgstr "adjunto" #: wiki/plugins/attachments/models.py msgid "attachments" -msgstr "" +msgstr "adjuntos" #: wiki/plugins/attachments/models.py msgid "file" -msgstr "" +msgstr "fichero" #: wiki/plugins/attachments/models.py msgid "attachment revision" -msgstr "" +msgstr "revisión del adjunto" #: wiki/plugins/attachments/models.py msgid "attachment revisions" -msgstr "" +msgstr "revisiones del adjunto" #: wiki/plugins/attachments/views.py msgid "%s was successfully added." -msgstr "" +msgstr "%s fue agregado con éxito." #: wiki/plugins/attachments/views.py wiki/plugins/attachments/views.py msgid "Your file could not be saved: %s" -msgstr "" +msgstr "Su archivo no ha sido grabado: %s" #: wiki/plugins/attachments/views.py wiki/plugins/attachments/views.py msgid "" "Your file could not be saved, probably because of a permission error on the " "web server." msgstr "" +"Tu archivo no ha sido grabado. Es posible que exista un problema con los " +"permisos en el servidor web." #: wiki/plugins/attachments/views.py msgid "%s uploaded and replaces old attachment." -msgstr "" +msgstr "%s ha sido grabado y reemplazará al adjunto antiguo." #: wiki/plugins/attachments/views.py msgid "" "Your new file will automatically be renamed to match the file already " "present. Files with different extensions are not allowed." msgstr "" +"El nuevo archivo será renombrado como el archivo antiguo. Los archivos con " +"diferentes extensiones no son permitidos." #: wiki/plugins/attachments/views.py msgid "Current revision changed for %s." -msgstr "" +msgstr "La revisión actual de %s ha cambiado." #: wiki/plugins/attachments/views.py msgid "Added a reference to \"%(att)s\" from \"%(art)s\"." -msgstr "" +msgstr "Ha sido agregada una referencia a \"%(att)s\" desde \"%(art)s\"." #: wiki/plugins/attachments/views.py msgid "The file %s was deleted." -msgstr "" +msgstr "El archivo %s ha sido borrado." #: wiki/plugins/attachments/views.py msgid "This article is no longer related to the file %s." -msgstr "" +msgstr "Este artículo ya no esta relacionado con el archivo %s." #: wiki/plugins/attachments/wiki_plugin.py msgid "A file was changed: %s" -msgstr "" +msgstr "Un archivo ha cambiado: %s" #: wiki/plugins/attachments/wiki_plugin.py msgid "A file was deleted: %s" -msgstr "" +msgstr "Un archivo ha sido borrado: %s" #: wiki/plugins/images/forms.py msgid "" "New image %s was successfully uploaded. You can use it by selecting it from " "the list of available images." msgstr "" +"La nueva imagen %s fue grabada con éxito. Puedes usarla seleccionandola de " +"la lista de imágenes disponibles" #: wiki/plugins/images/forms.py msgid "Are you sure?" -msgstr "" +msgstr "¿Estás seguro?" #: wiki/plugins/images/models.py msgid "image" -msgstr "" +msgstr "imagen" #: wiki/plugins/images/models.py msgid "images" -msgstr "" +msgstr "imágenes" #: wiki/plugins/images/models.py msgid "Image: %s" -msgstr "" +msgstr "Imagen: %s" #: wiki/plugins/images/models.py msgid "Current revision not set!!" -msgstr "" +msgstr "Revisión actual no determinada!!" #: wiki/plugins/images/models.py msgid "image revision" -msgstr "" +msgstr "Revisión de imagen" #: wiki/plugins/images/models.py msgid "image revisions" -msgstr "" +msgstr "Revisiones de imágenes" #: wiki/plugins/images/models.py msgid "Image Revsion: %d" -msgstr "" +msgstr "Revisión de imagen: %d" #: wiki/plugins/images/views.py msgid "%s has been restored" -msgstr "" +msgstr "%s fue restaurado" #: wiki/plugins/images/views.py msgid "%s has been marked as deleted" -msgstr "" +msgstr "%s fue marcado como borrado" #: wiki/plugins/images/views.py msgid "%(file)s has been changed to revision #%(revision)d" -msgstr "" +msgstr "%(file)s ha cambiado a la revisión #%(revision)d" #: wiki/plugins/images/views.py msgid "%(file)s has been saved." -msgstr "" +msgstr "%(file)s fue grabado con éxito." #: wiki/plugins/images/wiki_plugin.py msgid "Images" -msgstr "" +msgstr "Imágenes" #: wiki/plugins/images/wiki_plugin.py msgid "An image was added: %s" -msgstr "" +msgstr "Se añadió una imagen: %s" #: wiki/plugins/links/wiki_plugin.py msgid "Links" -msgstr "" +msgstr "Enlaces" #: wiki/plugins/notifications/forms.py msgid "Notifications" -msgstr "" +msgstr "Notificaciones" #: wiki/plugins/notifications/forms.py msgid "When this article is edited" -msgstr "" +msgstr "Cuándo fue editado este artículo" #: wiki/plugins/notifications/forms.py msgid "Also receive emails about article edits" -msgstr "" +msgstr "Recibir emails también sobre ediciones de artículos" #: wiki/plugins/notifications/forms.py msgid "Your notification settings were updated." -msgstr "" +msgstr "La configuración de notificaciones ha sido actualizada." #: wiki/plugins/notifications/forms.py msgid "Your notification settings were unchanged, so nothing saved." msgstr "" +"La configuración de notificaciones no ha cambiado, por lo que no se guardó " +"nada." #: wiki/plugins/notifications/models.py msgid "%(user)s subscribing to %(article)s (%(type)s)" -msgstr "" +msgstr "%(user)s suscrito al %(article)s (%(type)s)" #: wiki/plugins/notifications/models.py msgid "Article deleted: %s" -msgstr "" +msgstr "Artículo borrado: %s" #: wiki/plugins/notifications/models.py msgid "Article modified: %s" -msgstr "" +msgstr "Artículo modificado: %s" #: wiki/plugins/notifications/models.py msgid "New article created: %s" -msgstr "" +msgstr "Nuevo artículo creado: %s" #: wiki/views/accounts.py msgid "You are now sign up... and now you can sign in!" -msgstr "" +msgstr "Ya estás inscrito... ¡ahora puedes identificarte en el sistema!" #: wiki/views/accounts.py msgid "You are no longer logged in. Bye bye!" -msgstr "" +msgstr "Has cerrado la sesión. ¡Adiós!" #: wiki/views/accounts.py msgid "You are now logged in! Have fun!" -msgstr "" +msgstr "¡Te has identificado correctamente!. ¡A disfrutar!" #: wiki/views/article.py msgid "New article '%s' created." -msgstr "" +msgstr "Nuevo artículo '%s' creado." #: wiki/views/article.py msgid "There was an error creating this article: %s" -msgstr "" +msgstr "Ocurrió un error al crear el artículo: %s" #: wiki/views/article.py msgid "There was an error creating this article." -msgstr "" +msgstr "Ocurrió un error al crear este artículo." #: wiki/views/article.py msgid "" "This article cannot be deleted because it has children or is a root article." msgstr "" +"El artículo no puede ser borrado ya que tiene sub-artículos o es el artículo" +" raíz." #: wiki/views/article.py msgid "" "This article together with all its contents are now completely gone! Thanks!" msgstr "" +"El artículo y todos sus contenidos han sido totalmente eliminados. ¡Gracias!" #: wiki/views/article.py msgid "" "The article \"%s\" is now marked as deleted! Thanks for keeping the site " "free from unwanted material!" msgstr "" +"El artículo \"%s\" ha sido marcado como borrado. ¡Gracias por mantener el " +"sitio libre de material innecesario!" #: wiki/views/article.py msgid "Your changes were saved." -msgstr "" +msgstr "Los cambios han sido grabados." #: wiki/views/article.py msgid "A new revision of the article was succesfully added." -msgstr "" +msgstr "Se añadió correctamente una nueva revisión del artículo." #: wiki/views/article.py msgid "Restoring article" -msgstr "" +msgstr "Restaurando artículo" #: wiki/views/article.py msgid "The article \"%s\" and its children are now restored." -msgstr "" +msgstr "El artículo \"%s\" y sus subartículos hijos han sido restaurados." #: wiki/views/article.py msgid "The article %s is now set to display revision #%d" -msgstr "" +msgstr "El artículo %s se configuró para mostrar la revisión #%d" #: wiki/views/article.py msgid "New title" -msgstr "" +msgstr "Nuevo título" #: wiki/views/article.py msgid "Merge between Revision #%(r1)d and Revision #%(r2)d" -msgstr "" +msgstr "Fusión entre la revisión #%(r1)d y la revisión #%(r2)d" #: wiki/views/article.py msgid "" "A new revision was created: Merge between Revision #%(r1)d and Revision " "#%(r2)d" msgstr "" +"Se creó una nueva revisión: Fusión entre la Revisión #%(r1)d y la Revisión " +"#%(r2)d" diff --git a/conf/locale/es_ES/LC_MESSAGES/djangojs.mo b/conf/locale/es_ES/LC_MESSAGES/djangojs.mo index 3c1771755819..4c165a672fb4 100644 Binary files a/conf/locale/es_ES/LC_MESSAGES/djangojs.mo and b/conf/locale/es_ES/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/es_ES/LC_MESSAGES/djangojs.po b/conf/locale/es_ES/LC_MESSAGES/djangojs.po index 6d5caebfa128..f927bf007537 100644 --- a/conf/locale/es_ES/LC_MESSAGES/djangojs.po +++ b/conf/locale/es_ES/LC_MESSAGES/djangojs.po @@ -31,8 +31,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-15 15:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-26 10:59+0000\n" "Last-Translator: spentamanyu \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/edx-platform/language/es_ES/)\n" "MIME-Version: 1.0\n" @@ -94,16 +94,16 @@ msgstr "Responder a anotación" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "(%(earned)s/%(possible)s point)" msgid_plural "(%(earned)s/%(possible)s points)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "(%(earned)s/%(possible)s punto)" +msgstr[1] "(%(earned)s/%(possible)s puntos)" #. Translators: %(num_points)s is the number of points possible (examples: 1, #. 3, 10). There will always be at least 1 point possible.; #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "(%(num_points)s point possible)" msgid_plural "(%(num_points)s points possible)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "(%(num_points)s punto posible)" +msgstr[1] "(%(num_points)s puntos posibles)" #: common/lib/xmodule/xmodule/js/src/capa/display.js #: common/lib/xmodule/xmodule/js/src/capa/display.js @@ -146,7 +146,7 @@ msgstr "Estado: por enviar" #. they feel they were graded on this problem #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "You need to pick a rating before you can submit." -msgstr "" +msgstr "Debe elegir una calificación antes de enviar." #. Translators: this message appears when transitioning between openended #. grading @@ -155,7 +155,7 @@ msgstr "" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Your score did not meet the criteria to move to the next step." -msgstr "" +msgstr "Su puntuación no llega al criterio para pasar al siguiente paso." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: lms/static/coffee/src/staff_grading/staff_grading.js @@ -167,18 +167,20 @@ msgstr "Enviar" #. form for an openended assessment #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Submit assessment" -msgstr "" +msgstr "Enviar examen" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" "Your response has been submitted. Please check back later for your grade." msgstr "" +"Tu respuesta ha sido enviada. Por favor, vuelve a comprobar más tarde tu " +"nota." #. Translators: this button is clicked to submit a student's rating of #. an evaluator's assessment #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Submit post-assessment" -msgstr "" +msgstr "Enviar puntuación de la evaluación" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Answer saved, but not yet submitted." @@ -189,21 +191,27 @@ msgid "" "Please confirm that you wish to submit your work. You will not be able to " "make any changes after submitting." msgstr "" +"Por favor confirme que quiere enviar su trabajo. No podra realizar ninguna " +"modificación despues de el envio." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" "You are trying to upload a file that is too large for our system. Please " "choose a file under 2MB or paste a link to it into the answer box." msgstr "" +"Esta intentando subir un archivo demasiado grande para nuestro sistema. Por " +"favor, elija un fichero de menos de 2MB o pegue un enlace en el cuadro de " +"respuesta." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" "Are you sure you want to remove your previous response to this question?" msgstr "" +"¿Está seguro de que desea eliminar su anterior respuesta a esta cuestión?" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Moved to next step." -msgstr "" +msgstr "Movido al siguiente paso." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "" @@ -212,6 +220,10 @@ msgid "" " uploaded the image to another website, you can paste a link to it into the " "answer box." msgstr "" +"La subida de ficheros es necesaria para esta cuestión, pero no esta " +"soportada por su navegador. Intente la última versión de Google Chrome. Como" +" alternativa, si ha subido la imagen en otro website, puede pegar el enlace " +"en el cuadro de respuesta." #. Translators: "Show Question" is some text that, when clicked, shows a #. question's @@ -219,7 +231,7 @@ msgstr "" #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js msgid "Show Question" -msgstr "" +msgstr "Mostrar cuestión." #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js #: common/lib/xmodule/xmodule/js/src/combinedopenended/display.js @@ -231,6 +243,9 @@ msgid "" "Sequence error! Cannot navigate to tab %(tab_name)s in the current " "SequenceModule. Please contact the course staff." msgstr "" +"¡Error de secuencia! No se puede acceder a la pestaña %(tab_name)s en el " +"módulo de secuencia -SequenceModule- actual. Por favor, contacta con el " +"administrador del curso." #: common/lib/xmodule/xmodule/js/src/video/04_video_control.js msgid "Video slider" @@ -354,6 +369,7 @@ msgstr "Mostrar Debate" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Perdona" @@ -361,25 +377,33 @@ msgstr "Perdona" #: common/static/coffee/src/discussion/discussion_module_view.js msgid "We had some trouble loading the discussion. Please try again." msgstr "" +"Tuvimos algunos problemas cargando los foros. Por favor, inténtalo otra vez." #: common/static/coffee/src/discussion/discussion_module_view.js msgid "" "We had some trouble loading the threads you requested. Please try again." msgstr "" +"Tuvimos algunos problemas cargando los hilos de discusión solicitados. Por " +"favor, inténtalo otra vez." #: common/static/coffee/src/discussion/utils.js msgid "Loading content" -msgstr "" +msgstr "Cargando contenido" #: common/static/coffee/src/discussion/utils.js msgid "" "We had some trouble processing your request. Please ensure you have copied " "any unsaved work and then reload the page." msgstr "" +"Tuvimos algunos problemas procesando tu petición. Por favor, asegúrate de " +"haber copiado cualquier trabajo que no hayas guardado aún y recarga la " +"página." #: common/static/coffee/src/discussion/utils.js msgid "We had some trouble processing your request. Please try again." msgstr "" +"Hemos tenido problemas procesando tu solicitud. Inténtalo de nuevo por " +"favor." #: common/static/coffee/src/discussion/utils.js #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js @@ -412,14 +436,14 @@ msgstr "votar" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "vote (click to remove your vote)" msgid_plural "votes (click to remove your vote)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "voto (pulse para eliminar su voto)" +msgstr[1] "votos (pulse para eliminar su voto)" #: common/static/coffee/src/discussion/views/discussion_content_view.js msgid "vote (click to vote)" msgid_plural "votes (click to vote)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "voto (pulse para votar)" +msgstr[1] "votos (pulse para votar)" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "Load more" @@ -432,12 +456,14 @@ msgstr "Cargando más conversaciones" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "We had some trouble loading more threads. Please try again." msgstr "" +"Tuvimos algunos problemas cargando más conversaciones. Por favor, inténtalo " +"de nuevo." #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "%(unread_count)s new comment" msgid_plural "%(unread_count)s new comments" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(unread_count)s comentario nuevo" +msgstr[1] "%(unread_count)s comentarios nuevos" #: common/static/coffee/src/discussion/views/discussion_thread_list_view.js msgid "Loading thread list" @@ -453,6 +479,8 @@ msgstr "Pulsa para eliminar informe" #: common/static/coffee/src/discussion/views/thread_response_show_view.js msgid "Misuse Reported%(start_sr_span)s, click to remove report%(end_span)s" msgstr "" +"Notificado Abuso, %(start_sr_span)s, pulsa para eliminar el " +"informe%(end_span)s" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js #: common/static/coffee/src/discussion/views/response_comment_show_view.js @@ -465,11 +493,11 @@ msgstr "Reportar un abuso" #. in most browsers but will be read by screen readers. #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Pinned%(start_sr_span)s, click to unpin%(end_span)s" -msgstr "" +msgstr "Apuntados%(start_sr_span)s, click para desapuntar%(end_span)s" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Click to unpin" -msgstr "" +msgstr "Click para dejar de promocionar" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Pinned" @@ -477,47 +505,54 @@ msgstr "Promocionado" #: common/static/coffee/src/discussion/views/discussion_thread_show_view.js msgid "Pin Thread" -msgstr "" +msgstr "Marcar conversación" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "" "The thread you selected has been deleted. Please select another thread." msgstr "" +"El hilo que selecciono ha sido borrado. Por favor, seleccione otro hilo." #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "We had some trouble loading responses. Please reload the page." msgstr "" +"Hubo algún problema al cargar las respuestas. Por favor, recarga la página." #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "We had some trouble loading more responses. Please try again." msgstr "" +"Hubo algún problema al cargar más respuestas. Por favor, recarga la página." #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "%(numResponses)s response" msgid_plural "%(numResponses)s responses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(numResponses)s respuesta" +msgstr[1] "%(numResponses)s respuestas" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Showing all responses" -msgstr "" +msgstr "Mostrando todas las respuestas" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Showing first response" msgid_plural "Showing first %(numResponses)s responses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Mostrando la primera respuesta" +msgstr[1] "Mostrando las primeras %(numResponses)s respuestas" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Load all responses" -msgstr "" +msgstr "Cargar todas las respuestas" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Load next %(numResponses)s responses" -msgstr "" +msgstr "Cargar las siguientes %(numResponses)s respuestas" #: common/static/coffee/src/discussion/views/discussion_thread_view.js msgid "Are you sure you want to delete this post?" +msgstr "¿Está seguro de querer borrar esta entrada?" + +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." msgstr "" #: common/static/coffee/src/discussion/views/response_comment_show_view.js @@ -542,11 +577,11 @@ msgstr "Notificado Abuso, pulsa para eliminar el informe" #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Are you sure you want to delete this comment?" -msgstr "" +msgstr "¿Está seguro de querer borrar este comentario?" #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "We had some trouble deleting this comment. Please try again." -msgstr "" +msgstr "Ha habido problemas al borrar este comentario. Inténtalo de nuevo" #: common/static/coffee/src/discussion/views/thread_response_view.js msgid "Are you sure you want to delete this response?" @@ -793,23 +828,23 @@ msgstr "Cuerpo del mensaje" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Error fetching distribution." -msgstr "" +msgstr "Fallo al lograr la distribución" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Unavailable metric display." -msgstr "" +msgstr "Metrica de pantalla no disponible." #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Error fetching grade distributions." -msgstr "" +msgstr "Error al obtener la distribución de calificaciones." #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "Last Updated: <%= timestamp %>" -msgstr "" +msgstr "Última actualización: <%= timestamp %>" #: lms/static/coffee/src/instructor_dashboard/analytics.js msgid "<%= num_students %> students scored." -msgstr "" +msgstr "<%= num_students %> calificación de los estudiantes." #: lms/static/coffee/src/instructor_dashboard/data_download.js msgid "Loading..." @@ -836,6 +871,8 @@ msgid "" "Links are generated on demand and expire within 5 minutes due to the " "sensitive nature of student information." msgstr "" +"Los enlaces se generan al solicitarlo y expiran en 5 minutos debido a la " +"naturaleza sensible de la información sobre el estudiante." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Username" @@ -856,85 +893,94 @@ msgstr "Introduzca nombre de usuario o correo electrónico" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Please enter a username or email." -msgstr "" +msgstr "Por favor, introduzca un nombre de usuario o correo electrónico." #. Translators: A rolename appears this sentence.; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error fetching list for role" -msgstr "" +msgstr "Fallo al obtener la lista para el rol " #: lms/static/coffee/src/instructor_dashboard/membership.js #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error changing user's permissions." -msgstr "" +msgstr "Error al cambiar los permisos de usuario." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Could not find a user with username or email address '<%= identifier %>'." msgstr "" +"No se encuentra ningún usuario con la dirección de correo '<%= identifier " +"%>'." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Error: User '<%= username %>' has not yet activated their account. Users " "must create and activate their accounts before they can be assigned a role." msgstr "" +"Error: El usuario r '<%= username %>' no ha activado su cuenta aún. Los " +"usuarios deben activar sus cuentas antes de que se les pueda asignar un rol." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error: You cannot remove yourself from the Instructor group!" -msgstr "" +msgstr "Error: no puedes eliminarte del grupo de Instructores!" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error adding/removing users as beta testers." -msgstr "" +msgstr "Fallo al añadir/eliminar usuarios como probadores de betas" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were successfully added as beta testers:" -msgstr "" +msgstr "Los usuarios fuero añadidos con exito a los probadores de betas" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were successfully removed as beta testers:" -msgstr "" +msgstr "Los usuarios fueron eliminados con exito de los probadores beta:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were not added as beta testers:" -msgstr "" +msgstr "Los usuarios no fueron añadidos a los probadores beta:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users were not removed as beta testers:" -msgstr "" +msgstr "Los usuarios no fueron eliminados de los probadores beta:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "Users must create and activate their account before they can be promoted to " "beta tester." msgstr "" +"Los usuarios tienen que crear y activar sus cuentas antes de que se les " +"pueda asignar el rol de beta tester." #. Translators: A list of identifiers (which are email addresses and/or #. usernames) appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Could not find users associated with the following identifiers:" -msgstr "" +msgstr "No se encuentran usuarios asociados a los siguientes identificadores:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error enrolling/unenrolling users." -msgstr "" +msgstr "Error de inscripción/borrado de los usuarios." #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "The following email addresses and/or usernames are invalid:" msgstr "" +"Los siguientes correos electrónicos y/o nombres de usuarios no son válidos:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Successfully enrolled and sent email to the following users:" msgstr "" +"Estudiantes inscritos correctamente y correo enviado a los siguientes " +"usuarios:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Successfully enrolled the following users:" -msgstr "" +msgstr "Estudiantes inscritos correctamente:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -942,11 +988,13 @@ msgid "" "Successfully sent enrollment emails to the following users. They will be " "allowed to enroll once they register:" msgstr "" +"Email de inscripción enviado correctamente a los siguientes estudiantes. Les" +" será permitido inscribirse una vez que se registren:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users will be allowed to enroll once they register:" -msgstr "" +msgstr "Estos estudiantes seran inscritos una vez se hayan registrado:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -954,11 +1002,13 @@ msgid "" "Successfully sent enrollment emails to the following users. They will be " "enrolled once they register:" msgstr "" +"Email de inscripción enviado correctamente a los siguientes estudiantes. " +"Podrán inscribirse en cuanto se registren:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "These users will be enrolled once they register:" -msgstr "" +msgstr "Estos estudiantes seran inscritos una vez se hayan registrado:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js @@ -966,17 +1016,21 @@ msgid "" "Emails successfully sent. The following users are no longer enrolled in the " "course:" msgstr "" +"Emails enviados correctamente. Los siguientes estudiantes ya no están " +"inscritos en el curso:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "The following users are no longer enrolled in the course:" -msgstr "" +msgstr " Los siguientes estudiantes ya no están inscritos en el curso:" #. Translators: A list of users appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "" "These users were not affiliated with the course so could not be unenrolled:" msgstr "" +" Los siguientes estudiantes no estaban afiliados al curso, por lo que no se " +"pudieron anular sus inscripciones:" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "Your message must have a subject." @@ -995,18 +1049,25 @@ msgid "" "You are about to send an email titled '<%= subject %>' to yourself. Is this " "OK?" msgstr "" +"Estás a punto de enviar un email con el asunto '<%= subject %>' a ti " +"mismo. ¿Es eso correcto?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" "You are about to send an email titled '<%= subject %>' to everyone who is " "staff or instructor on this course. Is this OK?" msgstr "" +"Está a punto de enviar un correo titulado '<%= subject %>' a todos los que " +"están apuntados o son profesores de este curso. ¿Es eso correcto?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" "You are about to send an email titled '<%= subject %>' to ALL (everyone who " "is enrolled in this course as student, staff, or instructor). Is this OK?" msgstr "" +"Esta a punto de enviar un correo titulado '<%= subject %>' a TODOS (todos " +"los que están apuntados a este curso, estudiantes, personal o instructores)." +" ¿Es eso correcto?" #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "" @@ -1014,6 +1075,10 @@ msgid "" "classes, it may take up to an hour (or more, if other courses are " "simultaneously sending email) to send all emails." msgstr "" +"Tu email fue encolado correctamente para ser enviado. Por favor, ten en " +"cuenta que para clases con muchos inscritos, el envío podría llevar su " +"tiempo (una hora o más, si otros cursos amplios intentan enviar emails de " +"forma simultánea)." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "Error sending email." @@ -1026,6 +1091,8 @@ msgstr "No hay historial de emails para este curso." #: lms/static/coffee/src/instructor_dashboard/send_email.js msgid "There was an error obtaining email task history for this course." msgstr "" +"Hubo un error relacionado con la tarea de histórico de emails para este " +"curso." #: lms/static/coffee/src/instructor_dashboard/student_admin.js #: lms/static/coffee/src/instructor_dashboard/student_admin.js @@ -1034,12 +1101,16 @@ msgstr "" #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Please enter a student email address or username." msgstr "" +"Por favor introduce la dirección email del estudiante o su nombre de " +"usuario." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error getting student progress url for '<%= student_id %>'. Check that the " "student identifier is spelled correctly." msgstr "" +"Error al obtener la url de progreso del estudiante '<%= student_id %>'. " +"Verifica que el identificador del estudiante está bien escrito." #: lms/static/coffee/src/instructor_dashboard/student_admin.js #: lms/static/coffee/src/instructor_dashboard/student_admin.js @@ -1056,6 +1127,8 @@ msgid "" "Success! Problem attempts reset for problem '<%= problem_id %>' and student " "'<%= student_id %>'." msgstr "" +"¡Exito! Intentos de reseteo para el ejercicio '<%= problem_id %>' y el " +"estudiante '<%= student_id %>'." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1063,17 +1136,25 @@ msgid "" " '<%= student_id %>'. Check that the problem and student identifiers are " "spelled correctly." msgstr "" +"Error al resetear los intentos para el ejercicio '<%= problem_id %>' y " +"estudiante '<%= student_id %>'. Verifica que los identificadores de " +"estudiante y ejercicio son correctos." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Delete student '<%= student_id %>'s state on problem '<%= problem_id %>'?" msgstr "" +"¿Borrar el estado del estudiante '<%= student_id %> para el ejercicio '<%= " +"problem_id %>'?" #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error deleting student '<%= student_id %>'s state on problem '<%= problem_id" " %>'. Check that the problem and student identifiers are spelled correctly." msgstr "" +"Error al borrar el estado del estudiante '<%= student_id %> para el " +"ejercicio '<%= problem_id %>'. Verifica que los identificadores de " +"estudiante y ejercicio son correctos." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Module state successfully deleted." @@ -1085,6 +1166,9 @@ msgid "" "'<%= student_id %>'. Click the 'Show Background Task History for Student' " "button to see the status of the task." msgstr "" +"Se ha comenzado la ejecución de la tarea de re-evaluación del ejercicio " +"'<%= problem_id %>' para el estudiante '<%= student_id %>'. Pulsa el botón " +"'Mostrar Tarea de Historial del Estudiante' para ver el estado de la tarea." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1092,6 +1176,9 @@ msgid "" "'<%= student_id %>'. Check that the problem and student identifiers are " "spelled correctly." msgstr "" +"Error al comenzar la ejecución de la tarea de re-evaluación del ejercicio " +"'<%= problem_id %>' para el estudiante '<%= student_id %>'. Verifica que los" +" identificadores del estudiante y del ejercicio son correctos." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1099,10 +1186,15 @@ msgid "" "student_id %>'. Check that the problem and student identifiers are spelled " "correctly." msgstr "" +"Error al obtener el historial de la tarea del ejercicio '<%= problem_id %>'" +" para el estudiante '<%= student_id %>'. Verifica que los identificadores " +"del estudiante y del ejercicio son correctos." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Reset attempts for all students on problem '<%= problem_id %>'?" msgstr "" +"¿Resetear intentos para todos los estudiantes del ejercicio '<%= problem_id " +"%>'?" #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1110,16 +1202,22 @@ msgid "" " Click the 'Show Background Task History for Problem' button to see the " "status of the task." msgstr "" +"Se ha comenzado a ejecutar con éxito la tarea para resetear los intentos del" +" ejercicio '<%= problem_id %>'. Pulsa el botón 'Mostrar Tarea de Historial " +"del Ejercicio' para ver el estado de la tarea." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error starting a task to reset attempts for all students on problem '<%= " "problem_id %>'. Check that the problem identifier is spelled correctly." msgstr "" +"Error al comenzar a ejecutar la tarea para resetear los intentos de todos " +"los estudiantes para el ejercicio '<%= problem_id %>'. Verifica que el " +"identificador del ejercicio es correcto." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Rescore problem '<%= problem_id %>' for all students?" -msgstr "" +msgstr "¿Re-evaluar ejercicio '<%= problem_id %>' para todos los estudiantes?" #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" @@ -1127,16 +1225,23 @@ msgid "" "students. Click the 'Show Background Task History for Problem' button to see" " the status of the task." msgstr "" +"Se ha comenzado a ejecutar con éxito la tarea para resetear los intentos del" +" ejercicio '<%= problem_id %>'. Pulsa el botón 'Mostrar Tarea de Historial " +"del Ejercicio' para ver el estado de la tarea." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "" "Error starting a task to rescore problem '<%= problem_id %>'. Check that the" " problem identifier is spelled correctly." msgstr "" +"Error al comenzar la ejecución de la tarea de re-evaluación del ejercicio " +"'<%= problem_id %>'. Verifica que el identificador del ejercicio es " +"correcto." #: lms/static/coffee/src/instructor_dashboard/student_admin.js msgid "Error listing task history for this student and problem." msgstr "" +"Error al listar la tarea de historial para este estudiante y problema." #. Translators: a "Task" is a background process such as grading students or #. sending email @@ -1172,13 +1277,13 @@ msgstr "Enviado" #. this #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Duration (sec)" -msgstr "" +msgstr "Duración (seg)" #. Translators: The state (eg, "In progress") of a task (eg, sending email) #. appears after this. #: lms/static/coffee/src/instructor_dashboard/util.js msgid "State" -msgstr "" +msgstr "Estado de la tarea" #. Translators: a "Task" is a background process such as grading students or #. sending email @@ -1190,11 +1295,11 @@ msgstr "Estado de la tarea." #. sending email #: lms/static/coffee/src/instructor_dashboard/util.js msgid "Task Progress" -msgstr "" +msgstr "Progreso de la Tarea" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Grades saved. Fetching the next submission to grade." -msgstr "" +msgstr "Calificaciones guardadas. Obteniendo el siguiente envío a evaluar." #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Problem Name" @@ -1235,18 +1340,19 @@ msgstr "<%= num %> evaluados" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "<%= num %> more needed to start ML" msgstr "" +"se necesitan <%= num %> más para comenzar la calificación automática ML" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "Re-check for submissions" -msgstr "" +msgstr "Re-verificar envíos" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "System got into invalid state: <%= state %>" -msgstr "" +msgstr "El sistema entró en un estado inválido: <%= state %>" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "System got into invalid state for submission: " -msgstr "" +msgstr "El sistema entró en un estado inválido por el envío:" #: lms/static/coffee/src/staff_grading/staff_grading.js #: lms/static/coffee/src/staff_grading/staff_grading.js @@ -1255,20 +1361,20 @@ msgstr "(Ocultar)" #: lms/static/coffee/src/staff_grading/staff_grading.js msgid "(Show)" -msgstr "" +msgstr "(Mostrar)" #: lms/static/js/Markdown.Editor.js msgid "Insert Hyperlink" -msgstr "" +msgstr "Introduzca Hipervínculo" #. Translators: Please keep the quotation marks (") around this text #: lms/static/js/Markdown.Editor.js lms/static/js/Markdown.Editor.js.c msgid "\"optional title\"" -msgstr "" +msgstr "\"título opcional\"" #: lms/static/js/Markdown.Editor.js msgid "Insert Image (upload file or type url)" -msgstr "" +msgstr "Inserte Imagen (suba un fichero o escriba una url)" #: lms/static/js/Markdown.Editor.js msgid "Markdown Editing Help" @@ -1362,6 +1468,7 @@ msgstr "Cabecera" #: lms/templates/class_dashboard/all_section_metrics.js msgid "Unable to retrieve data, please try again later." msgstr "" +"No hemos podido descargar los datos, por favor inténtalo de nuevo más tarde" #: lms/templates/class_dashboard/d3_stacked_bar_graph.js msgid "Number of Students" @@ -1609,6 +1716,10 @@ msgstr "" "Formato de archivo no soportado. Por favor, suba un archivo con extensión " "tar.gz." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "Subir archivo" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Contraer todas las secciones" diff --git a/conf/locale/fr/LC_MESSAGES/django.mo b/conf/locale/fr/LC_MESSAGES/django.mo index 3002dd687abd..15c06dfd31f7 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 199d7248f1be..d2f0028e7438 100644 --- a/conf/locale/fr/LC_MESSAGES/django.po +++ b/conf/locale/fr/LC_MESSAGES/django.po @@ -60,6 +60,7 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: +# aissam , 2014 # Bertrand Marron , 2013-2014 # chrisc , 2014 # ClaudeCoulombe , 2014 @@ -124,7 +125,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-03 14:01+0000\n" "Last-Translator: antoviaque \n" "Language-Team: French (http://www.transifex.com/projects/p/edx-platform/language/fr/)\n" @@ -259,6 +260,16 @@ msgstr "Vous n'êtes pas inscrit à ce cours" msgid "Enrollment action is invalid" msgstr "Action d'inscription invalide" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -923,6 +934,10 @@ msgstr "" "Soumis. Dès qu'une réponse sera envoyée, ce message sera remplacé par cette " "réponse. " +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "Erreur {err} dans la fonction d'indice {hintfn}." @@ -4267,7 +4282,8 @@ msgstr "Mot de passe oublié ?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "Mot de passe" @@ -4654,11 +4670,47 @@ msgstr "Une erreur s'est produite. Merci d'essayer de nouveau plus tard." msgid "Please verify your new email" msgstr "Veuillez vérifier votre nouvelle adresse email" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "éditer" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Réinitialiser le mot de passe" @@ -5260,6 +5312,21 @@ msgstr "Préférences du compte" msgid "Remember me" msgstr "Se souvenir de moi" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "Ressource externe" @@ -5622,6 +5689,26 @@ msgstr "Bienvenue !" msgid "Register below to create your {platform_name} account" msgstr "Inscrivez-vous ci-dessous pour créer votre compte sur {platform_name}" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "Complétez les champs suivants pour créer votre compte." @@ -6114,6 +6201,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "Vos mots :" @@ -7114,6 +7205,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "Progression dans le cours de l'étudiant '{username}' ({email})" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "{earned:.3n} point(s) sur {total:.3n}" @@ -7825,10 +7920,6 @@ msgstr "" msgid "User Profile" msgstr "Profil utilisateur" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "Fils actifs" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7852,6 +7943,10 @@ msgstr "…" msgid "View discussion" msgstr "Afficher la discussion" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "Fils actifs" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7891,6 +7986,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7993,10 +8093,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.mo b/conf/locale/fr/LC_MESSAGES/djangojs.mo index d0178013169c..40248cb7ff56 100644 Binary files a/conf/locale/fr/LC_MESSAGES/djangojs.mo and b/conf/locale/fr/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.po b/conf/locale/fr/LC_MESSAGES/djangojs.po index 2a3214ce8752..4ea092c10153 100644 --- a/conf/locale/fr/LC_MESSAGES/djangojs.po +++ b/conf/locale/fr/LC_MESSAGES/djangojs.po @@ -29,6 +29,7 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: +# aissam , 2014 # Bertrand Marron , 2014 # chrisc , 2014 # Encolpe Degoute , 2013 @@ -42,9 +43,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" -"Last-Translator: sarina \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-27 16:20+0000\n" +"Last-Translator: aissam \n" "Language-Team: French (http://www.transifex.com/projects/p/edx-platform/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -379,6 +380,7 @@ msgstr "Afficher la discussion" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Désolé" @@ -562,6 +564,10 @@ msgstr "Charger les %(numResponses)s prochaines réponses" msgid "Are you sure you want to delete this post?" msgstr "Voulez-vous vraiment supprimer ce message ?" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "anonyme" @@ -1701,6 +1707,10 @@ msgstr "" "Format de fichier non supporté. Uploadez un fichier avec une extension " "tar.gz." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Replier toutes les Sections" diff --git a/conf/locale/hi/LC_MESSAGES/django.mo b/conf/locale/hi/LC_MESSAGES/django.mo index ed6abfefce40..0f43af7bdce7 100644 Binary files a/conf/locale/hi/LC_MESSAGES/django.mo and b/conf/locale/hi/LC_MESSAGES/django.mo differ diff --git a/conf/locale/hi/LC_MESSAGES/django.po b/conf/locale/hi/LC_MESSAGES/django.po index 2413377026fe..7dfaa7f13630 100644 --- a/conf/locale/hi/LC_MESSAGES/django.po +++ b/conf/locale/hi/LC_MESSAGES/django.po @@ -64,7 +64,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-28 05:40+0000\n" "Last-Translator: ria1234 \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/edx-platform/language/hi/)\n" @@ -201,6 +201,16 @@ msgstr "आप इस पाठ्यक्रम में दाखिल न msgid "Enrollment action is invalid" msgstr "नामांकन क्रिया अमान्य है" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -860,6 +870,10 @@ msgstr "" "दर्ज़ कर दिया गया है। जैसे ही एक प्रतिक्रिया वापिस आएगी, यह संदेश उस राय से " "बदल दिया जाएगा।" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "संकेत फ़ंक्शन {hintfn} के मूल्यांकन में त्रुटि {err}।" @@ -1896,6 +1910,8 @@ msgstr "कार्य पहले से ही चल रहा है।" #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/tools.py +#: lms/templates/instructor/instructor_dashboard_2/metrics.html +#: lms/templates/instructor/instructor_dashboard_2/metrics.html msgid "Username" msgstr "उपयोगकर्ता नाम" @@ -4070,7 +4086,7 @@ msgstr "" #: cms/djangoapps/course_creators/models.py msgid "Current course creator state" -msgstr "" +msgstr "वर्तमान पाठ्यक्रम निर्माता स्थिति" #: cms/djangoapps/course_creators/models.py msgid "" @@ -4151,7 +4167,8 @@ msgstr "पासवर्ड भूल गए?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "पासवर्ड" @@ -4533,11 +4550,47 @@ msgstr "कुछ गड़बड़ हो गई। कृपया बाद msgid "Please verify your new email" msgstr "कृपया अपना नया ई-मेल वैरीफ़ाई करें" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "बदलें" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "पासवर्ड रीसेट" @@ -5135,6 +5188,21 @@ msgstr "खाते की प्राथमिकताएं" msgid "Remember me" msgstr "मुझे याद रखें" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "बाहरी संसाधन" @@ -5308,7 +5376,7 @@ msgstr "रीसेट करें" #: lms/templates/problem.html msgid "Show Answer" -msgstr "" +msgstr "जवाब देखें" #: lms/templates/problem.html msgid "Reveal Answer" @@ -5488,6 +5556,26 @@ msgstr "आपका स्वागत है!" msgid "Register below to create your {platform_name} account" msgstr "अपने {platform_name} का खाता बनाने के लिए नीचे रजिस्टर करें" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "खाता खोलने के लिए कृपया नीचे दिए गए ख़ाने भरें। " @@ -5977,6 +6065,10 @@ msgstr "प्रतिलिपि डाउनलोड करें" msgid "{file_format}" msgstr "{file_format}" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "आपके शब्द:" @@ -6970,6 +7062,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "छात्र '{username}' ({email}) की पाठ्यक्रम प्रगति" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "{total:.3n} संभव अंकों में से {earned:.3n} " @@ -7678,10 +7774,6 @@ msgstr "" msgid "User Profile" msgstr "उपयोगकर्ता की प्रोफ़ाइल" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "सक्रिय कड़ियां" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7705,6 +7797,10 @@ msgstr "…" msgid "View discussion" msgstr "चर्चा देखें" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "सक्रिय कड़ियां" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7744,6 +7840,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7846,10 +7947,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/hi/LC_MESSAGES/djangojs.mo b/conf/locale/hi/LC_MESSAGES/djangojs.mo index 763db2bb2d7c..f393fd2c75fa 100644 Binary files a/conf/locale/hi/LC_MESSAGES/djangojs.mo and b/conf/locale/hi/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/hi/LC_MESSAGES/djangojs.po b/conf/locale/hi/LC_MESSAGES/djangojs.po index 84197adb1b11..02708ef50ef4 100644 --- a/conf/locale/hi/LC_MESSAGES/djangojs.po +++ b/conf/locale/hi/LC_MESSAGES/djangojs.po @@ -6,6 +6,7 @@ # Translators: # ammubhave , 2013-2014 # anantvima , 2014 +# Chandra Shekhar Sharma , 2014 # ria1234 , 2014 # ria1234 , 2014 # sarina , 2014 @@ -24,9 +25,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" -"Last-Translator: sarina \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-26 15:31+0000\n" +"Last-Translator: Chandra Shekhar Sharma \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/edx-platform/language/hi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -108,13 +109,13 @@ msgstr "" #: common/lib/xmodule/xmodule/js/src/capa/display.js #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Hide Answer" -msgstr "" +msgstr "जवाब छिपाएं" #. Translators: the word Answer here refers to the answer to a problem the #. student must solve.; #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Show Answer" -msgstr "" +msgstr "जवाब देखें" #: common/lib/xmodule/xmodule/js/src/capa/display.js msgid "Reveal Answer" @@ -360,6 +361,7 @@ msgstr " चर्चा दिखाएं" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "माफ़ करें" @@ -537,6 +539,10 @@ msgstr "अगला जवाब %(numResponses)s लोड करें" msgid "Are you sure you want to delete this post?" msgstr "क्या आप वाकई इस पोस्ट को हटाना चाहते हैं?" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "गुमनाम" @@ -1671,6 +1677,10 @@ msgstr "" "फ़ाइल फॉर्मेट समर्थित नहीं है. कृपया tar.gz एक्सटेंशन की फाइल " "अपलोड करें." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "फ़ाइल अपलोड करें" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "सभी वर्गों को संक्षिप्त करें" @@ -1772,15 +1782,15 @@ msgstr "आपके द्वारा किये गए परिवर् #: cms/static/js/views/xblock_editor.js msgid "Editor" -msgstr "" +msgstr "संपादक" #: cms/static/js/views/xblock_editor.js msgid "Settings" -msgstr "" +msgstr "सेटिंग्स" #: cms/static/js/views/modals/base_modal.js msgid "Save" -msgstr "" +msgstr "सेव करें" #: cms/static/js/views/modals/edit_xblock.js msgid "Component" diff --git a/conf/locale/hy_AM/LC_MESSAGES/django.mo b/conf/locale/hy_AM/LC_MESSAGES/django.mo index c6e64ef85614..6073bb03a5d4 100644 Binary files a/conf/locale/hy_AM/LC_MESSAGES/django.mo and b/conf/locale/hy_AM/LC_MESSAGES/django.mo differ diff --git a/conf/locale/hy_AM/LC_MESSAGES/django.po b/conf/locale/hy_AM/LC_MESSAGES/django.po index 63bc2faa5f26..220ff314d8a5 100644 --- a/conf/locale/hy_AM/LC_MESSAGES/django.po +++ b/conf/locale/hy_AM/LC_MESSAGES/django.po @@ -37,6 +37,7 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: +# pgayane , 2014 # #-#-#-#-# wiki.po (edx-platform) #-#-#-#-# # edX translation file # Copyright (C) 2014 edX @@ -47,7 +48,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-18 02:31+0000\n" "Last-Translator: nedbat \n" "Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/edx-platform/language/hy_AM/)\n" @@ -182,6 +183,16 @@ msgstr "Դուք գրանցված չեք այս դասընթացի համար" msgid "Enrollment action is invalid" msgstr "Գրացման գործողությունը սխալ է " +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -839,6 +850,10 @@ msgstr "" "Գրանցված է: Երբ պատասխանը ստացվի, այս հաղորդագրությունը կփոխարինվի այդ " "պատասխանով:" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "Սխալ {err} հուշող ֆունկցիայի {hintfn} մշակման ժամանակ" @@ -3955,7 +3970,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4296,11 +4312,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4849,6 +4901,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5175,6 +5242,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5645,6 +5732,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6568,6 +6659,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7231,10 +7326,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7258,6 +7349,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7297,6 +7392,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7399,10 +7499,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" @@ -11998,7 +12094,7 @@ msgstr "" # empty msgid "This is a key string." -msgstr "" +msgstr "Սա բանալի է" #: wiki/admin.py wiki/models/article.py msgid "created" diff --git a/conf/locale/hy_AM/LC_MESSAGES/djangojs.mo b/conf/locale/hy_AM/LC_MESSAGES/djangojs.mo index 95d386ac55f5..331b887d403d 100644 Binary files a/conf/locale/hy_AM/LC_MESSAGES/djangojs.mo and b/conf/locale/hy_AM/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/hy_AM/LC_MESSAGES/djangojs.po b/conf/locale/hy_AM/LC_MESSAGES/djangojs.po index ad12bfd199a5..a11edb6f7191 100644 --- a/conf/locale/hy_AM/LC_MESSAGES/djangojs.po +++ b/conf/locale/hy_AM/LC_MESSAGES/djangojs.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:18+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Armenian (Armenia) (http://www.transifex.com/projects/p/edx-platform/language/hy_AM/)\n" "MIME-Version: 1.0\n" @@ -337,6 +337,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -503,6 +504,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1553,6 +1558,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/id/LC_MESSAGES/django.mo b/conf/locale/id/LC_MESSAGES/django.mo index 1d47aee3f40d..f6505fea3b1b 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 11589701f02c..064276eeb652 100644 --- a/conf/locale/id/LC_MESSAGES/django.po +++ b/conf/locale/id/LC_MESSAGES/django.po @@ -57,7 +57,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-18 23:30+0000\n" "Last-Translator: Al Firdaus\n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/edx-platform/language/id/)\n" @@ -190,6 +190,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -830,6 +840,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3833,7 +3847,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4174,11 +4189,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4727,6 +4778,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5053,6 +5119,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5523,6 +5609,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6444,6 +6534,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7105,10 +7199,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7132,6 +7222,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7171,6 +7265,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7273,10 +7372,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/id/LC_MESSAGES/djangojs.mo b/conf/locale/id/LC_MESSAGES/djangojs.mo index da82fcb62344..31926211ec63 100644 Binary files a/conf/locale/id/LC_MESSAGES/djangojs.mo and b/conf/locale/id/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/id/LC_MESSAGES/djangojs.po b/conf/locale/id/LC_MESSAGES/djangojs.po index 9f3b2993f02b..e4b175d7626d 100644 --- a/conf/locale/id/LC_MESSAGES/djangojs.po +++ b/conf/locale/id/LC_MESSAGES/djangojs.po @@ -24,8 +24,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/edx-platform/language/id/)\n" "MIME-Version: 1.0\n" @@ -353,6 +353,7 @@ msgstr "Tampilkan Diskusi" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Maaf" @@ -524,6 +525,10 @@ msgstr "Memuat %(numResponses)s tanggapan berikutnya" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "anonim" @@ -1599,6 +1604,10 @@ msgstr "" "Format berkas tidak didukung. Mohon unggah berkas dengan ekstensi " "tar.gz." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Lipat Semua Bagian" diff --git a/conf/locale/it_IT/LC_MESSAGES/django.mo b/conf/locale/it_IT/LC_MESSAGES/django.mo index 92cd148d4173..9f5f75f6d818 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 a8a062e4bd25..7fcae6a82d3e 100644 --- a/conf/locale/it_IT/LC_MESSAGES/django.po +++ b/conf/locale/it_IT/LC_MESSAGES/django.po @@ -62,7 +62,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-04 17:12+0000\n" "Last-Translator: eevidal\n" "Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/edx-platform/language/it_IT/)\n" @@ -195,6 +195,16 @@ msgstr "Non sei iscritto a questo corso" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -835,6 +845,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3840,7 +3854,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4181,11 +4196,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4734,6 +4785,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5060,6 +5126,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5530,6 +5616,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6453,6 +6543,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7116,10 +7210,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7143,6 +7233,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7182,6 +7276,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7284,10 +7383,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/it_IT/LC_MESSAGES/djangojs.mo b/conf/locale/it_IT/LC_MESSAGES/djangojs.mo index 256cd29405ea..375a41788fda 100644 Binary files a/conf/locale/it_IT/LC_MESSAGES/djangojs.mo and b/conf/locale/it_IT/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/it_IT/LC_MESSAGES/djangojs.po b/conf/locale/it_IT/LC_MESSAGES/djangojs.po index 714a92e72fe9..3c76d986e120 100644 --- a/conf/locale/it_IT/LC_MESSAGES/djangojs.po +++ b/conf/locale/it_IT/LC_MESSAGES/djangojs.po @@ -30,8 +30,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:00+0000\n" "Last-Translator: sarina \n" "Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/edx-platform/language/it_IT/)\n" "MIME-Version: 1.0\n" @@ -353,6 +353,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -519,6 +520,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1585,6 +1590,10 @@ msgstr "" "Formato del file non supportato. Per favore carica un file con estensione " "tar.gz" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Nascondi Tutte le Sezioni" diff --git a/conf/locale/ja_JP/LC_MESSAGES/django.mo b/conf/locale/ja_JP/LC_MESSAGES/django.mo index 48f54f6e5757..9050d95a0a4d 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 e1bf8885c7b0..75f1a9303253 100644 --- a/conf/locale/ja_JP/LC_MESSAGES/django.po +++ b/conf/locale/ja_JP/LC_MESSAGES/django.po @@ -70,7 +70,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-02-24 17:06+0000\n" "Last-Translator: h_yoshida \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/edx-platform/language/ja_JP/)\n" @@ -203,6 +203,16 @@ msgstr "この講座に受講登録されていません。" msgid "Enrollment action is invalid" msgstr "登録は無効です" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "ログイン情報の受信にエラーが発生しました。 管理者へメールをお願いします。" @@ -843,6 +853,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3846,7 +3860,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4187,11 +4202,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4740,6 +4791,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5066,6 +5132,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5536,6 +5622,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6457,6 +6547,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7118,10 +7212,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "活動中のスレッド" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7145,6 +7235,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "活動中のスレッド" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7184,6 +7278,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7286,10 +7385,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo b/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo index 8697e2a7dcee..ec50a87cd485 100644 Binary files a/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo and b/conf/locale/ja_JP/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po index c447fd68c7db..719b56b6ebec 100644 --- a/conf/locale/ja_JP/LC_MESSAGES/djangojs.po +++ b/conf/locale/ja_JP/LC_MESSAGES/djangojs.po @@ -21,9 +21,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-18 12:00+0000\n" -"Last-Translator: h_yoshida \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" +"Last-Translator: sarina \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/edx-platform/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -339,6 +339,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -500,6 +501,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1544,6 +1549,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/ko_KR/LC_MESSAGES/django.mo b/conf/locale/ko_KR/LC_MESSAGES/django.mo index 21ab852bdb1c..53013434f710 100644 Binary files a/conf/locale/ko_KR/LC_MESSAGES/django.mo and b/conf/locale/ko_KR/LC_MESSAGES/django.mo differ diff --git a/conf/locale/ko_KR/LC_MESSAGES/django.po b/conf/locale/ko_KR/LC_MESSAGES/django.po index dc41de88735f..82e9d6b512d2 100644 --- a/conf/locale/ko_KR/LC_MESSAGES/django.po +++ b/conf/locale/ko_KR/LC_MESSAGES/django.po @@ -35,6 +35,7 @@ # 김 규동 , 2014 # jdpark7 , 2013 # chans , 2014 +# JiyeonLee , 2014 # SunahLim , 2013 # #-#-#-#-# messages.po (edx-platform) #-#-#-#-# # edX translation file @@ -57,7 +58,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-04-15 15:10+0000\n" "Last-Translator: 김 규동 \n" "Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/edx-platform/language/ko_KR/)\n" @@ -190,6 +191,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -830,6 +841,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3804,7 +3819,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4154,11 +4170,47 @@ msgstr "오류가 발생하였습니다. 다음에 다시 시도하십시요." msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "편집" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "암호 재설정" @@ -4722,6 +4774,21 @@ msgstr "계정 선호사항 설정" msgid "Remember me" msgstr "내 로그인 정보 기억" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5064,6 +5131,26 @@ msgstr "환영합니다!" msgid "Register below to create your {platform_name} account" msgstr "{platform_name} 계정을 만들기 위해서는 아래에 등록하세요." +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "계정에 등록하기 위해서는 다음 항목들을 입력하십시요." @@ -5540,6 +5627,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "당신의 단어들:" @@ -6476,6 +6567,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "학생 '{username}' ({email})의 강좌 진도" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7137,10 +7232,6 @@ msgstr "포럼이 현재 유지 관리 중입니다. 잠시후에 사용할 수 msgid "User Profile" msgstr "사용자 정보" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "활성화된 글타래" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7164,6 +7255,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "활성화된 글타래" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7203,6 +7298,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7305,10 +7405,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo b/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo index 73397da81bc2..967bb05ef382 100644 Binary files a/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo and b/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/ko_KR/LC_MESSAGES/djangojs.po b/conf/locale/ko_KR/LC_MESSAGES/djangojs.po index efac02ce7386..3ee0f0872848 100644 --- a/conf/locale/ko_KR/LC_MESSAGES/djangojs.po +++ b/conf/locale/ko_KR/LC_MESSAGES/djangojs.po @@ -20,8 +20,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Korean (Korea) (http://www.transifex.com/projects/p/edx-platform/language/ko_KR/)\n" "MIME-Version: 1.0\n" @@ -338,6 +338,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -499,6 +500,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1543,6 +1548,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/lt_LT/LC_MESSAGES/django.mo b/conf/locale/lt_LT/LC_MESSAGES/django.mo index b0dd9d80850d..1ac28fbf3f57 100644 Binary files a/conf/locale/lt_LT/LC_MESSAGES/django.mo and b/conf/locale/lt_LT/LC_MESSAGES/django.mo differ diff --git a/conf/locale/lt_LT/LC_MESSAGES/django.po b/conf/locale/lt_LT/LC_MESSAGES/django.po index c0c0e18409d5..2eba9cbd1bb7 100644 --- a/conf/locale/lt_LT/LC_MESSAGES/django.po +++ b/conf/locale/lt_LT/LC_MESSAGES/django.po @@ -23,6 +23,7 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: +# Eva Pavlova , 2014 # Gediminas Trakas , 2013-2014 # zzygis , 2013 # zzygis , 2013 @@ -54,7 +55,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-02-13 21:00+0000\n" "Last-Translator: Edukometrija \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/edx-platform/language/lt_LT/)\n" @@ -187,6 +188,16 @@ msgstr "Jūs nesate užsiregistravęs šiam kursui." msgid "Enrollment action is invalid" msgstr "Registracija negalima" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -836,6 +847,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3915,7 +3930,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4256,11 +4272,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4809,6 +4861,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5135,6 +5202,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5605,6 +5692,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6530,6 +6621,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7195,10 +7290,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7222,6 +7313,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7261,6 +7356,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7363,10 +7463,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo b/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo index 0be8b8a3597e..8e7ada4e2baa 100644 Binary files a/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo and b/conf/locale/lt_LT/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po index c8b958bdadfe..ee4a35250469 100644 --- a/conf/locale/lt_LT/LC_MESSAGES/djangojs.po +++ b/conf/locale/lt_LT/LC_MESSAGES/djangojs.po @@ -21,8 +21,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/edx-platform/language/lt_LT/)\n" "MIME-Version: 1.0\n" @@ -349,6 +349,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -520,6 +521,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1588,6 +1593,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/nb/LC_MESSAGES/django.mo b/conf/locale/nb/LC_MESSAGES/django.mo index 5d743a3f99a7..2294b1a5a4cb 100644 Binary files a/conf/locale/nb/LC_MESSAGES/django.mo and b/conf/locale/nb/LC_MESSAGES/django.mo differ diff --git a/conf/locale/nb/LC_MESSAGES/django.po b/conf/locale/nb/LC_MESSAGES/django.po index c63f509a1c3a..ca7105b54c12 100644 --- a/conf/locale/nb/LC_MESSAGES/django.po +++ b/conf/locale/nb/LC_MESSAGES/django.po @@ -70,7 +70,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-31 22:11+0000\n" "Last-Translator: Paalmessenlien \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/edx-platform/language/nb/)\n" @@ -205,6 +205,16 @@ msgstr "De er ikke meldt på dette kurset" msgid "Enrollment action is invalid" msgstr "Ugyldig påmeldingsvalg" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -862,6 +872,10 @@ msgid "" msgstr "" "Levert. Når du får svar, blir denne meldingen erstattet av tilbakemeldingen." +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "Error {err} in evaluating hint function {hintfn}." @@ -4106,7 +4120,8 @@ msgstr "Glemt passord?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "Passord" @@ -4453,11 +4468,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "rediger" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Nullstill passord" @@ -5012,6 +5063,21 @@ msgstr "Kontoinnstillinger" msgid "Remember me" msgstr "Husk meg" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5342,6 +5408,26 @@ msgstr "Velkommen!" msgid "Register below to create your {platform_name} account" msgstr "Registrer nedenfor for å lage din {platform_name} konto" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "Fyll ut følgende felt for å opprette en konto." @@ -5812,6 +5898,10 @@ msgstr "" msgid "{file_format}" msgstr "{file_format}" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "Dine ord:" @@ -6737,6 +6827,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "Kursfremgang for studenten '{username}' ({email})" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7402,10 +7496,6 @@ msgstr "" msgid "User Profile" msgstr "Brukerprofil" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "Aktive tråder" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7429,6 +7519,10 @@ msgstr "…" msgid "View discussion" msgstr "Se diskusjon" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "Aktive tråder" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7468,6 +7562,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7570,10 +7669,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/nb/LC_MESSAGES/djangojs.mo b/conf/locale/nb/LC_MESSAGES/djangojs.mo index c30df4bf59d1..c345001d6899 100644 Binary files a/conf/locale/nb/LC_MESSAGES/djangojs.mo and b/conf/locale/nb/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/nb/LC_MESSAGES/djangojs.po b/conf/locale/nb/LC_MESSAGES/djangojs.po index dc238866ed0a..d60c8f028b8c 100644 --- a/conf/locale/nb/LC_MESSAGES/djangojs.po +++ b/conf/locale/nb/LC_MESSAGES/djangojs.po @@ -16,15 +16,16 @@ # # Translators: # aalst , 2014 +# Erland Flaten , 2014 # Frode , 2014 # Paalmessenlien , 2014 msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" -"Last-Translator: sarina \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 19:11+0000\n" +"Last-Translator: Frode \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/edx-platform/language/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -345,6 +346,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -511,6 +513,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1367,14 +1373,14 @@ msgstr "Lagrer…" #: cms/static/coffee/src/views/tabs.js msgid "Delete Component Confirmation" -msgstr "Slett komponent godkjenning" +msgstr "Slett komponent bekreftelse" #: cms/static/coffee/src/views/tabs.js msgid "" "Are you sure you want to delete this component? This action cannot be " "undone." msgstr "" -"Er du sikker op at du vil slette dette komponenten? Dette kan ikke angres." +"Er du sikker på at du vil slette dette komponenten? Dette kan ikke angres." #: cms/static/coffee/src/views/tabs.js cms/static/coffee/src/views/unit.js #: cms/static/js/base.js cms/static/js/views/course_info_update.js @@ -1553,7 +1559,7 @@ msgstr "Last opp en ny PDF til “<%= name %>”" #: cms/static/js/views/edit_chapter.js msgid "Please select a PDF file to upload." -msgstr "" +msgstr "Velg PDF fil som skal lastes opp" #: cms/static/js/views/edit_textbook.js #: cms/static/js/views/overview_assignment_grader.js @@ -1572,6 +1578,10 @@ msgstr "" "Filformatet støttes ikke. Vennligst last opp en fil med tar.gz " "extension." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "Last opp fil" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Kollaps alle seksjoner" @@ -1594,11 +1604,11 @@ msgstr "Rediger seksjonens releasedato" #: cms/static/js/views/overview_assignment_grader.js msgid "Not Graded" -msgstr "Ikke gradert" +msgstr "Ikke rettet" #: cms/static/js/views/paging.js msgid "ascending" -msgstr "øker" +msgstr "stigende" #: cms/static/js/views/paging.js msgid "descending" @@ -1640,7 +1650,7 @@ msgstr "Sletter" #: cms/static/js/views/uploads.js msgid "Upload" -msgstr "" +msgstr "Last opp" #: cms/static/js/views/uploads.js msgid "We're sorry, there was an error" @@ -1675,23 +1685,23 @@ msgstr "Dine endringer er lagret" #: cms/static/js/views/xblock_editor.js msgid "Editor" -msgstr "" +msgstr "Editor" #: cms/static/js/views/xblock_editor.js msgid "Settings" -msgstr "" +msgstr "Innstillinger" #: cms/static/js/views/modals/base_modal.js msgid "Save" -msgstr "" +msgstr "Lagre" #: cms/static/js/views/modals/edit_xblock.js msgid "Component" -msgstr "" +msgstr "Component" #: cms/static/js/views/modals/edit_xblock.js msgid "Editing: %(title)s" -msgstr "" +msgstr "Redigerer: %(title)s" #: cms/static/js/views/settings/advanced.js msgid "" @@ -1732,4 +1742,4 @@ msgstr "" #: cms/static/js/views/video/translations_editor.js msgid "Upload translation" -msgstr "" +msgstr "Last opp oversettelse" diff --git a/conf/locale/nl_NL/LC_MESSAGES/django.mo b/conf/locale/nl_NL/LC_MESSAGES/django.mo index 5a56011b8395..377f7bf23c7e 100644 Binary files a/conf/locale/nl_NL/LC_MESSAGES/django.mo and b/conf/locale/nl_NL/LC_MESSAGES/django.mo differ diff --git a/conf/locale/nl_NL/LC_MESSAGES/django.po b/conf/locale/nl_NL/LC_MESSAGES/django.po index 9d91f7b8e6a6..3483818cbbba 100644 --- a/conf/locale/nl_NL/LC_MESSAGES/django.po +++ b/conf/locale/nl_NL/LC_MESSAGES/django.po @@ -29,6 +29,7 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: +# kajhuisman , 2014 # #-#-#-#-# messages.po (edx-platform) #-#-#-#-# # edX translation file # Copyright (C) 2013 edX @@ -43,13 +44,14 @@ # # Translators: # GlassParade , 2014 +# kajhuisman , 2014 msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" -"PO-Revision-Date: 2014-03-11 15:31+0000\n" -"Last-Translator: GlassParade \n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" +"PO-Revision-Date: 2014-04-25 11:30+0000\n" +"Last-Translator: kajhuisman \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/edx-platform/language/nl_NL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -180,6 +182,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -825,6 +837,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3825,7 +3841,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4166,11 +4183,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "wijzig" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Reset Wachtwoord" @@ -4719,6 +4772,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5045,6 +5113,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5515,6 +5603,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6438,6 +6530,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7100,10 +7196,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7127,6 +7219,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7166,6 +7262,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7268,10 +7369,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/nl_NL/LC_MESSAGES/djangojs.mo b/conf/locale/nl_NL/LC_MESSAGES/djangojs.mo index d65e7207f329..4ab707aadf73 100644 Binary files a/conf/locale/nl_NL/LC_MESSAGES/djangojs.mo and b/conf/locale/nl_NL/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/nl_NL/LC_MESSAGES/djangojs.po b/conf/locale/nl_NL/LC_MESSAGES/djangojs.po index 1ccea743924a..08daae21d8ff 100644 --- a/conf/locale/nl_NL/LC_MESSAGES/djangojs.po +++ b/conf/locale/nl_NL/LC_MESSAGES/djangojs.po @@ -11,12 +11,13 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: +# kajhuisman , 2014 msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:18+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:01+0000\n" "Last-Translator: sarina \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/edx-platform/language/nl_NL/)\n" "MIME-Version: 1.0\n" @@ -338,6 +339,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -504,6 +506,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "anoniem" @@ -1554,6 +1560,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/pl/LC_MESSAGES/django.mo b/conf/locale/pl/LC_MESSAGES/django.mo index 77f0de47f8bf..d9678c07ba06 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 9f1493627637..c3748c4e6731 100644 --- a/conf/locale/pl/LC_MESSAGES/django.po +++ b/conf/locale/pl/LC_MESSAGES/django.po @@ -29,6 +29,7 @@ # kmti , 2014 # lazarus_zamenhof , 2014 # Cairath, 2014 +# Oninix , 2014 # rutek , 2014 # kmti , 2014 # ajafo , 2014 @@ -61,7 +62,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-14 16:10+0000\n" "Last-Translator: Cairath\n" "Language-Team: Polish (http://www.transifex.com/projects/p/edx-platform/language/pl/)\n" @@ -194,6 +195,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -834,6 +845,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3833,7 +3848,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4172,11 +4188,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4725,6 +4777,21 @@ msgstr "Ustawienia konta" msgid "Remember me" msgstr "Zapamiętaj" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5051,6 +5118,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5521,6 +5608,10 @@ msgstr "" msgid "{file_format}" msgstr "{file_format}" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6446,6 +6537,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7106,10 +7201,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7133,6 +7224,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7172,6 +7267,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7274,10 +7374,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/pl/LC_MESSAGES/djangojs.mo b/conf/locale/pl/LC_MESSAGES/djangojs.mo index 9fb7bd6fb080..a5f5cd9d04b5 100644 Binary files a/conf/locale/pl/LC_MESSAGES/djangojs.mo and b/conf/locale/pl/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/pl/LC_MESSAGES/djangojs.po b/conf/locale/pl/LC_MESSAGES/djangojs.po index 347b5552ba4e..d1912b474591 100644 --- a/conf/locale/pl/LC_MESSAGES/djangojs.po +++ b/conf/locale/pl/LC_MESSAGES/djangojs.po @@ -23,8 +23,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Polish (http://www.transifex.com/projects/p/edx-platform/language/pl/)\n" "MIME-Version: 1.0\n" @@ -351,6 +351,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -522,6 +523,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1579,6 +1584,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/pt_BR/LC_MESSAGES/django.mo b/conf/locale/pt_BR/LC_MESSAGES/django.mo index c70c8ea48b1c..4b3eadb09145 100644 Binary files a/conf/locale/pt_BR/LC_MESSAGES/django.mo and b/conf/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/conf/locale/pt_BR/LC_MESSAGES/django.po b/conf/locale/pt_BR/LC_MESSAGES/django.po index f6299b02abc2..a0786411fee9 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/django.po +++ b/conf/locale/pt_BR/LC_MESSAGES/django.po @@ -103,7 +103,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-03-26 06:01+0000\n" "Last-Translator: Álex Filipe \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/edx-platform/language/pt_BR/)\n" @@ -237,6 +237,16 @@ msgstr "Você não está matriculado neste curso" msgid "Enrollment action is invalid" msgstr "Ação de matrícula inválida" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -897,6 +907,10 @@ msgstr "" "Enviado. Assim que uma resposta seja retornada esta mensagem será " "substituída pelo feedback." +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "Ocorreu um erro {err} ao avaliar a função de sugestão {hintfn}." @@ -4166,7 +4180,8 @@ msgstr "Esqueceu a senha?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "Senha" @@ -4547,11 +4562,47 @@ msgstr "Ocorreu um erro. Por favor tente novamente mais tarde." msgid "Please verify your new email" msgstr "Por favor verifique a sua nova mensagem de email" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "editar" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Redefinir senha" @@ -5136,6 +5187,21 @@ msgstr "Preferências da conta" msgid "Remember me" msgstr "Lembrar minhas informações" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "Recurso externo" @@ -5495,6 +5561,26 @@ msgstr "Bem-vindo!" msgid "Register below to create your {platform_name} account" msgstr "Faça sua inscrição abaixo para criar sua conta na {platform_name} " +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5984,6 +6070,10 @@ msgstr "" msgid "{file_format}" msgstr "{file_format}" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "Suas palavras:" @@ -6971,6 +7061,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "Progresso do Curso do Aluno '{username}' ({email})" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "{earned:.3n} de {total:.3n} pontos possíveis" @@ -7646,10 +7740,6 @@ msgstr "" msgid "User Profile" msgstr "Perfil do Usuário" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "Tópicos Ativos" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7673,6 +7763,10 @@ msgstr "…" msgid "View discussion" msgstr "Ver discussão" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "Tópicos Ativos" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7712,6 +7806,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7814,10 +7913,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo b/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo index bce7f9d67e30..3730a0344189 100644 Binary files a/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo and b/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po index 630a5248e6fc..4657229def19 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -37,9 +37,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 22:20+0000\n" -"Last-Translator: Álex Filipe \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" +"Last-Translator: sarina \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/edx-platform/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -360,6 +360,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Desculpe" @@ -528,6 +529,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "anônimo" @@ -1605,6 +1610,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/sl/LC_MESSAGES/django.mo b/conf/locale/sl/LC_MESSAGES/django.mo index 122abae38108..054b4a641e47 100644 Binary files a/conf/locale/sl/LC_MESSAGES/django.mo and b/conf/locale/sl/LC_MESSAGES/django.mo differ diff --git a/conf/locale/sl/LC_MESSAGES/django.po b/conf/locale/sl/LC_MESSAGES/django.po index 0200dc7abe63..3bee4553cadd 100644 --- a/conf/locale/sl/LC_MESSAGES/django.po +++ b/conf/locale/sl/LC_MESSAGES/django.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: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-02-06 03:04+0000\n" "Last-Translator: nedbat \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/edx-platform/language/sl/)\n" @@ -173,6 +173,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -813,6 +823,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3816,7 +3830,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4157,11 +4172,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4710,6 +4761,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5036,6 +5102,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5506,6 +5592,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6433,6 +6523,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7100,10 +7194,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7127,6 +7217,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7166,6 +7260,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7268,10 +7367,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/sl/LC_MESSAGES/djangojs.mo b/conf/locale/sl/LC_MESSAGES/djangojs.mo index f2913c5c50bc..ed69c208890a 100644 Binary files a/conf/locale/sl/LC_MESSAGES/djangojs.mo and b/conf/locale/sl/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/sl/LC_MESSAGES/djangojs.po b/conf/locale/sl/LC_MESSAGES/djangojs.po index 852200685db5..363300f5dd0d 100644 --- a/conf/locale/sl/LC_MESSAGES/djangojs.po +++ b/conf/locale/sl/LC_MESSAGES/djangojs.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:18+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:00+0000\n" "Last-Translator: sarina \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/edx-platform/language/sl/)\n" "MIME-Version: 1.0\n" @@ -349,6 +349,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -525,6 +526,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1598,6 +1603,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/tr_TR/LC_MESSAGES/django.mo b/conf/locale/tr_TR/LC_MESSAGES/django.mo index 31cadf9fc761..74fc6d99b586 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 dbbe9f4f0917..cfcf2ae289ba 100644 --- a/conf/locale/tr_TR/LC_MESSAGES/django.po +++ b/conf/locale/tr_TR/LC_MESSAGES/django.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: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-02-24 17:06+0000\n" "Last-Translator: Hakan Senel \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/edx-platform/language/tr_TR/)\n" @@ -208,6 +208,16 @@ msgstr "Bu ders için kaydolmadınız " msgid "Enrollment action is invalid" msgstr "Kayıt işlemi başarısız" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "Giriş bilgilerinizi alırken bir hata oluştu. Lütfen bize eposta atın." @@ -868,6 +878,10 @@ msgstr "" "Yüklendi. Ne zaman bir cevap dönerse, bu mesaj o geribeslemeyle yer " "değiştirecektir." +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "Tavsiye fonksiyonunda {hintfn} hata {err} " @@ -4154,7 +4168,8 @@ msgstr "Şifremi unuttum" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "Şifre" @@ -4529,11 +4544,47 @@ msgstr "Bir hata oluştu. Lütfen daha sonra tekrar deneyin" msgid "Please verify your new email" msgstr "Yeni e-postanızı onaylayınız" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "düzenle" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Parola Sıfırla" @@ -5124,6 +5175,21 @@ msgstr "Hesap Ayarları" msgid "Remember me" msgstr "Beni hatırla" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "Dış kaynak" @@ -5479,6 +5545,26 @@ msgstr "Hoşgeldiniz!" msgid "Register below to create your {platform_name} account" msgstr "{platform_name} hesabınızı oluşturmak için aşağıda kaydolun" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "Kayıt olmak için lütfen aşağıdaki gerekli alanları tamamlayın." @@ -5966,6 +6052,10 @@ msgstr "Altyazı indir" msgid "{file_format}" msgstr "{file_format}" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "Senin kelimelerin:" @@ -6957,6 +7047,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "Öğrenci için Ders Gidişatı {username}' ({email})" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "{total:.3n} puanın büyük olasılıkla {earned:.3n}'ü " @@ -7661,10 +7755,6 @@ msgstr "Forumda bakım yapılıyor. En kısa zamanda çalışır hale getireceğ msgid "User Profile" msgstr "Kullanıcı Profili" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "Aktif Tehlikeler" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7688,6 +7778,10 @@ msgstr "..." msgid "View discussion" msgstr "Tartışamayı görüntüle" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "Aktif Tehlikeler" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7727,6 +7821,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7829,10 +7928,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo b/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo index 5f2193c1b255..8d36c3a5f306 100644 Binary files a/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo and b/conf/locale/tr_TR/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po index cef166968f3a..45518fbc3ec2 100644 --- a/conf/locale/tr_TR/LC_MESSAGES/djangojs.po +++ b/conf/locale/tr_TR/LC_MESSAGES/djangojs.po @@ -4,7 +4,7 @@ # This file is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE. # # Translators: -# brscvs , 2013 +# brscvs , 2013-2014 # brscvs , 2013 # burakozalp , 2013 # burakozalp , 2013 @@ -30,9 +30,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-13 10:40+0000\n" -"Last-Translator: Hakan Senel \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 17:38+0000\n" +"Last-Translator: brscvs \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/edx-platform/language/tr_TR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -359,6 +359,7 @@ msgstr "Tartışmayı Göster" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "Özür Dilerim" @@ -531,6 +532,10 @@ msgstr "Bir sonraki %(numResponses)s yanıtları yükle" msgid "Are you sure you want to delete this post?" msgstr "Bu gönderiyi silmek istiyor musunuz?" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "anonim" @@ -1669,6 +1674,10 @@ msgstr "" "Dosya formatı desteklenmiyor. Lütfen dosyayı tar.gz uzantısı " "ile yükleyiniz." +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "Dosya yükle" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Bütün Bölümleri Daralt" @@ -1737,7 +1746,7 @@ msgstr "Siliniyor" #: cms/static/js/views/uploads.js msgid "Upload" -msgstr "" +msgstr "Yükle" #: cms/static/js/views/uploads.js msgid "We're sorry, there was an error" @@ -1782,11 +1791,11 @@ msgstr "Kaydet" #: cms/static/js/views/modals/edit_xblock.js msgid "Component" -msgstr "" +msgstr "Bileşen" #: cms/static/js/views/modals/edit_xblock.js msgid "Editing: %(title)s" -msgstr "" +msgstr "Düzeltiliyor: %(title)s" #: cms/static/js/views/settings/advanced.js msgid "" diff --git a/conf/locale/uk/LC_MESSAGES/django.mo b/conf/locale/uk/LC_MESSAGES/django.mo index 9406fa911149..cb67935c8431 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 1cc6f910281f..54fdcfad684b 100644 --- a/conf/locale/uk/LC_MESSAGES/django.po +++ b/conf/locale/uk/LC_MESSAGES/django.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: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-04-18 01:40+0000\n" "Last-Translator: nedbat \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/edx-platform/language/uk/)\n" @@ -173,6 +173,16 @@ msgstr "" msgid "Enrollment action is invalid" msgstr "" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -813,6 +823,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3816,7 +3830,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4157,11 +4172,47 @@ msgstr "" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "" @@ -4710,6 +4761,21 @@ msgstr "" msgid "Remember me" msgstr "" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5036,6 +5102,26 @@ msgstr "" msgid "Register below to create your {platform_name} account" msgstr "" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "" @@ -5506,6 +5592,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6431,6 +6521,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7096,10 +7190,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7123,6 +7213,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7162,6 +7256,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7264,10 +7363,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/uk/LC_MESSAGES/djangojs.mo b/conf/locale/uk/LC_MESSAGES/djangojs.mo index 1369634dd282..24dd482e4796 100644 Binary files a/conf/locale/uk/LC_MESSAGES/djangojs.mo and b/conf/locale/uk/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/uk/LC_MESSAGES/djangojs.po b/conf/locale/uk/LC_MESSAGES/djangojs.po index 6e9b1fec7e4c..69dab0963f29 100644 --- a/conf/locale/uk/LC_MESSAGES/djangojs.po +++ b/conf/locale/uk/LC_MESSAGES/djangojs.po @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:18+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/edx-platform/language/uk/)\n" "MIME-Version: 1.0\n" @@ -344,6 +344,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -515,6 +516,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1571,6 +1576,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "" diff --git a/conf/locale/vi/LC_MESSAGES/django.mo b/conf/locale/vi/LC_MESSAGES/django.mo index ba2333f19c2e..38690fe37ffc 100644 Binary files a/conf/locale/vi/LC_MESSAGES/django.mo and b/conf/locale/vi/LC_MESSAGES/django.mo differ diff --git a/conf/locale/vi/LC_MESSAGES/django.po b/conf/locale/vi/LC_MESSAGES/django.po index 0ff29ccf0d0d..7c2abb067fe2 100644 --- a/conf/locale/vi/LC_MESSAGES/django.po +++ b/conf/locale/vi/LC_MESSAGES/django.po @@ -90,7 +90,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-04-15 05:10+0000\n" "Last-Translator: JosephTrong \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/edx-platform/language/vi/)\n" @@ -223,6 +223,16 @@ msgstr "Bạn chưa được ghi danh vào khóa học này" msgid "Enrollment action is invalid" msgstr "Hành động ghi danh không hợp lệ" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "" @@ -869,6 +879,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -3950,7 +3964,8 @@ msgstr "Quên mật khẩu?" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4297,11 +4312,47 @@ msgstr "Có lỗi xảy ra. Xin thử lại sau." msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "chỉnh sửa" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "Đặt Lại Mật Khẩu" @@ -4870,6 +4921,21 @@ msgstr "" msgid "Remember me" msgstr "Ghi nhớ" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5213,6 +5279,26 @@ msgstr "Chào mừng!" msgid "Register below to create your {platform_name} account" msgstr "Đăng ký tài khoản {platform_name} của bạn" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "Vui lòng điền thông tin cho tài khoản của bạn." @@ -5683,6 +5769,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "" @@ -6604,6 +6694,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7267,10 +7361,6 @@ msgstr "" msgid "User Profile" msgstr "" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7294,6 +7384,10 @@ msgstr "" msgid "View discussion" msgstr "Xem thảo luận" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7333,6 +7427,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7435,10 +7534,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" diff --git a/conf/locale/vi/LC_MESSAGES/djangojs.mo b/conf/locale/vi/LC_MESSAGES/djangojs.mo index 92965b65d083..a393a52021dc 100644 Binary files a/conf/locale/vi/LC_MESSAGES/djangojs.mo and b/conf/locale/vi/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/vi/LC_MESSAGES/djangojs.po b/conf/locale/vi/LC_MESSAGES/djangojs.po index 13cd3b8bb341..22788c2f4ca1 100644 --- a/conf/locale/vi/LC_MESSAGES/djangojs.po +++ b/conf/locale/vi/LC_MESSAGES/djangojs.po @@ -30,8 +30,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/edx-platform/language/vi/)\n" "MIME-Version: 1.0\n" @@ -348,6 +348,7 @@ msgstr "" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "" @@ -509,6 +510,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "" @@ -1571,6 +1576,10 @@ msgid "" "extension." msgstr "" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "Thu Gọn Tất Cả Mục" diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.mo b/conf/locale/zh_CN/LC_MESSAGES/django.mo index 164862c14df9..fb90e5456d21 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 923d0961a1fb..04db7ca7bfb0 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/django.po +++ b/conf/locale/zh_CN/LC_MESSAGES/django.po @@ -157,9 +157,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" -"PO-Revision-Date: 2014-04-16 08:31+0000\n" -"Last-Translator: jiangnan.hugo \n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" +"PO-Revision-Date: 2014-04-24 12:34+0000\n" +"Last-Translator: pku9104038 \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/edx-platform/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -174,7 +174,7 @@ msgstr "" #. needs to grade #: cms/djangoapps/contentstore/utils.py common/lib/xmodule/xmodule/tabs.py msgid "Open Ended Panel" -msgstr "" +msgstr "开放问题面板" #: common/djangoapps/course_modes/models.py msgid "Honor Code Certificate" @@ -198,76 +198,76 @@ msgstr "未选择价格或选择的价格过低。" #: common/djangoapps/django_comment_common/models.py msgid "Administrator" -msgstr "" +msgstr "管理员" #: common/djangoapps/django_comment_common/models.py msgid "Moderator" -msgstr "" +msgstr "版主" #: common/djangoapps/django_comment_common/models.py msgid "Community TA" -msgstr "" +msgstr "社区助教" #: common/djangoapps/django_comment_common/models.py msgid "Student" -msgstr "" +msgstr "学生" #: common/djangoapps/student/middleware.py msgid "" "Your account has been disabled. If you believe this was done in error, " "please contact us at {link_start}{support_email}{link_end}" -msgstr "" +msgstr "您的账号已被停用。如果您有疑问,请通过{link_start}{support_email}{link_end}联系我们。" #: common/djangoapps/student/middleware.py msgid "Disabled Account" -msgstr "" +msgstr "已停用账号" #: common/djangoapps/student/models.py msgid "Male" -msgstr "" +msgstr "男" #: common/djangoapps/student/models.py msgid "Female" -msgstr "" +msgstr "女" #. Translators: 'Other' refers to the student's gender #. Translators: 'Other' refers to the student's level of education #: common/djangoapps/student/models.py common/djangoapps/student/models.py msgid "Other" -msgstr "" +msgstr "其他" #: common/djangoapps/student/models.py msgid "Doctorate" -msgstr "" +msgstr "博士" #: common/djangoapps/student/models.py msgid "Master's or professional degree" -msgstr "" +msgstr "硕士" #: common/djangoapps/student/models.py msgid "Bachelor's degree" -msgstr "" +msgstr "学士" #: common/djangoapps/student/models.py msgid "Associate's degree" -msgstr "" +msgstr "专科" #: common/djangoapps/student/models.py msgid "Secondary/high school" -msgstr "" +msgstr "高中" #: common/djangoapps/student/models.py msgid "Junior secondary/junior high/middle school" -msgstr "" +msgstr "初中" #: common/djangoapps/student/models.py msgid "Elementary/primary school" -msgstr "" +msgstr "小学" #. Translators: 'None' refers to the student's level of education #: common/djangoapps/student/models.py msgid "None" -msgstr "" +msgstr "无" #: common/djangoapps/student/views.py msgid "Course id not specified" @@ -278,9 +278,8 @@ msgid "Course id is invalid" msgstr "课程编号无效" #: common/djangoapps/student/views.py -#: lms/templates/courseware/course_about.html msgid "Course is full" -msgstr "" +msgstr "该课程已满" #: common/djangoapps/student/views.py msgid "You are not enrolled in this course" @@ -290,6 +289,16 @@ msgstr "您还没有注册本课程" msgid "Enrollment action is invalid" msgstr "注册操作无效" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "接受您的登录信息时出现错误,请发电子邮件给我们。" @@ -298,14 +307,14 @@ msgstr "接受您的登录信息时出现错误,请发电子邮件给我们。 msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." -msgstr "" +msgstr "由于过多的登录失败该账号被暂时锁定。请稍晚一点再重新尝试。" #: common/djangoapps/student/views.py msgid "" "Your password has expired due to password policy on this account. You must " "reset your password before you can log in again. Please click the Forgot " "Password\" link on this page to reset your password before logging in again." -msgstr "" +msgstr "根据本站安全策略,您的密码已经过期。您必须重新变更密码方可登录。请点击本页面的“忘记密码”来修改您的密码" #: common/djangoapps/student/views.py msgid "Too many failed login attempts. Try again later." @@ -328,27 +337,27 @@ msgstr "该账号尚未激活。我们已经重新发送账号激活操作信息 #: common/djangoapps/student/views.py msgid "Please enter a username" -msgstr "" +msgstr "请输入用户名" #: common/djangoapps/student/views.py msgid "Please choose an option" -msgstr "" +msgstr "请选择" #: common/djangoapps/student/views.py msgid "User with username {} does not exist" -msgstr "" +msgstr "用户名 {} 不存在" #: common/djangoapps/student/views.py msgid "Successfully disabled {}'s account" -msgstr "" +msgstr "成功停用{}的账号" #: common/djangoapps/student/views.py msgid "Successfully reenabled {}'s account" -msgstr "" +msgstr "成功重新启用{}的账号" #: common/djangoapps/student/views.py msgid "Unexpected account status" -msgstr "" +msgstr "异常账号状态" #: common/djangoapps/student/views.py msgid "An account with the Public Username '{username}' already exists." @@ -372,63 +381,63 @@ msgstr "您必须接受本服务条款。" #: common/djangoapps/student/views.py msgid "Username must be minimum of two characters long" -msgstr "" +msgstr "用户名至少得两个字符串" #: common/djangoapps/student/views.py msgid "A properly formatted e-mail is required" -msgstr "" +msgstr "需要正确的邮件格式" #: common/djangoapps/student/views.py msgid "Your legal name must be a minimum of two characters long" -msgstr "" +msgstr "你的合法名字必须至少包含两个字符的长度" #: common/djangoapps/student/views.py msgid "A valid password is required" -msgstr "" +msgstr "需要一个有效的密码" #: common/djangoapps/student/views.py msgid "Accepting Terms of Service is required" -msgstr "" +msgstr "需要接受服务条款" #: common/djangoapps/student/views.py msgid "Agreeing to the Honor Code is required" -msgstr "" +msgstr "需要同意荣誉法则" #: common/djangoapps/student/views.py msgid "A level of education is required" -msgstr "" +msgstr "需要以上学历" #: common/djangoapps/student/views.py msgid "Your gender is required" -msgstr "" +msgstr "你的性别是必填项" #: common/djangoapps/student/views.py msgid "Your year of birth is required" -msgstr "" +msgstr "你的出生年份是必填项" #: common/djangoapps/student/views.py msgid "Your mailing address is required" -msgstr "" +msgstr "你的邮件地址是必填项" #: common/djangoapps/student/views.py msgid "A description of your goals is required" -msgstr "" +msgstr "你的目标描述是必填项" #: common/djangoapps/student/views.py msgid "A city is required" -msgstr "" +msgstr "城市是必填项" #: common/djangoapps/student/views.py msgid "A country is required" -msgstr "" +msgstr "国家是必填项" #: common/djangoapps/student/views.py msgid "Username cannot be more than {0} characters long" -msgstr "" +msgstr "用户名不能超过{0}字符长度" #: common/djangoapps/student/views.py msgid "Email cannot be more than {0} characters long" -msgstr "" +msgstr "电子邮件不能超过{0}字符长度" #: common/djangoapps/student/views.py msgid "Valid e-mail is required." @@ -440,7 +449,7 @@ msgstr "用户名只能包含英文字母A-Z大小写和阿拉伯数字0-9,不 #: common/djangoapps/student/views.py common/djangoapps/student/views.py msgid "Password: " -msgstr "" +msgstr "密码: " #: common/djangoapps/student/views.py msgid "Could not send activation e-mail." @@ -454,17 +463,17 @@ msgstr "未知错误。请给我们发电子邮件,告知错误是如何发生 msgid "" "You are re-using a password that you have used recently. You must have {0} " "distinct password(s) before reusing a previous password." -msgstr "" +msgstr "您的密码最近使用过。至少使用过({0})个不同密码之后才可以重新使用先前的密码" #: common/djangoapps/student/views.py msgid "" "You are resetting passwords too frequently. Due to security policies, {0} " "day(s) must elapse between password resets" -msgstr "" +msgstr "密码变更太频繁。根据安全本站策略,变更密码必须间隔( {0}) 天" #: common/djangoapps/student/views.py msgid "Password reset unsuccessful" -msgstr "" +msgstr "重新设置密码不成功" #: common/djangoapps/student/views.py msgid "No inactive user with this e-mail exists" @@ -504,7 +513,7 @@ msgstr "无效的ID" #. See http://strftime.org for details. #: common/djangoapps/util/date_utils.py msgid "LONG_DATE_FORMAT" -msgstr "" +msgstr "%Y年%m月%d日" #. Translators: the translation for "DATE_TIME_FORMAT" must be a format #. string for formatting dates with times. For example, the American @@ -512,7 +521,7 @@ msgstr "" #. See http://strftime.org for details. #: common/djangoapps/util/date_utils.py msgid "DATE_TIME_FORMAT" -msgstr "" +msgstr "%Y年%m月%d日 %H:%M" #. Translators: the translation for "SHORT_DATE_FORMAT" must be a #. format string for formatting dates in a brief form. For example, @@ -520,14 +529,14 @@ msgstr "" #. See http://strftime.org for details. #: common/djangoapps/util/date_utils.py msgid "SHORT_DATE_FORMAT" -msgstr "" +msgstr "%Y/%m/%d" #. Translators: the translation for "TIME_FORMAT" must be a format #. string for formatting times. For example, the American English #. form is "%H:%M:%S". See http://strftime.org for details. #: common/djangoapps/util/date_utils.py msgid "TIME_FORMAT" -msgstr "" +msgstr "%H:%M:%S" #. Translators: This is an AM/PM indicator for displaying times. It is #. used for the %p directive in date-time formats. See http://strftime.org @@ -535,7 +544,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "am/pm indicator" msgid "AM" -msgstr "" +msgstr "上午" #. Translators: This is an AM/PM indicator for displaying times. It is #. used for the %p directive in date-time formats. See http://strftime.org @@ -543,7 +552,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "am/pm indicator" msgid "PM" -msgstr "" +msgstr "下午" #. Translators: this is a weekday name that will be used when displaying #. dates, as in "Monday Februrary 10, 2014". It is used for the %A @@ -551,7 +560,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "weekday name" msgid "Monday" -msgstr "" +msgstr "星期一" #. Translators: this is a weekday name that will be used when displaying #. dates, as in "Tuesday Februrary 11, 2014". It is used for the %A @@ -559,7 +568,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "weekday name" msgid "Tuesday" -msgstr "" +msgstr "星期二" #. Translators: this is a weekday name that will be used when displaying #. dates, as in "Wednesday Februrary 12, 2014". It is used for the %A @@ -567,7 +576,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "weekday name" msgid "Wednesday" -msgstr "" +msgstr "星期三" #. Translators: this is a weekday name that will be used when displaying #. dates, as in "Thursday Februrary 13, 2014". It is used for the %A @@ -575,7 +584,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "weekday name" msgid "Thursday" -msgstr "" +msgstr "星期四" #. Translators: this is a weekday name that will be used when displaying #. dates, as in "Friday Februrary 14, 2014". It is used for the %A @@ -583,7 +592,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "weekday name" msgid "Friday" -msgstr "" +msgstr "星期五" #. Translators: this is a weekday name that will be used when displaying #. dates, as in "Saturday Februrary 15, 2014". It is used for the %A @@ -591,7 +600,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "weekday name" msgid "Saturday" -msgstr "" +msgstr "星期六" #. Translators: this is a weekday name that will be used when displaying #. dates, as in "Sunday Februrary 16, 2014". It is used for the %A @@ -599,7 +608,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "weekday name" msgid "Sunday" -msgstr "" +msgstr "星期天" #. Translators: this is an abbreviated weekday name that will be used when #. displaying dates, as in "Mon Feb 10, 2014". It is used for the %a @@ -607,7 +616,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated weekday name" msgid "Mon" -msgstr "" +msgstr "周一" #. Translators: this is an abbreviated weekday name that will be used when #. displaying dates, as in "Tue Feb 11, 2014". It is used for the %a @@ -615,7 +624,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated weekday name" msgid "Tue" -msgstr "" +msgstr "周二" #. Translators: this is an abbreviated weekday name that will be used when #. displaying dates, as in "Wed Feb 12, 2014". It is used for the %a @@ -623,7 +632,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated weekday name" msgid "Wed" -msgstr "" +msgstr "周三" #. Translators: this is an abbreviated weekday name that will be used when #. displaying dates, as in "Thu Feb 13, 2014". It is used for the %a @@ -631,7 +640,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated weekday name" msgid "Thu" -msgstr "" +msgstr "周四" #. Translators: this is an abbreviated weekday name that will be used when #. displaying dates, as in "Fri Feb 14, 2014". It is used for the %a @@ -639,7 +648,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated weekday name" msgid "Fri" -msgstr "" +msgstr "周五" #. Translators: this is an abbreviated weekday name that will be used when #. displaying dates, as in "Sat Feb 15, 2014". It is used for the %a @@ -647,7 +656,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated weekday name" msgid "Sat" -msgstr "" +msgstr "周六" #. Translators: this is an abbreviated weekday name that will be used when #. displaying dates, as in "Sun Feb 16, 2014". It is used for the %a @@ -655,7 +664,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated weekday name" msgid "Sun" -msgstr "" +msgstr "周日" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Jan 10, 2014". It is used for the %b @@ -663,7 +672,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Jan" -msgstr "" +msgstr "一月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Feb 10, 2014". It is used for the %b @@ -671,7 +680,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Feb" -msgstr "" +msgstr "二月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Mar 10, 2014". It is used for the %b @@ -679,7 +688,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Mar" -msgstr "" +msgstr "三月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Apr 10, 2014". It is used for the %b @@ -687,7 +696,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Apr" -msgstr "" +msgstr "四月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "May 10, 2014". It is used for the %b @@ -695,7 +704,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "May" -msgstr "" +msgstr "五月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Jun 10, 2014". It is used for the %b @@ -703,7 +712,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Jun" -msgstr "" +msgstr "六月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Jul 10, 2014". It is used for the %b @@ -711,7 +720,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Jul" -msgstr "" +msgstr "七月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Aug 10, 2014". It is used for the %b @@ -719,7 +728,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Aug" -msgstr "" +msgstr "八月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Sep 10, 2014". It is used for the %b @@ -727,7 +736,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Sep" -msgstr "" +msgstr "九月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Oct 10, 2014". It is used for the %b @@ -735,7 +744,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Oct" -msgstr "" +msgstr "十月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Nov 10, 2014". It is used for the %b @@ -743,7 +752,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Nov" -msgstr "" +msgstr "十一月" #. Translators: this is an abbreviated month name that will be used when #. displaying dates, as in "Dec 10, 2014". It is used for the %b @@ -751,7 +760,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "abbreviated month name" msgid "Dec" -msgstr "" +msgstr "十二月" #. Translators: this is a month name that will be used when displaying #. dates, as in "January 10, 2014". It is used for the %B directive in @@ -759,7 +768,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "January" -msgstr "" +msgstr "一月" #. Translators: this is a month name that will be used when displaying #. dates, as in "February 10, 2014". It is used for the %B directive in @@ -767,7 +776,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "February" -msgstr "" +msgstr "二月" #. Translators: this is a month name that will be used when displaying #. dates, as in "March 10, 2014". It is used for the %B directive in @@ -775,7 +784,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "March" -msgstr "" +msgstr "三月" #. Translators: this is a month name that will be used when displaying #. dates, as in "April 10, 2014". It is used for the %B directive in @@ -783,7 +792,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "April" -msgstr "" +msgstr "四月" #. Translators: this is a month name that will be used when displaying #. dates, as in "May 10, 2014". It is used for the %B directive in @@ -791,7 +800,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "May" -msgstr "" +msgstr "五月" #. Translators: this is a month name that will be used when displaying #. dates, as in "June 10, 2014". It is used for the %B directive in @@ -799,7 +808,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "June" -msgstr "" +msgstr "六月" #. Translators: this is a month name that will be used when displaying #. dates, as in "July 10, 2014". It is used for the %B directive in @@ -807,7 +816,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "July" -msgstr "" +msgstr "七月" #. Translators: this is a month name that will be used when displaying #. dates, as in "August 10, 2014". It is used for the %B directive in @@ -815,7 +824,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "August" -msgstr "" +msgstr "八月" #. Translators: this is a month name that will be used when displaying #. dates, as in "September 10, 2014". It is used for the %B directive in @@ -823,7 +832,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "September" -msgstr "" +msgstr "九月" #. Translators: this is a month name that will be used when displaying #. dates, as in "October 10, 2014". It is used for the %B directive in @@ -831,7 +840,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "October" -msgstr "" +msgstr "十月" #. Translators: this is a month name that will be used when displaying #. dates, as in "November 10, 2014". It is used for the %B directive in @@ -839,7 +848,7 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "November" -msgstr "" +msgstr "十一月" #. Translators: this is a month name that will be used when displaying #. dates, as in "December 10, 2014". It is used for the %B directive in @@ -847,165 +856,169 @@ msgstr "" #: common/djangoapps/util/date_utils.py msgctxt "month name" msgid "December" -msgstr "" +msgstr "十二月" #: common/djangoapps/util/password_policy_validators.py msgid "Invalid Length ({0})" -msgstr "" +msgstr "无效长度 ({0})" #: common/djangoapps/util/password_policy_validators.py msgid "must be {0} characters or more" -msgstr "" +msgstr "须有 {0} 个字符或更多" #: common/djangoapps/util/password_policy_validators.py msgid "must be {0} characters or less" -msgstr "" +msgstr "须有 {0} 个字符或更少" #: common/djangoapps/util/password_policy_validators.py msgid "Must be more complex ({0})" -msgstr "" +msgstr "须更加复杂({0})" #: common/djangoapps/util/password_policy_validators.py msgid "must contain {0} or more uppercase characters" -msgstr "" +msgstr "必须包含{0}个或者更多大写字母" #: common/djangoapps/util/password_policy_validators.py msgid "must contain {0} or more lowercase characters" -msgstr "" +msgstr "必须包含{0}个或者更多小写字母" #: common/djangoapps/util/password_policy_validators.py msgid "must contain {0} or more digits" -msgstr "" +msgstr "必须包含{0}个或者更多数字" #: common/djangoapps/util/password_policy_validators.py msgid "must contain {0} or more punctuation characters" -msgstr "" +msgstr "必须包含{0}个或者更多标点符号" #: common/djangoapps/util/password_policy_validators.py msgid "must contain {0} or more non ascii characters" -msgstr "" +msgstr "必须包含{0}个或更多非ASCII字符" #: common/djangoapps/util/password_policy_validators.py msgid "must contain {0} or more unique words" -msgstr "" +msgstr "必须包含{0}个或更多不重复的单词" #: common/djangoapps/util/password_policy_validators.py msgid "Too similar to a restricted dictionary word." -msgstr "" +msgstr "与受限词字典中的词语过于相似." #: common/lib/capa/capa/capa_problem.py msgid "Cannot rescore problems with possible file submissions" -msgstr "" +msgstr "无法对可能的文件提交重新评分" #: common/lib/capa/capa/inputtypes.py msgid "correct" -msgstr "" +msgstr "正确" #: common/lib/capa/capa/inputtypes.py msgid "incorrect" -msgstr "" +msgstr "不正确" #: common/lib/capa/capa/inputtypes.py msgid "incomplete" -msgstr "" +msgstr "不完整" #: common/lib/capa/capa/inputtypes.py common/lib/capa/capa/inputtypes.py msgid "unanswered" -msgstr "" +msgstr "未答复" #: common/lib/capa/capa/inputtypes.py msgid "queued" -msgstr "" +msgstr "已经在队列中" #: common/lib/capa/capa/inputtypes.py msgid "" "Your file(s) have been submitted. As soon as your submission is graded, this" " message will be replaced with the grader's feedback." -msgstr "" +msgstr "你的文件已经被发布。当评定完成,此消息将被评定者的反馈所替代。" #: common/lib/capa/capa/inputtypes.py msgid "" "Your answer has been submitted. As soon as your submission is graded, this " "message will be replaced with the grader's feedback." -msgstr "" +msgstr "你的答案已经发布。当评定完成,此消息将被显示评定者的反馈所替代。" #: common/lib/capa/capa/inputtypes.py msgid "" "Submitted. As soon as a response is returned, this message will be replaced " "by that feedback." +msgstr "发布。当响应返回,该消息将被反馈信息所替代。" + +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." msgstr "" #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." -msgstr "" +msgstr "在评价提示功能{hintfn}发生错误{err}。" #: common/lib/capa/capa/responsetypes.py msgid "(Source code line unavailable)" -msgstr "" +msgstr "(源代码不可用 )" #: common/lib/capa/capa/responsetypes.py msgid "See XML source line {sourcenum}." -msgstr "" +msgstr "查看XML源文件{sourcenum}." #. Translators: 'unmask_name' is a method name and should not be translated. #: common/lib/capa/capa/responsetypes.py msgid "unmask_name called on response that is not masked" -msgstr "" +msgstr "unmask_name被未掩蔽的响应调用" #. Translators: 'shuffle' and 'answer-pool' are attribute names and should not #. be translated. #: common/lib/capa/capa/responsetypes.py msgid "Do not use shuffle and answer-pool at the same time" -msgstr "" +msgstr "请勿同时使用拖拽和答案池" #. Translators: 'answer-pool' is an attribute name and should not be #. translated. #: common/lib/capa/capa/responsetypes.py msgid "answer-pool value should be an integer" -msgstr "" +msgstr "答案池的值必须是整数" #. Translators: 'Choicegroup' is an input type and should not be translated. #: common/lib/capa/capa/responsetypes.py msgid "Choicegroup must include at least 1 correct and 1 incorrect choice" -msgstr "" +msgstr "Choicegroup必须至少包含1个正确选项和1个错误选项" #: common/lib/capa/capa/responsetypes.py common/lib/capa/capa/responsetypes.py msgid "There was a problem with the staff answer to this problem." -msgstr "" +msgstr "工作人员对这个问题的答案有问题。" #: common/lib/capa/capa/responsetypes.py msgid "Could not interpret '{student_answer}' as a number." -msgstr "" +msgstr "无法将 '{student_answer}' 处理为一个数字." #: common/lib/capa/capa/responsetypes.py msgid "You may not use variables ({bad_variables}) in numerical problems." -msgstr "" +msgstr "你可能在数学问题中无法使用变量 ({bad_variables}) ." #: common/lib/capa/capa/responsetypes.py msgid "factorial function evaluated outside its domain:'{student_answer}'" -msgstr "" +msgstr "超出自动评价功能的有效范围:'{student_answer}'" #: common/lib/capa/capa/responsetypes.py msgid "Invalid math syntax: '{student_answer}'" -msgstr "" +msgstr "无效的数学表达式: '{student_answer}'" #: common/lib/capa/capa/responsetypes.py msgid "You may not use complex numbers in range tolerance problems" -msgstr "" +msgstr "范围公差类型的问题不可以使用复数" #: common/lib/capa/capa/responsetypes.py msgid "" "There was a problem with the staff answer to this problem: complex boundary." -msgstr "" +msgstr "工作人员对此问题的解答存在问题:复杂边界。" #: common/lib/capa/capa/responsetypes.py msgid "" "There was a problem with the staff answer to this problem: empty boundary." -msgstr "" +msgstr "工作人员对此问题的解答存在问题:空白边界。" #: common/lib/capa/capa/responsetypes.py msgid "CustomResponse: check function returned an invalid dictionary!" -msgstr "" +msgstr "客户端响应:检查函数返回无效字典!" #: common/lib/capa/capa/responsetypes.py msgid "" @@ -1021,25 +1034,25 @@ msgstr "" #: common/lib/capa/capa/responsetypes.py #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "Invalid grader reply. Please contact the course staff." -msgstr "" +msgstr "无效评定回复。请联系课程工作人员。" #: common/lib/capa/capa/responsetypes.py msgid "Invalid input: {bad_input} not permitted in answer." -msgstr "" +msgstr "无效输入:{bad_input}不允许出现在回答中。" #: common/lib/capa/capa/responsetypes.py msgid "" "factorial function not permitted in answer for this problem. Provided answer" " was: {bad_input}" -msgstr "" +msgstr "针对该问题的回答不在自动评价功能允许范围之内。提交的回答是:{bad_input}" #: common/lib/capa/capa/responsetypes.py msgid "Invalid input: Could not parse '{bad_input}' as a formula." -msgstr "" +msgstr "无效输入:无法将'{bad_input}解析为公式。" #: common/lib/capa/capa/responsetypes.py msgid "Invalid input: Could not parse '{bad_input}' as a formula" -msgstr "" +msgstr "无效输入:无法将'{bad_input}'解析为一个公式" #. Translators: 'SchematicResponse' is a problem type and should not be #. translated. @@ -1049,11 +1062,11 @@ msgstr "" #: common/lib/capa/capa/responsetypes.py msgid "The Staff answer could not be interpreted as a number." -msgstr "" +msgstr "工作人员的大幅无法被解析为一个数字。" #: common/lib/capa/capa/responsetypes.py msgid "Could not interpret '{given_answer}' as a number." -msgstr "" +msgstr "无法将'{given_answer}'解析为一个数字。" #: common/lib/xmodule/xmodule/capa_base.py msgid "Check" @@ -1065,11 +1078,11 @@ msgstr "最终检查" #: common/lib/xmodule/xmodule/capa_base.py msgid "Checking..." -msgstr "" +msgstr "正在检测..." #: common/lib/xmodule/xmodule/capa_base.py msgid "Warning: The problem has been reset to its initial state!" -msgstr "" +msgstr "警告:这个问题已经被重置为其初始状态!" #. Translators: Following this message, there will be a bulleted list of #. items. @@ -1077,11 +1090,11 @@ msgstr "" msgid "" "The problem's state was corrupted by an invalid submission. The submission " "consisted of:" -msgstr "" +msgstr "该问题的描述被一个无效的发布损坏。该发布包含:" #: common/lib/xmodule/xmodule/capa_base.py msgid "If this error persists, please contact the course staff." -msgstr "" +msgstr "如果该问题依然存在,请联系课程工作人员。" #. Translators: 'closed' means the problem's due date has passed. You may no #. longer attempt to solve the problem. @@ -1089,151 +1102,159 @@ msgstr "" #: common/lib/xmodule/xmodule/capa_base.py #: common/lib/xmodule/xmodule/capa_base.py msgid "Problem is closed." -msgstr "" +msgstr "问题已结束。" #: common/lib/xmodule/xmodule/capa_base.py msgid "Problem must be reset before it can be checked again." -msgstr "" +msgstr "在检查问题之前必须把它重新设置" #: common/lib/xmodule/xmodule/capa_base.py msgid "You must wait at least {wait} seconds between submissions." -msgstr "" +msgstr "在两次发布之间你至少需要等待{wait}秒。" #: common/lib/xmodule/xmodule/capa_base.py msgid "" "You must wait at least {wait_secs} between submissions. {remaining_secs} " "remaining." -msgstr "" +msgstr "在两次提交之间需要等待 {wait_secs} 秒。还需等待{remaining_secs}秒。" #. Translators: {msg} will be replaced with a problem's error message. #: common/lib/xmodule/xmodule/capa_base.py msgid "Error: {msg}" -msgstr "" +msgstr "错误: {msg}" #: common/lib/xmodule/xmodule/capa_base.py msgid "{num_hour} hour" -msgstr "" +msgstr "{num_hour} 小时" #: common/lib/xmodule/xmodule/capa_base.py msgid "{num_minute} minute" -msgstr "" +msgstr "{num_minute} 分钟" #: common/lib/xmodule/xmodule/capa_base.py msgid "{num_second} second" -msgstr "" +msgstr "{num_second} 秒钟" #. Translators: 'rescoring' refers to the act of re-submitting a student's #. solution so it can get a new score. #: common/lib/xmodule/xmodule/capa_base.py msgid "Problem's definition does not support rescoring." -msgstr "" +msgstr "问题定义不支持重新打分。" #: common/lib/xmodule/xmodule/capa_base.py msgid "Problem must be answered before it can be graded again." -msgstr "" +msgstr "问题必须回答才能够重新评定。" #: common/lib/xmodule/xmodule/capa_base.py msgid "Problem needs to be reset prior to save." -msgstr "" +msgstr "问题在保存之前需要重置。" #: common/lib/xmodule/xmodule/capa_base.py msgid "Your answers have been saved." -msgstr "" +msgstr "您的答案已被保存." #: common/lib/xmodule/xmodule/capa_base.py msgid "" "Your answers have been saved but not graded. Click 'Check' to grade them." -msgstr "" +msgstr "你的答案已经保存但尚未得分,点击检查看分数" #: common/lib/xmodule/xmodule/capa_base.py msgid "Refresh the page and make an attempt before resetting." -msgstr "" +msgstr "在重置之前请刷新页面并做一次尝试回答。" #: common/lib/xmodule/xmodule/capa_module.py msgid "" "We're sorry, there was an error with processing your request. Please try " "reloading your page and trying again." -msgstr "" +msgstr "很抱歉,在处理你的请求时出现错误。请重新加载你的页面并再次尝试操作。" #: common/lib/xmodule/xmodule/capa_module.py msgid "" "The state of this problem has changed since you loaded this page. Please " "refresh your page." -msgstr "" +msgstr "该问题的描述在你加载本页面之后已经发生变化了。请刷新你的页面。" #: common/lib/xmodule/xmodule/course_module.py msgid "General" -msgstr "" +msgstr "一般" #. Translators: TBD stands for 'To Be Determined' and is used when a course #. does not yet have an announced start date. #: common/lib/xmodule/xmodule/course_module.py msgid "TBD" -msgstr "" +msgstr "待定" #: common/lib/xmodule/xmodule/lti_module.py msgid "" "Could not parse custom parameter: {custom_parameter}. Should be \"x=y\" " "string." -msgstr "" +msgstr "无法解析自定义参数:{custom_parameter}。参数格式必须类似于“x=y”。" #: common/lib/xmodule/xmodule/lti_module.py msgid "" "Could not parse LTI passport: {lti_passport}. Should be \"id:key:secret\" " "string." -msgstr "" +msgstr "无法解析LTI通行证:{lti_passport}。其格式应当是由“身份标识:键:密码“构成的字符串。" +#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# +#. Translators: 'Courseware' refers to the tab in the courseware that leads to +#. the content of a course +#: common/lib/xmodule/xmodule/tabs.py #: lms/templates/courseware/courseware-error.html +#, fuzzy msgid "Courseware" -msgstr "课程" +msgstr "" +"#-#-#-#-# django-partial.po (edx-platform) #-#-#-#-#\n" +"课件\n" +"#-#-#-#-# mako.po (edx-platform) #-#-#-#-#\n" +"课程" #. Translators: "Course Info" is the name of the course's information and #. updates page #: common/lib/xmodule/xmodule/tabs.py #: lms/djangoapps/instructor/views/instructor_dashboard.py msgid "Course Info" -msgstr "" +msgstr "课程信息" -#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# #. Translators: "Progress" is the name of the student's course progress page #: common/lib/xmodule/xmodule/tabs.py -#: lms/templates/peer_grading/peer_grading.html msgid "Progress" -msgstr "" +msgstr "进度" #. Translators: "Wiki" is the name of the course's wiki page #: common/lib/xmodule/xmodule/tabs.py lms/djangoapps/course_wiki/views.py #: lms/templates/wiki/base.html msgid "Wiki" -msgstr "" +msgstr "维基" #. Translators: "Discussion" is the title of the course forum page #. Translators: 'Discussion' refers to the tab in the courseware that leads to #. the discussion forums #: common/lib/xmodule/xmodule/tabs.py common/lib/xmodule/xmodule/tabs.py msgid "Discussion" -msgstr "" +msgstr "讨论" -#: cms/templates/textbooks.html cms/templates/textbooks.html -#: cms/templates/widgets/header.html +#: common/lib/xmodule/xmodule/tabs.py cms/templates/textbooks.html +#: cms/templates/textbooks.html cms/templates/widgets/header.html msgid "Textbooks" msgstr "教材" -#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# #. Translators: "Staff grading" appears on a tab that allows #. staff to view open-ended problems that require staff grading #: common/lib/xmodule/xmodule/tabs.py -#: lms/templates/instructor/staff_grading.html msgid "Staff grading" -msgstr "" +msgstr "员工评分" #. Translators: "Peer grading" appears on a tab that allows #. students to view open-ended problems that require grading #: common/lib/xmodule/xmodule/tabs.py msgid "Peer grading" -msgstr "" +msgstr "互评" -#: lms/templates/courseware/syllabus.html +#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# +#. Translators: "Syllabus" appears on a tab that, when clicked, opens the +#. syllabus of the course. +#: common/lib/xmodule/xmodule/tabs.py lms/templates/courseware/syllabus.html msgid "Syllabus" msgstr "教学大纲" @@ -1243,52 +1264,52 @@ msgstr "教学大纲" #. their course #: common/lib/xmodule/xmodule/tabs.py msgid "Instructor" -msgstr "" +msgstr "主讲教师" #. Translators: "Self" is used to denote an openended response that is self- #. graded #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "Self" -msgstr "" +msgstr "我" #. Translators: "AI" is used to denote an openended response that is machine- #. graded #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "AI" -msgstr "" +msgstr "系统" #. Translators: "Peer" is used to denote an openended response that is peer- #. graded #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "Peer" -msgstr "" +msgstr "对方" #. Translators: "Not started" is used to communicate to a student that their #. response #. has not yet been graded #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "Not started." -msgstr "" +msgstr "尚未开始." #. Translators: "Being scored." is used to communicate to a student that their #. response #. are in the process of being scored #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "Being scored." -msgstr "" +msgstr "进球" #. Translators: "Scoring finished" is used to communicate to a student that #. their response #. have been scored, but the full scoring process is not yet complete #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "Scoring finished." -msgstr "" +msgstr "评分已经完成" #. Translators: "Complete" is used to communicate to a student that their #. openended response has been fully scored #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "Complete." -msgstr "" +msgstr "完成" #. Translators: "Scored rubric" appears to a user as part of a longer #. string that looks something like: "Scored rubric from grader 1". @@ -1297,42 +1318,43 @@ msgstr "" #. returned from one of the graders of their openended response problem. #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "Scored rubric" -msgstr "" +msgstr "得分专栏" #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "" "You have attempted this question {number_of_student_attempts} times. You are" " only allowed to attempt it {max_number_of_attempts} times." msgstr "" +"你已经尝试回答该问题{number_of_student_attempts}次。你总共可以尝试回答{max_number_of_attempts}次。" #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py msgid "The problem state got out-of-sync. Please try reloading the page." -msgstr "" +msgstr "这个问题已经还没有同步,请重载页面 ." #. Translators: "Self-Assessment" refers to the self-assessed mode of #. openended evaluation #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py msgid "Self-Assessment" -msgstr "" +msgstr "自我评价" #. Translators: "Peer-Assessment" refers to the peer-assessed mode of #. openended evaluation #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py msgid "Peer-Assessment" -msgstr "" +msgstr "同伴评价" #. Translators: "Instructor-Assessment" refers to the instructor-assessed mode #. of openended evaluation #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py msgid "Instructor-Assessment" -msgstr "" +msgstr "主讲教师-判分" #. Translators: "AI-Assessment" refers to the machine-graded mode of openended #. evaluation #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py #: common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py msgid "AI-Assessment" -msgstr "" +msgstr "所有评价" #. Translators: 'tag' is one of 'feedback', 'submission_id', #. 'grader_id', or 'score'. They are categories that a student @@ -1346,23 +1368,23 @@ msgstr "" #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "There was an error saving your feedback. Please contact course staff." -msgstr "" +msgstr "保存你的反馈出错。请联系课程工作人员。" #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "Couldn't submit feedback." -msgstr "" +msgstr "无法提交反馈" #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "Successfully saved your feedback." -msgstr "" +msgstr "你的反馈已提交成功." #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "Unable to save your feedback. Please try again later." -msgstr "" +msgstr "无法保存你的反馈信息,请重试 ." #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "Successfully saved your submission." -msgstr "" +msgstr "成功保存你的提交" #. Translators: the `grader` refers to the grading service open response #. problems @@ -1371,7 +1393,7 @@ msgstr "" #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "" "Unable to submit your submission to the grader. Please try again later." -msgstr "" +msgstr "无法将你发布的内容提交给评定者,请稍晚再重新尝试。" #. Translators: the `grader` refers to the grading service open response #. problems @@ -1380,7 +1402,7 @@ msgstr "" #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "Error getting feedback from grader." -msgstr "" +msgstr "从评定者处获取反馈出错。" #. Translators: the `grader` refers to the grading service open response #. problems @@ -1388,85 +1410,85 @@ msgstr "" #. graded. #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "No feedback available from grader." -msgstr "" +msgstr "尚无有效的评定者反馈。" #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "Error handling action. Please try again." -msgstr "" +msgstr "操作失败。请重试。" #. Translators: this string appears once an openended response #. is submitted but before it has been graded #: common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py msgid "" "Your response has been submitted. Please check back later for your grade." -msgstr "" +msgstr "您的" #. Translators: "Not started" communicates to a student that their response #. has not yet been graded #: common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py msgid "Not started" -msgstr "" +msgstr "没有开始" #. Translators: "In progress" communicates to a student that their response #. is currently in the grading process #: common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py msgid "In progress" -msgstr "" +msgstr "进度" #. Translators: "Done" communicates to a student that their response #. has been fully graded #: common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py #: common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py msgid "Done" -msgstr "" +msgstr "完成" #: common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py msgid "" "We could not find a file in your submission. Please try choosing a file or " "pasting a URL to your file into the answer box." -msgstr "" +msgstr "我们没有在你的提交信息中找到文件.请重新选择文件上传或者复制一个文件路径到你的答案中" #: common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py msgid "" "We are having trouble saving your file. Please try another file or paste a " "URL to your file into the answer box." -msgstr "" +msgstr "保存你的文件遇到错误.请重新选择文件提交或者复制一个路径到你的答案处" #: common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py msgid "Error saving your score. Please notify course staff." -msgstr "" +msgstr "保存评分信息遇到错误.请通知课程管理员." #: common/lib/xmodule/xmodule/video_module/transcripts_utils.py msgid "" "Can't receive transcripts from Youtube for {youtube_id}. Status code: " "{status_code}." -msgstr "" +msgstr "不能从Youtube接受{youtube_id}的成绩单。状态码为:{status_code}。" #: common/lib/xmodule/xmodule/video_module/transcripts_utils.py msgid "Can't find any transcripts on the Youtube service." -msgstr "" +msgstr "在Youtube服务上找不到任何字幕。" #: common/lib/xmodule/xmodule/video_module/transcripts_utils.py msgid "We support only SubRip (*.srt) transcripts format." -msgstr "" +msgstr "我们只支持SubRip (*.srt)格式的字幕。" #: common/lib/xmodule/xmodule/video_module/transcripts_utils.py msgid "" "Something wrong with SubRip transcripts file during parsing. Inner message " "is {error_message}" -msgstr "" +msgstr "解析SubRip字幕文件时出错。内部消息是{error_message}" #: common/lib/xmodule/xmodule/video_module/transcripts_utils.py msgid "Something wrong with SubRip transcripts file during parsing." -msgstr "" +msgstr "解析SubRip字幕文件时出错。" #: common/lib/xmodule/xmodule/video_module/transcripts_utils.py msgid "{exception_message}: Can't find uploaded transcripts: {user_filename}" -msgstr "" +msgstr "{exception_message}: 找不到上传的成绩单: {user_filename}" #: common/lib/xmodule/xmodule/video_module/video_module.py msgid "A YouTube URL or a link to a file hosted anywhere on the web." -msgstr "" +msgstr "一个YouTube URL或者一个任意地址的网络文件的链接。" #: common/static/js/vendor/mathjax-MathJax-c9db6ac/docs/source/mjtheme/layout.html msgid "Navigation" @@ -1494,54 +1516,58 @@ msgid "" "{label} {problem_name} - {count_grade} {students} ({percent:.0f}%: " "{grade:.0f}/{max_grade:.0f} {questions})" msgstr "" +"{label} {problem_name} - {count_grade} {students} ({percent:.0f}%: " +"{grade:.0f}/{max_grade:.0f} {questions})" #: lms/djangoapps/class_dashboard/dashboard_data.py #: lms/djangoapps/class_dashboard/dashboard_data.py msgid "students" -msgstr "" +msgstr "学生们" #: lms/djangoapps/class_dashboard/dashboard_data.py #: lms/djangoapps/class_dashboard/dashboard_data.py msgid "questions" -msgstr "" +msgstr "问题" #: lms/djangoapps/class_dashboard/dashboard_data.py msgid "" "{num_students} student(s) opened Subsection {subsection_num}: " "{subsection_name}" -msgstr "" +msgstr "{num_students} 学生打开二级章节 {subsection_num}: {subsection_name}" #: lms/djangoapps/class_dashboard/dashboard_data.py msgid "" "{problem_info_x} {problem_info_n} - {count_grade} {students} " "({percent:.0f}%: {grade:.0f}/{max_grade:.0f} {questions})" msgstr "" +"{problem_info_x} {problem_info_n} - {count_grade} {students} " +"({percent:.0f}%: {grade:.0f}/{max_grade:.0f} {questions})" #. Translators: this string includes wiki markup. Leave the ** and the _ #. alone. #: lms/djangoapps/course_wiki/views.py msgid "This is the wiki for **{organization}**'s _{course_name}_." -msgstr "" +msgstr "这是**{organization}**_{course_name}_的wiki。" #: lms/djangoapps/course_wiki/views.py msgid "Course page automatically created." -msgstr "" +msgstr "课程网页已经自动创建" #: lms/djangoapps/course_wiki/views.py msgid "Welcome to the edX Wiki" -msgstr "" +msgstr "欢迎访问edX Wiki" #: lms/djangoapps/course_wiki/views.py msgid "Visit a course wiki to add an article." -msgstr "" +msgstr "浏览课程维基添加课程标题" #: lms/djangoapps/courseware/views.py msgid "User {username} does not exist." -msgstr "" +msgstr "用户{username} 不存在" #: lms/djangoapps/courseware/views.py msgid "User {username} has never accessed problem {location}" -msgstr "" +msgstr "用户{username} 从来没有访问{location}问答" #: lms/djangoapps/courseware/features/video.py lms/templates/video.html msgid "ERROR: No playable video sources found!" @@ -1551,129 +1577,131 @@ msgstr "错误:没有找到可以播放的视频源!" msgid "" "Path {0} doesn't exist, please create it, or configure a different path with" " GIT_REPO_DIR" -msgstr "" +msgstr "路径 {0} 不存在,请创建,或为GIT_REPO_DIR设置一个不同的路径。" #: lms/djangoapps/dashboard/git_import.py msgid "" "Non usable git url provided. Expecting something like: " "git@github.com:mitocw/edx4edx_lite.git" -msgstr "" +msgstr "没有可写的Git地址。期待类似这样的地址:git@github.com:mitocw/edx4edx_lite.git" #: lms/djangoapps/dashboard/git_import.py msgid "Unable to get git log" -msgstr "" +msgstr "不能取得git 日志" #: lms/djangoapps/dashboard/git_import.py msgid "git clone or pull failed!" -msgstr "" +msgstr "git clone或pull失败!" #: lms/djangoapps/dashboard/git_import.py msgid "Unable to run import command." -msgstr "" +msgstr "不能执行导入命令。" #: lms/djangoapps/dashboard/git_import.py msgid "The underlying module store does not support import." -msgstr "" +msgstr "底层模块存储不支持导入。" #. Translators: This is an error message when they ask for a #. particular version of a git repository and that version isn't #. available from the remote source they specified #: lms/djangoapps/dashboard/git_import.py msgid "The specified remote branch is not available." -msgstr "" +msgstr "指定的远程分支无效。" #. Translators: Error message shown when they have asked for a git #. repository branch, a specific version within a repository, that #. doesn't exist, or there is a problem changing to it. #: lms/djangoapps/dashboard/git_import.py msgid "Unable to switch to specified branch. Please check your branch name." -msgstr "" +msgstr "无法切换到指定的分支。请检查你的分支名。" #: lms/djangoapps/dashboard/sysadmin.py msgid "Failed in authenticating {0}, error {1}\n" -msgstr "" +msgstr "认证失败{0},错误{1}\n" #: lms/djangoapps/dashboard/sysadmin.py msgid "Failed in authenticating {0}\n" -msgstr "" +msgstr "认证失败{0}\n" #: lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "fixed password" -msgstr "" +msgstr "修改后的密码" #: lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "All ok!" -msgstr "" +msgstr "一切正常!" #: lms/djangoapps/dashboard/sysadmin.py lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "Must provide username" -msgstr "" +msgstr "请提供用户名" #: lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "Must provide full name" -msgstr "" +msgstr "请提供全名" #: lms/djangoapps/dashboard/sysadmin.py msgid "email must end in" -msgstr "" +msgstr "电子邮件地址必须结束于" #: lms/djangoapps/dashboard/sysadmin.py msgid "Failed - email {0} already exists as external_id" -msgstr "" +msgstr "失败 - 电子邮件 {0} 作为外部ID已经存在了" #: lms/djangoapps/dashboard/sysadmin.py msgid "Password must be supplied if not using certificates" -msgstr "" +msgstr "没有使用认证时必须提供密码。" #: lms/djangoapps/dashboard/sysadmin.py msgid "email address required (not username)" -msgstr "" +msgstr "电子邮件地址必填(不是用户名)" #: lms/djangoapps/dashboard/sysadmin.py msgid "Oops, failed to create user {0}, IntegrityError" -msgstr "" +msgstr "啊,创建用户{0}失败,完整性错误" #: lms/djangoapps/dashboard/sysadmin.py msgid "User {0} created successfully!" -msgstr "" +msgstr "用户 {0} 创建成功!" #: lms/djangoapps/dashboard/sysadmin.py msgid "Cannot find user with email address {0}" -msgstr "" +msgstr "未找到邮件地址 为{0} 的用户" #: lms/djangoapps/dashboard/sysadmin.py msgid "Cannot find user with username {0} - {1}" -msgstr "" +msgstr "未找到用户名 {0} - {1} 的用户" #: lms/djangoapps/dashboard/sysadmin.py msgid "Deleted user {0}" -msgstr "" +msgstr "已删除用户 {0}" #: lms/djangoapps/dashboard/sysadmin.py msgid "Statistic" -msgstr "" +msgstr "统计" #: lms/djangoapps/dashboard/sysadmin.py msgid "Value" -msgstr "" +msgstr "值" #: lms/djangoapps/dashboard/sysadmin.py msgid "Site statistics" -msgstr "" +msgstr "网站统计" #: lms/djangoapps/dashboard/sysadmin.py msgid "Total number of users" -msgstr "" +msgstr "用户总数" #: lms/djangoapps/dashboard/sysadmin.py msgid "Courses loaded in the modulestore" -msgstr "" +msgstr "已加载课程至模块仓库" +#: lms/djangoapps/dashboard/sysadmin.py lms/djangoapps/dashboard/sysadmin.py +#: lms/djangoapps/dashboard/tests/test_sysadmin.py #: lms/templates/tracking_log.html msgid "username" msgstr "用户名" @@ -1681,28 +1709,28 @@ msgstr "用户名" #: lms/djangoapps/dashboard/sysadmin.py lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "email" -msgstr "" +msgstr "电子邮件" #: lms/djangoapps/dashboard/sysadmin.py msgid "Repair Results" -msgstr "" +msgstr "修复结果" #: lms/djangoapps/dashboard/sysadmin.py msgid "Create User Results" -msgstr "" +msgstr "创建用户结果" #: lms/djangoapps/dashboard/sysadmin.py msgid "Delete User Results" -msgstr "" +msgstr "删除用户结果" #: lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "The git repo location should end with '.git', and be a valid url" -msgstr "" +msgstr "Git仓库应为以'.git'结尾的有效url" #: lms/djangoapps/dashboard/sysadmin.py msgid "Added Course" -msgstr "" +msgstr "添加课程" #: lms/djangoapps/dashboard/sysadmin.py msgid "" @@ -1711,12 +1739,13 @@ msgid "" "We recommend you enable the MongoDB based module store instead, unless this " "is a development environment." msgstr "" +"拒绝导入。GIT_IMPORT_WITH_XMLMODULESTORE未被设置为on,且以多线程方式导入到XMLModuleStore中通常存在不安全因素。在非开发环境中,推荐您采用基于MongoDB的模块仓库。" #: lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "" "The course {0} already exists in the data directory! (reloading anyway)" -msgstr "" +msgstr "课程 {0} 已在数据目录中存在!(强制重新加载)" #. Translators: unable to download the course content from #. the source git repository. Clone occurs if this is brand @@ -1725,133 +1754,134 @@ msgstr "" #: lms/djangoapps/dashboard/sysadmin.py msgid "" "Unable to clone or pull repository. Please check your url. Output was: {0!r}" -msgstr "" +msgstr "无法克隆或拉取代码仓库。请检查你的url。输出是:{0!r}" #: lms/djangoapps/dashboard/sysadmin.py msgid "Failed to clone repository to {0}" -msgstr "" +msgstr "无法clone仓库到 {0}" #: lms/djangoapps/dashboard/sysadmin.py msgid "Successfully switched to branch: {branch_name}" -msgstr "" +msgstr "成功切换到分支:{branch_name}" #: lms/djangoapps/dashboard/sysadmin.py msgid "Loaded course {0} {1}
      Errors:" -msgstr "" +msgstr "加载课程 {0} {1}
      错误:" +#: lms/djangoapps/dashboard/sysadmin.py lms/djangoapps/dashboard/sysadmin.py #: cms/templates/index.html cms/templates/settings.html msgid "Course Name" msgstr "课程名称" #: lms/djangoapps/dashboard/sysadmin.py msgid "Directory/ID" -msgstr "" +msgstr "目录/ID" #: lms/djangoapps/dashboard/sysadmin.py msgid "Git Commit" -msgstr "" +msgstr "Git提交" #: lms/djangoapps/dashboard/sysadmin.py msgid "Last Change" -msgstr "" +msgstr "最后一次修改" #: lms/djangoapps/dashboard/sysadmin.py msgid "Last Editor" -msgstr "" +msgstr "最后一次编辑者" #: lms/djangoapps/dashboard/sysadmin.py msgid "Information about all courses" -msgstr "" +msgstr "所有课程信息" #: lms/djangoapps/dashboard/sysadmin.py msgid "Error - cannot get course with ID {0}
      {1}
      " -msgstr "" +msgstr "错误,不能通过 ID {0}
      {1}
      取得课程" #: lms/djangoapps/dashboard/sysadmin.py msgid "Deleted" -msgstr "" +msgstr "已删除" #: lms/djangoapps/dashboard/sysadmin.py lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "course_id" -msgstr "" +msgstr "课程ID" #: lms/djangoapps/dashboard/sysadmin.py msgid "# enrolled" -msgstr "" +msgstr "# 已注册" #: lms/djangoapps/dashboard/sysadmin.py msgid "# staff" -msgstr "" +msgstr "# 员工" #: lms/djangoapps/dashboard/sysadmin.py msgid "instructors" -msgstr "" +msgstr "主讲教师" #: lms/djangoapps/dashboard/sysadmin.py msgid "Enrollment information for all courses" -msgstr "" +msgstr "所有课程的注册信息" #: lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "role" -msgstr "" +msgstr "角色" #: lms/djangoapps/dashboard/sysadmin.py #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "full_name" -msgstr "" +msgstr "全名" #: lms/djangoapps/dashboard/management/commands/git_add_course.py msgid "" "Import the specified git repository and optional branch into the modulestore" " and optionally specified directory." -msgstr "" +msgstr "倒入指定的git代码仓库和可选分支到模块库与可选的指定目录。" #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "Cannot find user with email address" -msgstr "" +msgstr "无法通过邮件地址找到用户" #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "Cannot find user with username" -msgstr "" +msgstr "无法通过用户名找到用户" #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "Failed in authenticating" -msgstr "" +msgstr "认证失败" #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "Unable to clone or pull repository" -msgstr "" +msgstr "无法clone或者pull仓库" #: lms/djangoapps/dashboard/tests/test_sysadmin.py msgid "Error - cannot get course with ID" -msgstr "" +msgstr "错误,不能通过 ID 取得课程" #: lms/djangoapps/django_comment_client/mustache_helpers.py msgid "Re-open thread" -msgstr "" +msgstr "重新开启帖子" #: lms/djangoapps/django_comment_client/mustache_helpers.py msgid "Close thread" -msgstr "" +msgstr "关闭帖子" #: lms/djangoapps/django_comment_client/base/views.py #: lms/djangoapps/django_comment_client/base/views.py msgid "Title can't be empty" -msgstr "" +msgstr "标题不能为空" #: lms/djangoapps/django_comment_client/base/views.py #: lms/djangoapps/django_comment_client/base/views.py #: lms/djangoapps/django_comment_client/base/views.py #: lms/djangoapps/django_comment_client/base/views.py msgid "Body can't be empty" -msgstr "" +msgstr "内容不能为空" #: lms/djangoapps/django_comment_client/base/views.py #: lms/djangoapps/django_comment_client/base/views.py msgid "Comment level too deep" -msgstr "" +msgstr "评论层级过深" #: lms/djangoapps/django_comment_client/base/views.py msgid "allowed file types are '%(file_types)s'" @@ -1868,8 +1898,9 @@ msgstr "上传文件出错,请联系网站管理员,谢谢。" #: lms/djangoapps/django_comment_client/base/views.py msgid "Good" -msgstr "" +msgstr "好" +#: lms/djangoapps/django_comment_client/forum/views.py #: lms/templates/discussion/_inline_new_post.html #: lms/templates/discussion/_new_post.html msgid "All Groups" @@ -1888,18 +1919,15 @@ msgstr "任务已在运行中。" #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/tools.py -#: lms/templates/instructor/instructor_dashboard_2/metrics.html -#: lms/templates/instructor/instructor_dashboard_2/metrics.html msgid "Username" -msgstr "" +msgstr "用户名" -#: lms/djangoapps/instructor/views/api.py lms/templates/help_modal.html -#: lms/templates/instructor/instructor_dashboard_2/metrics.html -#: lms/templates/instructor/instructor_dashboard_2/metrics.html -#: lms/templates/open_ended_problems/open_ended_flagged_problems.html +#: lms/djangoapps/instructor/views/api.py msgid "Name" -msgstr "" +msgstr "名称" +#: lms/djangoapps/instructor/views/api.py +#: lms/djangoapps/instructor/views/instructor_dashboard.py #: lms/templates/dashboard.html #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/university_profile/edge.html @@ -1908,70 +1936,71 @@ msgstr "电子邮件" #: lms/djangoapps/instructor/views/api.py msgid "Language" -msgstr "" +msgstr "语言" #: lms/djangoapps/instructor/views/api.py msgid "Location" -msgstr "" +msgstr "所在地" #: lms/djangoapps/instructor/views/api.py msgid "Birth Year" -msgstr "" +msgstr "出生年度" -#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/djangoapps/instructor/views/api.py lms/templates/register.html +#: lms/templates/signup_modal.html msgid "Gender" msgstr "性别" +#: lms/djangoapps/instructor/views/api.py #: lms/templates/instructor/instructor_dashboard_2/analytics.html msgid "Level of Education" msgstr "教育水平" -#: lms/templates/register.html +#: lms/djangoapps/instructor/views/api.py lms/templates/register.html msgid "Mailing Address" msgstr "邮寄地址" #: lms/djangoapps/instructor/views/api.py msgid "Goals" -msgstr "" +msgstr "目标" #: lms/djangoapps/instructor/views/api.py msgid "Module does not exist." -msgstr "" +msgstr "模块不存在。" #: lms/djangoapps/instructor/views/api.py #: lms/djangoapps/instructor/views/legacy.py msgid "An error occurred while deleting the score." -msgstr "" +msgstr "删除该分数时出错。" #: lms/djangoapps/instructor/views/api.py -#: lms/templates/verify_student/midcourse_reverify_dash.html msgid "Complete" -msgstr "" +msgstr "已完成" #: lms/djangoapps/instructor/views/api.py msgid "Incomplete" -msgstr "" +msgstr "未完成" #: lms/djangoapps/instructor/views/api.py msgid "" "Your grade report is being generated! You can view the status of the " "generation task in the 'Pending Instructor Tasks' section." -msgstr "" +msgstr "您的成绩报告已经生成!您可以在'主讲教师待处理任务处理'板块查看生成任务的状态。" #: lms/djangoapps/instructor/views/api.py msgid "" "A grade report generation task is already in progress. Check the 'Pending " "Instructor Tasks' table for the status of the task. When completed, the " "report will be available for download in the table below." -msgstr "" +msgstr "一个成绩报告生成任务已在处理中。可在'主讲教师待处理任务'列表中查看任务状态。当任务完成时,报告可在表格下方下载。" #: lms/djangoapps/instructor/views/api.py msgid "Successfully changed due date for student {0} for {1} to {2}" -msgstr "" +msgstr "成功修改了学生{0}的截止日期从{1}变为{2}" #: lms/djangoapps/instructor/views/api.py msgid "Successfully reset due date for student {0} for {1} to {2}" -msgstr "" +msgstr "成功重置了学生{0}的截止日期从{1}变为{2}" #: lms/djangoapps/instructor/views/instructor_dashboard.py msgid "Membership" @@ -1983,7 +2012,7 @@ msgstr "学生管理" #: lms/djangoapps/instructor/views/instructor_dashboard.py msgid "Extensions" -msgstr "" +msgstr "扩展" #: lms/djangoapps/instructor/views/instructor_dashboard.py #: lms/templates/instructor/instructor_dashboard_2/data_download.html @@ -1997,141 +2026,141 @@ msgstr "分析" #: lms/djangoapps/instructor/views/legacy.py msgid "Course Statistics At A Glance" -msgstr "" +msgstr "课程统计信息概览" #: lms/djangoapps/instructor/views/legacy.py msgid "Found a single student. " -msgstr "" +msgstr "寻找单个学生" #: lms/djangoapps/instructor/views/legacy.py msgid "Couldn't find student with that email or username." -msgstr "" +msgstr "用该邮箱或用户名找不到对应的学生" #: lms/djangoapps/instructor/views/legacy.py msgid "List of students enrolled in {course_id}" -msgstr "" +msgstr "选修课程{course_id}的学生清单" #: lms/djangoapps/instructor/views/legacy.py msgid "Summary Grades of students enrolled in {course_id}" -msgstr "" +msgstr "选修课程{course_id}的学生成绩汇总" #: lms/djangoapps/instructor/views/legacy.py msgid "Raw Grades of students enrolled in {course_id}" -msgstr "" +msgstr "选修课程{course_id}的学生原始成绩" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to create a background task for rescoring \"{problem_url}\"." -msgstr "" +msgstr "无法为\"{problem_url}\"问答创建后台评分任务。" #: lms/djangoapps/instructor/views/legacy.py msgid "" "Failed to create a background task for rescoring \"{problem_url}\": problem " "not found." -msgstr "" +msgstr "无法为\"{problem_url}\"问答创建后台评分任务,问答不存在。" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to create a background task for rescoring \"{url}\": {message}." -msgstr "" +msgstr "无法为\"{url}\": {message}重新评分创建后台任务。" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to create a background task for resetting \"{problem_url}\"." -msgstr "" +msgstr "无法创建后台任务来重新设置\"{problem_url}\"问答。" #: lms/djangoapps/instructor/views/legacy.py msgid "" "Failed to create a background task for resetting \"{problem_url}\": problem " "not found." -msgstr "" +msgstr "无法创建后台任务来重新设置\"{problem_url}\"问答:问答不存在。" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to create a background task for resetting \"{url}\": {message}." -msgstr "" +msgstr "无法为\"{url}\": {message}重新设置创建后台任务。" #: lms/djangoapps/instructor/views/legacy.py msgid "Found module. " -msgstr "" +msgstr "发现模块" #: lms/djangoapps/instructor/views/legacy.py msgid "Couldn't find module with that urlname: {url}. " -msgstr "" +msgstr "无法通过地址:{url}找到模块。" #: lms/djangoapps/instructor/views/legacy.py msgid "Deleted student module state for {state}!" -msgstr "" +msgstr "删除“ {state}!”学生模块状态" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to delete module state for {id}/{url}. " -msgstr "" +msgstr "删除{id}/{url}的模块状态失败。" #: lms/djangoapps/instructor/views/legacy.py msgid "Module state successfully reset!" -msgstr "" +msgstr "重新设置模块状态成功!" #: lms/djangoapps/instructor/views/legacy.py msgid "Couldn't reset module state for {id}/{url}. " -msgstr "" +msgstr "无法重新设置{id}/{url}的模块状态。" #: lms/djangoapps/instructor/views/legacy.py msgid "" "Failed to create a background task for rescoring \"{key}\" for student {id}." -msgstr "" +msgstr "无法为学生 {id}的\"{key}\"重新评分创建后台任务。" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to create a background task for rescoring \"{key}\": {id}." -msgstr "" +msgstr "无法为\"{key}\": {id}重新评分创建后台任务。" #: lms/djangoapps/instructor/views/legacy.py msgid "Progress page for username: {username} with email address: {email}" -msgstr "" +msgstr "用户: {username} (邮箱:{email})的进度页面。" #: lms/djangoapps/instructor/views/legacy.py msgid "Assignment Name" -msgstr "" +msgstr "作业名称" #: lms/djangoapps/instructor/views/legacy.py msgid "Please enter an assignment name" -msgstr "" +msgstr "请输入作业名称" #: lms/djangoapps/instructor/views/legacy.py msgid "Invalid assignment name '{name}'" -msgstr "" +msgstr "作业名称 '{name}'无效" #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/legacy.py msgid "External email" -msgstr "" +msgstr "外部邮箱" #: lms/djangoapps/instructor/views/legacy.py msgid "Grades for assignment \"{name}\"" -msgstr "" +msgstr " 作业'{name}'的成绩" #: lms/djangoapps/instructor/views/legacy.py msgid "List of Staff" -msgstr "" +msgstr "职员名单" #: lms/djangoapps/instructor/views/legacy.py msgid "List of Instructors" -msgstr "" +msgstr "主讲教师名单" #: lms/djangoapps/instructor/views/legacy.py msgid "Student profile data for course {course_id}" -msgstr "" +msgstr "课程 {course_id}的学员选课信息" #: lms/djangoapps/instructor/views/legacy.py msgid "Found {num} records to dump." -msgstr "" +msgstr "共有 {num} 条记录需要转储" #: lms/djangoapps/instructor/views/legacy.py msgid "Couldn't find module with that urlname." -msgstr "" +msgstr "无法找到该地址对应的模块" #: lms/djangoapps/instructor/views/legacy.py msgid "Student state for problem {problem}" -msgstr "" +msgstr "{problem}问答的学生状态" #: lms/djangoapps/instructor/views/legacy.py msgid "List of Beta Testers" -msgstr "" +msgstr "Beta测试人员名单" #: lms/djangoapps/instructor/views/legacy.py msgid "" @@ -2139,168 +2168,165 @@ msgid "" "classes, it may take up to an hour (or more, if other courses are " "simultaneously sending email) to send all emails." msgstr "" +"你的电子邮件已成功加入发送队列。需要注意的是,对于大型课程,可能需要花费一小时以上(甚至更多,如果其他课程也在同时发送邮件)来发送所有邮件。" #: lms/djangoapps/instructor/views/legacy.py msgid "Your email was successfully queued for sending." -msgstr "" +msgstr "你的电子邮件已成功加入发送队列。" #: lms/djangoapps/instructor/views/legacy.py msgid "Grades from {course_id}" -msgstr "" +msgstr "课程“{course_id}”的成绩" #: lms/djangoapps/instructor/views/legacy.py msgid "No remote gradebook defined in course metadata" -msgstr "" +msgstr "课程元数据中没有定义远程成绩簿" #: lms/djangoapps/instructor/views/legacy.py msgid "No remote gradebook url defined in settings.FEATURES" -msgstr "" +msgstr "在settings.FEATURES中没有定义远程成绩簿的链接地址" #: lms/djangoapps/instructor/views/legacy.py msgid "No gradebook name defined in course remote_gradebook metadata" -msgstr "" +msgstr "远程成绩簿元数据中没有定义成绩簿名称" #: lms/djangoapps/instructor/views/legacy.py msgid "Failed to communicate with gradebook server at {url}" -msgstr "" +msgstr "同位于{url}的成绩簿服务器通讯失败" #: lms/djangoapps/instructor/views/legacy.py msgid "Error: {err}" -msgstr "" +msgstr "错误:{err}" #: lms/djangoapps/instructor/views/legacy.py msgid "Remote gradebook response for {action}" -msgstr "" +msgstr "远程成绩簿对{action}的应答" #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/legacy.py msgid "Full name" -msgstr "" +msgstr "全名" #: lms/djangoapps/instructor/views/legacy.py msgid "Roles" -msgstr "" +msgstr "角色" #: lms/djangoapps/instructor/views/legacy.py msgid "List of Forum {name}s in course {id}" -msgstr "" +msgstr "课程{id}的论坛{name}列表" #: lms/djangoapps/instructor/views/legacy.py #: lms/djangoapps/instructor/views/legacy.py msgid "Error: unknown rolename \"{rolename}\"" -msgstr "" +msgstr "错误:未知的角色名称\"{rolename}\"" #: lms/djangoapps/instructor/views/legacy.py msgid "Error: unknown username \"{username}\"" -msgstr "" +msgstr "错误:未知的用户名称\"{username}\"" #: lms/djangoapps/instructor/views/legacy.py msgid "" "Error: user \"{username}\" does not have rolename \"{rolename}\", cannot " "remove" -msgstr "" +msgstr "错误:用户\"{username}\"没有\"{rolename}\"角色,不能删除" #: lms/djangoapps/instructor/views/legacy.py msgid "Removed \"{username}\" from \"{course_id}\" forum role = \"{rolename}\"" -msgstr "" +msgstr "用户\"{username}\"已取消课程\"{course_id}\"论坛的\"{rolename}\"角色" #: lms/djangoapps/instructor/views/legacy.py msgid "Error: user \"{username}\" already has rolename \"{rolename}\", cannot add" -msgstr "" +msgstr "错误:用户\"{username}\"已经拥有\"{rolename}\"角色,不能重复添加" #: lms/djangoapps/instructor/views/legacy.py msgid "" "Error: user \"{username}\" should first be added as staff before adding as a" " forum administrator, cannot add" -msgstr "" +msgstr "错误:用户\"{username}\"在添加为论坛管理员之前必须先添加为职员,添加失败" #: lms/djangoapps/instructor/views/legacy.py msgid "Added \"{username}\" to \"{course_id}\" forum role = \"{rolename}\"" -msgstr "" +msgstr "用户\"{username}\"已添加为课程\"{course_id}\"论坛的\"{rolename}\"角色" #: lms/djangoapps/instructor/views/legacy.py msgid "{title} in course {course_id}" -msgstr "" +msgstr "课程{course_id}的标题:{title}" #: lms/djangoapps/instructor/views/legacy.py msgid "ID" -msgstr "" +msgstr "身份标识" #: lms/djangoapps/instructor/views/legacy.py -#: lms/djangoapps/instructor/views/tools.py cms/templates/register.html -#: lms/templates/dashboard.html lms/templates/register-shib.html -#: lms/templates/register.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html -#: lms/templates/verify_student/_modal_editname.html -#: lms/templates/verify_student/face_upload.html +#: lms/djangoapps/instructor/views/tools.py msgid "Full Name" -msgstr "" +msgstr "全名" #: lms/djangoapps/instructor/views/legacy.py msgid "edX email" -msgstr "" +msgstr "edX邮箱" #: lms/djangoapps/instructor/views/legacy.py msgid "Enrollment of students" -msgstr "" +msgstr "学生注册" #: lms/djangoapps/instructor/views/legacy.py msgid "Un-enrollment of students" -msgstr "" +msgstr "学生取消注册" #: lms/djangoapps/instructor/views/legacy.py msgid "" "Failed to find any background tasks for course \"{course}\", module " "\"{problem}\" and student \"{student}\"." -msgstr "" +msgstr "寻找针对课程\"{course}\",模块\"{problem}\"及学生\"{student}\"的后台任务失败。" #: lms/djangoapps/instructor/views/legacy.py msgid "" "Failed to find any background tasks for course \"{course}\" and module " "\"{problem}\"." -msgstr "" +msgstr "寻找针对课程\"{course}\",模块\"{problem}\"的后台任务失败。" #: lms/djangoapps/instructor/views/tools.py msgid "Unable to parse date: " -msgstr "" +msgstr "不能解析日期" #: lms/djangoapps/instructor/views/tools.py msgid "Couldn't find module for url: {0}" -msgstr "" +msgstr "不能为url {0} 找到合适的模块" #: lms/djangoapps/instructor/views/tools.py #: lms/djangoapps/instructor/views/tools.py msgid "Extended Due Date" -msgstr "" +msgstr "扩展截止日期" #: lms/djangoapps/instructor/views/tools.py msgid "Users with due date extensions for {0}" -msgstr "" +msgstr "拥有到期扩展{0}的用户" #: lms/djangoapps/instructor/views/tools.py msgid "Unit" -msgstr "" +msgstr "单元" #: lms/djangoapps/instructor/views/tools.py msgid "Due date extensions for {0} {1} ({2})" -msgstr "" +msgstr "到期扩展{0} {1} ({2})" #. Translators: This is a past-tense verb that is inserted into task progress #. messages as {action}. #: lms/djangoapps/instructor_task/tasks.py msgid "rescored" -msgstr "" +msgstr "已复评" #. Translators: This is a past-tense verb that is inserted into task progress #. messages as {action}. #: lms/djangoapps/instructor_task/tasks.py msgid "reset" -msgstr "" +msgstr "重置" +#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-# #. Translators: This is a past-tense verb that is inserted into task progress #. messages as {action}. #: lms/djangoapps/instructor_task/tasks.py -#: lms/templates/wiki/plugins/attachments/index.html +#: lms/templates/wiki/plugins/attachments/index.html wiki/models/article.py msgid "deleted" msgstr "已删除" @@ -2308,132 +2334,132 @@ msgstr "已删除" #. messages as {action}. #: lms/djangoapps/instructor_task/tasks.py msgid "emailed" -msgstr "" +msgstr "已邮件通知" #: lms/djangoapps/instructor_task/tasks.py msgid "graded" -msgstr "" +msgstr "已评价" #: lms/djangoapps/instructor_task/views.py #: lms/djangoapps/instructor_task/views.py msgid "No status information available" -msgstr "" +msgstr "尚无状态信息" #: lms/djangoapps/instructor_task/views.py msgid "No task_output information found for instructor_task {0}" -msgstr "" +msgstr "无主讲教师任务 {0}的输出信息" #: lms/djangoapps/instructor_task/views.py msgid "No parsable task_output information found for instructor_task {0}: {1}" -msgstr "" +msgstr "未找到主讲教师任务{0}:{1} 的可解析的任务输出信息" #: lms/djangoapps/instructor_task/views.py msgid "No parsable status information available" -msgstr "" +msgstr "尚无可解析的状态信息" #: lms/djangoapps/instructor_task/views.py msgid "No message provided" -msgstr "" +msgstr "尚无消息" #: lms/djangoapps/instructor_task/views.py msgid "Invalid task_output information found for instructor_task {0}: {1}" -msgstr "" +msgstr "发现主讲教师任务{0}: {1}的无效的任务输出信息" #: lms/djangoapps/instructor_task/views.py msgid "No progress status information available" -msgstr "" +msgstr "尚无进度状态信息" #: lms/djangoapps/instructor_task/views.py msgid "No parsable task_input information found for instructor_task {0}: {1}" -msgstr "" +msgstr "未找到主讲教师任务{0}:{1} 的可解析的任务输入信息" #. Translators: {action} is a past-tense verb that is localized separately. #. {attempted} and {succeeded} are counts. #: lms/djangoapps/instructor_task/views.py msgid "Progress: {action} {succeeded} of {attempted} so far" -msgstr "" +msgstr "进度: 目前 {attempted}的{action} {succeeded} " #. Translators: {action} is a past-tense verb that is localized separately. #. {student} is a student identifier. #: lms/djangoapps/instructor_task/views.py msgid "Unable to find submission to be {action} for student '{student}'" -msgstr "" +msgstr "无法找到学生'{student}'为{action}的提交" #. Translators: {action} is a past-tense verb that is localized separately. #. {student} is a student identifier. #: lms/djangoapps/instructor_task/views.py msgid "Problem failed to be {action} for student '{student}'" -msgstr "" +msgstr "学生'{student}'的问题{action}失败" #. Translators: {action} is a past-tense verb that is localized separately. #. {student} is a student identifier. #: lms/djangoapps/instructor_task/views.py msgid "Problem successfully {action} for student '{student}'" -msgstr "" +msgstr "学生'{student}'的问题{action}成功" #. Translators: {action} is a past-tense verb that is localized separately. #: lms/djangoapps/instructor_task/views.py msgid "Unable to find any students with submissions to be {action}" -msgstr "" +msgstr "无法找到任何为{action}提交的学生" #. Translators: {action} is a past-tense verb that is localized separately. #. {attempted} is a count. #: lms/djangoapps/instructor_task/views.py msgid "Problem failed to be {action} for any of {attempted} students" -msgstr "" +msgstr "对于{attempted}学生的问题{action}失败" #. Translators: {action} is a past-tense verb that is localized separately. #. {attempted} is a count. #: lms/djangoapps/instructor_task/views.py msgid "Problem successfully {action} for {attempted} students" -msgstr "" +msgstr "对于{attempted}学生的问题{action}成功" #. Translators: {action} is a past-tense verb that is localized separately. #. {succeeded} and {attempted} are counts. #: lms/djangoapps/instructor_task/views.py msgid "Problem {action} for {succeeded} of {attempted} students" -msgstr "" +msgstr "对于{attempted} 学生的问题 {action}{succeeded}" #. Translators: {action} is a past-tense verb that is localized separately. #: lms/djangoapps/instructor_task/views.py msgid "Unable to find any recipients to be {action}" -msgstr "" +msgstr "无法找到{action}的接受者" #. Translators: {action} is a past-tense verb that is localized separately. #. {attempted} is a count. #: lms/djangoapps/instructor_task/views.py msgid "Message failed to be {action} for any of {attempted} recipients " -msgstr "" +msgstr "对{attempted}接受者的消息{action}失败" #. Translators: {action} is a past-tense verb that is localized separately. #. {attempted} is a count. #: lms/djangoapps/instructor_task/views.py msgid "Message successfully {action} for {attempted} recipients" -msgstr "" +msgstr "对于{attempted}接受者的消息{action}成功" #. Translators: {action} is a past-tense verb that is localized separately. #. {succeeded} and {attempted} are counts. #: lms/djangoapps/instructor_task/views.py msgid "Message {action} for {succeeded} of {attempted} recipients" -msgstr "" +msgstr "对于{attempted}接受者的消息{action}{succeeded}" #. Translators: {action} is a past-tense verb that is localized separately. #. {succeeded} and {attempted} are counts. #: lms/djangoapps/instructor_task/views.py msgid "Status: {action} {succeeded} of {attempted}" -msgstr "" +msgstr "状态: 对于{attempted}{action} {succeeded} " #. Translators: {skipped} is a count. This message is appended to task #. progress status messages. #: lms/djangoapps/instructor_task/views.py msgid " (skipping {skipped})" -msgstr "" +msgstr "(忽略 {skipped})" #. Translators: {total} is a count. This message is appended to task progress #. status messages. #: lms/djangoapps/instructor_task/views.py msgid " (out of {total})" -msgstr "" +msgstr "( /{total} )" #: lms/djangoapps/linkedin/templates/linkedin_email.html msgid "" @@ -2441,6 +2467,8 @@ msgid "" " Dear %(student_name)s,\n" " " msgstr "" +"\n" +"亲爱的%(student_name)s同学," #: lms/djangoapps/linkedin/templates/linkedin_email.html msgid "" @@ -2451,23 +2479,27 @@ msgid "" " certificate to your profile.\n" " " msgstr "" +"祝贺你取得%(course_name)s的课程认证!\n" +"你有LinkIn账号,可以将你取得的认证展示给同伴。\n" +"点击以下按钮\n" +"将课程认证添加到你在LinkIn的背景信息。" #: lms/djangoapps/linkedin/templates/linkedin_email.html msgid "Add to profile" -msgstr "" +msgstr "添加到配置文件" #: lms/djangoapps/open_ended_grading/staff_grading_service.py msgid "" "Could not contact the external grading server. Please contact the " "development team at {email}." -msgstr "" +msgstr "无法联系上外部的评分服务器。请联系开发团队{email}。" #: lms/djangoapps/open_ended_grading/staff_grading_service.py msgid "" "Cannot find any open response problems in this course. Have you submitted " "answers to any open response assessment questions? If not, please do so and " "return to this page." -msgstr "" +msgstr "没有发现该课程任何开放问题的应答,您是否已经提交过任何开放问题的答案?如果没,请提交并返回该页面。" #: lms/djangoapps/open_ended_grading/utils.py msgid "AI Assessment" @@ -2493,50 +2525,50 @@ msgstr "主讲教师评分" msgid "" "Error occurred while contacting the grading service. Please notify course " "staff." -msgstr "" +msgstr "连接评分服务出现错误,请通知课程员工。" #: lms/djangoapps/open_ended_grading/utils.py msgid "" "Error occurred while contacting the grading service. Please notify your edX" " point of contact." -msgstr "" +msgstr "连接评分服务时发生错误,请告知您的edX联系点。" #: lms/djangoapps/open_ended_grading/utils.py msgid "for course {0} and student {1}." -msgstr "" +msgstr "于课程 {0} 与学生 {1}。" #: lms/djangoapps/open_ended_grading/views.py msgid "" "View all problems that require peer assessment in this particular course." -msgstr "" +msgstr "查看该课程中所有需要同行评议的问题。" #: lms/djangoapps/open_ended_grading/views.py msgid "" "View ungraded submissions submitted by students for the open ended problems " "in the course." -msgstr "" +msgstr "查看学生对该课程中开放性问题的更新。" #: lms/djangoapps/open_ended_grading/views.py msgid "" "View open ended problems that you have previously submitted for grading." -msgstr "" +msgstr "查看您此前提交评分的开放性问题。" #: lms/djangoapps/open_ended_grading/views.py msgid "View submissions that have been flagged by students as inappropriate." -msgstr "" +msgstr "查看提交内容中被学生标注为不妥的内容。" #: lms/djangoapps/open_ended_grading/views.py #: lms/djangoapps/open_ended_grading/views.py msgid "New submissions to grade" -msgstr "" +msgstr "供评分的新提交" #: lms/djangoapps/open_ended_grading/views.py msgid "New grades have been returned" -msgstr "" +msgstr "返回新的评分" #: lms/djangoapps/open_ended_grading/views.py msgid "Submissions have been flagged for review" -msgstr "" +msgstr "提交已被标记为审阅" #: lms/djangoapps/open_ended_grading/views.py msgid "" @@ -2546,6 +2578,11 @@ msgid "" " Please check back later for this.\n" " " msgstr "" +"\n" +" 初始化互评时出现错误。\n" +" 该课件尚未创建一个允许您评价其他同学的模块。\n" +" 请稍后再检查确认。\n" +" " #: lms/djangoapps/shoppingcart/models.py msgid "Order Payment Confirmation" @@ -2557,25 +2594,25 @@ msgstr "尝试添加不同的货币到购物车" #: lms/djangoapps/shoppingcart/models.py msgid "Registration for Course: {course_name}" -msgstr "" +msgstr "登记课程:{course_name}" #: lms/djangoapps/shoppingcart/models.py msgid "" "Please visit your dashboard to see your new" " enrollments." -msgstr "" +msgstr "请访问 工作台以查看您最新注册的课程。" #: lms/djangoapps/shoppingcart/models.py msgid "[Refund] User-Requested Refund" -msgstr "" +msgstr "[Refund] 用户申请退款" #: lms/djangoapps/shoppingcart/models.py msgid "Mode {mode} does not exist for {course_id}" -msgstr "" +msgstr "{course_id}不存在 {mode}模式" #: lms/djangoapps/shoppingcart/models.py msgid "Certificate of Achievement, {mode_name} for course {course}" -msgstr "" +msgstr "获得了课程{course}的{mode_name}成绩证书" #: lms/djangoapps/shoppingcart/models.py msgid "" @@ -2584,153 +2621,149 @@ msgid "" "contact {billing_email}. Please include your order number in your e-mail. " "Please do NOT include your credit card information." msgstr "" +"注意:您可以在课程开始的两周之内取消身份认证证书选项,并申请退款。欲取得退款,请联系{billing_email},并在e-" +"mail中注明您的订单号,但不要包含您的信用卡信息。" #: lms/djangoapps/shoppingcart/reports.py msgid "Order Number" -msgstr "" +msgstr "订单号" #: lms/djangoapps/shoppingcart/reports.py msgid "Customer Name" -msgstr "" +msgstr "客户姓名" #: lms/djangoapps/shoppingcart/reports.py msgid "Date of Original Transaction" -msgstr "" +msgstr "原本事务的日期" #: lms/djangoapps/shoppingcart/reports.py msgid "Date of Refund" -msgstr "" +msgstr "偿还日期" #: lms/djangoapps/shoppingcart/reports.py msgid "Amount of Refund" -msgstr "" +msgstr "偿还总数" #: lms/djangoapps/shoppingcart/reports.py #: lms/djangoapps/shoppingcart/reports.py msgid "Service Fees (if any)" -msgstr "" +msgstr "服务费(如果有的话)" #: lms/djangoapps/shoppingcart/reports.py msgid "Purchase Time" -msgstr "" +msgstr "购买时间" #: lms/djangoapps/shoppingcart/reports.py msgid "Order ID" -msgstr "" +msgstr "订单ID" +#: lms/djangoapps/shoppingcart/reports.py #: lms/templates/open_ended_problems/open_ended_problems.html #: lms/templates/shoppingcart/verified_cert_receipt.html msgid "Status" msgstr "状态" -#: lms/djangoapps/shoppingcart/reports.py lms/templates/shoppingcart/list.html +#: lms/djangoapps/shoppingcart/reports.py msgid "Quantity" -msgstr "" +msgstr "数量" #: lms/djangoapps/shoppingcart/reports.py msgid "Unit Cost" -msgstr "" +msgstr "单位价格" #: lms/djangoapps/shoppingcart/reports.py msgid "Total Cost" -msgstr "" +msgstr "总价格" -#: lms/djangoapps/shoppingcart/reports.py lms/templates/shoppingcart/list.html -#: lms/templates/shoppingcart/receipt.html +#: lms/djangoapps/shoppingcart/reports.py msgid "Currency" -msgstr "" +msgstr "货币" -#: lms/djangoapps/shoppingcart/reports.py lms/templates/shoppingcart/list.html -#: lms/templates/shoppingcart/receipt.html -#: lms/templates/shoppingcart/verified_cert_receipt.html -#: lms/templates/shoppingcart/verified_cert_receipt.html -#: wiki/plugins/attachments/forms.py +#: lms/djangoapps/shoppingcart/reports.py wiki/plugins/attachments/forms.py msgid "Description" -msgstr "" +msgstr "描述" #: lms/djangoapps/shoppingcart/reports.py msgid "Comments" -msgstr "" +msgstr "评论" #: lms/djangoapps/shoppingcart/reports.py #: lms/djangoapps/shoppingcart/reports.py msgid "University" -msgstr "" +msgstr "大学" #: lms/djangoapps/shoppingcart/reports.py -#: lms/djangoapps/shoppingcart/reports.py cms/templates/widgets/header.html -#: cms/templates/widgets/header.html -#: lms/templates/shoppingcart/verified_cert_receipt.html +#: lms/djangoapps/shoppingcart/reports.py msgid "Course" -msgstr "" +msgstr "课程" #: lms/djangoapps/shoppingcart/reports.py msgid "Course Announce Date" -msgstr "" +msgstr "课程发布日期" -#: cms/templates/settings.html +#: lms/djangoapps/shoppingcart/reports.py cms/templates/settings.html msgid "Course Start Date" msgstr "课程开始日期" #: lms/djangoapps/shoppingcart/reports.py msgid "Course Registration Close Date" -msgstr "" +msgstr "课程注册截止日期" #: lms/djangoapps/shoppingcart/reports.py msgid "Course Registration Period" -msgstr "" +msgstr "课程注册期" #: lms/djangoapps/shoppingcart/reports.py msgid "Total Enrolled" -msgstr "" +msgstr "总参与数量" #: lms/djangoapps/shoppingcart/reports.py msgid "Audit Enrollment" -msgstr "" +msgstr "旁听注册" #: lms/djangoapps/shoppingcart/reports.py msgid "Honor Code Enrollment" -msgstr "" +msgstr "荣誉注册" #: lms/djangoapps/shoppingcart/reports.py msgid "Verified Enrollment" -msgstr "" +msgstr "已确认的注册" #: lms/djangoapps/shoppingcart/reports.py msgid "Gross Revenue" -msgstr "" +msgstr "总收入" #: lms/djangoapps/shoppingcart/reports.py msgid "Gross Revenue over the Minimum" -msgstr "" +msgstr "总收入超过最低" #: lms/djangoapps/shoppingcart/reports.py msgid "Number of Verified Students Contributing More than the Minimum" -msgstr "" +msgstr "已验证的学生贡献数量超过最低" #: lms/djangoapps/shoppingcart/reports.py msgid "Number of Refunds" -msgstr "" +msgstr "偿还数量" #: lms/djangoapps/shoppingcart/reports.py msgid "Dollars Refunded" -msgstr "" +msgstr "已偿还金额" #: lms/djangoapps/shoppingcart/reports.py msgid "Number of Transactions" -msgstr "" +msgstr "事务数量" #: lms/djangoapps/shoppingcart/reports.py msgid "Total Payments Collected" -msgstr "" +msgstr "总的已收集支付" #: lms/djangoapps/shoppingcart/reports.py msgid "Number of Successful Refunds" -msgstr "" +msgstr "成功偿还的数量" #: lms/djangoapps/shoppingcart/reports.py msgid "Total Amount of Refunds" -msgstr "" +msgstr "总偿还数量" #: lms/djangoapps/shoppingcart/views.py msgid "You must be logged-in to add to a shopping cart" @@ -2757,7 +2790,7 @@ msgstr "课程添加到购物车。" #: lms/djangoapps/shoppingcart/views.py msgid "You do not have permission to view this page." -msgstr "" +msgstr "你没有访问此页面的权限。" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The payment processor did not return a required parameter: {0}" @@ -2791,6 +2824,15 @@ msgid "" "

      \n" " " msgstr "" +"\n" +"

      \n" +"抱歉! 支付系统处理没有受理你的缴费申请。\n" +"答复是: {decision},\n" +"原因为 {reason_code}:{reason_msg}。\n" +"您尚未缴费,请尝试其他支付形式。\n" +"相关问题请联系 {email}。\n" +"

      \n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2803,6 +2845,14 @@ msgid "" "

      \n" " " msgstr "" +"\n" +"

      \n" +"抱歉! 支付系统返回的支付确认数据不一致。\n" +"无法确认支付成功并进一步处理您的订单,我们深表歉意。\n" +"具体的错误信息为:{msg}\n" +"您的信用卡可能已经被扣费了。相关问题请联系{email}。\n" +"

      \n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2814,6 +2864,13 @@ msgid "" "

      \n" " " msgstr "" +"\n" +"

      \n" +"抱歉!实际扣费金额与订单总额不符!\n" +"具体的错误信息为: {msg}。\n" +"您的信用卡可能已被扣费。相关问题请联系{email}。\n" +"

      \n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2827,6 +2884,14 @@ msgid "" "

      \n" " " msgstr "" +"\n" +"

      \n" +"抱歉! 支付系统返回信息受损,无法正确解析系统返回结果。\n" +"具体的错误信息为: {msg}。\n" +"无法验证扣费成功,也不能进一步处理您的订单,对此我们深表歉意。\n" +"您的信用卡可能已被扣费。相关问题请联系 {email}。\n" +"

      \n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "Successful transaction." @@ -2848,6 +2913,11 @@ msgid "" " Possible fix: retry the payment after 15 minutes.\n" " " msgstr "" +"\n" +"此次授权请求的merchantReferenceCode\n" +"与您15分钟内所发起的另一个授权请求的merchantReferenceCode一致。\n" +"解决方法:15分钟后再尝试支付。\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2863,6 +2933,11 @@ msgid "" " Possible fix: retry the payment after some time.\n" " " msgstr "" +"\n" +"错误: 请求已接受但服务器响应超时。\n" +"此错误不包括客户端与服务器之间的超时。\n" +"解决方法:稍后重试支付。\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2871,6 +2946,10 @@ msgid "" " Possible fix: retry the payment after some time.\n" " " msgstr "" +"\n" +"错误:请求已接受,但是服务未按时完成\n" +"解决办法:稍后再尝试支付。\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2886,6 +2965,11 @@ msgid "" " Possible fix: retry with another form of payment\n" " " msgstr "" +"\n" +"信用卡已过期。也有可能是由于您所提供的有效期\n" +"与银行提供的日期不一致。\n" +"解决办法:尝试其他支付形式\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2894,6 +2978,10 @@ msgid "" " Possible fix: retry with another form of payment\n" " " msgstr "" +"\n" +"拒绝支付。发卡行未提供其他信息。\n" +"解决办法:尝试其他支付形式\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2918,6 +3006,10 @@ msgid "" " Possible fix: retry with another form of payment\n" " " msgstr "" +"\n" +"未激活的卡或卡主未授权无卡交易。\n" +"解决办法:尝试其他交易形式\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2943,6 +3035,10 @@ msgid "" " Possible fix: retry with another form of payment\n" " " msgstr "" +"\n" +"支付系统不受理该信用卡类型。\n" +"解决办法:尝试其他支付形式\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2956,6 +3052,9 @@ msgid "" " There is a problem with our CyberSource merchant configuration. Please let us know at {0}\n" " " msgstr "" +"\n" +"此问题可能与CyberSource商务系统配置相关。请通知我们 {0}\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The requested amount exceeds the originally authorized amount." @@ -2967,7 +3066,7 @@ msgstr "处理器故障。可能的解决方法:重试支付。" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The authorization has already been captured" -msgstr "授权已经被获取" +msgstr "预授权完成" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -2981,6 +3080,10 @@ msgid "" " Possible fix: retry with the same card or another form of payment\n" " " msgstr "" +"\n" +"所发送的信用卡类型无效或者所关联的信用卡卡号错误。\n" +"解决办法:以此卡重试或者尝试其他支付形式\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The request ID is invalid." @@ -2992,6 +3095,9 @@ msgid "" " You requested a capture through the API, but there is no corresponding, unused authorization record.\n" " " msgstr "" +"\n" +"你通过API发起预授权请求,但是当前没有相关的、未使用的授权记录。\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "The transaction has already been settled or reversed." @@ -3004,10 +3110,14 @@ msgid "" " submitted to your processor. Or, you requested a void for a type of transaction that cannot be voided.\n" " " msgstr "" +"\n" +"扣费/预授权申请信息已经提交到支付系统,不可撤销。\n" +"或者,你所请求的交易类型是不可撤销的。\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "You requested a credit for a capture that was previously voided" -msgstr "" +msgstr "您请求确认扣款的预授权已经撤销" #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -3016,6 +3126,10 @@ msgid "" " Possible fix: retry the payment.\n" " " msgstr "" +"\n" +" 错误:请求已收到,但是支付服务超时。\n" +" 可能的解决办法:重试交易\n" +" " #: lms/djangoapps/shoppingcart/processors/CyberSource.py msgid "" @@ -3024,59 +3138,60 @@ msgid "" " Possible fix: retry with a different form of payment.\n" " " msgstr "" +"\n" +" 授权请求已被发卡行通过但被CyberSouce拒绝。'\n" +" 可能的解决办法:尝试其他支付形式\n" +" " #: lms/djangoapps/shoppingcart/tests/test_views.py -#: lms/templates/shoppingcart/download_report.html msgid "Download CSV Reports" -msgstr "" +msgstr "下载CSV报告" #: lms/djangoapps/shoppingcart/tests/test_views.py -#: lms/templates/shoppingcart/download_report.html msgid "" "There was an error in your date input. It should be formatted as YYYY-MM-DD" -msgstr "" +msgstr "你输入的日期有误。其格式应为YYYY-MM-DD" #: lms/djangoapps/verify_student/models.py msgid "No photo ID was provided." -msgstr "" +msgstr "照片ID未提供" #: lms/djangoapps/verify_student/models.py msgid "We couldn't read your name from your photo ID image." -msgstr "" +msgstr "我们无法从你的照片ID图像中读取你的姓名。" #: lms/djangoapps/verify_student/models.py msgid "" "The name associated with your account and the name on your ID do not match." -msgstr "" +msgstr "你账户中的姓名与你ID中的名字不相符。" #: lms/djangoapps/verify_student/models.py msgid "The image of your face was not clear." -msgstr "" +msgstr "你面部的图像不够清晰。" #: lms/djangoapps/verify_student/models.py msgid "Your face was not visible in your self-photo" -msgstr "" +msgstr "在你的个人照片中未找到面部" #: lms/djangoapps/verify_student/models.py msgid "There was an error verifying your ID photos." -msgstr "" +msgstr "验证你的ID照片时发生一个错误" #: lms/djangoapps/verify_student/views.py msgid "Selected price is not valid number." -msgstr "" +msgstr "选择的价格不是有效数字。" #: lms/djangoapps/verify_student/views.py msgid "This course doesn't support verified certificates" -msgstr "" +msgstr "本课程不支持认证证书。" #: lms/djangoapps/verify_student/views.py msgid "No selected price or selected price is below minimum." -msgstr "" +msgstr "未选择价格或选择的价格低于最低价。" -#: lms/templates/main_django.html cms/templates/base.html -#: lms/templates/main.html +#: lms/templates/main_django.html msgid "Skip to this view's content" -msgstr "" +msgstr "跳过本内容页" #: lms/templates/registration/password_reset_complete.html #: lms/templates/registration/password_reset_complete.html @@ -3125,7 +3240,7 @@ msgstr "" #: lms/templates/registration/password_reset_confirm.html msgid "The following errors occurred while processing your registration: " -msgstr "" +msgstr "在处理你注册的过程中出现以下问题:" #: lms/templates/registration/password_reset_confirm.html msgid "You must complete all fields." @@ -3226,7 +3341,7 @@ msgstr "请到以下页面设置新的密码:" msgid "" "If you didn't request this change, you can disregard this email - we have " "not yet reset your password." -msgstr "" +msgstr "如果你没有请求该变更,请忽略本邮件——我们尚未重置你的密码。" #: lms/templates/registration/password_reset_email.html msgid "Thanks for using our site!" @@ -3311,8 +3426,11 @@ msgstr "保存修改" msgid "Preview" msgstr "预览" +#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# #. Translators: this is a control to allow users to exit out of this modal #. interface (a menu or piece of UI that takes the full focus of the screen) +#: lms/templates/wiki/edit.html lms/templates/wiki/history.html +#: lms/templates/wiki/history.html lms/templates/wiki/includes/cheatsheet.html #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard.html lms/templates/forgot_password_modal.html @@ -3329,19 +3447,12 @@ msgstr "关闭" #: lms/templates/wiki/edit.html msgid "Wiki Preview" -msgstr "" +msgstr "Wiki预览" -#. #-#-#-#-# mako.po (edx-platform) #-#-#-#-# -#. Translators: this text gives status on if the modal interface (a menu or -#. piece of UI that takes the full focus of the screen) is open or not #: lms/templates/wiki/edit.html lms/templates/wiki/history.html #: lms/templates/wiki/history.html lms/templates/wiki/includes/cheatsheet.html -#: lms/templates/dashboard.html lms/templates/dashboard.html -#: lms/templates/dashboard.html lms/templates/dashboard.html -#: lms/templates/dashboard.html -#: lms/templates/modal/_modal-settings-language.html msgid "window open" -msgstr "" +msgstr "窗口打开" #: lms/templates/wiki/edit.html msgid "Back to editor" @@ -3362,7 +3473,7 @@ msgstr "" #: lms/templates/wiki/history.html msgid "(no log message)" -msgstr "" +msgstr "(无日志消息)" #: lms/templates/wiki/history.html msgid "Preview this revision" @@ -3386,7 +3497,7 @@ msgstr "转到选择的版本" #: lms/templates/wiki/history.html msgid "Wiki Revision Preview" -msgstr "" +msgstr "Wiki修订预览" #: lms/templates/wiki/history.html lms/templates/wiki/history.html msgid "Back to history view" @@ -3398,7 +3509,7 @@ msgstr "切换到这个版本" #: lms/templates/wiki/history.html msgid "Merge Revision" -msgstr "" +msgstr "合并修订" #: lms/templates/wiki/history.html msgid "Merge with current" @@ -3420,11 +3531,11 @@ msgstr "创建新的合并版本" #: lms/templates/wiki/preview_inline.html msgid "Previewing revision:" -msgstr "" +msgstr "预览修改:" #: lms/templates/wiki/preview_inline.html msgid "Previewing a merge between two revisions:" -msgstr "" +msgstr "预览两个合并的版本" #: lms/templates/wiki/preview_inline.html msgid "This revision has been deleted." @@ -3449,7 +3560,7 @@ msgstr "您需要注册或者登录才能使用这个功能。" #: lms/templates/wiki/includes/cheatsheet.html msgid "Wiki Cheatsheet" -msgstr "" +msgstr "Wiki小抄" #: lms/templates/wiki/includes/cheatsheet.html msgid "Wiki Syntax Help" @@ -3490,7 +3601,7 @@ msgstr "edX 附加:" #: lms/templates/wiki/includes/cheatsheet.html msgid "Math Expression" -msgstr "" +msgstr "数学表达式" #: lms/templates/wiki/includes/cheatsheet.html msgid "Useful examples:" @@ -3498,11 +3609,11 @@ msgstr "实用的例子:" #: lms/templates/wiki/includes/cheatsheet.html msgid "Wikipedia" -msgstr "" +msgstr "Wikipedia" #: lms/templates/wiki/includes/cheatsheet.html msgid "edX Wiki" -msgstr "" +msgstr "edX Wiki" #: lms/templates/wiki/includes/cheatsheet.html msgid "Huge Header" @@ -3552,8 +3663,11 @@ msgid "" " Markdown syntax is allowed. See the %(start_link)scheatsheet%(end_link)s for help.\n" " " msgstr "" +"\n" +"允许Markdown语法。查看%(start_link)s 备忘 %(end_link)s 以获得帮助" #: lms/templates/wiki/plugins/attachments/index.html +#: wiki/plugins/attachments/wiki_plugin.py msgid "Attachments" msgstr "附件" @@ -3704,7 +3818,7 @@ msgstr "命令是:{0!r}。工作目录是:{1!r}" #: cms/djangoapps/contentstore/git_export_utils.py msgid "Command output was: {0!r}" -msgstr "" +msgstr "命令输出: {0!r}" #: cms/djangoapps/contentstore/git_export_utils.py msgid "" @@ -3931,7 +4045,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -3999,11 +4114,9 @@ msgstr "" msgid "Privacy Policy" msgstr "" -#: cms/templates/widgets/header.html lms/templates/help_modal.html -#: lms/templates/navigation.html lms/templates/static_templates/help.html -#: lms/templates/static_templates/help.html wiki/plugins/help/wiki_plugin.py +#: wiki/plugins/help/wiki_plugin.py msgid "Help" -msgstr "" +msgstr "帮助" #: common/templates/course_modes/choose.html msgid "Upgrade Your Registration for {} | Choose Your Track" @@ -4275,11 +4388,47 @@ msgstr "出现错误,请稍后再试。" msgid "Please verify your new email" msgstr "" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "编辑" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "重设密码" @@ -4567,6 +4716,8 @@ msgid "" "this course, post in the {link_start}course discussion " "forum{link_end}." msgstr "" +"有关本课程的讲座内容,家庭作业,工具或资料等方面的问题,请发帖到 " +"{link_start}课程论坛{link_end}。" #: lms/templates/help_modal.html msgid "" @@ -4839,6 +4990,21 @@ msgstr "账户参数" msgid "Remember me" msgstr "记住我" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "" @@ -5174,6 +5340,26 @@ msgstr "欢迎!" msgid "Register below to create your {platform_name} account" msgstr "注册以创建你在 {platform_name}的账户" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "请将以下字段补充完整以完成账户注册。" @@ -5646,6 +5832,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "您的话:" @@ -5915,7 +6105,7 @@ msgstr "课程结束" #: lms/templates/courseware/course_about.html msgid "Estimated Effort" -msgstr "" +msgstr "预期课程目标" #: lms/templates/courseware/course_about.html msgid "Prerequisites" @@ -6173,14 +6363,14 @@ msgstr "作业名称:" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Course-specific grade adjustment" -msgstr "" +msgstr "调整特定课程的分数" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/instructor/instructor_dashboard_2/student_admin.html #: lms/templates/instructor/instructor_dashboard_2/student_admin.html msgid "Specify a particular problem in the course here by its url:" -msgstr "" +msgstr "通过一个特定问题的url地址来明确课程中的该问题:" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/courseware/instructor_dashboard.html @@ -6239,13 +6429,13 @@ msgstr "后台正在重新评分,活跃任务状态会出现在如下表格中 #: lms/templates/courseware/instructor_dashboard.html msgid "Select a problem and an action:" -msgstr "" +msgstr "选择问题和操作:" #: lms/templates/courseware/instructor_dashboard.html msgid "" "User requires forum administrator privileges to perform administration " "tasks. See instructor." -msgstr "" +msgstr "用户需要论坛管理员权限来完成管理任务。请联系主讲教师。" #: lms/templates/courseware/instructor_dashboard.html msgid "Explanation of Roles:" @@ -6277,13 +6467,13 @@ msgstr "课程注册数据" #: lms/templates/courseware/instructor_dashboard.html msgid "Pull enrollment from remote gradebook" -msgstr "" +msgstr "从远程成绩单中获取注册人数" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/instructor/instructor_dashboard_2/metrics.html msgid "Section:" -msgstr "" +msgstr "章节:" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/instructor/instructor_dashboard_2/membership.html @@ -6298,7 +6488,7 @@ msgstr "" #: lms/templates/courseware/instructor_dashboard.html msgid "Notify students by email" -msgstr "" +msgstr "通过邮件通知学生" #: lms/templates/courseware/instructor_dashboard.html msgid "Auto-enroll students when they activate" @@ -6569,6 +6759,10 @@ msgstr "" msgid "Course Progress for Student '{username}' ({email})" msgstr "" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -6931,14 +7125,9 @@ msgstr "我的同伴" msgid "new post title" msgstr "" -#: lms/templates/discussion/_inline_new_post.html -#: lms/templates/discussion/_new_post.html -#: lms/templates/discussion/_underscore_templates.html -#: lms/templates/discussion/mustache/_inline_discussion.mustache -#: lms/templates/discussion/mustache/_inline_discussion_cohorted.mustache #: wiki/forms.py wiki/forms.py wiki/forms.py msgid "Title" -msgstr "" +msgstr "标题" #: lms/templates/discussion/_inline_new_post.html #: lms/templates/discussion/_new_post.html @@ -7230,10 +7419,6 @@ msgstr "论坛现在正在维护,将尽快恢复正常。" msgid "User Profile" msgstr "用户资料" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7257,6 +7442,10 @@ msgstr "" msgid "View discussion" msgstr "" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7296,6 +7485,11 @@ msgid "" "by a member of the course staff." msgstr "" +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" +msgstr "" + #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." msgstr "" @@ -7398,10 +7592,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" @@ -9849,7 +10039,7 @@ msgid "" "You use the External URL value to reference the file or image from outside " "of your course. Do not use the External URL as a link value within your " "course." -msgstr "" +msgstr "你可以通过设定外部URL的值来引用你课程外的文件或者图像。请不要将外部URL值作为课程内部链接值直接使用。" #: cms/templates/asset_index.html cms/templates/container.html #: cms/templates/overview.html cms/templates/settings_graders.html @@ -10115,7 +10305,7 @@ msgstr "上述日期与尚未设定的{name}的发布日期不同。" #: cms/templates/edit_subsection.html msgid "The date above differs from the release date of {name} - {start_time}" -msgstr "" +msgstr "以上日期与{name} 的发布日期- {start_time}不一致" #: cms/templates/edit_subsection.html msgid "Sync to {name}." @@ -12036,58 +12226,58 @@ msgstr "这是一个关键字字符串。" #: wiki/admin.py wiki/models/article.py msgid "created" -msgstr "" +msgstr "创建" #: wiki/forms.py msgid "Only localhost... muahahaha" -msgstr "" +msgstr "只有localhost……哇哈哈哈" #: wiki/forms.py msgid "Initial title of the article. May be overridden with revision titles." -msgstr "" +msgstr "文章的最初标题。可能会被修正标题所覆盖。" #: wiki/forms.py msgid "Type in some contents" -msgstr "" +msgstr "请键入一些内容" #: wiki/forms.py msgid "" "This is just the initial contents of your article. After creating it, you " "can use more complex features like adding plugins, meta data, related " "articles etc..." -msgstr "" +msgstr "这只是您文章的最初内容。在创建它以后,您可以使用更复杂的特性,比如说增加插件、元数据、相关文章等等......" #: wiki/forms.py wiki/forms.py msgid "Contents" -msgstr "" +msgstr "内容" #: wiki/forms.py wiki/forms.py msgid "Summary" -msgstr "" +msgstr "摘要" #: wiki/forms.py msgid "" "Give a short reason for your edit, which will be stated in the revision log." -msgstr "" +msgstr "给个编辑的理由,这理由将会被记录到修正日志里。" #: wiki/forms.py msgid "" "While you were editing, someone else changed the revision. Your contents " "have been automatically merged with the new contents. Please review the text" " below." -msgstr "" +msgstr "当你在编辑之时,别人进行了修改,您的内容已自动与其合并,请检查以下的文字。" #: wiki/forms.py msgid "No changes made. Nothing to save." -msgstr "" +msgstr "没有变更,不需要保存。" #: wiki/forms.py msgid "Select an option" -msgstr "" +msgstr "请选择" #: wiki/forms.py msgid "Slug" -msgstr "" +msgstr "固定链接地址" #: wiki/forms.py msgid "" @@ -12095,267 +12285,268 @@ msgid "" "alphanumeric characters and - or _. Note that you cannot change the slug " "after creating the article." msgstr "" +"这个地址将用于定位你的文档。请使用由数字、字母、-(减号)、_(下划线)组成的字符串。注意:一旦文档创建完毕将不能再对此固定链接地址进行修改。" #: wiki/forms.py msgid "Write a brief message for the article's history log." -msgstr "" +msgstr "为文章的历史记录写一个 简短的报告" #: wiki/forms.py msgid "A slug may not begin with an underscore." -msgstr "" +msgstr "不能使用下划线作为固定链接的起始字符。" #: wiki/forms.py msgid "A deleted article with slug \"%s\" already exists." -msgstr "" +msgstr "已经存在一个固定链接地址为\"%s\"的已删除文档。" #: wiki/forms.py msgid "A slug named \"%s\" already exists." -msgstr "" +msgstr "以\"%s\"命名的固定链接地址已经存在。" #: wiki/forms.py msgid "Yes, I am sure" -msgstr "" +msgstr "是的,我确定" #: wiki/forms.py msgid "Purge" -msgstr "" +msgstr "清除" #: wiki/forms.py msgid "" "Purge the article: Completely remove it (and all its contents) with no undo." " Purging is a good idea if you want to free the slug such that users can " "create new articles in its place." -msgstr "" +msgstr "清除文档:完全删除它(以及其中的内容)且无法恢复。当你需要释放该固定链接地址以便可以创建一个新文档继承使用该固定链接地址时选择清除操作。" #: wiki/forms.py wiki/plugins/attachments/forms.py #: wiki/plugins/images/forms.py msgid "You are not sure enough!" -msgstr "" +msgstr "你还不够确定!" #: wiki/forms.py msgid "While you tried to delete this article, it was modified. TAKE CARE!" -msgstr "" +msgstr "在您试图删除该文章期间,它已经被修改。请特别注意!" #: wiki/forms.py msgid "Lock article" -msgstr "" +msgstr "锁定文章" #: wiki/forms.py msgid "Deny all users access to edit this article." -msgstr "" +msgstr "不允许其他用户编辑该文章。" #: wiki/forms.py msgid "Permissions" -msgstr "" +msgstr "权限" #: wiki/forms.py msgid "Owner" -msgstr "" +msgstr "所有者" #: wiki/forms.py msgid "Enter the username of the owner." -msgstr "" +msgstr "请输入所有者用户名。" #: wiki/forms.py msgid "(none)" -msgstr "" +msgstr "(空)" #: wiki/forms.py msgid "Inherit permissions" -msgstr "" +msgstr "继承权限" #: wiki/forms.py msgid "" "Check here to apply the above permissions recursively to articles under this" " one." -msgstr "" +msgstr "选择此项将使上述权限对以下的文档递归生效。" #: wiki/forms.py msgid "Permission settings for the article were updated." -msgstr "" +msgstr "文档的权限设置已更新。" #: wiki/forms.py msgid "Your permission settings were unchanged, so nothing saved." -msgstr "" +msgstr "你的权限设置没有变更,不需要保存。" #: wiki/forms.py msgid "No user with that username" -msgstr "" +msgstr "找不到此用户名所对应的用户" #: wiki/forms.py msgid "Article locked for editing" -msgstr "" +msgstr "文章在编辑中,已被锁定" #: wiki/forms.py msgid "Article unlocked for editing" -msgstr "" +msgstr "文章已解锁,可以编辑" #: wiki/forms.py msgid "Filter..." -msgstr "" +msgstr "过滤..." #: wiki/core/plugins/base.py msgid "Settings for plugin" -msgstr "" +msgstr "插件设置" #: wiki/models/article.py wiki/models/pluginbase.py #: wiki/plugins/attachments/models.py msgid "current revision" -msgstr "" +msgstr "当前版本" #: wiki/models/article.py msgid "" "The revision being displayed for this article. If you need to do a roll-" "back, simply change the value of this field." -msgstr "" +msgstr "显示该文档的对应版本。如果你需要回滚到历史版本,请修改空格里的值。" #: wiki/models/article.py msgid "modified" -msgstr "" +msgstr "已修改" #: wiki/models/article.py msgid "Article properties last modified" -msgstr "" +msgstr "最后更新的文章属性" #: wiki/models/article.py msgid "owner" -msgstr "" +msgstr "所有者" #: wiki/models/article.py msgid "" "The owner of the article, usually the creator. The owner always has both " "read and write access." -msgstr "" +msgstr "文章的所有者,通常是创建者。所有者总是拥有读写权限。" #: wiki/models/article.py msgid "group" -msgstr "" +msgstr "分组" #: wiki/models/article.py msgid "" "Like in a UNIX file system, permissions can be given to a user according to " "group membership. Groups are handled through the Django auth system." -msgstr "" +msgstr "类似UNIX文件系统,权限可以根据用户的用户组授予。用户组通过Django的认证系统管理。" #: wiki/models/article.py msgid "group read access" -msgstr "" +msgstr "用户组读访问权限" #: wiki/models/article.py msgid "group write access" -msgstr "" +msgstr "用户组写访问权限" #: wiki/models/article.py msgid "others read access" -msgstr "" +msgstr "其他用户读访问权限" #: wiki/models/article.py msgid "others write access" -msgstr "" +msgstr "其他用户写访问权限" #: wiki/models/article.py msgid "Article without content (%(id)d)" -msgstr "" +msgstr "文档中没有内容(%(id)d)" #: wiki/models/article.py msgid "content type" -msgstr "" +msgstr "内容类型" #: wiki/models/article.py msgid "object ID" -msgstr "" +msgstr "对象ID" #: wiki/models/article.py msgid "Article for object" -msgstr "" +msgstr "对象的文档" #: wiki/models/article.py msgid "Articles for object" -msgstr "" +msgstr "对象的文档" #: wiki/models/article.py msgid "revision number" -msgstr "" +msgstr "版本修订号" #: wiki/models/article.py msgid "IP address" -msgstr "" +msgstr "IP地址" #: wiki/models/article.py msgid "user" -msgstr "" +msgstr "用户" #: wiki/models/article.py msgid "locked" -msgstr "" +msgstr "已锁定" #: wiki/models/article.py wiki/models/pluginbase.py msgid "article" -msgstr "" +msgstr "文档" #: wiki/models/article.py msgid "article contents" -msgstr "" +msgstr "文档内容" #: wiki/models/article.py msgid "article title" -msgstr "" +msgstr "文档标题" #: wiki/models/article.py msgid "" "Each revision contains a title field that must be filled out, even if the " "title has not changed" -msgstr "" +msgstr "每一次版本修订都必须包含有标题,即使标题本身并没有发生变化" #: wiki/models/pluginbase.py msgid "original article" -msgstr "" +msgstr "原始文档" #: wiki/models/pluginbase.py msgid "Permissions are inherited from this article" -msgstr "" +msgstr "从该文档继承的权限" #: wiki/models/pluginbase.py msgid "A plugin was changed" -msgstr "" +msgstr "一个插件被变更" #: wiki/models/pluginbase.py msgid "" "The revision being displayed for this plugin.If you need to do a roll-back, " "simply change the value of this field." -msgstr "" +msgstr "显示插件修订版本信息。如果你需要回滚到历史版本,请修改此处的值。" #: wiki/models/urlpath.py msgid "Cache lookup value for articles" -msgstr "" +msgstr "缓存文档的查找值" #: wiki/models/urlpath.py msgid "slug" -msgstr "" +msgstr "固定链接地址" #: wiki/models/urlpath.py msgid "(root)" -msgstr "" +msgstr "(root)" #: wiki/models/urlpath.py msgid "URL path" -msgstr "" +msgstr "URL路径" #: wiki/models/urlpath.py msgid "URL paths" -msgstr "" +msgstr "URL路径" #: wiki/models/urlpath.py msgid "Sorry but you cannot have a root article with a slug." -msgstr "" +msgstr "抱歉,你无法对根文档设置固定链接地址。" #: wiki/models/urlpath.py msgid "A non-root note must always have a slug." -msgstr "" +msgstr "非根节点必须有固定链接地址。" #: wiki/models/urlpath.py msgid "There is already a root node on %s" -msgstr "" +msgstr "在%s已经存在一个根节点" #: wiki/models/urlpath.py msgid "" @@ -12364,273 +12555,276 @@ msgid "" "\n" "The children of this article have had their parents deleted. You should probably find a new home for them." msgstr "" +"丢失父链接的文档\n" +"===============================\n" +"该子文档的父链接已经被删除。你可以可以重新为他们寻找一个新的链接点。" #: wiki/models/urlpath.py msgid "Lost and found" -msgstr "" +msgstr "失物招领" #: wiki/plugins/attachments/forms.py msgid "A short summary of what the file contains" -msgstr "" +msgstr "该文档包含内容的简要说明" #: wiki/plugins/attachments/forms.py msgid "Yes I am sure..." -msgstr "" +msgstr "是的我很确定......" #: wiki/plugins/attachments/markdown_extensions.py msgid "Click to download file" -msgstr "" +msgstr "点击以下载文件" #: wiki/plugins/attachments/models.py msgid "" "The revision of this attachment currently in use (on all articles using the " "attachment)" -msgstr "" +msgstr "该附件的修订版本正在使用中(适用于所有使用该附件的文档)" #: wiki/plugins/attachments/models.py msgid "original filename" -msgstr "" +msgstr "原始文件名" #: wiki/plugins/attachments/models.py msgid "attachment" -msgstr "" +msgstr "附件" #: wiki/plugins/attachments/models.py msgid "attachments" -msgstr "" +msgstr "附件" #: wiki/plugins/attachments/models.py msgid "file" -msgstr "" +msgstr "文件" #: wiki/plugins/attachments/models.py msgid "attachment revision" -msgstr "" +msgstr "附件修订版本" #: wiki/plugins/attachments/models.py msgid "attachment revisions" -msgstr "" +msgstr "附件修订版本" #: wiki/plugins/attachments/views.py msgid "%s was successfully added." -msgstr "" +msgstr "%s已经成功添加。" #: wiki/plugins/attachments/views.py wiki/plugins/attachments/views.py msgid "Your file could not be saved: %s" -msgstr "" +msgstr "你的文件无法被保存:%s" #: wiki/plugins/attachments/views.py wiki/plugins/attachments/views.py msgid "" "Your file could not be saved, probably because of a permission error on the " "web server." -msgstr "" +msgstr "你的文件无法被保存,可能是由于或者Web服务器的权限异常。" #: wiki/plugins/attachments/views.py msgid "%s uploaded and replaces old attachment." -msgstr "" +msgstr "%s上传成功并覆盖原有附件。" #: wiki/plugins/attachments/views.py msgid "" "Your new file will automatically be renamed to match the file already " "present. Files with different extensions are not allowed." -msgstr "" +msgstr "你的新文件将被自动重命名以匹配已经存在的文件。不允许使用不同的文件扩展名。" #: wiki/plugins/attachments/views.py msgid "Current revision changed for %s." -msgstr "" +msgstr "对%s当前修订版本的变更。" #: wiki/plugins/attachments/views.py msgid "Added a reference to \"%(att)s\" from \"%(art)s\"." -msgstr "" +msgstr "从“%(art)s”添加一个引用到\"%(att)s\"。" #: wiki/plugins/attachments/views.py msgid "The file %s was deleted." -msgstr "" +msgstr "文档%s被删除。" #: wiki/plugins/attachments/views.py msgid "This article is no longer related to the file %s." -msgstr "" +msgstr "该文档与文件%s不再关联。" #: wiki/plugins/attachments/wiki_plugin.py msgid "A file was changed: %s" -msgstr "" +msgstr "文件被修改:%s" #: wiki/plugins/attachments/wiki_plugin.py msgid "A file was deleted: %s" -msgstr "" +msgstr "文件被删除:%s" #: wiki/plugins/images/forms.py msgid "" "New image %s was successfully uploaded. You can use it by selecting it from " "the list of available images." -msgstr "" +msgstr "新图片%s已经成功上传,您可以从图片库中选择使用它。" #: wiki/plugins/images/forms.py msgid "Are you sure?" -msgstr "" +msgstr "您确定?" #: wiki/plugins/images/models.py msgid "image" -msgstr "" +msgstr "图片" #: wiki/plugins/images/models.py msgid "images" -msgstr "" +msgstr "图片" #: wiki/plugins/images/models.py msgid "Image: %s" -msgstr "" +msgstr "图片:%s" #: wiki/plugins/images/models.py msgid "Current revision not set!!" -msgstr "" +msgstr "尚未设置当前的修订版本!!" #: wiki/plugins/images/models.py msgid "image revision" -msgstr "" +msgstr "图片修订版本" #: wiki/plugins/images/models.py msgid "image revisions" -msgstr "" +msgstr "图片修订版本" #: wiki/plugins/images/models.py msgid "Image Revsion: %d" -msgstr "" +msgstr "图片修订版本:%d" #: wiki/plugins/images/views.py msgid "%s has been restored" -msgstr "" +msgstr "%s已经被恢复" #: wiki/plugins/images/views.py msgid "%s has been marked as deleted" -msgstr "" +msgstr "%s已经被标注为已删除" #: wiki/plugins/images/views.py msgid "%(file)s has been changed to revision #%(revision)d" -msgstr "" +msgstr "%(file)s已经被变更到修订版本#%(revision)d" #: wiki/plugins/images/views.py msgid "%(file)s has been saved." -msgstr "" +msgstr "%(file)s已经被保存。" #: wiki/plugins/images/wiki_plugin.py msgid "Images" -msgstr "" +msgstr "图片" #: wiki/plugins/images/wiki_plugin.py msgid "An image was added: %s" -msgstr "" +msgstr "已经添加图片:%s" #: wiki/plugins/links/wiki_plugin.py msgid "Links" -msgstr "" +msgstr "链接" #: wiki/plugins/notifications/forms.py msgid "Notifications" -msgstr "" +msgstr "通知" #: wiki/plugins/notifications/forms.py msgid "When this article is edited" -msgstr "" +msgstr "当这篇文章被编辑" #: wiki/plugins/notifications/forms.py msgid "Also receive emails about article edits" -msgstr "" +msgstr "接收关于该文档编辑的电子邮件" #: wiki/plugins/notifications/forms.py msgid "Your notification settings were updated." -msgstr "" +msgstr "你的通知设置已经更新。" #: wiki/plugins/notifications/forms.py msgid "Your notification settings were unchanged, so nothing saved." -msgstr "" +msgstr "你的通知设置没有变更,因此无需保存。" #: wiki/plugins/notifications/models.py msgid "%(user)s subscribing to %(article)s (%(type)s)" -msgstr "" +msgstr "%(user)s订阅%(article)s(%(type)s)" #: wiki/plugins/notifications/models.py msgid "Article deleted: %s" -msgstr "" +msgstr "被删除的文档:%s" #: wiki/plugins/notifications/models.py msgid "Article modified: %s" -msgstr "" +msgstr "被修改文档:%s" #: wiki/plugins/notifications/models.py msgid "New article created: %s" -msgstr "" +msgstr "创建的新文档:%s" #: wiki/views/accounts.py msgid "You are now sign up... and now you can sign in!" -msgstr "" +msgstr "您已经注册...现在可以登录了!" #: wiki/views/accounts.py msgid "You are no longer logged in. Bye bye!" -msgstr "" +msgstr "您已经退出。再见!" #: wiki/views/accounts.py msgid "You are now logged in! Have fun!" -msgstr "" +msgstr "您已经登录!好好体验吧!" #: wiki/views/article.py msgid "New article '%s' created." -msgstr "" +msgstr "新文档'%s'已经创建。" #: wiki/views/article.py msgid "There was an error creating this article: %s" -msgstr "" +msgstr "该文档创建过程中出错:%s" #: wiki/views/article.py msgid "There was an error creating this article." -msgstr "" +msgstr "在文档创建过程中出错了。" #: wiki/views/article.py msgid "" "This article cannot be deleted because it has children or is a root article." -msgstr "" +msgstr "这篇文章不能被删除,因为它有子类或是根文章。" #: wiki/views/article.py msgid "" "This article together with all its contents are now completely gone! Thanks!" -msgstr "" +msgstr "文档及其所有内容已经删除!谢谢!" #: wiki/views/article.py msgid "" "The article \"%s\" is now marked as deleted! Thanks for keeping the site " "free from unwanted material!" -msgstr "" +msgstr "文档\"%s\"当前被标记为删除!感谢您为网站清除不必要的材料!" #: wiki/views/article.py msgid "Your changes were saved." -msgstr "" +msgstr "您的更改已被保存。" #: wiki/views/article.py msgid "A new revision of the article was succesfully added." -msgstr "" +msgstr "成功添加了这篇文章的新的版本" #: wiki/views/article.py msgid "Restoring article" -msgstr "" +msgstr "恢复文档" #: wiki/views/article.py msgid "The article \"%s\" and its children are now restored." -msgstr "" +msgstr "文档\"%s\"及其子链接已经被恢复。" #: wiki/views/article.py msgid "The article %s is now set to display revision #%d" -msgstr "" +msgstr "文档%s当前被设置为显示修订版本#%d" #: wiki/views/article.py msgid "New title" -msgstr "" +msgstr "新标题" #: wiki/views/article.py msgid "Merge between Revision #%(r1)d and Revision #%(r2)d" -msgstr "" +msgstr "合并修订版本#%(r1)d与#%(r2)d" #: wiki/views/article.py msgid "" "A new revision was created: Merge between Revision #%(r1)d and Revision " "#%(r2)d" -msgstr "" +msgstr "产生新的修订版本:合并修订版本#%(r1)d与#%(r2)d" diff --git a/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo b/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo index d27d368873bb..f70eb863c02b 100644 Binary files a/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo and b/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po index ac30b419d2eb..ef060198cd0b 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po @@ -58,9 +58,9 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-21 14:45+0000\n" -"Last-Translator: fmyzjs \n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" +"Last-Translator: sarina \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/edx-platform/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -376,6 +376,7 @@ msgstr "显示讨论" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "很抱歉" @@ -537,6 +538,10 @@ msgstr "加载下面的%(numResponses)s条回复" msgid "Are you sure you want to delete this post?" msgstr "您确定要删除这个帖子?" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "匿名" @@ -913,7 +918,7 @@ msgstr "成为beta测试者之前,需要创建并激活账户。" #. usernames) appears after this sentence; #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Could not find users associated with the following identifiers:" -msgstr "" +msgstr "未能找到与以下ID关联的用户:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Error enrolling/unenrolling users." @@ -921,7 +926,7 @@ msgstr "用户登记/取消登记出错。" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "The following email addresses and/or usernames are invalid:" -msgstr "" +msgstr "以下电子邮件地址/用户名无效:" #: lms/static/coffee/src/instructor_dashboard/membership.js msgid "Successfully enrolled and sent email to the following users:" @@ -1376,11 +1381,11 @@ msgstr "学生数目" msgid "" "This may be happening because of an error with our server or your internet " "connection. Try refreshing the page or making sure you are online." -msgstr "" +msgstr "此情况可能由于服务器错误或者你的网络连接错误导致。尝试刷新页面或者确保网络畅通。" #: cms/static/coffee/src/main.js msgid "Studio's having trouble saving your work" -msgstr "" +msgstr "Studio 保存您工作时遇到问题" #: cms/static/coffee/src/views/tabs.js cms/static/coffee/src/views/tabs.js #: cms/static/coffee/src/views/unit.js @@ -1394,13 +1399,13 @@ msgstr "保存中…" #: cms/static/coffee/src/views/tabs.js msgid "Delete Component Confirmation" -msgstr "" +msgstr "删除组件确认" #: cms/static/coffee/src/views/tabs.js msgid "" "Are you sure you want to delete this component? This action cannot be " "undone." -msgstr "" +msgstr "您确定删除此组件吗?此操作不可恢复。" #: cms/static/coffee/src/views/tabs.js cms/static/coffee/src/views/unit.js #: cms/static/js/base.js cms/static/js/views/course_info_update.js @@ -1410,23 +1415,23 @@ msgstr "删除中…" #: cms/static/coffee/src/views/unit.js msgid "Adding…" -msgstr "" +msgstr "增加…" #: cms/static/coffee/src/views/unit.js cms/static/js/views/pages/container.js msgid "Duplicating…" -msgstr "" +msgstr "复制…" #: cms/static/coffee/src/views/unit.js cms/static/js/views/pages/container.js msgid "Delete this component?" -msgstr "" +msgstr "删除此组件?" #: cms/static/coffee/src/views/unit.js cms/static/js/views/pages/container.js msgid "Deleting this component is permanent and cannot be undone." -msgstr "" +msgstr "删除此组件是永久性的且不可恢复。" #: cms/static/coffee/src/views/unit.js cms/static/js/views/pages/container.js msgid "Yes, delete this component" -msgstr "" +msgstr "是的,删除这个组件" #: cms/static/js/base.js msgid "This link will open in a modal window" @@ -1446,11 +1451,11 @@ msgstr "确认,删除" #: cms/static/js/index.js msgid "Please do not use any spaces in this field." -msgstr "" +msgstr "此字段的内容不能包含空格。" #: cms/static/js/index.js msgid "Please do not use any spaces or special characters in this field." -msgstr "" +msgstr "此字段的内容不能包含空格或特殊字符。" #: cms/static/js/index.js msgid "" @@ -1478,7 +1483,7 @@ msgstr "您必须指定一个名称" msgid "" "Only <%= fileTypes %> files can be uploaded. Please select a file ending in " "<%= fileExtensions %> to upload." -msgstr "" +msgstr "只有 <%= fileTypes %> 格式的文件可以上传。请选择一个以 <%= fileExtensions %> 结尾的文件上传。" #: cms/static/js/models/uploads.js msgid "or" @@ -1510,31 +1515,31 @@ msgstr "关键字只能包含字母、数字、下划线和连字符。" #: cms/static/js/models/settings/course_grader.js msgid "There's already another assignment type with this name." -msgstr "" +msgstr "已经有另一个作业类型使用了这个名字。" #: cms/static/js/models/settings/course_grader.js msgid "Please enter an integer between 0 and 100." -msgstr "" +msgstr "请输入一个0到100之间的整数。" #: cms/static/js/models/settings/course_grader.js msgid "Please enter an integer greater than 0." -msgstr "" +msgstr "请输入一个大于0的整数。" #: cms/static/js/models/settings/course_grader.js msgid "Please enter non-negative integer." -msgstr "" +msgstr "请输入非负整数。" #: cms/static/js/models/settings/course_grader.js msgid "Cannot drop more <% attrs.types %> than will assigned." -msgstr "" +msgstr "删除的<% attrs.types %>不能超过将分配的数量。" #: cms/static/js/models/settings/course_grading_policy.js msgid "Grace period must be specified in HH:MM format." -msgstr "" +msgstr "宽限时间必须以 HH:MM 格式设定。" #: cms/static/js/views/asset.js msgid "Delete File Confirmation" -msgstr "" +msgstr "删除文件确认" #: cms/static/js/views/asset.js msgid "" @@ -1569,62 +1574,66 @@ msgstr "你确定要删除这份更新吗?" #: cms/static/js/views/course_info_update.js msgid "This action cannot be undone." -msgstr "" +msgstr "这个动作无法取消。" #: cms/static/js/views/edit_chapter.js msgid "Upload a new PDF to “<%= name %>”" -msgstr "" +msgstr "上传一个新的PDF文件至\"<%= name %>\"" #: cms/static/js/views/edit_chapter.js msgid "Please select a PDF file to upload." -msgstr "" +msgstr "请选择上传一个PDF文件。" #: cms/static/js/views/edit_textbook.js #: cms/static/js/views/overview_assignment_grader.js msgid "Saving" -msgstr "" +msgstr "保存中" #: cms/static/js/views/import.js msgid "There was an error with the upload" -msgstr "" +msgstr "文件上传错误" #: cms/static/js/views/import.js msgid "" "File format not supported. Please upload a file with a tar.gz " "extension." +msgstr "文件格式不支持。请上传一个后缀名为tar.gz的文件。" + +#: cms/static/js/views/metadata.js +msgid "Upload File" msgstr "" #: cms/static/js/views/overview.js msgid "Collapse All Sections" -msgstr "" +msgstr "折叠所有章节" #: cms/static/js/views/overview.js msgid "Expand All Sections" -msgstr "" +msgstr "展开所有章节" #: cms/static/js/views/overview.js msgid "Release date:" -msgstr "" +msgstr "发布日期:" #: cms/static/js/views/overview.js msgid "{month}/{day}/{year} at {hour}:{minute} UTC" -msgstr "" +msgstr "{year} 年{month}月{day}日 {hour}时{minute}分 国际标准时间" #: cms/static/js/views/overview.js msgid "Edit section release date" -msgstr "" +msgstr "修改章节发布日期" #: cms/static/js/views/overview_assignment_grader.js msgid "Not Graded" -msgstr "" +msgstr "未评分" #: cms/static/js/views/paging.js msgid "ascending" -msgstr "" +msgstr "升序" #: cms/static/js/views/paging.js msgid "descending" -msgstr "" +msgstr "降序" #: cms/static/js/views/paging_header.js msgid "" @@ -1632,112 +1641,115 @@ msgid "" "%(total_span)s%(total)s total%(end_span)s, sorted by " "%(order_span)s%(sort_order)s%(end_span)s %(sort_direction)s" msgstr "" +"总计%(total_span)s%(total)s%(end_span)s,以 " +"%(order_span)s%(sort_order)s%(end_span)s " +"%(sort_direction)s方式排序,显示为%(current_span)s%(start)s-%(end)s%(end_span)s" #: cms/static/js/views/section_edit.js msgid "Your change could not be saved" -msgstr "" +msgstr "您的更改无法保存" #: cms/static/js/views/section_edit.js msgid "Return and resolve this issue" -msgstr "" +msgstr "返回并解决这个问题" #: cms/static/js/views/show_textbook.js msgid "Delete “<%= name %>”?" -msgstr "" +msgstr "删除\"<%= name %>\"?" #: cms/static/js/views/show_textbook.js msgid "" "Deleting a textbook cannot be undone and once deleted any reference to it in" " your courseware's navigation will also be removed." -msgstr "" +msgstr "删除教材的操作无法撤销,同时课件导航中对该教材的引用也将被移除。" #: cms/static/js/views/show_textbook.js msgid "Deleting" -msgstr "" +msgstr "删除中" #: cms/static/js/views/uploads.js msgid "Upload" -msgstr "" +msgstr "上传" #: cms/static/js/views/uploads.js msgid "We're sorry, there was an error" -msgstr "" +msgstr "很抱歉,出现错误" #: cms/static/js/views/validation.js msgid "You've made some changes" -msgstr "" +msgstr "您已更改" #: cms/static/js/views/validation.js msgid "Your changes will not take effect until you save your progress." -msgstr "" +msgstr "您所作变更在保存后才能生效。" #: cms/static/js/views/validation.js msgid "You've made some changes, but there are some errors" -msgstr "" +msgstr "您所作变更存在错误" #: cms/static/js/views/validation.js msgid "" "Please address the errors on this page first, and then save your progress." -msgstr "" +msgstr "请先解决本页存在的错误,然后保存。" #: cms/static/js/views/validation.js msgid "Save Changes" -msgstr "" +msgstr "保存更改" #: cms/static/js/views/validation.js msgid "Your changes have been saved." -msgstr "" +msgstr "您所作变更已保存。" #: cms/static/js/views/xblock_editor.js msgid "Editor" -msgstr "" +msgstr "编辑器" #: cms/static/js/views/xblock_editor.js msgid "Settings" -msgstr "" +msgstr "设置" #: cms/static/js/views/modals/base_modal.js msgid "Save" -msgstr "" +msgstr "保存" #: cms/static/js/views/modals/edit_xblock.js msgid "Component" -msgstr "" +msgstr "组件" #: cms/static/js/views/modals/edit_xblock.js msgid "Editing: %(title)s" -msgstr "" +msgstr "编辑:%(title)s" #: cms/static/js/views/settings/advanced.js msgid "" "Your changes will not take effect until you save your progress. Take care " "with key and value formatting, as validation is not implemented." -msgstr "" +msgstr "变更在保存之后生效。由于系统暂时不支持校验功能,请仔细检查策略键值对设置。" #: cms/static/js/views/settings/advanced.js msgid "Your policy changes have been saved." -msgstr "" +msgstr "您的策略变更已保存。" #: cms/static/js/views/settings/advanced.js msgid "" "Please note that validation of your policy key and value pairs is not " "currently in place yet. If you are having difficulties, please review your " "policy pairs." -msgstr "" +msgstr "请注意:当前策略键值对并未校验。如果遇到问题,请重新检查策略键值对设置。" #: cms/static/js/views/settings/main.js msgid "Upload your course image." -msgstr "" +msgstr "上传您的课程图片。" #: cms/static/js/views/settings/main.js msgid "Files must be in JPEG or PNG format." -msgstr "" +msgstr "文件必须是JPEG或者PNG格式。" #: cms/static/js/views/video/translations_editor.js msgid "" "Sorry, there was an error parsing the subtitles that you uploaded. Please " "check the format and try again." -msgstr "" +msgstr "对不起,您上传的字幕文件存在格式错误,请检查并重新上传。" #: cms/static/js/views/video/translations_editor.js msgid "Upload translation" diff --git a/conf/locale/zh_TW/LC_MESSAGES/django.mo b/conf/locale/zh_TW/LC_MESSAGES/django.mo index 4ffd865886c4..9b97ca72be3b 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 7c6107607cae..2cb9add281db 100644 --- a/conf/locale/zh_TW/LC_MESSAGES/django.po +++ b/conf/locale/zh_TW/LC_MESSAGES/django.po @@ -9,6 +9,7 @@ # JoeyChiou , 2013 # JoeyChiou , 2013 # okalright , 2013 +# bhsfmiao , 2014 # okalright , 2013-2014 # tosti , 2013 # 毅 歐陽 , 2014 @@ -39,6 +40,7 @@ # JoeyChiou , 2013 # lin31504 , 2014 # okalright , 2013-2014 +# bhsfmiao , 2014 # okalright , 2013-2014 # TSHIH , 2013 # tosti , 2013 @@ -51,7 +53,9 @@ # # Translators: # JoeyChiou , 2013 +# lin31504 , 2014 # okalright , 2014 +# bhsfmiao , 2014 # okalright , 2013-2014 # tosti , 2013 # TSHIH , 2013 @@ -79,7 +83,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:02-0400\n" +"POT-Creation-Date: 2014-04-27 11:11-0400\n" "PO-Revision-Date: 2014-04-10 20:10+0000\n" "Last-Translator: Yu-Ren Chen \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/edx-platform/language/zh_TW/)\n" @@ -212,6 +216,16 @@ msgstr "您還沒有註冊本課程" msgid "Enrollment action is invalid" msgstr "註冊操作無效" +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like +#. Google or LinkedIn). +#: common/djangoapps/student/views.py +msgid "" +"There is no {platform_name} account associated with your {provider_name} " +"account. Please use your {platform_name} credentials or pick another " +"provider." +msgstr "" + #: common/djangoapps/student/views.py msgid "There was an error receiving your login information. Please email us." msgstr "接受您的登入訊息時發生錯誤,請用電子郵件與我們聯絡。" @@ -858,6 +872,10 @@ msgid "" "by that feedback." msgstr "" +#: common/lib/capa/capa/inputtypes.py +msgid "No response from Xqueue within {xqueue_timeout} seconds. Aborted." +msgstr "" + #: common/lib/capa/capa/responsetypes.py msgid "Error {err} in evaluating hint function {hintfn}." msgstr "" @@ -1923,13 +1941,8 @@ msgstr "" #: lms/djangoapps/instructor/views/instructor_dashboard.py #: lms/templates/instructor/instructor_dashboard_2/data_download.html -#, fuzzy msgid "Data Download" -msgstr "" -"#-#-#-#-# django-partial.po (edx-platform) #-#-#-#-#\n" -"資料下載\n" -"#-#-#-#-# mako.po (edx-platform) #-#-#-#-#\n" -"數據下載" +msgstr "資料下載" #: lms/djangoapps/instructor/views/instructor_dashboard.py #: lms/templates/courseware/instructor_dashboard.html @@ -1938,7 +1951,7 @@ msgstr "分析" #: lms/djangoapps/instructor/views/legacy.py msgid "Course Statistics At A Glance" -msgstr "" +msgstr "課程統計一覽" #: lms/djangoapps/instructor/views/legacy.py msgid "Found a single student. " @@ -1950,7 +1963,7 @@ msgstr "無法透過電子郵件或是使用者名稱找到學生。" #: lms/djangoapps/instructor/views/legacy.py msgid "List of students enrolled in {course_id}" -msgstr "" +msgstr "已註冊{course_id}的學生清單" #: lms/djangoapps/instructor/views/legacy.py msgid "Summary Grades of students enrolled in {course_id}" @@ -2174,7 +2187,7 @@ msgstr "全名" #: lms/djangoapps/instructor/views/legacy.py msgid "edX email" -msgstr "" +msgstr "edX 電子郵件帳號" #: lms/djangoapps/instructor/views/legacy.py msgid "Enrollment of students" @@ -3874,7 +3887,8 @@ msgstr "" #: cms/templates/login.html cms/templates/register.html #: lms/templates/login.html lms/templates/provider_login.html #: lms/templates/provider_login.html lms/templates/register.html -#: lms/templates/signup_modal.html lms/templates/sysadmin_dashboard.html +#: lms/templates/register.html lms/templates/signup_modal.html +#: lms/templates/sysadmin_dashboard.html #: lms/templates/university_profile/edge.html msgid "Password" msgstr "" @@ -4221,11 +4235,47 @@ msgstr "發生錯誤。請稍後再試一次。" msgid "Please verify your new email" msgstr "請驗證您的新電子郵件信箱" +#. Translators: this message is displayed when a user tries to link their +#. account with a third-party authentication provider (for example, Google or +#. LinkedIn) with a given edX account, but their third-party account is +#. already +#. associated with another edX account. provider_name is the name of the +#. third-party authentication provider, and platform_name is the name of the +#. edX deployment. +#: lms/templates/dashboard.html +msgid "" +"The selected {provider_name} account is already linked to another " +"{platform_name} account. Please {link_start}log out{link_end}, then log in " +"with your {provider_name} account." +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html #: lms/templates/dashboard/_dashboard_info_language.html msgid "edit" msgstr "編輯" +#. Translators: this section lists all the third-party authentication +#. providers +#. (for example, Google and LinkedIn) the user can link with or unlink from +#. their edX account. +#: lms/templates/dashboard.html +msgid "Account Links" +msgstr "" + +#. Translators: clicking on this removes the link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "unlink" +msgstr "" + +#. Translators: clicking on this creates a link between a user's edX account +#. and their account with an external authentication provider (like Google or +#. LinkedIn). +#: lms/templates/dashboard.html +msgid "link" +msgstr "" + #: lms/templates/dashboard.html lms/templates/dashboard.html msgid "Reset Password" msgstr "重置密碼" @@ -4788,6 +4838,21 @@ msgstr "帳戶偏好" msgid "Remember me" msgstr "記住我" +#. Translators: this is the last choice of a number of choices of how to log +#. in +#. to the site. +#: lms/templates/login.html +msgid "or, if you have connected one of these providers, log in below." +msgstr "" + +#. Translators: provider_name is the name of an external, third-party user +#. authentication provider (like Google or LinkedIn). +#. Translators: provider_name is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/login.html lms/templates/register.html +msgid "Sign in with {provider_name}" +msgstr "" + #: lms/templates/lti.html msgid "External resource" msgstr "外部資源" @@ -5125,6 +5190,26 @@ msgstr "歡迎 !" msgid "Register below to create your {platform_name} account" msgstr "請在下面註冊創建您的 {platform_name} 帳號" +#: lms/templates/register.html +msgid "Register to start learning today!" +msgstr "" + +#: lms/templates/register.html +msgid "" +"or create your own {platform_name} account by completing all " +"required* fields below." +msgstr "" + +#. Translators: selected_provider is the name of an external, third-party user +#. authentication service (like Google or LinkedIn). +#: lms/templates/register.html +msgid "You've successfully signed in with {selected_provider}." +msgstr "" + +#: lms/templates/register.html +msgid "Finish your account registration below to start learning." +msgstr "" + #: lms/templates/register.html msgid "Please complete the following fields to register for an account. " msgstr "請完整填寫下列欄位以註冊帳戶。" @@ -5600,6 +5685,10 @@ msgstr "" msgid "{file_format}" msgstr "" +#: lms/templates/video.html +msgid "Download Handout" +msgstr "" + #: lms/templates/word_cloud.html msgid "Your words:" msgstr "您的話:" @@ -5886,7 +5975,7 @@ msgstr "額外資源" #. notification image that indicates the tab "needs attention". #: lms/templates/courseware/course_navigation.html msgid "needs attention" -msgstr "" +msgstr "需要注意" #: lms/templates/courseware/course_navigation.html #: lms/templates/courseware/course_navigation.html @@ -6376,7 +6465,7 @@ msgstr "學生" #: lms/templates/courseware/instructor_dashboard.html msgid "Score distribution for problems" -msgstr "" +msgstr "問題成績分布" #: lms/templates/courseware/instructor_dashboard.html #: lms/templates/courseware/instructor_dashboard.html @@ -6529,6 +6618,10 @@ msgstr "在Studio中檢視評分" msgid "Course Progress for Student '{username}' ({email})" msgstr "學生 '{username}' ({email}) 的課程進度" +#: lms/templates/courseware/progress.html +msgid "Download your certificate" +msgstr "" + #: lms/templates/courseware/progress.html msgid "{earned:.3n} of {total:.3n} possible points" msgstr "" @@ -7190,10 +7283,6 @@ msgstr "論壇現在正在維護,將儘快恢復正常。" msgid "User Profile" msgstr "使用者資料" -#: lms/templates/discussion/user_profile.html -msgid "Active Threads" -msgstr "活動主題" - #: lms/templates/discussion/mustache/_inline_thread.mustache #: lms/templates/discussion/mustache/_inline_thread_cohorted.mustache msgid "Expand discussion" @@ -7217,6 +7306,10 @@ msgstr "" msgid "View discussion" msgstr "檢視討論" +#: lms/templates/discussion/mustache/_user_profile.mustache +msgid "Active Threads" +msgstr "活動主題" + #: lms/templates/emails/activation_email.txt msgid "" "Thank you for signing up for {platform_name}! To activate your account, " @@ -7254,11 +7347,16 @@ msgstr "親愛的 {full_name}" msgid "" "You have been invited to be a beta tester for {course_name} at {site_name} " "by a member of the course staff." +msgstr "您已被{site_name}上{course_name}課程的工作人員邀請成為課程的beta測試者。" + +#: lms/templates/emails/add_beta_tester_email_message.txt +#: lms/templates/emails/enroll_email_enrolledmessage.txt +msgid "To start accessing course materials, please visit {course_url}" msgstr "" #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {course_about_url} to join the course and begin the beta test." -msgstr "" +msgstr "拜訪{course_about_url}以加入課程並成為beta測試者。" #: lms/templates/emails/add_beta_tester_email_message.txt msgid "Visit {site_name} to enroll in the course and begin the beta test." @@ -7273,7 +7371,7 @@ msgstr "此封電子郵件由{site_name}自動寄給{email_address}" #: lms/templates/emails/add_beta_tester_email_subject.txt msgid "You have been invited to a beta test for {course_name}" -msgstr "" +msgstr "您已被邀請參加{course_name}的beta測試。" #: lms/templates/emails/confirm_email_change.txt msgid "" @@ -7361,10 +7459,6 @@ msgid "" "course staff. The course should now appear on your {site_name} dashboard." msgstr "" -#: lms/templates/emails/enroll_email_enrolledmessage.txt -msgid "To start accessing course materials, please visit {course_url}" -msgstr "" - #: lms/templates/emails/enroll_email_enrolledmessage.txt #: lms/templates/emails/unenroll_email_enrolledmessage.txt msgid "This email was automatically sent from {site_name} to {full_name}" @@ -7536,7 +7630,7 @@ msgstr "跳過" #: lms/templates/instructor/instructor_dashboard_2/analytics.html msgid "Score Distribution" -msgstr "" +msgstr "成績分布" #: lms/templates/instructor/instructor_dashboard_2/analytics.html msgid "" @@ -7628,7 +7722,7 @@ msgstr "對於小型課程,點選個人資訊清單以直接加入學生至課 #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "List enrolled students' profile information" -msgstr "" +msgstr "列出註冊學生個人資料資訊" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" @@ -7644,7 +7738,7 @@ msgstr "評分標準" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Click to download a CSV of anonymized student IDs:" -msgstr "" +msgstr "點選以下載匿名表示學生ID的CSV檔案:" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "Get Student Anonymized IDs CSV" @@ -7659,7 +7753,7 @@ msgid "" "Click to generate a CSV grade report for all currently enrolled students. " "Links to generated reports appear in a table below when report generation is" " complete." -msgstr "" +msgstr "點選以產生所有目前註冊學生CSV格式的成績報告,報告的連結將會在生成後顯示在下方的表格中。" #: lms/templates/instructor/instructor_dashboard_2/data_download.html msgid "" @@ -7853,7 +7947,7 @@ msgstr "" msgid "" "Note: Users must have an activated {platform_name} account before they can " "be enrolled as a beta tester." -msgstr "" +msgstr "注意:使用者在加入beta測試者之前,必須有個於{platform_name}上啟用的帳號。" #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "" @@ -7867,11 +7961,11 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Add beta testers" -msgstr "" +msgstr "新增beta測試者" #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Remove beta testers" -msgstr "" +msgstr "移除beta測試者" #. Translators: an "Administration List" is a list, such as Course Staff, that #. users can be added to. @@ -7884,7 +7978,7 @@ msgstr "管理員列表管理" #. users can be added to. #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Select an Administrator Group:" -msgstr "" +msgstr "選擇一個管理群組:" #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Getting available lists..." @@ -7941,7 +8035,7 @@ msgstr "Beta測試者可以在其餘學生之前看到課程內容。他們可 #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Add Beta Tester" -msgstr "" +msgstr "新增Beta測試者" #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Discussion Admins" @@ -7956,7 +8050,7 @@ msgstr "" #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Add Discussion Admin" -msgstr "" +msgstr "新增討論管理員" #: lms/templates/instructor/instructor_dashboard_2/membership.html msgid "Discussion Moderators" @@ -8437,7 +8531,7 @@ msgstr "我們已經給您的郵箱發送郵件,您應該能夠很快收到, #: lms/templates/shoppingcart/download_report.html msgid "Download CSV Data" -msgstr "下載CSV數據" +msgstr "下載CSV格式資料" #: lms/templates/shoppingcart/download_report.html msgid "These reports are delimited by start and end dates." @@ -8773,7 +8867,7 @@ msgstr "" msgid "" "Please wait a few seconds and then reload the page. If the problem persists," " please email us at {email}." -msgstr "" +msgstr "請等待數秒後重新載入頁面。如果問題依然存在,請透過電子郵件{email}與我們聯絡" #: lms/templates/static_templates/server-overloaded.html msgid "Currently the {platform_name} servers are overloaded" @@ -9804,7 +9898,7 @@ msgstr "頁面功能" #: cms/templates/asset_index.html msgid "Loading…" -msgstr "" +msgstr "載入中…" #: cms/templates/asset_index.html msgid "What files are listed here?" @@ -9910,7 +10004,7 @@ msgstr "" #: cms/templates/container.html msgid "This page has no content yet." -msgstr "" +msgstr "本頁面尚無內容" #: cms/templates/container.html cms/templates/container.html msgid "Publishing Status" @@ -9918,13 +10012,13 @@ msgstr "發佈狀態" #: cms/templates/container.html msgid "Published" -msgstr "" +msgstr "已發佈" #: cms/templates/container.html msgid "" "To make changes to the content of this page, you need to edit unit " "{unit_link} as a draft." -msgstr "" +msgstr "要改變這個頁面的內容,您需要將單元{unit_link}設定為草稿" #: cms/templates/container.html msgid "Draft" @@ -9934,7 +10028,7 @@ msgstr "" msgid "" "You can edit the content of this page, and your changes will be published " "with unit {unit_link}." -msgstr "" +msgstr "您可以編輯這個頁面的內容,所有變更將會發布在單元{unit_link}" #: cms/templates/container.html msgid "" @@ -9997,7 +10091,7 @@ msgstr "無法復原此頁面" #: cms/templates/edit-tabs.html msgid "You can add additional custom pages to your course." -msgstr "" +msgstr "您可以增加額外的自訂頁面到您的課程中" #: cms/templates/edit-tabs.html msgid "Add a New Page" @@ -10037,7 +10131,7 @@ msgstr "" #: cms/templates/edit-tabs.html msgid "See an example" -msgstr "" +msgstr "瞧瞧範例" #: cms/templates/edit-tabs.html msgid "Pages in Your Course" diff --git a/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo b/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo index 6f53fb43528a..e86133b2d42a 100644 Binary files a/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo and b/conf/locale/zh_TW/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po index bfeb302c91bb..67eae10f66cd 100644 --- a/conf/locale/zh_TW/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_TW/LC_MESSAGES/djangojs.po @@ -9,6 +9,7 @@ # JoeyChiou , 2013 # lin31504 , 2014 # okalright , 2013-2014 +# bhsfmiao , 2014 # okalright , 2013 # Yu-Ren Chen , 2013-2014 # Yu-Ren Chen , 2013 @@ -22,6 +23,7 @@ # christtabris , 2014 # JoeyChiou , 2014 # JoeyChiou , 2013 +# bhsfmiao , 2014 # okalright , 2013 # Yu-Ren Chen , 2014 # Yu-Ren Chen , 2013 @@ -30,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2014-04-22 09:01-0400\n" -"PO-Revision-Date: 2014-04-10 20:30+0000\n" +"POT-Creation-Date: 2014-04-27 11:10-0400\n" +"PO-Revision-Date: 2014-04-24 13:20+0000\n" "Last-Translator: sarina \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/edx-platform/language/zh_TW/)\n" "MIME-Version: 1.0\n" @@ -350,6 +352,7 @@ msgstr "顯示討論" #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js #: common/static/coffee/src/discussion/views/discussion_thread_view.js +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js #: common/static/coffee/src/discussion/views/response_comment_view.js msgid "Sorry" msgstr "抱歉" @@ -511,6 +514,10 @@ msgstr "" msgid "Are you sure you want to delete this post?" msgstr "你確定要刪除這項post?" +#: common/static/coffee/src/discussion/views/discussion_user_profile_view.js +msgid "We had some trouble loading the page you requested. Please try again." +msgstr "" + #: common/static/coffee/src/discussion/views/response_comment_show_view.js msgid "anonymous" msgstr "匿名" @@ -1564,6 +1571,10 @@ msgid "" "extension." msgstr "檔案格式不支援,請上傳 tar.gz 格式的檔案。" +#: cms/static/js/views/metadata.js +msgid "Upload File" +msgstr "" + #: cms/static/js/views/overview.js msgid "Collapse All Sections" msgstr "折疊所有章節" diff --git a/docs/en_us/ORA2/source/Images/PA_CommentsField.png b/docs/en_us/ORA2/source/Images/PA_CommentsField.png new file mode 100644 index 000000000000..63426f0948d9 Binary files /dev/null and b/docs/en_us/ORA2/source/Images/PA_CommentsField.png differ diff --git a/docs/en_us/ORA2/source/Images/PA_Comments_Criterion.png b/docs/en_us/ORA2/source/Images/PA_Comments_Criterion.png new file mode 100644 index 000000000000..fe66b083ddc7 Binary files /dev/null and b/docs/en_us/ORA2/source/Images/PA_Comments_Criterion.png differ diff --git a/docs/en_us/ORA2/source/Images/PA_CourseStaffInfo_Collapsed.png b/docs/en_us/ORA2/source/Images/PA_CourseStaffInfo_Collapsed.png new file mode 100644 index 000000000000..9a66e4ce0b58 Binary files /dev/null and b/docs/en_us/ORA2/source/Images/PA_CourseStaffInfo_Collapsed.png differ diff --git a/docs/en_us/ORA2/source/Images/PA_HTMLComponent.png b/docs/en_us/ORA2/source/Images/PA_HTMLComponent.png new file mode 100644 index 000000000000..f9db668ef7d3 Binary files /dev/null and b/docs/en_us/ORA2/source/Images/PA_HTMLComponent.png differ diff --git a/docs/en_us/ORA2/source/Images/PA_Students_CommentBoxes.png b/docs/en_us/ORA2/source/Images/PA_Students_CommentBoxes.png new file mode 100644 index 000000000000..aef2f9618f69 Binary files /dev/null and b/docs/en_us/ORA2/source/Images/PA_Students_CommentBoxes.png differ diff --git a/docs/en_us/ORA2/source/PeerAssessment.rst b/docs/en_us/ORA2/source/PeerAssessment.rst index c7c88d681a73..55e5e345fb68 100644 --- a/docs/en_us/ORA2/source/PeerAssessment.rst +++ b/docs/en_us/ORA2/source/PeerAssessment.rst @@ -327,16 +327,36 @@ The following image shows a question in the component editor along with the way To add the question: -#. In the component editor, locate the ```` tags. +#. In the component editor, locate the first set of ```` tags. The opening ```` tag appears directly below the opening ```` tag. #. Replace the sample text between the ```` tags with the text of your question. Note that the component editor respects paragraph breaks and new lines inside the ```` tags. You don't have to add ``

      `` tags to create individual paragraphs. -In this initial release, you cannot add text formatting or images in the Peer Assessment component. If you want to include text formatting or images in the text of your prompt, you can add an HTML component above the Peer Assessment component. The following image shows an HTML component that contains an image and the quote by Katherine Paterson, followed by a Peer Assessment component that contains the introductory Peer Assessment text ("This assignment has several steps...") and the text that appears between the ```` tags in the Peer Assessment component ("Write a persuasive essay..."). +Add Formatting or Images to the Question +**************************************** -.. image:: /Images/PA_HTML-PA_LMS.png - :alt: Image of a peer assessment that has an image in an HTML component +In this initial release, you cannot add text formatting or images in the Peer Assessment component. If you want to include formatting or images in the text of your prompt, you can add an HTML component that contains your text above the Peer Assessment component, and then remove the prompt from the Peer Assessment component. The instructions for the peer assessment still appear above the **Your Response** field. + +.. image:: /Images/PA_HTMLComponent.png + :alt: A peer assessment that has an image in an HTML component :width: 500 +To remove the prompt from the Peer Assessment component, open the component editor, and then delete the first set of ```` tags together with all the text between the tags. The first few lines of XML for the problem will then resemble the following. + +.. code-block:: xml + + + + + + + + + + Ideas + Determine if there is a unifying theme or main idea. + -.. _PA Change Feedback Prompt: +.. _PA Provide Comment Options: ============================================= -Step 6 (optional). Change the Feedback Prompt +Step 6 (optional). Provide Comment Options ============================================= -After students have filled out the rubric, they can provide additional feedback for the responses they've assessed. By default, the prompt text for this feedback is the following: +After students fill out the rubric, they can provide additional comments for the responses they've assessed. By default, students see a field for comments below the rubric. + +.. image:: /Images/PA_CommentsField.png + :alt: Contents field + :width: 500 + +You can change the text that appears above this comment field. Additionally, you can provide a comment field for each individual criterion. + +.. _PA Change Comments Prompt: + +Change the Default Prompt Text +******************************* + +By default, the prompt text for the comment field is the following: ``(Optional) What aspects of this response stood out to you? What did it do well? How could it improve?`` @@ -424,7 +457,7 @@ You can replace this default text with your own text. To change this text: -#. Locate the ```` tags between the final ```` tag and the closing ```` tag: +#. Locate the ```` tags between the last closing ```` tag for the rubric and the closing ```` tag for the problem: .. code-block:: xml @@ -437,7 +470,43 @@ To change this text: -#. Change the text between the ```` tags to the text that you want. +2. Change the text between the ```` tags to the text that you want. + +.. _PA Add Individual Criterion Comments: + +Provide a Comment Field for Individual Criteria +************************************************** + +By default, students see only a single comment field below the entire rubric. However, you can add a comment field to an individual criterion or to several individual criteria. The comment field can contain up to 300 characters. + +In the following image, the first criterion has a comment field, but the second does not. + +.. image:: /Images/PA_Comments_Criterion.png + :alt: Comment box under an individual criterion + :width: 500 + +To add a comment field: + +#. Locate the opening ```` tag for the criterion that you want to change. + +#. Add the ``feedback="optional"`` attribute to this tag: + + .. code-block:: xml + + + NAME + PROMPT TEXT + + + + +If you want to provide comment fields below additional criteria, add the ``feedback="optional"`` attribute to the opening tag for each criterion. .. _PA Test Problem: diff --git a/docs/en_us/ORA2/source/PeerAssessment_Students.rst b/docs/en_us/ORA2/source/PeerAssessment_Students.rst index cca4ab9be295..b6eab4c5644b 100644 --- a/docs/en_us/ORA2/source/PeerAssessment_Students.rst +++ b/docs/en_us/ORA2/source/PeerAssessment_Students.rst @@ -67,6 +67,12 @@ The rubric contains *criteria*, each of which has several *options*. Read the st When you've selected options in the rubric, provide additional comments about the response in the field below the rubric. When you're done, click **Submit your assessment and move to response #**. +.. note:: Some assessments may have an additional **Comments** field for one or more of the assessment's individual criteria. You can enter up to 300 characters in these fields. In the following image, the first of the criteria has a separate **Comments** field, but the second does not. + + .. image:: /Images/PA_Students_CommentBoxes.png + :alt: Rubric with call-outs for comment boxes + :width: 500 + When you submit your assessment of the first student's response, another response opens for you. Assess this response in the same way that you assessed the first response, and then submit your assessment. You'll repeat these steps until you've assessed the required number of responses. The number in the upper-right corner of the rubric updates as you assess each response. diff --git a/docs/en_us/course_authors/source/Images/html_templates.png b/docs/en_us/course_authors/source/Images/html_templates.png new file mode 100644 index 000000000000..89a471853b44 Binary files /dev/null and b/docs/en_us/course_authors/source/Images/html_templates.png differ diff --git a/docs/en_us/course_authors/source/Images/raw_html_editor.png b/docs/en_us/course_authors/source/Images/raw_html_editor.png new file mode 100644 index 000000000000..2ef1aa6066ff Binary files /dev/null and b/docs/en_us/course_authors/source/Images/raw_html_editor.png differ diff --git a/docs/en_us/course_authors/source/Images/set_html_editor.png b/docs/en_us/course_authors/source/Images/set_html_editor.png new file mode 100644 index 000000000000..4cbfab8a185f Binary files /dev/null and b/docs/en_us/course_authors/source/Images/set_html_editor.png differ diff --git a/docs/en_us/course_authors/source/change_log.rst b/docs/en_us/course_authors/source/change_log.rst index 79ebfb15b097..89e751968f9c 100644 --- a/docs/en_us/course_authors/source/change_log.rst +++ b/docs/en_us/course_authors/source/change_log.rst @@ -11,11 +11,19 @@ April, 2014 :header-rows: 1 * - Date - - Change + - Change + * - 04/26/14 + - Updated label information; added XML information to :ref:`Problem with Adaptive Hint` * - 04/24/14 - Expanded the :ref:`Grades` chapter to include topics on interpreting the grade reports and student progress page. + * - + - Updated the :ref:`Beta_Testing` section to reflect feature changes. + * - + - Updated the :ref:`Working with HTML Components` chapter to reflect changes to the HTML component editor. * - 04/23/14 - - Reorganized info about problems into :ref:`Exercises and Tools Index` section + - Reorganized information about problems into :ref:`Exercises and Tools Index` section. + * - 04/23/14 + - Added more information about collecting language and location data from students to :ref:`Student Data`. * - 04/22/14 - Updated the :ref:`Bulk Email` section with information about the dashboard option to opt out of course email. * - @@ -72,8 +80,7 @@ March, 2014 - Updated the :ref:`Adding Pages to a Course` section to reflect feature changes. * - 03/27/14 - - Updated the section on :ref:`Beta_Testing` to include the new "batch add" - feature. + - Updated the section on :ref:`Beta_Testing` to include the new "batch add" feature. * - 03/19/14 - Updated the sections on :ref:`Beta_Testing`, :ref:`Discussions`, :ref:`Grades`, and :ref:`Student Data` with changes to the new Instructor Dashboard. diff --git a/docs/en_us/course_authors/source/creating_content/create_html_component.rst b/docs/en_us/course_authors/source/creating_content/create_html_component.rst index 8a8311e981f7..264e27fb9f82 100644 --- a/docs/en_us/course_authors/source/creating_content/create_html_component.rst +++ b/docs/en_us/course_authors/source/creating_content/create_html_component.rst @@ -9,42 +9,99 @@ Working with HTML Components HTML Component Overview *********************** -HTML components are the basic building blocks of your course content. You use HTML components to add and format text, links, images, and more. +HTML, or HyperText Markup Language, is the standard markup language used to +create web pages. Web browsers present HTML code in a more readable format. When +students see text and images in your course, they are seeing HTML code that is +formatted and presented by their browsers. For more information about HTML, see +`Wikipedia `_. + +HTML components are the basic building blocks of your course content. You use +HTML components to add and format text, links, images, and more. You can choose +to create HTML components directly in HTML code, or using a Visual editor that +hides the HTML code details, as described below. For more information, see the following topics: -* :ref:`The HTML Editor` +* :ref:`Options for Editing HTML Components` +* :ref:`The Visual Editor` +* :ref:`The Raw HTML Editor` +* :ref:`HTML Component Templates` * :ref:`Create an HTML Component` * :ref:`Add a Link in an HTML Component` * :ref:`Add an Image to an HTML Component` * :ref:`Import LaTeX Code` -.. note:: Review :ref:`Organizing Your Course Content` and :ref:`Best Practices for HTML Markup` before you start working with HTML components. +.. note:: + Review :ref:`Organizing Your Course Content` and :ref:`Best Practices for HTML Markup` before you start working with HTML components. To add an instant hangout to an HTML component, see :ref:`Google Instant Hangout`. -.. _The HTML Editor: + +.. _Options for Editing HTML Components: + +******************************************** +Options for Editing HTML Components +******************************************** + +You can work with HTML in two ways: + +* :ref:`The Visual Editor` + + With the Visual editor you can create, edit, and format content in a word + processing-like interface, without using HTML code directly. With the Visual + editor, you can more easily format your content, and add links and images. The + Visual editor provides access to HTML code so you can make small changes to + formatting, if required. However, the HTML view in the Visual editor does not + provide the detailed control you can get with the Raw HTML editor, and does + not support custom formatting or scripts. + +* :ref:`The Raw HTML Editor` + + With the Raw HTML Editor, you work directly with HTML code. If you need to use + custom formatting or scripts in your content, you should use the Raw HTML + Editor. + + +Set the Editor for an HTML Component +************************************ + +You set the editor for an HTML component in the **Settings** tab: + +.. image:: ../Images/set_html_editor.png + :alt: The Editor selection drop-down list in the HTML Component Settings tab + +Select **Visual** or **Raw**. When you change the editor, you must click +**Save** and re-open the component to begin using the new editor. + +.. warning:: + If you work with content in the Raw HTML editor, then switch to the Visual + editor, you may lose custom HTML that you created. Therefore, it is recommended + that you start by using the Visual editor, then switch to the Raw HTML editor + when you need to create custom HTML. + +.. _The Visual Editor: ***************************************** -The HTML Component Editor +The Visual Editor ***************************************** -When you create a new HTML component, you work with the HTML editor: +The Visual editor provides a “what you see is what you get” (WYSIWYG) interface +that allows you to format text by clicking the formatting buttons at the top of +the editor. .. image:: ../Images/HTMLEditor.png :alt: Image of the HTML component editor -The editor provides a “what you see is what you get” (WYSIWYG) interface that allows you to format text by clicking the formatting buttons at the top of the editor. - -.. note:: The editor attempts to ensure the underlying HTML code is valid; for example, if you do not close a div tag, it inserts one at the end of the paragraph. You can see this by opening the HTML code editor, as described below. - -The following image shows call-outs for the editing options and is followed by descriptions. +The following image shows call-outs for the editing options and is followed by +descriptions. .. image:: ../Images/HTML_VisualView_Toolbar.png :alt: Image of the HTML editor, with call-outs for formatting buttons -#. Choose a formatting style for the selected paragraph, such as heading 1, heading 2, or paragraph. -#. Choose a font family for selected text, such as Arial, Courier New, or Times New Roman. +#. Choose a formatting style for the selected paragraph, such as heading 1, + heading 2, or paragraph. +#. Choose a font family for selected text, such as Arial, Courier New, or Times + New Roman. #. Format selected text in bold. #. Format selected text in italics. #. Underline selected text. @@ -54,7 +111,8 @@ The following image shows call-outs for the editing options and is followed by d #. Create a numbered list. #. Decrease and increased the indentation of the selected paragraph. #. Format the selected paragraph as a blockquote. -#. Create a link from the selected text. See :ref:`Add a Link in an HTML Component`. +#. Create a link from the selected text. See :ref:`Add a Link in an HTML + Component`. #. Delete the current link. #. Insert an image at the cursor. See :ref:`Add an Image to an HTML Component`. #. Work with HTML source code, described below. @@ -62,20 +120,66 @@ The following image shows call-outs for the editing options and is followed by d .. _Work with HTML code: -============================ -Work with HTML code -============================ -To work with HTML source code for the component, click **HTML** in the editor toolbar. The HTML source code editor opens: +Work with HTML code in the Visual editor +***************************************** + +To work with HTML source code for the content you create in the Visual editor, +click **HTML** in the editor toolbar. The HTML source code editor opens: .. image:: ../Images/HTML_source_code.png :alt: Image of the HTML source code editor -Edit the HTML code as needed. +Edit the HTML code as needed. + +You should not add custom styles or scripts in the HTML code view in the +Visual editor. Use the Raw HTML editor instead. -Click **OK** to apply your changes to the HTML editor and close the source code. +Click **OK** to close the source code editor and apply your changes in the +Visual editor. The Visual editor then attempts to ensure the underlying HTML +code is valid; for example, if you do not close a paragraph tag, the editor will +close it for you. + +.. warning:: + Clicking **OK** in the source code editor does not save your changes to the + HTML component. You return to the component editor, where your changes are + applied. You must then also click **Save** to save your changes and close the + component. If you click **Cancel**, the changes you made in the HTML source + code are lost. + +.. _The Raw HTML Editor: + +***************************** +The Raw HTML Editor +***************************** + +When you select the Raw editor for the HTML component, you edit your content in +a text editor: + +.. image:: ../Images/raw_html_editor.png + :alt: The Raw HTML editor + +You must enter valid HTML. The Raw HTML editor does not validate your HTML code. +Therefore you should thoroughly test the HTML content in your course. + + +.. _HTML Component Templates: + +***************************** +HTML Component Templates +***************************** + +When you create a new HTML component, you select from a list of templates: + +.. image:: ../Images/html_templates.png + :alt: The list of HTML Component templates + +The Raw HTML template is set to use the Raw HTML editor. All other templates use +the Visual editor. + +For any HTML component, you can change the editor, regardless of the template +used to create the component. See `Set the Editor for an HTML Component`_. -.. warning:: Clicking **OK** in the source code editor does not save your changes to the HTML component. You return to the component editor, where your changes are applied. You must click **Save** to save your changes and close the component. If you click **Cancel**, the changes you made in the HTML source code are lost. .. _Create an HTML Component: @@ -91,9 +195,10 @@ To create an HTML component: .. image:: ../Images/NewComponent_HTML.png :alt: Image of adding a new HTML component -2. In the list that appears, click **Text**. +2. Select the template. - .. note: You can also create a :ref:`Zooming Image` or :ref:`Image Modal`. + The rest of these instructions assume you selected + **Text**, which creates an empty component with the Visual editor selected. An empty component appears at the bottom of the unit. @@ -102,20 +207,22 @@ To create an HTML component: 3. In the component, click **Edit**. - The HTML component editor opens. + The HTML component opens in the Visual editor. .. image:: ../Images/HTMLEditor_empty.png :alt: Image of the HTML component editor 4. Enter and format your content. You can :ref:`Work with HTML code` if needed. -5. Enter a display name (the name that you want students to see). To do this, click **Settings** in the upper-right corner of the component editor, and then enter text in the **Display Name** field. +5. Enter a display name (the name that you want students to see). To do this, + click **Settings** in the upper-right corner of the component editor, and + then enter text in the **Display Name** field. To return to the text editor, click **Editor** in the upper-right corner. 6. Click **Save** to save the HTML component. -You can also: +When using the Visual editor, you can also: * :ref:`Add a Link in an HTML Component` * :ref:`Add an Image to an HTML Component` @@ -127,7 +234,8 @@ You can also: Add a Link in an HTML Component *********************************** -To add a link to a website, course unit, or file in an HTML component, you'll work with the **Insert link** dialog box. +When using the Visual editor, to add a link to a website, course unit, or file +in an HTML component, you work with the **Insert link** dialog box. .. image:: ../Images/HTML_Insert-EditLink_DBox.png :alt: Image of the Insert link dialog box @@ -140,9 +248,8 @@ You can: .. _Add a Link to a Website: -============================ Add a Link to a Website -============================ +*********************************** To add a link to a website: @@ -150,12 +257,15 @@ To add a link to a website: #. Click the link icon in the toolbar. -#. In the **Insert link** dialog box, enter the URL of the website that you want in the **URL** field. +#. In the **Insert link** dialog box, enter the URL of the website that you want + in the **URL** field. .. image:: ../Images/HTML_Insert-EditLink_Website.png :alt: Image of the Insert link dialog box -#. If you want the link to open in a new window, click the drop-down arrow next to the **Target** field, and then select **New Window**. If not, you can leave the default value. +#. If you want the link to open in a new window, click the drop-down arrow next + to the **Target** field, and then select **New Window**. If not, you can + leave the default value. #. Click **OK**. @@ -164,13 +274,15 @@ To add a link to a website: .. _Add a Link to a Course Unit: -============================ + Add a Link to a Course Unit -============================ +*********************************** You can add a link to a course unit in an HTML component. -#. Obtain the unit identifier of the unit you're linking to. To do this, open the unit page in Studio, and copy the unit ID from the **Unit Identifier** field under **Unit Location** in the right pane. +#. Obtain the unit identifier of the unit you're linking to. To do this, open + the unit page in Studio, and copy the unit ID from the **Unit Identifier** + field under **Unit Location** in the right pane. .. image:: ../Images/UnitIdentifier.png :alt: Image of the unit page with the unit identifier circled @@ -191,8 +303,9 @@ You can add a link to a course unit in an HTML component. .. image:: ../Images/HTML_Insert-EditLink_CourseUnit.png :alt: Image of the Insert link dialog box with a link to a unit identifier -#. If you want the link to open in a new window, click the drop-down arrow next to - the **Target** field, and then select **New Window**. If not, you can leave the default value. +#. If you want the link to open in a new window, click the drop-down arrow next + to the **Target** field, and then select **New Window**. If not, you can + leave the default value. #. Click **Insert**. @@ -200,11 +313,13 @@ You can add a link to a course unit in an HTML component. .. _Add a Link to a File: -============================ + Add a Link to a File -============================ +*********************************** -You can add a link in an HTML component to any file you've uploaded for the course. For more information about uploading files, see :ref:`Add Files to a Course`. +You can add a link in an HTML component to any file you've uploaded for the +course. For more information about uploading files, see :ref:`Add Files to a +Course`. #. On the **Files & Uploads** page, copy the **Embed URL** of the file. @@ -212,7 +327,8 @@ You can add a link in an HTML component to any file you've uploaded for the cour .. image:: ../Images/HTML_Link_File.png :alt: Image of Files and Uploads page with the URL field circled - .. note:: You must use the **Embed URL** to link to the file, not the **External URL**. + .. note:: + You must use the **Embed URL** to link to the file, not the **External URL**. 2. Select the text that you want to make into the link. @@ -227,8 +343,9 @@ You can add a link in an HTML component to any file you've uploaded for the cour .. image:: ../Images/HTML_Insert-EditLink_File.png :alt: Image of the Insert link dialog box with a link to a file -#. If you want the link to open in a new window, click the drop-down arrow next to - the **Target** field, and then select **New Window**. If not, you can leave the default value. +#. If you want the link to open in a new window, click the drop-down arrow next + to the **Target** field, and then select **New Window**. If not, you can + leave the default value. #. Click **Insert**. @@ -240,22 +357,31 @@ You can add a link in an HTML component to any file you've uploaded for the cour Add an Image to an HTML Component *********************************** -You can add any image that you have uploaded for the course to an HTML component. For more information about uploading images, see :ref:`Add Files to a Course`. +When using the Visual editor, you can add any image that you have uploaded for +the course to an HTML component. For more information about uploading images, +see :ref:`Add Files to a Course`. -.. note:: Review :ref:`Best Practices for Describing Images` before you add images to HTML components. +.. note:: + Review :ref:`Best Practices for Describing Images` before you add images to + HTML components. -To add an image, you'll need the URL of the image that you uploaded to the course. You'll then create a link to the image in the HTML component. +To add an image, you'll need the URL of the image that you uploaded to the +course. You'll then create a link to the image in the HTML component. -#. On the **Files & Uploads** page, copy the **Embed URL** of the image that you want. +#. On the **Files & Uploads** page, copy the **Embed URL** of the image that you + want. .. image:: ../Images/image_link.png - :alt: Image of the Files & Upload page with the Embed URL for the image circled + :alt: Image of the Files & Upload page with the Embed URL for the image + circled - .. note:: You must use the **Embed URL** to add the image, not the **External URL**. + .. note:: + You must use the **Embed URL** to add the image, not the **External URL**. 2. Click the image icon in the toolbar. -#. In the **Insert image** dialog box, enter the following in the **Source** field. +#. In the **Insert image** dialog box, enter the following in the **Source** + field. ``/static/FileName.type`` @@ -264,16 +390,21 @@ To add an image, you'll need the URL of the image that you uploaded to the cours .. image:: ../Images/HTML_Insert-Edit_Image.png :alt: Image of the Insert image dialog box with a reference to a file -4. Enter alternative text in the **Image description** field. This text becomes the value of the ``alt`` attribute in HTML and is required for your course to be fully accessible. See :ref:`Best Practices for Describing Images` for more information. +4. Enter alternative text in the **Image description** field. This text becomes + the value of the ``alt`` attribute in HTML and is required for your course to + be fully accessible. See :ref:`Best Practices for Describing Images` for more + information. -#. As needed, customize the image dimensions. Keep **Constrain proportions** checked to ensure the image keeps the same width and height proportions. +#. As needed, customize the image dimensions. Keep **Constrain proportions** + checked to ensure the image keeps the same width and height proportions. #. To change the spacing and border of the image, click the **Advanced** tab. .. image:: ../Images/HTML_Insert-Edit_Image_Advanced.png :alt: Image of the Insert image dialog box Advanced tab -#. Enter the **Vertical space**, **Horizontal space**, and **Border** as needed. The values you enter are automatically added to the **Style** field. +#. Enter the **Vertical space**, **Horizontal space**, and **Border** as needed. + The values you enter are automatically added to the **Style** field. #. Click **OK** to insert the image in the HTML component. @@ -286,46 +417,60 @@ To add an image, you'll need the URL of the image that you uploaded to the cours Import LaTeX Code into an HTML Component **************************************** -You can import LaTeX code into an HTML component. You might do this, for example, if you want to create "beautiful math" such as the following. +You can import LaTeX code into an HTML component. You might do this, for +example, if you want to create "beautiful math" such as the following. .. image:: ../Images/HTML_LaTeX_LMS.png :alt: Image of math formulas created with LaTeX -.. warning:: The LaTeX processor that Studio uses to convert LaTeX code to XML is a third-party tool. We recommend that you use this feature with caution. If you do use it, make sure to work with your PM. +.. warning:: + The LaTeX processor that Studio uses to convert LaTeX code to XML is a third- + party tool. We recommend that you use this feature with caution. If you do use + it, make sure to work with your Program Manager. -This feature is not enabled by default. To enable it, you have to change the advanced settings in your course. +This feature is not enabled by default. To enable it, you have to change the +advanced settings in your course. To create an HTML component that contains LaTeX code: #. Enable the policy key in your course. #. In Studio, click **Settings**, and then click **Advanced Settings**. - #. On the **Advanced Settings** page, scroll down to the **use_latex_compiler** policy key. - #. In the **Policy Value** field next to the **use_latex_compiler** policy key, change **false** to **true**. + #. On the **Advanced Settings** page, scroll down to the + **use_latex_compiler** policy key. + #. In the **Policy Value** field next to the **use_latex_compiler** policy + key, change **false** to **true**. #. At the bottom of the page, click **Save Changes**. -#. In the unit where you want to create the component, click **html** under **Add New Component**, and then click **E-text Written in LaTeX**. The new component is added to the unit. +#. In the unit where you want to create the component, click **html** under + **Add New Component**, and then click **E-text Written in LaTeX**. The new + component is added to the unit. #. Click **Edit** to open the new component. The component editor opens. .. image:: ../Images/latex_component.png - :alt: Image of the HTML component editor with the Latex compiler. + :alt: Image of the HTML component editor with the LaTeX compiler. -4. In the component editor, click **Launch Latex Source Compiler**. The Latex editor opens. +4. In the component editor, click **Launch Latex Source Compiler**. The LaTeX + editor opens. .. image:: ../Images/HTML_LaTeXEditor.png - :alt: Image of the HTML component editor with the Latex compiler. + :alt: Image of the HTML component editor with the LaTeX compiler -#. Write Latex code as needed. You can also upload a Latex file into the editor from your computer by clicking **Upload** in the bottom right corner. +#. Write LaTeX code as needed. You can also upload a LaTeX file into the editor + from your computer by clicking **Upload** in the bottom right corner. -#. When you have written or uploaded the Latex code you need, click **Save & Compile to edX XML** in the lower-left corner. +#. When you have written or uploaded the LaTeX code you need, click **Save & + Compile to edX XML** in the lower-left corner. The component editor closes. You can see the way your LaTeX content looks. .. image:: ../Images/HTML_LaTeX_CompEditor.png :alt: Image of the LaTeX component -#. On the unit page, click **Preview** to verify that your content looks the way you want it to in the LMS. - - If you see errors, go back to the unit page. Click **Edit** to open the component again, and then click **Launch Latex Source Compiler** in the lower-left corner of the component editor to edit the LaTeX code. +#. On the unit page, click **Preview** to verify that your content looks the way + you want it to in the LMS. + If you see errors, go back to the unit page. Click **Edit** to open the + component again, and then click **Launch Latex Source Compiler** in the + lower-left corner of the component editor to edit the LaTeX code. diff --git a/docs/en_us/course_authors/source/creating_content/create_problem.rst b/docs/en_us/course_authors/source/creating_content/create_problem.rst index 445c80ecad11..e2a99116880b 100644 --- a/docs/en_us/course_authors/source/creating_content/create_problem.rst +++ b/docs/en_us/course_authors/source/creating_content/create_problem.rst @@ -483,7 +483,7 @@ You may want to present different students with different problems, or different Note that *problem randomization* is different from the **Randomization** setting in Studio. The **Randomization** setting randomizes variables within a single problem. Problem randomization offers different problems or problem versions to different students. -.. note:: Creating problems with versions that can be randomized requires you to export your course, edit some of your course's XML files in a text editor, and then re-import your course. We recommend that you create a backup copy of your course before you do this. We also recommend that you only edit the files that will contain polls in the text editor if you're very familiar with editing XML. +.. note:: Creating problems with versions that can be randomized requires you to export your course, edit some of your course's XML files in a text editor, and then re-import your course. We recommend that you create a backup copy of your course before you do this. We also recommend that you only edit your course files in the text editor if you're very familiar with editing XML. Terminology ************ diff --git a/docs/en_us/course_authors/source/creating_content/pages.rst b/docs/en_us/course_authors/source/creating_content/pages.rst index cffcc281daef..488cbd4b3d39 100644 --- a/docs/en_us/course_authors/source/creating_content/pages.rst +++ b/docs/en_us/course_authors/source/creating_content/pages.rst @@ -66,7 +66,7 @@ Add a Page .. image:: ../Images/pages_editor.png :alt: Image of the Page editor -4. Enter text for your page. See :ref:`The HTML Editor` for more information about using the editor. +4. Enter text for your page. See :ref:`Options for Editing HTML Components` for more information about using the editor. #. Click **Settings** to edit the **Display Name**. The display name is the name of the page visible to students in the course. #. Click **Save**. diff --git a/docs/en_us/course_authors/source/exercises_tools/create_exercises_and_tools.rst b/docs/en_us/course_authors/source/exercises_tools/create_exercises_and_tools.rst index 12ebccad15a8..0378c715b589 100644 --- a/docs/en_us/course_authors/source/exercises_tools/create_exercises_and_tools.rst +++ b/docs/en_us/course_authors/source/exercises_tools/create_exercises_and_tools.rst @@ -19,7 +19,7 @@ General Exercises and Tools **************************** .. list-table:: - :widths: 30 25 80 + :widths: 25 25 50 * - .. image:: /Images/AnnotationExample.png :width: 100 diff --git a/docs/en_us/course_authors/source/exercises_tools/custom_javascript.rst b/docs/en_us/course_authors/source/exercises_tools/custom_javascript.rst index ec88183712a4..94f2b9b401a0 100644 --- a/docs/en_us/course_authors/source/exercises_tools/custom_javascript.rst +++ b/docs/en_us/course_authors/source/exercises_tools/custom_javascript.rst @@ -59,7 +59,7 @@ To re-create the example problem above, you'll need the following files. To download these files in a .zip archive, go to http://files.edx.org/JSInput.zip. -..note:: If you need to bypass the SOP, you'll also need the **jschannel.js** file, and your webGLDemo.html file will be slightly different. To download all these files in a .zip archive, go to http://files.edx.org/JSInput_BypassSOP.zip. +.. note:: If you need to bypass the SOP, you'll also need the **jschannel.js** file, and your webGLDemo.html file will be slightly different. To download all these files in a .zip archive, go to http://files.edx.org/JSInput_BypassSOP.zip. #. Download and unpackage the files in either the JSInput.zip file or the JSInput_BypassSOP.zip file. #. On the **Files & Uploads** page, upload all the files from the .zip file. diff --git a/docs/en_us/course_authors/source/exercises_tools/drag_and_drop.rst b/docs/en_us/course_authors/source/exercises_tools/drag_and_drop.rst index 3b11d3162f43..23e2ba856125 100644 --- a/docs/en_us/course_authors/source/exercises_tools/drag_and_drop.rst +++ b/docs/en_us/course_authors/source/exercises_tools/drag_and_drop.rst @@ -13,16 +13,16 @@ In drag and drop problems, students respond to a question by dragging text or ob Create a Drag and Drop Problem ********************************* -To create a drag and drop problem, you'll need the following files: +To create the drag and drop problem that appears in the image above, you'll download two files from edX, upload these files to to the **Files & Uploads** page, and then add the code for the problem to a Problem component. -* Allopurinol.gif -* AllopurinolAnswer.gif +#. Download the following files from edX: -To download both these files in a .zip archive, go to http://files.edx.org/DragAndDropProblemFiles.zip. + * Allopurinol.gif + * AllopurinolAnswer.gif -To create the molecule editor that appears in the image above, you'll upload the files for this problem, and then paste the code below into a Problem component. + To download both these files in a .zip archive, click http://files.edx.org/DragAndDropProblemFiles.zip. -#. Upload the Allopurinol.gif and AllopurinolAnswer.gif files to the **Files & Uploads** page. +2. Upload the Allopurinol.gif and AllopurinolAnswer.gif files to the **Files & Uploads** page. #. In the unit where you want to create the problem, click **Problem** under **Add New Component**, and then click the **Advanced** tab. #. Click **Drag and Drop**. #. In the component that appears, click **Edit**. diff --git a/docs/en_us/course_authors/source/exercises_tools/math_expression_input.rst b/docs/en_us/course_authors/source/exercises_tools/math_expression_input.rst index b5f7df272030..b9fe7ee78be5 100644 --- a/docs/en_us/course_authors/source/exercises_tools/math_expression_input.rst +++ b/docs/en_us/course_authors/source/exercises_tools/math_expression_input.rst @@ -80,7 +80,7 @@ Templates

      Write an expression for the product of R_1, R_2, and the inverse of R_3.

      - + @@ -90,7 +90,7 @@ Templates

      Problem text

      - + +

      If a bat and a ball cost $1.10 together, and the bat costs $1.00 more than the ball, how much does the ball cost? Enter your answer in cents, and include only the number (that is, do not include a $ or a ¢ sign).

      +

      + + + + +

      + + + +.. _Drag and Drop Problem XML: + +********************************* +Problem with Adaptive Hint XML +********************************* + +======== +Template +======== + +.. code-block:: xml + + + + +

      TEXT OF PROBLEM

      +

      + + + + +

      +
      +
      + + +======== +Tags +======== + +* ````: Surrounds the script and text in the problem. +* ````: Indicates that this problem has a custom response. +* ````: Creates a response field in the LMS where the student enters a response. +* ````: Specifies that the problem contains at least one hint. + +**Tag:** ```` + + Attributes + + (none) + + Children + + * ```` + * ```` + +**Tag:** ```` + + Attributes + + .. list-table:: + :widths: 20 80 + + * - Attribute + - Description + * - label (required) + - Contains the text of the problem. + * - size (optional) + - Specifies the size, in characters, of the response field in the LMS. + * - hidden (optional) + - If set to "true", students cannot see the response field. + * - correct_answer (optional) + - Lists the correct answer to the problem. + + Children + + (none) + +**Tag:** ```` + + Attributes + + .. list-table:: + :widths: 20 80 + + * - Attribute + - Description + * - hintfn + - Must be set to **hint_fn** (i.e., the tag must appear as ````). \ No newline at end of file diff --git a/docs/en_us/course_authors/source/exercises_tools/text_input.rst b/docs/en_us/course_authors/source/exercises_tools/text_input.rst index b23429c25f06..84d970b03f9a 100644 --- a/docs/en_us/course_authors/source/exercises_tools/text_input.rst +++ b/docs/en_us/course_authors/source/exercises_tools/text_input.rst @@ -15,7 +15,7 @@ In text input problems, students enter text into a response field. The response Create a Text Input Problem **************************** -You can create multiple choice problems in the Simple Editor or in the Advanced Editor. +You can create text input problems in the Simple Editor or in the Advanced Editor. .. note:: All problems must include labels for accessibility. The label generally includes the text of the main question in your problem. To add a label for a common problem, surround the text of the label with angle brackets pointed toward the text (>>label text<<). @@ -292,7 +292,7 @@ Indicates that the problem is a text input problem. * ```` (optional) **Tag:** ```` - + Creates a response field in the LMS where the student enters a response. Attributes diff --git a/docs/en_us/course_authors/source/releasing_course/beta_testing.rst b/docs/en_us/course_authors/source/releasing_course/beta_testing.rst index a4adcaf59921..a21470590d11 100644 --- a/docs/en_us/course_authors/source/releasing_course/beta_testing.rst +++ b/docs/en_us/course_authors/source/releasing_course/beta_testing.rst @@ -142,74 +142,67 @@ Example Beta tester access to courseware for a course with ``days_early_for_beta`` = 20 and 2 sections: -+------------------------------------------------+--------------------------------------------------+ -| Course Enrollment Date = 31 August | 31 August; earlier if enrolled by course staff | -+------------------------------------------------+--------------------------------------------------+ -| Course Start Date = 15 September | 26 August | -+------------------------------------------------+--------------------------------------------------+ -| section 1 Release Day = 15 September | 26 August | -+------------------------------------------------+--------------------------------------------------+ -| section 2 Release Day = 22 September | 2 September | -+------------------------------------------------+--------------------------------------------------+ -| subsection 1 Release Day = 22 September | 2 September | -+------------------------------------------------+--------------------------------------------------+ -| subsection 2 Release Day = 24 September | 4 September | -+------------------------------------------------+--------------------------------------------------+ -| subsection 2, unit 1 Visibility = Public | 4 September | -+------------------------------------------------+--------------------------------------------------+ -| subsection 2, unit 2 Visibility = Public; | 4 September for Public version; | -| draft in progress | No access to draft | -+------------------------------------------------+--------------------------------------------------+ -| subsection 2, unit 3 Visibility = Private | No access | -+------------------------------------------------+--------------------------------------------------+ ++-------------------------------------------+------------------------------------------------+ +| Course Enrollment Date = 31 August | 31 August; earlier if enrolled by course staff | ++===========================================+================================================+ +| Course Start Date = 15 September | 26 August | ++-------------------------------------------+------------------------------------------------+ +| section 1 Release Day = 15 September | 26 August | ++-------------------------------------------+------------------------------------------------+ +| section 2 Release Day = 22 September | 2 September | ++-------------------------------------------+------------------------------------------------+ +| subsection 1 Release Day = 22 September | 2 September | ++-------------------------------------------+------------------------------------------------+ +| subsection 2 Release Day = 24 September | 4 September | ++-------------------------------------------+------------------------------------------------+ +| subsection 2, unit 1 Visibility = Public | 4 September | ++-------------------------------------------+------------------------------------------------+ +| subsection 2, unit 2 Visibility = Public; | 4 September for Public version; | +| draft in progress | No access to draft | ++-------------------------------------------+------------------------------------------------+ +| subsection 2, unit 3 Visibility = Private | No access | ++-------------------------------------------+------------------------------------------------+ In this example, the beta testers cannot access all of the courseware when the beta test starts on 26 August: they can access section 1 but not section 2. You may want to provide a schedule of section availability to your testers so that they can plan their time appropriately. Future release dates do not display to the beta testers in the courseware. .. _Add_Testers: ********************************* -Add Individual Beta Testers +Add Beta Testers ********************************* Before you can add beta testers: * You need the email address or username of each beta tester. -* Each beta tester must register and activate a user account for that email address and username. +* Each beta tester must register and activate a user account for that email + address/username. -To add a single beta tester: - -#. View the live version of your course. - -#. Click **Instructor** then **Try New Beta Dashboard**. - -#. Click **Membership**. +When you add beta testers, note the following. -#. In the **Administration List Management** section, use the drop-down list to select **Beta Testers**. - -#. Under the list of users who currently have that role, enter an email address or username and click **Add Beta Tester**. - - * If the beta test starts before the course **Enrollment Start Date**, testers cannot enroll themselves in your course. You can enroll the beta testers prior to the **Enrollment Start Date**. See :ref:`Enrollment`. - - * If you add the beta testers after the defined start of the beta test, and they are enrolled in the course, they see your course on their dashboards when they log in. +* If the beta test starts before the course **Enrollment Start Date**, testers + cannot enroll themselves in your course. However, you can enroll the beta + testers prior to the **Enrollment Start Date**. - * If you add beta testers before the test starts, or if they are not enrolled, they do not see your course on their dashboards. You may need to enroll them or send an email message to remind them when the test begins. +* If you add the beta testers after the defined start of the beta test, and + they are enrolled in the course, they see your course on their dashboards when they log in. -To remove the Beta Tester role from users individually, find the user in the list of beta testers, and then click **Revoke access** to the right of that user's email address. +* If you add beta testers before the test starts, or if they are not enrolled, + they do not see your course on their dashboards. You can enroll the beta + testers in the course yourself, and you may want to send an email message to + remind them when the test begins. .. _Add_Testers_Bulk: -********************************* +-------------------------- Add Multiple Beta Testers -********************************* - -If you have a number of beta testers that you want to add, you can use a "batch add" option to add them all at once, rather than individually. With this feature, you can also send an email message to notify the beta testers that they have been added. +-------------------------- -To use this feature: - -* You need the email address of each beta tester. - -* Each beta tester must register and activate a user account for that email address. +If you have a number of beta testers that you want to add, you can use the "batch +add" option to add them all at once, rather than individually. With this +feature, you have options to enroll the beta testers in the course (before +or after the **Enrollment Start Date**) and send an email message to notify the +beta testers that they have been added. To add multiple beta testers: @@ -219,22 +212,46 @@ To add multiple beta testers: #. Click **Membership**. -#. In the **Batch Beta Testers** section of the page, enter one or more addresses separated by commas or line feeds (the Enter key). You can also copy data from a CSV file of email addresses and paste it here. +#. In the **Batch Beta Tester Addition** section of the page, enter one or more addresses or usernames separated by commas or line feeds (the Enter key). You can also copy data from a CSV file of email addresses and paste it here. + +#. To enroll the beta testers in your course, leave **Auto Enroll** selected. If the beta test starts before the course **Enrollment Start Date**, testers cannot enroll themselves in your course. -#. Optionally, check the **Notify users by email** checkbox to send an email message to the beta testers. The text of the message is: +#. To send an email message to the beta testers, leave **Notify users by email** selected. An example of the message that is sent to a beta tester who is not enrolled (or auto enrolled) in the course follows. .. image:: ../Images/Beta_tester_email.png :alt: "You have been invited to be a beta tester for at . Visit to join the course and begin the beta test." 6. Click **Add beta testers**. - * If the beta test starts before the course **Enrollment Start Date**, testers cannot enroll themselves in your course. You can enroll the beta testers prior to the **Enrollment Start Date**. See :ref:`Enrollment`. +To remove the Beta Tester role from one or more users, enter their email +addresses in the **Batch Add Beta Testers** field and then click **Remove beta +testers**. + +.. note:: The **Auto Enroll** option has no effect when you click **Remove beta testers**. The user's role as a beta tester is removed; course enrollment is not affected. + +----------------------------- +Add Beta Testers Individually +----------------------------- + +To add a single beta tester: + +#. View the live version of your course. + +#. Click **Instructor** then **Try New Beta Dashboard**. + +#. Click **Membership**. + +#. In the **Administration List Management** section, use the drop-down list to select **Beta Testers**. - * If you add the beta testers after the defined start of the beta test, and they are enrolled in the course, they see your course on their dashboards when they log in. +#. Under the list of users who currently have that role, enter an email address + or username and click **Add Beta Tester**. - * If you add beta testers before the test starts, or if they are not enrolled, they do not see your course on their dashboards. You may need to enroll them or send an email message to remind them when the test begins. + If the beta test starts before the **Enrollment Start Date** of your course, + you can also enroll the beta tester. See :ref:`Enrollment`. -To remove the Beta Tester role from one or more users, enter their email addresses in the **Batch Add Beta Testers** field and then click **Remove beta testers**. +To remove the Beta Tester role from users individually, find the user in the +list of beta testers, and then click **Revoke access** to the right of that +user's email address. .. _Issue_Reporting_During_Course: @@ -246,7 +263,7 @@ Despite the efforts of the course team and the beta testers, additional problems * Often, students report issues by asking questions in a discussion. Your discussion administration team can watch for posts that indicate problems. -* To let students know the best way to report problems, you can post information on the Course Info page or post it in a discussion. +* To let students know the best way to report problems, you can post information on the **Course Info** page or post it in a discussion. .. per Mark 19 Feb 14: eventually we want to provide more guidance for students: course issues > use discussions, platform issues > submit issue to edx. diff --git a/docs/en_us/course_authors/source/running_course/course_enrollment.rst b/docs/en_us/course_authors/source/running_course/course_enrollment.rst index 30403f003825..70db260ec2fc 100644 --- a/docs/en_us/course_authors/source/running_course/course_enrollment.rst +++ b/docs/en_us/course_authors/source/running_course/course_enrollment.rst @@ -167,7 +167,7 @@ To unenroll students, you supply the email addresses of enrolled students. .. note:: The **Auto Enroll** option has no effect when you click **Unenroll**. -#. Click **Unenroll**. The course is no longer listed on the students' +5. Click **Unenroll**. The course is no longer listed on the students' dashboards, and the students can no longer contribute to discussions or the wiki or access the courseware. diff --git a/docs/en_us/course_authors/source/running_course/course_grades.rst b/docs/en_us/course_authors/source/running_course/course_grades.rst index 7ca2323012e6..b07ab1aa04a6 100644 --- a/docs/en_us/course_authors/source/running_course/course_grades.rst +++ b/docs/en_us/course_authors/source/running_course/course_grades.rst @@ -392,7 +392,7 @@ For checkboxes and multiple choice problems, the answer choices actually selecte **Why don't I see a Question for some of my problems?** -The value in the **Question** column is the accessibility label for the problem. For more information about how to set up labels for problems, see :ref:`Common Problems`. +The value in the **Question** column is the accessibility label for the problem. For more information about how to set up labels for problems, see :ref:`Create Exercises`. Also, for problems that use the **Randomization** setting in Studio, if a particular answer has not been selected since early March 2014, the **Question** is blank for that answer. diff --git a/docs/en_us/course_authors/source/running_course/course_student.rst b/docs/en_us/course_authors/source/running_course/course_student.rst index 2d07d0c6de8a..25e5d53f6e82 100644 --- a/docs/en_us/course_authors/source/running_course/course_student.rst +++ b/docs/en_us/course_authors/source/running_course/course_student.rst @@ -60,7 +60,7 @@ You can access this self-reported information for all of the students who are en The student data that is available to course staff always reflects the set of live, current enrollments. Students can register for your course throughout the defined enrollment period, and they can unregister from a course at any time, which unenrolls them. Students can also change their email addresses and full names at any time. As a result, you may want to download student data periodically to gain insights into how the student population changes over time. -**Note**: In the future, edX may also request that students select a language and location. This data is not collected at this time. +.. note:: In the future, edX may also request that students select a language and location. This data is not collected at this time. .. _View and download student data: @@ -70,7 +70,10 @@ Download or view student data You can download student data to learn about population demographics at a specific point in time, compare demographics at different points in time, and plot trends in the population over time. -**Important**: Do not navigate away from this page while you wait for the data to be prepared. The larger the enrollment for your course, the longer it takes to create and output the data. +In addition to the data for enrolled students, data for the course staff is +included in the file or display. + +.. important:: Do not navigate away from this page while you wait for the data to be prepared. The larger the enrollment for your course, the longer it takes to create and output the data. For smaller courses, you also have the option to view student data on the Instructor Dashboard. @@ -82,18 +85,18 @@ To download or view student data: #. Click **Data Download**. -#. To download student enrollment data in a CSV file, click **Download profile information as a CSV**. +#. To download data about enrolled students in a CSV file, click **Download profile information as a CSV**. You are prompted to open or save the enrolled_profiles.csv file. All student-supplied data is included without truncation. -#. To display student enrollment data, click **List enrolled students' profile information**. (This option is available only for courses with an enrollment of less than 200.) +#. To display data about enrolled students, click **List enrolled students' profile information**. (This option is available only for courses with an enrollment of less than 200.) A table of the student data displays, with one row for each enrolled student. Longer values, such as student goals, are truncated. .. image:: ../Images/StudentData_Table.png :alt: Table with columns for the collected data points and rows for each student on the Instructor Dashboard -**Note**: In addition to the data for enrolled students, data for the course staff is included in the file or display. +.. note:: The columns for language and location are included in this report for backward compatibility only. This data is no longer collected during student registration. ========================================== View demographic distributions diff --git a/docs/en_us/course_authors/source/running_course/discussions.rst b/docs/en_us/course_authors/source/running_course/discussions.rst index de3e4c484930..67bb9e8685d8 100644 --- a/docs/en_us/course_authors/source/running_course/discussions.rst +++ b/docs/en_us/course_authors/source/running_course/discussions.rst @@ -58,7 +58,7 @@ To create a discussion category: #. Change the second id value to a unique identifier. For example, append a reference to the category name. -#. Add a comma between the two closing braces. +#. Add a comma after the first closing brace. .. image:: ../Images/Discussion_Add_name.png :alt: Policy value of {"General": {"id": "i4x-test_doc-SB101-course-2014_Jan"}, "Course Q&A": {"id": "i4x-test_doc-SB101-course-2014_Jan_faq"}} @@ -185,7 +185,7 @@ For information on setting up moderators for your course, see :ref:`Assigning_di Provide guidelines for students ======================================== -You can develop a set of best practices for discussion participation and make them avaiable to students as a course handout file or on a defined page in your course. These guidelines can define your expectations and optionally introduce features of edX discussions. +You can develop a set of best practices for discussion participation and make them available to students as a course handout file or on a defined page in your course. These guidelines can define your expectations and optionally introduce features of edX discussions. .. For a template that you can use to develop your own guidelines, see :ref:`Discussion Forum Guidelines`. diff --git a/docs/en_us/data/source/internal_data_formats/change_log.rst b/docs/en_us/data/source/internal_data_formats/change_log.rst index 601a3d66070b..f2cd5a6deab8 100644 --- a/docs/en_us/data/source/internal_data_formats/change_log.rst +++ b/docs/en_us/data/source/internal_data_formats/change_log.rst @@ -10,6 +10,8 @@ Change Log * - Date - Change + * - 25 Apr 14 + - Added new event types to the :ref:`Tracking Logs` chapter for interactions with PDF files. * - 31 Mar 2014 - Added new fields for the server ``problem_check`` event type to the :ref:`Tracking Logs` chapter. * - diff --git a/docs/en_us/data/source/internal_data_formats/tracking_logs.rst b/docs/en_us/data/source/internal_data_formats/tracking_logs.rst index ac366f361e6e..d371e6ada48a 100644 --- a/docs/en_us/data/source/internal_data_formats/tracking_logs.rst +++ b/docs/en_us/data/source/internal_data_formats/tracking_logs.rst @@ -211,11 +211,11 @@ Navigational Event Types These event types are fired when a user selects a navigational control. -* ``seq_goto`` is fired when a user jumps between units in a sequence. +* ``seq_goto`` fires when a user jumps between units in a sequence. -* ``seq_next`` is fired when a user navigates to the next unit in a sequence. +* ``seq_next`` fires when a user navigates to the next unit in a sequence. -* ``seq_prev`` is fired when a user navigates to the previous unit in a sequence. +* ``seq_prev`` fires when a user navigates to the previous unit in a sequence. **Component**: Sequence @@ -267,9 +267,9 @@ These event types can fire when a user works with a video. ``pause_video``, ``play_video`` --------------------------------- -* The ``pause_video`` event type is fired on video pause. +* The ``pause_video`` event type fires on video pause. -* The ``play_video`` event type is fired on video play. +* The ``play_video`` event type fires on video play. ``event`` **Fields**: These event types have the same ``event`` fields. @@ -292,7 +292,7 @@ These event types can fire when a user works with a video. ``seek_video`` ----------------- -The ``seek_video`` event is fired when the user clicks the playback bar or transcript to go to a different point in the video file. +The ``seek_video`` event fires when the user clicks the playback bar or transcript to go to a different point in the video file. +---------------------+---------------+---------------------------------------------------------------------+ | Field | Type | Details | @@ -308,7 +308,7 @@ The ``seek_video`` event is fired when the user clicks the playback bar or trans ``speed_change_video`` ------------------------ -The ``speed_change_video`` event is fired when a user selects a different playing speed for the video. +The ``speed_change_video`` event fires when a user selects a different playing speed for the video. **History**: Prior to 12 Feb 2014, this event fired when the user selected either the same speed or a different speed. @@ -329,27 +329,444 @@ The ``speed_change_video`` event is fired when a user selects a different playin .. _pdf: -============================== -PDF Interaction Event Types -============================== +================================= +Textbook Interaction Event Types +================================= + +---------- +``book`` +---------- + +The ``book`` event type fires when a user navigates within the PDF Viewer or the +PNG Viewer. + +* For textbooks in PDF format, the URL in the common ``page`` field contains + '/pdfbook/'. +* For textbooks in PNG format, the URL in the common ``page`` field contains + '/book/'. + +**Component**: PDF Viewer, PNG Viewer -The ``book`` event type is fired when a user is viewing a PDF book. +**Event Source**: Browser + +**History**: This event type changed on 16 Apr 2014 to include the ``name`` and +``chapter`` fields. + +``event`` **Fields**: + ++-------------+---------+----------------------------------------------------------------------------------+ +| Field | Type | Details | ++=============+=========+==================================================================================+ +| ``type`` | string | 'gotopage' fires when a page loads after the student manually enters its number. | +| | +----------------------------------------------------------------------------------+ +| | | 'prevpage' fires when the next page button is clicked. | +| | +----------------------------------------------------------------------------------+ +| | | 'nextpage' fires when the previous page button is clicked. | ++-------------+---------+----------------------------------------------------------------------------------+ +| ``name`` | string | For 'gotopage', set to ``textbook.pdf.page.loaded``. | +| | +----------------------------------------------------------------------------------+ +| | | For 'prevpage', set to ``textbook.pdf.page.navigatedprevious``. | +| | +----------------------------------------------------------------------------------+ +| | | For 'nextpage', set to ``textbook.pdf.page.navigatednext``. | +| | +----------------------------------------------------------------------------------+ +| | | **History**: Added for events produced by the PDF Viewer on 16 Apr 2014. | ++-------------+---------+----------------------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | +| | +----------------------------------------------------------------------------------+ +| | | **History**: Added for events produced by the PDF Viewer on 16 Apr 2014. | ++-------------+---------+----------------------------------------------------------------------------------+ +| ``old`` | integer | The original page number. Applies to 'gotopage' event types only. | ++-------------+---------+----------------------------------------------------------------------------------+ +| ``new`` | integer | Destination page number. | ++-------------+---------+----------------------------------------------------------------------------------+ + +------------------------------------ +``textbook.pdf.thumbnails.toggled`` +------------------------------------ + +The ``textbook.pdf.thumbnails.toggled`` event type fires when a user clicks +on the icon to show or hide page thumbnails. **Component**: PDF Viewer **Event Source**: Browser +**History**: This event type was added on 16 Apr 2014. + ``event`` **Fields**: -+---------------------+---------------+---------------------------------------------------------------------+ -| Field | Type | Details | -+=====================+===============+=====================================================================+ -| ``type`` | string | 'gotopage', 'prevpage', 'nextpage' | -+---------------------+---------------+---------------------------------------------------------------------+ -| ``old`` | integer | Original page number. | -+---------------------+---------------+---------------------------------------------------------------------+ -| ``new`` | integer | Destination page number. | -+---------------------+---------------+---------------------------------------------------------------------+ ++-------------+---------+---------------------------------------------------------------------+ +| Field | Type | Details | ++=============+=========+=====================================================================+ +| ``name`` | string | ``textbook.pdf.thumbnails.toggled`` | ++-------------+---------+---------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------+---------+---------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the user clicks this icon. | ++-------------+---------+---------------------------------------------------------------------+ + +------------------------------------ +``textbook.pdf.thumbnail.navigated`` +------------------------------------ + +The ``textbook.pdf.thumbnail.navigated`` event type fires when a user clicks +on a thumbnail image to navigate to a page. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++---------------------+---------+-------------------------------------------------+ +| Field | Type | Details | ++=====================+=========+=================================================+ +| ``name`` | string | ``textbook.pdf.thumbnail.navigated`` | ++---------------------+---------+-------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++---------------------+---------+-------------------------------------------------+ +| ``page`` | integer | The page number of the thumbnail clicked. | ++---------------------+---------+-------------------------------------------------+ +| ``thumbnail_title`` | string | The identifying name for the destination of the | +| | | thumbnail. For example, Page 2. | ++---------------------+---------+-------------------------------------------------+ + +------------------------------------ +``textbook.pdf.outline.toggled`` +------------------------------------ + +The ``textbook.pdf.outline.toggled`` event type fires when a user clicks the +outline icon to show or hide a list of the book's chapters. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------+---------+---------------------------------------------------------------------+ +| Field | Type | Details | ++=============+=========+=====================================================================+ +| ``name`` | string | ``textbook.pdf.outline.toggled`` | ++-------------+---------+---------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------+---------+---------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the user clicks this link. | ++-------------+---------+---------------------------------------------------------------------+ + +------------------------------------ +``textbook.pdf.chapter.navigated`` +------------------------------------ + +The ``textbook.pdf.chapter.navigated`` event type fires when a user clicks on +a link in the outline to navigate to a chapter. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------------+---------+-------------------------------------------------+ +| Field | Type | Details | ++===================+=========+=================================================+ +| ``name`` | string | ``textbook.pdf.chapter.navigated`` | ++-------------------+---------+-------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------------+---------+-------------------------------------------------+ +| ``chapter_title`` | string | The identifying name for the destination of the | +| | | outline link. | ++-------------------+---------+-------------------------------------------------+ + +------------------------------------ +``textbook.pdf.page.navigated`` +------------------------------------ + +The ``textbook.pdf.page.navigated`` event type fires when a user manually enters +a page number. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------+---------+--------------------------------------------------+ +| Field | Type | Details | ++=============+=========+==================================================+ +| ``name`` | string | ``textbook.pdf.page.navigated`` | ++-------------+---------+--------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------+---------+--------------------------------------------------+ +| ``page`` | integer | The destination page number entered by the user. | ++-------------+---------+--------------------------------------------------+ + +-------------------------------------- +``textbook.pdf.zoom.buttons.changed`` +-------------------------------------- + +The ``textbook.pdf.zoom.buttons.changed`` event type fires when a user clicks +either the Zoom In or Zoom Out icon. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++---------------+---------+--------------------------------------------------------------------+ +| Field | Type | Details | ++===============+=========+====================================================================+ +| ``name`` | string | ``textbook.pdf.zoom.buttons.changed`` | ++---------------+---------+--------------------------------------------------------------------+ +| ``direction`` | string | 'in', 'out' | ++---------------+---------+--------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++---------------+---------+--------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the user clicks the icon. | ++---------------+---------+--------------------------------------------------------------------+ + +------------------------------------ +``textbook.pdf.zoom.menu.changed`` +------------------------------------ + +The ``textbook.pdf.zoom.menu.changed`` event type fires when a user selects a +magnification setting. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------+---------+--------------------------------------------------------------------------------+ +| Field | Type | Details | ++=============+=========+================================================================================+ +| ``name`` | string | ``textbook.pdf.zoom.menu.changed`` | ++-------------+---------+--------------------------------------------------------------------------------+ +| ``amount`` | string | '1', '0.75', '1.5', 'custom', 'page_actual', 'auto', 'page_width', 'page_fit'. | ++-------------+---------+--------------------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------+---------+--------------------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the user selects this value. | ++-------------+---------+--------------------------------------------------------------------------------+ + +------------------------------------ +``textbook.pdf.display.scaled`` +------------------------------------ + +The ``textbook.pdf.display.scaled`` event type fires when the display +magnification changes. These changes occur after a student selects a +magnification setting from the zoom menu or resizes the browser window. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------+---------+-------------------------------------------------------------------+ +| Field | Type | Details | ++=============+=========+===================================================================+ +| ``name`` | string | ``textbook.pdf.display.scaled`` | ++-------------+---------+-------------------------------------------------------------------+ +| ``amount`` | string | The magnification setting; for example, 0.95 or 1.25. | ++-------------+---------+-------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------+---------+-------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the scaling takes place. | ++-------------+---------+-------------------------------------------------------------------+ + +------------------------------------ +``textbook.pdf.display.scrolled`` +------------------------------------ + +The ``textbook.pdf.display.scrolled`` event type fires each time the displayed +page changes while a user scrolls up or down. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++---------------+---------+---------------------------------------------------------------------+ +| Field | Type | Details | ++===============+=========+=====================================================================+ +| ``name`` | string | ``textbook.pdf.display.scrolled`` | ++---------------+---------+---------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++---------------+---------+---------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the scrolling takes place. | ++---------------+---------+---------------------------------------------------------------------+ +| ``direction`` | string | 'up', 'down' | ++---------------+---------+---------------------------------------------------------------------+ + +------------------------------------ +``textbook.pdf.search.executed`` +------------------------------------ + +The ``textbook.pdf.search.executed`` event type fires when a user searches for a +text value in the file. To reduce the number of events produced, instead of +producing one event per entered character this event type defines a search +string as the set of characters that are consecutively entered in the search +field within 500ms of each other. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------------+---------+------------------------------------------------------------------+ +| Field | Type | Details | ++===================+=========+==================================================================+ +| ``name`` | string | ``textbook.pdf.search.executed`` | ++-------------------+---------+------------------------------------------------------------------+ +| ``query`` | string | The value in the search field. | ++-------------------+---------+------------------------------------------------------------------+ +| ``caseSensitive`` | boolean | 'true' if the case sensitive option is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``highlightAll`` | boolean | 'true' if the option to highlight all matches is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``status`` | string | A "not found" status phrase for a search string that | +| | | is unsuccessful. Blank for successful search strings. | ++-------------------+---------+------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------------+---------+------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the search takes place. | ++-------------------+---------+------------------------------------------------------------------+ + +--------------------------------------------- +``textbook.pdf.search.navigatednext`` +--------------------------------------------- + +The ``textbook.pdf.search.navigatednext`` event type fires when a user clicks +on the Find Next or Find Previous icons for an entered search string. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------------+---------+------------------------------------------------------------------+ +| Field | Type | Details | ++===================+=========+==================================================================+ +| ``name`` | string | ``textbook.pdf.search.navigatednext`` | ++-------------------+---------+------------------------------------------------------------------+ +| ``findprevious`` | string | 'true' if the user clicks the Find Previous icon, 'false' | +| | | if the user clicks the Find Next icon. | ++-------------------+---------+------------------------------------------------------------------+ +| ``query`` | string | The value in the search field. | ++-------------------+---------+------------------------------------------------------------------+ +| ``caseSensitive`` | boolean | 'true' if the case sensitive option is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``highlightAll`` | boolean | 'true' if the option to highlight all matches is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``status`` | string | A "not found" status phrase for a search string that | +| | | is unsuccessful. Blank for successful search strings. | ++-------------------+---------+------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------------+---------+------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the search takes place. | ++-------------------+---------+------------------------------------------------------------------+ + +--------------------------------------------- +``textbook.pdf.search.highlight.toggled`` +--------------------------------------------- + +The ``textbook.pdf.search.highlight.toggled`` event type fires when a user +selects or clears the **Highlight All** option for a search. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------------+---------+------------------------------------------------------------------+ +| Field | Type | Details | ++===================+=========+==================================================================+ +| ``name`` | string | ``textbook.pdf.search.highlight.toggled`` | ++-------------------+---------+------------------------------------------------------------------+ +| ``query`` | string | The value in the search field. | ++-------------------+---------+------------------------------------------------------------------+ +| ``caseSensitive`` | boolean | 'true' if the case sensitive option is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``highlightAll`` | boolean | 'true' if the option to highlight all matches is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``status`` | string | A "not found" status phrase for a search string that is | +| | | unsuccessful. Blank for successful search strings. | ++-------------------+---------+------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------------+---------+------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the search takes place. | ++-------------------+---------+------------------------------------------------------------------+ + +------------------------------------------------------ +``textbook.pdf.search.casesensitivity.toggled`` +------------------------------------------------------ + +The ``textbook.pdf.search.casesensitivity.toggled`` event type fires when a +user selects or clears the **Match Case** option for a search. + +**Component**: PDF Viewer + +**Event Source**: Browser + +**History**: This event type was added on 16 Apr 2014. + +``event`` **Fields**: + ++-------------------+---------+------------------------------------------------------------------+ +| Field | Type | Details | ++===================+=========+==================================================================+ +| ``name`` | string | ``textbook.pdf.search.casesensitivity.toggled`` | ++-------------------+---------+------------------------------------------------------------------+ +| ``query`` | string | The value in the search field. | ++-------------------+---------+------------------------------------------------------------------+ +| ``caseSensitive`` | boolean | 'true' if the case sensitive option is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``highlightAll`` | boolean | 'true' if the option to highlight all matches is selected, | +| | | 'false' if this option is not selected. | ++-------------------+---------+------------------------------------------------------------------+ +| ``status`` | string | A "not found" status phrase for a search string that | +| | | is unsuccessful. Blank for successful search strings. | ++-------------------+---------+------------------------------------------------------------------+ +| ``chapter`` | string | The name of the PDF file. | ++-------------------+---------+------------------------------------------------------------------+ +| ``page`` | integer | The number of the page that is open when the search takes place. | ++-------------------+---------+------------------------------------------------------------------+ .. _problem: diff --git a/docs/en_us/developers/source/index.rst b/docs/en_us/developers/source/index.rst index 64d3722f8576..68d3cb9e7a1a 100644 --- a/docs/en_us/developers/source/index.rst +++ b/docs/en_us/developers/source/index.rst @@ -17,6 +17,7 @@ Contents: change_log overview.rst extending_platform/index + process/index APIs ----- diff --git a/docs/en_us/developers/source/process/community-manager.rst b/docs/en_us/developers/source/process/community-manager.rst new file mode 100644 index 000000000000..471a4fab990d --- /dev/null +++ b/docs/en_us/developers/source/process/community-manager.rst @@ -0,0 +1,141 @@ +***************** +Community Manager +***************** + +Community managers handle the first part of the process of responding to pull +requests, before they are reviewed by core committers. Community managers are +responsible for monitoring the Github project so that they are aware of incoming +pull requests. For each pull request, a community manager should: + +#. Read the description of the pull request to understand the idea behind it + and what parts of the code it impacts. If the description is absent or + unclear, inform the author that the pull request cannot be reviewed until + the description is clearer. + +#. Evaluate the idea behind the pull request. Is this something that + Open edX wants? Discuss with product owners as necessary. If you and the + product owner(s) all believe that Open edX does not want this pull request, + add a comment to the pull request explaining the reasoning behind that + decision. Be polite, and remind them that they are welcome to fork the code + and run their own fork on their own servers, without needing permission + from edX. Try to suggest ways that they can build something that Open edX + *does* want: for example, perhaps an API that would allow the contributor + to build their own component separately. Then close the pull request. + +#. Check that the author of the pull requests has submitted a + `contributor's agreement`_, added name to AUTHORS file, and any other + necessary administrivia. If not, inform author of problems + and wait for them to fix it. + +#. Once you’ve verified that the code change is not malicious, + run a Jenkins job on the pull request and check the result. + If there are failing tests (and they are real failures, not flaky tests), + inform the author that the pull request cannot be reviewed until the tests + are passing. + +#. When all the tests pass, check the diff coverage and diff quality. + If they are too low, inform the author of how to check these metrics, + and ask the author to write unit tests to increase coverage and quality + Diff quality should be 100%, and diff coverage should be at least 95% unless + there are exceptional circumstances. + +#. Skim the contents of the pull request and suggest obvious fixes/improvements + to the pull request. Note that this is *not* a thorough code review -- + this is simply to catch obvious issues and low-hanging fruit. + The point is to avoid interrupting core committers for trivial issues. + +#. Ask the author of the pull request for a test plan: + once this code is merged, how can we test that it’s working properly? + Whichever core committer merges this pull request will need to test it + on a staging server before the code is deployed to production, so be sure + that the test plan is clear enough for a core committer to follow. + +#. If the PR includes any visual changes, or changes in user interaction, + ask the author of the pull request to provide some screenshots. + (For interaction changes, GIFs are awesome!) When a core committer starts + reviewing the changes, it is often helpful to deploy the pull request to a + sandbox server, so that the reviewer can click around and verify that the + changes look good. + +#. The core committers will put together a style guide. + Pull requests that have visual/UX changes will be expected to respect this + style guide -- if they don’t, point the author to the style guide and tell + them to resubmit the pull request when it does. + +.. _contributor's agreement: http://code.edx.org/individual-contributor-agreement.pdf + +At this point, the pull request is ready for code review. There are two +different options: small PR review and large PR review. A PR is “small” if it +can be read and understood in less than 15 minutes, including time spent +context-switching, reading the description of the pull request, reading any +necessary code context, etc. Typically, “small” PRs consist of fixing typos, +improving documentation, adding comments, changing strings to unicode, marking +strings that need to be translated, adding tests, and other chores. A “small” +pull request doesn’t modify the code that will be run in production in any +meaningful way. + +If the pull request is small, it can be reviewed immediately. If the community +manager that is handling this pull request feels comfortable doing the code +review, then he or she should do so rather than handing it off to a core +committer. If not, he or she should add a comment to the PR tagging a core +committer to do the review, and informing the author that it might take a few +days for the reviewer to get around to it. + +If the pull request is not small, it will be handled by the core contributor +Scrum process. The community manager should: + +* Determine which teams of core committers this pull request impacts. + At least one developer from each of these teams should review this pull request. + +* For each team, create a story on the team’s JIRA board that links to the + pull request in question. In the story description, include any relevant + information about which contributor organization is behind the pull request, + any known political factors, etc. Tag the story as a contributor pull + request in whatever manner the team prefers: adding it to an epic, perhaps. + +* Inform the product owner of the team that there is a contributor pull request + that their team is responsible for reviewing, and send them a link to the + JIRA story that you’ve just created. Ask the product owner for an estimate + of how many sprints it will take for the pull request to be reviewed: + if its more than one, try to push back and advocate for the contributor. + However, the estimate is ultimately up to the product owner, and if he/she + says it will really be more than one sprint, respect that. + +* Add a comment to the pull request and inform the author that the pull request + is queued to be reviewed. Give them an estimate of when the pull request + will be reviewed: if you’re not sure what to say, tell them it will be in + two weeks. If the product owner has estimated that it will take more than + one sprint before the pull request can be reviewed, tag the product owner + in the comment so that they will be notified of further comments on + the pull request. + +For determining which teams that the pull request impacts, use common sense -- +but in addition, there are a few guidelines: + +* If any SASS files are modified, or any HTML in templates, + include the UX (user experience) team. + +* If any settings files or requirements files are modified, + include the devops team. + +* If any XModules are modified, + include the blades team. + +* If any logging events are modified, + include the analytics team. + +* Include the doc team on every contributor pull request. + +Once the code review process has started, the community managers are also +responsible for keeping the pull request unblocked during the review process. If +a pull request has been waiting on a core committer for a few days, a community +manager should remind the core committer to re-review the pull request. If a +pull request has been waiting on a contributor for a few days, a community +manager should add a comment to the pull request, informing the contributor that +if they want the pull request merged, they need to address the review comments. +If the contributor still has not responded after a few more days, a community +manager should close the pull request. Note that if a contributor adds a comment +saying something along the lines of “I can’t do this right now, but I’ll come +back to it in X amount of time”, that’s fine, and the PR can remain open -- but +a community manager should come back after X amount of time, and if the PR still +hasn’t been addressed, he or she should warn the contributor again. diff --git a/docs/en_us/developers/source/process/contributor.rst b/docs/en_us/developers/source/process/contributor.rst new file mode 100644 index 000000000000..55d303167060 --- /dev/null +++ b/docs/en_us/developers/source/process/contributor.rst @@ -0,0 +1,99 @@ +*********** +Contributor +*********** + +Before you make a pull request, it’s a good idea to reach out to the edX +developers and the rest of the Open edX community to discuss your ideas. There +might well be someone else already working on the same change you want to make, +and it’s much better to collaborate than to submit incompatible pull requests. +You can `send an email to the mailing list`_, `chat on the IRC channel`_, or +open an issue on our Github issue tracker. (We prefer email or IRC rather than +Github issues.) The earlier you start the conversation, the easier it will be to +make sure that everyone’s on the right track -- before you spend a lot of time +and effort making a pull request. + +.. _send an email to the mailing list: https://groups.google.com/forum/#!forum/edx-code +.. _chat on the IRC channel: http://webchat.freenode.net?channels=edx-code + +It’s also sometimes useful to submit a pull request even before the code is +working properly, to make it easier to collect early feedback. To indicate to +others that your pull request is not yet in a functional state, just prefix the +pull request title with "WIP:" (which stands for Work In Progress). + +Once you’re ready to submit your changes in a pull request, check the following +list of requirements to be sure that your pull request is ready to be reviewed: + +#. The code should be clear and understandable. + Comments in code, detailed docstrings, and good variable naming conventions + are expected. + +#. The pull request should be as small as possible. + Each pull request should encompass only one idea: one bugfix, one feature, + etc. Multiple features (or multiple bugfixes) should not be bundled into + one pull request. A handful of small pull requests is much better than + one large pull request. + +#. Structure your pull request into logical commits. + "Fixup" commits should be squashed together. The best pull requests contain + only a single, logical change -- which means only a single, logical commit. + +#. All code in the pull request must be compatible with edX’s AGPL license. + This means that the author of the pull request must sign a `contributor's + agreement with edX`_, and all libraries included or referenced in + the pull request must have `compatible licenses`_. + +#. All of the tests must pass. + If a pull request contains a new feature, it should also contain + new tests for that feature. If the pull request fixes a bug, it should + also contain a test for that bug to be sure that it stays fixed. + (edX’s continuous integration server will verify this for your pull request, + and point out any failing tests.) + +#. The author of the pull request should provide a test plan for verifying + the change in this pull request. The test plan should include details + of what should be checked, how to check it, and what the correct behavior + should be. + +#. For pull requests that make changes to the user interface, + it’s very helpful if you can include screenshots of what you changed. + In the future, the core committers will produce a style guide that + contains more requirements around how pages should appear and how + front-end code should be structured. + +#. The pull request should contain some documentation for the feature or bugfix, + either in a README file or in a comment on the pull request. + A well-written description for the pull request may be sufficient. + +#. The pull request should integrate with existing infrastructure as much + as possible, rather than reinventing the wheel. In a project as large as + Open edX, there are many foundational components that might be hard to find, + but it is important not to duplicate functionality, even if small, + that already exists. + +#. The author of the pull request should be receptive to feedback and + constructive criticism. + The pull request will not be accepted until all feedback from reviewers + is addressed. Once a core committer has reviewed a pull request from a + contributor, no further review is required from the core committer until + the contributor has addressed all of the core committer’s feedback: + either making changes to the pull request, or adding another comment + explaining why the contributor has chosen not make any change + based on that feedback. + +It’s also important to realize that you and the core committers may have +different ideas of what is important in the codebase. The power and freedom of +open source software comes from the fact that you can fork our software and make +any modifications that you like, without permission from us; however, the core +committers are similarly empowered and free to decide what modifications to pull +in from other contributors, and what not to pull in. While your code might work +great for you on a small installation, it might not work as well on a large +installation, have problems with performance or security, not be compatible with +internationalization or accessibility guidelines, and so on. There are many, +many reasons why the core committers may decide not to accept your pull request, +even for reasons that are unrelated to the quality of your code change. However, +if we do reject your pull request, we will explain why we aren’t taking it, and +try to suggest other ways that you can accomplish the same result in a way that +we will accept. + +.. _contributor's agreement with edX: http://code.edx.org/individual-contributor-agreement.pdf +.. _compatible licenses: https://github.com/edx/edx-platform/wiki/Licensing diff --git a/docs/en_us/developers/source/process/core-committer.rst b/docs/en_us/developers/source/process/core-committer.rst new file mode 100644 index 000000000000..af486f5bafce --- /dev/null +++ b/docs/en_us/developers/source/process/core-committer.rst @@ -0,0 +1,59 @@ +************** +Core Committer +************** + +Core committers are responsible for doing code review on pull requests from +contributors, once the pull request has passed through a community manager and +been prioritized by a product owner. As much as possible, the code review +process should be treated identically to the process of reviewing a pull request +from another core committer: we’re all part of the same community. However, +there are a few ways that the process is different: + +* The contributor cannot see when conflicts occur in the branch. + These conflicts prevent the pull request from being merged, + so you should ask the contributor to rebase their pull request, + and point them to `the documentation for doing so`_. + +* Jenkins may not run on the contributor’s pull request automatically. + Be sure to start new Jenkins jobs for the PR as necessary -- do not approve + a pull request unless Jenkins has run, and passed, on the last commit + in the pull request. If this contributor has already contributed a few + good pull requests, that contributor can be added to the Jenkins whitelist, + so that jobs are run automatically. + +* The contributor may not respond to comments in a timely manner. + This is not your concern: you can move on to other things while waiting. + If there is no response after a few days, a community manager will warn the + contributor that if the comments are not addressed, the pull request will + be closed. (You can also warn the contributor yourself, if you wish.) + Do not close the pull request merely because the contributor hasn’t responded + -- if you think the pull request should be closed, inform the + community managers, and they will handle it. + +.. _the documentation for doing so: https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request + +Each Scrum team should decide for themselves how to estimate stories related to +reviewing external pull requests, and how to claim points for those stories, +keeping in mind that an unresponsive contributor may block the story in ways +that the team can’t control. When deciding how many contributor pull request +reviews to commit to in the upcoming iteration, teams should plan to spend about +two hours per week per developer on the team -- larger teams can plan to spend +more time than smaller teams. For example, a team with two developers should plan +to spend about four hours per week on pull request review, while a team with +four developers should plan to spend about eight hours per week on pull request +review -- these hours can be spread out among multiple developers, or one +developer can do all the review for the whole team in that iteration. +However, this is just a guideline: the teams can decide for themselves how +many contributor pull request reviews they want to commit to. + +Once a pull request from a contributor passes all required code reviews, a core +committer will need to merge the pull request into the project. The core +committer who merges the pull request will be responsible for verifying those +changes on the staging server prior to release, using the test plan provided by +the author of the pull request. + +In addition to reviewing contributor requests as part of sprint work, core +committers should expect to spend about one hour per week doing other tasks +related to the open source community: reading/responding to questions on the +mailing list and/or IRC channel, disseminating information about what edX is +working on, and so on. diff --git a/docs/en_us/developers/source/process/index.rst b/docs/en_us/developers/source/process/index.rst new file mode 100644 index 000000000000..32c1b1bbc847 --- /dev/null +++ b/docs/en_us/developers/source/process/index.rst @@ -0,0 +1,13 @@ +########################### +Contributing to Open edX +########################### + +.. toctree:: + :maxdepth: 2 + + overview + core-committer + product-owner + community-manager + contributor + \ No newline at end of file diff --git a/docs/en_us/developers/source/process/overview.rst b/docs/en_us/developers/source/process/overview.rst new file mode 100644 index 000000000000..b4fac713c213 --- /dev/null +++ b/docs/en_us/developers/source/process/overview.rst @@ -0,0 +1,69 @@ +***************************** +Process for Contributing Code +***************************** + +Open edX is a massive project, and we would love you to help us build +the best online education system in the world -- we can’t do it alone! +However, the core committers on the project are also developing features +and creating pull requests, so we need to balance reviewing time with +development time. To help manage our time and keep everyone as happy as +possible, we’ve developed this document that explains what core committers +and other contributors can expect from each other. The goals are: + +* Keep pull requests unblocked and flowing as much as possible, + while respecting developer time and product owner prioritization. +* Maintain a high standard for code quality, while avoiding hurt feelings + as much as possible. + +Roles +----- + +:doc:`core-committer` + Can commit changes to an Open edX repository. Core committers are responsible for the quality of the code, and for supporting the code in the future. Core committers are also developers in their own right. + +:doc:`product-owner` + Prioritizes the work of core committers. + +:doc:`community-manager` + helps keep the community healthy and working smoothly. + +:doc:`contributor` + submits pull requests for eventual committing to an Open edX repository. + +.. note:: + At the moment, developers who work for edX are core committers, and other + developers are contributors. This may change in the future. + +Overview +-------- + +.. image:: pr-process.png + :align: center + :alt: A visualization of the pull request process + +If you are a :doc:`contributor ` submitting a pull request, expect that it will +take a few weeks before it can be merged. The earlier you can start talking +with the rest of the Open edX community about the changes you want to make, +before you even start changing code if possible, the better the whole process +will go. Follow the guidelines in the document for a high-quality pull +request: include a detailed description, keep the code clear and readable, +make sure the tests pass, be responsive to code review comments. +Small pull requests are easier to review than large pull requests, so +split up your changes into several small pull requests when possible -- +it will make everything go faster. + +If you are a :doc:`product owner `, treat pull requests +from contributors like feature requests from a customer. +Keep the lines of communication open -- if there are delays or unexpected +problems, add a comment to the pull request informing the author of the +pull request of what’s going on. No one likes to feel like they’re being ignored! + +If you are a :doc:`core committer `, allocate some time +in every two-week sprint to review pull requests from other contributors. +The community managers will make sure that these pull requests meet a +basic standard for quality before asking you spend time reviewing them. + +Feel free to read the other documentation specific to each individual role in the +process, but you don’t need to read everything to get started! If you're not +sure where to start, check out the :doc:`contributor ` documentation. Thanks +for helping us grow the project smoothly! :) diff --git a/docs/en_us/developers/source/process/pr-process.graffle b/docs/en_us/developers/source/process/pr-process.graffle new file mode 100644 index 000000000000..8ba80a14a9ad Binary files /dev/null and b/docs/en_us/developers/source/process/pr-process.graffle differ diff --git a/docs/en_us/developers/source/process/pr-process.png b/docs/en_us/developers/source/process/pr-process.png new file mode 100644 index 000000000000..af90501eb8e6 Binary files /dev/null and b/docs/en_us/developers/source/process/pr-process.png differ diff --git a/docs/en_us/developers/source/process/product-owner.rst b/docs/en_us/developers/source/process/product-owner.rst new file mode 100644 index 000000000000..5291a1ae6e1c --- /dev/null +++ b/docs/en_us/developers/source/process/product-owner.rst @@ -0,0 +1,14 @@ +************* +Product Owner +************* + +The product owner is responsible for prioritizing pull requests from +contributors, and keeping them informed when prioritization slips. The community +managers will inform product owners of incoming pull requests that are relevant +to their team. For every sprint, each incoming pull request should either be +included in the sprint as a commitment to get the pull request reviewed, or the +product owner must inform the author of the pull request that the pull request +is still queued and is not being ignored. Contributors should be treated as +customers, and if their pull requests are delayed then they should be informed +of that, just as a product owner would inform any customer when that customer’s +requests are delayed. diff --git a/i18n/branch_cleanup.py b/i18n/branch_cleanup.py new file mode 100644 index 000000000000..9b1c1cc36c1e --- /dev/null +++ b/i18n/branch_cleanup.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +""" +Utility for cleaning up your local directory after switching between +branches with different translation levels (eg master branch, with only +reviewed translations, versus dev branch, with all translations) +""" +from __future__ import print_function +import os + +from i18n.config import CONFIGURATION +from i18n.execute import execute + + +def clean_conf_folder(locale): + """Remove the configuration directory for `locale`""" + dirname = CONFIGURATION.get_messages_dir(locale) + command = "rm -rf {}".format(dirname) + print(command) + try: + execute(command) + except Exception as exc: + print("Encountered error {}; continuing...".format(exc)) + return + + +def clean_configuration_directory(): + """ + Remove the configuration directories for all locales + in CONFIGURATION.translated_locales + """ + for locale in CONFIGURATION.translated_locales: + clean_conf_folder(locale) + + +if __name__ == '__main__': + clean_configuration_directory() diff --git a/i18n/transifex.py b/i18n/transifex.py index 82470ac7ba77..dc30a645bcd2 100755 --- a/i18n/transifex.py +++ b/i18n/transifex.py @@ -18,6 +18,8 @@ def push(): def pull(): print("Pulling languages from transifex...") + # Pull translations from all languages where there is + # at least 10% reviewed translations execute('tx pull --mode=reviewed --all') clean_translated_locales() @@ -52,7 +54,7 @@ def clean_file(filename): except Exception as exc: # An exception can occur when a language is deleted from Transifex. # Don't totally fail here. - print("Encountered error %s with filename %s - does language project still exist on Transifex?", exc, filename) + print("Encountered error {} with filename {} - language project may no longer exist on Transifex".format(exc, filename)) return if po.header.find(EDX_MARKER) != -1: new_header = get_new_header(po) diff --git a/i18n/validate.py b/i18n/validate.py index 7e95e36d2d91..48a401582297 100644 --- a/i18n/validate.py +++ b/i18n/validate.py @@ -213,4 +213,6 @@ def main(languages=None, empty=False, verbosity=1): # pylint: disable=unused-ar logging.basicConfig(stream=sys.stdout, level=log_level) # pylint: enable=invalid-name + print("Validating languages...") main(languages=args.language, empty=args.empty, verbosity=args.verbose) + print("Finished validating languages") diff --git a/lms/djangoapps/bulk_email/models.py b/lms/djangoapps/bulk_email/models.py index 8ea5ca80a36b..9580703ef2bd 100644 --- a/lms/djangoapps/bulk_email/models.py +++ b/lms/djangoapps/bulk_email/models.py @@ -12,11 +12,12 @@ """ import logging -from django.db import models, transaction +from django.conf import settings from django.contrib.auth.models import User -from html_to_text import html_to_text +from django.db import models, transaction -from django.conf import settings +from html_to_text import html_to_text +from mail_utils import wrap_message log = logging.getLogger(__name__) @@ -192,8 +193,8 @@ def _render(format_string, message_body, context): message_body_tag = COURSE_EMAIL_MESSAGE_BODY_TAG.format() result = result.replace(message_body_tag, message_body, 1) - # finally, return the result, without converting to an encoded byte array. - return result + # finally, return the result, after wrapping long lines and without converting to an encoded byte array. + return wrap_message(result) def render_plaintext(self, plaintext, context): """ diff --git a/lms/djangoapps/courseware/features/video.feature b/lms/djangoapps/courseware/features/video.feature index b25f3d37d8c1..fd88bc86a180 100644 --- a/lms/djangoapps/courseware/features/video.feature +++ b/lms/djangoapps/courseware/features/video.feature @@ -111,24 +111,24 @@ Feature: LMS.Video component Then menu "download_transcript" doesn't exist # 9 - Scenario: Youtube video has correct transcript if fields for other speeds are filled - Given I am registered for the course "test_course" - And I have a "subs_OEoXaMPEzfM.srt.sjson" transcript file in assets - And I have a "subs_b7xgknqkQk8.srt.sjson" transcript file in assets - And it has a video in "Youtube" mode: - | sub | youtube_id_1_5 | - | OEoXaMPEzfM | b7xgknqkQk8 | - And I make sure captions are opened - Then I see "Hi, welcome to Edx." text in the captions - And I select the "1.50" speed - And I reload the page with video - Then I see "Hi, welcome to Edx." text in the captions +# Scenario: Youtube video has correct transcript if fields for other speeds are filled +# Given I am registered for the course "test_course" +# And I have a "subs_OEoXaMPEzfM.srt.sjson" transcript file in assets +# And I have a "subs_b7xgknqkQk8.srt.sjson" transcript file in assets +# And it has a video in "Youtube" mode: +# | sub | youtube_id_1_5 | +# | OEoXaMPEzfM | b7xgknqkQk8 | +# And I make sure captions are opened +# Then I see "Hi, welcome to Edx." text in the captions +# And I select the "1.50" speed +# And I reload the page with video +# Then I see "Hi, welcome to Edx." text in the captions # The 1:56 time is the duration from metadata. 1:54 time is the duration reported # by the video API once the video starts playing. The next step is correct because # "1:56" is the duration in the VCR timer before the video plays. - And I see duration "1:56" +# And I see duration "1:56" - # 10 + # 9 Scenario: Verify that each video in each sub-section includes a transcript for non-Youtube countries Given youtube server is up and response time is 2 seconds And I am registered for the course "test_course" @@ -157,7 +157,7 @@ Feature: LMS.Video component Then the video has rendered in "HTML5" mode And the video does not show the captions - # 11 + # 10 Scenario: Start time works for Youtube video Given I am registered for the course "test_course" And it has a video in "Youtube" mode: @@ -166,7 +166,7 @@ Feature: LMS.Video component And I click video button "play" Then I see video slider at "0:10" position - # 12 + # 11 Scenario: End time works for Youtube video Given I am registered for the course "test_course" And it has a video in "Youtube" mode: @@ -176,7 +176,7 @@ Feature: LMS.Video component And I wait "5" seconds Then I see video slider at "0:02" position - # 13 + # 12 Scenario: Youtube video with end-time at 1:00 and the video starts playing at 0:58 Given I am registered for the course "test_course" And it has a video in "Youtube" mode: @@ -188,7 +188,7 @@ Feature: LMS.Video component And I wait "5" seconds Then I see video slider at "1:00" position - # 14 + # 13 Scenario: Start time and end time work together for Youtube video Given I am registered for the course "test_course" And it has a video in "Youtube" mode: @@ -199,7 +199,7 @@ Feature: LMS.Video component And I wait "5" seconds Then I see video slider at "0:12" position - # 15 + # 14 Scenario: Youtube video after pausing at end time video plays to the end from end time Given I am registered for the course "test_course" And it has a video in "Youtube" mode: @@ -214,7 +214,7 @@ Feature: LMS.Video component # The default video length is 00:01:55. Then I see video slider at "1:55" position - # 16 + # 15 Scenario: Youtube video with end-time at 0:32 and start-time at 0:30, the video starts playing from 0:28 Given I am registered for the course "test_course" And it has a video in "Youtube" mode: @@ -226,7 +226,7 @@ Feature: LMS.Video component And I wait "8" seconds Then I see video slider at "0:32" position - # 17 + # 16 Scenario: Youtube video with end-time at 1:00, the video starts playing from 1:52 Given I am registered for the course "test_course" And it has a video in "Youtube" mode: @@ -239,7 +239,7 @@ Feature: LMS.Video component # Video stops at the end. Then I see video slider at "1:55" position - # 18 + # 17 @skip_firefox Scenario: Quality button appears on play Given the course has a Video component in "Youtube" mode @@ -247,7 +247,7 @@ Feature: LMS.Video component And I click video button "play" Then I see video button "quality" is visible - # 19 + # 18 @skip_firefox Scenario: Quality button works correctly Given the course has a Video component in "Youtube" mode diff --git a/lms/djangoapps/courseware/features/video.py b/lms/djangoapps/courseware/features/video.py index 6bdcadf8d872..f979d72fc6fb 100644 --- a/lms/djangoapps/courseware/features/video.py +++ b/lms/djangoapps/courseware/features/video.py @@ -178,8 +178,6 @@ def add_videos_to_course(course, player_mode=None, display_names=None, hashes=No def add_video_to_course(course, parent_location=None, player_mode=None, data=None, display_name='Video'): - assert_less(world.youtube.config['youtube_api_response'].status_code, 400, "Real Youtube server is unavailable") - if not parent_location: parent_location = add_vertical_to_course(course) kwargs = get_metadata(parent_location, player_mode, data, display_name=display_name) diff --git a/lms/djangoapps/staticbook/tests.py b/lms/djangoapps/staticbook/tests.py index 37294c517f14..65ae5025c6f5 100644 --- a/lms/djangoapps/staticbook/tests.py +++ b/lms/djangoapps/staticbook/tests.py @@ -22,8 +22,17 @@ "tab_title": "Textbook", "title": "A PDF Textbook", "chapters": [ - { "title": "Chapter 1 for PDF", "url": "https://somehost.com/the_book/chap1.pdf" }, - { "title": "Chapter 2 for PDF", "url": "https://somehost.com/the_book/chap2.pdf" }, + {"title": "Chapter 1 for PDF", "url": "https://somehost.com/the_book/chap1.pdf"}, + {"title": "Chapter 2 for PDF", "url": "https://somehost.com/the_book/chap2.pdf"}, + ], +} + +PORTABLE_PDF_BOOK = { + "tab_title": "Textbook", + "title": "A PDF Textbook", + "chapters": [ + {"title": "Chapter 1 for PDF", "url": "/static/chap1.pdf"}, + {"title": "Chapter 2 for PDF", "url": "/static/chap2.pdf"}, ], } @@ -31,8 +40,8 @@ "tab_title": "Textbook", "title": "An HTML Textbook", "chapters": [ - { "title": "Chapter 1 for HTML", "url": "https://somehost.com/the_book/chap1.html" }, - { "title": "Chapter 2 for HTML", "url": "https://somehost.com/the_book/chap2.html" }, + {"title": "Chapter 1 for HTML", "url": "https://somehost.com/the_book/chap1.html"}, + {"title": "Chapter 2 for HTML", "url": "https://somehost.com/the_book/chap2.html"}, ], } @@ -194,6 +203,33 @@ def test_chapter_page_xss(self): with self.assertRaises(NoReverseMatch): self.make_url('pdf_book', book_index=0, chapter='fooey', page='xyzzy') + def test_static_url_map_contentstore(self): + """ + This ensure static URL mapping is happening properly for + a course that uses the contentstore + """ + self.make_course(pdf_textbooks=[PORTABLE_PDF_BOOK]) + url = self.make_url('pdf_book', book_index=0, chapter=1) + response = self.client.get(url) + self.assertNotContains(response, 'file={}'.format(PORTABLE_PDF_BOOK['chapters'][0]['url'])) + self.assertContains(response, 'file=/c4x/{0.org}/{0.course}/asset/{1}'.format( + self.course.location, + PORTABLE_PDF_BOOK['chapters'][0]['url'].replace('/static/', ''))) + + def test_static_url_map_static_asset_path(self): + """ + Like above, but used when the course has set a static_asset_path + """ + self.make_course(pdf_textbooks=[PORTABLE_PDF_BOOK], static_asset_path='awesomesauce') + url = self.make_url('pdf_book', book_index=0, chapter=1) + response = self.client.get(url) + self.assertNotContains(response, 'file={}'.format(PORTABLE_PDF_BOOK['chapters'][0]['url'])) + self.assertNotContains(response, 'file=/c4x/{0.org}/{0.course}/asset/{1}'.format( + self.course.location, + PORTABLE_PDF_BOOK['chapters'][0]['url'].replace('/static/', ''))) + self.assertContains(response, 'file=/static/awesomesauce/{}'.format( + PORTABLE_PDF_BOOK['chapters'][0]['url'].replace('/static/', ''))) + class StaticHtmlBookTest(StaticBookTest): """ diff --git a/lms/djangoapps/staticbook/views.py b/lms/djangoapps/staticbook/views.py index 593ab248d5d1..17d886be11b7 100644 --- a/lms/djangoapps/staticbook/views.py +++ b/lms/djangoapps/staticbook/views.py @@ -51,6 +51,7 @@ def remap_static_url(original_url, course): input_url, getattr(course, 'data_dir', None), course_id=course.location.course_id, + static_asset_path=course.static_asset_path ) # strip off the quotes again... return output_url[1:-1] diff --git a/lms/envs/acceptance.py b/lms/envs/acceptance.py index 2496b74e1bef..ee6256f5fbbe 100644 --- a/lms/envs/acceptance.py +++ b/lms/envs/acceptance.py @@ -107,6 +107,10 @@ def seed(): # Use the auto_auth workflow for creating users and logging them in FEATURES['AUTOMATIC_AUTH_FOR_TESTING'] = True +# Third-party auth is enabled in lms/envs/test.py for unittests, but we don't +# yet want it for acceptance tests. +FEATURES['ENABLE_THIRD_PARTY_AUTH'] = False + # Enable fake payment processing page FEATURES['ENABLE_PAYMENT_FAKE'] = True @@ -182,6 +186,6 @@ def seed(): } # Point the URL used to test YouTube availability to our stub YouTube server -YOUTUBE['API'] = 'youtube.com/iframe_api' +YOUTUBE['API'] = "127.0.0.1:{0}/get_youtube_api/".format(YOUTUBE_PORT) YOUTUBE['TEST_URL'] = "127.0.0.1:{0}/test_youtube/".format(YOUTUBE_PORT) YOUTUBE['TEXT_API']['url'] = "127.0.0.1:{0}/test_transcripts_youtube/".format(YOUTUBE_PORT) diff --git a/lms/envs/bok_choy.py b/lms/envs/bok_choy.py index 88f7f62c7bbd..07969726a704 100644 --- a/lms/envs/bok_choy.py +++ b/lms/envs/bok_choy.py @@ -5,6 +5,7 @@ import os from path import path + CONFIG_ROOT = path(__file__).abspath().dirname() # pylint: disable=E1120 TEST_ROOT = CONFIG_ROOT.dirname().dirname() / "test_root" @@ -60,3 +61,9 @@ # Unfortunately, we need to use debug mode to serve staticfiles DEBUG = True + +# Point the URL used to test YouTube availability to our stub YouTube server +YOUTUBE_PORT = 9080 +YOUTUBE['API'] = "127.0.0.1:{0}/get_youtube_api/".format(YOUTUBE_PORT) +YOUTUBE['TEST_URL'] = "127.0.0.1:{0}/test_youtube/".format(YOUTUBE_PORT) +YOUTUBE['TEXT_API']['url'] = "127.0.0.1:{0}/test_transcripts_youtube/".format(YOUTUBE_PORT) diff --git a/lms/envs/common.py b/lms/envs/common.py index af6d1153d5d9..6d8862568c48 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -243,6 +243,10 @@ # Turn off Advanced Security by default 'ADVANCED_SECURITY': False, + + # Show a "Download your certificate" on the Progress page if the lowest + # nonzero grade cutoff is met + 'SHOW_PROGRESS_SUCCESS_BUTTON': False, } # Used for A/B testing @@ -531,61 +535,61 @@ ('fake2', u'Fake translations'), # Another dummy language for testing (not pushed to prod) ('ar', u'العربية'), # Arabic -# ('az', u'azərbaycanca'), # Azerbaijani -# ('bg-bg', u'български (България)'), # Bulgarian (Bulgaria) -# ('bn', u'বাংলা'), # Bengali -# ('bn-bd', u'বাংলা (বাংলাদেশ)'), # Bengali (Bangladesh) -# ('bs', u'bosanski'), # Bosnian + ('az', u'azərbaycanca'), # Azerbaijani + ('bg-bg', u'български (България)'), # Bulgarian (Bulgaria) + ('bn', u'বাংলা'), # Bengali + ('bn-bd', u'বাংলা (বাংলাদেশ)'), # Bengali (Bangladesh) + ('bs', u'bosanski'), # Bosnian ('ca', u'Català'), # Catalan -# ('ca@valencia', u'Català (València)'), # Catalan (Valencia) + ('ca@valencia', u'Català (València)'), # Catalan (Valencia) ('cs', u'Čeština'), # Czech -# ('cy', u'Cymraeg'), # Welsh + ('cy', u'Cymraeg'), # Welsh ('de-de', u'Deutsch (Deutschland)'), # German (Germany) -# ('el', u'Ελληνικά'), # Greek + ('el', u'Ελληνικά'), # Greek ('en@lolcat', u'LOLCAT English'), # LOLCAT English ('en@pirate', u'Pirate English'), # Pirate English ('es-419', u'Español (Latinoamérica)'), # Spanish (Latin America) -# ('es-ar', u'Español (Argentina)'), # Spanish (Argentina) -# ('es-ec', u'Español (Ecuador)'), # Spanish (Ecuador) + ('es-ar', u'Español (Argentina)'), # Spanish (Argentina) + ('es-ec', u'Español (Ecuador)'), # Spanish (Ecuador) ('es-es', u'Español (España)'), # Spanish (Spain) -# ('es-mx', u'Español (México)'), # Spanish (Mexico) -# ('es-pe', u'Español (Perú)'), # Spanish (Peru) -# ('es-us', u'Español (Estados Unidos)'), # Spanish (United States) -# ('et-ee', u'Eesti (Eesti)'), # Estonian (Estonia) -# ('eu-es', u'euskara (Espainia)'), # Basque (Spain) -# ('fa', u'فارسی'), # Persian -# ('fa-ir', u'فارسی (ایران)'), # Persian (Iran) -# ('fi-fi', u'Suomi (Suomi)'), # Finnish (Finland) + ('es-mx', u'Español (México)'), # Spanish (Mexico) + ('es-pe', u'Español (Perú)'), # Spanish (Peru) + ('es-us', u'Español (Estados Unidos)'), # Spanish (United States) + ('et-ee', u'Eesti (Eesti)'), # Estonian (Estonia) + ('eu-es', u'euskara (Espainia)'), # Basque (Spain) + ('fa', u'فارسی'), # Persian + ('fa-ir', u'فارسی (ایران)'), # Persian (Iran) + ('fi-fi', u'Suomi (Suomi)'), # Finnish (Finland) ('fr', u'Français'), # French -# ('gl', u'Galego'), # Galician -# ('he', u'עברית'), # Hebrew + ('gl', u'Galego'), # Galician + ('he', u'עברית'), # Hebrew ('hi', u'हिन्दी'), # Hindi -# ('hu', u'magyar'), # Hungarian - ('hy-am', u'Հայերէն (Հայաստանի Հանրապետութիւն)'), # Armenian (Armenia) + ('hu', u'magyar'), # Hungarian + ('hy-am', u'Հայերեն (Հայաստան)'), # Armenian (Armenia) ('id', u'Bahasa Indonesia'), # Indonesian ('it-it', u'Italiano (Italia)'), # Italian (Italy) ('ja-jp', u'日本語(日本)'), # Japanese (Japan) -# ('kk-kz', u'қазақ тілі (Қазақстан)'), # Kazakh (Kazakhstan) -# ('km-kh', u'ភាសាខ្មែរ (កម្ពុជា)'), # Khmer (Cambodia) + ('kk-kz', u'қазақ тілі (Қазақстан)'), # Kazakh (Kazakhstan) + ('km-kh', u'ភាសាខ្មែរ (កម្ពុជា)'), # Khmer (Cambodia) ('ko-kr', u'한국어(대한민국)'), # Korean (Korea) ('lt-lt', u'Lietuvių (Lietuva)'), # Lithuanian (Lithuania) -# ('ml', u'മലയാളം'), # Malayalam -# ('mn', u'Монгол хэл'), # Mongolian -# ('ms', u'Bahasa Melayu'), # Malay + ('ml', u'മലയാളം'), # Malayalam + ('mn', u'Монгол хэл'), # Mongolian + ('ms', u'Bahasa Melayu'), # Malay ('nb', u'Norsk bokmål'), # Norwegian Bokmål -# ('ne', u'नेपाली'), # Nepali + ('ne', u'नेपाली'), # Nepali ('nl-nl', u'Nederlands (Nederland)'), # Dutch (Netherlands) ('pl', u'Polski'), # Polish ('pt-br', u'Português (Brasil)'), # Portuguese (Brazil) -# ('pt-pt', u'Português (Portugal)'), # Portuguese (Portugal) -# ('ru', u'Русский'), # Russian -# ('si', u'සිංහල'), # Sinhala -# ('sk', u'Slovenčina'), # Slovak + ('pt-pt', u'Português (Portugal)'), # Portuguese (Portugal) + ('ru', u'Русский'), # Russian + ('si', u'සිංහල'), # Sinhala + ('sk', u'Slovenčina'), # Slovak ('sl', u'Slovenščina'), # Slovenian -# ('th', u'ไทย'), # Thai + ('th', u'ไทย'), # Thai ('tr-tr', u'Türkçe (Türkiye)'), # Turkish (Turkey) ('uk', u'Українська'), # Ukranian -# ('ur', u'اردو'), # Urdu + ('ur', u'اردو'), # Urdu ('vi', u'Tiếng Việt'), # Vietnamese ('zh-cn', u'中文(简体)'), # Chinese (China) ('zh-tw', u'中文(台灣)'), # Chinese (Taiwan) @@ -1289,6 +1293,11 @@ 'ROOT_PATH': '/tmp/edx-s3/grades', } +######################## PROGRESS SUCCESS BUTTON ############################## +# The following fields are available in the URL: {course_id} {student_id} +PROGRESS_SUCCESS_BUTTON_URL = 'http:////{course_id}' +PROGRESS_SUCCESS_BUTTON_TEXT_OVERRIDE = None + #### PASSWORD POLICY SETTINGS ##### PASSWORD_MIN_LENGTH = None diff --git a/lms/envs/test.py b/lms/envs/test.py index 52288774712c..f0f734532d58 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -180,6 +180,9 @@ # hide ratelimit warnings while running tests filterwarnings('ignore', message='No request passed to the backend, unable to rate-limit') +######### Third-party auth ########## +FEATURES['ENABLE_THIRD_PARTY_AUTH'] = True + ################################## OPENID ##################################### FEATURES['AUTH_USE_OPENID'] = True FEATURES['AUTH_USE_OPENID_PROVIDER'] = True diff --git a/lms/static/sass/_discussion.scss b/lms/static/sass/_discussion.scss index 71b4518693fb..c63d30e921ad 100644 --- a/lms/static/sass/_discussion.scss +++ b/lms/static/sass/_discussion.scss @@ -5,7 +5,7 @@ @mixin blue-button { display: block; height: 35px; - padding: 0 15px; + padding: 0 ($baseline*.75); border-radius: 3px; border: 1px solid #2d81ad; @include linear-gradient(top, #6dccf1, #38a8e5); @@ -23,18 +23,18 @@ } @mixin white-button { + @include linear-gradient(top, #eee, #ccc); display: block; - height: 35px; - padding: 0 15px; - border-radius: 3px; border: 1px solid #aaa; - @include linear-gradient(top, #eee, #ccc); - font-size: 13px; + border-radius: 3px; + padding: 0 ($baseline*.75); + height: 35px; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4) inset, 0 1px 1px rgba(0, 0, 0, .15); + color: $dark-gray; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6); font-weight: 700; + font-size: 13px; line-height: 32px; - color: #333; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6); - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4) inset, 0 1px 1px rgba(0, 0, 0, .15); &:hover, &:focus { @include linear-gradient(top, $white, #ddd); @@ -44,14 +44,14 @@ @mixin dark-grey-button { display: block; height: 35px; - padding: 0 15px; + padding: 0 ($baseline*.75); border-radius: 3px; border: 1px solid #222; background: -webkit-linear-gradient(top, #777, #555); font-size: 13px; font-weight: 700; line-height: 32px; - color: #fff; + color: $white; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.6); box-shadow: 0 1px 0 rgba(255, 255, 255, 0.4) inset, 0 1px 1px rgba(0, 0, 0, .15); @@ -64,11 +64,11 @@ width: 100%; height: 240px; margin-top: 0; - padding: 10px; + padding: ($baseline/2); @include box-sizing(border-box); border: 1px solid #aaa; border-radius: 3px 3px 0 0; - background: #fff; + background: $white; font-family: 'Monaco', monospace; font-size: 13px; line-height: 1.6; @@ -116,11 +116,12 @@ // main styling body.discussion { + // new post creation .new-post-form-errors { display: none; background: $error-red; padding: 0; - border: 1px solid #333; + border: 1px solid $dark-gray; list-style: none; color: $white; line-height: 1.6; @@ -128,7 +129,7 @@ body.discussion { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) inset, 0 1px 0 rgba(255, 255, 255, .2); li { - padding: $baseline/2 $baseline 12px 45px; + padding: ($baseline/2) $baseline 12px 45px; border-bottom: 1px solid #dc4949; background: url(../images/white-error-icon.png) no-repeat 15px 14px; @@ -143,15 +144,10 @@ body.discussion { .new-post-btn { @include blue-button; - font-size: 13px; margin-right: 4px; } .new-post-icon { - display: block; - float: left; - width: 16px; - height: 17px; margin: 8px 7px 0 0; font-size: 16px; vertical-align: middle; @@ -170,10 +166,10 @@ body.discussion { } .left-column { + @include box-sizing(border-box); float: left; + padding: ($baseline*2); width: 32%; - padding: $baseline*2; - @include box-sizing(border-box); .topic-dropdown-label { font-size: 22px; @@ -194,17 +190,17 @@ body.discussion { .form-group-label { display: block; - padding-top: $baseline/4; + padding-top: ($baseline/4); color: $white; } .topic_dropdown_button { + @include white-button; position: relative; z-index: 1000; - @include white-button; - height: 40px; margin-top: 15px; border-color: #444; + height: 40px; line-height: 36px; .drop-arrow { @@ -223,7 +219,7 @@ body.discussion { width: 100%; @include box-sizing(border-box); background: #797979; - border: 1px solid #333; + border: 1px solid $dark-gray; box-shadow: 0 2px 50px rgba(0, 0, 0, .4); } @@ -233,7 +229,7 @@ body.discussion { a { display: block; - padding: $baseline/2 15px; + padding: ($baseline/2) 15px; border-top: 1px solid #5f5f5f; font-size: 14px; font-weight: 700; @@ -276,7 +272,7 @@ body.discussion { padding: 0 15px; @include box-sizing(border-box); border-radius: 30px; - border: 1px solid #333; + border: 1px solid $dark-gray; box-shadow: 0 1px 3px rgba(0, 0, 0, .25) inset; background: -webkit-linear-gradient(top, #eee, $white); font-size: 11px; @@ -288,7 +284,7 @@ body.discussion { .right-column { float: left; width: 68%; - padding: $baseline*2; + padding: ($baseline*2); @include box-sizing(border-box); } @@ -303,7 +299,7 @@ body.discussion { .edit-post-form { @include clearfix; - margin-bottom: $baseline*2; + margin-bottom: ($baseline*2); width: 100%; @include box-sizing(border-box); @@ -318,14 +314,14 @@ body.discussion { .post-cancel { @include white-button; float: left; - margin: $baseline/2 0 0 15px; + margin: ($baseline/2) 0 0 ($baseline*.75); } .post-update { @include blue-button; float: left; - margin-top: $baseline/2; - padding-bottom: 2px; + margin-top: ($baseline/2); + padding-bottom: ($baseline/10); height: 37px; &:hover, &:focus { @@ -334,16 +330,16 @@ body.discussion { } .edit-post-title { - width: 100%; - height: 40px; - padding: 0 10px; @include box-sizing(border-box); - border-radius: 3px; border: 1px solid #aaa; + border-radius: 3px; + padding: 0 ($baseline/2); + width: 100%; + height: 40px; + box-shadow: 0 1px 3px $shadow-l1 inset; + color: $dark-gray; font-size: 16px; font-family: $sans-serif; - color: #333; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15) inset; } } @@ -353,13 +349,12 @@ body.discussion { } .new-post-form { - width: 100%; - margin-bottom: 20px; - border-radius: 3px; - background: rgba(0, 0, 0, .55); - color: #fff; - box-shadow: 0 1px 2px rgba(0, 0, 0, .5) inset, 0 1px 0 rgba(255, 255, 255, .5); @include clearfix; + border-radius: 3px; + width: 100%; + background: $shadow-d2; + box-shadow: 0 1px 2px $shadow-d2 inset, 0 1px 0 rgba(255, 255, 255, .5); + color: $white; .form-row { margin-bottom: $baseline; @@ -367,19 +362,12 @@ body.discussion { .new-post-body .wmd-input { @include discussion-wmd-input; + @include box-sizing(border-box); position: relative; - width: 100%; - height: 200px; z-index: 1; - padding: 10px; - @include box-sizing(border-box); - border: 1px solid #333; - border-radius: 3px 3px 0 0; - background: #fff; - font-family: 'Monaco', monospace; - font-size: 13px; - line-height: 1.6; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3) inset; + width: 100%; + height: 150px; + background: $white; } .new-post-body .wmd-preview-container { @@ -395,26 +383,24 @@ body.discussion { } .new-post-title { - width: 100%; - height: 40px; - padding: 0 10px; @include box-sizing(border-box); + border: 1px solid $dark-gray; border-radius: 3px; - border: 1px solid #333; - font-size: 16px; + padding: 0 ($baseline/2); + width: 100%; + height: 40px; + box-shadow: 0 1px 3px $shadow inset; + color: $dark-gray; font-weight: 700; - font-family: 'Open Sans', sans-serif; - color: #333; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3) inset; } .submit { @include blue-button; float: left; - margin-top: $baseline/2; - padding-bottom: 2px; + margin-top: ($baseline/2); + border-color: $dark-gray; + padding-bottom: ($baseline/10); height: 37px; - border-color: #333; &:hover, &:focus { border-color: #222; @@ -424,16 +410,16 @@ body.discussion { .new-post-cancel { @include white-button; float: left; - margin: $baseline/2 0 0 15px; + margin: ($baseline/2) 0 0 ($baseline*.75); border-color: #444; } .options { - margin-top: $baseline*2; + margin-top: ($baseline*2); label { display: inline; - margin-left: 8px; + margin-left: ($baseline/2); color: $white; text-shadow: none; font-size: 15px; @@ -441,8 +427,6 @@ body.discussion { } } - - .thread-title { display: block; margin-bottom: $baseline; @@ -451,17 +435,13 @@ body.discussion { font-size: 21px; } - - - - section.user-profile { @extend .sidebar; display: table-cell; - border-radius: 3px 0 0 3px; border-right: 1px solid #ddd; - box-shadow: none; + border-radius: 3px 0 0 3px; background-color: $sidebar-color; + box-shadow: none; .user-profile { padding: 32px 36px; @@ -502,10 +482,10 @@ body.discussion { } .wmd-input { - width: 100%; - height: 150px; border: 1px solid #c8c8c8; border-radius: 3px 3px 0 0; + width: 100%; + height: 150px; background-color: #e9e9e9; font-style: normal; font-size: 0.8em; @@ -521,11 +501,8 @@ body.discussion { @include transition(all .2s ease-out 0s); position: relative; overflow: hidden; - margin-top: $baseline/2; - margin-right: 5px; - margin-bottom: 5px; - margin-left: 5px; - padding: 0px; + margin: ($baseline/2) ($baseline/4) ($baseline/4) ($baseline/4); + padding: 0; height: 20px; } @@ -547,9 +524,9 @@ body.discussion { padding-left: 2px; width: 20px; height: 20px; + background: none; list-style: none; cursor: pointer; - background: none; } .wmd-button > span { @@ -611,21 +588,21 @@ body.discussion { } .container .discussion-body { + @include clearfix; display: block; - line-height: 1.4; + border: none; background: transparent; box-shadow: none; - border: none; - @include clearfix; + line-height: 1.4; .sidebar { @include box-sizing(border-box); float: left; - width: 31%; - height: 550px; border: 1px solid #aaa; border-right: 1px solid #bcbcbc; border-radius: 3px; + width: 31%; + height: 550px; background: #f6f6f6; box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } @@ -633,9 +610,9 @@ body.discussion { .browse-search { position: relative; display: block; - height: 60px; border-bottom: 1px solid #a3a3a3; border-radius: 3px 0 0 0; + height: 60px; .home, .browse, @@ -654,11 +631,11 @@ body.discussion { } .icon { - @include transition(all .2s ease-out); + @include transition(all .2s ease-out); z-index: 100; display: inline-block; width: 100%; - color: #aeaeae; + color: #aeaeae; text-align: center; font-size: 28px; line-height: 60px; @@ -770,7 +747,7 @@ body.discussion { .browse-topic-drop-icon { display: block; visibility: visible; - @include transition(none); + @include transition(none); } .browse-topic-drop-menu-wrapper { @@ -986,8 +963,8 @@ body.discussion { background-color: #ddd; .loading { - padding: 15px 0; - background: #f6f6f6; + padding: ($baseline*.75) 0; + background: $gray-l6; .loading-animation { background-image: url(../images/spinner-on-grey.gif); @@ -1012,7 +989,7 @@ body.discussion { float: left; clear: both; width: 100%; - padding: 0 $baseline/2 0 18px; + padding: 0 ($baseline/2) 0 18px; margin-bottom: 1px; margin-right: -1px; @include linear-gradient(top, rgba(255, 255, 255, .7), rgba(255, 255, 255, 0)); @@ -1057,11 +1034,11 @@ body.discussion { display: block; float: left; width: 70%; - margin: 8px 0 $baseline/2; + margin: ($baseline/2) 0 ($baseline/2); font-size: 13px; font-weight: 700; line-height: 1.4; - color: #333; + color: $dark-gray; } &.read { @@ -1088,7 +1065,7 @@ body.discussion { position: absolute; top: 0; right: 0; - width: 10px; + width: 12px; height: 12px; background: url(../images/following-flag.png) no-repeat; } @@ -1110,7 +1087,6 @@ body.discussion { background-position: -13px -13px; } - .votes-count, .comments-count { @include linear-gradient(top, #3994c7, #4da7d3); color: $white; @@ -1134,28 +1110,29 @@ body.discussion { .comments-count { display: block; float: right; - width: 32px; - height: 16px; margin-top: 8px; border-radius: 2px; - @include linear-gradient(top, #d4d4d4, #dfdfdf); - font-size: 11px; - font-weight: 700; - line-height: 16px; - text-align: center; + width: 36px; + height: 20px; color: #767676; + text-align: center; + font-size: 11px; + line-height: 20px; } .comments-count { + @include linear-gradient(top, #d4d4d4, #dfdfdf); position: relative; - width: 25px; - margin-left: 4px; + margin-left: ($baseline/4); + margin-right:($baseline/4); + width: 28px; + font-weight: 700; &:after { content: ''; display: block; position: absolute; - top: 16px; + top: 20px; right: 3px; width: 5px; height: 5px; @@ -1229,7 +1206,7 @@ body.discussion { } .home-stats { padding: $baseline 0; - + .label-area { display: inline-block; min-width: $baseline*5; @@ -1307,30 +1284,30 @@ body.discussion { } .row-item-full { - + .notification-checkbox { display: inline-block; padding: $baseline/4 0 $baseline/2 0; margin-right: $baseline/2; border-radius: 5px; border: 1px solid gray; - + .email-setting { display: inline-block; text-align: center; vertical-align: middle; margin-left: $baseline/2; } - + .icon { display: inline-block; } - + .email-setting:checked ~ .icon { color: $green; } } - + .row-description { display: inline-block; width:80%; @@ -1357,7 +1334,8 @@ body.discussion { .discussion-article { position: relative; - min-height: 468px; + min-height: 468px; + background-image: url(../images/bg-texture.png); a { word-wrap: break-word; @@ -1417,18 +1395,18 @@ body.discussion { } .discussion-post { - padding: $baseline*2 $baseline*2 $baseline $baseline*2; - box-shadow: 0 2px 2px $shadow; + padding: ($baseline*2) ($baseline*2) $baseline ($baseline*2); + box-shadow: 0 1px 3px $shadow; + background-color: $white; + border-radius: 3px 3px 0 0; > header .vote-btn { position: relative; z-index: 100; - margin-top: 5px; - margin-left: $baseline*2; + margin-top: ($baseline/4); + margin-left: ($baseline*2); } - - .post-tools { @include clearfix; margin-top: 15px; @@ -1445,16 +1423,15 @@ body.discussion { .responses { list-style: none; margin-top: $baseline; - padding: 0px $baseline*2; + padding: 0px ($baseline*2); > li { + @include animation(fadeIn .3s); position: relative; margin: 0 -10px 30px; - padding: 26px 30px $baseline; - border-radius: 3px; border: 1px solid #b2b2b2; - box-shadow: 0 1px 3px rgba(0, 0, 0, .15); - @include animation(fadeIn .3s); + border-radius: 3px; + box-shadow: 0 0 1px $shadow; &.staff { padding-top: 38px; @@ -1508,28 +1485,34 @@ body.discussion { } } + .discussion-response { + @include box-sizing(border-box); + border-radius: 3px 3px 0 0; + padding: $baseline $baseline 0; + background-color: $white; + } .posted-by { font-weight: 700; } } - div.add-response { + .add-response { margin-top: $baseline; - padding: 0px 30px; + padding: 0 ($baseline*1.5); - button.add-response-btn { + .add-response-btn { @include white-button; + @include linear-gradient(top, $white 35%, #ebebeb); position: relative; - padding: 0px 30px; border: 1px solid #b2b2b2; - box-shadow: 0 1px 3px rgba(0, 0, 0, .15); - font-size: 13px; - text-align: left; - @include animation(fadeIn .3s); + padding: 0 18px; width: 100%; + box-shadow: 0 1px 1px $shadow-l1; + text-align: left; + font-size: 13px; span.add-response-btn-text { - padding-left: 4px; + padding-left: ($baseline/5); } } } @@ -1567,7 +1550,7 @@ body.discussion { @include linear-gradient(top, #50cc5e, #3db84b); color: $white; text-shadow: 0 1px 0 rgba(0, 0, 0, .3); - box-shadow: 0 1px 0 rgba(255, 255, 255, .4) inset, 0 1px 2px rgba(0, 0, 0, .2); + box-shadow: 0 1px 0 rgba(255, 255, 255, .4) inset, 0 1px 2px $shadow; .plus-icon { background-position: 0 -10px; @@ -1582,11 +1565,11 @@ body.discussion { float: right; width: 27px; height: 27px; - margin-right: $baseline/2; + margin-right: ($baseline/2); border-radius: 27px; border: 1px solid #a0a0a0; - @include linear-gradient(top, $white 35%, #ebebeb); - box-shadow: 0 1px 1px rgba(0, 0, 0, .1); + @include linear-gradient(top, $white 35%, $gray-l4); + box-shadow: 0 1px 1px $shadow-l1; .check-icon { display: block; @@ -1599,7 +1582,7 @@ body.discussion { &.is-endorsed { border: 1px solid #4697c1; @include linear-gradient(top, #6dccf1, #38a8e5); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, .4) inset; + box-shadow: 0 1px 1px $shadow-l1, 0 1px 0 rgba(255, 255, 255, .4) inset; .check-icon { background-position: 0 -12px; @@ -1608,37 +1591,38 @@ body.discussion { } blockquote { - background: #f6f6f6; + background: $gray-l5; border-radius: 3px; - padding: 5px $baseline/2; + padding: ($baseline/4) ($baseline/2); font-size: 14px; } .comments { - list-style: none; - margin-top: $baseline; + margin: 0; + border-radius: 0 0 3px 3px; padding: 0; - border-top: 1px solid #ddd; + background: $gray-l6; + box-shadow: 0 1px 3px -1px $shadow inset; + list-style: none; > li { - background: #f6f6f6; - border-bottom: 1px solid #ddd; + border-top: 1px solid $gray-l4; padding: ($baseline/2) $baseline; } + blockquote { - background: #e6e6e6; + background: $gray-l4; border-radius: 3px; - padding: 5px $baseline/2; + padding: ($baseline/4) ($baseline/2); font-size: 14px; } .comment-form { - background: #eee; @include clearfix; .comment-form-input { - padding: 5px $baseline/2; + padding: ($baseline/4) ($baseline/2); background-color: $white; font-size: 14px; } @@ -1654,13 +1638,13 @@ body.discussion { } .discussion-errors { - margin: 0px; + margin: 0; } } .response-body { font-size: 13px; - margin-bottom: $baseline/2; + margin-bottom: ($baseline/2); p + p { margin-top: 12px; @@ -1672,8 +1656,8 @@ body.discussion { } .staff-label { - margin-left: 2px; - padding: 0 4px; + margin-left: ($baseline/10); + padding: 0 ($baseline/5); border-radius: 2px; background: #009FE2; font-size: 9px; @@ -1685,8 +1669,8 @@ body.discussion { } .community-ta-label{ - margin-left: 2px; - padding: 0 4px; + margin-left: ($baseline/10); + padding: 0 ($baseline/5); border-radius: 2px; background: #449944; font-size: 9px; @@ -1697,7 +1681,7 @@ body.discussion { } .comment-form { - padding: 8px $baseline; + padding: ($baseline/2) 0; .wmd-input { @include transition(all .2s linear 0s); @@ -1715,11 +1699,11 @@ body.discussion { .comment-form-input { width: 100%; height: 31px; - padding: 0 $baseline/2; + padding: 0 ($baseline/2); @include box-sizing(border-box); border: 1px solid #b2b2b2; border-radius: 3px; - box-shadow: 0 1px 3px rgba(0, 0, 0, .1) inset; + box-shadow: 0 1px 3px $shadow-l1 inset; @include transition(border-color .1s linear 0s); &:focus { @@ -1729,27 +1713,28 @@ body.discussion { .moderator-actions { margin: 0; - margin-top: $baseline; - padding: 0; + padding: $baseline 0; @include clearfix; li { float: left; - margin-right: 8px; + margin-right: ($baseline/2); list-style: none; } a { - display: block; + @include white-button; height: 26px; - padding: 0 12px; - border-radius: 3px; - border: 1px solid #b2b2b2; @include linear-gradient(top, $white 35%, #ebebeb); font-size: 13px; line-height: 24px; color: #737373; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + font-weight: normal; + box-shadow: 0 1px 1px $shadow-l1; + + &:hover, &:focus { + @include linear-gradient(top, $white 35%, #ddd); + } .delete-icon { display: block; @@ -1776,7 +1761,7 @@ body.discussion { .main-article.new { display: none; - padding: 50px; + padding: ($baseline*2.5); } .new-post-form { @@ -1787,8 +1772,8 @@ body.discussion { .new-post-form .submit { @include blue-button; float: left; - margin-top: $baseline/2; - padding-bottom: 2px; + margin-top: ($baseline/2); + padding-bottom: ($baseline/10); } .new-post-form .options { @@ -1797,7 +1782,7 @@ body.discussion { font-size: 14px; label { - margin-left: 4px; + margin-left: ($baseline/5); } } @@ -1806,7 +1791,7 @@ body.discussion { .discussion-reply-new { - padding: 0.5*$baseline 30px $baseline; + padding: $baseline ($baseline*1.5); @include clearfix; @include transition(opacity .2s linear 0s); @@ -1850,8 +1835,9 @@ body.discussion { } } +// ==================== - +// post actions -global .global-discussion-actions { height: 60px; @include linear-gradient(top, #ebebeb, #d9d9d9); @@ -1859,8 +1845,9 @@ body.discussion { border-bottom: 1px solid #bcbcbc; } +// ==================== - +// inline discussion module and profile thread styling .discussion-module { @extend .discussion-body; position: relative; @@ -1876,16 +1863,21 @@ body.discussion { } div.add-response.post-extended-content { + margin-top: $baseline; + margin-bottom: $baseline; + button.add-response-btn { @include white-button; + @include linear-gradient(top, $white 35%, #ebebeb); position: relative; - border: 1px solid #b2b2b2; - box-shadow: 0 1px 3px rgba(0, 0, 0, .15); - font-size: 13px; + padding-left: ($baseline*1.5); + width: 100%; + box-shadow: 0 1px 1px $shadow-l1; text-align: left; - @include animation(fadeIn .3s); - width: 100%; - padding-left: 30px; + + &:hover, &:focus { + @include linear-gradient(top, $white 35%, #ddd); + } span.add-response-btn-text { padding-left: 4px; @@ -1927,7 +1919,7 @@ body.discussion { } section.discussion { - margin-top: 30px; + margin-top: ($baseline*1.5); .threads { margin-top: $baseline; @@ -1949,7 +1941,7 @@ body.discussion { } p { - margin-bottom: 0em; + margin-bottom: 0; } .discussion-article { @@ -1958,6 +1950,9 @@ body.discussion { border-radius: 3px; min-height: 0; background: $white; + padding: 0; + box-shadow: 0 1px 0 $shadow; + @include transition(all .2s linear 0s); .thread-wrapper { position: relative; @@ -1970,8 +1965,6 @@ body.discussion { } .discussion-post { - margin: $baseline 0 0; - padding: 0 ($baseline*1.5) $baseline; @include clearfix; .inline-comment-count { @@ -1992,10 +1985,10 @@ body.discussion { header { padding-bottom: 0; - margin-bottom: 15px; + margin-bottom: ($baseline*.75); .posted-details { - margin-top: 4px; + margin-top: ($baseline/5); .username { display: inline; @@ -2271,12 +2264,9 @@ body.discussion { .wmd-button-row { position: relative; - margin-left: 5px; - margin-right: 5px; - margin-bottom: 5px; - margin-top: $baseline/2; - padding: 0px; - height: 20px; + margin: ($baseline/2) ($baseline/4) ($baseline/4) ($baseline/4); + padding: 0; + height: 30px; overflow: hidden; @include transition(all .2s ease-out 0s); } @@ -2435,13 +2425,9 @@ body.discussion { @extend .discussion-module } -.group-visibility-label { - font-size: 12px; - color:#000; - font-style: italic; - background-color: $white; - } +// ==================== +// post actions - pinning .discussion-pin { font-size: 12px; float:right; @@ -2461,16 +2447,16 @@ body.discussion { } .discussion-pin-inline { - font-size: 12px; - float:right; - font-style: italic; - position: relative; - right:-20px; - top:-13px; - margin-right:35px; - margin-top:13px; - opacity: 1.0; - } + font-size: 12px; + float:right; + font-style: italic; + position: relative; + right:-20px; + top:-13px; + margin-right:35px; + margin-top:13px; + opacity: 1.0; +} .notpinned .icon { display: block; @@ -2507,10 +2493,13 @@ body.discussion { display:none; } +// ==================== + +// post actions - flagging .discussion-flag-abuse, .discussion-delete-comment, .discussion-edit-comment { font-size: 12px; float:right; - margin-left: $baseline/2; + margin-left: ($baseline/2); font-style: italic; cursor:pointer; color: $dark-gray; @@ -2523,7 +2512,7 @@ display:none; .flag-label { font-style: italic; - margin-left: $baseline/4; + margin-left: ($baseline/4); } } @@ -2531,31 +2520,56 @@ display:none; color: $pink; } +// ==================== + +// post pagination .response-count { margin-top: $baseline; - padding: 0px 3*$baseline; + padding: 0 ($baseline*1.5); + color: $gray; + font-size: 14px; } .response-pagination { - padding: 0px 1.5*$baseline; + visibility: visible; + padding: ($baseline/2) ($baseline*1.5); + background-color: $gray-l6; + box-shadow: 0 1px 1px $gray-l4 inset, 0 -1px 1px $gray-l4 inset; + + &:empty { + visibility: hidden; + } .response-display-count { display: block; - padding: 0.5*$baseline 1.5*$baseline; + padding: ($baseline/2) 0; + color: $gray; + font-size: 14px; } .load-response-button { - display: block; @include white-button; - font: normal 1em/1.6em $sans-serif; + @include linear-gradient(top, $white 35%, #ebebeb); position: relative; - padding: 0px 1.5*$baseline; - margin: $baseline/2 0px; + margin: ($baseline/2) 0; border: 1px solid #b2b2b2; - box-shadow: 0 1px 3px rgba(0, 0, 0, .15); - font-size: 13px; - text-align: left; - @include animation(fadeIn .3s); width: 100%; + box-shadow: 0 1px 1px $shadow-l1; + text-align: left; + font-weight: normal; + + span.add-response-btn-text { + padding-left: 4px; + } } } + +// ==================== + +// post metadata - cohorts +.group-visibility-label { + font-size: 12px; + color:#000; + font-style: italic; + background-color: $white; + } diff --git a/lms/static/sass/base/_variables.scss b/lms/static/sass/base/_variables.scss index 369fe1027a5d..cb96c3f92fef 100644 --- a/lms/static/sass/base/_variables.scss +++ b/lms/static/sass/base/_variables.scss @@ -33,23 +33,88 @@ $very-light-text: #fff; // ==================== -// COLORS: misc. +// COLORS +$black: rgb(0,0,0); +$black-t0: rgba($black, 0.125); +$black-t1: rgba($black, 0.25); +$black-t2: rgba($black, 0.5); +$black-t3: rgba($black, 0.75); + $white: rgb(255,255,255); $white-t0: rgba($white, 0.125); $white-t1: rgba($white, 0.25); $white-t2: rgba($white, 0.5); $white-t3: rgba($white, 0.75); -$black: rgb(0,0,0); -$black-t0: rgba($black, 0.125); -$black-t1: rgba($black, 0.25); -$black-t2: rgba($black, 0.5); -$black-t3: rgba($black, 0.75); +$gray: rgb(127,127,127); +$gray-l1: tint($gray,20%); +$gray-l2: tint($gray,40%); +$gray-l3: tint($gray,60%); // #cbcbcb; +$gray-l4: tint($gray,80%); // #e5e5e5; +$gray-l5: tint($gray,90%); // #f2f2f2; +$gray-l6: tint($gray,95%); // #f8f8f8; +$gray-l7: tint($gray,99%); +$gray-d1: shade($gray,20%); +$gray-d2: shade($gray,40%); +$gray-d3: shade($gray,60%); +$gray-d4: shade($gray,80%); + +$pink: rgb(182,37,103); +$pink-l1: tint($pink,20%); +$pink-l2: tint($pink,40%); +$pink-l3: tint($pink,60%); +$pink-l4: tint($pink,80%); +$pink-l5: tint($pink,90%); +$pink-d1: shade($pink,20%); +$pink-d2: shade($pink,40%); +$pink-d3: shade($pink,60%); +$pink-d4: shade($pink,80%); +$pink-s1: saturate($pink,15%); +$pink-s2: saturate($pink,30%); +$pink-s3: saturate($pink,45%); +$pink-u1: desaturate($pink,15%); +$pink-u2: desaturate($pink,30%); +$pink-u3: desaturate($pink,45%); +$red: rgb(178, 6, 16); +$red-l1: tint($red,20%); +$red-l2: tint($red,40%); +$red-l3: tint($red,60%); +$red-l4: tint($red,80%); +$red-l5: tint($red,90%); +$red-d1: shade($red,20%); +$red-d2: shade($red,40%); +$red-d3: shade($red,60%); +$red-d4: shade($red,80%); +$red-s1: saturate($red,15%); +$red-s2: saturate($red,30%); +$red-s3: saturate($red,45%); +$red-u1: desaturate($red,15%); +$red-u2: desaturate($red,30%); +$red-u3: desaturate($red,45%); + +$green: rgb(37, 184, 90); +$green-l1: tint($green,20%); +$green-l2: tint($green,40%); +$green-l3: tint($green,60%); +$green-l4: tint($green,80%); +$green-l5: tint($green,90%); +$green-d1: shade($green,20%); +$green-d2: shade($green,40%); +$green-d3: shade($green,60%); +$green-d4: shade($green,80%); +$green-s1: saturate($green,15%); +$green-s2: saturate($green,30%); +$green-s3: saturate($green,45%); +$green-u1: desaturate($green,15%); +$green-u2: desaturate($green,30%); +$green-u3: desaturate($green,45%); + +// TODO: both blue and yellow variables differ from CMS rgb value, need to confirm change to CMS variable is ok in current platform uses before switching. $blue: rgb(29,157,217); -$pink: rgb(182,37,104); $yellow: rgb(255, 252, 221); -$red: rgb(178, 6, 16); + +// COLORS: old variables $error-red: rgb(253, 87, 87); $danger-red: rgb(212, 64, 64); $light-gray: rgb(221, 221, 221); @@ -57,12 +122,7 @@ $dark-gray: rgb(51, 51, 51); $border-color: rgb(200, 200, 200); $sidebar-color: rgb(246, 246, 246); $outer-border-color: rgb(170, 170, 170); - -$green: rgb(37, 184, 90); - -// COLORS: old variables $light-gray: #ddd; -$dark-gray: #333; // used by descriptor css $lightGrey: #edf1f5; @@ -70,8 +130,6 @@ $darkGrey: #8891a1; $blue-d1: shade($blue,20%); $blue-d2: shade($blue,40%); $blue-d4: shade($blue,80%); -$shadow: rgba($black, 0.2); -$shadow-l1: rgba($black, 0.1); // edx.org marketing site variables $m-gray: #8A8C8F; @@ -136,6 +194,7 @@ $shadow: rgba(0,0,0,0.2); $shadow-l1: rgba(0,0,0,0.1); $shadow-l2: rgba(0,0,0,0.05); $shadow-d1: rgba(0,0,0,0.4); +$shadow-d2: rgba($black, 0.6); // ==================== diff --git a/lms/static/sass/course/_profile.scss b/lms/static/sass/course/_profile.scss index 87272963bea2..00615a07a684 100644 --- a/lms/static/sass/course/_profile.scss +++ b/lms/static/sass/course/_profile.scss @@ -148,6 +148,24 @@ } } + #course-success { + margin-bottom: 30px; + text-align: center; + > a { + @include button(simple, $button-color); + @include box-sizing(border-box); + border-radius: 3px; + font: normal 15px/1.6rem $sans-serif; + letter-spacing: 0; + padding: 5px 18px 6px; + text-align: center; + + &:hover, &:focus { + text-decoration: none; + } + } + } + #grade-detail-graph { min-height: 400px; width: 100%; diff --git a/lms/static/sass/multicourse/_account.scss b/lms/static/sass/multicourse/_account.scss index fa8d5f9c3804..2f83bfbf9590 100644 --- a/lms/static/sass/multicourse/_account.scss +++ b/lms/static/sass/multicourse/_account.scss @@ -450,6 +450,20 @@ } } + // forms - third-party auth + .form-third-party-auth { + margin-bottom: $baseline; + + button { + margin-right: $baseline; + + .icon { + color: inherit; + margin-right: $baseline/2; + } + } + } + // forms - messages/status .status { @include box-sizing(border-box); diff --git a/lms/static/sass/multicourse/_dashboard.scss b/lms/static/sass/multicourse/_dashboard.scss index 5172981661d9..8c987c9630d2 100644 --- a/lms/static/sass/multicourse/_dashboard.scss +++ b/lms/static/sass/multicourse/_dashboard.scss @@ -130,6 +130,23 @@ white-space: nowrap; text-overflow: ellipsis; overflow: hidden; + + .third-party-auth { + color: inherit; + font-weight: inherit; + + .control { + float: right; + } + + .icon { + margin-top: 4px; + } + + .provider { + display: inline; + } + } } } } diff --git a/lms/templates/courseware/progress.html b/lms/templates/courseware/progress.html index 762d4dcea1b8..ad5fa70b1851 100644 --- a/lms/templates/courseware/progress.html +++ b/lms/templates/courseware/progress.html @@ -48,6 +48,22 @@

      ${_("Course Progress for Student '{username}' ({email})").format(username=student.username, email=student.email)}

      + %if settings.FEATURES.get("SHOW_PROGRESS_SUCCESS_BUTTON"): + <% + SUCCESS_BUTTON_URL = settings.PROGRESS_SUCCESS_BUTTON_URL.format( + course_id=course.id, student_id=student.id) + nonzero_cutoffs = [cutoff for cutoff in course.grade_cutoffs.values() if cutoff > 0] + success_cutoff = min(nonzero_cutoffs) if nonzero_cutoffs else None + %> + %if success_cutoff and grade_summary['percent'] > success_cutoff: + + %endif + %endif + %if not course.disable_progress_graph: %endif diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index 94120161a421..3a9220d0d822 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -1,5 +1,6 @@ <%! from django.utils.translation import ugettext as _ %> <%! from django.template import RequestContext %> +<%! from third_party_auth import pipeline %> <%! from django.core.urlresolvers import reverse @@ -194,6 +195,13 @@
      %endif + % if duplicate_provider: +
      + ## Translators: this message is displayed when a user tries to link their account with a third-party authentication provider (for example, Google or LinkedIn) with a given edX account, but their third-party account is already associated with another edX account. provider_name is the name of the third-party authentication provider, and platform_name is the name of the edX deployment. + ${_('The selected {provider_name} account is already linked to another {platform_name} account. Please {link_start}log out{link_end}, then log in with your {provider_name} account.').format(link_end='', link_start='' % logout_url, provider_name='%s' % duplicate_provider.NAME, platform_name=platform_name)} +
      + % endif +

      ${ user.username }

      @@ -215,6 +223,53 @@

      ${ user.username }

      <%include file='dashboard/_dashboard_info_language.html' /> %endif + % if settings.FEATURES.get('ENABLE_THIRD_PARTY_AUTH'): +
      + % endif + % if external_auth_map is None or 'shib' not in external_auth_map.external_domain: