diff --git a/common/djangoapps/student/tests/test_reset_password.py b/common/djangoapps/student/tests/test_reset_password.py index 6e45685a0915ec311a713e76a49c6e656d6c9c7f..0a6217c892023f4885fd7f042bc44e4e124af093 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 7b41f79aaf9dfe27d533618aa5f09b688a220acc..41e4a44b3e88526bc665e055d4648f6fccfd66cd 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 31019b1b72756af57ab0fcde8866a675372b6e0e..0700897aa22af0e13607681892e9f5024112281b 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 abed5e65fa2d4f39ebc7a946809c9df7cfb951d9..c920b33b61134d4410c430f015e59c45c0524f71 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 36a97c915fcc595a2f67c1b64f31cba5d237c412..c7d6d39f3f32a1323c9bd99a20ea1e8bfb969faf 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 <mr.fakih@gmail.com>\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 fc350af9f2f6c65a1643e66ff9add0b6db6179f9..177197a1cdf616ec4a0d947fc65f5e171043db35 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 b41bfb97ffb093b9e0caa3ffef8b601bf750db94..1c82e3aa97e7d2889498356866104042b1da974e 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 3d57e844f4c5f23d6ac2415f6d188189b5d127ce..52c25d96bbd3df6b10b95a44c465ffc22857ffea 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 <openedx-translation@googlegroups.com>\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 +#: lms/templates/emails/order_confirmation_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}" +"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/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 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 14ccf7d2503f40a1573b92a66c631aa150a79e2f..9ee20f1c5f83219a84afdfcd40ee1c09726090d4 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 <openedx-translation@googlegroups.com>\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 f1b21c9638143cc1ed423bec24eb790de732ad26..61a1197f697d546a44d22ea406ff9c993d34a7c1 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 cd57d98a53773ce8a4269845bf8cef93f9aa4eb9..ff64b1b4e667da10e52c7eff6e14b766e968f42b 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 <openedx-translation@googlegroups.com>\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." -msgstr "" -"À tränsçrïpt wïth thé \"{language_code}\" längüägé çödé älréädý éxïsts. " -"â± 'σÑєм ιÏѕυм âˆ‚ÏƒÅ‚ÏƒÑ Ñ•Î¹Ñ‚ αмєт, Â¢ÏƒÎ·Ñ•Ñ”Â¢Ñ‚Ñ”Ñ‚Ï…Ñ Î±#" +#: 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/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/transcripts_ajax.py +msgid "Video locator is required." +msgstr "Vïdéö löçätör ï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." +#: cms/djangoapps/contentstore/views/transcripts_ajax.py +msgid "This transcript file type is not supported." 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é. â± 'σÑєм ιÏѕυм âˆ‚ÏƒÅ‚ÏƒÑ Ñ•Î¹Ñ‚ αмєт, ¢σηѕє¢тєт#" +"Thïs tränsçrïpt fïlé týpé ïs nöt süppörtéd. â± 'σÑєм ιÏѕυм âˆ‚ÏƒÅ‚ÏƒÑ Ñ•Î¹Ñ‚ αмєт, " +"Â¢ÏƒÎ·Ñ•Ñ”Â¢Ñ‚Ñ”Ñ‚Ï…Ñ #" + +#: 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 8db0c950ac2bb94d8d93cbbfb2faf76709284ecf..2a9b3682102f6ad9d819c32bc9747fb08df5bb13 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 b8154b323f875d4951c179530c4b6f99c3bd973c..3de20b7bd764196112f80be8520f4a957e140f82 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 <openedx-translation@googlegroups.com>\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 54ad2aa7a7a245a561ec64c1d66aafa6bb4d5bbb..126962b0b3956b89a1fcb8803fb315f8346350b9 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 4d6bebda84e8920004c715d7809df7c4548881c6..b544773151d9d03e4396d3877eee4fa05da9ea50 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. <leonardocaballero@gmail.com>\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 32d107cdbd1d30b047b650501146edef01679f28..92ecb4beffcbd47718cc0d6be2ea1cc994187fcb 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 5bf5a98bcb7d05df439082abf28647dd550b8079..fe306b6e7a2dcd1c5f96cd43ad7dbd77373d7943 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 <juan.montoya@edunext.co>\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 459efeac0941677c258877ba0a9837d138655faf..2f780529fc66157038f7bb1f6bdedab070f30928 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 f2151990d5d1dc6ab924c27c4a977205a37866ac..163cef21b2a181bc7eb8860c9248435ba959eb46 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 3b3adefe89dfd7134d312576788cb581bfbbac5c..06826fde90ce64b17e8bab86e642cd1d25749897 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 f764f5f17066815f7894919ef2290b8360e1f73d..579bacbbb23db89658218e3fe6b12b30dfce48cf 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 <contact@moocit.fr>\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 58e43c17e08e769044e402bd88ecabaa32641fb8..b5faa03bc1c7cb6181727512c83721fe608518fd 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 8cd05d739755a7af8fe672b2f12658d5d6218cbe..d02e8a3bd899c9512c16bcc0cde8c3e1bef4c2f8 100644 --- a/conf/locale/he/LC_MESSAGES/django.po +++ b/conf/locale/he/LC_MESSAGES/django.po @@ -80,13 +80,14 @@ # Nadav Stark <nadav@yeda.org.il>, 2015 # Ned Batchelder <ned@edx.org>, 2016 # qualityalltext <quality@alltext.co.il>, 2016 +# Yaron Shahrabani <sh.yaron@gmail.com>, 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 <nadav@yeda.org.il>\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 <sh.yaron@gmail.com>\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 38c8127d48160232d214454bb1da9e7011c1c5e8..f9de4a10dded66b9d3292e5091f100b203de9e47 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 527357bd0f28192b0234b0a64429eaa187c5bdcf..561d38d7f8e2549143584e7f1385ea4ec266791d 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 <e2f_HE_c1@outlook.com>\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 d0c2d2e47d1d0d59ffbc45f99a5d5b4f4f41ca24..b4ad17dee5e19f1b294b5562f13d0ca8e43884f7 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 840515712aad7c53fdc14177115272dae738b6a2..401c547ae952d74e7363ccaaadef752370e1a446 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 <contactpayal@yahoo.com.au>\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 851561ca67ad76be578654b6ab98db8930af12e5..60f4beceb2638170f7c6e31e75c19b259e24b894 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 9d9a7e0b7ce48db14d640780cc47ebeecd196955..f402d76ca27add78d2653b98cefbfeb83ee4bca8 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 <i18n-working-group+edx-transifex-bot@edx.org>\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 46a4ee8292ea730903c9d6f0d7d2bce7f232020a..4a2b773ec744af4fad8ec9ba88d9dd694895b9e5 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 6c0170ca6081d9e17cb493885b780c934ae7531d..386eeacf179f2c65cc3b0023974834313f9bca2e 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 <shevious@gmail.com>\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 b55494ea8bf488fa1afd741c48907dd26e9a9b63..5c4845aa0c4aba38ab0ee18a90fd938d554c6f99 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 fb3a530ae59ed533e136a8cdb22069fe4f691a7f..cc25589d4e34a0453e5b2ce052b07ba1b6e92a9a 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 <shevious@gmail.com>\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 bec622ff18ddc882b7cdba194249ad971ce33508..38eaa01dc500f83bfd74e7dc0385ec749c5b6335 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 ce532c04d2d7530c8008d1274522b70e8c05abfc..c13e5b1126d46901c97c531648c965fc1b357eb7 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 <javier@jecnet.com.br>\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 fc6a8e502af2ba04ac916d7748db1a2fb65ab024..e7b0a6709d53ec0b3fa3fc937bcaca36f7b1d0ea 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 eaa4b687bef24593d87f3281801a5ed7f9c971a2..415e6545c49dbc8801c444f414953bb0bdb61ff5 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 <mariana.jsouza@gmail.com>\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 1c23a16c096012baf820f24368c83560267cc7c0..17b536eaeec69eb7db19ec6f49bd48c37210b813 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 c0b9ec1f71d6171f7488528191e3b85d2f5eb3d8..32ec298724c88a26e60940181f63b1030a9adcd6 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 <openedx-translation@googlegroups.com>\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 957a6315093de8772f332163ccb97172ae146dce..024465a2fb5b02f682ad3a4b1c486a811283d7df 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 dacf8d159f96af7b1e4e0b6edafb193ae6e56e67..4a0da07d5dadfff3a26e07f14b9ee7a37be6de7d 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 <openedx-translation@googlegroups.com>\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 8123f7d47c9eb9209f0bad0aad30440dc70d555b..9e0df9163c2da66ea4ef52face0909dd36076e64 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 50c0102eb0568bc1b676c2595f238b46fd53a459..cbcebde1449e65c3e95b217b31f3828462e49f4c 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 <omaksimenkova@hse.ru>\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 29649321d2f24886db1732f0dd2e810d9adaef44..8314bf440c2225057a602efc9db92a81c6070c21 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 c28eb7b6dfc11b9810d107b37bdf743836edb46b..a29b82ef0d75c24aced3f7b1037f21c0963a5506 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 <weyedide@gmail.com>\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 13e563ea8647297501273215650ac2ab161504a6..592ad341ed15549713535cfa9f1483e7d40d4b95 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 3e1e0173122d414dd46da218554de946f6e562ab..2eb1e0f88134cc8e7cd3a9101ac58da37026efcb 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 <zhaojianwei187@126.com>\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 db0292af12b2fbae65403520973c9504feb57430..e61e43d6b880f3bc20b353aad966b5be0b2a8405 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 c123d58f1d18da4ae51c2dd50cd9a425539a413d..3142b53e8a83f375316ce5a5134b3c4c50bc7f62 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 <github@zhujunsan.net>\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 13e563ea8647297501273215650ac2ab161504a6..592ad341ed15549713535cfa9f1483e7d40d4b95 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 3e1e0173122d414dd46da218554de946f6e562ab..2eb1e0f88134cc8e7cd3a9101ac58da37026efcb 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 <zhaojianwei187@126.com>\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 db0292af12b2fbae65403520973c9504feb57430..e61e43d6b880f3bc20b353aad966b5be0b2a8405 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 c123d58f1d18da4ae51c2dd50cd9a425539a413d..3142b53e8a83f375316ce5a5134b3c4c50bc7f62 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 <github@zhujunsan.net>\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 dc68c1ee21946c8aa582f21f0f2ef43b0fb4843f..9bd92199672a1abd6414d4008d892a7da7d205dc 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 537108cc880bcd9dc8d465a54fcc7c409504d40c..380b1e630f44e95d7d976bd3cb1dc9183a70ac4b 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 00b173e16fa635ba8066d4a54c5770f06fe7e832..4f371acdbd32ba9670a1eae304e9ebdde82c9e23 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 fcad31052703f024c5fef2e8cba663c21e17616d..21fadbdc3656464c407b379e1a90f33b7648709c 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 1c46efc66c09c8814c4c4774f71e75f5397eb547..2072d36701ccbdeedecffabb705aa6d42dc3de06 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 ff4191c33b78326dbee8e28c67f65970d52ace2f..8164c7b66fae0433ec27db7b62de3dc94dee2fd7 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 0a19cd16220b40d94480a757d7ea6f0b7aeef543..37244550b2925768b4b7c92798a07dea70f4c957 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 f3bd35fe5ef47ca2d8403690d980a7bf48ee8cdb..f219f3c540ec1132cc5546010d91891c15080633 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 ecde6b752124e8429df21b7b230827fc4a3583f6..2dd229efa44d4824f4b47082965c057e66f21d37 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 602ddd6d1e253a37908f06e8718767baa651aa9f..fe5ba95bdd09f114560a58588460cfe6101307f4 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 7e677f4ef087b985464dfdd8a7b115239f4ca30f..6c18a036272a7042061b3b7d5022d0e2fb152607 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 109a119a60a806c7ad6a14a357398fa3a7de4fa1..95f799fa6033b0d6933dbbd72f7e95d4bec4e639 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_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), + } - def test_do_not_recalculate_complex_courses(self): + 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), } - 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) + 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 a3662a1c4c4154ca41a912db1a112fc0f2ddc667..5387b733aa5b8406c5631300645bc234c4731d3a 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 cdae548483f19c7154fe4b255462a64e2710dd60..54edf2df702ed06e7566637612d75fb971122f6c 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 f4c896f16f093229f3656bfba28f0c3634d8d2a9..4f5e933ee07263703fc893ab6a54dd434784458d 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 2ffbb41aaa86e476291c9f01fe89db654f739504..8fadf5e18437f66432855abdf4e0589ddd6369e3 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 5c48fa5871915ffdeeda00c0e185c51be594332e..9958d723cddeb2747f1e2d9ac8a5e63b5a598710 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 6ded24172b3c3ad091da3960a360d0bc6d025f2e..228b050ceefe169497c20f409ddea0cafabec9ac 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 24f0ce19111afb03941e4952f459ce7a996cfab1..3f3e1ea7367644362b88b09a72bf834e661fb198 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) { %> <aside class="aside js-program-record program-record"> <a href="<%- programRecordUrl %>" class="program-record-link"> - <button class="program-record-button"><%- gettext('View Program Record') %></button> + <button class="btn program-record-button"><%- gettext('View Program Record') %></button> </a> </aside> <% } %> diff --git a/lms/templates/login.html b/lms/templates/login.html index 5b81c5fda67353eb164d1df878936167659f18a3..bd8060685f41265d44c63e9b34a72fd549e3f818 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)} <span class='orn-plus'>+</span> ${_('Access My Courses')}"); } else { diff --git a/lms/templates/register.html b/lms/templates/register.html index b273dbf36df5e8f48b3bac296288ec2e95f5440a..1eaff34fe3ab1199e2018b2cae2c8354641e1cc6 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 a6bc969de6dbbf2cbcf0cbcc8cde5a21beae571c..1bff2b9dac09254f07f2e163dc05589616159041 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 ""}> <span class="icon fa seq_${item['type']}" aria-hidden="true"></span> diff --git a/openedx/core/djangoapps/credentials/__init__.py b/openedx/core/djangoapps/credentials/__init__.py index b7c6418ae687bef43012840c7cd7456e3f84afc3..106a5a5257c31ebafe9ad17601ef7cb2719a6560 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 a1005ec4cbd0b53e9364c4874865716bc7b81f46..bab4f940798068ac97b971a211a7b8bb65a698ac 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 c368773c39276a8bd0e52cc8c4a79be2688696ac..08b11dc46d1f8383e0fcf2cbe1388f827738256a 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 44eb229545c6ad9357281f8d4e431763867f2831..1f59f86c311341ec422877b0b88f8da76ad99a58 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 0ea9aac4d4355b64c8c1007c49f29832c9795237..62f3aae3b0ea882e29accdceea695a0091f63204 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 d73e92458ad69079df7befa9dd1fd96e11e994a4..8fce760f8937ba56ad08ed23423a0fa706adfa08 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 5bb9ad6da9bf8f06fa1cfe55eda4165459b54012..015245f7960fd5b535238b02057c5fe3aeb35d68 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 2dc6248773bffc82be7b7e179afcde80f188f25e..010bc2193f8cc685bf53a705bbe061f0e64d361c 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 <main id="main" aria-label="Content" tabindex="-1"> <div class="wrapper-profile"> <div class="profile ${'profile-self' if own_profile else 'profile-other'}"> - <div class="wrapper-profile-field-account-privacy"></div> + <div class="wrapper-profile-field-account-privacy"> + % if own_profile and records_url: + <div class="wrapper-profile-records"> + <a href="${records_url}"> + <button class="btn profile-records-button">${_("View My Records")}</button> + </a> + </div> + % endif + </div> % if own_profile: <div class="profile-header"> <div class="header">${_("My Profile")}</div> @@ -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 - <p>To view and share your program records, go to <a href="${records_url}">My Records</a>.</p> - % endif </div> </div> % 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 061e1717cd0e8853d38e22e5268dd7f855851923..b3ecbf62176940efc8de87088842c4088319a281 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 9e1bd53f22439f70415c1c380ee4e6b45c0deba0..aed17ff93f350f08f511df3267c8ac05973d485e 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 a1882c188d4c3acea7f2745b42f6579b14e642ed..feddfef3c0b6cc56149adf485b6ebadfd36b5514 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",