diff --git a/common/djangoapps/student/tests/test_reset_password.py b/common/djangoapps/student/tests/test_reset_password.py index 6e45685a09..0a6217c892 100644 --- a/common/djangoapps/student/tests/test_reset_password.py +++ b/common/djangoapps/student/tests/test_reset_password.py @@ -22,6 +22,7 @@ from provider.oauth2 import models as dop_models from openedx.core.djangoapps.oauth_dispatch.tests import factories as dot_factories from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers +from openedx.core.djangoapps.user_api.models import UserRetirementRequest from openedx.core.djangoapps.user_api.config.waffle import PREVENT_AUTH_USER_WRITES, SYSTEM_MAINTENANCE_MSG, waffle from openedx.core.djangolib.testing.utils import CacheIsolationTestCase from student.tests.factories import UserFactory @@ -38,7 +39,8 @@ from .test_configuration_overrides import fake_get_value ) @ddt.ddt class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): - """ Tests that clicking reset password sends email, and doesn't activate the user + """ + Tests that clicking reset password sends email, and doesn't activate the user """ request_factory = RequestFactory() @@ -59,7 +61,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): @patch('student.views.management.render_to_string', Mock(side_effect=mock_render_to_string, autospec=True)) def test_user_bad_password_reset(self): - """Tests password reset behavior for user with password marked UNUSABLE_PASSWORD_PREFIX""" + """ + Tests password reset behavior for user with password marked UNUSABLE_PASSWORD_PREFIX + """ bad_pwd_req = self.request_factory.post('/password_reset/', {'email': self.user_bad_passwd.email}) bad_pwd_resp = password_reset(bad_pwd_req) @@ -74,7 +78,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): @patch('student.views.management.render_to_string', Mock(side_effect=mock_render_to_string, autospec=True)) def test_nonexist_email_password_reset(self): - """Now test the exception cases with of reset_password called with invalid email.""" + """ + Now test the exception cases with of reset_password called with invalid email. + """ bad_email_req = self.request_factory.post('/password_reset/', {'email': self.user.email + "makeItFail"}) bad_email_resp = password_reset(bad_email_req) @@ -91,7 +97,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): @patch('student.views.management.render_to_string', Mock(side_effect=mock_render_to_string, autospec=True)) def test_password_reset_ratelimited(self): - """ Try (and fail) resetting password 30 times in a row on an non-existant email address """ + """ + Try (and fail) resetting password 30 times in a row on an non-existant email address + """ cache.clear() for i in xrange(30): @@ -113,7 +121,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): @patch('django.core.mail.send_mail') @patch('student.views.management.render_to_string', Mock(side_effect=mock_render_to_string, autospec=True)) def test_reset_password_email(self, send_email): - """Tests contents of reset password email, and that user is not active""" + """ + Tests contents of reset password email, and that user is not active + """ good_req = self.request_factory.post('/password_reset/', {'email': self.user.email}) good_req.user = self.user @@ -236,7 +246,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): ) @ddt.unpack def test_reset_password_bad_token(self, uidb36, token): - """Tests bad token and uidb36 in password reset""" + """ + Tests bad token and uidb36 in password reset + """ if uidb36 is None: uidb36 = self.uidb36 if token is None: @@ -253,7 +265,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): self.assertFalse(self.user.is_active) def test_reset_password_good_token(self): - """Tests good token and uidb36 in password reset""" + """ + Tests good token and uidb36 in password reset + """ url = reverse( "password_reset_confirm", kwargs={"uidb36": self.uidb36, "token": self.token} @@ -264,7 +278,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): self.assertTrue(self.user.is_active) def test_password_reset_fail(self): - """Tests that if we provide mismatched passwords, user is not marked as active.""" + """ + Tests that if we provide mismatched passwords, user is not marked as active. + """ self.assertFalse(self.user.is_active) url = reverse( @@ -282,6 +298,27 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): self.assertEqual(resp.status_code, 200) self.assertFalse(User.objects.get(pk=self.user.pk).is_active) + def test_password_reset_retired_user_fail(self): + """ + Tests that if a retired user attempts to reset their password, it fails. + """ + self.assertFalse(self.user.is_active) + + # Retire the user. + UserRetirementRequest.create_retirement_request(self.user) + + url = reverse( + 'password_reset_confirm', + kwargs={'uidb36': self.uidb36, 'token': self.token} + ) + reset_req = self.request_factory.get(url) + resp = password_reset_confirm_wrapper(reset_req, self.uidb36, self.token) + + # Verify the response status code is: 200 with password reset fail and also verify that + # the user is not marked as active. + self.assertEqual(resp.status_code, 200) + self.assertFalse(User.objects.get(pk=self.user.pk).is_active) + def test_password_reset_prevent_auth_user_writes(self): with waffle().override(PREVENT_AUTH_USER_WRITES, True): url = reverse( @@ -307,7 +344,8 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): } ) def test_password_reset_with_invalid_length(self, password_dict): - """Tests that if we provide password characters less then PASSWORD_MIN_LENGTH, + """ + Tests that if we provide password characters less then PASSWORD_MIN_LENGTH, or more than PASSWORD_MAX_LENGTH, password reset will fail with error message. """ @@ -326,7 +364,9 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase): @patch('student.views.management.password_reset_confirm') @patch("openedx.core.djangoapps.site_configuration.helpers.get_value", fake_get_value) def test_reset_password_good_token_configuration_override(self, reset_confirm): - """Tests password reset confirmation page for site configuration override.""" + """ + Tests password reset confirmation page for site configuration override. + """ url = reverse( "password_reset_confirm", kwargs={"uidb36": self.uidb36, "token": self.token} diff --git a/common/djangoapps/student/views/management.py b/common/djangoapps/student/views/management.py index 7b41f79aaf..41e4a44b3e 100644 --- a/common/djangoapps/student/views/management.py +++ b/common/djangoapps/student/views/management.py @@ -66,6 +66,7 @@ from openedx.core.djangoapps.site_configuration import helpers as configuration_ from openedx.core.djangoapps.theming import helpers as theming_helpers from openedx.core.djangoapps.user_api import accounts as accounts_settings from openedx.core.djangoapps.user_api.accounts.utils import generate_password +from openedx.core.djangoapps.user_api.models import UserRetirementRequest from openedx.core.djangoapps.user_api.preferences import api as preferences_api from openedx.core.djangoapps.user_api.config.waffle import PREVENT_AUTH_USER_WRITES, SYSTEM_MAINTENANCE_MSG, waffle from openedx.core.djangolib.markup import HTML, Text @@ -1150,6 +1151,19 @@ def password_reset_confirm_wrapper(request, uidb36=None, token=None): request, uidb64=uidb64, token=token, extra_context=platform_name ) + if UserRetirementRequest.has_user_requested_retirement(user): + # Refuse to reset the password of any user that has requested retirement. + context = { + 'validlink': True, + 'form': None, + 'title': _('Password reset unsuccessful'), + 'err_msg': _('Error in resetting your password.'), + } + context.update(platform_name) + return TemplateResponse( + request, 'registration/password_reset_confirm.html', context + ) + if waffle().is_enabled(PREVENT_AUTH_USER_WRITES): context = { 'validlink': False, diff --git a/common/lib/xmodule/xmodule/seq_module.py b/common/lib/xmodule/xmodule/seq_module.py index 31019b1b72..0700897aa2 100644 --- a/common/lib/xmodule/xmodule/seq_module.py +++ b/common/lib/xmodule/xmodule/seq_module.py @@ -470,6 +470,7 @@ class SequenceModule(SequenceFields, ProctoringFields, XModule): 'id': text_type(usage_id), 'bookmarked': is_bookmarked, 'path': " > ".join(display_names + [item.display_name_with_default]), + 'graded': item.graded } if is_user_authenticated: diff --git a/conf/locale/ar/LC_MESSAGES/django.mo b/conf/locale/ar/LC_MESSAGES/django.mo index abed5e65fa..c920b33b61 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 36a97c915f..c7d6d39f3f 100644 --- a/conf/locale/ar/LC_MESSAGES/django.po +++ b/conf/locale/ar/LC_MESSAGES/django.po @@ -198,7 +198,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:51+0000\n" "Last-Translator: ali fakih \n" "Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n" @@ -921,6 +921,7 @@ msgstr "" "بريدنا الإلكتروني." #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -952,7 +953,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "محاولات فاشلة كثيرة لتسجيل الدخول. يُرجى إعادة المحاولة لاحقًا. " -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "عنوان البريد الإلكتروني أو كلمة المرور خاطئين." @@ -1100,6 +1103,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "التصديق بـ {} غير متوفّر حاليًّا." @@ -9863,11 +9870,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -10700,6 +10708,10 @@ msgstr "يجب أن تتوفّر شعبة واحدة يتعيَّن فيها ا msgid "A cohort with the same name already exists." msgstr "توجد شعبة تحمل الاسم ذاته." +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "رابط خدمة داخلي" @@ -10964,6 +10976,27 @@ msgstr "" "لم يقم خادم هوية الجامعة الخاص بك بإرجاع معلومات هويتك إلينا.\n" "الرجاء محاولة تسجيل الدخول مرة أخرى. (قد تحتاج إلى إعادة تشغيل المتصفح.) " +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/ar/LC_MESSAGES/djangojs.mo b/conf/locale/ar/LC_MESSAGES/djangojs.mo index fc350af9f2..177197a1cd 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 b41bfb97ff..1c82e3aa97 100644 --- a/conf/locale/ar/LC_MESSAGES/djangojs.po +++ b/conf/locale/ar/LC_MESSAGES/djangojs.po @@ -138,7 +138,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: Roy Zakka\n" "Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n" @@ -4915,6 +4915,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -5279,6 +5283,10 @@ msgstr "النتيجة الكلية" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -8250,6 +8258,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/en/LC_MESSAGES/django.po b/conf/locale/en/LC_MESSAGES/django.po index 3d57e844f4..52c25d96bb 100644 --- a/conf/locale/en/LC_MESSAGES/django.po +++ b/conf/locale/en/LC_MESSAGES/django.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-29 20:36+0000\n" -"PO-Revision-Date: 2018-04-29 20:36:21.101798\n" +"POT-Creation-Date: 2018-05-13 20:37+0000\n" +"PO-Revision-Date: 2018-05-13 20:37:05.585963\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -92,6 +92,32 @@ msgstr "" msgid "Empty" msgstr "" +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +#, python-brace-format +msgid "The following parameters are required: {missing}." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +#, python-brace-format +msgid "A transcript with the \"{language_code}\" language code already exists." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +msgid "A transcript file is required." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +msgid "" +"There is a problem with this transcript file. Try to upload a different " +"file." +msgstr "" + #: cms/djangoapps/contentstore/views/videos.py #: lms/djangoapps/class_dashboard/dashboard_data.py #: lms/djangoapps/instructor/views/api.py lms/templates/help_modal.html @@ -714,6 +740,7 @@ msgid "There was an error receiving your login information. Please email us." msgstr "" #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -739,7 +766,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "" -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "" @@ -751,6 +780,14 @@ msgstr "" msgid "Unable to send reactivation email" msgstr "" +#: common/djangoapps/student/views/login.py +msgid "Superuser creation not allowed" +msgstr "" + +#: common/djangoapps/student/views/login.py +msgid "Account modification not allowed." +msgstr "" + #: common/djangoapps/student/views/login.py #: common/djangoapps/student/views/management.py #: openedx/core/djangoapps/user_api/accounts/api.py @@ -4170,7 +4207,7 @@ msgid "{exception_message}: Can't find uploaded transcripts: {user_filename}" msgstr "" #: common/lib/xmodule/xmodule/video_module/video_handlers.py -msgid "Invalid encoding type, transcripts should be UTF-8 encoded." +msgid "Language is required." msgstr "" #: common/lib/xmodule/xmodule/video_module/video_module.py @@ -6063,6 +6100,14 @@ msgstr "" msgid "Sailthru send template to use on enrolling for audit. " msgstr "" +#: lms/djangoapps/email_marketing/models.py +msgid "Sailthru send template to use on passed ID verification." +msgstr "" + +#: lms/djangoapps/email_marketing/models.py +msgid "Sailthru send template to use on failed ID verification." +msgstr "" + #: lms/djangoapps/email_marketing/models.py msgid "Sailthru send template to use on upgrading a course. Deprecated " msgstr "" @@ -8536,13 +8581,6 @@ msgstr "" msgid "Your {platform_name} verification has expired." msgstr "" -#: lms/djangoapps/verify_student/utils.py -#, python-brace-format -msgid "" -"Could not send verification status email having subject: {subject} and email" -" of user: {email}" -msgstr "" - #: lms/djangoapps/verify_student/views.py msgid "Intro" msgstr "" @@ -9824,6 +9862,27 @@ msgid "" " " msgstr "" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." @@ -10994,24 +11053,24 @@ msgstr "" msgid "The information you entered is incorrect." msgstr "" -#: cms/djangoapps/contentstore/views/transcript_settings.py -#, python-brace-format -msgid "The following parameters are required: {missing}." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Transcripts are supported only for \"video\" modules." msgstr "" -#: cms/djangoapps/contentstore/views/transcript_settings.py -#, python-brace-format -msgid "A transcript with the \"{language_code}\" language code already exists." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Cannot find item by locator." msgstr "" -#: cms/djangoapps/contentstore/views/transcript_settings.py -msgid "A transcript file is required." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Video locator is required." msgstr "" -#: cms/djangoapps/contentstore/views/transcript_settings.py -msgid "" -"There is a problem with this transcript file. Try to upload a different " -"file." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "This transcript file type is not supported." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Video ID is required." msgstr "" #: cms/djangoapps/contentstore/views/transcripts_ajax.py @@ -11023,7 +11082,25 @@ msgid "Can't find item by locator." msgstr "" #: cms/djangoapps/contentstore/views/transcripts_ajax.py -msgid "Transcripts are supported only for \"video\" modules." +msgid "No such transcript." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "There is a problem with the chosen transcript file." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "" +"There is a problem with the existing transcript file. Please upload a " +"different file." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "YouTube ID is required." +msgstr "" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "There is a problem with the YouTube transcript file." msgstr "" #: cms/djangoapps/contentstore/views/user.py @@ -15828,46 +15905,22 @@ msgstr "" msgid "You have been enrolled in {course_name}" msgstr "" -#: lms/templates/emails/failed_verification_email.txt -msgid "" -"Sorry! The photos you submitted for ID verification were not accepted, for " -"the following reason(s):" -msgstr "" - -#: lms/templates/emails/failed_verification_email.txt -msgid "The photo(s) of you: {reason}" -msgstr "" - -#: lms/templates/emails/failed_verification_email.txt -msgid "Resubmit Verification: {reverify_url}" -msgstr "" - -#: lms/templates/emails/failed_verification_email.txt -#: lms/templates/emails/order_confirmation_email.txt -#: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/successfull_verification_email.txt -msgid "Thank you," -msgstr "" - -#: lms/templates/emails/failed_verification_email.txt -#: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/reverification_processed.txt -#: lms/templates/emails/successfull_verification_email.txt -msgid "The {platform_name} team" -msgstr "" - #: lms/templates/emails/order_confirmation_email.txt msgid "" "Your payment was successful. You will see the charge below on your next " "credit or debit card statement under the company name {merchant_name}." msgstr "" +#: lms/templates/emails/order_confirmation_email.txt +#: lms/templates/emails/photo_submission_confirmation.txt +msgid "Thank you," +msgstr "" + #: lms/templates/emails/order_confirmation_email.txt msgid "Your order number is: {order_number}" msgstr "" #: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/successfull_verification_email.txt msgid "Hi {full_name}," msgstr "" @@ -15883,6 +15936,11 @@ msgid "" "verification process on your dashboard." msgstr "" +#: lms/templates/emails/photo_submission_confirmation.txt +#: lms/templates/emails/reverification_processed.txt +msgid "The {platform_name} team" +msgstr "" + #: lms/templates/emails/registration_codes_sale_email.txt msgid "Thank you for purchasing enrollments in {course_name}." msgstr "" @@ -16069,15 +16127,6 @@ msgstr "" msgid "Thanks," msgstr "" -#: lms/templates/emails/successfull_verification_email.txt -msgid "Congratulations! Your ID verification process was successful." -msgstr "" - -#: lms/templates/emails/successfull_verification_email.txt -msgid "" -"Your verification is effective for one year. It will expire on {expiry_date}" -msgstr "" - #: lms/templates/emails/unenroll_email_allowedmessage.txt msgid "Dear Student," msgstr "" @@ -19069,6 +19118,10 @@ msgstr "" msgid "Explore New Courses" msgstr "" +#: openedx/features/learner_profile/templates/learner_profile/learner_profile.html +msgid "View My Records" +msgstr "" + #: openedx/features/learner_profile/templates/learner_profile/learner_profile.html msgid "My Profile" msgstr "" diff --git a/conf/locale/en/LC_MESSAGES/djangojs.po b/conf/locale/en/LC_MESSAGES/djangojs.po index 14ccf7d250..9ee20f1c5f 100644 --- a/conf/locale/en/LC_MESSAGES/djangojs.po +++ b/conf/locale/en/LC_MESSAGES/djangojs.po @@ -26,8 +26,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-29 20:36+0000\n" -"PO-Revision-Date: 2018-04-29 20:36:21.128556\n" +"POT-Creation-Date: 2018-05-13 20:36+0000\n" +"PO-Revision-Date: 2018-05-13 20:37:05.556935\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -236,6 +236,7 @@ msgid "Advanced" msgstr "" #: cms/static/js/views/previous_video_upload.js +#: cms/static/js/views/video/translations_editor.js #: cms/static/js/views/video_transcripts.js lms/static/js/views/image_field.js msgid "Removing" msgstr "" @@ -2503,7 +2504,6 @@ msgstr "" #: cms/templates/js/metadata-number-entry.underscore #: cms/templates/js/metadata-option-entry.underscore #: cms/templates/js/metadata-string-entry.underscore -#: cms/templates/js/video/metadata-translations-entry.underscore msgid "Clear" msgstr "" @@ -4903,6 +4903,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -6171,10 +6175,6 @@ msgstr "" msgid "Error: Connection with server failed." msgstr "" -#: cms/static/js/views/video/transcripts/metadata_videolist.js -msgid "No sources" -msgstr "" - #: cms/static/js/views/video/transcripts/metadata_videolist.js msgid "Link types should be unique." msgstr "" @@ -6193,6 +6193,21 @@ msgid "" "check the format and try again." msgstr "" +#: cms/static/js/views/video/translations_editor.js +#: cms/static/js/views/video_transcripts.js +msgid "Are you sure you want to remove this transcript?" +msgstr "" + +#: cms/static/js/views/video/translations_editor.js +msgid "" +"If you remove this transcript, the transcript will not be available for this" +" component." +msgstr "" + +#: cms/static/js/views/video/translations_editor.js +msgid "Remove Transcript" +msgstr "" + #: cms/static/js/views/video/translations_editor.js msgid "Upload translation" msgstr "" @@ -6318,10 +6333,6 @@ msgstr "" msgid "{transcriptClientTitle}_{transcriptLanguageCode}.{fileExtension}" msgstr "" -#: cms/static/js/views/video_transcripts.js -msgid "Are you sure you want to remove this transcript?" -msgstr "" - #: cms/static/js/views/video_transcripts.js msgid "" "If you remove this transcript, the transcript will not be available for any " @@ -9462,7 +9473,6 @@ msgstr "" #: cms/templates/js/metadata-number-entry.underscore #: cms/templates/js/metadata-option-entry.underscore #: cms/templates/js/metadata-string-entry.underscore -#: cms/templates/js/video/metadata-translations-entry.underscore msgid "Clear Value" msgstr "" diff --git a/conf/locale/eo/LC_MESSAGES/django.mo b/conf/locale/eo/LC_MESSAGES/django.mo index f1b21c9638..61a1197f69 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 cd57d98a53..ff64b1b4e6 100644 --- a/conf/locale/eo/LC_MESSAGES/django.po +++ b/conf/locale/eo/LC_MESSAGES/django.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-29 20:36+0000\n" -"PO-Revision-Date: 2018-04-29 20:36:21.101798\n" +"POT-Creation-Date: 2018-05-13 20:37+0000\n" +"PO-Revision-Date: 2018-05-13 20:37:05.585963\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -93,6 +93,38 @@ msgstr "Ûnït Ⱡ'σяєм ι#" msgid "Empty" msgstr "Émptý Ⱡ'σяєм ιρѕ#" +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +#, python-brace-format +msgid "The following parameters are required: {missing}." +msgstr "" +"Thé föllöwïng pärämétérs äré réqüïréd: {missing}. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " +"αмєт, ¢σηѕє¢тєтυя #" + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +#, python-brace-format +msgid "A transcript with the \"{language_code}\" language code already exists." +msgstr "" +"À tränsçrïpt wïth thé \"{language_code}\" längüägé çödé älréädý éxïsts. " +"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +msgid "A transcript file is required." +msgstr "À tränsçrïpt fïlé ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +msgid "" +"There is a problem with this transcript file. Try to upload a different " +"file." +msgstr "" +"Théré ïs ä prößlém wïth thïs tränsçrïpt fïlé. Trý tö üplöäd ä dïfférént " +"fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#" + #: cms/djangoapps/contentstore/views/videos.py #: lms/djangoapps/class_dashboard/dashboard_data.py #: lms/djangoapps/instructor/views/api.py lms/templates/help_modal.html @@ -856,6 +888,7 @@ msgstr "" " ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #" #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -902,7 +935,9 @@ msgstr "" "Töö mäný fäïléd lögïn ättémpts. Trý ägäïn lätér. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " "αмєт, ¢σηѕє¢тєтυя α#" -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "Émäïl ör pässwörd ïs ïnçörréçt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" @@ -917,6 +952,15 @@ msgid "Unable to send reactivation email" msgstr "" "Ûnäßlé tö sénd réäçtïvätïön émäïl Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тє#" +#: common/djangoapps/student/views/login.py +msgid "Superuser creation not allowed" +msgstr "Süpérüsér çréätïön nöt ällöwéd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" + +#: common/djangoapps/student/views/login.py +msgid "Account modification not allowed." +msgstr "" +"Àççöünt mödïfïçätïön nöt ällöwéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тє#" + #: common/djangoapps/student/views/login.py #: common/djangoapps/student/views/management.py #: openedx/core/djangoapps/user_api/accounts/api.py @@ -5386,10 +5430,8 @@ msgstr "" " ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #" #: common/lib/xmodule/xmodule/video_module/video_handlers.py -msgid "Invalid encoding type, transcripts should be UTF-8 encoded." -msgstr "" -"Ìnvälïd énçödïng týpé, tränsçrïpts shöüld ßé ÛTF-8 énçödéd. Ⱡ'σяєм ιρѕυм " -"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" +msgid "Language is required." +msgstr "Längüägé ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #" #: common/lib/xmodule/xmodule/video_module/video_module.py msgid "Basic" @@ -7812,6 +7854,18 @@ msgstr "" "Säïlthrü sénd témpläté tö üsé ön énröllïng för äüdït. Ⱡ'σяєм ιρѕυм ∂σłσя " "ѕιт αмєт, ¢σηѕє¢тєтυя α#" +#: lms/djangoapps/email_marketing/models.py +msgid "Sailthru send template to use on passed ID verification." +msgstr "" +"Säïlthrü sénd témpläté tö üsé ön pässéd ÌD vérïfïçätïön. Ⱡ'σяєм ιρѕυм ∂σłσя " +"ѕιт αмєт, ¢σηѕє¢тєтυя α#" + +#: lms/djangoapps/email_marketing/models.py +msgid "Sailthru send template to use on failed ID verification." +msgstr "" +"Säïlthrü sénd témpläté tö üsé ön fäïléd ÌD vérïfïçätïön. Ⱡ'σяєм ιρѕυм ∂σłσя " +"ѕιт αмєт, ¢σηѕє¢тєтυя α#" + #: lms/djangoapps/email_marketing/models.py msgid "Sailthru send template to use on upgrading a course. Deprecated " msgstr "" @@ -10968,15 +11022,6 @@ msgstr "" "Ýöür {platform_name} vérïfïçätïön häs éxpïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "¢σηѕє¢тєт#" -#: lms/djangoapps/verify_student/utils.py -#, python-brace-format -msgid "" -"Could not send verification status email having subject: {subject} and email" -" of user: {email}" -msgstr "" -"Çöüld nöt sénd vérïfïçätïön stätüs émäïl hävïng süßjéçt: {subject} änd émäïl" -" öf üsér: {email} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" - #: lms/djangoapps/verify_student/views.py msgid "Intro" msgstr "Ìntrö Ⱡ'σяєм ιρѕ#" @@ -12535,6 +12580,43 @@ msgstr "" " Pléäsé trý löggïng ïn ägäïn. (Ýöü mäý nééd tö réstärt ýöür ßröwsér.)\n" " Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒ#" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "Pässwörd Pölïçý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" +"{platform_name} nöw réqüïrés möré çömpléx pässwörds. Ýöür çürrént pässwörd " +"döés nöt méét thé néw réqüïréménts. Çhängé ýöür pässwörd nöw tö çöntïnüé " +"üsïng thé sïté. Thänk ýöü för hélpïng üs kéép ýöür dätä säfé. Ⱡ'σяєм ιρѕυм " +"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя " +"ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ " +"ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ " +"¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє " +"¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι#" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" +"{platform_name} nöw réqüïrés möré çömpléx pässwörds. Ýöür çürrént pässwörd " +"döés nöt méét thé néw réqüïréménts. Ýöü müst çhängé ýöür pässwörd ßý " +"{deadline} tö ßé äßlé tö çöntïnüé üsïng thé sïté. Thänk ýöü för hélpïng üs " +"kéép ýöür dätä säfé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg " +"єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт " +"єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт " +"αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη " +"νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ρ#" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." @@ -14053,31 +14135,29 @@ msgstr "" "Thé ïnförmätïön ýöü éntéréd ïs ïnçörréçt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "¢σηѕє¢тєтυя #" -#: cms/djangoapps/contentstore/views/transcript_settings.py -#, python-brace-format -msgid "The following parameters are required: {missing}." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Transcripts are supported only for \"video\" modules." msgstr "" -"Thé föllöwïng pärämétérs äré réqüïréd: {missing}. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " -"αмєт, ¢σηѕє¢тєтυя #" +"Tränsçrïpts äré süppörtéd önlý för \"vïdéö\" mödülés. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт" +" αмєт, ¢σηѕє¢тєтυя α#" -#: cms/djangoapps/contentstore/views/transcript_settings.py -#, python-brace-format -msgid "A transcript with the \"{language_code}\" language code already exists." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Cannot find item by locator." +msgstr "Çännöt fïnd ïtém ßý löçätör. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Video locator is required." +msgstr "Vïdéö löçätör ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "This transcript file type is not supported." msgstr "" -"À tränsçrïpt wïth thé \"{language_code}\" längüägé çödé älréädý éxïsts. " -"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" +"Thïs tränsçrïpt fïlé týpé ïs nöt süppörtéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " +"¢σηѕє¢тєтυя #" -#: cms/djangoapps/contentstore/views/transcript_settings.py -msgid "A transcript file is required." -msgstr "À tränsçrïpt fïlé ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" - -#: cms/djangoapps/contentstore/views/transcript_settings.py -msgid "" -"There is a problem with this transcript file. Try to upload a different " -"file." -msgstr "" -"Théré ïs ä prößlém wïth thïs tränsçrïpt fïlé. Trý tö üplöäd ä dïfférént " -"fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#" +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Video ID is required." +msgstr "Vïdéö ÌD ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #" #: cms/djangoapps/contentstore/views/transcripts_ajax.py msgid "Incoming video data is empty." @@ -14088,10 +14168,32 @@ msgid "Can't find item by locator." msgstr "Çän't fïnd ïtém ßý löçätör. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє#" #: cms/djangoapps/contentstore/views/transcripts_ajax.py -msgid "Transcripts are supported only for \"video\" modules." +msgid "No such transcript." +msgstr "Nö süçh tränsçrïpt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "There is a problem with the chosen transcript file." msgstr "" -"Tränsçrïpts äré süppörtéd önlý för \"vïdéö\" mödülés. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт" -" αмєт, ¢σηѕє¢тєтυя α#" +"Théré ïs ä prößlém wïth thé çhösén tränsçrïpt fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " +"αмєт, ¢σηѕє¢тєтυя α#" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "" +"There is a problem with the existing transcript file. Please upload a " +"different file." +msgstr "" +"Théré ïs ä prößlém wïth thé éxïstïng tränsçrïpt fïlé. Pléäsé üplöäd ä " +"dïfférént fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "YouTube ID is required." +msgstr "ÝöüTüßé ÌD ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σ#" + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "There is a problem with the YouTube transcript file." +msgstr "" +"Théré ïs ä prößlém wïth thé ÝöüTüßé tränsçrïpt fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " +"αмєт, ¢σηѕє¢тєтυя α#" #: cms/djangoapps/contentstore/views/user.py msgid "Insufficient permissions" @@ -20131,37 +20233,6 @@ msgid "You have been enrolled in {course_name}" msgstr "" "Ýöü hävé ßéén énrölléd ïn {course_name} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#" -#: lms/templates/emails/failed_verification_email.txt -msgid "" -"Sorry! The photos you submitted for ID verification were not accepted, for " -"the following reason(s):" -msgstr "" -"Sörrý! Thé phötös ýöü süßmïttéd för ÌD vérïfïçätïön wéré nöt äççéptéd, för " -"thé föllöwïng réäsön(s): Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт#" - -#: lms/templates/emails/failed_verification_email.txt -msgid "The photo(s) of you: {reason}" -msgstr "Thé phötö(s) öf ýöü: {reason} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢ση#" - -#: lms/templates/emails/failed_verification_email.txt -msgid "Resubmit Verification: {reverify_url}" -msgstr "" -"Résüßmït Vérïfïçätïön: {reverify_url} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" - -#: lms/templates/emails/failed_verification_email.txt -#: lms/templates/emails/order_confirmation_email.txt -#: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/successfull_verification_email.txt -msgid "Thank you," -msgstr "Thänk ýöü, Ⱡ'σяєм ιρѕυм ∂σłσ#" - -#: lms/templates/emails/failed_verification_email.txt -#: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/reverification_processed.txt -#: lms/templates/emails/successfull_verification_email.txt -msgid "The {platform_name} team" -msgstr "Thé {platform_name} téäm Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#" - #: lms/templates/emails/order_confirmation_email.txt msgid "" "Your payment was successful. You will see the charge below on your next " @@ -20170,13 +20241,17 @@ msgstr "" "Ýöür päýmént wäs süççéssfül. Ýöü wïll séé thé çhärgé ßélöw ön ýöür néxt " "çrédït ör déßït çärd stätémént ündér thé çömpäný nämé {merchant_name}. Ⱡ'#" +#: lms/templates/emails/order_confirmation_email.txt +#: lms/templates/emails/photo_submission_confirmation.txt +msgid "Thank you," +msgstr "Thänk ýöü, Ⱡ'σяєм ιρѕυм ∂σłσ#" + #: lms/templates/emails/order_confirmation_email.txt msgid "Your order number is: {order_number}" msgstr "" "Ýöür ördér nümßér ïs: {order_number} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" #: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/successfull_verification_email.txt msgid "Hi {full_name}," msgstr "Hï {full_name}, Ⱡ'σяєм ιρѕυм #" @@ -20201,6 +20276,11 @@ msgstr "" "υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє " "∂σłσя ιη яєρяєнєη∂єяιт ι#" +#: lms/templates/emails/photo_submission_confirmation.txt +#: lms/templates/emails/reverification_processed.txt +msgid "The {platform_name} team" +msgstr "Thé {platform_name} téäm Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#" + #: lms/templates/emails/registration_codes_sale_email.txt msgid "Thank you for purchasing enrollments in {course_name}." msgstr "" @@ -20476,19 +20556,6 @@ msgstr "" msgid "Thanks," msgstr "Thänks, Ⱡ'σяєм ιρѕυм #" -#: lms/templates/emails/successfull_verification_email.txt -msgid "Congratulations! Your ID verification process was successful." -msgstr "" -"Çöngrätülätïöns! Ýöür ÌD vérïfïçätïön pröçéss wäs süççéssfül. Ⱡ'σяєм ιρѕυм " -"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" - -#: lms/templates/emails/successfull_verification_email.txt -msgid "" -"Your verification is effective for one year. It will expire on {expiry_date}" -msgstr "" -"Ýöür vérïfïçätïön ïs éfféçtïvé för öné ýéär. Ìt wïll éxpïré ön {expiry_date}" -" Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #" - #: lms/templates/emails/unenroll_email_allowedmessage.txt msgid "Dear Student," msgstr "Déär Stüdént, Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#" @@ -24294,6 +24361,10 @@ msgstr "" msgid "Explore New Courses" msgstr "Éxplöré Néw Çöürsés Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#" +#: openedx/features/learner_profile/templates/learner_profile/learner_profile.html +msgid "View My Records" +msgstr "Vïéw Mý Réçörds Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#" + #: openedx/features/learner_profile/templates/learner_profile/learner_profile.html msgid "My Profile" msgstr "Mý Pröfïlé Ⱡ'σяєм ιρѕυм ∂σłσ#" diff --git a/conf/locale/eo/LC_MESSAGES/djangojs.mo b/conf/locale/eo/LC_MESSAGES/djangojs.mo index 8db0c950ac..2a9b368210 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 b8154b323f..3de20b7bd7 100644 --- a/conf/locale/eo/LC_MESSAGES/djangojs.po +++ b/conf/locale/eo/LC_MESSAGES/djangojs.po @@ -26,8 +26,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-29 20:36+0000\n" -"PO-Revision-Date: 2018-04-29 20:36:21.128556\n" +"POT-Creation-Date: 2018-05-13 20:36+0000\n" +"PO-Revision-Date: 2018-05-13 20:37:05.556935\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -237,6 +237,7 @@ msgid "Advanced" msgstr "Àdvänçéd Ⱡ'σяєм ιρѕυм ∂#" #: cms/static/js/views/previous_video_upload.js +#: cms/static/js/views/video/translations_editor.js #: cms/static/js/views/video_transcripts.js lms/static/js/views/image_field.js msgid "Removing" msgstr "Rémövïng Ⱡ'σяєм ιρѕυм ∂#" @@ -2681,7 +2682,6 @@ msgstr "Ànnötätïön Téxt Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#" #: cms/templates/js/metadata-number-entry.underscore #: cms/templates/js/metadata-option-entry.underscore #: cms/templates/js/metadata-string-entry.underscore -#: cms/templates/js/video/metadata-translations-entry.underscore msgid "Clear" msgstr "Çléär Ⱡ'σяєм ιρѕ#" @@ -5800,6 +5800,12 @@ msgstr "Övéräll Sçöré Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#" msgid "Bookmark this page" msgstr "Böökmärk thïs pägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт#" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" +"Thänk ýöü för séttïng ýöür çöürsé göäl tö {goal}! Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " +"αмєт, ¢σηѕє¢тєтυя α#" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -7375,10 +7381,6 @@ msgstr "" "Érrör: Çönnéçtïön wïth sérvér fäïléd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "¢σηѕє¢тєтυ#" -#: cms/static/js/views/video/transcripts/metadata_videolist.js -msgid "No sources" -msgstr "Nö söürçés Ⱡ'σяєм ιρѕυм ∂σłσ#" - #: cms/static/js/views/video/transcripts/metadata_videolist.js msgid "Link types should be unique." msgstr "Lïnk týpés shöüld ßé ünïqüé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#" @@ -7399,6 +7401,25 @@ msgstr "" "Sörrý, théré wäs än érrör pärsïng thé süßtïtlés thät ýöü üplöädéd. Pléäsé " "çhéçk thé förmät änd trý ägäïn. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт #" +#: cms/static/js/views/video/translations_editor.js +#: cms/static/js/views/video_transcripts.js +msgid "Are you sure you want to remove this transcript?" +msgstr "" +"Àré ýöü süré ýöü wänt tö rémövé thïs tränsçrïpt? Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " +"αмєт, ¢σηѕє¢тєтυя α#" + +#: cms/static/js/views/video/translations_editor.js +msgid "" +"If you remove this transcript, the transcript will not be available for this" +" component." +msgstr "" +"Ìf ýöü rémövé thïs tränsçrïpt, thé tränsçrïpt wïll nöt ßé äväïläßlé för thïs" +" çömpönént. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє#" + +#: cms/static/js/views/video/translations_editor.js +msgid "Remove Transcript" +msgstr "Rémövé Tränsçrïpt Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#" + #: cms/static/js/views/video/translations_editor.js msgid "Upload translation" msgstr "Ûplöäd tränslätïön Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт#" @@ -7541,12 +7562,6 @@ msgstr "" "{transcriptClientTitle}_{transcriptLanguageCode}.{fileExtension} Ⱡ'σяєм " "ιρѕυм ∂σłσя #" -#: cms/static/js/views/video_transcripts.js -msgid "Are you sure you want to remove this transcript?" -msgstr "" -"Àré ýöü süré ýöü wänt tö rémövé thïs tränsçrïpt? Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " -"αмєт, ¢σηѕє¢тєтυя α#" - #: cms/static/js/views/video_transcripts.js msgid "" "If you remove this transcript, the transcript will not be available for any " @@ -11239,7 +11254,6 @@ msgstr "Néw %(item_type)s Ⱡ'σяєм ιρѕυм #" #: cms/templates/js/metadata-number-entry.underscore #: cms/templates/js/metadata-option-entry.underscore #: cms/templates/js/metadata-string-entry.underscore -#: cms/templates/js/video/metadata-translations-entry.underscore msgid "Clear Value" msgstr "Çléär Välüé Ⱡ'σяєм ιρѕυм ∂σłσя #" diff --git a/conf/locale/es_419/LC_MESSAGES/django.mo b/conf/locale/es_419/LC_MESSAGES/django.mo index 54ad2aa7a7..126962b0b3 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 4d6bebda84..b544773151 100644 --- a/conf/locale/es_419/LC_MESSAGES/django.po +++ b/conf/locale/es_419/LC_MESSAGES/django.po @@ -218,7 +218,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-23 23:51+0000\n" "Last-Translator: Leonardo J. Caballero G. \n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/open-edx/edx-platform/language/es_419/)\n" @@ -950,6 +950,7 @@ msgstr "" "escríbanos al correo electrónico." #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -986,7 +987,9 @@ msgstr "" "Demasiados intentos fallidos de inicio de sesión. Inténtelo de nuevo más " "tarde." -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "Correo electrónico o contraseña incorrectos." @@ -1143,6 +1146,10 @@ msgstr "Eliminar configuración seleccionada(s)" msgid "Delete the selected configuration" msgstr "Eliminar la configuración seleccionada" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "La autenticación con {} no está disponible en el momento." @@ -10130,18 +10137,13 @@ msgstr "Bienvenido/a a {platform_name}." #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" -"{start_bold}{enterprise_name}{end_bold} ha colaborado con " -"{start_bold}{platform_name}{end_bold} para ofrecerle programas de " -"aprendizaje siempre disponibles y de alta calidad para ayudarlo a avanzar en" -" conocimiento y carrera profesional. {line_break}Por favor continúe con el " -"registro, o inicie sesión si ya es un usuario registrado, y seleccione " -"continuar para comenzar a aprender." #: lms/templates/emails/password_reset_subject.txt #, python-format @@ -11004,6 +11006,10 @@ msgstr "" msgid "A cohort with the same name already exists." msgstr "Ya existe una cohorte con ese nombre." +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "URL del servicio interno" @@ -11276,6 +11282,27 @@ msgstr "" "El servidor de identidad de su universidad no nos regresó su información de identificación.\n" "Por favor, intente acceder nuevamente. (Es posible que tenga que reiniciar su navegador.)" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." @@ -11395,9 +11422,9 @@ msgid "" " spend time with the course each week. Your focused attention will pay off " "in the end!" msgstr "" -"Con los cursos que son de ritmo propio, aprendes según tu propio horario. Te" -" animamos a pasar tiempo en el curso cada semana. ¡Tu atención especial " -"valdrá la pena al final!" +"En los cursos \"a tu ritmo\" aprendes según tu propio horario. Te animamos a" +" dedicar tiempo al curso cada semana. ¡Tu esfuerzo semanal valdrá la pena al" +" final!" #: openedx/core/djangoapps/schedules/templates/schedules/edx_ace/courseupdate/email/body.html msgid "Resume your course now" @@ -24422,8 +24449,8 @@ msgstr "Dirección de correo electrónico del usuario" #: cms/templates/manage_users.html msgid "Provide the email address of the user you want to add as Staff" msgstr "" -"Ingrese el correo electrónico del usuario al cual quiere agregar como " -"Funcionario del curso" +"Ingrese el correo electrónico del usuario al cual quiere agregar como parte " +"del equipo de administración del curso." #: cms/templates/manage_users.html cms/templates/manage_users_lib.html msgid "Add User" diff --git a/conf/locale/es_419/LC_MESSAGES/djangojs.mo b/conf/locale/es_419/LC_MESSAGES/djangojs.mo index 32d107cdbd..92ecb4beff 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 5bf5a98bcb..fe306b6e7a 100644 --- a/conf/locale/es_419/LC_MESSAGES/djangojs.po +++ b/conf/locale/es_419/LC_MESSAGES/djangojs.po @@ -140,7 +140,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: Juan Camilo Montoya Franco \n" "Language-Team: Spanish (Latin America) (http://www.transifex.com/open-edx/edx-platform/language/es_419/)\n" @@ -4975,6 +4975,10 @@ msgstr "Enlace" msgid "Enter your " msgstr "Ingrese su" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -5329,6 +5333,10 @@ msgstr "Puntaje general" msgid "Bookmark this page" msgstr "Marcar esta página" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "Ha actualizado exitosamente su objetivo." @@ -8385,6 +8393,10 @@ msgstr "Tu Certificado {program}" msgid "Open the certificate you earned for the %(title)s program." msgstr "Abrir el certificado que ganaste en el programa %(title)s." +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "¡Felicitaciones!" diff --git a/conf/locale/fr/LC_MESSAGES/django.mo b/conf/locale/fr/LC_MESSAGES/django.mo index 459efeac09..2f780529fc 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 f2151990d5..163cef21b2 100644 --- a/conf/locale/fr/LC_MESSAGES/django.po +++ b/conf/locale/fr/LC_MESSAGES/django.po @@ -265,7 +265,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-04-11 14:18+0000\n" "Last-Translator: Mireille Cabuay\n" "Language-Team: French (http://www.transifex.com/open-edx/edx-platform/language/fr/)\n" @@ -995,6 +995,7 @@ msgstr "" "un mail." #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -1027,7 +1028,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "Trop de tentatives de connexion échouées. Réessayez plus tard." -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "Email ou mot de passe incorrect." @@ -1176,6 +1179,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "L'authentification via {} est actuellement indisponible." @@ -9516,11 +9523,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -10347,6 +10355,10 @@ msgstr "" msgid "A cohort with the same name already exists." msgstr "Une cohorte avec le même nom existe déjà." +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "" @@ -10586,6 +10598,27 @@ msgstr "" "Votre serveur d'identité universitaire ne nous a pas retourné vos informations d'identification.\n" "S'il vous plaît essayez de vous connecter à nouveau. (Vous devrez peut-être redémarrer votre navigateur.) " +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/fr/LC_MESSAGES/djangojs.mo b/conf/locale/fr/LC_MESSAGES/djangojs.mo index 3b3adefe89..06826fde90 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 f764f5f170..579bacbbb2 100644 --- a/conf/locale/fr/LC_MESSAGES/djangojs.po +++ b/conf/locale/fr/LC_MESSAGES/djangojs.po @@ -172,7 +172,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: moocit-france \n" "Language-Team: French (http://www.transifex.com/open-edx/edx-platform/language/fr/)\n" @@ -4849,6 +4849,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -5198,6 +5202,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -8139,6 +8147,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/he/LC_MESSAGES/django.mo b/conf/locale/he/LC_MESSAGES/django.mo index 58e43c17e0..b5faa03bc1 100644 Binary files a/conf/locale/he/LC_MESSAGES/django.mo and b/conf/locale/he/LC_MESSAGES/django.mo differ diff --git a/conf/locale/he/LC_MESSAGES/django.po b/conf/locale/he/LC_MESSAGES/django.po index 8cd05d7397..d02e8a3bd8 100644 --- a/conf/locale/he/LC_MESSAGES/django.po +++ b/conf/locale/he/LC_MESSAGES/django.po @@ -80,13 +80,14 @@ # Nadav Stark , 2015 # Ned Batchelder , 2016 # qualityalltext , 2016 +# Yaron Shahrabani , 2018 msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" -"PO-Revision-Date: 2018-03-13 13:51+0000\n" -"Last-Translator: Nadav Stark \n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" +"PO-Revision-Date: 2018-05-02 07:51+0000\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew (http://www.transifex.com/open-edx/edx-platform/language/he/)\n" "Language: he\n" "MIME-Version: 1.0\n" @@ -795,6 +796,7 @@ msgstr "" "אירעה שגיאה בזמן קבלת מידע התחברות. אנא צרו איתנו קשר באמצעות דואר אלקטרוני." #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -827,7 +829,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "מספר נסיונות חיבור רב מדי. אנא נסה מאוחר יותר." -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "דואר אלקטרוני או סיסמה שגויים." @@ -978,6 +982,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "אימות באמצעות {} אינו זמין כרגע." @@ -9435,11 +9443,12 @@ msgstr "ברוכ/ה הבא/ה ל {platform_name}." #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -10269,6 +10278,10 @@ msgstr "חייבת להיות קבוצת לימוד אחת שאליה ניתן msgid "A cohort with the same name already exists." msgstr "קבוצת לימוד בעלת אותו שם כבר קיימת." +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "כתובת URL לשירות פנימי" @@ -10527,6 +10540,27 @@ msgstr "" "שרת מזהה האוניברסיטה לא החזיר את פרטי המזהה שלך אלינו.\n" "נסה להתחבר שוב. (ייתכן שתצטרך להפעיל מחדש את הדפדפן שלך)." +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/he/LC_MESSAGES/djangojs.mo b/conf/locale/he/LC_MESSAGES/djangojs.mo index 38c8127d48..f9de4a10dd 100644 Binary files a/conf/locale/he/LC_MESSAGES/djangojs.mo and b/conf/locale/he/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/he/LC_MESSAGES/djangojs.po b/conf/locale/he/LC_MESSAGES/djangojs.po index 527357bd0f..561d38d7f8 100644 --- a/conf/locale/he/LC_MESSAGES/djangojs.po +++ b/conf/locale/he/LC_MESSAGES/djangojs.po @@ -66,7 +66,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: e2f_HE c1 \n" "Language-Team: Hebrew (http://www.transifex.com/open-edx/edx-platform/language/he/)\n" @@ -4679,6 +4679,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -5015,6 +5019,10 @@ msgstr "ניקוד כללי" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -7958,6 +7966,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/hi/LC_MESSAGES/django.mo b/conf/locale/hi/LC_MESSAGES/django.mo index d0c2d2e47d..b4ad17dee5 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 840515712a..401c547ae9 100644 --- a/conf/locale/hi/LC_MESSAGES/django.po +++ b/conf/locale/hi/LC_MESSAGES/django.po @@ -71,7 +71,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:51+0000\n" "Last-Translator: ria1234 \n" "Language-Team: Hindi (http://www.transifex.com/open-edx/edx-platform/language/hi/)\n" @@ -745,6 +745,7 @@ msgid "There was an error receiving your login information. Please email us." msgstr "" #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -916,6 +917,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "" @@ -8691,11 +8696,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -9519,6 +9525,10 @@ msgstr "" msgid "A cohort with the same name already exists." msgstr "" +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "" @@ -9750,6 +9760,27 @@ msgid "" " " msgstr "" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/hi/LC_MESSAGES/djangojs.mo b/conf/locale/hi/LC_MESSAGES/djangojs.mo index 851561ca67..60f4beceb2 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 9d9a7e0b7c..f402d76ca2 100644 --- a/conf/locale/hi/LC_MESSAGES/djangojs.po +++ b/conf/locale/hi/LC_MESSAGES/djangojs.po @@ -48,7 +48,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: edx_transifex_bot \n" "Language-Team: Hindi (http://www.transifex.com/open-edx/edx-platform/language/hi/)\n" @@ -4556,6 +4556,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -4884,6 +4888,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -7745,6 +7753,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/ko_KR/LC_MESSAGES/django.mo b/conf/locale/ko_KR/LC_MESSAGES/django.mo index 46a4ee8292..4a2b773ec7 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 6c0170ca60..386eeacf17 100644 --- a/conf/locale/ko_KR/LC_MESSAGES/django.po +++ b/conf/locale/ko_KR/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: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:51+0000\n" "Last-Translator: kmooc \n" "Language-Team: Korean (Korea) (http://www.transifex.com/open-edx/edx-platform/language/ko_KR/)\n" @@ -736,6 +736,7 @@ msgid "There was an error receiving your login information. Please email us." msgstr "" #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -907,6 +908,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "" @@ -8628,11 +8633,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -9436,6 +9442,10 @@ msgstr "" msgid "A cohort with the same name already exists." msgstr "" +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "" @@ -9667,6 +9677,27 @@ msgid "" " " msgstr "" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo b/conf/locale/ko_KR/LC_MESSAGES/djangojs.mo index b55494ea8b..5c4845aa0c 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 fb3a530ae5..cc25589d4e 100644 --- a/conf/locale/ko_KR/LC_MESSAGES/djangojs.po +++ b/conf/locale/ko_KR/LC_MESSAGES/djangojs.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: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: kmooc \n" "Language-Team: Korean (Korea) (http://www.transifex.com/open-edx/edx-platform/language/ko_KR/)\n" @@ -4515,6 +4515,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -4839,6 +4843,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -7679,6 +7687,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/pt_BR/LC_MESSAGES/django.mo b/conf/locale/pt_BR/LC_MESSAGES/django.mo index bec622ff18..38eaa01dc5 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 ce532c04d2..c13e5b1126 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/django.po +++ b/conf/locale/pt_BR/LC_MESSAGES/django.po @@ -267,7 +267,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:51+0000\n" "Last-Translator: javiercencig \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/open-edx/edx-platform/language/pt_BR/)\n" @@ -978,6 +978,7 @@ msgstr "" "envie-nos um e-mail." #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -1008,7 +1009,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "Muitas tentativas de acesso sem sucesso. Tente novamente mais tarde." -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "Endereço de e-mail ou senha incorretos." @@ -1157,6 +1160,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "A autenticação com {} não está disponível no momento." @@ -9827,11 +9834,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -10655,6 +10663,10 @@ msgstr "" msgid "A cohort with the same name already exists." msgstr "Um grupo com o mesmo nome já existe." +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "URL de Serviço Interno" @@ -10923,6 +10935,27 @@ msgid "" " " msgstr "" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo b/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo index fc6a8e502a..e7b0a6709d 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 eaa4b687be..415e6545c4 100644 --- a/conf/locale/pt_BR/LC_MESSAGES/djangojs.po +++ b/conf/locale/pt_BR/LC_MESSAGES/djangojs.po @@ -202,7 +202,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: Mariana Jó de Souza \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/open-edx/edx-platform/language/pt_BR/)\n" @@ -4783,6 +4783,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -5121,6 +5125,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -8059,6 +8067,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/rtl/LC_MESSAGES/django.mo b/conf/locale/rtl/LC_MESSAGES/django.mo index 1c23a16c09..17b536eaee 100644 Binary files a/conf/locale/rtl/LC_MESSAGES/django.mo and b/conf/locale/rtl/LC_MESSAGES/django.mo differ diff --git a/conf/locale/rtl/LC_MESSAGES/django.po b/conf/locale/rtl/LC_MESSAGES/django.po index c0b9ec1f71..32ec298724 100644 --- a/conf/locale/rtl/LC_MESSAGES/django.po +++ b/conf/locale/rtl/LC_MESSAGES/django.po @@ -32,8 +32,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-29 20:36+0000\n" -"PO-Revision-Date: 2018-04-29 20:36:21.101798\n" +"POT-Creation-Date: 2018-05-13 20:37+0000\n" +"PO-Revision-Date: 2018-05-13 20:37:05.585963\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -93,6 +93,34 @@ msgstr "عرهف" msgid "Empty" msgstr "ثوحفغ" +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +#, python-brace-format +msgid "The following parameters are required: {missing}." +msgstr "فاث بخممخصهرل حشقشوثفثقس شقث قثضعهقثي: {missing}." + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +#, python-brace-format +msgid "A transcript with the \"{language_code}\" language code already exists." +msgstr "ش فقشرسذقهحف صهفا فاث \"{language_code}\" مشرلعشلث ذخيث شمقثشيغ ثطهسفس." + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +msgid "A transcript file is required." +msgstr "ش فقشرسذقهحف بهمث هس قثضعهقثي." + +#: cms/djangoapps/contentstore/views/transcript_settings.py +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +#: common/lib/xmodule/xmodule/video_module/video_handlers.py +msgid "" +"There is a problem with this transcript file. Try to upload a different " +"file." +msgstr "" +"فاثقث هس ش حقخزمثو صهفا فاهس فقشرسذقهحف بهمث. فقغ فخ عحمخشي ش يهببثقثرف " +"بهمث." + #: cms/djangoapps/contentstore/views/videos.py #: lms/djangoapps/class_dashboard/dashboard_data.py #: lms/djangoapps/instructor/views/api.py lms/templates/help_modal.html @@ -757,6 +785,7 @@ msgid "There was an error receiving your login information. Please email us." msgstr "فاثقث صشس شر ثققخق قثذثهدهرل غخعق مخلهر هربخقوشفهخر. حمثشسث ثوشهم عس." #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -791,7 +820,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "فخخ وشرغ بشهمثي مخلهر شففثوحفس. فقغ شلشهر مشفثق." -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "ثوشهم خق حشسسصخقي هس هرذخققثذف." @@ -803,6 +834,14 @@ msgstr "رخ هرشذفهدث عسثق صهفا فاهس ث-وشهم ثطهسف msgid "Unable to send reactivation email" msgstr "عرشزمث فخ سثري قثشذفهدشفهخر ثوشهم" +#: common/djangoapps/student/views/login.py +msgid "Superuser creation not allowed" +msgstr "سعحثقعسثق ذقثشفهخر رخف شممخصثي" + +#: common/djangoapps/student/views/login.py +msgid "Account modification not allowed." +msgstr "شذذخعرف وخيهبهذشفهخر رخف شممخصثي." + #: common/djangoapps/student/views/login.py #: common/djangoapps/student/views/management.py #: openedx/core/djangoapps/user_api/accounts/api.py @@ -4640,8 +4679,8 @@ msgid "{exception_message}: Can't find uploaded transcripts: {user_filename}" msgstr "{exception_message}: ذشر'ف بهري عحمخشيثي فقشرسذقهحفس: {user_filename}" #: common/lib/xmodule/xmodule/video_module/video_handlers.py -msgid "Invalid encoding type, transcripts should be UTF-8 encoded." -msgstr "هردشمهي ثرذخيهرل فغحث, فقشرسذقهحفس ساخعمي زث عفب-8 ثرذخيثي." +msgid "Language is required." +msgstr "مشرلعشلث هس قثضعهقثي." #: common/lib/xmodule/xmodule/video_module/video_module.py msgid "Basic" @@ -6716,6 +6755,14 @@ msgstr "" msgid "Sailthru send template to use on enrolling for audit. " msgstr "سشهمفاقع سثري فثوحمشفث فخ عسث خر ثرقخممهرل بخق شعيهف. " +#: lms/djangoapps/email_marketing/models.py +msgid "Sailthru send template to use on passed ID verification." +msgstr "سشهمفاقع سثري فثوحمشفث فخ عسث خر حشسسثي هي دثقهبهذشفهخر." + +#: lms/djangoapps/email_marketing/models.py +msgid "Sailthru send template to use on failed ID verification." +msgstr "سشهمفاقع سثري فثوحمشفث فخ عسث خر بشهمثي هي دثقهبهذشفهخر." + #: lms/djangoapps/email_marketing/models.py msgid "Sailthru send template to use on upgrading a course. Deprecated " msgstr "سشهمفاقع سثري فثوحمشفث فخ عسث خر عحلقشيهرل ش ذخعقسث. يثحقثذشفثي " @@ -9501,15 +9548,6 @@ msgstr "" msgid "Your {platform_name} verification has expired." msgstr "غخعق {platform_name} دثقهبهذشفهخر اشس ثطحهقثي." -#: lms/djangoapps/verify_student/utils.py -#, python-brace-format -msgid "" -"Could not send verification status email having subject: {subject} and email" -" of user: {email}" -msgstr "" -"ذخعمي رخف سثري دثقهبهذشفهخر سفشفعس ثوشهم اشدهرل سعزتثذف: {subject} شري ثوشهم" -" خب عسثق: {email}" - #: lms/djangoapps/verify_student/views.py msgid "Intro" msgstr "هرفقخ" @@ -10891,6 +10929,34 @@ msgstr "" " حمثشسث فقغ مخللهرل هر شلشهر. (غخع وشغ رثثي فخ قثسفشقف غخعق زقخصسثق.)\n" " " +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "حشسسصخقي حخمهذغ" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" +"{platform_name} رخص قثضعهقثس وخقث ذخوحمثط حشسسصخقيس. غخعق ذعققثرف حشسسصخقي " +"يخثس رخف وثثف فاث رثص قثضعهقثوثرفس. ذاشرلث غخعق حشسسصخقي رخص فخ ذخرفهرعث " +"عسهرل فاث سهفث. فاشرن غخع بخق اثمحهرل عس نثثح غخعق يشفش سشبث." + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" +"{platform_name} رخص قثضعهقثس وخقث ذخوحمثط حشسسصخقيس. غخعق ذعققثرف حشسسصخقي " +"يخثس رخف وثثف فاث رثص قثضعهقثوثرفس. غخع وعسف ذاشرلث غخعق حشسسصخقي زغ " +"{deadline} فخ زث شزمث فخ ذخرفهرعث عسهرل فاث سهفث. فاشرن غخع بخق اثمحهرل عس " +"نثثح غخعق يشفش سشبث." + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." @@ -12186,27 +12252,25 @@ msgstr "شذذثسس قثسفقهذفثي فخ: {list_of_groups}" msgid "The information you entered is incorrect." msgstr "فاث هربخقوشفهخر غخع ثرفثقثي هس هرذخققثذف." -#: cms/djangoapps/contentstore/views/transcript_settings.py -#, python-brace-format -msgid "The following parameters are required: {missing}." -msgstr "فاث بخممخصهرل حشقشوثفثقس شقث قثضعهقثي: {missing}." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Transcripts are supported only for \"video\" modules." +msgstr "فقشرسذقهحفس شقث سعححخقفثي خرمغ بخق \"دهيثخ\" وخيعمثس." -#: cms/djangoapps/contentstore/views/transcript_settings.py -#, python-brace-format -msgid "A transcript with the \"{language_code}\" language code already exists." -msgstr "ش فقشرسذقهحف صهفا فاث \"{language_code}\" مشرلعشلث ذخيث شمقثشيغ ثطهسفس." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Cannot find item by locator." +msgstr "ذشررخف بهري هفثو زغ مخذشفخق." -#: cms/djangoapps/contentstore/views/transcript_settings.py -msgid "A transcript file is required." -msgstr "ش فقشرسذقهحف بهمث هس قثضعهقثي." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Video locator is required." +msgstr "دهيثخ مخذشفخق هس قثضعهقثي." -#: cms/djangoapps/contentstore/views/transcript_settings.py -msgid "" -"There is a problem with this transcript file. Try to upload a different " -"file." -msgstr "" -"فاثقث هس ش حقخزمثو صهفا فاهس فقشرسذقهحف بهمث. فقغ فخ عحمخشي ش يهببثقثرف " -"بهمث." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "This transcript file type is not supported." +msgstr "فاهس فقشرسذقهحف بهمث فغحث هس رخف سعححخقفثي." + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "Video ID is required." +msgstr "دهيثخ هي هس قثضعهقثي." #: cms/djangoapps/contentstore/views/transcripts_ajax.py msgid "Incoming video data is empty." @@ -12217,8 +12281,28 @@ msgid "Can't find item by locator." msgstr "ذشر'ف بهري هفثو زغ مخذشفخق." #: cms/djangoapps/contentstore/views/transcripts_ajax.py -msgid "Transcripts are supported only for \"video\" modules." -msgstr "فقشرسذقهحفس شقث سعححخقفثي خرمغ بخق \"دهيثخ\" وخيعمثس." +msgid "No such transcript." +msgstr "رخ سعذا فقشرسذقهحف." + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "There is a problem with the chosen transcript file." +msgstr "فاثقث هس ش حقخزمثو صهفا فاث ذاخسثر فقشرسذقهحف بهمث." + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "" +"There is a problem with the existing transcript file. Please upload a " +"different file." +msgstr "" +"فاثقث هس ش حقخزمثو صهفا فاث ثطهسفهرل فقشرسذقهحف بهمث. حمثشسث عحمخشي ش " +"يهببثقثرف بهمث." + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "YouTube ID is required." +msgstr "غخعفعزث هي هس قثضعهقثي." + +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "There is a problem with the YouTube transcript file." +msgstr "فاثقث هس ش حقخزمثو صهفا فاث غخعفعزث فقشرسذقهحف بهمث." #: cms/djangoapps/contentstore/views/user.py msgid "Insufficient permissions" @@ -17610,36 +17694,6 @@ msgstr "فاهس ثوشهم صشس شعفخوشفهذشممغ سثرف بقخو msgid "You have been enrolled in {course_name}" msgstr "غخع اشدث زثثر ثرقخممثي هر {course_name}" -#: lms/templates/emails/failed_verification_email.txt -msgid "" -"Sorry! The photos you submitted for ID verification were not accepted, for " -"the following reason(s):" -msgstr "" -"سخققغ! فاث حاخفخس غخع سعزوهففثي بخق هي دثقهبهذشفهخر صثقث رخف شذذثحفثي, بخق " -"فاث بخممخصهرل قثشسخر(س):" - -#: lms/templates/emails/failed_verification_email.txt -msgid "The photo(s) of you: {reason}" -msgstr "فاث حاخفخ(س) خب غخع: {reason}" - -#: lms/templates/emails/failed_verification_email.txt -msgid "Resubmit Verification: {reverify_url}" -msgstr "قثسعزوهف دثقهبهذشفهخر: {reverify_url}" - -#: lms/templates/emails/failed_verification_email.txt -#: lms/templates/emails/order_confirmation_email.txt -#: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/successfull_verification_email.txt -msgid "Thank you," -msgstr "فاشرن غخع," - -#: lms/templates/emails/failed_verification_email.txt -#: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/reverification_processed.txt -#: lms/templates/emails/successfull_verification_email.txt -msgid "The {platform_name} team" -msgstr "فاث {platform_name} فثشو" - #: lms/templates/emails/order_confirmation_email.txt msgid "" "Your payment was successful. You will see the charge below on your next " @@ -17648,12 +17702,16 @@ msgstr "" "غخعق حشغوثرف صشس سعذذثسسبعم. غخع صهمم سثث فاث ذاشقلث زثمخص خر غخعق رثطف " "ذقثيهف خق يثزهف ذشقي سفشفثوثرف عريثق فاث ذخوحشرغ رشوث {merchant_name}." +#: lms/templates/emails/order_confirmation_email.txt +#: lms/templates/emails/photo_submission_confirmation.txt +msgid "Thank you," +msgstr "فاشرن غخع," + #: lms/templates/emails/order_confirmation_email.txt msgid "Your order number is: {order_number}" msgstr "غخعق خقيثق رعوزثق هس: {order_number}" #: lms/templates/emails/photo_submission_confirmation.txt -#: lms/templates/emails/successfull_verification_email.txt msgid "Hi {full_name}," msgstr "اه {full_name}," @@ -17673,6 +17731,11 @@ msgstr "" "غخعق دثقهبهذشفهخر صشس سعذذثسسبعم.غخع ذشر شمسخ ذاثذن فاث سفشفعس خب فاث " "دثقهبهذشفهخر حقخذثسس خر غخعق يشسازخشقي." +#: lms/templates/emails/photo_submission_confirmation.txt +#: lms/templates/emails/reverification_processed.txt +msgid "The {platform_name} team" +msgstr "فاث {platform_name} فثشو" + #: lms/templates/emails/registration_codes_sale_email.txt msgid "Thank you for purchasing enrollments in {course_name}." msgstr "فاشرن غخع بخق حعقذاشسهرل ثرقخمموثرفس هر {course_name}." @@ -17897,16 +17960,6 @@ msgstr "" msgid "Thanks," msgstr "فاشرنس," -#: lms/templates/emails/successfull_verification_email.txt -msgid "Congratulations! Your ID verification process was successful." -msgstr "ذخرلقشفعمشفهخرس! غخعق هي دثقهبهذشفهخر حقخذثسس صشس سعذذثسسبعم." - -#: lms/templates/emails/successfull_verification_email.txt -msgid "" -"Your verification is effective for one year. It will expire on {expiry_date}" -msgstr "" -"غخعق دثقهبهذشفهخر هس ثببثذفهدث بخق خرث غثشق. هف صهمم ثطحهقث خر {expiry_date}" - #: lms/templates/emails/unenroll_email_allowedmessage.txt msgid "Dear Student," msgstr "يثشق سفعيثرف," @@ -21212,6 +21265,10 @@ msgstr "غخع اشدثر'ف ثشقرثي شرغ ذثقفهبهذشفثس غثف msgid "Explore New Courses" msgstr "ثطحمخقث رثص ذخعقسثس" +#: openedx/features/learner_profile/templates/learner_profile/learner_profile.html +msgid "View My Records" +msgstr "دهثص وغ قثذخقيس" + #: openedx/features/learner_profile/templates/learner_profile/learner_profile.html msgid "My Profile" msgstr "وغ حقخبهمث" diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.mo b/conf/locale/rtl/LC_MESSAGES/djangojs.mo index 957a631509..024465a2fb 100644 Binary files a/conf/locale/rtl/LC_MESSAGES/djangojs.mo and b/conf/locale/rtl/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/rtl/LC_MESSAGES/djangojs.po b/conf/locale/rtl/LC_MESSAGES/djangojs.po index dacf8d159f..4a0da07d5d 100644 --- a/conf/locale/rtl/LC_MESSAGES/djangojs.po +++ b/conf/locale/rtl/LC_MESSAGES/djangojs.po @@ -26,8 +26,8 @@ msgid "" msgstr "" "Project-Id-Version: 0.1a\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-29 20:36+0000\n" -"PO-Revision-Date: 2018-04-29 20:36:21.128556\n" +"POT-Creation-Date: 2018-05-13 20:36+0000\n" +"PO-Revision-Date: 2018-05-13 20:37:05.556935\n" "Last-Translator: \n" "Language-Team: openedx-translation \n" "Language: en\n" @@ -237,6 +237,7 @@ msgid "Advanced" msgstr "شيدشرذثي" #: cms/static/js/views/previous_video_upload.js +#: cms/static/js/views/video/translations_editor.js #: cms/static/js/views/video_transcripts.js lms/static/js/views/image_field.js msgid "Removing" msgstr "قثوخدهرل" @@ -2559,7 +2560,6 @@ msgstr "شررخفشفهخر فثطف" #: cms/templates/js/metadata-number-entry.underscore #: cms/templates/js/metadata-option-entry.underscore #: cms/templates/js/metadata-string-entry.underscore -#: cms/templates/js/video/metadata-translations-entry.underscore msgid "Clear" msgstr "ذمثشق" @@ -5184,6 +5184,10 @@ msgstr "خدثقشمم سذخقث" msgid "Bookmark this page" msgstr "زخخنوشقن فاهس حشلث" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "فاشرن غخع بخق سثففهرل غخعق ذخعقسث لخشم فخ {goal}!" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "غخع اشدث سعذذثسسبعممغ عحيشفثي غخعق لخشم." @@ -6533,10 +6537,6 @@ msgstr "ثققخق: ذاخخسهرل بشهمثي." msgid "Error: Connection with server failed." msgstr "ثققخق: ذخررثذفهخر صهفا سثقدثق بشهمثي." -#: cms/static/js/views/video/transcripts/metadata_videolist.js -msgid "No sources" -msgstr "رخ سخعقذثس" - #: cms/static/js/views/video/transcripts/metadata_videolist.js msgid "Link types should be unique." msgstr "مهرن فغحثس ساخعمي زث عرهضعث." @@ -6557,6 +6557,23 @@ msgstr "" "سخققغ, فاثقث صشس شر ثققخق حشقسهرل فاث سعزفهفمثس فاشف غخع عحمخشيثي. حمثشسث " "ذاثذن فاث بخقوشف شري فقغ شلشهر." +#: cms/static/js/views/video/translations_editor.js +#: cms/static/js/views/video_transcripts.js +msgid "Are you sure you want to remove this transcript?" +msgstr "شقث غخع سعقث غخع صشرف فخ قثوخدث فاهس فقشرسذقهحف?" + +#: cms/static/js/views/video/translations_editor.js +msgid "" +"If you remove this transcript, the transcript will not be available for this" +" component." +msgstr "" +"هب غخع قثوخدث فاهس فقشرسذقهحف, فاث فقشرسذقهحف صهمم رخف زث شدشهمشزمث بخق فاهس" +" ذخوحخرثرف." + +#: cms/static/js/views/video/translations_editor.js +msgid "Remove Transcript" +msgstr "قثوخدث فقشرسذقهحف" + #: cms/static/js/views/video/translations_editor.js msgid "Upload translation" msgstr "عحمخشي فقشرسمشفهخر" @@ -6690,10 +6707,6 @@ msgstr "" msgid "{transcriptClientTitle}_{transcriptLanguageCode}.{fileExtension}" msgstr "{transcriptClientTitle}_{transcriptLanguageCode}.{fileExtension}" -#: cms/static/js/views/video_transcripts.js -msgid "Are you sure you want to remove this transcript?" -msgstr "شقث غخع سعقث غخع صشرف فخ قثوخدث فاهس فقشرسذقهحف?" - #: cms/static/js/views/video_transcripts.js msgid "" "If you remove this transcript, the transcript will not be available for any " @@ -10035,7 +10048,6 @@ msgstr "رثص %(item_type)s" #: cms/templates/js/metadata-number-entry.underscore #: cms/templates/js/metadata-option-entry.underscore #: cms/templates/js/metadata-string-entry.underscore -#: cms/templates/js/video/metadata-translations-entry.underscore msgid "Clear Value" msgstr "ذمثشق دشمعث" diff --git a/conf/locale/ru/LC_MESSAGES/django.mo b/conf/locale/ru/LC_MESSAGES/django.mo index 8123f7d47c..9e0df9163c 100644 Binary files a/conf/locale/ru/LC_MESSAGES/django.mo and b/conf/locale/ru/LC_MESSAGES/django.mo differ diff --git a/conf/locale/ru/LC_MESSAGES/django.po b/conf/locale/ru/LC_MESSAGES/django.po index 50c0102eb0..cbcebde144 100644 --- a/conf/locale/ru/LC_MESSAGES/django.po +++ b/conf/locale/ru/LC_MESSAGES/django.po @@ -249,7 +249,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:51+0000\n" "Last-Translator: Maksimenkova Olga \n" "Language-Team: Russian (http://www.transifex.com/open-edx/edx-platform/language/ru/)\n" @@ -980,6 +980,7 @@ msgstr "" "Пожалуйста, свяжитесь с нами по электронной почте." #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -1010,7 +1011,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "Слишком много неудачных попыток входа. Повторите попытку позже." -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "Неверный адрес электронной почты или пароль." @@ -1161,6 +1164,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "Аутентификация с помощью {} пока недоступна." @@ -9933,11 +9940,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -10767,6 +10775,10 @@ msgstr "" msgid "A cohort with the same name already exists." msgstr "Группа с таким названием уже существует." +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "Внутренний URL-адрес сервиса" @@ -11033,6 +11045,27 @@ msgid "" " " msgstr "" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/ru/LC_MESSAGES/djangojs.mo b/conf/locale/ru/LC_MESSAGES/djangojs.mo index 29649321d2..8314bf440c 100644 Binary files a/conf/locale/ru/LC_MESSAGES/djangojs.mo and b/conf/locale/ru/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/ru/LC_MESSAGES/djangojs.po b/conf/locale/ru/LC_MESSAGES/djangojs.po index c28eb7b6df..a29b82ef0d 100644 --- a/conf/locale/ru/LC_MESSAGES/djangojs.po +++ b/conf/locale/ru/LC_MESSAGES/djangojs.po @@ -154,7 +154,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: Weyedide \n" "Language-Team: Russian (http://www.transifex.com/open-edx/edx-platform/language/ru/)\n" @@ -4855,6 +4855,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -5215,6 +5219,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -8197,6 +8205,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/zh_CN/LC_MESSAGES/django.mo b/conf/locale/zh_CN/LC_MESSAGES/django.mo index 13e563ea86..592ad341ed 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 3e1e017312..2eb1e0f881 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/django.po +++ b/conf/locale/zh_CN/LC_MESSAGES/django.po @@ -352,7 +352,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:51+0000\n" "Last-Translator: zhaojina \n" "Language-Team: Chinese (China) (http://www.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" @@ -1031,6 +1031,7 @@ msgid "There was an error receiving your login information. Please email us." msgstr "接受您的登录信息时出现错误,请发电子邮件给我们。" #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -1056,7 +1057,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "失败次数超过限制,请稍后再试!" -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "邮箱或密码错误。" @@ -1202,6 +1205,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "当前不可使用{}认证。" @@ -9223,11 +9230,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -10024,6 +10032,10 @@ msgstr "必须存在一个可以将学生自动分配进去的群组。" msgid "A cohort with the same name already exists." msgstr "具有相同名称的群组已存在。" +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "内部服务链接" @@ -10256,6 +10268,27 @@ msgid "" " " msgstr "" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo b/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo index db0292af12..e61e43d6b8 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 c123d58f1d..3142b53e8a 100644 --- a/conf/locale/zh_CN/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_CN/LC_MESSAGES/djangojs.po @@ -190,7 +190,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: San \n" "Language-Team: Chinese (China) (http://www.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" @@ -4667,6 +4667,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -4991,6 +4995,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -7831,6 +7839,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/conf/locale/zh_HANS/LC_MESSAGES/django.mo b/conf/locale/zh_HANS/LC_MESSAGES/django.mo index 13e563ea86..592ad341ed 100644 Binary files a/conf/locale/zh_HANS/LC_MESSAGES/django.mo and b/conf/locale/zh_HANS/LC_MESSAGES/django.mo differ diff --git a/conf/locale/zh_HANS/LC_MESSAGES/django.po b/conf/locale/zh_HANS/LC_MESSAGES/django.po index 3e1e017312..2eb1e0f881 100644 --- a/conf/locale/zh_HANS/LC_MESSAGES/django.po +++ b/conf/locale/zh_HANS/LC_MESSAGES/django.po @@ -352,7 +352,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:51+0000\n" "Last-Translator: zhaojina \n" "Language-Team: Chinese (China) (http://www.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" @@ -1031,6 +1031,7 @@ msgid "There was an error receiving your login information. Please email us." msgstr "接受您的登录信息时出现错误,请发电子邮件给我们。" #: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py msgid "" "This account has been temporarily locked due to excessive login failures. " "Try again later." @@ -1056,7 +1057,9 @@ msgstr "" msgid "Too many failed login attempts. Try again later." msgstr "失败次数超过限制,请稍后再试!" -#: common/djangoapps/student/views/login.py lms/templates/provider_login.html +#: common/djangoapps/student/views/login.py +#: openedx/core/djangoapps/user_api/accounts/views.py +#: lms/templates/provider_login.html msgid "Email or password is incorrect." msgstr "邮箱或密码错误。" @@ -1202,6 +1205,10 @@ msgstr "" msgid "Delete the selected configuration" msgstr "" +#: common/djangoapps/third_party_auth/middleware.py +msgid "Unable to connect with the external provider, please try again" +msgstr "" + #: common/djangoapps/third_party_auth/models.py msgid "Authentication with {} is currently unavailable." msgstr "当前不可使用{}认证。" @@ -9223,11 +9230,12 @@ msgstr "" #: lms/envs/common.py #, python-brace-format msgid "" -"{start_bold}{enterprise_name}{end_bold} has partnered with " -"{start_bold}{platform_name}{end_bold} to offer you always available, high-" -"quality learning programs to help you advance your knowledge and your " -"career. {line_break}Please continue with registration, or log in if you are " -"an existing user, and press continue to start learning." +"You have left the {start_bold}{enterprise_name}{end_bold} website and are " +"now on the {platform_name} site. {enterprise_name} has partnered with " +"{platform_name} to offer you high-quality, always available learning " +"programs to help you advance your knowledge and career. {line_break}Please " +"note that {platform_name} has a different {privacy_policy_link_start}Privacy" +" Policy{privacy_policy_link_end} from {enterprise_name}." msgstr "" #: lms/templates/emails/password_reset_subject.txt @@ -10024,6 +10032,10 @@ msgstr "必须存在一个可以将学生自动分配进去的群组。" msgid "A cohort with the same name already exists." msgstr "具有相同名称的群组已存在。" +#: openedx/core/djangoapps/credentials/apps.py +msgid "Credentials" +msgstr "" + #: openedx/core/djangoapps/credentials/models.py msgid "Internal Service URL" msgstr "内部服务链接" @@ -10256,6 +10268,27 @@ msgid "" " " msgstr "" +#: openedx/core/djangoapps/password_policy/apps.py +msgid "Password Policy" +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. Change your password now to continue " +"using the site. Thank you for helping us keep your data safe." +msgstr "" + +#: openedx/core/djangoapps/password_policy/compliance.py +#, python-brace-format +msgid "" +"{platform_name} now requires more complex passwords. Your current password " +"does not meet the new requirements. You must change your password by " +"{deadline} to be able to continue using the site. Thank you for helping us " +"keep your data safe." +msgstr "" + #: openedx/core/djangoapps/profile_images/images.py #, python-brace-format msgid "The file must be smaller than {image_max_size} in size." diff --git a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.mo b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.mo index db0292af12..e61e43d6b8 100644 Binary files a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.mo and b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.mo differ diff --git a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po index c123d58f1d..3142b53e8a 100644 --- a/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po +++ b/conf/locale/zh_HANS/LC_MESSAGES/djangojs.po @@ -190,7 +190,7 @@ msgid "" msgstr "" "Project-Id-Version: edx-platform\n" "Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n" -"POT-Creation-Date: 2018-04-22 20:42+0000\n" +"POT-Creation-Date: 2018-05-06 20:42+0000\n" "PO-Revision-Date: 2018-03-13 13:50+0000\n" "Last-Translator: San \n" "Language-Team: Chinese (China) (http://www.transifex.com/open-edx/edx-platform/language/zh_CN/)\n" @@ -4667,6 +4667,10 @@ msgstr "" msgid "Enter your " msgstr "" +#: lms/static/js/student_account/views/account_settings_factory.js +msgid "Delete My Account" +msgstr "" + #: lms/static/js/student_account/views/account_settings_factory.js #: lms/static/js/student_account/views/account_settings_view.js msgid "Linked Accounts" @@ -4991,6 +4995,10 @@ msgstr "" msgid "Bookmark this page" msgstr "" +#: openedx/features/course_experience/static/course_experience/js/CourseGoals.js +msgid "Thank you for setting your course goal to {goal}!" +msgstr "" + #: openedx/features/course_experience/static/course_experience/js/CourseHome.js msgid "You have successfully updated your goal." msgstr "" @@ -7831,6 +7839,10 @@ msgstr "" msgid "Open the certificate you earned for the %(title)s program." msgstr "" +#: lms/templates/learner_dashboard/program_details_sidebar.underscore +msgid "View Program Record" +msgstr "" + #: lms/templates/learner_dashboard/program_details_view.underscore msgid "Congratulations!" msgstr "" diff --git a/lms/djangoapps/certificates/signals.py b/lms/djangoapps/certificates/signals.py index dc68c1ee21..9bd9219967 100644 --- a/lms/djangoapps/certificates/signals.py +++ b/lms/djangoapps/certificates/signals.py @@ -83,6 +83,7 @@ def _listen_for_id_verification_status_changed(sender, user, **kwargs): # pylin user_enrollments = CourseEnrollment.enrollments_for_user(user=user) grade_factory = CourseGradeFactory() expected_verification_status = IDVerificationService.user_status(user) + expected_verification_status = expected_verification_status['status'] for enrollment in user_enrollments: if grade_factory.read(user=user, course=enrollment.course_overview).passed: if fire_ungenerated_certificate_task(user, enrollment.course_id, expected_verification_status): @@ -93,7 +94,7 @@ def _listen_for_id_verification_status_changed(sender, user, **kwargs): # pylin log.info(message.format( user=user.id, course=enrollment.course_id, - status=expected_verification_status['status'] + status=expected_verification_status )) diff --git a/lms/djangoapps/certificates/tasks.py b/lms/djangoapps/certificates/tasks.py index 537108cc88..380b1e630f 100644 --- a/lms/djangoapps/certificates/tasks.py +++ b/lms/djangoapps/certificates/tasks.py @@ -32,6 +32,15 @@ def generate_certificate(self, **kwargs): expected_verification_status = kwargs.pop('expected_verification_status', None) if expected_verification_status: actual_verification_status = IDVerificationService.user_status(student) + actual_verification_status = actual_verification_status['status'] if expected_verification_status != actual_verification_status: + logger.warn('Expected verification status {expected} ' + 'differs from actual verification status {actual} ' + 'for user {user} in course {course}'.format( + expected=expected_verification_status, + actual=actual_verification_status, + user=student.id, + course=course_key + )) raise self.retry(kwargs=original_kwargs) generate_user_certificates(student=student, course_key=course_key, **kwargs) diff --git a/lms/djangoapps/certificates/tests/test_signals.py b/lms/djangoapps/certificates/tests/test_signals.py index 00b173e16f..4f371acdbd 100644 --- a/lms/djangoapps/certificates/tests/test_signals.py +++ b/lms/djangoapps/certificates/tests/test_signals.py @@ -15,7 +15,7 @@ from lms.djangoapps.certificates.models import ( from lms.djangoapps.certificates.signals import fire_ungenerated_certificate_task, CERTIFICATE_DELAY_SECONDS from lms.djangoapps.grades.course_grade_factory import CourseGradeFactory from lms.djangoapps.grades.tests.utils import mock_passing_grade -from lms.djangoapps.verify_student.models import SoftwareSecurePhotoVerification +from lms.djangoapps.verify_student.models import IDVerificationAttempt, SoftwareSecurePhotoVerification from openedx.core.djangoapps.certificates.config import waffle from student.tests.factories import CourseEnrollmentFactory, UserFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase @@ -263,17 +263,12 @@ class LearnerTrackChangeCertsTest(ModuleStoreTestCase): status='submitted' ) attempt.approve() - expected_verification_status = { - 'status': 'approved', - 'error': '', - 'should_display': True, - } mock_generate_certificate_apply_async.assert_called_with( countdown=CERTIFICATE_DELAY_SECONDS, kwargs={ 'student': unicode(self.user_one.id), 'course_key': unicode(self.course_one.id), - 'expected_verification_status': unicode(expected_verification_status), + 'expected_verification_status': IDVerificationAttempt.STATUS.approved, } ) @@ -289,17 +284,12 @@ class LearnerTrackChangeCertsTest(ModuleStoreTestCase): status='submitted' ) attempt.approve() - expected_verification_status = { - 'status': 'approved', - 'error': '', - 'should_display': True, - } mock_generate_certificate_apply_async.assert_called_with( countdown=CERTIFICATE_DELAY_SECONDS, kwargs={ 'student': unicode(self.user_two.id), 'course_key': unicode(self.course_two.id), - 'expected_verification_status': unicode(expected_verification_status), + 'expected_verification_status': IDVerificationAttempt.STATUS.approved, } ) diff --git a/lms/djangoapps/certificates/tests/test_tasks.py b/lms/djangoapps/certificates/tests/test_tasks.py index fcad310527..21fadbdc36 100644 --- a/lms/djangoapps/certificates/tests/test_tasks.py +++ b/lms/djangoapps/certificates/tests/test_tasks.py @@ -4,6 +4,7 @@ from mock import call, patch from opaque_keys.edx.keys import CourseKey from lms.djangoapps.certificates.tasks import generate_certificate +from lms.djangoapps.verify_student.models import IDVerificationAttempt from student.tests.factories import UserFactory @@ -47,16 +48,10 @@ class GenerateUserCertificateTest(TestCase): course_key = 'course-v1:edX+CS101+2017_T2' student = UserFactory() - expected_verification_status = { - 'status': 'approved', - 'error': '', - 'should_display': True, - } - kwargs = { 'student': student.id, 'course_key': course_key, - 'expected_verification_status': expected_verification_status, + 'expected_verification_status': IDVerificationAttempt.STATUS.approved } user_status_mock.side_effect = [ diff --git a/lms/djangoapps/discussion/tasks.py b/lms/djangoapps/discussion/tasks.py index 1c46efc66c..2072d36701 100644 --- a/lms/djangoapps/discussion/tasks.py +++ b/lms/djangoapps/discussion/tasks.py @@ -85,7 +85,8 @@ def _track_notification_sent(message, context): 'uuid': unicode(message.uuid), 'send_uuid': unicode(message.send_uuid), 'thread_id': context['thread_id'], - 'thread_created_at': date.deserialize(context['thread_created_at']) + 'thread_created_at': date.deserialize(context['thread_created_at']), + 'nonInteraction': 1, } analytics.track( user_id=context['thread_author_id'], diff --git a/lms/djangoapps/discussion/tests/test_tasks.py b/lms/djangoapps/discussion/tests/test_tasks.py index ff4191c33b..8164c7b66f 100644 --- a/lms/djangoapps/discussion/tests/test_tasks.py +++ b/lms/djangoapps/discussion/tests/test_tasks.py @@ -298,6 +298,8 @@ class TaskTestCase(ModuleStoreTestCase): for key, entry in test_props.items(): setattr(message, key, entry) + test_props['nonInteraction'] = True + with mock.patch('analytics.track') as mock_analytics_track: _track_notification_sent(message, context) mock_analytics_track.assert_called_once_with( diff --git a/lms/djangoapps/grades/models.py b/lms/djangoapps/grades/models.py index 0a19cd1622..37244550b2 100644 --- a/lms/djangoapps/grades/models.py +++ b/lms/djangoapps/grades/models.py @@ -153,31 +153,39 @@ class VisibleBlocks(models.Model): return BlockRecordList.from_json(self.blocks_json) @classmethod - def bulk_read(cls, course_key): + def bulk_read(cls, user_id, course_key): """ - Reads and returns all visible block records for the given course from - the cache. The cache is initialize with the visible blocks for this - course if no entry currently exists.has no entry for this course, - the cache is updated. + Reads and returns all visible block records for the given user and course from + the cache. The cache is initialized with the visible blocks for this user and + course if no entry currently exists. Arguments: course_key: The course identifier for the desired records """ - prefetched = get_cache(cls._CACHE_NAMESPACE).get(cls._cache_key(course_key), None) + prefetched = get_cache(cls._CACHE_NAMESPACE).get(cls._cache_key(user_id, course_key), None) if prefetched is None: - prefetched = cls._initialize_cache(course_key) + prefetched = cls._initialize_cache(user_id, course_key) return prefetched @classmethod - def cached_get_or_create(cls, blocks): - prefetched = get_cache(cls._CACHE_NAMESPACE).get(cls._cache_key(blocks.course_key)) + def cached_get_or_create(cls, user_id, blocks): + """ + Given a ``user_id`` and a ``BlockRecordList`` object, attempts to + fetch the related VisibleBlocks model from the request cache. This + will create and save a new ``VisibleBlocks`` record if no record + exists corresponding to the hash_value of ``blocks``. + """ + prefetched = get_cache(cls._CACHE_NAMESPACE).get(cls._cache_key(user_id, blocks.course_key)) if prefetched is not None: model = prefetched.get(blocks.hash_value) if not model: - model = cls.objects.create( + # We still have to do a get_or_create, because + # another user may have had this block hash created, + # even if the user we checked the cache for hasn't yet. + model, _ = cls.objects.get_or_create( hashed=blocks.hash_value, blocks_json=blocks.json_value, course_id=blocks.course_key, ) - cls._update_cache(blocks.course_key, [model]) + cls._update_cache(user_id, blocks.course_key, [model]) else: model, _ = cls.objects.get_or_create( hashed=blocks.hash_value, @@ -186,7 +194,7 @@ class VisibleBlocks(models.Model): return model @classmethod - def bulk_create(cls, course_key, block_record_lists): + def bulk_create(cls, user_id, course_key, block_record_lists): """ Bulk creates VisibleBlocks for the given iterator of BlockRecordList objects and updates the VisibleBlocks cache @@ -201,44 +209,48 @@ class VisibleBlocks(models.Model): ) for brl in block_record_lists ]) - cls._update_cache(course_key, created) + cls._update_cache(user_id, course_key, created) return created @classmethod - def bulk_get_or_create(cls, block_record_lists, course_key): + def bulk_get_or_create(cls, user_id, course_key, block_record_lists): """ Bulk creates VisibleBlocks for the given iterator of - BlockRecordList objects for the given course_key, but + BlockRecordList objects for the given user and course_key, but only for those that aren't already created. """ - existent_records = cls.bulk_read(course_key) - non_existent_brls = {brl for brl in block_record_lists if brl.hash_value not in existent_records} - cls.bulk_create(course_key, non_existent_brls) + cached_records = cls.bulk_read(user_id, course_key) + non_existent_brls = {brl.hash_value for brl in block_record_lists if brl.hash_value not in cached_records} + cls.bulk_create(user_id, course_key, non_existent_brls) @classmethod - def _initialize_cache(cls, course_key): + def _initialize_cache(cls, user_id, course_key): """ - Prefetches visible blocks for the given course and stores in the cache. + Prefetches visible blocks for the given user and course and stores in the cache. Returns a dictionary mapping hashes of these block records to the block record objects. """ - prefetched = {record.hashed: record for record in cls.objects.filter(course_id=course_key)} - get_cache(cls._CACHE_NAMESPACE)[cls._cache_key(course_key)] = prefetched + grades_with_blocks = PersistentSubsectionGrade.objects.select_related('visible_blocks').filter( + user_id=user_id, + course_id=course_key, + ) + prefetched = {grade.visible_blocks.hashed: grade.visible_blocks for grade in grades_with_blocks} + get_cache(cls._CACHE_NAMESPACE)[cls._cache_key(user_id, course_key)] = prefetched return prefetched @classmethod - def _update_cache(cls, course_key, visible_blocks): + def _update_cache(cls, user_id, course_key, visible_blocks): """ Adds a specific set of visible blocks to the request cache. This assumes that prefetch has already been called. """ - get_cache(cls._CACHE_NAMESPACE)[cls._cache_key(course_key)].update( + get_cache(cls._CACHE_NAMESPACE)[cls._cache_key(user_id, course_key)].update( {visible_block.hashed: visible_block for visible_block in visible_blocks} ) @classmethod - def _cache_key(cls, course_key): - return u"visible_blocks_cache.{}".format(course_key) + def _cache_key(cls, user_id, course_key): + return u"visible_blocks_cache.{}.{}".format(course_key, user_id) class PersistentSubsectionGrade(TimeStampedModel): @@ -362,10 +374,11 @@ class PersistentSubsectionGrade(TimeStampedModel): Wrapper for objects.update_or_create. """ cls._prepare_params(params) - VisibleBlocks.cached_get_or_create(params['visible_blocks']) + VisibleBlocks.cached_get_or_create(params['user_id'], params['visible_blocks']) cls._prepare_params_visible_blocks_id(params) cls._prepare_params_override(params) + # TODO: do we NEED to pop these? first_attempted = params.pop('first_attempted') user_id = params.pop('user_id') usage_key = params.pop('usage_key') @@ -394,7 +407,9 @@ class PersistentSubsectionGrade(TimeStampedModel): PersistentSubsectionGradeOverride.prefetch(user_id, course_key) map(cls._prepare_params, grade_params_iter) - VisibleBlocks.bulk_get_or_create([params['visible_blocks'] for params in grade_params_iter], course_key) + VisibleBlocks.bulk_get_or_create( + user_id, course_key, [params['visible_blocks'] for params in grade_params_iter] + ) map(cls._prepare_params_visible_blocks_id, grade_params_iter) map(cls._prepare_params_override, grade_params_iter) @@ -619,4 +634,4 @@ class PersistentSubsectionGradeOverride(models.Model): def prefetch(user, course_key): PersistentSubsectionGradeOverride.prefetch(user.id, course_key) - VisibleBlocks.bulk_read(course_key) + VisibleBlocks.bulk_read(user.id, course_key) diff --git a/lms/djangoapps/grades/tasks.py b/lms/djangoapps/grades/tasks.py index f3bd35fe5e..f219f3c540 100644 --- a/lms/djangoapps/grades/tasks.py +++ b/lms/djangoapps/grades/tasks.py @@ -27,7 +27,6 @@ from .config.waffle import DISABLE_REGRADE_ON_POLICY_CHANGE, waffle from .constants import ScoreDatabaseTableEnum from .course_grade_factory import CourseGradeFactory from .exceptions import DatabaseNotReadyError -from .models import VisibleBlocks from .services import GradesService from .signals.signals import SUBSECTION_SCORE_CHANGED from .subsection_grade_factory import SubsectionGradeFactory @@ -41,7 +40,6 @@ KNOWN_RETRY_ERRORS = ( # Errors we expect occasionally, should be resolved on r ValidationError, DatabaseNotReadyError, ) -MAX_VISIBLE_BLOCKS_ALLOWED = 50000 RECALCULATE_GRADE_DELAY_SECONDS = 2 # to prevent excessive _has_db_updated failures. See TNL-6424. RETRY_DELAY_SECONDS = 30 SUBSECTION_GRADE_TIMEOUT_SECONDS = 300 @@ -139,12 +137,6 @@ def recalculate_course_and_subsection_grades_for_user(self, **kwargs): # pylint user = User.objects.get(id=user_id) course_key = CourseKey.from_string(course_key_str) - # Hotfix to address LEARNER-5123, to be removed later - visible_blocks_count = VisibleBlocks.objects.filter(course_id=course_key).count() - if visible_blocks_count > MAX_VISIBLE_BLOCKS_ALLOWED: - message = '{} has too many VisibleBlocks to recalculate grades for {}' - raise Exception(message.format(course_key_str, user_id)) - previous_course_grade = CourseGradeFactory().read(user, course_key=course_key) if previous_course_grade and previous_course_grade.attempted: CourseGradeFactory().update( diff --git a/lms/djangoapps/grades/tests/test_course_grade_factory.py b/lms/djangoapps/grades/tests/test_course_grade_factory.py index ecde6b7521..2dd229efa4 100644 --- a/lms/djangoapps/grades/tests/test_course_grade_factory.py +++ b/lms/djangoapps/grades/tests/test_course_grade_factory.py @@ -97,56 +97,28 @@ class TestCourseGradeFactory(GradeTestBase): with self.assertNumQueries(2), mock_get_score(1, 2): _assert_read(expected_pass=False, expected_percent=0) # start off with grade of 0 - # TODO: Remove Django 1.11 upgrade shim - # SHIM: Django 1.11 results in a few more SAVEPOINTs due to: - # https://github.com/django/django/commit/d44afd88#diff-5b0dda5eb9a242c15879dc9cd2121379L485 - if django.VERSION >= (1, 11): - num_queries = 37 - else: - num_queries = 29 - + num_queries = 40 with self.assertNumQueries(num_queries), mock_get_score(1, 2): grade_factory.update(self.request.user, self.course, force_update_subsections=True) with self.assertNumQueries(2): _assert_read(expected_pass=True, expected_percent=0.5) # updated to grade of .5 - # TODO: Remove Django 1.11 upgrade shim - # SHIM: Django 1.11 results in a few more SAVEPOINTs due to: - # https://github.com/django/django/commit/d44afd88#diff-5b0dda5eb9a242c15879dc9cd2121379L485 - if django.VERSION >= (1, 11): - num_queries = 6 - else: - num_queries = 4 - + num_queries = 6 with self.assertNumQueries(num_queries), mock_get_score(1, 4): grade_factory.update(self.request.user, self.course, force_update_subsections=False) with self.assertNumQueries(2): _assert_read(expected_pass=True, expected_percent=0.5) # NOT updated to grade of .25 - # TODO: Remove Django 1.11 upgrade shim - # SHIM: Django 1.11 results in a few more SAVEPOINTs due to: - # https://github.com/django/django/commit/d44afd88#diff-5b0dda5eb9a242c15879dc9cd2121379L485 - if django.VERSION >= (1, 11): - num_queries = 20 - else: - num_queries = 12 - + num_queries = 20 with self.assertNumQueries(num_queries), mock_get_score(2, 2): grade_factory.update(self.request.user, self.course, force_update_subsections=True) with self.assertNumQueries(2): _assert_read(expected_pass=True, expected_percent=1.0) # updated to grade of 1.0 - # TODO: Remove Django 1.11 upgrade shim - # SHIM: Django 1.11 results in a few more SAVEPOINTs due to: - # https://github.com/django/django/commit/d44afd88#diff-5b0dda5eb9a242c15879dc9cd2121379L485 - if django.VERSION >= (1, 11): - num_queries = 20 - else: - num_queries = 12 - + num_queries = 23 with self.assertNumQueries(num_queries), mock_get_score(0, 0): # the subsection now is worth zero grade_factory.update(self.request.user, self.course, force_update_subsections=True) diff --git a/lms/djangoapps/grades/tests/test_models.py b/lms/djangoapps/grades/tests/test_models.py index 602ddd6d1e..fe5ba95bdd 100644 --- a/lms/djangoapps/grades/tests/test_models.py +++ b/lms/djangoapps/grades/tests/test_models.py @@ -132,11 +132,16 @@ class VisibleBlocksTest(GradesModelTestCase): """ shard = 4 - def _create_block_record_list(self, blocks): + def setUp(self): + super(VisibleBlocksTest, self).setUp() + self.user_id = 12345 + + def _create_block_record_list(self, blocks, user_id=None): """ Creates and returns a BlockRecordList for the given blocks. """ - return VisibleBlocks.cached_get_or_create(BlockRecordList.from_list(blocks, self.course_key)) + block_record_list = BlockRecordList.from_list(blocks, self.course_key) + return VisibleBlocks.cached_get_or_create(user_id or self.user_id, block_record_list) def test_creation(self): """ diff --git a/lms/djangoapps/grades/tests/test_scores.py b/lms/djangoapps/grades/tests/test_scores.py index 7e677f4ef0..6c18a03627 100644 --- a/lms/djangoapps/grades/tests/test_scores.py +++ b/lms/djangoapps/grades/tests/test_scores.py @@ -61,10 +61,7 @@ class TestScoredBlockTypes(TestCase): } def test_block_types_possibly_scored(self): - self.assertSetEqual( - self.possibly_scored_block_types, - scores._block_types_possibly_scored() - ) + self.assertTrue(self.possibly_scored_block_types.issubset(scores._block_types_possibly_scored())) def test_possibly_scored(self): course_key = CourseLocator(u'org', u'course', u'run') diff --git a/lms/djangoapps/grades/tests/test_tasks.py b/lms/djangoapps/grades/tests/test_tasks.py index 109a119a60..95f799fa60 100644 --- a/lms/djangoapps/grades/tests/test_tasks.py +++ b/lms/djangoapps/grades/tests/test_tasks.py @@ -485,22 +485,39 @@ class RecalculateGradesForUserTest(HasCourseWithProblemsMixin, ModuleStoreTestCa self.user = UserFactory.create() self.set_up_course() CourseEnrollment.enroll(self.user, self.course.id) - self.original_max_visible_blocks_allowed = tasks.MAX_VISIBLE_BLOCKS_ALLOWED - tasks.MAX_VISIBLE_BLOCKS_ALLOWED = -1 - def tearDown(self): - super(RecalculateGradesForUserTest, self).tearDown() - tasks.MAX_VISIBLE_BLOCKS_ALLOWED = self.original_max_visible_blocks_allowed - - def test_do_not_recalculate_complex_courses(self): + def test_recalculation_happy_path(self): with patch('lms.djangoapps.grades.tasks.CourseGradeFactory') as mock_factory: + factory = mock_factory.return_value + factory.read.return_value = MagicMock(attempted=True) + kwargs = { 'user_id': self.user.id, 'course_key': six.text_type(self.course.id), } - with self.assertRaisesRegexp(Exception, 'too many VisibleBlocks'): - task_result = tasks.recalculate_course_and_subsection_grades_for_user.apply_async(kwargs=kwargs) - task_result.get() - update = mock_factory.return_value.update - self.assertFalse(update.called) + task_result = tasks.recalculate_course_and_subsection_grades_for_user.apply_async(kwargs=kwargs) + task_result.get() + + factory.read.assert_called_once_with(self.user, course_key=self.course.id) + factory.update.assert_called_once_with( + user=self.user, + course_key=self.course.id, + force_update_subsections=True, + ) + + def test_recalculation_doesnt_happen_if_not_previously_attempted(self): + with patch('lms.djangoapps.grades.tasks.CourseGradeFactory') as mock_factory: + factory = mock_factory.return_value + factory.read.return_value = MagicMock(attempted=False) + + kwargs = { + 'user_id': self.user.id, + 'course_key': six.text_type(self.course.id), + } + + task_result = tasks.recalculate_course_and_subsection_grades_for_user.apply_async(kwargs=kwargs) + task_result.get() + + factory.read.assert_called_once_with(self.user, course_key=self.course.id) + self.assertFalse(factory.update.called) diff --git a/lms/djangoapps/learner_dashboard/tests/test_programs.py b/lms/djangoapps/learner_dashboard/tests/test_programs.py index a3662a1c4c..5387b733aa 100644 --- a/lms/djangoapps/learner_dashboard/tests/test_programs.py +++ b/lms/djangoapps/learner_dashboard/tests/test_programs.py @@ -12,12 +12,13 @@ from bs4 import BeautifulSoup from django.conf import settings from django.core.urlresolvers import reverse, reverse_lazy from django.test import override_settings -from waffle.testutils import override_switch from lms.envs.test import CREDENTIALS_PUBLIC_SERVICE_URL from openedx.core.djangoapps.catalog.tests.factories import CourseFactory, CourseRunFactory, ProgramFactory from openedx.core.djangoapps.catalog.tests.mixins import CatalogIntegrationMixin +from openedx.core.djangoapps.credentials import STUDENT_RECORDS_FLAG from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin +from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag from openedx.core.djangolib.testing.utils import skip_unless_lms from student.tests.factories import CourseEnrollmentFactory, UserFactory from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase @@ -175,7 +176,7 @@ class TestProgramListing(ProgramsApiConfigMixin, SharedModuleStoreTestCase): @skip_unless_lms @mock.patch(PROGRAMS_UTILS_MODULE + '.get_programs') -@override_switch('student_records', True) +@override_waffle_flag(STUDENT_RECORDS_FLAG, active=True) class TestProgramDetails(ProgramsApiConfigMixin, CatalogIntegrationMixin, SharedModuleStoreTestCase): """Unit tests for the program details page.""" shard = 4 diff --git a/lms/djangoapps/shoppingcart/models.py b/lms/djangoapps/shoppingcart/models.py index cdae548483..54edf2df70 100644 --- a/lms/djangoapps/shoppingcart/models.py +++ b/lms/djangoapps/shoppingcart/models.py @@ -645,6 +645,7 @@ class OrderItem(TimeStampedModel): """ class Meta(object): app_label = "shoppingcart" + base_manager_name = 'objects' objects = InheritanceManager() order = models.ForeignKey(Order, db_index=True) @@ -1091,6 +1092,7 @@ class InvoiceItem(TimeStampedModel): """ class Meta(object): app_label = "shoppingcart" + base_manager_name = 'objects' objects = InheritanceManager() invoice = models.ForeignKey(Invoice, db_index=True) diff --git a/lms/static/js/student_account/AccountsClient.js b/lms/static/js/student_account/AccountsClient.js index f4c896f16f..4f5e933ee0 100644 --- a/lms/static/js/student_account/AccountsClient.js +++ b/lms/static/js/student_account/AccountsClient.js @@ -1,4 +1,3 @@ -import 'url-search-params-polyfill'; import 'whatwg-fetch'; import Cookies from 'js-cookie'; @@ -6,10 +5,11 @@ const deactivate = (password) => fetch('/api/user/v1/accounts/deactivate_logout/ method: 'POST', credentials: 'same-origin', headers: { - 'Content-Type': 'application/x-www-form-urlencoded', + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-CSRFToken': Cookies.get('csrftoken'), }, - body: new URLSearchParams({ password }), + // URLSearchParams + polyfill doesn't work in IE11 + body: `password=${encodeURIComponent(password)}`, }).then((response) => { if (response.ok) { return response; diff --git a/lms/static/js/student_account/components/StudentAccountDeletionModal.jsx b/lms/static/js/student_account/components/StudentAccountDeletionModal.jsx index 2ffbb41aaa..8fadf5e184 100644 --- a/lms/static/js/student_account/components/StudentAccountDeletionModal.jsx +++ b/lms/static/js/student_account/components/StudentAccountDeletionModal.jsx @@ -1,7 +1,6 @@ /* globals gettext */ /* eslint-disable react/no-danger */ import React from 'react'; -import 'whatwg-fetch'; import PropTypes from 'prop-types'; import { Button, Modal, Icon, InputText, StatusAlert } from '@edx/paragon/static'; import StringUtils from 'edx-ui-toolkit/js/utils/string-utils'; @@ -46,8 +45,8 @@ class StudentAccountDeletionConfirmationModal extends React.Component { validationErrorDetails: '', })) .catch(error => this.failedSubmission(error)) - ), - ); + ), + ); } failedSubmission(error) { diff --git a/lms/static/sass/features/_learner-profile.scss b/lms/static/sass/features/_learner-profile.scss index 5c48fa5871..9958d723cd 100644 --- a/lms/static/sass/features/_learner-profile.scss +++ b/lms/static/sass/features/_learner-profile.scss @@ -269,6 +269,28 @@ border-bottom: 1px solid $gray-l3; background-color: $gray-l4; padding: ($baseline*0.75) 5%; + display: table; + + .wrapper-profile-records { + display: table-row; + + button { + @extend %btn-secondary-blue-outline; + margin-top: 1em; + } + } + + @include media-breakpoint-up(sm) { + .wrapper-profile-records { + display: table-cell; + vertical-align: middle; + white-space: nowrap; + + button { + margin-top: 0; + } + } + } .u-field-account_privacy { @extend .container; @@ -277,6 +299,7 @@ box-shadow: none; padding: 0; margin: 0; + display: table-cell; @media (max-width: $learner-profile-container-flex) { // Switch to map-get($grid-breakpoints,md) for bootstrap max-width: calc(100% - 40px); diff --git a/lms/static/sass/views/_program-details.scss b/lms/static/sass/views/_program-details.scss index 6ded24172b..228b050cee 100644 --- a/lms/static/sass/views/_program-details.scss +++ b/lms/static/sass/views/_program-details.scss @@ -632,6 +632,7 @@ .program-record { text-align: center; + padding-bottom: 2em; } @media (min-width: $bp-screen-md) { diff --git a/lms/templates/learner_dashboard/program_details_sidebar.underscore b/lms/templates/learner_dashboard/program_details_sidebar.underscore index 24f0ce1911..3f3e1ea736 100644 --- a/lms/templates/learner_dashboard/program_details_sidebar.underscore +++ b/lms/templates/learner_dashboard/program_details_sidebar.underscore @@ -10,7 +10,7 @@ <% if (programRecordUrl) { %> <% } %> diff --git a/lms/templates/login.html b/lms/templates/login.html index 5b81c5fda6..bd8060685f 100644 --- a/lms/templates/login.html +++ b/lms/templates/login.html @@ -100,7 +100,7 @@ from third_party_auth import provider, pipeline $submitButton. removeClass('is-disabled'). attr('aria-disabled', false). - removeProp('disabled'). + prop('disabled', false). html("${_('Log into My {platform_name} Account').format(platform_name=platform_name)} + ${_('Access My Courses')}"); } else { diff --git a/lms/templates/register.html b/lms/templates/register.html index b273dbf36d..1eaff34fe3 100644 --- a/lms/templates/register.html +++ b/lms/templates/register.html @@ -85,7 +85,7 @@ import calendar $submitButton. removeClass('is-disabled'). attr('aria-disabled', false). - removeProp('disabled'). + prop('disabled', false). html("${_('Create My {platform_name} Account').format(platform_name=platform_name)}"); } else { diff --git a/lms/templates/seq_module.html b/lms/templates/seq_module.html index a6bc969de6..1bff2b9dac 100644 --- a/lms/templates/seq_module.html +++ b/lms/templates/seq_module.html @@ -45,6 +45,7 @@ data-element="${idx+1}" data-page-title="${item['page_title']}" data-path="${item['path']}" + data-graded="${item['graded']}" id="tab_${idx}" ${"disabled=disabled" if disable_navigation else ""}> diff --git a/openedx/core/djangoapps/credentials/__init__.py b/openedx/core/djangoapps/credentials/__init__.py index b7c6418ae6..106a5a5257 100644 --- a/openedx/core/djangoapps/credentials/__init__.py +++ b/openedx/core/djangoapps/credentials/__init__.py @@ -4,3 +4,10 @@ edX Platform support for credentials. This package will be used as a wrapper for interacting with the credentials service. """ + +from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace + +WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='credentials') + +# Waffle flag to enable the experimental Student Records feature +STUDENT_RECORDS_FLAG = WaffleFlag(WAFFLE_FLAG_NAMESPACE, 'student_records') diff --git a/openedx/core/djangoapps/credentials/models.py b/openedx/core/djangoapps/credentials/models.py index a1005ec4cb..bab4f94079 100644 --- a/openedx/core/djangoapps/credentials/models.py +++ b/openedx/core/djangoapps/credentials/models.py @@ -12,6 +12,8 @@ from django.utils.translation import ugettext_lazy as _ from openedx.core.djangoapps.site_configuration import helpers +from . import STUDENT_RECORDS_FLAG + API_VERSION = 'v2' @@ -84,7 +86,7 @@ class CredentialsApiConfig(ConfigurationModel): Publicly-accessible Records URL root. """ # Temporarily disable this feature while we work on it - if not waffle.switch_is_active('student_records'): + if not STUDENT_RECORDS_FLAG.is_enabled(): return None root = helpers.get_value('CREDENTIALS_PUBLIC_SERVICE_URL', settings.CREDENTIALS_PUBLIC_SERVICE_URL) return urljoin(root, '/records/') diff --git a/openedx/core/djangoapps/schedules/tasks.py b/openedx/core/djangoapps/schedules/tasks.py index c368773c39..08b11dc46d 100644 --- a/openedx/core/djangoapps/schedules/tasks.py +++ b/openedx/core/djangoapps/schedules/tasks.py @@ -216,6 +216,7 @@ def _track_message_sent(site, user, msg): 'language': msg.language, 'uuid': unicode(msg.uuid), 'send_uuid': unicode(msg.send_uuid), + 'nonInteraction': 1, } course_ids = msg.context.get('course_ids', []) properties['num_courses'] = len(course_ids) diff --git a/openedx/core/djangoapps/user_api/accounts/tests/test_models.py b/openedx/core/djangoapps/user_api/accounts/tests/test_models.py index 44eb229545..1f59f86c31 100644 --- a/openedx/core/djangoapps/user_api/accounts/tests/test_models.py +++ b/openedx/core/djangoapps/user_api/accounts/tests/test_models.py @@ -3,7 +3,12 @@ Model specific tests for user_api """ import pytest -from openedx.core.djangoapps.user_api.models import RetirementState, RetirementStateError, UserRetirementStatus +from openedx.core.djangoapps.user_api.models import ( + RetirementState, + RetirementStateError, + UserRetirementRequest, + UserRetirementStatus +) from student.models import get_retired_email_by_email, get_retired_username_by_username from student.tests.factories import UserFactory @@ -87,3 +92,47 @@ def test_retirement_create_already_retired(setup_retirement_states): # pylint: with pytest.raises(RetirementStateError): UserRetirementStatus.create_retirement(user) + + +def test_retirement_request_create_success(): + """ + Ensure that retirement request record creation succeeds. + """ + user = UserFactory() + UserRetirementRequest.create_retirement_request(user) + assert UserRetirementRequest.has_user_requested_retirement(user) + + +def test_retirement_request_created_upon_status(setup_retirement_states): # pylint: disable=unused-argument, redefined-outer-name + """ + Ensure that retirement request record is created upon retirement status creation. + """ + user = UserFactory() + UserRetirementStatus.create_retirement(user) + assert UserRetirementRequest.has_user_requested_retirement(user) + + +def test_retirement_request_deleted_upon_pending_status_delete(setup_retirement_states): # pylint: disable=unused-argument, redefined-outer-name + """ + Ensure that retirement request record is deleted upon deletion of a PENDING retirement status. + """ + user = UserFactory() + retirement_status = UserRetirementStatus.create_retirement(user) + assert UserRetirementRequest.has_user_requested_retirement(user) + pending = RetirementState.objects.all().order_by('state_execution_order')[0] + assert retirement_status.current_state == pending + retirement_status.delete() + assert not UserRetirementRequest.has_user_requested_retirement(user) + + +def test_retirement_request_preserved_upon_non_pending_status_delete(setup_retirement_states): # pylint: disable=unused-argument, redefined-outer-name + """ + Ensure that retirement request record is not deleted upon deletion of a non-PENDING retirement status. + """ + user = UserFactory() + retirement_status = UserRetirementStatus.create_retirement(user) + assert UserRetirementRequest.has_user_requested_retirement(user) + non_pending = RetirementState.objects.all().order_by('state_execution_order')[1] + retirement_status.current_state = non_pending + retirement_status.delete() + assert UserRetirementRequest.has_user_requested_retirement(user) diff --git a/openedx/core/djangoapps/user_api/admin.py b/openedx/core/djangoapps/user_api/admin.py index 0ea9aac4d4..62f3aae3b0 100644 --- a/openedx/core/djangoapps/user_api/admin.py +++ b/openedx/core/djangoapps/user_api/admin.py @@ -3,7 +3,7 @@ Django admin configuration pages for the user_api app """ from django.contrib import admin -from .models import RetirementState, UserRetirementStatus +from .models import RetirementState, UserRetirementStatus, UserRetirementRequest @admin.register(RetirementState) @@ -31,3 +31,15 @@ class UserRetirementStatusAdmin(admin.ModelAdmin): class Meta(object): model = UserRetirementStatus + + +@admin.register(UserRetirementRequest) +class UserRetirementRequestAdmin(admin.ModelAdmin): + """ + Admin interface for the UserRetirementRequestAdmin model. + """ + list_display = ('user', 'created') + raw_id_fields = ('user',) + + class Meta(object): + model = UserRetirementRequest diff --git a/openedx/core/djangoapps/user_api/models.py b/openedx/core/djangoapps/user_api/models.py index d73e92458a..8fce760f89 100644 --- a/openedx/core/djangoapps/user_api/models.py +++ b/openedx/core/djangoapps/user_api/models.py @@ -167,6 +167,38 @@ class RetirementState(models.Model): return cls.objects.all().values_list('state_name', flat=True) +class UserRetirementRequest(TimeStampedModel): + """ + Records and perists every user retirement request. + Users that have requested to cancel their retirement before retirement begins can be removed. + All other retired users persist in this table forever. + """ + user = models.OneToOneField(User) + + class Meta(object): + verbose_name = 'User Retirement Request' + verbose_name_plural = 'User Retirement Requests' + + @classmethod + def create_retirement_request(cls, user): + """ + Creates a UserRetirementRequest for the specified user. + """ + if cls.has_user_requested_retirement(user): + raise RetirementStateError('User {} already has a retirement request row!'.format(user)) + return cls.objects.create(user=user) + + @classmethod + def has_user_requested_retirement(cls, user): + """ + Checks to see if a UserRetirementRequest has been created for the specified user. + """ + return cls.objects.filter(user=user).exists() + + def __unicode__(self): + return u'User: {} Requested: {}'.format(self.user.id, self.created) + + class UserRetirementStatus(TimeStampedModel): """ Tracks the progress of a user's retirement request @@ -228,11 +260,13 @@ class UserRetirementStatus(TimeStampedModel): raise RetirementStateError('Default state does not exist! Populate retirement states to retire users.') if cls.objects.filter(user=user).exists(): - raise RetirementStateError('User {} already has a retirement row!'.format(user)) + raise RetirementStateError('User {} already has a retirement status row!'.format(user)) retired_username = get_retired_username_by_username(user.username) retired_email = get_retired_email_by_email(user.email) + UserRetirementRequest.create_retirement_request(user) + return cls.objects.create( user=user, original_username=user.username, @@ -282,3 +316,14 @@ class UserRetirementStatus(TimeStampedModel): def __unicode__(self): return u'User: {} State: {} Last Updated: {}'.format(self.user.id, self.current_state, self.modified) + + +@receiver(models.signals.post_delete, sender=UserRetirementStatus) +def remove_pending_retirement_request(sender, instance, **kwargs): # pylint: disable=unused-argument + """ + Whenever a UserRetirementStatus record is deleted, remove the user's UserRetirementRequest record + IFF the UserRetirementStatus record was still PENDING. + """ + pending_state = RetirementState.objects.filter(state_name='PENDING')[0] + if pending_state and instance.current_state == pending_state: + UserRetirementRequest.objects.filter(user=instance.user).delete() diff --git a/openedx/features/learner_profile/static/learner_profile/js/views/learner_profile_view.js b/openedx/features/learner_profile/static/learner_profile/js/views/learner_profile_view.js index 5bb9ad6da9..015245f796 100644 --- a/openedx/features/learner_profile/static/learner_profile/js/views/learner_profile_view.js +++ b/openedx/features/learner_profile/static/learner_profile/js/views/learner_profile_view.js @@ -126,7 +126,7 @@ fieldView.requiresParentalConsent = settings.get('requires_parental_consent'); fieldView.isAboveMinimumAge = settings.isAboveMinimumAge(); fieldView.undelegateEvents(); - this.$('.wrapper-profile-field-account-privacy').append(fieldView.render().el); + this.$('.wrapper-profile-field-account-privacy').prepend(fieldView.render().el); fieldView.delegateEvents(); } diff --git a/openedx/features/learner_profile/templates/learner_profile/learner_profile.html b/openedx/features/learner_profile/templates/learner_profile/learner_profile.html index 2dc6248773..010bc2193f 100644 --- a/openedx/features/learner_profile/templates/learner_profile/learner_profile.html +++ b/openedx/features/learner_profile/templates/learner_profile/learner_profile.html @@ -25,7 +25,15 @@ from openedx.core.djangolib.markup import HTML
- + % if own_profile:
${_("My Profile")}
@@ -33,10 +41,6 @@ from openedx.core.djangolib.markup import HTML ${_('Build out your profile to personalize your identity on {platform_name}.').format( platform_name=platform_name, )} - % if records_url: - ## We don't translate this yet because we know it's not the final string -

To view and share your program records, go to My Records.

- % endif
% endif diff --git a/openedx/features/learner_profile/tests/views/test_learner_profile.py b/openedx/features/learner_profile/tests/views/test_learner_profile.py index 061e1717cd..b3ecbf6217 100644 --- a/openedx/features/learner_profile/tests/views/test_learner_profile.py +++ b/openedx/features/learner_profile/tests/views/test_learner_profile.py @@ -4,7 +4,6 @@ import datetime import ddt import mock -from waffle.testutils import override_switch from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFactory # pylint: disable=import-error from lms.envs.test import CREDENTIALS_PUBLIC_SERVICE_URL @@ -14,6 +13,8 @@ from django.core.urlresolvers import reverse from django.test.client import RequestFactory from lms.djangoapps.certificates.api import is_passing_status from opaque_keys.edx.locator import CourseLocator +from openedx.core.djangoapps.credentials import STUDENT_RECORDS_FLAG +from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_flag from openedx.features.learner_profile.views.learner_profile import learner_profile_context from student.tests.factories import CourseEnrollmentFactory, UserFactory from util.testing import UrlResetMixin @@ -22,7 +23,7 @@ from xmodule.modulestore.tests.factories import CourseFactory @ddt.ddt -@override_switch('student_records', True) +@override_waffle_flag(STUDENT_RECORDS_FLAG, active=True) class LearnerProfileViewTest(UrlResetMixin, ModuleStoreTestCase): """ Tests for the student profile view. """ diff --git a/package-lock.json b/package-lock.json index 9e1bd53f22..aed17ff93f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@edx/cookie-policy-banner": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@edx/cookie-policy-banner/-/cookie-policy-banner-1.1.6.tgz", - "integrity": "sha512-uiK+jhncxzfncgoRT4H4Y5bj5yUMKPsPqtCdVXBN3a8DGcCMZMedNA73q+hpsioVSJGijRYloR1sm+zlkjgQsg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@edx/cookie-policy-banner/-/cookie-policy-banner-1.1.7.tgz", + "integrity": "sha512-Zzyg8LHjWFQrc8xMR3vJEMgKtMiHdiZ8BuwnLFhc4AUsVVzIBIYsbgSf7gXr4XC+0WRcT4uoKcMaTJ5xitWaHw==", "requires": { "@edx/edx-bootstrap": "0.4.3", "@edx/paragon": "2.6.4", @@ -10391,11 +10391,6 @@ } } }, - "url-search-params-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-search-params-polyfill/-/url-search-params-polyfill-3.0.0.tgz", - "integrity": "sha512-oRNWuBkJ/zKKK1aiBaTBZTf07zOKd0g+nJYB+vFNPO14gFjA75BaHgIJLtveWBRxI/2qff7xcTb9H6wkpTmqjg==" - }, "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", diff --git a/package.json b/package.json index a1882c188d..feddfef3c0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "edx", "version": "0.1.0", "dependencies": { - "@edx/cookie-policy-banner": "1.1.6", + "@edx/cookie-policy-banner": "1.1.7", "@edx/edx-bootstrap": "0.4.3", "@edx/paragon": "2.6.4", "@edx/studio-frontend": "1.9.9", @@ -55,7 +55,6 @@ "uglify-js": "2.7.0", "underscore": "1.8.3", "underscore.string": "3.3.4", - "url-search-params-polyfill": "3.0.0", "webpack": "2.7.0", "webpack-bundle-tracker": "0.2.1", "webpack-merge": "4.1.1",