Merge branch 'master' into release-mergeback-to-master
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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 ""
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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.
@@ -32,8 +32,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.1a\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2018-04-29 20:36+0000\n"
|
||||
"PO-Revision-Date: 2018-04-29 20:36:21.101798\n"
|
||||
"POT-Creation-Date: 2018-05-13 20:37+0000\n"
|
||||
"PO-Revision-Date: 2018-05-13 20:37:05.585963\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
||||
"Language: en\n"
|
||||
@@ -93,6 +93,38 @@ msgstr "Ûnït Ⱡ'σяєм ι#"
|
||||
msgid "Empty"
|
||||
msgstr "Émptý Ⱡ'σяєм ιρѕ#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
#: common/lib/xmodule/xmodule/video_module/video_handlers.py
|
||||
#, python-brace-format
|
||||
msgid "The following parameters are required: {missing}."
|
||||
msgstr ""
|
||||
"Thé föllöwïng pärämétérs äré réqüïréd: {missing}. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
|
||||
"αмєт, ¢σηѕє¢тєтυя #"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
#: common/lib/xmodule/xmodule/video_module/video_handlers.py
|
||||
#, python-brace-format
|
||||
msgid "A transcript with the \"{language_code}\" language code already exists."
|
||||
msgstr ""
|
||||
"À tränsçrïpt wïth thé \"{language_code}\" längüägé çödé älréädý éxïsts. "
|
||||
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
#: common/lib/xmodule/xmodule/video_module/video_handlers.py
|
||||
msgid "A transcript file is required."
|
||||
msgstr "À tränsçrïpt fïlé ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
#: common/lib/xmodule/xmodule/video_module/video_handlers.py
|
||||
msgid ""
|
||||
"There is a problem with this transcript file. Try to upload a different "
|
||||
"file."
|
||||
msgstr ""
|
||||
"Théré ïs ä prößlém wïth thïs tränsçrïpt fïlé. Trý tö üplöäd ä dïfférént "
|
||||
"fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/videos.py
|
||||
#: lms/djangoapps/class_dashboard/dashboard_data.py
|
||||
#: lms/djangoapps/instructor/views/api.py lms/templates/help_modal.html
|
||||
@@ -856,6 +888,7 @@ msgstr ""
|
||||
" ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
|
||||
|
||||
#: common/djangoapps/student/views/login.py
|
||||
#: openedx/core/djangoapps/user_api/accounts/views.py
|
||||
msgid ""
|
||||
"This account has been temporarily locked due to excessive login failures. "
|
||||
"Try again later."
|
||||
@@ -902,7 +935,9 @@ msgstr ""
|
||||
"Töö mäný fäïléd lögïn ättémpts. Trý ägäïn lätér. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
|
||||
"αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: common/djangoapps/student/views/login.py lms/templates/provider_login.html
|
||||
#: common/djangoapps/student/views/login.py
|
||||
#: openedx/core/djangoapps/user_api/accounts/views.py
|
||||
#: lms/templates/provider_login.html
|
||||
msgid "Email or password is incorrect."
|
||||
msgstr "Émäïl ör pässwörd ïs ïnçörréçt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
|
||||
|
||||
@@ -917,6 +952,15 @@ msgid "Unable to send reactivation email"
|
||||
msgstr ""
|
||||
"Ûnäßlé tö sénd réäçtïvätïön émäïl Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тє#"
|
||||
|
||||
#: common/djangoapps/student/views/login.py
|
||||
msgid "Superuser creation not allowed"
|
||||
msgstr "Süpérüsér çréätïön nöt ällöwéd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
|
||||
|
||||
#: common/djangoapps/student/views/login.py
|
||||
msgid "Account modification not allowed."
|
||||
msgstr ""
|
||||
"Àççöünt mödïfïçätïön nöt ällöwéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тє#"
|
||||
|
||||
#: common/djangoapps/student/views/login.py
|
||||
#: common/djangoapps/student/views/management.py
|
||||
#: openedx/core/djangoapps/user_api/accounts/api.py
|
||||
@@ -5386,10 +5430,8 @@ msgstr ""
|
||||
" ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_handlers.py
|
||||
msgid "Invalid encoding type, transcripts should be UTF-8 encoded."
|
||||
msgstr ""
|
||||
"Ìnvälïd énçödïng týpé, tränsçrïpts shöüld ßé ÛTF-8 énçödéd. Ⱡ'σяєм ιρѕυм "
|
||||
"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
msgid "Language is required."
|
||||
msgstr "Längüägé ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_module.py
|
||||
msgid "Basic"
|
||||
@@ -7812,6 +7854,18 @@ msgstr ""
|
||||
"Säïlthrü sénd témpläté tö üsé ön énröllïng för äüdït. Ⱡ'σяєм ιρѕυм ∂σłσя "
|
||||
"ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: lms/djangoapps/email_marketing/models.py
|
||||
msgid "Sailthru send template to use on passed ID verification."
|
||||
msgstr ""
|
||||
"Säïlthrü sénd témpläté tö üsé ön pässéd ÌD vérïfïçätïön. Ⱡ'σяєм ιρѕυм ∂σłσя "
|
||||
"ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: lms/djangoapps/email_marketing/models.py
|
||||
msgid "Sailthru send template to use on failed ID verification."
|
||||
msgstr ""
|
||||
"Säïlthrü sénd témpläté tö üsé ön fäïléd ÌD vérïfïçätïön. Ⱡ'σяєм ιρѕυм ∂σłσя "
|
||||
"ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: lms/djangoapps/email_marketing/models.py
|
||||
msgid "Sailthru send template to use on upgrading a course. Deprecated "
|
||||
msgstr ""
|
||||
@@ -10968,15 +11022,6 @@ msgstr ""
|
||||
"Ýöür {platform_name} vérïfïçätïön häs éxpïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тєт#"
|
||||
|
||||
#: lms/djangoapps/verify_student/utils.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Could not send verification status email having subject: {subject} and email"
|
||||
" of user: {email}"
|
||||
msgstr ""
|
||||
"Çöüld nöt sénd vérïfïçätïön stätüs émäïl hävïng süßjéçt: {subject} änd émäïl"
|
||||
" öf üsér: {email} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
|
||||
|
||||
#: lms/djangoapps/verify_student/views.py
|
||||
msgid "Intro"
|
||||
msgstr "Ìntrö Ⱡ'σяєм ιρѕ#"
|
||||
@@ -12535,6 +12580,43 @@ msgstr ""
|
||||
" Pléäsé trý löggïng ïn ägäïn. (Ýöü mäý nééd tö réstärt ýöür ßröwsér.)\n"
|
||||
" Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒ#"
|
||||
|
||||
#: openedx/core/djangoapps/password_policy/apps.py
|
||||
msgid "Password Policy"
|
||||
msgstr "Pässwörd Pölïçý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
|
||||
|
||||
#: openedx/core/djangoapps/password_policy/compliance.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{platform_name} now requires more complex passwords. Your current password "
|
||||
"does not meet the new requirements. Change your password now to continue "
|
||||
"using the site. Thank you for helping us keep your data safe."
|
||||
msgstr ""
|
||||
"{platform_name} nöw réqüïrés möré çömpléx pässwörds. Ýöür çürrént pässwörd "
|
||||
"döés nöt méét thé néw réqüïréménts. Çhängé ýöür pässwörd nöw tö çöntïnüé "
|
||||
"üsïng thé sïté. Thänk ýöü för hélpïng üs kéép ýöür dätä säfé. Ⱡ'σяєм ιρѕυм "
|
||||
"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя "
|
||||
"ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ "
|
||||
"ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ "
|
||||
"¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє "
|
||||
"¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι#"
|
||||
|
||||
#: openedx/core/djangoapps/password_policy/compliance.py
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{platform_name} now requires more complex passwords. Your current password "
|
||||
"does not meet the new requirements. You must change your password by "
|
||||
"{deadline} to be able to continue using the site. Thank you for helping us "
|
||||
"keep your data safe."
|
||||
msgstr ""
|
||||
"{platform_name} nöw réqüïrés möré çömpléx pässwörds. Ýöür çürrént pässwörd "
|
||||
"döés nöt méét thé néw réqüïréménts. Ýöü müst çhängé ýöür pässwörd ßý "
|
||||
"{deadline} tö ßé äßlé tö çöntïnüé üsïng thé sïté. Thänk ýöü för hélpïng üs "
|
||||
"kéép ýöür dätä säfé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg "
|
||||
"єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт "
|
||||
"єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт "
|
||||
"αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη "
|
||||
"νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ρ#"
|
||||
|
||||
#: openedx/core/djangoapps/profile_images/images.py
|
||||
#, python-brace-format
|
||||
msgid "The file must be smaller than {image_max_size} in size."
|
||||
@@ -14053,31 +14135,29 @@ msgstr ""
|
||||
"Thé ïnförmätïön ýöü éntéréd ïs ïnçörréçt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тєтυя #"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
#, python-brace-format
|
||||
msgid "The following parameters are required: {missing}."
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "Transcripts are supported only for \"video\" modules."
|
||||
msgstr ""
|
||||
"Thé föllöwïng pärämétérs äré réqüïréd: {missing}. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
|
||||
"αмєт, ¢σηѕє¢тєтυя #"
|
||||
"Tränsçrïpts äré süppörtéd önlý för \"vïdéö\" mödülés. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт"
|
||||
" αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
#, python-brace-format
|
||||
msgid "A transcript with the \"{language_code}\" language code already exists."
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "Cannot find item by locator."
|
||||
msgstr "Çännöt fïnd ïtém ßý löçätör. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "Video locator is required."
|
||||
msgstr "Vïdéö löçätör ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "This transcript file type is not supported."
|
||||
msgstr ""
|
||||
"À tränsçrïpt wïth thé \"{language_code}\" längüägé çödé älréädý éxïsts. "
|
||||
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
"Thïs tränsçrïpt fïlé týpé ïs nöt süppörtéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тєтυя #"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
msgid "A transcript file is required."
|
||||
msgstr "À tränsçrïpt fïlé ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcript_settings.py
|
||||
msgid ""
|
||||
"There is a problem with this transcript file. Try to upload a different "
|
||||
"file."
|
||||
msgstr ""
|
||||
"Théré ïs ä prößlém wïth thïs tränsçrïpt fïlé. Trý tö üplöäd ä dïfférént "
|
||||
"fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#"
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "Video ID is required."
|
||||
msgstr "Vïdéö ÌD ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "Incoming video data is empty."
|
||||
@@ -14088,10 +14168,32 @@ msgid "Can't find item by locator."
|
||||
msgstr "Çän't fïnd ïtém ßý löçätör. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "Transcripts are supported only for \"video\" modules."
|
||||
msgid "No such transcript."
|
||||
msgstr "Nö süçh tränsçrïpt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "There is a problem with the chosen transcript file."
|
||||
msgstr ""
|
||||
"Tränsçrïpts äré süppörtéd önlý för \"vïdéö\" mödülés. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт"
|
||||
" αмєт, ¢σηѕє¢тєтυя α#"
|
||||
"Théré ïs ä prößlém wïth thé çhösén tränsçrïpt fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
|
||||
"αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid ""
|
||||
"There is a problem with the existing transcript file. Please upload a "
|
||||
"different file."
|
||||
msgstr ""
|
||||
"Théré ïs ä prößlém wïth thé éxïstïng tränsçrïpt fïlé. Pléäsé üplöäd ä "
|
||||
"dïfférént fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "YouTube ID is required."
|
||||
msgstr "ÝöüTüßé ÌD ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σ#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/transcripts_ajax.py
|
||||
msgid "There is a problem with the YouTube transcript file."
|
||||
msgstr ""
|
||||
"Théré ïs ä prößlém wïth thé ÝöüTüßé tränsçrïpt fïlé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
|
||||
"αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/user.py
|
||||
msgid "Insufficient permissions"
|
||||
@@ -20131,37 +20233,6 @@ msgid "You have been enrolled in {course_name}"
|
||||
msgstr ""
|
||||
"Ýöü hävé ßéén énrölléd ïn {course_name} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢#"
|
||||
|
||||
#: lms/templates/emails/failed_verification_email.txt
|
||||
msgid ""
|
||||
"Sorry! The photos you submitted for ID verification were not accepted, for "
|
||||
"the following reason(s):"
|
||||
msgstr ""
|
||||
"Sörrý! Thé phötös ýöü süßmïttéd för ÌD vérïfïçätïön wéré nöt äççéptéd, för "
|
||||
"thé föllöwïng réäsön(s): Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт#"
|
||||
|
||||
#: lms/templates/emails/failed_verification_email.txt
|
||||
msgid "The photo(s) of you: {reason}"
|
||||
msgstr "Thé phötö(s) öf ýöü: {reason} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢ση#"
|
||||
|
||||
#: lms/templates/emails/failed_verification_email.txt
|
||||
msgid "Resubmit Verification: {reverify_url}"
|
||||
msgstr ""
|
||||
"Résüßmït Vérïfïçätïön: {reverify_url} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
|
||||
|
||||
#: lms/templates/emails/failed_verification_email.txt
|
||||
#: lms/templates/emails/order_confirmation_email.txt
|
||||
#: lms/templates/emails/photo_submission_confirmation.txt
|
||||
#: lms/templates/emails/successfull_verification_email.txt
|
||||
msgid "Thank you,"
|
||||
msgstr "Thänk ýöü, Ⱡ'σяєм ιρѕυм ∂σłσ#"
|
||||
|
||||
#: lms/templates/emails/failed_verification_email.txt
|
||||
#: lms/templates/emails/photo_submission_confirmation.txt
|
||||
#: lms/templates/emails/reverification_processed.txt
|
||||
#: lms/templates/emails/successfull_verification_email.txt
|
||||
msgid "The {platform_name} team"
|
||||
msgstr "Thé {platform_name} téäm Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
|
||||
|
||||
#: lms/templates/emails/order_confirmation_email.txt
|
||||
msgid ""
|
||||
"Your payment was successful. You will see the charge below on your next "
|
||||
@@ -20170,13 +20241,17 @@ msgstr ""
|
||||
"Ýöür päýmént wäs süççéssfül. Ýöü wïll séé thé çhärgé ßélöw ön ýöür néxt "
|
||||
"çrédït ör déßït çärd stätémént ündér thé çömpäný nämé {merchant_name}. Ⱡ'#"
|
||||
|
||||
#: lms/templates/emails/order_confirmation_email.txt
|
||||
#: lms/templates/emails/photo_submission_confirmation.txt
|
||||
msgid "Thank you,"
|
||||
msgstr "Thänk ýöü, Ⱡ'σяєм ιρѕυм ∂σłσ#"
|
||||
|
||||
#: lms/templates/emails/order_confirmation_email.txt
|
||||
msgid "Your order number is: {order_number}"
|
||||
msgstr ""
|
||||
"Ýöür ördér nümßér ïs: {order_number} Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
|
||||
|
||||
#: lms/templates/emails/photo_submission_confirmation.txt
|
||||
#: lms/templates/emails/successfull_verification_email.txt
|
||||
msgid "Hi {full_name},"
|
||||
msgstr "Hï {full_name}, Ⱡ'σяєм ιρѕυм #"
|
||||
|
||||
@@ -20201,6 +20276,11 @@ msgstr ""
|
||||
"υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє "
|
||||
"∂σłσя ιη яєρяєнєη∂єяιт ι#"
|
||||
|
||||
#: lms/templates/emails/photo_submission_confirmation.txt
|
||||
#: lms/templates/emails/reverification_processed.txt
|
||||
msgid "The {platform_name} team"
|
||||
msgstr "Thé {platform_name} téäm Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
|
||||
|
||||
#: lms/templates/emails/registration_codes_sale_email.txt
|
||||
msgid "Thank you for purchasing enrollments in {course_name}."
|
||||
msgstr ""
|
||||
@@ -20476,19 +20556,6 @@ msgstr ""
|
||||
msgid "Thanks,"
|
||||
msgstr "Thänks, Ⱡ'σяєм ιρѕυм #"
|
||||
|
||||
#: lms/templates/emails/successfull_verification_email.txt
|
||||
msgid "Congratulations! Your ID verification process was successful."
|
||||
msgstr ""
|
||||
"Çöngrätülätïöns! Ýöür ÌD vérïfïçätïön pröçéss wäs süççéssfül. Ⱡ'σяєм ιρѕυм "
|
||||
"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: lms/templates/emails/successfull_verification_email.txt
|
||||
msgid ""
|
||||
"Your verification is effective for one year. It will expire on {expiry_date}"
|
||||
msgstr ""
|
||||
"Ýöür vérïfïçätïön ïs éfféçtïvé för öné ýéär. Ìt wïll éxpïré ön {expiry_date}"
|
||||
" Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
|
||||
|
||||
#: lms/templates/emails/unenroll_email_allowedmessage.txt
|
||||
msgid "Dear Student,"
|
||||
msgstr "Déär Stüdént, Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#"
|
||||
@@ -24294,6 +24361,10 @@ msgstr ""
|
||||
msgid "Explore New Courses"
|
||||
msgstr "Éxplöré Néw Çöürsés Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#"
|
||||
|
||||
#: openedx/features/learner_profile/templates/learner_profile/learner_profile.html
|
||||
msgid "View My Records"
|
||||
msgstr "Vïéw Mý Réçörds Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
|
||||
|
||||
#: openedx/features/learner_profile/templates/learner_profile/learner_profile.html
|
||||
msgid "My Profile"
|
||||
msgstr "Mý Pröfïlé Ⱡ'σяєм ιρѕυм ∂σłσ#"
|
||||
|
||||
Binary file not shown.
@@ -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üé Ⱡ'σяєм ιρѕυм ∂σłσя #"
|
||||
|
||||
|
||||
Binary file not shown.
@@ -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"
|
||||
|
||||
Binary file not shown.
@@ -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.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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 ""
|
||||
|
||||
Binary file not shown.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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 ""
|
||||
|
||||
Binary file not shown.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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 ""
|
||||
|
||||
Binary file not shown.
@@ -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 "وغ حقخبهمث"
|
||||
|
||||
Binary file not shown.
@@ -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.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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 ""
|
||||
|
||||
Binary file not shown.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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 ""
|
||||
|
||||
Binary file not shown.
@@ -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."
|
||||
|
||||
Binary file not shown.
@@ -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 ""
|
||||
|
||||
@@ -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
|
||||
))
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -632,6 +632,7 @@
|
||||
|
||||
.program-record {
|
||||
text-align: center;
|
||||
padding-bottom: 2em;
|
||||
}
|
||||
|
||||
@media (min-width: $bp-screen-md) {
|
||||
|
||||
@@ -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>
|
||||
<% } %>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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/')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
11
package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user