Merge branch 'master' into release-mergeback-to-master

This commit is contained in:
Alex Dusenbery
2018-05-14 17:01:50 -04:00
committed by GitHub
86 changed files with 1354 additions and 503 deletions

View File

@@ -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}

View File

@@ -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,

View File

@@ -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:

Binary file not shown.

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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
msgid ""
"Sorry! The photos you submitted for ID verification were not accepted, for "
"the following reason(s):"
msgstr ""
#: lms/templates/emails/failed_verification_email.txt
msgid "The photo(s) of you: {reason}"
msgstr ""
#: lms/templates/emails/failed_verification_email.txt
msgid "Resubmit Verification: {reverify_url}"
msgstr ""
#: lms/templates/emails/failed_verification_email.txt
#: lms/templates/emails/order_confirmation_email.txt
#: lms/templates/emails/photo_submission_confirmation.txt
#: lms/templates/emails/successfull_verification_email.txt
msgid "Thank you,"
msgstr ""
#: lms/templates/emails/failed_verification_email.txt
#: lms/templates/emails/photo_submission_confirmation.txt
#: lms/templates/emails/reverification_processed.txt
#: lms/templates/emails/successfull_verification_email.txt
msgid "The {platform_name} team"
msgstr ""
#: lms/templates/emails/order_confirmation_email.txt
msgid ""
"Your payment was successful. You will see the charge below on your next "
"credit or debit card statement under the company name {merchant_name}."
msgstr ""
#: lms/templates/emails/order_confirmation_email.txt
#: lms/templates/emails/photo_submission_confirmation.txt
msgid "Thank you,"
msgstr ""
#: lms/templates/emails/order_confirmation_email.txt
msgid "Your order number is: {order_number}"
msgstr ""
#: lms/templates/emails/photo_submission_confirmation.txt
#: lms/templates/emails/successfull_verification_email.txt
msgid "Hi {full_name},"
msgstr ""
@@ -15883,6 +15936,11 @@ msgid ""
"verification process on your dashboard."
msgstr ""
#: lms/templates/emails/photo_submission_confirmation.txt
#: lms/templates/emails/reverification_processed.txt
msgid "The {platform_name} team"
msgstr ""
#: lms/templates/emails/registration_codes_sale_email.txt
msgid "Thank you for purchasing enrollments in {course_name}."
msgstr ""
@@ -16069,15 +16127,6 @@ msgstr ""
msgid "Thanks,"
msgstr ""
#: lms/templates/emails/successfull_verification_email.txt
msgid "Congratulations! Your ID verification process was successful."
msgstr ""
#: lms/templates/emails/successfull_verification_email.txt
msgid ""
"Your verification is effective for one year. It will expire on {expiry_date}"
msgstr ""
#: lms/templates/emails/unenroll_email_allowedmessage.txt
msgid "Dear Student,"
msgstr ""
@@ -19069,6 +19118,10 @@ msgstr ""
msgid "Explore New Courses"
msgstr ""
#: openedx/features/learner_profile/templates/learner_profile/learner_profile.html
msgid "View My Records"
msgstr ""
#: openedx/features/learner_profile/templates/learner_profile/learner_profile.html
msgid "My Profile"
msgstr ""

View File

@@ -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 ""

Binary file not shown.

View File

@@ -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 єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαα αłι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 єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя "
"ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαα αłι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 "
"єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαα αłιqυα. υт "
"єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт "
"αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη "
"νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ρ#"
#: openedx/core/djangoapps/profile_images/images.py
#, python-brace-format
msgid "The file must be smaller than {image_max_size} in size."
@@ -14053,31 +14135,29 @@ msgstr ""
"Thé ïnförmätïön ýöü éntéréd ïs ïnçörréçt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тєтυя #"
#: cms/djangoapps/contentstore/views/transcript_settings.py
#, python-brace-format
msgid "The following parameters are required: {missing}."
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "Transcripts are supported only for \"video\" modules."
msgstr ""
"Thé föllöwïng pärämétérs äré réqüïréd: {missing}. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
"αмєт, ¢σηѕє¢тєтυя #"
"Tränsçrïpts äré süppörtéd önlý för \"vïdéö\" mödülés. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт"
" αмєт, ¢σηѕє¢тєтυя α#"
#: cms/djangoapps/contentstore/views/transcript_settings.py
#, python-brace-format
msgid "A transcript with the \"{language_code}\" language code already exists."
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "Cannot find item by locator."
msgstr "Çännöt fïnd ïtém ßý löçätör. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#"
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "Video locator is required."
msgstr "Vïdéö löçätör ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "This transcript file type is not supported."
msgstr ""
"À tränsçrïpt wïth thé \"{language_code}\" längüägé çödé älréädý éxïsts. "
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
"Thïs tränsçrïpt fïlé týpé ïs nöt süppörtéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тєтυя #"
#: cms/djangoapps/contentstore/views/transcript_settings.py
msgid "A transcript file is required."
msgstr "À tränsçrïpt fïlé ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
#: cms/djangoapps/contentstore/views/transcript_settings.py
msgid ""
"There is a problem with this transcript file. Try to upload a different "
"file."
msgstr ""
"Théré ïs ä prößlém wïth thïs tränsçrïpt fïlé. Trý tö üplöäd ä dïfférént "
"fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#"
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "Video ID is required."
msgstr "Vïdéö ÌD ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "Incoming video data is empty."
@@ -14088,10 +14168,32 @@ msgid "Can't find item by locator."
msgstr "Çän't fïnd ïtém ßý löçätör. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє#"
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "Transcripts are supported only for \"video\" modules."
msgid "No such transcript."
msgstr "Nö süçh tränsçrïpt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#"
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
msgid "There is a problem with the chosen transcript file."
msgstr ""
"Tränsçrïpts äré süppörtéd önlý för \"vïdéö\" mödü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é Ⱡ'σяєм ιρѕυм ∂σłσ#"

View File

@@ -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üé Ⱡ'σяєм ιρѕυм ∂σłσя #"

View File

@@ -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"

View File

@@ -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!"

Binary file not shown.

View File

@@ -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."

View File

@@ -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 ""

Binary file not shown.

View File

@@ -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."

View File

@@ -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 ""

Binary file not shown.

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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 "وغ حقخبهمث"

View File

@@ -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 "ذمثشق دشمعث"

Binary file not shown.

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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."

View File

@@ -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 ""

View File

@@ -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
))

View File

@@ -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)

View File

@@ -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,
}
)

View File

@@ -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 = [

View File

@@ -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'],

View File

@@ -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(

View File

@@ -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)

View File

@@ -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(

View File

@@ -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)

View File

@@ -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):
"""

View File

@@ -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')

View File

@@ -485,22 +485,39 @@ class RecalculateGradesForUserTest(HasCourseWithProblemsMixin, ModuleStoreTestCa
self.user = UserFactory.create()
self.set_up_course()
CourseEnrollment.enroll(self.user, self.course.id)
self.original_max_visible_blocks_allowed = tasks.MAX_VISIBLE_BLOCKS_ALLOWED
tasks.MAX_VISIBLE_BLOCKS_ALLOWED = -1
def tearDown(self):
super(RecalculateGradesForUserTest, self).tearDown()
tasks.MAX_VISIBLE_BLOCKS_ALLOWED = self.original_max_visible_blocks_allowed
def test_do_not_recalculate_complex_courses(self):
def test_recalculation_happy_path(self):
with patch('lms.djangoapps.grades.tasks.CourseGradeFactory') as mock_factory:
factory = mock_factory.return_value
factory.read.return_value = MagicMock(attempted=True)
kwargs = {
'user_id': self.user.id,
'course_key': six.text_type(self.course.id),
}
with self.assertRaisesRegexp(Exception, 'too many VisibleBlocks'):
task_result = tasks.recalculate_course_and_subsection_grades_for_user.apply_async(kwargs=kwargs)
task_result.get()
update = mock_factory.return_value.update
self.assertFalse(update.called)
task_result = tasks.recalculate_course_and_subsection_grades_for_user.apply_async(kwargs=kwargs)
task_result.get()
factory.read.assert_called_once_with(self.user, course_key=self.course.id)
factory.update.assert_called_once_with(
user=self.user,
course_key=self.course.id,
force_update_subsections=True,
)
def test_recalculation_doesnt_happen_if_not_previously_attempted(self):
with patch('lms.djangoapps.grades.tasks.CourseGradeFactory') as mock_factory:
factory = mock_factory.return_value
factory.read.return_value = MagicMock(attempted=False)
kwargs = {
'user_id': self.user.id,
'course_key': six.text_type(self.course.id),
}
task_result = tasks.recalculate_course_and_subsection_grades_for_user.apply_async(kwargs=kwargs)
task_result.get()
factory.read.assert_called_once_with(self.user, course_key=self.course.id)
self.assertFalse(factory.update.called)

View File

@@ -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

View File

@@ -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)

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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);

View File

@@ -632,6 +632,7 @@
.program-record {
text-align: center;
padding-bottom: 2em;
}
@media (min-width: $bp-screen-md) {

View File

@@ -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>
<% } %>

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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>

View File

@@ -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')

View File

@@ -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/')

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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()

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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. """

11
package-lock.json generated
View File

@@ -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",

View File

@@ -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",