diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py
index 2bb272bcfe..0f87ced3f1 100644
--- a/cms/djangoapps/contentstore/tests/test_contentstore.py
+++ b/cms/djangoapps/contentstore/tests/test_contentstore.py
@@ -1000,7 +1000,7 @@ class MiscCourseTests(ContentStoreTestCase):
3) computing thumbnail location of asset
4) deleting the asset from the course
"""
- asset_key = self.course.id.make_asset_key('asset', 'sample_static.txt')
+ asset_key = self.course.id.make_asset_key('asset', 'sample_static.html')
content = StaticContent(
asset_key, "Fake asset", "application/text", "test",
)
@@ -1072,7 +1072,7 @@ class MiscCourseTests(ContentStoreTestCase):
draft content is also deleted
"""
# add an asset
- asset_key = self.course.id.make_asset_key('asset', 'sample_static.txt')
+ asset_key = self.course.id.make_asset_key('asset', 'sample_static.html')
content = StaticContent(
asset_key, "Fake asset", "application/text", "test",
)
diff --git a/cms/djangoapps/contentstore/tests/test_orphan.py b/cms/djangoapps/contentstore/tests/test_orphan.py
index 519276cbc2..5d089bdd8f 100644
--- a/cms/djangoapps/contentstore/tests/test_orphan.py
+++ b/cms/djangoapps/contentstore/tests/test_orphan.py
@@ -101,7 +101,7 @@ class TestOrphan(TestOrphanBase):
@ddt.data(
(ModuleStoreEnum.Type.split, 9, 6),
- (ModuleStoreEnum.Type.mongo, 30, 13),
+ (ModuleStoreEnum.Type.mongo, 34, 13),
)
@ddt.unpack
def test_delete_orphans(self, default_store, max_mongo_calls, min_mongo_calls):
diff --git a/cms/djangoapps/contentstore/tests/utils.py b/cms/djangoapps/contentstore/tests/utils.py
index 2026295c9e..af5e7b8e52 100644
--- a/cms/djangoapps/contentstore/tests/utils.py
+++ b/cms/djangoapps/contentstore/tests/utils.py
@@ -121,7 +121,7 @@ class CourseTestCase(ProceduralCourseTestMixin, ModuleStoreTestCase):
SEQUENTIAL = 'vertical_sequential'
DRAFT_HTML = 'draft_html'
DRAFT_VIDEO = 'draft_video'
- LOCKED_ASSET_KEY = AssetLocation.from_deprecated_string('/c4x/edX/toy/asset/sample_static.txt')
+ LOCKED_ASSET_KEY = AssetLocation.from_deprecated_string('/c4x/edX/toy/asset/sample_static.html')
def import_and_populate_course(self):
"""
diff --git a/cms/djangoapps/contentstore/views/tests/test_assets.py b/cms/djangoapps/contentstore/views/tests/test_assets.py
index 78ce5b4050..797b76be59 100644
--- a/cms/djangoapps/contentstore/views/tests/test_assets.py
+++ b/cms/djangoapps/contentstore/views/tests/test_assets.py
@@ -126,7 +126,7 @@ class BasicAssetsTestCase(AssetsTestCase):
)
course = module_store.get_course(course_id)
- filename = 'sample_static.txt'
+ filename = 'sample_static.html'
html_src_attribute = '"/static/{}"'.format(filename)
asset_url = replace_static_urls(html_src_attribute, course_id=course.id)
url = asset_url.replace('"', '')
@@ -379,7 +379,7 @@ class LockAssetTestCase(AssetsTestCase):
"""
def verify_asset_locked_state(locked):
""" Helper method to verify lock state in the contentstore """
- asset_location = StaticContent.get_location_from_path('/c4x/edX/toy/asset/sample_static.txt')
+ asset_location = StaticContent.get_location_from_path('/c4x/edX/toy/asset/sample_static.html')
content = contentstore().find(asset_location)
self.assertEqual(content.locked, locked)
@@ -387,14 +387,14 @@ class LockAssetTestCase(AssetsTestCase):
""" Helper method for posting asset update. """
content_type = 'application/txt'
upload_date = datetime(2013, 6, 1, 10, 30, tzinfo=UTC)
- asset_location = course.id.make_asset_key('asset', 'sample_static.txt')
+ asset_location = course.id.make_asset_key('asset', 'sample_static.html')
url = reverse_course_url('assets_handler', course.id, kwargs={'asset_key_string': unicode(asset_location)})
resp = self.client.post(
url,
# pylint: disable=protected-access
json.dumps(assets._get_asset_json(
- "sample_static.txt", content_type, upload_date, asset_location, None, lock)),
+ "sample_static.html", content_type, upload_date, asset_location, None, lock)),
"application/json"
)
diff --git a/cms/static/js/i18n/eo/djangojs.js b/cms/static/js/i18n/eo/djangojs.js
index 5dd968d7bd..ccfe9c7fd9 100644
--- a/cms/static/js/i18n/eo/djangojs.js
+++ b/cms/static/js/i18n/eo/djangojs.js
@@ -228,6 +228,7 @@
"Alternative source": "\u00c0lt\u00e9rn\u00e4t\u00efv\u00e9 s\u00f6\u00fcr\u00e7\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442#",
"Always cohort content-specific discussion topics": "\u00c0lw\u00e4\u00fds \u00e7\u00f6h\u00f6rt \u00e7\u00f6nt\u00e9nt-sp\u00e9\u00e7\u00eff\u00ef\u00e7 d\u00efs\u00e7\u00fcss\u00ef\u00f6n t\u00f6p\u00ef\u00e7s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
"Amount": "\u00c0m\u00f6\u00fcnt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5#",
+ "An email has been sent to {userEmail} with a link for you to activate your account.": "\u00c0n \u00e9m\u00e4\u00efl h\u00e4s \u00df\u00e9\u00e9n s\u00e9nt t\u00f6 {userEmail} w\u00efth \u00e4 l\u00efnk f\u00f6r \u00fd\u00f6\u00fc t\u00f6 \u00e4\u00e7t\u00efv\u00e4t\u00e9 \u00fd\u00f6\u00fcr \u00e4\u00e7\u00e7\u00f6\u00fcnt. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5#",
"An error has occurred. Check your Internet connection and try again.": "\u00c0n \u00e9rr\u00f6r h\u00e4s \u00f6\u00e7\u00e7\u00fcrr\u00e9d. \u00c7h\u00e9\u00e7k \u00fd\u00f6\u00fcr \u00ccnt\u00e9rn\u00e9t \u00e7\u00f6nn\u00e9\u00e7t\u00ef\u00f6n \u00e4nd tr\u00fd \u00e4g\u00e4\u00efn. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
"An error has occurred. Make sure that you are connected to the Internet, and then try refreshing the page.": "\u00c0n \u00e9rr\u00f6r h\u00e4s \u00f6\u00e7\u00e7\u00fcrr\u00e9d. M\u00e4k\u00e9 s\u00fcr\u00e9 th\u00e4t \u00fd\u00f6\u00fc \u00e4r\u00e9 \u00e7\u00f6nn\u00e9\u00e7t\u00e9d t\u00f6 th\u00e9 \u00ccnt\u00e9rn\u00e9t, \u00e4nd th\u00e9n tr\u00fd r\u00e9fr\u00e9sh\u00efng th\u00e9 p\u00e4g\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 #",
"An error has occurred. Please try again later.": "\u00c0n \u00e9rr\u00f6r h\u00e4s \u00f6\u00e7\u00e7\u00fcrr\u00e9d. Pl\u00e9\u00e4s\u00e9 tr\u00fd \u00e4g\u00e4\u00efn l\u00e4t\u00e9r. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
@@ -413,6 +414,7 @@
"Confirm": "\u00c7\u00f6nf\u00efrm \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
"Confirm Timed Transcript": "\u00c7\u00f6nf\u00efrm T\u00efm\u00e9d Tr\u00e4ns\u00e7r\u00efpt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7#",
"Congratulations! You are now verified on %(platformName)s!": "\u00c7\u00f6ngr\u00e4t\u00fcl\u00e4t\u00ef\u00f6ns! \u00dd\u00f6\u00fc \u00e4r\u00e9 n\u00f6w v\u00e9r\u00eff\u00ef\u00e9d \u00f6n %(platformName)s! \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
+ "Congratulations! You have earned a certificate for this course.": "\u00c7\u00f6ngr\u00e4t\u00fcl\u00e4t\u00ef\u00f6ns! \u00dd\u00f6\u00fc h\u00e4v\u00e9 \u00e9\u00e4rn\u00e9d \u00e4 \u00e7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9 f\u00f6r th\u00efs \u00e7\u00f6\u00fcrs\u00e9. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f \u03b1#",
"Constrain proportions": "\u00c7\u00f6nstr\u00e4\u00efn pr\u00f6p\u00f6rt\u00ef\u00f6ns \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, #",
"Contains staff only content": "\u00c7\u00f6nt\u00e4\u00efns st\u00e4ff \u00f6nl\u00fd \u00e7\u00f6nt\u00e9nt \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454#",
"Contains {count} group": [
@@ -1647,6 +1649,7 @@
"View Teams in the %(topic_name)s Topic": "V\u00ef\u00e9w T\u00e9\u00e4ms \u00efn th\u00e9 %(topic_name)s T\u00f6p\u00ef\u00e7 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454#",
"View all errors": "V\u00ef\u00e9w \u00e4ll \u00e9rr\u00f6rs \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1#",
"View discussion": "V\u00ef\u00e9w d\u00efs\u00e7\u00fcss\u00ef\u00f6n \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1#",
+ "View/Share Certificate": "V\u00ef\u00e9w/Sh\u00e4r\u00e9 \u00c7\u00e9rt\u00eff\u00ef\u00e7\u00e4t\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2#",
"Viewing %s course": [
"V\u00ef\u00e9w\u00efng %s \u00e7\u00f6\u00fcrs\u00e9 \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442#",
"V\u00ef\u00e9w\u00efng %s \u00e7\u00f6\u00fcrs\u00e9s \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442,#"
@@ -1660,6 +1663,7 @@
"Want to confirm your identity later?": "W\u00e4nt t\u00f6 \u00e7\u00f6nf\u00efrm \u00fd\u00f6\u00fcr \u00efd\u00e9nt\u00eft\u00fd l\u00e4t\u00e9r? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5#",
"Warning": "W\u00e4rn\u00efng \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c #",
"Warnings": "W\u00e4rn\u00efngs \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202#",
+ "We ask you to activate your account to ensure it is really you creating the account and to prevent fraud.": "W\u00e9 \u00e4sk \u00fd\u00f6\u00fc t\u00f6 \u00e4\u00e7t\u00efv\u00e4t\u00e9 \u00fd\u00f6\u00fcr \u00e4\u00e7\u00e7\u00f6\u00fcnt t\u00f6 \u00e9ns\u00fcr\u00e9 \u00eft \u00efs r\u00e9\u00e4ll\u00fd \u00fd\u00f6\u00fc \u00e7r\u00e9\u00e4t\u00efng th\u00e9 \u00e4\u00e7\u00e7\u00f6\u00fcnt \u00e4nd t\u00f6 pr\u00e9v\u00e9nt fr\u00e4\u00fcd. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 #",
"We couldn't create your account.": "W\u00e9 \u00e7\u00f6\u00fcldn't \u00e7r\u00e9\u00e4t\u00e9 \u00fd\u00f6\u00fcr \u00e4\u00e7\u00e7\u00f6\u00fcnt. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454#",
"We couldn't find any results for \"%s\".": "W\u00e9 \u00e7\u00f6\u00fcldn't f\u00efnd \u00e4n\u00fd r\u00e9s\u00fclts f\u00f6r \"%s\". \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f#",
"We couldn't sign you in.": "W\u00e9 \u00e7\u00f6\u00fcldn't s\u00efgn \u00fd\u00f6\u00fc \u00efn. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7#",
@@ -1705,6 +1709,7 @@
"When your face is in position, use the camera button {icon} below to take your photo.": "Wh\u00e9n \u00fd\u00f6\u00fcr f\u00e4\u00e7\u00e9 \u00efs \u00efn p\u00f6s\u00eft\u00ef\u00f6n, \u00fcs\u00e9 th\u00e9 \u00e7\u00e4m\u00e9r\u00e4 \u00df\u00fctt\u00f6n {icon} \u00df\u00e9l\u00f6w t\u00f6 t\u00e4k\u00e9 \u00fd\u00f6\u00fcr ph\u00f6t\u00f6. \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454#",
"Which timed transcript would you like to use?": "Wh\u00ef\u00e7h t\u00efm\u00e9d tr\u00e4ns\u00e7r\u00efpt w\u00f6\u00fcld \u00fd\u00f6\u00fc l\u00efk\u00e9 t\u00f6 \u00fcs\u00e9? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454\u00a2\u0442\u0454\u0442\u03c5\u044f #",
"Whole words": "Wh\u00f6l\u00e9 w\u00f6rds \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f #",
+ "Why activate?": "Wh\u00fd \u00e4\u00e7t\u00efv\u00e4t\u00e9? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9#",
"Why does %(platformName)s need my photo?": "Wh\u00fd d\u00f6\u00e9s %(platformName)s n\u00e9\u00e9d m\u00fd ph\u00f6t\u00f6? \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442, \u00a2\u03c3\u03b7\u0455\u0454#",
"Width": "W\u00efdth \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455#",
"Will Be Visible To:": "W\u00efll B\u00e9 V\u00efs\u00ef\u00dfl\u00e9 T\u00f6: \u2c60'\u03c3\u044f\u0454\u043c \u03b9\u03c1\u0455\u03c5\u043c \u2202\u03c3\u0142\u03c3\u044f \u0455\u03b9\u0442 \u03b1\u043c\u0454\u0442,#",
diff --git a/cms/static/js/i18n/fake2/djangojs.js b/cms/static/js/i18n/fake2/djangojs.js
index 4968a1597d..64aa6311bb 100644
--- a/cms/static/js/i18n/fake2/djangojs.js
+++ b/cms/static/js/i18n/fake2/djangojs.js
@@ -228,6 +228,7 @@
"Alternative source": "\u023al\u0287\u01dd\u0279n\u0250\u0287\u1d09\u028c\u01dd s\u00f8n\u0279\u0254\u01dd",
"Always cohort content-specific discussion topics": "\u023al\u028d\u0250\u028es \u0254\u00f8\u0265\u00f8\u0279\u0287 \u0254\u00f8n\u0287\u01ddn\u0287-sd\u01dd\u0254\u1d09\u025f\u1d09\u0254 d\u1d09s\u0254nss\u1d09\u00f8n \u0287\u00f8d\u1d09\u0254s",
"Amount": "\u023a\u026f\u00f8nn\u0287",
+ "An email has been sent to {userEmail} with a link for you to activate your account.": "\u023an \u01dd\u026f\u0250\u1d09l \u0265\u0250s b\u01dd\u01ddn s\u01ddn\u0287 \u0287\u00f8 {userEmail} \u028d\u1d09\u0287\u0265 \u0250 l\u1d09n\u029e \u025f\u00f8\u0279 \u028e\u00f8n \u0287\u00f8 \u0250\u0254\u0287\u1d09\u028c\u0250\u0287\u01dd \u028e\u00f8n\u0279 \u0250\u0254\u0254\u00f8nn\u0287.",
"An error has occurred. Check your Internet connection and try again.": "\u023an \u01dd\u0279\u0279\u00f8\u0279 \u0265\u0250s \u00f8\u0254\u0254n\u0279\u0279\u01ddd. \u023b\u0265\u01dd\u0254\u029e \u028e\u00f8n\u0279 \u0197n\u0287\u01dd\u0279n\u01dd\u0287 \u0254\u00f8nn\u01dd\u0254\u0287\u1d09\u00f8n \u0250nd \u0287\u0279\u028e \u0250\u0183\u0250\u1d09n.",
"An error has occurred. Make sure that you are connected to the Internet, and then try refreshing the page.": "\u023an \u01dd\u0279\u0279\u00f8\u0279 \u0265\u0250s \u00f8\u0254\u0254n\u0279\u0279\u01ddd. M\u0250\u029e\u01dd sn\u0279\u01dd \u0287\u0265\u0250\u0287 \u028e\u00f8n \u0250\u0279\u01dd \u0254\u00f8nn\u01dd\u0254\u0287\u01ddd \u0287\u00f8 \u0287\u0265\u01dd \u0197n\u0287\u01dd\u0279n\u01dd\u0287, \u0250nd \u0287\u0265\u01ddn \u0287\u0279\u028e \u0279\u01dd\u025f\u0279\u01dds\u0265\u1d09n\u0183 \u0287\u0265\u01dd d\u0250\u0183\u01dd.",
"An error has occurred. Please try again later.": "\u023an \u01dd\u0279\u0279\u00f8\u0279 \u0265\u0250s \u00f8\u0254\u0254n\u0279\u0279\u01ddd. \u2c63l\u01dd\u0250s\u01dd \u0287\u0279\u028e \u0250\u0183\u0250\u1d09n l\u0250\u0287\u01dd\u0279.",
@@ -413,6 +414,7 @@
"Confirm": "\u023b\u00f8n\u025f\u1d09\u0279\u026f",
"Confirm Timed Transcript": "\u023b\u00f8n\u025f\u1d09\u0279\u026f \u0166\u1d09\u026f\u01ddd \u0166\u0279\u0250ns\u0254\u0279\u1d09d\u0287",
"Congratulations! You are now verified on %(platformName)s!": "\u023b\u00f8n\u0183\u0279\u0250\u0287nl\u0250\u0287\u1d09\u00f8ns! \u024e\u00f8n \u0250\u0279\u01dd n\u00f8\u028d \u028c\u01dd\u0279\u1d09\u025f\u1d09\u01ddd \u00f8n %(platformName)s!",
+ "Congratulations! You have earned a certificate for this course.": "\u023b\u00f8n\u0183\u0279\u0250\u0287nl\u0250\u0287\u1d09\u00f8ns! \u024e\u00f8n \u0265\u0250\u028c\u01dd \u01dd\u0250\u0279n\u01ddd \u0250 \u0254\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dd \u025f\u00f8\u0279 \u0287\u0265\u1d09s \u0254\u00f8n\u0279s\u01dd.",
"Constrain proportions": "\u023b\u00f8ns\u0287\u0279\u0250\u1d09n d\u0279\u00f8d\u00f8\u0279\u0287\u1d09\u00f8ns",
"Contains staff only content": "\u023b\u00f8n\u0287\u0250\u1d09ns s\u0287\u0250\u025f\u025f \u00f8nl\u028e \u0254\u00f8n\u0287\u01ddn\u0287",
"Contains {count} group": [
@@ -1647,6 +1649,7 @@
"View Teams in the %(topic_name)s Topic": "V\u1d09\u01dd\u028d \u0166\u01dd\u0250\u026fs \u1d09n \u0287\u0265\u01dd %(topic_name)s \u0166\u00f8d\u1d09\u0254",
"View all errors": "V\u1d09\u01dd\u028d \u0250ll \u01dd\u0279\u0279\u00f8\u0279s",
"View discussion": "V\u1d09\u01dd\u028d d\u1d09s\u0254nss\u1d09\u00f8n",
+ "View/Share Certificate": "V\u1d09\u01dd\u028d/S\u0265\u0250\u0279\u01dd \u023b\u01dd\u0279\u0287\u1d09\u025f\u1d09\u0254\u0250\u0287\u01dd",
"Viewing %s course": [
"V\u1d09\u01dd\u028d\u1d09n\u0183 %s \u0254\u00f8n\u0279s\u01dd",
"V\u1d09\u01dd\u028d\u1d09n\u0183 %s \u0254\u00f8n\u0279s\u01dds"
@@ -1660,6 +1663,7 @@
"Want to confirm your identity later?": "W\u0250n\u0287 \u0287\u00f8 \u0254\u00f8n\u025f\u1d09\u0279\u026f \u028e\u00f8n\u0279 \u1d09d\u01ddn\u0287\u1d09\u0287\u028e l\u0250\u0287\u01dd\u0279?",
"Warning": "W\u0250\u0279n\u1d09n\u0183",
"Warnings": "W\u0250\u0279n\u1d09n\u0183s",
+ "We ask you to activate your account to ensure it is really you creating the account and to prevent fraud.": "W\u01dd \u0250s\u029e \u028e\u00f8n \u0287\u00f8 \u0250\u0254\u0287\u1d09\u028c\u0250\u0287\u01dd \u028e\u00f8n\u0279 \u0250\u0254\u0254\u00f8nn\u0287 \u0287\u00f8 \u01ddnsn\u0279\u01dd \u1d09\u0287 \u1d09s \u0279\u01dd\u0250ll\u028e \u028e\u00f8n \u0254\u0279\u01dd\u0250\u0287\u1d09n\u0183 \u0287\u0265\u01dd \u0250\u0254\u0254\u00f8nn\u0287 \u0250nd \u0287\u00f8 d\u0279\u01dd\u028c\u01ddn\u0287 \u025f\u0279\u0250nd.",
"We couldn't create your account.": "W\u01dd \u0254\u00f8nldn'\u0287 \u0254\u0279\u01dd\u0250\u0287\u01dd \u028e\u00f8n\u0279 \u0250\u0254\u0254\u00f8nn\u0287.",
"We couldn't find any results for \"%s\".": "W\u01dd \u0254\u00f8nldn'\u0287 \u025f\u1d09nd \u0250n\u028e \u0279\u01ddsnl\u0287s \u025f\u00f8\u0279 \"%s\".",
"We couldn't sign you in.": "W\u01dd \u0254\u00f8nldn'\u0287 s\u1d09\u0183n \u028e\u00f8n \u1d09n.",
@@ -1705,6 +1709,7 @@
"When your face is in position, use the camera button {icon} below to take your photo.": "W\u0265\u01ddn \u028e\u00f8n\u0279 \u025f\u0250\u0254\u01dd \u1d09s \u1d09n d\u00f8s\u1d09\u0287\u1d09\u00f8n, ns\u01dd \u0287\u0265\u01dd \u0254\u0250\u026f\u01dd\u0279\u0250 bn\u0287\u0287\u00f8n {icon} b\u01ddl\u00f8\u028d \u0287\u00f8 \u0287\u0250\u029e\u01dd \u028e\u00f8n\u0279 d\u0265\u00f8\u0287\u00f8.",
"Which timed transcript would you like to use?": "W\u0265\u1d09\u0254\u0265 \u0287\u1d09\u026f\u01ddd \u0287\u0279\u0250ns\u0254\u0279\u1d09d\u0287 \u028d\u00f8nld \u028e\u00f8n l\u1d09\u029e\u01dd \u0287\u00f8 ns\u01dd?",
"Whole words": "W\u0265\u00f8l\u01dd \u028d\u00f8\u0279ds",
+ "Why activate?": "W\u0265\u028e \u0250\u0254\u0287\u1d09\u028c\u0250\u0287\u01dd?",
"Why does %(platformName)s need my photo?": "W\u0265\u028e d\u00f8\u01dds %(platformName)s n\u01dd\u01ddd \u026f\u028e d\u0265\u00f8\u0287\u00f8?",
"Width": "W\u1d09d\u0287\u0265",
"Will Be Visible To:": "W\u1d09ll \u0243\u01dd V\u1d09s\u1d09bl\u01dd \u0166\u00f8:",
diff --git a/cms/static/js/i18n/rtl/djangojs.js b/cms/static/js/i18n/rtl/djangojs.js
index f8f88d1f9e..51d9c7b8bf 100644
--- a/cms/static/js/i18n/rtl/djangojs.js
+++ b/cms/static/js/i18n/rtl/djangojs.js
@@ -228,6 +228,7 @@
"Alternative source": "\u0634\u0645\u0641\u062b\u0642\u0631\u0634\u0641\u0647\u062f\u062b \u0633\u062e\u0639\u0642\u0630\u062b",
"Always cohort content-specific discussion topics": "\u0634\u0645\u0635\u0634\u063a\u0633 \u0630\u062e\u0627\u062e\u0642\u0641 \u0630\u062e\u0631\u0641\u062b\u0631\u0641-\u0633\u062d\u062b\u0630\u0647\u0628\u0647\u0630 \u064a\u0647\u0633\u0630\u0639\u0633\u0633\u0647\u062e\u0631 \u0641\u062e\u062d\u0647\u0630\u0633",
"Amount": "\u0634\u0648\u062e\u0639\u0631\u0641",
+ "An email has been sent to {userEmail} with a link for you to activate your account.": "\u0634\u0631 \u062b\u0648\u0634\u0647\u0645 \u0627\u0634\u0633 \u0632\u062b\u062b\u0631 \u0633\u062b\u0631\u0641 \u0641\u062e {userEmail} \u0635\u0647\u0641\u0627 \u0634 \u0645\u0647\u0631\u0646 \u0628\u062e\u0642 \u063a\u062e\u0639 \u0641\u062e \u0634\u0630\u0641\u0647\u062f\u0634\u0641\u062b \u063a\u062e\u0639\u0642 \u0634\u0630\u0630\u062e\u0639\u0631\u0641.",
"An error has occurred. Check your Internet connection and try again.": "\u0634\u0631 \u062b\u0642\u0642\u062e\u0642 \u0627\u0634\u0633 \u062e\u0630\u0630\u0639\u0642\u0642\u062b\u064a. \u0630\u0627\u062b\u0630\u0646 \u063a\u062e\u0639\u0642 \u0647\u0631\u0641\u062b\u0642\u0631\u062b\u0641 \u0630\u062e\u0631\u0631\u062b\u0630\u0641\u0647\u062e\u0631 \u0634\u0631\u064a \u0641\u0642\u063a \u0634\u0644\u0634\u0647\u0631.",
"An error has occurred. Make sure that you are connected to the Internet, and then try refreshing the page.": "\u0634\u0631 \u062b\u0642\u0642\u062e\u0642 \u0627\u0634\u0633 \u062e\u0630\u0630\u0639\u0642\u0642\u062b\u064a. \u0648\u0634\u0646\u062b \u0633\u0639\u0642\u062b \u0641\u0627\u0634\u0641 \u063a\u062e\u0639 \u0634\u0642\u062b \u0630\u062e\u0631\u0631\u062b\u0630\u0641\u062b\u064a \u0641\u062e \u0641\u0627\u062b \u0647\u0631\u0641\u062b\u0642\u0631\u062b\u0641, \u0634\u0631\u064a \u0641\u0627\u062b\u0631 \u0641\u0642\u063a \u0642\u062b\u0628\u0642\u062b\u0633\u0627\u0647\u0631\u0644 \u0641\u0627\u062b \u062d\u0634\u0644\u062b.",
"An error has occurred. Please try again later.": "\u0634\u0631 \u062b\u0642\u0642\u062e\u0642 \u0627\u0634\u0633 \u062e\u0630\u0630\u0639\u0642\u0642\u062b\u064a. \u062d\u0645\u062b\u0634\u0633\u062b \u0641\u0642\u063a \u0634\u0644\u0634\u0647\u0631 \u0645\u0634\u0641\u062b\u0642.",
@@ -413,6 +414,7 @@
"Confirm": "\u0630\u062e\u0631\u0628\u0647\u0642\u0648",
"Confirm Timed Transcript": "\u0630\u062e\u0631\u0628\u0647\u0642\u0648 \u0641\u0647\u0648\u062b\u064a \u0641\u0642\u0634\u0631\u0633\u0630\u0642\u0647\u062d\u0641",
"Congratulations! You are now verified on %(platformName)s!": "\u0630\u062e\u0631\u0644\u0642\u0634\u0641\u0639\u0645\u0634\u0641\u0647\u062e\u0631\u0633! \u063a\u062e\u0639 \u0634\u0642\u062b \u0631\u062e\u0635 \u062f\u062b\u0642\u0647\u0628\u0647\u062b\u064a \u062e\u0631 %(platformName)s!",
+ "Congratulations! You have earned a certificate for this course.": "\u0630\u062e\u0631\u0644\u0642\u0634\u0641\u0639\u0645\u0634\u0641\u0647\u062e\u0631\u0633! \u063a\u062e\u0639 \u0627\u0634\u062f\u062b \u062b\u0634\u0642\u0631\u062b\u064a \u0634 \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b \u0628\u062e\u0642 \u0641\u0627\u0647\u0633 \u0630\u062e\u0639\u0642\u0633\u062b.",
"Constrain proportions": "\u0630\u062e\u0631\u0633\u0641\u0642\u0634\u0647\u0631 \u062d\u0642\u062e\u062d\u062e\u0642\u0641\u0647\u062e\u0631\u0633",
"Contains staff only content": "\u0630\u062e\u0631\u0641\u0634\u0647\u0631\u0633 \u0633\u0641\u0634\u0628\u0628 \u062e\u0631\u0645\u063a \u0630\u062e\u0631\u0641\u062b\u0631\u0641",
"Contains {count} group": [
@@ -1647,6 +1649,7 @@
"View Teams in the %(topic_name)s Topic": "\u062f\u0647\u062b\u0635 \u0641\u062b\u0634\u0648\u0633 \u0647\u0631 \u0641\u0627\u062b %(topic_name)s \u0641\u062e\u062d\u0647\u0630",
"View all errors": "\u062f\u0647\u062b\u0635 \u0634\u0645\u0645 \u062b\u0642\u0642\u062e\u0642\u0633",
"View discussion": "\u062f\u0647\u062b\u0635 \u064a\u0647\u0633\u0630\u0639\u0633\u0633\u0647\u062e\u0631",
+ "View/Share Certificate": "\u062f\u0647\u062b\u0635/\u0633\u0627\u0634\u0642\u062b \u0630\u062b\u0642\u0641\u0647\u0628\u0647\u0630\u0634\u0641\u062b",
"Viewing %s course": [
"\u062f\u0647\u062b\u0635\u0647\u0631\u0644 %s \u0630\u062e\u0639\u0642\u0633\u062b",
"\u062f\u0647\u062b\u0635\u0647\u0631\u0644 %s \u0630\u062e\u0639\u0642\u0633\u062b\u0633"
@@ -1660,6 +1663,7 @@
"Want to confirm your identity later?": "\u0635\u0634\u0631\u0641 \u0641\u062e \u0630\u062e\u0631\u0628\u0647\u0642\u0648 \u063a\u062e\u0639\u0642 \u0647\u064a\u062b\u0631\u0641\u0647\u0641\u063a \u0645\u0634\u0641\u062b\u0642?",
"Warning": "\u0635\u0634\u0642\u0631\u0647\u0631\u0644",
"Warnings": "\u0635\u0634\u0642\u0631\u0647\u0631\u0644\u0633",
+ "We ask you to activate your account to ensure it is really you creating the account and to prevent fraud.": "\u0635\u062b \u0634\u0633\u0646 \u063a\u062e\u0639 \u0641\u062e \u0634\u0630\u0641\u0647\u062f\u0634\u0641\u062b \u063a\u062e\u0639\u0642 \u0634\u0630\u0630\u062e\u0639\u0631\u0641 \u0641\u062e \u062b\u0631\u0633\u0639\u0642\u062b \u0647\u0641 \u0647\u0633 \u0642\u062b\u0634\u0645\u0645\u063a \u063a\u062e\u0639 \u0630\u0642\u062b\u0634\u0641\u0647\u0631\u0644 \u0641\u0627\u062b \u0634\u0630\u0630\u062e\u0639\u0631\u0641 \u0634\u0631\u064a \u0641\u062e \u062d\u0642\u062b\u062f\u062b\u0631\u0641 \u0628\u0642\u0634\u0639\u064a.",
"We couldn't create your account.": "\u0635\u062b \u0630\u062e\u0639\u0645\u064a\u0631'\u0641 \u0630\u0642\u062b\u0634\u0641\u062b \u063a\u062e\u0639\u0642 \u0634\u0630\u0630\u062e\u0639\u0631\u0641.",
"We couldn't find any results for \"%s\".": "\u0635\u062b \u0630\u062e\u0639\u0645\u064a\u0631'\u0641 \u0628\u0647\u0631\u064a \u0634\u0631\u063a \u0642\u062b\u0633\u0639\u0645\u0641\u0633 \u0628\u062e\u0642 \"%s\".",
"We couldn't sign you in.": "\u0635\u062b \u0630\u062e\u0639\u0645\u064a\u0631'\u0641 \u0633\u0647\u0644\u0631 \u063a\u062e\u0639 \u0647\u0631.",
@@ -1705,6 +1709,7 @@
"When your face is in position, use the camera button {icon} below to take your photo.": "\u0635\u0627\u062b\u0631 \u063a\u062e\u0639\u0642 \u0628\u0634\u0630\u062b \u0647\u0633 \u0647\u0631 \u062d\u062e\u0633\u0647\u0641\u0647\u062e\u0631, \u0639\u0633\u062b \u0641\u0627\u062b \u0630\u0634\u0648\u062b\u0642\u0634 \u0632\u0639\u0641\u0641\u062e\u0631 {icon} \u0632\u062b\u0645\u062e\u0635 \u0641\u062e \u0641\u0634\u0646\u062b \u063a\u062e\u0639\u0642 \u062d\u0627\u062e\u0641\u062e.",
"Which timed transcript would you like to use?": "\u0635\u0627\u0647\u0630\u0627 \u0641\u0647\u0648\u062b\u064a \u0641\u0642\u0634\u0631\u0633\u0630\u0642\u0647\u062d\u0641 \u0635\u062e\u0639\u0645\u064a \u063a\u062e\u0639 \u0645\u0647\u0646\u062b \u0641\u062e \u0639\u0633\u062b?",
"Whole words": "\u0635\u0627\u062e\u0645\u062b \u0635\u062e\u0642\u064a\u0633",
+ "Why activate?": "\u0635\u0627\u063a \u0634\u0630\u0641\u0647\u062f\u0634\u0641\u062b?",
"Why does %(platformName)s need my photo?": "\u0635\u0627\u063a \u064a\u062e\u062b\u0633 %(platformName)s \u0631\u062b\u062b\u064a \u0648\u063a \u062d\u0627\u062e\u0641\u062e?",
"Width": "\u0635\u0647\u064a\u0641\u0627",
"Will Be Visible To:": "\u0635\u0647\u0645\u0645 \u0632\u062b \u062f\u0647\u0633\u0647\u0632\u0645\u062b \u0641\u062e:",
diff --git a/cms/static/js/i18n/zh-cn/djangojs.js b/cms/static/js/i18n/zh-cn/djangojs.js
index 9b10ea752d..dea2b447bc 100644
--- a/cms/static/js/i18n/zh-cn/djangojs.js
+++ b/cms/static/js/i18n/zh-cn/djangojs.js
@@ -61,7 +61,7 @@
"%d \u5206\u949f"
],
"%d month": [
- "%d \u6708"
+ "%d \u4e2a\u6708"
],
"%d year": [
"%d \u5e74"
@@ -77,7 +77,7 @@
"(%(num_points)s point possible)": [
"\uff08\u53ef\u80fd\u4e3a %(num_points)s \u5206\uff09"
],
- "(Caption will be displayed when you start playing the video.)": "(\u5f53\u89c6\u9891\u5f00\u59cb\u62e8\u653e\u65f6\u6807\u9898\u5c06\u4f1a\u663e\u793a)",
+ "(Caption will be displayed when you start playing the video.)": "(\u5f53\u89c6\u9891\u5f00\u59cb\u64ad\u653e\u65f6\u5c06\u663e\u793a\u5b57\u5e55)",
"(Required Field)": "(\u5fc5\u586b\u5b57\u6bb5)",
"(contains %(student_count)s student)": [
"\uff08\u5305\u62ec %(student_count)s \u4e2a\u5b66\u751f\uff09"
@@ -100,7 +100,7 @@
"Align right": "\u53f3\u5bf9\u9f50",
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
"All accounts were created successfully.": "\u6240\u6709\u8d26\u6237\u521b\u5efa\u6210\u529f\u3002",
- "All flags have been removed. To undo, uncheck the box.": "\u6240\u6709\u6807\u8bb0\u5df2\u79fb\u9664\u3002\u53d6\u6d88\u9009\u4e2d\u4fe1\u606f\u6846\u4ee5\u64a4\u9500\u3002",
+ "All flags have been removed. To undo, uncheck the box.": "\u6240\u6709\u6807\u8bb0\u5df2\u79fb\u9664\u3002\u53d6\u6d88\u9009\u4e2d\u6b64\u9009\u6846\u4ee5\u64a4\u9500\u3002",
"All groups must have a name.": "\u6240\u6709\u7ec4\u90fd\u5fc5\u987b\u6709\u540d\u79f0\u3002",
"All groups must have a unique name.": "\u6240\u6709\u7684\u7ec4\u7684\u540d\u5b57\u5fc5\u987b\u662f\u552f\u4e00\u7684\u3002",
"All professional education courses are fee-based, and require payment to complete the enrollment process.": "\u6240\u6709\u7684\u4e13\u4e1a\u6559\u80b2\u8bfe\u7a0b\u90fd\u662f\u6536\u8d39\u7684\uff0c\u5fc5\u987b\u6210\u529f\u4ea4\u8d39\u624d\u80fd\u5b8c\u6210\u9009\u8bfe\u8fc7\u7a0b\u3002",
@@ -114,24 +114,24 @@
"Alternative source": "\u5907\u7528\u6e90",
"Always cohort content-specific discussion topics": "\u603b\u662f\u6839\u636e\u7279\u5b9a\u5185\u5bb9\u7684\u8ba8\u8bba\u8bdd\u9898\u5206\u7ec4",
"Amount": "\u91d1\u989d",
- "An error has occurred. Make sure that you are connected to the Internet, and then try refreshing the page.": "\u51fa\u73b0\u4e86\u4e00\u4e2a\u9519\u8bef\u3002\u8bf7\u786e\u4fdd\u4f60\u5df2\u8054\u7f51\uff0c\u7136\u540e\u5237\u65b0\u9875\u9762\u3002",
- "An error has occurred. Please try again later.": "\u53d1\u751f\u4e86\u4e00\u4e2a\u672a\u77e5\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002",
+ "An error has occurred. Make sure that you are connected to the Internet, and then try refreshing the page.": "\u51fa\u73b0\u4e86\u4e00\u4e2a\u9519\u8bef\u3002\u8bf7\u786e\u4fdd\u60a8\u5df2\u8054\u7f51\uff0c\u7136\u540e\u5237\u65b0\u9875\u9762\u3002",
+ "An error has occurred. Please try again later.": "\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002",
"An error has occurred. Please try again.": "\u53d1\u751f\u4e86\u4e00\u4e2a\u672a\u77e5\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002",
"An error has occurred. Please try reloading the page.": "\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef\u3002\u8bf7\u91cd\u65b0\u52a0\u8f7d\u8fd9\u4e2a\u9875\u9762\u3002",
"An error occurred retrieving your email. Please try again later, and contact technical support if the problem persists.": "\u83b7\u53d6\u90ae\u4ef6\u53d1\u751f\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002\u5982\u95ee\u9898\u6301\u7eed\u53d1\u751f\uff0c\u8bf7\u54a8\u8be2\u6280\u672f\u652f\u6301\u3002",
"An error occurred.": "\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef\u3002",
- "An error occurred. Make sure that the student's username or email address is correct and try again.": "\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7528\u6237\u540d\u6216\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u6b63\u786e\u540e\u518d\u8bd5\u4e00\u6b21\u3002",
- "An error occurred. Please try again later.": "\u51fa\u73b0\u4e86\u672a\u77e5\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002",
+ "An error occurred. Make sure that the student's username or email address is correct and try again.": "\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7528\u6237\u540d\u6216\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u6b63\u786e\u5e76\u518d\u6b21\u5c1d\u8bd5\u3002",
+ "An error occurred. Please try again later.": "\u51fa\u73b0\u4e86\u4e00\u4e2a\u9519\u8bef\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\u3002",
"Anchor": "\u951a\u70b9",
"Anchors": "\u951a\u70b9",
"Annotation": "\u6279\u6ce8",
"Annotation Text": "\u6279\u6ce8\u6587\u672c",
"Answer hidden": "\u7b54\u6848\u9690\u85cf",
"Answer:": "\u56de\u7b54\uff1a",
- "Are you sure you want to delete this comment?": "\u4f60\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u6761\u8bc4\u8bba\u5417\uff1f",
+ "Are you sure you want to delete this comment?": "\u60a8\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u6761\u8bc4\u8bba\u5417\uff1f",
"Are you sure you want to delete this page? This action cannot be undone.": "\u60a8\u786e\u8ba4\u8981\u5220\u9664\u8be5\u9875\u9762\u5417\uff1f\u8be5\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500\u3002",
"Are you sure you want to delete this post?": "\u60a8\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u5e16\u5b50\uff1f",
- "Are you sure you want to delete this response?": "\u4f60\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u56de\u590d\u5417",
+ "Are you sure you want to delete this response?": "\u60a8\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u56de\u590d\u5417",
"Are you sure you want to delete this update?": "\u60a8\u786e\u5b9a\u8981\u5220\u9664\u6b64\u66f4\u65b0\u5417\uff1f",
"Are you sure you want to delete {email} from the course team for \u201c{container}\u201d?": "\u60a8\u786e\u5b9a\u8981\u4ece\u201c{container}\u201d\u7684\u8bfe\u7a0b\u56e2\u961f\u4e2d\u5220\u9664{email}\uff1f",
"Are you sure you want to delete {email} from the library \u201c{container}\u201d?": "\u60a8\u786e\u5b9a\u8981\u4ece\u77e5\u8bc6\u5e93\u201c{container}\u201d\u4e2d\u5220\u9664{email}\uff1f",
@@ -175,12 +175,12 @@
"Change the settings for %(display_name)s": "\u4fee\u6539%(display_name)s\u7684\u8bbe\u7f6e",
"Check Your Email": "\u68c0\u67e5\u4f60\u7684\u7535\u5b50\u90ae\u4ef6",
"Check the box to remove %(count)s flag.": [
- "\u9009\u4e2d\u590d\u9009\u6846\u4ee5\u53bb\u9664 %(count)s \u4e2a\u6807\u8bb0\u3002"
+ "\u9009\u4e2d\u6b64\u9009\u6846\u4ee5\u79fb\u9664 %(count)s \u4e2a\u6807\u8bb0\u3002"
],
"Check the box to remove %(totalFlags)s flag.": [
- "\u9009\u4e2d\u590d\u9009\u6846\u4ee5\u53bb\u9664 %(totalFlags)s \u4e2a\u6807\u8bb0\u3002"
+ "\u9009\u4e2d\u6b64\u9009\u6846\u4ee5\u79fb\u9664\u6240\u6709 %(totalFlags)s \u4e2a\u6807\u8bb0\u3002"
],
- "Check the box to remove all flags.": "\u67e5\u770b\u4fe1\u606f\u680f\u4ee5\u79fb\u9664\u6240\u6709\u6807\u8bb0",
+ "Check the box to remove all flags.": "\u9009\u4e2d\u6b64\u9009\u6846\u4ee5\u79fb\u9664\u6240\u6709\u6807\u8bb0",
"Check your email": "\u67e5\u6536\u4f60\u7684\u90ae\u4ef6",
"Choose File": "\u9009\u62e9\u6587\u4ef6",
"Choose a .csv file": "\u9009\u62e9\u4e00\u4e2a.csv\u7684\u6587\u4ef6",
@@ -191,8 +191,8 @@
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
"Clear search results": "\u6e05\u7a7a\u641c\u7d22\u7ed3\u679c",
"Click OK to have your e-mail address sent to a 3rd party application.\n\nClick Cancel to return to this page without sending your information.": "\u5355\u51fb\u786e\u5b9a\uff0c\u5c06\u4f60\u7684\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u53d1\u9001\u7ed9\u7b2c\u4e09\u65b9\u5e94\u7528\u7a0b\u5e8f\u3002\n\n\u5355\u51fb\u53d6\u6d88\uff0c\u53d6\u6d88\u53d1\u9001\u4fe1\u606f\u5e76\u8fd4\u56de\u672c\u9875\u3002",
- "Click OK to have your username and e-mail address sent to a 3rd party application.\n\nClick Cancel to return to this page without sending your information.": "\u5355\u51fb\u786e\u5b9a\uff0c\u5c06\u4f60\u7684\u7528\u6237\u540d\u548c\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u53d1\u9001\u7ed9\u7b2c\u4e09\u65b9\u5e94\u7528\u7a0b\u5e8f\u3002\n\n\u5355\u51fb\u53d6\u6d88\uff0c\u53d6\u6d88\u53d1\u9001\u4fe1\u606f\u5e76\u8fd4\u56de\u672c\u9875\u3002",
- "Click OK to have your username sent to a 3rd party application.\n\nClick Cancel to return to this page without sending your information.": "\u5355\u51fb\u786e\u5b9a\uff0c\u5c06\u4f60\u7684\u7528\u6237\u540d\u5411\u7b2c3\u65b9\u5e94\u7528\u7a0b\u5e8f\u53d1\u9001\u90ae\u4ef6\u3002\n\n\u5355\u51fb\u53d6\u6d88\uff0c\u53d6\u6d88\u53d1\u9001\u4fe1\u606f\u5e76\u8fd4\u56de\u672c\u9875\u3002",
+ "Click OK to have your username and e-mail address sent to a 3rd party application.\n\nClick Cancel to return to this page without sending your information.": "\u5355\u51fb\u786e\u5b9a\uff0c\u5c06\u60a8\u7684\u7528\u6237\u540d\u548c\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u53d1\u9001\u7ed9\u7b2c\u4e09\u65b9\u5e94\u7528\u7a0b\u5e8f\u3002\n\n\u5355\u51fb\u53d6\u6d88\uff0c\u53d6\u6d88\u53d1\u9001\u4fe1\u606f\u5e76\u8fd4\u56de\u672c\u9875\u3002",
+ "Click OK to have your username sent to a 3rd party application.\n\nClick Cancel to return to this page without sending your information.": "\u5355\u51fb\u786e\u5b9a\uff0c\u5c06\u60a8\u7684\u7528\u6237\u540d\u53d1\u9001\u7ed9\u7b2c3\u65b9\u5e94\u7528\u7a0b\u5e8f\u3002\n\n\u5355\u51fb\u53d6\u6d88\uff0c\u53d6\u6d88\u53d1\u9001\u4fe1\u606f\u5e76\u8fd4\u56de\u672c\u9875\u3002",
"Close": "\u5173\u95ed",
"Close Calculator": "\u5173\u95ed\u8ba1\u7b97\u5668",
"Code": "\u4ee3\u7801",
@@ -222,7 +222,7 @@
"Correct failed component": "\u7ea0\u6b63\u5931\u8d25\u7684\u7ec4\u4ef6",
"Could not find a user with username or email address '<%= identifier %>'.": "\u627e\u4e0d\u5230\u7528\u6237\u540d\u6216\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u4e3a\u201c<%= identifier %>\u201d\u7684\u7528\u6237\u3002",
"Could not find the specified string.": "\u65e0\u6cd5\u627e\u5230\u6307\u5b9a\u7684\u5b57\u7b26\u4e32\u3002",
- "Could not find users associated with the following identifiers:": "\u672a\u80fd\u627e\u5230\u4e0e\u4ee5\u4e0bID\u5173\u8054\u7684\u7528\u6237\uff1a",
+ "Could not find users associated with the following identifiers:": "\u672a\u80fd\u627e\u5230\u4e0e\u4ee5\u4e0b\u8bc6\u522b\u7801\u5173\u8054\u7684\u7528\u6237\uff1a",
"Could not retrieve payment information": "\u65e0\u6cd5\u8bfb\u53d6\u652f\u4ed8\u4fe1\u606f",
"Could not submit order": "\u8ba2\u5355\u63d0\u4ea4\u5931\u8d25",
"Could not submit photos": "\u7167\u7247\u63d0\u4ea4\u5931\u8d25",
@@ -239,7 +239,7 @@
"Creating missing groups": "\u6b63\u5728\u521b\u5efa\u7f3a\u5931\u7684\u7ec4\u3002",
"Crossed out items have been refunded.": "\u5212\u6389\u7684\u9879\u76ee\u5df2\u9000\u6b3e\u3002",
"Current conversation": "\u5f53\u524d\u5bf9\u8bdd",
- "Current tab": "\u5f53\u524d\u9009\u9879",
+ "Current tab": "\u5f53\u524d\u6807\u7b7e",
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
"Custom...": "\u81ea\u5b9a\u4e49\u2026",
"Cut": "\u526a\u5207",
@@ -256,7 +256,7 @@
"Delete Page Confirmation": "\u786e\u8ba4\u5220\u9664\u9875\u9762",
"Delete column": "\u5220\u9664\u5217",
"Delete row": "\u5220\u9664\u884c",
- "Delete student '<%= student_id %>'s state on problem '<%= problem_id %>'?": "\u786e\u8ba4\u5220\u9664\u5b66\u751f\u201c<%= student_id %>\u201d\u5728\u95ee\u9898\u201c<%= problem_id %>\u201d\u4e0a\u7684\u72b6\u6001?",
+ "Delete student '<%= student_id %>'s state on problem '<%= problem_id %>'?": "\u786e\u8ba4\u5220\u9664\u5b66\u751f'<%= student_id %>'\u5728\u95ee\u9898'<%= problem_id %>'\u4e0a\u7684\u72b6\u6001?",
"Delete table": "\u5220\u9664\u8868\u683c",
"Delete this %(item_display_name)s?": "\u8981\u5220\u9664\u8be5%(item_display_name)s\u5417\uff1f",
"Delete this %(xblock_type)s?": "\u8981\u5220\u9664\u8be5%(xblock_type)s\u5417\uff1f",
@@ -274,15 +274,15 @@
"Discussion": "\u8ba8\u8bba",
"Discussion admins, moderators, and TAs can make their posts visible to all students or specify a single cohort.": "\u8ba8\u8bba\u533a\u7ba1\u7406\u5458\u3001\u7248\u4e3b\u4ee5\u53ca\u52a9\u6559\u53ef\u4ee5\u5c06\u5b83\u4eec\u7684\u5e16\u5b50\u8bbe\u7f6e\u4e3a\u5bf9\u6240\u6709\u5b66\u751f\u53ef\u89c1\u6216\u8005\u4ec5\u5bf9\u67d0\u4e2a\u7fa4\u7ec4\u53ef\u89c1\u3002",
"Div": "Div \u6807\u7b7e",
- "Do not show again": "\u4e0d\u5728\u663e\u793a",
- "Do you want to allow this student ('{student_id}') to skip the entrance exam?": "\u60a8\u662f\u5426\u5141\u8bb8\u8be5\u5b66\u751f(\u201c{student_id}\u201d)\u8df3\u8fc7\u5165\u5b66\u8003\u8bd5\uff1f",
+ "Do not show again": "\u4e0d\u518d\u663e\u793a",
+ "Do you want to allow this student ('{student_id}') to skip the entrance exam?": "\u60a8\u662f\u5426\u5141\u8bb8\u8be5\u5b66\u751f('{student_id}')\u8df3\u8fc7\u5165\u5b66\u8003\u8bd5\uff1f",
"Document properties": "\u6587\u6863\u5c5e\u6027",
"Does the name on your ID match your account name: %(fullName)s?": "\u4f60\u8eab\u4efd\u8bc1\u4ef6\u4e0a\u7684\u59d3\u540d\u548c\u4f60\u5728\u8d26\u6237\u4e2d\u586b\u5199\u7684\u59d3\u540d\u201c%(fullName)s\u201d\u76f8\u7b26\u5417\uff1f",
"Does the photo of you match your ID photo?": "\u8fd9\u5f20\u7167\u7247\u548c\u4f60\u8eab\u4efd\u8bc1\u4ef6\u4e0a\u7684\u7167\u7247\u76f8\u5339\u914d\u5417\uff1f",
"Does the photo of you show your whole face?": "\u8fd9\u5f20\u7167\u7247\u4e2d\u6709\u4f60\u7684\u6574\u5f20\u8138\u5417\uff1f",
"Don't see your picture? Make sure to allow your browser to use your camera when it asks for permission.": "\u6ca1\u6709\u770b\u5230\u4f60\u81ea\u5df1\uff1f\u8bf7\u786e\u8ba4\u5f53\u6d4f\u89c8\u5668\u8bf7\u6c42\u4f7f\u7528\u6444\u50cf\u5934\u6743\u9650\u7684\u65f6\u5019\u4f60\u9009\u62e9\u4e86\u5141\u8bb8\u3002",
"Donate": "\u6350\u732e",
- "Double-check that your webcam is connected and working to continue.": "\u518d\u6b21\u786e\u8ba4\u4f60\u7684\u6444\u50cf\u5934\u5df2\u7ecf\u8fde\u63a5\u5e76\u4e14\u6b63\u5e38\u5de5\u4f5c\u4ee5\u7ee7\u7eed\u3002",
+ "Double-check that your webcam is connected and working to continue.": "\u7ee7\u7eed\u524d\u8bf7\u518d\u6b21\u786e\u8ba4\u60a8\u7684\u6444\u50cf\u5934\u5df2\u7ecf\u8fde\u63a5\u5e76\u4e14\u53ef\u4ee5\u6b63\u5e38\u4f7f\u7528\u3002",
"Drop target image": "\u62d6\u653e\u7684\u76ee\u6807\u56fe\u50cf",
"Due Date": "\u622a\u6b62\u65e5\u671f",
"Duplicating": "\u6b63\u5728\u590d\u5236",
@@ -307,32 +307,32 @@
"Enter the name of the cohort": "\u8bf7\u8f93\u5165\u7fa4\u7ec4\u7684\u540d\u5b57",
"Enter username or email": "\u8f93\u5165\u7528\u6237\u540d\u6216\u8005\u7535\u5b50\u90ae\u4ef6\u5730\u5740",
"Entrance exam attempts is being reset for student '{student_id}'.": "\u6b63\u5728\u91cd\u7f6e\u5b66\u751f\u201c{student_id}\u201d\u7684\u5165\u5b66\u8003\u8bd5\u5c1d\u8bd5\u6b21\u6570\u3002",
- "Entrance exam state is being deleted for student '{student_id}'.": "\u5b66\u751f\u201c{student_id}\u201d\u7684\u5165\u5b66\u8003\u8bd5\u7684\u72b6\u6001\u5df2\u88ab\u5220\u9664\u3002",
+ "Entrance exam state is being deleted for student '{student_id}'.": "\u5b66\u751f'{student_id}'\u7684\u5165\u5b66\u8003\u8bd5\u7684\u72b6\u6001\u5df2\u88ab\u5220\u9664\u3002",
"Error": "\u9519\u8bef",
"Error adding students.": "\u6dfb\u52a0\u5b66\u751f\u51fa\u73b0\u9519\u8bef",
"Error adding user": "\u6dfb\u52a0\u7528\u6237\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef",
"Error adding/removing users as beta testers.": "\u6dfb\u52a0\uff0f\u5220\u9664beta\u6d4b\u8bd5\u7528\u6237\u51fa\u9519\u3002",
"Error changing user's permissions.": "\u66f4\u6539\u7528\u6237\u6743\u9650\u51fa\u9519\u3002",
- "Error deleting entrance exam state for student '{student_id}'. Make sure student identifier is correct.": "\u5220\u9664\u5b66\u751f\u201c{student_id}\u201d\u7684\u5165\u5b66\u8003\u8bd5\u72b6\u6001\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
- "Error deleting student '<%= student_id %>'s state on problem '<%= problem_id %>'. Make sure that the problem and student identifiers are complete and correct.": "\u5220\u9664\u5b66\u751f\u201c<%= student_id %>\u201d\u5728\u95ee\u9898\u201c<%= problem_id %>\u201d\u4e0a\u7684\u72b6\u6001\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u53ca\u5b66\u751f\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
- "Error enrolling/unenrolling users.": "\u7528\u6237\u9009\u4fee\uff0f\u653e\u5f03\u9009\u4fee\u65f6\u51fa\u9519\u3002",
- "Error generating grades. Please try again.": "\u751f\u6210\u8bc4\u5206\u7ed3\u679c\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002",
- "Error generating student profile information. Please try again.": "\u751f\u6210\u5b66\u751f\u6863\u6848\u4fe1\u606f\u65f6\u51fa\u73b0\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002",
- "Error getting entrance exam task history for student '{student_id}'. Make sure student identifier is correct.": "\u83b7\u53d6\u5b66\u751f\u201c{student_id}\u201d\u7684\u5165\u5b66\u8003\u8bd5\u4efb\u52a1\u5386\u53f2\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
- "Error getting student list.": "\u65e0\u6cd5\u83b7\u53d6\u5b66\u751f\u5217\u8868",
- "Error getting student progress url for '<%= student_id %>'. Make sure that the student identifier is spelled correctly.": "\u83b7\u53d6\u5b66\u751f\u201c<%= student_id %>\u201d\u7684\u8fdb\u5ea6 URL \u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u5b66\u751f\u7684 ID \u5df2\u6b63\u786e\u62fc\u5199\u3002",
- "Error getting task history for problem '<%= problem_id %>' and student '<%= student_id %>'. Make sure that the problem and student identifiers are complete and correct.": "\u5728\u83b7\u53d6\u5b66\u751f\u201c<%= student_id %>\u201d\u5bf9\u95ee\u9898\u201c<%= problem_id %>\u201d\u7684\u4efb\u52a1\u5386\u53f2\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u53ca\u5b66\u751f\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
+ "Error deleting entrance exam state for student '{student_id}'. Make sure student identifier is correct.": "\u5220\u9664\u5b66\u751f'{student_id}'\u7684\u5165\u5b66\u8003\u8bd5\u72b6\u6001\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
+ "Error deleting student '<%= student_id %>'s state on problem '<%= problem_id %>'. Make sure that the problem and student identifiers are complete and correct.": "\u5220\u9664\u5b66\u751f'<%= student_id %>'\u5728\u95ee\u9898'<%= problem_id %>'\u4e0a\u7684\u72b6\u6001\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u53ca\u5b66\u751f\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
+ "Error enrolling/unenrolling users.": "\u7528\u6237\u9009\u8bfe\uff0f\u653e\u5f03\u9009\u8bfe\u65f6\u51fa\u9519\u3002",
+ "Error generating grades. Please try again.": "\u751f\u6210\u8bc4\u5206\u7ed3\u679c\u65f6\u53d1\u751f\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002",
+ "Error generating student profile information. Please try again.": "\u751f\u6210\u5b66\u751f\u6863\u6848\u4fe1\u606f\u65f6\u53d1\u751f\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5\u3002",
+ "Error getting entrance exam task history for student '{student_id}'. Make sure student identifier is correct.": "\u83b7\u53d6\u5b66\u751f'{student_id}'\u7684\u5165\u5b66\u8003\u8bd5\u4efb\u52a1\u5386\u53f2\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
+ "Error getting student list.": "\u83b7\u53d6\u5b66\u751f\u5217\u8868\u65f6\u53d1\u751f\u9519\u8bef",
+ "Error getting student progress url for '<%= student_id %>'. Make sure that the student identifier is spelled correctly.": "\u83b7\u53d6\u5b66\u751f\u201c<%= student_id %>\u201d\u7684\u8fdb\u5ea6 URL \u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u5b66\u751f\u7684 ID \u62fc\u5199\u6b63\u786e\u3002",
+ "Error getting task history for problem '<%= problem_id %>' and student '<%= student_id %>'. Make sure that the problem and student identifiers are complete and correct.": "\u5728\u83b7\u53d6\u5b66\u751f'<%= student_id %>'\u548c\u95ee\u9898'<%= problem_id %>'\u7684\u4efb\u52a1\u5386\u53f2\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u53ca\u5b66\u751f\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
"Error importing course": "\u5bfc\u5165\u8bfe\u7a0b\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef",
- "Error listing task history for this student and problem.": "\u5217\u8868\u663e\u793a\u8be5\u540d\u5b66\u751f\u4e0e\u95ee\u9898\u7684\u4efb\u52a1\u5386\u53f2\u65f6\u53d1\u751f\u9519\u8bef\u3002",
+ "Error listing task history for this student and problem.": "\u663e\u793a\u6b64\u5b66\u751f\u4e0e\u95ee\u9898\u7684\u4efb\u52a1\u5386\u53f2\u65f6\u53d1\u751f\u9519\u8bef\u3002",
"Error removing user": "\u5220\u9664\u7528\u6237\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef",
- "Error resetting entrance exam attempts for student '{student_id}'. Make sure student identifier is correct.": "\u91cd\u7f6e\u5b66\u751f\u201c{student_id}\u201d\u7684\u5165\u5b66\u8003\u8bd5\u5c1d\u8bd5\u6b21\u6570\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
- "Error resetting problem attempts for problem '<%= problem_id %>' and student '<%= student_id %>'. Make sure that the problem and student identifiers are complete and correct.": "\u91cd\u7f6e\u5b66\u751f\u201c<%= student_id %>\u201d\u5bf9\u95ee\u9898\u201c<%= problem_id %>\u201d\u7684\u5c1d\u8bd5\u6b21\u6570\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u53ca\u5b66\u751f\u7684 ID \u5df2\u6b63\u786e\u62fc\u5199\u3002",
+ "Error resetting entrance exam attempts for student '{student_id}'. Make sure student identifier is correct.": "\u91cd\u7f6e\u5b66\u751f'{student_id}'\u7684\u5165\u5b66\u8003\u8bd5\u5c1d\u8bd5\u6b21\u6570\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
+ "Error resetting problem attempts for problem '<%= problem_id %>' and student '<%= student_id %>'. Make sure that the problem and student identifiers are complete and correct.": "\u91cd\u7f6e\u5b66\u751f'<%= problem_id %>'\u5bf9\u95ee\u9898 '<%= student_id %>'\u7684\u5c1d\u8bd5\u6b21\u6570\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898ID\u53ca\u5b66\u751fID \u62fc\u5199\u6b63\u786e\u3002",
"Error retrieving grading configuration.": "\u53d6\u5f97\u8bc4\u5206\u6807\u51c6\u65f6\u9519\u8bef\u3002",
- "Error sending email.": "\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u9519\u8bef\u3002",
- "Error starting a task to rescore entrance exam for student '{student_id}'. Make sure that entrance exam has problems in it and student identifier is correct.": "\u4e3a\u5b66\u751f\u201c{student_id}\u201d\u5f00\u59cb\u8fd0\u884c\u91cd\u65b0\u8ba1\u7b97\u5165\u5b66\u8003\u8bd5\u5206\u6570\u7684\u4efb\u52a1\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u8be5\u5165\u5b66\u8003\u8bd5\u4e2d\u6709\u9898\u76ee\u5e76\u4e14\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
- "Error starting a task to rescore problem '<%= problem_id %>' for student '<%= student_id %>'. Make sure that the the problem and student identifiers are complete and correct.": "\u4e3a\u5b66\u751f\u201c<%= student_id %>\u201d\u542f\u52a8\u5bf9\u95ee\u9898\u201c<%= problem_id %>\u201d\u7684\u91cd\u65b0\u8bc4\u5206\u4efb\u52a1\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u53ca\u5b66\u751f\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
- "Error starting a task to rescore problem '<%= problem_id %>'. Make sure that the problem identifier is complete and correct.": "\u542f\u52a8\u5bf9\u95ee\u9898\u201c<%= problem_id %>\u201d\u7684\u91cd\u65b0\u8bc4\u5206\u4efb\u52a1\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
- "Error starting a task to reset attempts for all students on problem '<%= problem_id %>'. Make sure that the problem identifier is complete and correct.": "\u542f\u52a8\u91cd\u7f6e\u6240\u6709\u5b66\u751f\u5728\u95ee\u9898\u201c<%= problem_id %>\u201d\u4e0a\u5c1d\u8bd5\u6b21\u6570\u7684\u4efb\u52a1\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
+ "Error sending email.": "\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u65f6\u51fa\u9519\u3002",
+ "Error starting a task to rescore entrance exam for student '{student_id}'. Make sure that entrance exam has problems in it and student identifier is correct.": "\u4e3a\u5b66\u751f'{student_id}'\u5f00\u59cb\u8fd0\u884c\u91cd\u65b0\u8ba1\u7b97\u5165\u5b66\u8003\u8bd5\u5206\u6570\u7684\u4efb\u52a1\u65f6\u51fa\u9519\u4e86\uff0c\u8bf7\u786e\u8ba4\u8be5\u5165\u5b66\u8003\u8bd5\u4e2d\u6709\u9898\u76ee\u5e76\u4e14\u5b66\u751f\u7f16\u53f7\u65e0\u8bef\u3002",
+ "Error starting a task to rescore problem '<%= problem_id %>' for student '<%= student_id %>'. Make sure that the the problem and student identifiers are complete and correct.": "\u4e3a\u5b66\u751f '<%= student_id %>'\u542f\u52a8\u5bf9\u95ee\u9898'<%= problem_id %>'\u7684\u91cd\u65b0\u8bc4\u5206\u4efb\u52a1\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u53ca\u5b66\u751f\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
+ "Error starting a task to rescore problem '<%= problem_id %>'. Make sure that the problem identifier is complete and correct.": "\u542f\u52a8\u5bf9\u95ee\u9898'<%= problem_id %>'\u7684\u91cd\u65b0\u8bc4\u5206\u4efb\u52a1\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
+ "Error starting a task to reset attempts for all students on problem '<%= problem_id %>'. Make sure that the problem identifier is complete and correct.": "\u542f\u52a8\u91cd\u7f6e\u6240\u6709\u5b66\u751f\u5728\u95ee\u9898'<%= problem_id %>'\u4e0a\u5c1d\u8bd5\u6b21\u6570\u7684\u4efb\u52a1\u65f6\u51fa\u9519\u3002\u8bf7\u786e\u8ba4\u8be5\u95ee\u9898\u7684 ID \u662f\u5b8c\u6574\u4e14\u6b63\u786e\u7684\u3002",
"Error:": "\u9519\u8bef\uff1a",
"Error: Choosing failed.": "\u9519\u8bef\uff1a\u9009\u62e9\u5931\u8d25\u3002",
"Error: Connection with server failed.": "\u9519\u8bef\uff1a\u8fde\u63a5\u670d\u52a1\u5668\u5931\u8d25\u3002",
@@ -340,9 +340,9 @@
"Error: Replacing failed.": "\u9519\u8bef\uff1a\u66ff\u6362\u5931\u8d25\u3002",
"Error: Uploading failed.": "\u9519\u8bef\uff1a\u4e0a\u4f20\u5931\u8d25\u3002",
"Error: User '<%= username %>' has not yet activated their account. Users must create and activate their accounts before they can be assigned a role.": "\u9519\u8bef\uff1a\u7528\u6237\u201c<%= username %>\u201d\u5c1a\u672a\u6fc0\u6d3b\u4ed6\u7684\u8d26\u6237\uff0c\u7528\u6237\u5fc5\u987b\u5148\u521b\u5efa\u5e76\u6fc0\u6d3b\u540e\u65b9\u53ef\u4e3a\u5176\u5206\u914d\u89d2\u8272\u3002",
- "Error: You cannot remove yourself from the Instructor group!": "\u9519\u8bef\uff1a\u60a8\u4e0d\u53ef\u4ee5\u5c06\u81ea\u5df1\u4ece\u4e3b\u8bb2\u6559\u5e08\u7ec4\u4e2d\u5220\u9664\u3002",
+ "Error: You cannot remove yourself from the Instructor group!": "\u9519\u8bef\uff1a\u60a8\u4e0d\u53ef\u4ee5\u5c06\u81ea\u5df1\u4ece\u6559\u5e08\u7ec4\u4e2d\u5220\u9664\u3002",
"Errors": "\u9519\u8bef",
- "Exit full browser": "\u9000\u51fa\u5168\u5c4f\u6d4f\u89c8\u5668",
+ "Exit full browser": "\u9000\u51fa\u5168\u5c4f",
"Expand Instructions": "\u5c55\u5f00\u8bf4\u660e",
"Expand discussion": "\u5c55\u5f00\u8ba8\u8bba",
"Explicitly Hiding from Students": "\u660e\u786e\u5bf9\u5b66\u751f\u9690\u85cf",
@@ -354,7 +354,7 @@
"File Name": "\u6587\u4ef6\u540d",
"File {filename} exceeds maximum size of {maxFileSizeInMBs} MB": "\u6587\u4ef6 {filename} \u7684\u5927\u5c0f\u8d85\u8fc7\u4e86 {maxFileSizeInMBs} MB \u7684\u9650\u5236",
"Files must be in JPEG or PNG format.": "\u6587\u4ef6\u5fc5\u987b\u662fJPEG\u6216\u8005PNG\u683c\u5f0f\u3002",
- "Fill browser": "\u5168\u5c4f\u663e\u793a",
+ "Fill browser": "\u5168\u5c4f",
"Find": "\u67e5\u627e",
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Find discussions": "\u641c\u7d22\u8ba8\u8bba\u5e16",
@@ -430,7 +430,7 @@
"Inline": "\u5bf9\u9f50",
"Insert": "\u63d2\u5165",
"Insert Hyperlink": "\u63d2\u5165\u8d85\u94fe\u63a5",
- "Insert Image (upload file or type URL)": "\u63d2\u5165\u56fe\u7247 (\u4e0a\u4f20\u6587\u4ef6\u6216\u8f93\u5165\u56fe\u7247URL)",
+ "Insert Image (upload file or type URL)": "\u63d2\u5165\u56fe\u7247 (\u4e0a\u4f20\u6587\u4ef6\u6216\u8f93\u5165URL)",
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165\u5217",
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165\u5217",
"Insert date/time": "\u63d2\u5165\u65e5\u671f\uff0f\u65f6\u95f4",
@@ -444,7 +444,7 @@
"Insert/edit image": "\u63d2\u5165\uff0f\u7f16\u8f91\u56fe\u7247",
"Insert/edit link": "\u63d2\u5165\uff0f\u7f16\u8f91\u94fe\u63a5",
"Insert/edit video": "\u63d2\u5165\uff0f\u7f16\u8f91\u89c6\u9891",
- "Instructor": "\u4e3b\u8bb2\u6559\u5e08",
+ "Instructor": "\u6559\u5e08",
"Is your name on your ID readable?": "\u4f60\u8eab\u4efd\u8bc1\u4ef6\u4e0a\u7684\u540d\u5b57\u662f\u5426\u6e05\u6670\u53ef\u89c1\uff1f",
"Italic": "\u659c\u4f53",
"Italic (Ctrl+I)": "\u659c\u4f53(Ctrl+I)",
@@ -457,14 +457,14 @@
"Library User": "\u77e5\u8bc6\u5e93\u7528\u6237",
"Link Description": "\u94fe\u63a5\u7684\u63cf\u8ff0",
"Link types should be unique.": "\u94fe\u63a5\u7c7b\u578b\u5e94\u5f53\u552f\u4e00\u3002",
- "Links are generated on demand and expire within 5 minutes due to the sensitive nature of student information.": "\u7531\u4e8e\u6d89\u53ca\u5b66\u751f\u7684\u654f\u611f\u4fe1\u606f\uff0c\u751f\u6210\u7684\u94fe\u63a5\u5c06\u57285\u5206\u949f\u540e\u5931\u6548\u3002",
+ "Links are generated on demand and expire within 5 minutes due to the sensitive nature of student information.": "\u7531\u4e8e\u5305\u542b\u6d89\u53ca\u5b66\u751f\u7684\u654f\u611f\u4fe1\u606f\uff0c\u751f\u6210\u7684\u94fe\u63a5\u5c06\u57285\u5206\u949f\u540e\u5931\u6548\u3002",
"Links should be unique.": "\u94fe\u63a5\u5e94\u5f53\u552f\u4e00\u3002",
"List item": "\u5217\u8868\u9879",
"Live view of webcam": "\u6444\u50cf\u5934\u7684\u5b9e\u65f6\u753b\u9762",
"Load Another File": "\u52a0\u8f7d\u5176\u4ed6\u6587\u4ef6",
"Load all responses": "\u8f7d\u5165\u6240\u6709\u7684\u56de\u590d",
"Load more": "\u8f7d\u5165\u66f4\u591a",
- "Load next %(numResponses)s responses": "\u52a0\u8f7d\u4e0b\u9762\u7684%(numResponses)s\u6761\u56de\u590d",
+ "Load next %(numResponses)s responses": "\u52a0\u8f7d\u63a5\u4e0b\u6765\u7684%(numResponses)s\u6761\u56de\u590d",
"Load next %(num_items)s result": [
"\u52a0\u8f7d\u540e %(num_items)s \u4e2a\u7ed3\u679c"
],
@@ -473,7 +473,7 @@
"Loading more threads": "\u8f7d\u5165\u66f4\u591a\u7684\u4e3b\u9898",
"Loading thread list": "\u8f7d\u5165\u4e3b\u9898\u5217\u8868",
"Location in Course": "\u8bfe\u7a0b\u4e2d\u7684\u4f4d\u7f6e",
- "Loud": "\u5927\u58f0",
+ "Loud": "\u97f3\u91cf\u9ad8",
"Low": "\u4f4e",
"Lower Alpha": "\u5c0f\u5199\u5b57\u6bcd",
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
@@ -512,11 +512,11 @@
"No color": "\u65e0\u989c\u8272",
"No content-specific discussion topics exist.": "\u65e0\u7279\u5b9a\u5185\u5bb9\u7684\u8ba8\u8bba\u8bdd\u9898",
"No receipt available": "\u6ca1\u6709\u53ef\u63d0\u4f9b\u7684\u6536\u636e\u3002",
- "No results found for \"%(query_string)s\". Please try searching again.": "\u672a\u627e\u5230\u201c%(query_string)s\u201d\u3002\u8bf7\u91cd\u65b0\u641c\u7d22\u3002",
+ "No results found for \"%(query_string)s\". Please try searching again.": "\u672a\u627e\u5230\u6709\u5173\"%(query_string)s\"\u7684\u4efb\u4f55\u7ed3\u679c\u3002\u8bf7\u91cd\u65b0\u641c\u7d22\u3002",
"No results found for %(original_query)s. Showing results for %(suggested_query)s.": "\u672a\u627e\u5230\u4e0e %(original_query)s \u5339\u914d\u7684\u7ed3\u679c\u3002\u663e\u793a\u7684\u662f\u67e5\u627e %(suggested_query)s \u7684\u7ed3\u679c\u3002",
"No sources": "\u6ca1\u6709\u6e90",
"No tasks currently running.": "\u6ca1\u6709\u6b63\u5728\u6267\u884c\u7684\u4efb\u52a1",
- "No threads matched your query.": "\u672a\u627e\u5230\u5339\u914d\u7684\u7ed3\u679c",
+ "No threads matched your query.": "\u672a\u627e\u5230\u5339\u914d\u7684\u5e16\u5b50",
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
"None": "\u65e0",
"Not Graded": "\u5c1a\u672a\u8bc4\u5206",
@@ -534,11 +534,11 @@
"Only <%= fileTypes %> files can be uploaded. Please select a file ending in <%= fileExtensions %> to upload.": "\u53ea\u6709 <%= fileTypes %> \u683c\u5f0f\u7684\u6587\u4ef6\u53ef\u4ee5\u4e0a\u4f20\u3002\u8bf7\u9009\u62e9\u4e00\u4e2a\u4ee5 <%= fileExtensions %> \u7ed3\u5c3e\u7684\u6587\u4ef6\u4e0a\u4f20\u3002",
"Only properly formatted .csv files will be accepted.": "\u53ea\u6709\u6807\u51c6\u7684CSV\u683c\u5f0f\u6587\u4ef6\u4f1a\u88ab\u63a5\u53d7\u3002",
"Open Calculator": "\u6253\u5f00\u8ba1\u7b97\u5668",
- "Open language menu.": "\u6253\u5f00\u8bed\u8a00\u83dc\u5355\u3002",
+ "Open language menu.": "\u6253\u5f00\u8bed\u8a00\u529f\u80fd\u83dc\u5355\u3002",
"OpenAssessment Save Error": "\u5f00\u653e\u5f0f\u8bc4\u4f30\u4fdd\u5b58\u9519\u8bef",
"Order No.": "\u8ba2\u5355\u53f7\uff1a",
"Page break": "\u5206\u9875\u7b26",
- "Pagination": "\u5206\u9875",
+ "Pagination": "\u9875\u7801",
"Paragraph": "\u6bb5\u843d",
"Password": "\u5bc6\u7801",
"Password Reset Email Sent": "\u5bc6\u7801\u91cd\u7f6e\u90ae\u4ef6\u5df2\u53d1\u9001",
@@ -547,7 +547,7 @@
"Paste": "\u7c98\u8d34",
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u6240\u6709\u5185\u5bb9\u90fd\u5c06\u4ee5\u7eaf\u6587\u672c\u5f62\u5f0f\u7c98\u8d34\u3002\u5173\u95ed\u8be5\u9009\u9879\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
- "Paste row after": "\u5728\u4e0a\u65b9\u7c98\u8d34\u884c",
+ "Paste row after": "\u5728\u4e0b\u65b9\u7c98\u8d34\u884c",
"Paste row before": "\u5728\u4e0a\u65b9\u7c98\u8d34\u884c",
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5230\u4e0b\u65b9\uff1a",
"Pause": "\u6682\u505c",
@@ -579,8 +579,8 @@
"Please provide a description of the link destination.": "\u8bf7\u63d0\u4f9b\u94fe\u63a5\u7684\u63cf\u8ff0\u3002",
"Please select a PDF file to upload.": "\u8bf7\u9009\u62e9\u4e0a\u4f20\u4e00\u4e2aPDF\u6587\u4ef6\u3002",
"Please select a file in .srt format.": "\u8bf7\u9009\u62e9\u4e00\u4e2a .srt \u683c\u5f0f\u7684\u6587\u4ef6\u3002",
- "Please verify that you have uploaded a valid image (PNG and JPEG).": "\u8bf7\u9a8c\u8bc1\u4f60\u5df2\u4e0a\u4f20\u4e86\u4e00\u5f20\u6709\u6548\u7684\u56fe\u7247(PNG\u6216JPEG\u683c\u5f0f)\u3002",
- "Please verify that your webcam is connected and that you have allowed your browser to access it.": "\u8bf7\u68c0\u67e5\u4f60\u7684\u6444\u50cf\u5934\u5df2\u8fde\u63a5\u5e76\u4e14\u4f60\u7684\u6d4f\u89c8\u5668\u53ef\u4ee5\u8bbf\u95ee\u3002",
+ "Please verify that you have uploaded a valid image (PNG and JPEG).": "\u8bf7\u9a8c\u8bc1\u60a8\u5df2\u4e0a\u4f20\u4e86\u4e00\u5f20\u6709\u6548\u7684\u56fe\u7247(PNG\u6216JPEG\u683c\u5f0f)\u3002",
+ "Please verify that your webcam is connected and that you have allowed your browser to access it.": "\u8bf7\u68c0\u67e5\u60a8\u7684\u6444\u50cf\u5934\u5df2\u8fde\u63a5\u5e76\u4e14\u5141\u8bb8\u6d4f\u89c8\u5668\u4f7f\u7528\u5b83\u3002",
"Post body": "\u5e16\u5b50\u5185\u5bb9",
"Poster": "\u5c01\u9762",
"Pre": "Pre \u6807\u7b7e",
@@ -609,12 +609,12 @@
"Replace with": "\u66ff\u6362\u4e3a",
"Reply": "\u56de\u590d",
"Reply to Annotation": "\u56de\u590d\u6279\u6ce8",
- "Report annotation as inappropriate or offensive.": "\u62a5\u544a\u4e0d\u6070\u5f53\u7684\u6216\u5177\u6709\u653b\u51fb\u6027\u7684\u6279\u6ce8\u3002",
+ "Report annotation as inappropriate or offensive.": "\u62a5\u544a\u6b64\u6279\u6ce8\u4e0d\u6070\u5f53\u6216\u5177\u6709\u653b\u51fb\u6027\u3002",
"Requester": "\u8bf7\u6c42\u8005",
"Required field": "\u5fc5\u586b\u9879\u76ee",
- "Rescore problem '<%= problem_id %>' for all students?": "\u786e\u8ba4\u5bf9\u6240\u6709\u5b66\u751f\u56de\u7b54\u95ee\u9898\u201c<%= problem_id %>\u201d\u91cd\u65b0\u8bc4\u5206\uff1f",
+ "Rescore problem '<%= problem_id %>' for all students?": "\u786e\u8ba4\u5bf9\u6240\u6709\u5b66\u751f\u56de\u7b54\u95ee\u9898'<%= problem_id %>'\u91cd\u65b0\u8bc4\u5206\uff1f",
"Reset Password": "\u91cd\u8bbe\u5bc6\u7801",
- "Reset attempts for all students on problem '<%= problem_id %>'?": "\u786e\u8ba4\u91cd\u7f6e\u6240\u6709\u5b66\u751f\u5728\u95ee\u9898\u201c<%= problem_id %>\u201d\u7684\u5c1d\u8bd5\u6b21\u6570\uff1f",
+ "Reset attempts for all students on problem '<%= problem_id %>'?": "\u786e\u8ba4\u91cd\u7f6e\u6240\u6709\u5b66\u751f\u5728\u95ee\u9898'<%= problem_id %>'\u7684\u5c1d\u8bd5\u6b21\u6570\uff1f",
"Reset my password": "\u91cd\u8bbe\u6211\u7684\u5bc6\u7801",
"Restore last draft": "\u6062\u590d\u4e0a\u4e00\u7248\u8349\u7a3f",
"Retake Photo": "\u91cd\u65b0\u62cd\u7167",
@@ -669,7 +669,7 @@
],
"Sign in": "\u767b\u5f55",
"Skip": "\u8df3\u8fc7",
- "Sorry": "\u5f88\u62b1\u6b49",
+ "Sorry": "\u62b1\u6b49",
"Sorry, no results were found.": "\u5bf9\u4e0d\u8d77\uff0c\u672a\u627e\u5230\u641c\u7d22\u7ed3\u679c\u3002",
"Sorry, there was an error parsing the subtitles that you uploaded. Please check the format and try again.": "\u5bf9\u4e0d\u8d77\uff0c\u60a8\u4e0a\u4f20\u7684\u5b57\u5e55\u6587\u4ef6\u5b58\u5728\u683c\u5f0f\u9519\u8bef\uff0c\u8bf7\u68c0\u67e5\u5e76\u91cd\u65b0\u4e0a\u4f20\u3002",
"Source": "\u6e90",
@@ -685,8 +685,8 @@
"Start": "\u5f00\u59cb",
"Start Date": "\u5f00\u59cb\u65e5\u671f",
"Start search": "\u5f00\u59cb\u641c\u7d22",
- "Started entrance exam rescore task for student '{student_id}'. Click the 'Show Background Task History for Student' button to see the status of the task.": "\u5df2\u542f\u52a8\u4e3a\u5b66\u751f\u201c{student_id}\u201d\u91cd\u65b0\u8ba1\u7b97\u5165\u5b66\u8003\u8bd5\u5206\u6570\u7684\u4efb\u52a1\uff0c\u8bf7\u70b9\u51fb\u201c\u4e3a\u5b66\u751f\u663e\u793a\u540e\u53f0\u4efb\u52a1\u5386\u53f2\u201d\u6309\u94ae\u67e5\u770b\u4efb\u52a1\u72b6\u6001\u3002",
- "Started rescore problem task for problem '<%= problem_id %>' and student '<%= student_id %>'. Click the 'Show Background Task History for Student' button to see the status of the task.": "\u5df2\u542f\u52a8\u5bf9\u95ee\u9898\u201c<%= problem_id %>\u201d\u548c\u5b66\u751f\u201c<%= student_id %>\u201d\u7684\u91cd\u65b0\u8bc4\u5206\u4efb\u52a1\u3002\u70b9\u51fb '\u663e\u793a\u5b66\u751f\u7684\u80cc\u666f\u4efb\u52a1\u5386\u53f2' \u6309\u94ae\u6765\u67e5\u770b\u4efb\u52a1\u72b6\u6001\u3002",
+ "Started entrance exam rescore task for student '{student_id}'. Click the 'Show Background Task History for Student' button to see the status of the task.": "\u5df2\u542f\u52a8\u4e3a\u5b66\u751f'{student_id}'\u91cd\u65b0\u8ba1\u7b97\u5165\u5b66\u8003\u8bd5\u5206\u6570\u7684\u4efb\u52a1\uff0c\u8bf7\u70b9\u51fb\u201c\u4e3a\u5b66\u751f\u663e\u793a\u540e\u53f0\u4efb\u52a1\u5386\u53f2\u201d\u6309\u94ae\u67e5\u770b\u4efb\u52a1\u72b6\u6001\u3002",
+ "Started rescore problem task for problem '<%= problem_id %>' and student '<%= student_id %>'. Click the 'Show Background Task History for Student' button to see the status of the task.": "\u5df2\u542f\u52a8\u5bf9\u95ee\u9898'<%= problem_id %>'\u548c\u5b66\u751f '<%= student_id %>'\u7684\u91cd\u65b0\u8bc4\u5206\u4efb\u52a1\u3002\u70b9\u51fb\u201c\u663e\u793a\u5b66\u751f\u7684\u80cc\u666f\u4efb\u52a1\u5386\u53f2\u201d\u6309\u94ae\u6765\u67e5\u770b\u4efb\u52a1\u72b6\u6001\u3002",
"Starts: %(start)s": "\u5f00\u59cb\u4e8e\uff1a %(start)s",
"State": "\u72b6\u6001",
"Status": "\u72b6\u6001",
@@ -694,21 +694,21 @@
"Strikethrough": "\u5220\u9664\u7ebf",
"Studio's having trouble saving your work": "Studio \u4fdd\u5b58\u60a8\u5de5\u4f5c\u65f6\u9047\u5230\u95ee\u9898",
"Style": "\u6837\u5f0f",
- "Subject": "\u79d1\u76ee",
- "Subject:": "\u79d1\u76ee",
+ "Subject": "\u6807\u9898",
+ "Subject:": "\u6807\u9898",
"Submit": "\u63d0\u4ea4",
"Submitted": "\u5df2\u63d0\u4ea4",
"Subscript": "\u4e0b\u6807",
"Success": "\u6210\u529f",
- "Success! Problem attempts reset for problem '<%= problem_id %>' and student '<%= student_id %>'.": "\u6210\u529f\uff01\u95ee\u9898\u201c<%= problem_id %>\u201d\u4e0e\u5b66\u751f\u201c<%= student_id %>\u201d\u7684\u95ee\u9898\u5c1d\u8bd5\u6b21\u6570\u91cd\u7f6e\u4e86\u3002",
+ "Success! Problem attempts reset for problem '<%= problem_id %>' and student '<%= student_id %>'.": "\u6210\u529f\uff01\u5b66\u751f'<%= student_id %>'\u5bf9\u95ee\u9898'<%= problem_id %>'\u7684\u5c1d\u8bd5\u6b21\u6570\u5df2\u91cd\u7f6e\u3002",
"Successfully deleted student state for user {user}": "\u6210\u529f\u5220\u9664\u5b66\u751f{user}\u7684\u72b6\u6001",
- "Successfully enrolled and sent email to the following users:": "\u4ee5\u4e0b\u7528\u6237\u5df2\u6210\u529f\u9009\u4fee\uff0c\u5e76\u5411\u4ed6\u4eec\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\uff1a",
- "Successfully enrolled the following users:": "\u4ee5\u4e0b\u7528\u6237\u5df2\u7ecf\u6210\u529f\u9009\u4fee\uff1a",
+ "Successfully enrolled and sent email to the following users:": "\u4ee5\u4e0b\u7528\u6237\u5df2\u6210\u529f\u9009\u8bfe\uff0c\u5e76\u5411\u4ed6\u4eec\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\uff1a",
+ "Successfully enrolled the following users:": "\u4ee5\u4e0b\u7528\u6237\u5df2\u7ecf\u6210\u529f\u9009\u8bfe\uff1a",
"Successfully rescored problem for user {user}": "\u6210\u529f\u91cd\u8bc4\u7528\u6237 {user}\u5f97\u5206",
"Successfully reset the attempts for user {user}": "\u6210\u529f\u91cd\u7f6e\u7528\u6237{user}\u7684\u8bf7\u6c42",
- "Successfully sent enrollment emails to the following users. They will be allowed to enroll once they register:": "\u9009\u8bfe\u90ae\u4ef6\u5df2\u53d1\u9001\u81f3\u4ee5\u4e0b\u7528\u6237\uff0c\u4ed6\u4eec\u6ce8\u518c\u540e\u5373\u53ef\u9009\u8bfe\uff1a",
- "Successfully sent enrollment emails to the following users. They will be enrolled once they register:": "\u9009\u8bfe\u90ae\u4ef6\u5df2\u53d1\u9001\u81f3\u8fd9\u4e9b\u7528\u6237\uff0c\u4ed6\u4eec\u6ce8\u518c\u540e\u5373\u5df2\u9009\u8bfe\uff1a",
- "Successfully started task to rescore problem '<%= problem_id %>' for all students. Click the 'Show Background Task History for Problem' button to see the status of the task.": "\u6210\u529f\u542f\u52a8\u6240\u6709\u5b66\u751f\u56de\u7b54\u95ee\u9898 \u201c<%= problem_id %>\u201d\u91cd\u65b0\u8bc4\u5206\u7684\u4efb\u52a1\u3002\u70b9\u51fb\u201c\u663e\u793a\u95ee\u9898\u7684\u80cc\u666f\u4efb\u52a1\u5386\u53f2\u201d\u6309\u94ae\u6765\u67e5\u770b\u4efb\u52a1\u72b6\u6001\u3002",
+ "Successfully sent enrollment emails to the following users. They will be allowed to enroll once they register:": "\u9009\u8bfe\u90ae\u4ef6\u5df2\u6210\u529f\u53d1\u9001\u81f3\u4ee5\u4e0b\u7528\u6237\uff0c\u4ed6\u4eec\u6ce8\u518c\u540e\u5373\u53ef\u9009\u8bfe\uff1a",
+ "Successfully sent enrollment emails to the following users. They will be enrolled once they register:": "\u9009\u8bfe\u90ae\u4ef6\u5df2\u6210\u529f\u53d1\u9001\u81f3\u8fd9\u4e9b\u7528\u6237\uff0c\u4ed6\u4eec\u6ce8\u518c\u540e\u5373\u5df2\u9009\u8bfe\uff1a",
+ "Successfully started task to rescore problem '<%= problem_id %>' for all students. Click the 'Show Background Task History for Problem' button to see the status of the task.": "\u6210\u529f\u542f\u52a8\u6240\u6709\u5b66\u751f\u56de\u7b54\u95ee\u9898 '<%= problem_id %>'\u91cd\u65b0\u8bc4\u5206\u7684\u4efb\u52a1\u3002\u70b9\u51fb\u201c\u663e\u793a\u95ee\u9898\u7684\u80cc\u666f\u4efb\u52a1\u5386\u53f2\u201d\u6309\u94ae\u6765\u67e5\u770b\u4efb\u52a1\u72b6\u6001\u3002",
"Successfully started task to reset attempts for problem '<%= problem_id %>'. Click the 'Show Background Task History for Problem' button to see the status of the task.": "\u6210\u529f\u542f\u52a8\u91cd\u7f6e\u95ee\u9898\u201c<%= problem_id %>\u201d\u5c1d\u8bd5\u6b21\u6570\u7684\u4efb\u52a1\u3002\u70b9\u51fb\u201c\u663e\u793a\u95ee\u9898\u7684\u80cc\u666f\u4efb\u52a1\u5386\u53f2\u201d\u6309\u94ae\u6765\u67e5\u770b\u4efb\u52a1\u72b6\u6001\u3002",
"Superscript": "\u4e0a\u6807",
"Table": "\u8868\u683c",
@@ -732,8 +732,8 @@
"Text color": "\u6587\u672c\u989c\u8272",
"Text to display": "\u8981\u663e\u793a\u7684\u6587\u5b57",
"Thank you for submitting your photos. We will review them shortly. You can now sign up for any %(platformName)s course that offers verified certificates. Verification is good for one year. After one year, you must submit photos for verification again.": "\u611f\u8c22\u63d0\u4ea4\u60a8\u7684\u7167\u7247\uff0c\u6211\u4eec\u5c06\u4e8e\u7a0d\u540e\u8fdb\u884c\u5ba1\u6838\u3002\u60a8\u73b0\u5728\u5c31\u53ef\u4ee5\u6ce8\u518c%(platformName)s\u4e0a\u4efb\u4e00\u63d0\u4f9b\u8ba4\u8bc1\u8bc1\u4e66\u7684\u8bfe\u7a0b\u3002\u8ba4\u8bc1\u6709\u6548\u671f\u4e3a\u4e00\u5e74\u3002\u4e00\u5e74\u540e\uff0c\u60a8\u5fc5\u987b\u8981\u63d0\u4ea4\u7167\u7247\u91cd\u65b0\u8ba4\u8bc1\u3002",
- "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u8f93\u5165\u7684URL\u4f3c\u4e4e\u662f\u4e00\u4e2a\u7535\u5b50\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0a\u201cmailto:\u201d\u524d\u7f00\u5417\uff1f",
- "The URL you entered seems to be an external link. Do you want to add the required http:// prefix?": "\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0a\u201chttp://\u201d\u524d\u7f00\u5417\uff1f",
+ "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u8f93\u5165\u7684URL\u4f3c\u4e4e\u662f\u4e00\u4e2a\u7535\u5b50\u90ae\u4ef6\u5730\u5740\uff0c\u60a8\u60f3\u52a0\u4e0a\u5fc5\u8981\u7684\u201cmailto:\u201d\u524d\u7f00\u5417\uff1f",
+ "The URL you entered seems to be an external link. Do you want to add the required http:// prefix?": "\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\uff0c\u60a8\u60f3\u52a0\u4e0a\u5fc5\u8981\u7684 http:// \u524d\u7f00\u5417\uff1f",
"The cohort cannot be added": "\u8be5\u7fa4\u7ec4\u4e0d\u80fd\u6dfb\u52a0",
"The cohort cannot be saved": "\u8be5\u7fa4\u7ec4\u4e0d\u80fd\u4fdd\u5b58",
"The combined length of the organization and library code fields cannot be more than <%=limit%> characters.": "\u673a\u6784\u548c\u77e5\u8bc6\u5e93\u7f16\u53f7\u5b57\u6bb5\u5408\u5728\u4e00\u8d77\u4e0d\u80fd\u8d85\u8fc7 <%=limit%> \u4e2a\u5b57\u7b26",
@@ -749,11 +749,11 @@
"The grading process is still running. Refresh the page to see updates.": "\u8bc4\u5206\u8fc7\u7a0b\u4ecd\u5728\u8fdb\u884c\uff0c\u8bf7\u5237\u65b0\u9875\u9762\u67e5\u770b\u66f4\u65b0\u3002",
"The raw error message is:": "\u539f\u59cb\u7684\u9519\u8bef\u4fe1\u606f\u662f\uff1a",
"The selected content group does not exist": "\u9009\u53d6\u7684\u5185\u5bb9\u7ec4\u4e0d\u5b58\u5728\u3002",
- "The thread you selected has been deleted. Please select another thread.": "\u4f60\u9009\u4e2d\u7684\u4e3b\u9898\u5df2\u88ab\u5220\u9664\uff0c\u8bf7\u9009\u62e9\u5176\u4ed6\u4e3b\u9898\u3002",
+ "The thread you selected has been deleted. Please select another thread.": "\u60a8\u9009\u4e2d\u7684\u4e3b\u9898\u5df2\u88ab\u5220\u9664\uff0c\u8bf7\u9009\u62e9\u5176\u4ed6\u4e3b\u9898\u3002",
"The {cohortGroupName} cohort has been created. You can manually add students to this cohort below.": "{cohortGroupName}\u7fa4\u7ec4\u5df2\u7ecf\u521b\u5efa\uff0c\u60a8\u53ef\u4ee5\u624b\u52a8\u6dfb\u52a0\u5b66\u751f\u5230\u8fd9\u4e2a\u7fa4\u7ec4\u3002",
- "There are invalid keywords in your email. Please check the following keywords and try again:": "\u4f60\u7684\u90ae\u4ef6\u4e2d\u542b\u6709\u975e\u6cd5\u5173\u952e\u8bcd\u3002\u8bf7\u68c0\u67e5\u4e0b\u5217\u5173\u952e\u8bcd\u5e76\u91cd\u8bd5\uff1a",
+ "There are invalid keywords in your email. Please check the following keywords and try again:": "\u60a8\u7684\u90ae\u4ef6\u4e2d\u542b\u6709\u65e0\u6548\u5173\u952e\u8bcd\u3002\u8bf7\u68c0\u67e5\u4e0b\u5217\u5173\u952e\u8bcd\u5e76\u91cd\u8bd5\uff1a",
"There has been a failure to export to XML at least one component. It is recommended that you go to the edit page and repair the error before attempting another export. Please check that all components on the page are valid and do not display any error messages.": "\u81f3\u5c11\u6709\u4e00\u4e2a\u7ec4\u4ef6\u5728\u5bfc\u51fa\u5230XML\u65f6\u5931\u8d25\u4e86\u3002\u5728\u5c1d\u8bd5\u91cd\u65b0\u5bfc\u51fa\u4e4b\u524d\uff0c\u5efa\u8bae\u60a8\u5148\u53bb\u7f16\u8f91\u9875\u9762\u5e76\u4fee\u590d\u9519\u8bef\u3002\u8bf7\u68c0\u67e5\u5e76\u786e\u8ba4\u8fd9\u4e2a\u9875\u9762\u4e0a\u7684\u6240\u6709\u7684\u7ec4\u4ef6\u90fd\u6709\u6548\uff0c\u800c\u4e14\u6ca1\u6709\u663e\u793a\u4efb\u4f55\u9519\u8bef\u4fe1\u606f\u3002",
- "There has been an error processing your survey.": "\u5728\u5904\u7406\u4f60\u7684\u8c03\u67e5\u7684\u65f6\u5019\u51fa\u73b0\u4e86\u4e00\u4e2a\u9519\u8bef\u3002",
+ "There has been an error processing your survey.": "\u5728\u5904\u7406\u60a8\u7684\u8c03\u67e5\u65f6\u51fa\u73b0\u4e86\u4e00\u4e2a\u9519\u8bef\u3002",
"There has been an error while exporting.": "\u5bfc\u51fa\u65f6\u51fa\u9519\u4e86\u3002",
"There has been an error with your export.": "\u5bfc\u51fa\u65f6\u53d1\u751f\u4e86\u9519\u8bef\u3002",
"There is no email history for this course.": "\u672c\u8bfe\u7a0b\u5c1a\u65e0\u53d1\u9001\u7535\u5b50\u90ae\u4ef6\u8bb0\u5f55\u3002",
@@ -761,8 +761,8 @@
"There must be one cohort to which students can automatically be assigned.": "\u5fc5\u987b\u5b58\u5728\u4e00\u4e2a\u5b66\u751f\u53ef\u88ab\u81ea\u52a8\u5206\u914d\u8fdb\u53bb\u7684\u7fa4\u7ec4\u3002",
"There was an error changing the user's role": "\u66f4\u6539\u7528\u6237\u89d2\u8272\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef",
"There was an error during the upload process.": "\u5728\u6587\u4ef6\u4e0a\u4f20\u8fc7\u7a0b\u4e2d\u53d1\u751f\u9519\u8bef\u3002",
- "There was an error obtaining email content history for this course.": "\u5b58\u5728\u80fd\u83b7\u53d6\u8be5\u8bfe\u7a0b\u90ae\u4ef6\u5386\u53f2\u5185\u5bb9\u7684\u9519\u8bef",
- "There was an error obtaining email task history for this course.": "\u83b7\u53d6\u8be5\u8bfe\u7a0b\u7684\u90ae\u4ef6\u4efb\u52a1\u5386\u53f2\u65f6\u53d1\u751f\u9519\u8bef\u3002",
+ "There was an error obtaining email content history for this course.": "\u5b58\u5728\u80fd\u83b7\u53d6\u8be5\u8bfe\u7a0b\u90ae\u4ef6\u5185\u5bb9\u5386\u53f2\u8bb0\u5f55\u7684\u9519\u8bef",
+ "There was an error obtaining email task history for this course.": "\u83b7\u53d6\u8be5\u8bfe\u7a0b\u7684\u90ae\u4ef6\u4efb\u52a1\u5386\u53f2\u8bb0\u5f55\u65f6\u53d1\u751f\u9519\u8bef\u3002",
"There was an error when trying to add students:": [
"\u5c1d\u8bd5\u6dfb\u52a0\u5b66\u751f\u65f6\u51fa\u73b0 {numErrors} \u4e2a\u9519\u8bef\uff1a"
],
@@ -775,11 +775,11 @@
"There were errors reindexing course.": "\u91cd\u5efa\u8bfe\u7a0b\u7d22\u5f15\u65f6\u51fa\u9519\u4e86\u3002",
"There's already another assignment type with this name.": "\u5df2\u7ecf\u6709\u53e6\u4e00\u4e2a\u4f5c\u4e1a\u7c7b\u578b\u4f7f\u7528\u4e86\u8fd9\u4e2a\u540d\u5b57\u3002",
"These users were not added as beta testers:": "\u8fd9\u4e9b\u7528\u6237\u672a\u6dfb\u52a0\u4e3abeta\u6d4b\u8bd5\u8005\uff1a",
- "These users were not affiliated with the course so could not be unenrolled:": "\u8fd9\u4e9b\u7528\u6237\u5e76\u4e0d\u5c5e\u4e8e\u672c\u8bfe\u7a0b\u5b66\u5458\uff0c\u56e0\u6b64\u65e0\u6cd5\u653e\u5f03\u9009\u4fee\uff1a",
+ "These users were not affiliated with the course so could not be unenrolled:": "\u8fd9\u4e9b\u7528\u6237\u5e76\u4e0d\u5c5e\u4e8e\u672c\u8bfe\u7a0b\u5b66\u5458\uff0c\u56e0\u6b64\u65e0\u6cd5\u4f7f\u5176\u653e\u5f03\u9009\u4fee\uff1a",
"These users were not removed as beta testers:": "\u8fd9\u4e9b\u7528\u6237\u672a\u4ecebeta\u6d4b\u8bd5\u8005\u4e2d\u5220\u9664\uff1a",
"These users were successfully added as beta testers:": "\u8fd9\u4e9b\u7528\u6237\u5df2\u7ecf\u6dfb\u52a0\u4e3abeta\u6d4b\u8bd5\u8005\uff1a",
"These users were successfully removed as beta testers:": "\u8fd9\u4e9b\u7528\u6237\u4e0d\u518d\u662fbeta\u6d4b\u8bd5\u8005\uff1a",
- "These users will be allowed to enroll once they register:": "\u8fd9\u4e9b\u7528\u6237\u4e00\u65e6\u6ce8\u518c\u5373\u53ef\u9009\u4fee\uff1a",
+ "These users will be allowed to enroll once they register:": "\u8fd9\u4e9b\u7528\u6237\u4e00\u65e6\u6ce8\u518c\u5373\u53ef\u9009\u8bfe\uff1a",
"These users will be enrolled once they register:": "\u8fd9\u4e9b\u7528\u6237\u6ce8\u518c\u540e\u5373\u5df2\u9009\u8bfe\uff1a",
"This action cannot be undone.": "\u8fd9\u4e2a\u52a8\u4f5c\u65e0\u6cd5\u53d6\u6d88\u3002",
"This annotation has %(count)s flag.": [
@@ -794,9 +794,9 @@
"Tips on taking a successful photo": "\u6210\u529f\u62cd\u6444\u7684\u5c0f\u6280\u5de7",
"Title": "\u6807\u9898",
"Tools": "\u5de5\u5177",
- "Top": "\u9876\u7aef\u5bf9\u9f50",
+ "Top": "\u9876\u7aef",
"Total": "\u603b\u8ba1",
- "Transcript will be displayed when you start playing the video.": "\u5f53\u4f60\u5f00\u59cb\u64ad\u653e\u89c6\u9891\u65f6\u5c06\u663e\u793a\u6210\u7ee9\u5355\u3002",
+ "Transcript will be displayed when you start playing the video.": "\u5f53\u4f60\u5f00\u59cb\u64ad\u653e\u89c6\u9891\u65f6\u5c06\u663e\u793a\u5b57\u5e55\u3002",
"Try using a different browser, such as Google Chrome.": "\u8bf7\u8bd5\u7740\u66f4\u6362\u4e00\u4e2a\u6d4f\u89c8\u5668\uff0c\u5982\u8c37\u6b4c\u7684 Chrome \u6d4f\u89c8\u5668\u3002",
"Turn off transcripts": "\u5173\u95ed\u5b57\u5e55",
"Turn on transcripts": "\u6253\u5f00\u5b57\u5e55",
@@ -838,14 +838,14 @@
"Validation Error While Saving": "\u5728\u4fdd\u5b58\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9a8c\u8bc1\u9519\u8bef",
"Verified Status": "\u9a8c\u8bc1\u72b6\u6001",
"Vertical space": "\u5782\u76f4\u95f4\u8ddd",
- "Very loud": "\u5f88\u5927",
+ "Very loud": "\u97f3\u91cf\u5f88\u9ad8",
"Very low": "\u5f88\u4f4e",
"Video": "\u89c6\u9891",
"Video Capture Error": "\u89c6\u9891\u6355\u83b7\u5931\u8d25",
"Video ended": "\u89c6\u9891\u7ed3\u675f",
"Video position": "\u89c6\u9891\u4f4d\u7f6e",
- "Video transcript": "\u89c6\u9891\u6210\u7ee9\u5355",
- "VideoPlayer: Element corresponding to the given selector was not found.": "\u89c6\u9891\u64ad\u653e\u5668\uff1a\u672a\u627e\u5230\u4e0e\u7ed9\u5b9a\u9009\u62e9\u5b50\u5bf9\u5e94\u7684\u5143\u7d20\u3002",
+ "Video transcript": "\u89c6\u9891\u5b57\u5e55",
+ "VideoPlayer: Element corresponding to the given selector was not found.": "\u89c6\u9891\u64ad\u653e\u5668\uff1a\u672a\u627e\u5230\u4e0e\u7ed9\u5b9a\u9009\u62e9\u5bf9\u5e94\u7684\u5143\u7d20\u3002",
"View": "\u89c6\u56fe",
"View Cohort": "\u67e5\u770b\u7fa4\u7ec4",
"View all errors": "\u67e5\u770b\u6240\u6709\u9519\u8bef",
@@ -859,7 +859,7 @@
"We couldn't sign you in.": "\u767b\u5f55\u5931\u8d25\u3002",
"We had some trouble closing this thread. Please try again.": "\u5173\u95ed\u8fd9\u4e2a\u5e16\u5b50\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble deleting this comment. Please try again.": "\u5728\u5220\u9664\u8fd9\u6761\u8bc4\u8bba\u65f6\u51fa\u9519\uff0c\u8bf7\u518d\u8bd5\u4e00\u904d\u3002",
- "We had some trouble loading more responses. Please try again.": "\u8f7d\u5165\u56de\u590d\u65f6\u9047\u5230\u9ebb\u70e6\uff0c\u8bf7\u91cd\u8bd5\u3002",
+ "We had some trouble loading more responses. Please try again.": "\u8f7d\u5165\u66f4\u591a\u56de\u590d\u65f6\u9047\u5230\u9ebb\u70e6\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble loading more threads. Please try again.": "\u8f7d\u5165\u4e3b\u9898\u9047\u5230\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble loading responses. Please reload the page.": "\u8f7d\u5165\u56de\u590d\u65f6\u9047\u5230\u9ebb\u70e6\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble loading the discussion. Please try again.": "\u8f7d\u5165\u8ba8\u8bba\u65f6\u9047\u5230\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
@@ -872,7 +872,7 @@
"We had some trouble processing your request. Please try again.": "\u5904\u7406\u8bf7\u6c42\u9047\u5230\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble removing this endorsement. Please try again.": "\u53d6\u6d88\u6807\u8bb0\u8fd9\u4e2a\u56de\u590d\u4e3a\u652f\u6301\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble removing this response as an answer. Please try again.": "\u53d6\u6d88\u6807\u8bb0\u8fd9\u4e2a\u56de\u590d\u4e3a\u7b54\u6848\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
- "We had some trouble removing your flag on this post. Please try again.": "\u79fb\u9664\u8fd9\u4e2a\u5e16\u5b50\u7684\u62a5\u544a\u65d7\u5e1c\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
+ "We had some trouble removing your flag on this post. Please try again.": "\u79fb\u9664\u8fd9\u4e2a\u5e16\u5b50\u7684\u6807\u8bb0\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble reopening this thread. Please try again.": "\u91cd\u65b0\u5f00\u653e\u8fd9\u4e2a\u5e16\u5b50\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble reporting this post. Please try again.": "\u62a5\u544a\u8fd9\u4e2a\u5e16\u5b50\u4f7f\u7528\u4e0d\u5f53\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
"We had some trouble saving your vote. Please try again.": "\u4fdd\u5b58\u4f60\u7684\u6295\u7968\u65f6\u51fa\u73b0\u4e86\u4e00\u4e9b\u95ee\u9898\uff0c\u8bf7\u91cd\u8bd5\u3002",
@@ -883,7 +883,7 @@
"We use the highest levels of security available to encrypt your photo and send it to our authorization service for review. Your photo and information are not saved or visible anywhere on %(platformName)s after the verification process is complete.": "\u6211\u4eec\u4f1a\u91c7\u7528\u6700\u9ad8\u7ea7\u522b\u7684\u5b89\u5168\u6280\u672f\u6765\u52a0\u5bc6\u4f60\u7684\u7167\u7247\u5e76\u53d1\u9001\u5230\u6211\u4eec\u7684\u6388\u6743\u670d\u52a1\u7528\u4e8e\u5ba1\u6838\u76ee\u7684\uff1b\u4e00\u65e6\u5b8c\u6210\u4e86\u8ba4\u8bc1\u8fc7\u7a0b\uff0c%(platformName)s\u4e0d\u4f1a\u7ee7\u7eed\u4fdd\u5b58\u8fd9\u4e9b\u7167\u7247\u548c\u4fe1\u606f\u3002",
"We weren't able to send you a password reset email.": "\u5bc6\u7801\u91cd\u7f6e\u90ae\u4ef6\u53d1\u9001\u5931\u8d25\u3002",
"We're sorry, there was an error": "\u5f88\u62b1\u6b49\uff0c\u51fa\u73b0\u9519\u8bef",
- "We've encountered an error. Refresh your browser and then try again.": "\u6211\u4eec\u9047\u5230\u4e86\u4e00\u4e2a\u9519\u8bef\u3002\u8bf7\u5237\u65b0\u4f60\u7684\u6d4f\u89c8\u5668\u5e76\u91cd\u8bd5\u3002",
+ "We've encountered an error. Refresh your browser and then try again.": "\u6211\u4eec\u9047\u5230\u4e86\u4e00\u4e2a\u9519\u8bef\u3002\u8bf7\u5237\u65b0\u60a8\u7684\u6d4f\u89c8\u5668\u5e76\u91cd\u8bd5\u3002",
"We've sent instructions for resetting your password to the email address you provided.": "\u6211\u4eec\u5df2\u7ecf\u5411\u60a8\u63d0\u4f9b\u7684\u7535\u5b50\u90ae\u4ef6\u53d1\u9001\u4e86\u91cd\u7f6e\u5bc6\u7801\u7684\u8bf4\u660e\u3002",
"Webcam": "\u6444\u50cf\u5934",
"What does %(platformName)s do with this photo?": "%(platformName)s\u7528\u8fd9\u5f20\u7167\u7247\u505a\u4ec0\u4e48\uff1f",
@@ -893,8 +893,8 @@
"Width": "\u5bbd",
"Words: {0}": "\u5b57\u6570\uff1a {0}",
"Yes, delete this %(xblock_type)s": "\u662f\u7684\uff0c\u5220\u9664\u8be5%(xblock_type)s",
- "You are about to send an email titled '<%= subject %>' to ALL (everyone who is enrolled in this course as student, staff, or instructor). Is this OK?": "\u60a8\u5373\u5c06\u5411\u9009\u4fee\u8be5\u8bfe\u7a0b\u7684\u6240\u6709\u4eba(\u9009\u8bfe\u7684\u5b66\u751f\u3001\u6559\u5458\u548c\u4e3b\u8bb2\u6559\u5e08)\u53d1\u9001\u4e00\u5c01\u6807\u9898\u4e3a\u201c<%= subject %>\u201d\u7684\u90ae\u4ef6\uff0c\u786e\u8ba4\u5417\uff1f",
- "You are about to send an email titled '<%= subject %>' to everyone who is staff or instructor on this course. Is this OK?": "\u60a8\u51c6\u5907\u5411\u8be5\u8bfe\u7a0b\u7684\u6240\u6709\u6559\u5458\u548c\u4e3b\u8bb2\u6559\u5e08\u53d1\u9001\u4e00\u5c01\u6807\u9898\u4e3a\u201c<%= subject %>\u201d\u7684\u90ae\u4ef6\uff0c\u786e\u8ba4\u5417\uff1f",
+ "You are about to send an email titled '<%= subject %>' to ALL (everyone who is enrolled in this course as student, staff, or instructor). Is this OK?": "\u60a8\u5373\u5c06\u5411\u6b64\u8bfe\u7a0b\u4e2d\u7684\u6240\u6709\u4eba(\u9009\u8bfe\u7684\u5b66\u751f\u3001\u5de5\u4f5c\u4eba\u5458\u548c\u6559\u5e08)\u53d1\u9001\u4e00\u5c01\u6807\u9898\u4e3a\u201c<%= subject %>\u201d\u7684\u90ae\u4ef6\uff0c\u786e\u8ba4\u5417\uff1f",
+ "You are about to send an email titled '<%= subject %>' to everyone who is staff or instructor on this course. Is this OK?": "\u60a8\u51c6\u5907\u5411\u6b64\u8bfe\u7a0b\u7684\u6240\u6709\u5de5\u4f5c\u4eba\u5458\u548c\u6559\u5e08\u53d1\u9001\u4e00\u5c01\u6807\u9898\u4e3a\u201c<%= subject %>\u201d\u7684\u90ae\u4ef6\uff0c\u786e\u8ba4\u5417\uff1f",
"You are about to send an email titled '<%= subject %>' to yourself. Is this OK?": "\u4f60\u51c6\u5907\u5411\u81ea\u5df1\u53d1\u9001\u4e00\u5c01\u6807\u9898\u4e3a\u201c<%= subject %>\u201d\u7684\u90ae\u4ef6\uff0c\u786e\u8ba4\u5417\uff1f",
"You are now enrolled as a verified student for:": "\u60a8\u5df2\u7ecf\u5df2\u8ba4\u8bc1\u5b66\u751f\u7684\u8eab\u4efd\u9009\u62e9\u4e86\u8bfe\u7a0b\uff1a",
"You can now enter your payment information and complete your enrollment.": "\u4f60\u53ef\u4ee5\u73b0\u5728\u5c31\u8f93\u5165\u652f\u4ed8\u4fe1\u606f\u5e76\u5b8c\u6210\u9009\u8bfe\u3002",
@@ -903,8 +903,8 @@
"You commented...": "\u4f60\u8bc4\u8bba\u7684\u2026",
"You currently have no cohorts configured": "\u60a8\u76ee\u524d\u6ca1\u6709\u5df2\u914d\u7f6e\u7684\u7fa4\u7ec4",
"You did not select a content group": "\u60a8\u672a\u9009\u53d6\u5185\u5bb9\u7ec4\u3002",
- "You don't seem to have a webcam connected.": "\u8c8c\u4f3c\u4f60\u8fd8\u6ca1\u6709\u4e00\u4e2a\u53ef\u4f7f\u7528\u7684\u6444\u50cf\u5934\u3002",
- "You have already reported this annotation.": "\u60a8\u5df2\u7ecf\u62a5\u544a\u8fc7\u4e86\u8be5\u6279\u6ce8\u3002",
+ "You don't seem to have a webcam connected.": "\u60a8\u4f3c\u4e4e\u6ca1\u6709\u8fde\u63a5\u4e00\u4e2a\u6444\u50cf\u5934\u3002",
+ "You have already reported this annotation.": "\u60a8\u5df2\u7ecf\u62a5\u544a\u8fc7\u4e86\u6b64\u6279\u6ce8\u3002",
"You have already verified your ID!": "\u60a8\u5df2\u7ecf\u6210\u529f\u9a8c\u8bc1\u4e86\u60a8\u7684\u8eab\u4efd\u8bc1\u4ef6\uff01",
"You have been logged out of your edX account. ": "\u60a8\u5df2\u4ece\u60a8\u7684 edX \u8d26\u6237\u767b\u51fa\u3002",
"You have not created any content groups yet.": "\u60a8\u8fd8\u6ca1\u6709\u521b\u5efa\u4efb\u4f55\u5185\u5bb9\u7ec4\u3002",
@@ -927,9 +927,9 @@
"Your changes will not take effect until you save your progress. Take care with key and value formatting, as validation is not implemented.": "\u53d8\u66f4\u5728\u4fdd\u5b58\u4e4b\u540e\u751f\u6548\u3002\u7531\u4e8e\u7cfb\u7edf\u6682\u65f6\u4e0d\u652f\u6301\u6821\u9a8c\u529f\u80fd\uff0c\u8bf7\u4ed4\u7ec6\u68c0\u67e5\u7b56\u7565\u952e\u503c\u5bf9\u8bbe\u7f6e\u3002",
"Your course could not be exported to XML. There is not enough information to identify the failed component. Inspect your course to identify any problematic components and try again.": "\u60a8\u7684\u8bfe\u7a0b\u65e0\u6cd5\u5bfc\u51fa\u81f3XML\u3002\u6682\u65f6\u6ca1\u6709\u8db3\u591f\u7684\u4fe1\u606f\u6765\u5b9a\u4f4d\u5931\u8d25\u7684\u7ec4\u4ef6\uff0c\u8bf7\u68c0\u67e5\u60a8\u7684\u8bfe\u7a0b\u4ee5\u5b9a\u4f4d\u4efb\u4f55\u53ef\u80fd\u6709\u95ee\u9898\u7684\u7ec4\u4ef6\uff0c\u7136\u540e\u91cd\u8bd5\u3002",
"Your donation could not be submitted.": "\u60a8\u7684\u6350\u6b3e\u65e0\u6cd5\u63d0\u4ea4\u3002",
- "Your email was successfully queued for sending.": "\u4f60\u7684\u7535\u5b50\u90ae\u4ef6\u5df2\u6210\u529f\u52a0\u5165\u53d1\u9001\u961f\u5217\u3002",
- "Your email was successfully queued for sending. Please note that for large classes, it may take up to an hour (or more, if other courses are simultaneously sending email) to send all emails.": "\u4f60\u7684\u7535\u5b50\u90ae\u4ef6\u5df2\u6210\u529f\u52a0\u5165\u53d1\u9001\u961f\u5217\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u4e8e\u5927\u578b\u8bfe\u7a0b\uff0c\u53ef\u80fd\u9700\u8981\u82b1\u8d39\u4e00\u5c0f\u65f6\u4ee5\u4e0a(\u751a\u81f3\u66f4\u591a\uff0c\u5982\u679c\u5176\u4ed6\u8bfe\u7a0b\u4e5f\u5728\u540c\u65f6\u53d1\u9001\u90ae\u4ef6)\u6765\u53d1\u9001\u6240\u6709\u90ae\u4ef6\u3002",
- "Your file '{file}' has been uploaded. Allow a few minutes for processing.": "\u4f60\u7684\u6587\u4ef6\u201c{file}\u201d\u5df2\u7ecf\u4e0a\u4f20\u3002\u9700\u8981\u51e0\u5206\u949f\u65f6\u95f4\u8fdb\u884c\u5904\u7406\u3002",
+ "Your email was successfully queued for sending.": "\u60a8\u7684\u7535\u5b50\u90ae\u4ef6\u5df2\u6210\u529f\u52a0\u5165\u53d1\u9001\u961f\u5217\u3002",
+ "Your email was successfully queued for sending. Please note that for large classes, it may take up to an hour (or more, if other courses are simultaneously sending email) to send all emails.": "\u60a8\u7684\u7535\u5b50\u90ae\u4ef6\u5df2\u6210\u529f\u52a0\u5165\u53d1\u9001\u961f\u5217\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5bf9\u4e8e\u9009\u8bfe\u4eba\u6570\u591a\u7684\u8bfe\u7a0b\uff0c\u53ef\u80fd\u9700\u8981\u82b1\u8d39\u81f3\u591a\u4e00\u5c0f\u65f6(\u6216\u8005\u5982\u679c\u5176\u4ed6\u8bfe\u7a0b\u4e5f\u5728\u540c\u65f6\u53d1\u9001\u90ae\u4ef6)\u6765\u53d1\u9001\u6240\u6709\u90ae\u4ef6\u3002",
+ "Your file '{file}' has been uploaded. Allow a few minutes for processing.": "\u4f60\u7684\u6587\u4ef6'{file}'\u5df2\u7ecf\u4e0a\u4f20\u3002\u9700\u8981\u51e0\u5206\u949f\u65f6\u95f4\u8fdb\u884c\u5904\u7406\u3002",
"Your file could not be uploaded": "\u60a8\u7684\u6587\u4ef6\u65e0\u6cd5\u4e0a\u4f20\u3002",
"Your file has been deleted.": "\u60a8\u7684\u6587\u4ef6\u5df2\u7ecf\u88ab\u5220\u9664",
"Your import has failed.": "\u5bfc\u5165\u5931\u8d25\u3002",
@@ -938,10 +938,10 @@
"Your message must have a subject.": "\u60a8\u7684\u6d88\u606f\u5fc5\u987b\u6709\u4e00\u4e2a\u6807\u9898\u3002",
"Your policy changes have been saved.": "\u60a8\u7684\u7b56\u7565\u53d8\u66f4\u5df2\u4fdd\u5b58\u3002",
"Your post will be discarded.": "\u60a8\u7684\u5e16\u5b50\u5c06\u88ab\u64a4\u9500\u3002",
- "Your request could not be completed due to a server problem. Reload the page": "\u7531\u4e8e\u670d\u52a1\u5668\u7684\u95ee\u9898\uff0c\u65e0\u6cd5\u5b8c\u6210\u4f60\u7684\u8bf7\u6c42\uff0c\u8bf7\u91cd\u65b0\u52a0\u8f7d\u9875\u9762\u3002",
- "Your request could not be completed. Reload the page and try again. If the issue persists, click the Help tab to report the problem.": "\u4f60\u7684\u8bf7\u6c42\u65e0\u6cd5\u5b8c\u6210\u3002\u91cd\u65b0\u52a0\u8f7d\u9875\u9762\u5e76\u91cd\u8bd5\u3002\u5982\u679c\u95ee\u9898\u4ecd\u7136\u5b58\u5728\uff0c\u5219\u5355\u51fb\u201c\u5e2e\u52a9\u201d\u9009\u9879\u5361\u62a5\u544a\u95ee\u9898\u3002",
- "Your upload of '{file}' failed.": "\u4f60\u7684\u6587\u4ef6\u201c{file}\u201d\u4e0a\u4f20\u5931\u8d25\u3002",
- "Your upload of '{file}' succeeded.": "\u4f60\u7684\u6587\u4ef6\u201c{file}\u201d\u4e0a\u4f20\u6210\u529f\u3002",
+ "Your request could not be completed due to a server problem. Reload the page": "\u7531\u4e8e\u670d\u52a1\u5668\u7684\u95ee\u9898\uff0c\u65e0\u6cd5\u5b8c\u6210\u60a8\u7684\u8bf7\u6c42\uff0c\u8bf7\u91cd\u65b0\u52a0\u8f7d\u9875\u9762\u3002",
+ "Your request could not be completed. Reload the page and try again. If the issue persists, click the Help tab to report the problem.": "\u60a8\u7684\u8bf7\u6c42\u65e0\u6cd5\u5b8c\u6210\u3002\u91cd\u65b0\u52a0\u8f7d\u9875\u9762\u5e76\u91cd\u8bd5\u3002\u5982\u679c\u95ee\u9898\u4ecd\u7136\u5b58\u5728\uff0c\u70b9\u51fb\u201c\u5e2e\u52a9\u201d\u9009\u9879\u62a5\u544a\u95ee\u9898\u3002",
+ "Your upload of '{file}' failed.": "\u60a8\u7684\u6587\u4ef6'{file}'\u4e0a\u4f20\u5931\u8d25\u3002",
+ "Your upload of '{file}' succeeded.": "\u60a8\u7684\u6587\u4ef6'{file}'\u4e0a\u4f20\u6210\u529f\u3002",
"a day": "\u4e00\u5929",
"about %d hour": [
"\u5927\u7ea6 %d \u5c0f\u65f6"
diff --git a/cms/static/sass/_base.scss b/cms/static/sass/_base.scss
index 8da5903138..3fd284bdea 100644
--- a/cms/static/sass/_base.scss
+++ b/cms/static/sass/_base.scss
@@ -36,8 +36,8 @@ body, input, button {
font-family: 'Open Sans', sans-serif;
}
-// we want to hide the outline on the focusable
@@ -109,9 +108,7 @@
-
diff --git a/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js b/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
index 3f72dcb7b0..5ee38962a7 100644
--- a/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
+++ b/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
@@ -20,10 +20,12 @@ var options = {
libraryFilesToInclude: [
{pattern: 'common_static/js/vendor/requirejs/require.js', included: true},
{pattern: 'RequireJS-namespace-undefine.js', included: true},
+ {pattern: 'spec/main_requirejs.js', included: true},
{pattern: 'common_static/coffee/src/ajax_prefix.js', included: true},
{pattern: 'common_static/common/js/vendor/underscore.js', included: true},
{pattern: 'common_static/common/js/vendor/backbone.js', included: true},
+ {pattern: 'common_static/edx-ui-toolkit/js/utils/global-loader.js', included: true},
{pattern: 'common_static/js/vendor/CodeMirror/codemirror.js', included: true},
{pattern: 'common_static/js/vendor/draggabilly.js'},
{pattern: 'common_static/common/js/vendor/jquery.js', included: true},
@@ -48,14 +50,11 @@ var options = {
{pattern: 'common_static/js/vendor/jasmine-imagediff.js', included: true},
{pattern: 'common_static/common/js/spec_helpers/jasmine-waituntil.js', included: true},
{pattern: 'common_static/common/js/spec_helpers/jasmine-extensions.js', included: true},
- {pattern: 'common_static/js/vendor/sinon-1.17.0.js', included: true},
-
- {pattern: 'spec/main_requirejs.js', included: true},
+ {pattern: 'common_static/js/vendor/sinon-1.17.0.js', included: true}
],
libraryFiles: [
- {pattern: 'common_static/edx-pattern-library/js/**/*.js'},
- {pattern: 'common_static/edx-ui-toolkit/js/**/*.js'}
+ {pattern: 'common_static/edx-pattern-library/js/**/*.js'}
],
// Make sure the patterns in sourceFiles and specFiles do not match the same file.
diff --git a/common/lib/xmodule/xmodule/js/spec/main_requirejs.js b/common/lib/xmodule/xmodule/js/spec/main_requirejs.js
index d4692469e5..a57497f8c8 100644
--- a/common/lib/xmodule/xmodule/js/spec/main_requirejs.js
+++ b/common/lib/xmodule/xmodule/js/spec/main_requirejs.js
@@ -1,36 +1,4 @@
-(function(requirejs, define) {
- 'use strict';
- // We do not wish to bundle common libraries (that may also be used by non-RequireJS code on the page
- // into the optimized files. Therefore load these libraries through script tags and explicitly define them.
- // Note that when the optimizer executes this code, window will not be defined.
- if (window) {
- var defineDependency = function (globalName, name, noShim) {
- var getGlobalValue = function(name) {
- var globalNamePath = name.split('.'),
- result = window,
- i;
- for (i = 0; i < globalNamePath.length; i++) {
- result = result[globalNamePath[i]];
- }
- return result;
- },
- globalValue = getGlobalValue(globalName);
- if (globalValue) {
- if (noShim) {
- define(name, {});
- }
- else {
- define(name, [], function() { return globalValue; });
- }
- }
- else {
- console.error("Expected library to be included on page, but not found on window object: " + name);
- }
- };
- defineDependency("jQuery", "jquery");
- defineDependency("jQuery", "jquery-migrate");
- defineDependency("_", "underscore");
- }
+(function(requirejs) {
requirejs.config({
baseUrl: '/base/',
paths: {
@@ -38,8 +6,7 @@
"modernizr": "common_static/edx-pattern-library/js/modernizr-custom",
"afontgarde": "common_static/edx-pattern-library/js/afontgarde",
"edxicons": "common_static/edx-pattern-library/js/edx-icons",
- "draggabilly": "common_static/js/vendor/draggabilly",
- 'edx-ui-toolkit': 'common_static/edx-ui-toolkit'
+ "draggabilly": "common_static/js/vendor/draggabilly"
},
"moment": {
exports: "moment"
@@ -51,4 +18,5 @@
exports: "AFontGarde"
}
});
-}).call(this, RequireJS.requirejs, RequireJS.define);
+
+}).call(this, RequireJS.requirejs);
diff --git a/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js b/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js
index 5d85be2551..b8cf3065b1 100644
--- a/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js
+++ b/common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js
@@ -266,7 +266,6 @@
expect($('.closed-captions')).toHaveAttrs({
'lang': 'de'
});
- expect(link).toHaveAttr('aria-pressed', 'true');
});
it('when clicking on link with current language', function () {
@@ -285,7 +284,6 @@
expect(state.storage.setItem)
.not.toHaveBeenCalledWith('language', 'en');
expect($('.langs-list li.is-active').length).toBe(1);
- expect(link).toHaveAttr('aria-pressed', 'true');
});
it('open the language toggle on hover', function () {
@@ -415,7 +413,7 @@
});
it('show explanation message', function () {
- expect($('.subtitles .subtitles-menu li')).toHaveText(
+ expect($('.subtitles-menu li')).toHaveText(
'Transcript will be displayed when you start playing the video.'
);
});
diff --git a/common/lib/xmodule/xmodule/js/spec/video/video_speed_control_spec.js b/common/lib/xmodule/xmodule/js/spec/video/video_speed_control_spec.js
index f73b1f3c59..2a8b5e8b67 100644
--- a/common/lib/xmodule/xmodule/js/spec/video/video_speed_control_spec.js
+++ b/common/lib/xmodule/xmodule/js/spec/video/video_speed_control_spec.js
@@ -203,18 +203,16 @@
describe('onSpeedChange', function () {
beforeEach(function () {
state = jasmine.initializePlayer();
- $('li[data-speed="1.0"]').addClass('is-active').attr('aria-pressed', 'true');
+ $('li[data-speed="1.0"]').addClass('is-active');
state.videoSpeedControl.setSpeed(0.75);
});
it('set the new speed as active', function () {
- expect($('li[data-speed="1.0"]')).not.toHaveClass('is-active');
- expect($('li[data-speed="1.0"] .speed-option').attr('aria-pressed')).not.toEqual('true');
-
- expect($('li[data-speed="0.75"]')).toHaveClass('is-active');
- expect($('li[data-speed="0.75"] .speed-option').attr('aria-pressed')).toEqual('true');
-
- expect($('.speeds .speed-button .value')).toHaveHtml('0.75x');
+ expect($('.video-speeds li[data-speed="1.0"]'))
+ .not.toHaveClass('is-active');
+ expect($('.video-speeds li[data-speed="0.75"]'))
+ .toHaveClass('is-active');
+ expect($('.speeds .value')).toHaveHtml('0.75x');
});
});
diff --git a/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js b/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
index b54de6a24a..986d9ea7ff 100644
--- a/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
+++ b/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
@@ -1,10 +1,9 @@
(function (requirejs, require, define) {
"use strict";
define(
-'video/08_video_speed_control.js', [
- 'video/00_iterator.js',
- 'edx-ui-toolkit/js/utils/html-utils'
-], function (Iterator, HtmlUtils) {
+'video/08_video_speed_control.js',
+['video/00_iterator.js'],
+function (Iterator) {
/**
* Video speed control module.
* @exports video/08_video_speed_control.js
@@ -96,37 +95,23 @@ define(
* Creates any necessary DOM elements, attach them, and set their,
* initial configuration.
* @param {array} speeds List of speeds available for the player.
- * @param {string} currentSpeed The current speed set to the player.
*/
- render: function (speeds, currentSpeed) {
+ render: function (speeds) {
var speedsContainer = this.speedsContainer,
reversedSpeeds = speeds.concat().reverse(),
speedsList = $.map(reversedSpeeds, function (speed) {
- return HtmlUtils.interpolateHtml(
- HtmlUtils.joinHtml(
- HtmlUtils.HTML('
Some images in this post have been omitted
' - else - expectedHtml = expectedHtml + '' + expectedText + '' - - view = makeView(makeThread(threadData)) - view.render() - expect(view.$el.find(".post-body").html()).toEqual(expectedHtml) - - checkBody = (truncated, view, threadData) -> - view.render() - if not truncated - expect(view.model.get("body")).toEqual(view.model.get("abbreviatedBody")) - expect(view.$el.find(".post-body").html()).toEqual(threadData.body) - else - expect(view.model.get("body")).not.toEqual(view.model.get("abbreviatedBody")) - expect(view.$el.find(".post-body").html()).not.toEqual(threadData.body) - outputHtmlStripped = view.$el.find(".post-body").html().replace(/(<([^>]+)>)/ig,""); - outputHtmlStripped = outputHtmlStripped.replace("Some images in this post have been omitted","") - outputHtmlStripped = outputHtmlStripped.replace("image omitted","") - inputHtmlStripped = threadData.body.replace(/(<([^>]+)>)/ig,""); - expectedOutput = inputHtmlStripped.substring(0, 139)+ '…' - expect(outputHtmlStripped).toEqual(expectedOutput) - expect(view.$el.find(".post-body").html().indexOf("…")).toBeGreaterThan(0) - - describe "Body markdown should be correct", -> - - it "untruncated text without markdown body", -> - @threadData.body = "Test body" - view = makeView(makeThread(@threadData)) - checkBody(false, view, @threadData) - - it "truncated text without markdown body", -> - @threadData.body = new Array(100).join("test ") - view = makeView(makeThread(@threadData)) - checkBody(true, view, @threadData) - - it "untruncated text with markdown body", -> - @threadData.body = '' + @imageTag + 'Google top search engine
' - view = makeView(makeThread(@threadData)) - checkBody(false, view, @threadData) - - it "truncated text with markdown body", -> - testText = new Array(100).join("test ") - @threadData.body = '' + @imageTag + @imageTag + '' + testText + '
' - view = makeView(makeThread(@threadData)) - checkBody(true, view, @threadData) - - for numImages in [1, 2, 10] - for truncatedText in [true, false] - it "body with #{numImages} images and #{if truncatedText then "truncated" else "untruncated"} text", -> - checkPostWithImages(numImages, truncatedText, @threadData, @imageTag) - - it "check the thread retrieve url", -> - thread = makeThread(@threadData) - expect(thread.urlFor('retrieve')).toBe('/courses/edX/999/test/discussion/forum/dummy_discussion/threads/1') diff --git a/common/static/coffee/spec/discussion/view/discussion_thread_show_view_spec.coffee b/common/static/coffee/spec/discussion/view/discussion_thread_show_view_spec.coffee deleted file mode 100644 index 34036d847b..0000000000 --- a/common/static/coffee/spec/discussion/view/discussion_thread_show_view_spec.coffee +++ /dev/null @@ -1,159 +0,0 @@ -describe "DiscussionThreadShowView", -> - beforeEach -> - DiscussionSpecHelper.setUpGlobals() - DiscussionSpecHelper.setUnderscoreFixtures() - - @user = DiscussionUtil.getUser() - @threadData = { - id: "dummy", - user_id: @user.id, - username: @user.get('username'), - course_id: $$course_id, - title: "dummy title", - body: "this is a thread", - created_at: "2013-04-03T20:08:39Z", - abuse_flaggers: [], - votes: {up_count: 42}, - thread_type: "discussion", - closed: false, - pinned: false, - type: "thread" # TODO - silly that this needs to be explicitly set - } - @thread = new Thread(@threadData) - @view = new DiscussionThreadShowView({ model: @thread }) - @view.setElement($("#fixture-element")) - spyOn(@view, "convertMath") - - describe "voting", -> - - it "renders the vote state correctly", -> - DiscussionViewSpecHelper.checkRenderVote(@view, @thread) - - it "votes correctly via click", -> - DiscussionViewSpecHelper.checkUpvote(@view, @thread, @user, $.Event("click")) - - it "votes correctly via spacebar", -> - DiscussionViewSpecHelper.checkUpvote(@view, @thread, @user, $.Event("keydown", {which: 32})) - - it "unvotes correctly via click", -> - DiscussionViewSpecHelper.checkUnvote(@view, @thread, @user, $.Event("click")) - - it "unvotes correctly via spacebar", -> - DiscussionViewSpecHelper.checkUnvote(@view, @thread, @user, $.Event("keydown", {which: 32})) - - describe "pinning", -> - - expectPinnedRendered = (view, model) -> - pinned = model.get('pinned') - button = view.$el.find(".action-pin") - expect(button.hasClass("is-checked")).toBe(pinned) - expect(button.attr("aria-checked")).toEqual(pinned.toString()) - - it "renders the pinned state correctly", -> - @view.render() - expectPinnedRendered(@view, @thread) - @thread.set('pinned', false) - @view.render() - expectPinnedRendered(@view, @thread) - @thread.set('pinned', true) - @view.render() - expectPinnedRendered(@view, @thread) - - it "exposes the pinning control only to authorized users", -> - @thread.updateInfo({ability: {can_openclose: false}}) - @view.render() - expect(@view.$el.find(".action-pin").closest(".is-hidden")).toExist() - @thread.updateInfo({ability: {can_openclose: true}}) - @view.render() - expect(@view.$el.find(".action-pin").closest(".is-hidden")).not.toExist() - - it "handles events correctly", -> - @view.render() - DiscussionViewSpecHelper.checkButtonEvents(@view, "togglePin", ".action-pin") - - describe "labels", -> - - expectOneElement = (view, selector, visible=true) => - view.render() - elements = view.$el.find(selector) - expect(elements.length).toEqual(1) - if visible - expect(elements).not.toHaveClass("is-hidden") - else - expect(elements).toHaveClass("is-hidden") - - it 'displays the closed label when appropriate', -> - expectOneElement(@view, '.post-label-closed', false) - @thread.set('closed', true) - expectOneElement(@view, '.post-label-closed') - - it 'displays the pinned label when appropriate', -> - expectOneElement(@view, '.post-label-pinned', false) - @thread.set('pinned', true) - expectOneElement(@view, '.post-label-pinned') - - it 'displays the reported label when appropriate for a non-staff user', -> - expectOneElement(@view, '.post-label-reported', false) - # flagged by current user - should be labelled - @thread.set('abuse_flaggers', [DiscussionUtil.getUser().id]) - expectOneElement(@view, '.post-label-reported') - # flagged by some other user but not the current one - should not be labelled - @thread.set('abuse_flaggers', [DiscussionUtil.getUser().id + 1]) - expectOneElement(@view, '.post-label-reported', false) - - it 'displays the reported label when appropriate for a flag moderator', -> - DiscussionSpecHelper.makeModerator() - expectOneElement(@view, '.post-label-reported', false) - # flagged by current user - should be labelled - @thread.set('abuse_flaggers', [DiscussionUtil.getUser().id]) - expectOneElement(@view, '.post-label-reported') - # flagged by some other user but not the current one - should still be labelled - @thread.set('abuse_flaggers', [DiscussionUtil.getUser().id + 1]) - expectOneElement(@view, '.post-label-reported') - - describe "author display", -> - - beforeEach -> - @thread.set('user_url', 'test_user_url') - - checkUserLink = (element, is_ta, is_staff) -> - expect(element.find('a.username').length).toEqual(1) - expect(element.find('a.username').text()).toEqual('test_user') - expect(element.find('a.username').attr('href')).toEqual('test_user_url') - expect(element.find('.user-label-community-ta').length).toEqual(if is_ta then 1 else 0) - expect(element.find('.user-label-staff').length).toEqual(if is_staff then 1 else 0) - - it "renders correctly for a student-authored thread", -> - $el = $('#fixture-element').html(@view.getAuthorDisplay()) - checkUserLink($el, false, false) - - it "renders correctly for a community TA-authored thread", -> - @thread.set('community_ta_authored', true) - $el = $('#fixture-element').html(@view.getAuthorDisplay()) - checkUserLink($el, true, false) - - it "renders correctly for a staff-authored thread", -> - @thread.set('staff_authored', true) - $el = $('#fixture-element').html(@view.getAuthorDisplay()) - checkUserLink($el, false, true) - - it "renders correctly for an anonymously-authored thread", -> - @thread.set('username', null) - $el = $('#fixture-element').html(@view.getAuthorDisplay()) - expect($el.find('a.username').length).toEqual(0) - expect($el.text()).toMatch(/^(\s*)anonymous(\s*)$/) - - describe "cohorting", -> - it "renders correctly for an uncohorted thread", -> - @view.render() - expect(@view.$('.group-visibility-label').text().trim()).toEqual( - 'This post is visible to everyone.' - ) - - it "renders correctly for a cohorted thread", -> - @thread.set('group_id', '1') - @thread.set('group_name', 'Mock Cohort') - @view.render() - expect(@view.$('.group-visibility-label').text().trim()).toEqual( - 'This post is visible only to Mock Cohort.' - ) diff --git a/common/static/coffee/spec/discussion/view/discussion_thread_view_spec.coffee b/common/static/coffee/spec/discussion/view/discussion_thread_view_spec.coffee deleted file mode 100644 index 53904d9b87..0000000000 --- a/common/static/coffee/spec/discussion/view/discussion_thread_view_spec.coffee +++ /dev/null @@ -1,410 +0,0 @@ -describe "DiscussionThreadView", -> - beforeEach -> - DiscussionSpecHelper.setUpGlobals() - DiscussionSpecHelper.setUnderscoreFixtures() - - jasmine.clock().install() - @threadData = DiscussionViewSpecHelper.makeThreadWithProps({}) - @thread = new Thread(@threadData) - @discussion = new Discussion(@thread) - deferred = $.Deferred(); - spyOn($, "ajax").and.returnValue(deferred); - # Avoid unnecessary boilerplate - spyOn(DiscussionThreadShowView.prototype, "convertMath") - spyOn(DiscussionContentView.prototype, "makeWmdEditor") - spyOn(DiscussionUtil, "makeWmdEditor") - spyOn(DiscussionUtil, "setWmdContent") - spyOn(ThreadResponseShowView.prototype, "convertMath") - - afterEach -> - $.ajax.calls.reset() - jasmine.clock().uninstall() - - renderWithContent = (view, content) -> - $.ajax.and.callFake((params) => - params.success( - createAjaxResponseJson(content, false), - 'success' - ) - {always: ->} - ) - view.render() - jasmine.clock().tick(100) - - renderWithTestResponses = (view, count, options) -> - renderWithContent( - view, - _.extend( - { - resp_total: count, - children: if count > 0 then (createTestResponseJson(index) for index in [1..count]) else [] - }, - options - ) - ) - - createTestResponseJson = (index) -> - { - user_id: window.user.id, - body: "Response " + index, - id: "id_" + index, - created_at: "2015-01-01T22:20:28Z" - } - - assertContentVisible = (view, selector, visible) -> - content = view.$el.find(selector) - expect(content.length).toBeGreaterThan(0) - content.each (i, elem) -> - expect($(elem).is(":visible")).toEqual(visible) - - assertExpandedContentVisible = (view, expanded) -> - expect(view.$el.hasClass("expanded")).toEqual(expanded) - assertContentVisible(view, ".post-extended-content", expanded) - assertContentVisible(view, ".forum-thread-expand", not expanded) - assertContentVisible(view, ".forum-thread-collapse", expanded) - - assertResponseCountAndPaginationCorrect = (view, countText, displayCountText, buttonText) -> - expect(view.$el.find(".response-count").text()).toEqual(countText) - if displayCountText - expect(view.$el.find(".response-display-count").text()).toEqual(displayCountText) - else - expect(view.$el.find(".response-display-count").length).toEqual(0) - if buttonText - expect(view.$el.find(".load-response-button").text()).toEqual(buttonText) - else - expect(view.$el.find(".load-response-button").length).toEqual(0) - - createAjaxResponseJson = (content, can_act) -> - { - content: content, - annotated_content_info: { - ability: { - editable: can_act, - can_delete: can_act, - can_reply: can_act, - can_vote: can_act - } - } - } - - postResponse = (view, index) -> - testResponseJson = createTestResponseJson(index) - responseText = testResponseJson.body - spyOn(view, "getWmdContent").and.returnValue(responseText) - $.ajax.and.callFake((params) => - expect(params.type).toEqual("POST") - expect(params.data.body).toEqual(responseText) - params.success( - createAjaxResponseJson(testResponseJson, true), - 'success' - ) - {always: ->} - ) - view.$(".discussion-submit-post").click() - - describe "closed and open Threads", -> - - createDiscussionThreadView = (originallyClosed, mode) -> - threadData = DiscussionViewSpecHelper.makeThreadWithProps({closed: originallyClosed}) - thread = new Thread(threadData) - discussion = new Discussion(thread) - view = new DiscussionThreadView( - model: thread - el: $("#fixture-element") - mode: mode - course_settings: DiscussionSpecHelper.makeCourseSettings() - ) - renderWithTestResponses(view, 1) - if mode == "inline" - view.expand() - spyOn(DiscussionUtil, "updateWithUndo").and.callFake( - (model, updates, safeAjaxParams, errorMsg) -> - model.set(updates) - ) - view - - checkCommentForm = (originallyClosed, mode) -> - view = createDiscussionThreadView(originallyClosed, mode) - expect(view.$('.comment-form').closest('li').is(":visible")).toBe(not originallyClosed) - expect(view.$(".discussion-reply-new").is(":visible")).toBe(not originallyClosed) - view.$(".action-close").click() - expect(view.$('.comment-form').closest('li').is(":visible")).toBe(originallyClosed) - expect(view.$(".discussion-reply-new").is(":visible")).toBe(originallyClosed) - - checkVoteDisplay = (originallyClosed, mode) -> - view = createDiscussionThreadView(originallyClosed, mode) - expect(view.$('.thread-main-wrapper .action-vote').is(":visible")).toBe(not originallyClosed) - expect(view.$('.thread-main-wrapper .display-vote').is(":visible")).toBe(originallyClosed) - view.$(".action-close").click() - expect(view.$('.action-vote').is(":visible")).toBe(originallyClosed) - expect(view.$('.display-vote').is(":visible")).toBe(not originallyClosed) - - _.each(["tab", "inline"], (mode) => - it "Test that in #{mode} mode when a closed thread is opened the comment form is displayed", -> - checkCommentForm(true, mode) - - it "Test that in #{mode} mode when a open thread is closed the comment form is hidden", -> - checkCommentForm(false, mode) - - it "Test that in #{mode} mode when a closed thread is opened the vote button is displayed and vote count is hidden", -> - checkVoteDisplay(true, mode) - - it "Test that in #{mode} mode when a open thread is closed the vote button is hidden and vote count is displayed", -> - checkVoteDisplay(false, mode) - ) - - describe "tab mode", -> - beforeEach -> - @view = new DiscussionThreadView( - model: @thread - el: $("#fixture-element") - mode: "tab" - course_settings: DiscussionSpecHelper.makeCourseSettings() - ) - - describe "responses", -> - it "can post a first response", -> - # Initially render a test post (made by someone else) with zero responses - renderWithTestResponses(@view, 0) - postResponse(@view, 1) - expect(@view.$(".forum-response").length).toBe(1) - # At this point, there are 2 DiscussionContentViews, the main post and the response. - # Each an .action-edit button, but only 1 (the response) should be available. - expect(@view.$(".post-actions-list").find(".action-edit").parent(".is-hidden").length).toBe(1) - expect(@view.$(".response-actions-list").find(".action-edit").parent().not(".is-hidden").length).toBe(1) - - it "can post a second response", -> - # Initially render a test post (made by someone else) with a single response (made by the current learner) - renderWithTestResponses(@view, 1) - expect(@view.$(".forum-response").length).toBe(1) - # Post should not be editable, response should be - expect(@view.$(".post-actions-list").find(".action-edit").parent(".is-hidden").length).toBe(1) - expect(@view.$(".response-actions-list").find(".action-edit").parent().not(".is-hidden").length).toBe(1) - - # Now make a second response. Prior to TNL-3788, a bug would hide the edit button for the first response - postResponse(@view, 2) - expect(@view.$(".forum-response").length).toBe(2) - # Post should not be editable, responses should be - expect(@view.$(".post-actions-list").find(".action-edit").parent(".is-hidden").length).toBe(1) - expect(@view.$(".response-actions-list").find(".action-edit").parent().not(".is-hidden").length).toBe(2) - - describe "response count and pagination", -> - it "correctly render for a thread with no responses", -> - renderWithTestResponses(@view, 0) - assertResponseCountAndPaginationCorrect(@view, "0 responses", null, null) - - it "correctly render for a thread with one response", -> - renderWithTestResponses(@view, 1) - assertResponseCountAndPaginationCorrect(@view, "1 response", "Showing all responses", null) - - it "correctly render for a thread with one additional page", -> - renderWithTestResponses(@view, 1, {resp_total: 2}) - assertResponseCountAndPaginationCorrect(@view, "2 responses", "Showing first response", "Load all responses") - - it "correctly render for a thread with multiple additional pages", -> - renderWithTestResponses(@view, 2, {resp_total: 111}) - assertResponseCountAndPaginationCorrect(@view, "111 responses", "Showing first 2 responses", "Load next 100 responses") - - describe "on clicking the load more button", -> - beforeEach -> - renderWithTestResponses(@view, 1, {resp_total: 5}) - assertResponseCountAndPaginationCorrect(@view, "5 responses", "Showing first response", "Load all responses") - - it "correctly re-render when all threads have loaded", -> - renderWithTestResponses(@view, 5, {resp_total: 5}) - @view.$el.find(".load-response-button").click() - assertResponseCountAndPaginationCorrect(@view, "5 responses", "Showing all responses", null) - - it "correctly re-render when one page remains", -> - renderWithTestResponses(@view, 3, {resp_total: 42}) - @view.$el.find(".load-response-button").click() - assertResponseCountAndPaginationCorrect(@view, "42 responses", "Showing first 3 responses", "Load all responses") - - it "correctly re-render when multiple pages remain", -> - renderWithTestResponses(@view, 3, {resp_total: 111}) - @view.$el.find(".load-response-button").click() - assertResponseCountAndPaginationCorrect(@view, "111 responses", "Showing first 3 responses", "Load next 100 responses") - - describe "inline mode", -> - beforeEach -> - @view = new DiscussionThreadView( - model: @thread - el: $("#fixture-element") - mode: "inline" - course_settings: DiscussionSpecHelper.makeCourseSettings() - ) - - describe "render", -> - it "shows content that should be visible when collapsed", -> - @view.render() - assertExpandedContentVisible(@view, false) - - it "does not render any responses by default", -> - @view.render() - expect($.ajax).not.toHaveBeenCalled() - expect(@view.$el.find(".responses li").length).toEqual(0) - - describe "focus", -> - it "sends focus to the conversation when opened", (done) -> - DiscussionViewSpecHelper.setNextResponseContent({resp_total: 0, children: []}) - @view.render() - @view.expand() - self = @ - jasmine.waitUntil(-> - # This is the implementation of "toBeFocused". However, simply calling that method - # with no wait seems to be flaky. - article = self.view.$el.find('.discussion-article') - return article[0] == article[0].ownerDocument.activeElement - ).then -> - done() - - describe "expand/collapse", -> - it "shows/hides appropriate content", -> - DiscussionViewSpecHelper.setNextResponseContent({resp_total: 0, children: []}) - @view.render() - @view.expand() - assertExpandedContentVisible(@view, true) - @view.collapse() - assertExpandedContentVisible(@view, false) - - it "switches between the abbreviated and full body", -> - DiscussionViewSpecHelper.setNextResponseContent({resp_total: 0, children: []}) - longBody = new Array(100).join("test ") - expectedAbbreviation = DiscussionUtil.abbreviateString(longBody, 140) - @thread.set("body", longBody) - - @view.render() - expect($(".post-body").text()).toEqual(expectedAbbreviation) - expect(DiscussionThreadShowView.prototype.convertMath).toHaveBeenCalled() - DiscussionThreadShowView.prototype.convertMath.calls.reset() - - @view.expand() - expect($(".post-body").text()).toEqual(longBody) - expect(DiscussionThreadShowView.prototype.convertMath).toHaveBeenCalled() - DiscussionThreadShowView.prototype.convertMath.calls.reset() - - @view.collapse() - expect($(".post-body").text()).toEqual(expectedAbbreviation) - expect(DiscussionThreadShowView.prototype.convertMath).toHaveBeenCalled() - - it "strips script tags appropriately", -> - DiscussionViewSpecHelper.setNextResponseContent({resp_total: 0, children: []}) - longMaliciousBody = new Array(100).join("\n") - @thread.set("body", longMaliciousBody) - maliciousAbbreviation = DiscussionUtil.abbreviateString(@thread.get('body'), 140) - - # The nodes' html should be different than the strings, but - # their texts should be the same, indicating that they've been - # properly escaped. To be safe, make sure the string ""); + /* jshint +W101 */ + this.threads = [ + DiscussionViewSpecHelper.makeThreadWithProps({ + id: "1", + title: "Thread1", + votes: { + up_count: '20' + }, + pinned: true, + comments_count: 1, + created_at: '2013-04-03T20:08:39Z' + }), DiscussionViewSpecHelper.makeThreadWithProps({ + id: "2", + title: "Thread2", + votes: { + up_count: '42' + }, + comments_count: 2, + created_at: '2013-04-03T20:07:39Z' + }), DiscussionViewSpecHelper.makeThreadWithProps({ + id: "3", + title: "Thread3", + votes: { + up_count: '12' + }, + comments_count: 3, + created_at: '2013-04-03T20:06:39Z' + }), DiscussionViewSpecHelper.makeThreadWithProps({ + id: "4", + title: "Thread4", + votes: { + up_count: '25' + }, + comments_count: 0, + pinned: true, + created_at: '2013-04-03T20:05:39Z' + }) + ]; + deferred = $.Deferred(); + spyOn($, "ajax").and.returnValue(deferred); + this.discussion = new Discussion([]); + this.view = new DiscussionThreadListView({ + collection: this.discussion, + el: $("#fixture-element"), + courseSettings: new DiscussionCourseSettings({ + is_cohorted: true + }) + }); + return this.view.render(); + }); + setupAjax = function(callback) { + return $.ajax.and.callFake(function(params) { + if (callback) { + callback(params); + } + params.success({ + discussion_data: [], + page: 1, + num_pages: 1 + }); + return { + always: function() { + } + }; + }); + }; + renderSingleThreadWithProps = function(props) { + return makeView(new Discussion([new Thread(DiscussionViewSpecHelper.makeThreadWithProps(props))])).render(); + }; + makeView = function(discussion) { + return new DiscussionThreadListView({ + el: $("#fixture-element"), + collection: discussion, + courseSettings: new DiscussionCourseSettings({ + is_cohorted: true + }) + }); + }; + expectFilter = function(filterVal) { + return $.ajax.and.callFake(function(params) { + _.each(["unread", "unanswered", "flagged"], function(paramName) { + if (paramName === filterVal) { + return expect(params.data[paramName]).toEqual(true); + } else { + return expect(params.data[paramName]).toBeUndefined(); + } + }); + return { + always: function() { + } + }; + }); + }; + + describe("should filter correctly", function() { + return _.each(["all", "unread", "unanswered", "flagged"], function(filterVal) { + it("for " + filterVal, function() { + expectFilter(filterVal); + this.view.$(".forum-nav-filter-main-control").val(filterVal).change(); + return expect($.ajax).toHaveBeenCalled(); + }); + }); + }); + + describe("cohort selector", function() { + it("should not be visible to students", function() { + return expect(this.view.$(".forum-nav-filter-cohort-control:visible")).not.toExist(); + }); + it("should allow moderators to select visibility", function() { + var expectedGroupId, + self = this; + DiscussionSpecHelper.makeModerator(); + this.view.render(); + expectedGroupId = null; + setupAjax(function(params) { + return expect(params.data.group_id).toEqual(expectedGroupId); + }); + return _.each([ + { + val: "", + expectedGroupId: void 0 + }, { + val: "1", + expectedGroupId: "1" + }, { + val: "2", + expectedGroupId: "2" + } + ], function(optionInfo) { + expectedGroupId = optionInfo.expectedGroupId; + self.view.$(".forum-nav-filter-cohort-control").val(optionInfo.val).change(); + expect($.ajax).toHaveBeenCalled(); + return $.ajax.calls.reset(); + }); + }); + }); + + it("search should clear filter", function() { + expectFilter(null); + this.view.$(".forum-nav-filter-main-control").val("flagged"); + this.view.searchFor("foobar"); + return expect(this.view.$(".forum-nav-filter-main-control").val()).toEqual("all"); + }); + + checkThreadsOrdering = function(view, sort_order, type) { + expect(view.$el.find(".forum-nav-thread").children().length).toEqual(4); + expect(view.$el.find(".forum-nav-thread:nth-child(1) .forum-nav-thread-title").text()) + .toEqual(sort_order[0]); + expect(view.$el.find(".forum-nav-thread:nth-child(2) .forum-nav-thread-title").text()) + .toEqual(sort_order[1]); + expect(view.$el.find(".forum-nav-thread:nth-child(3) .forum-nav-thread-title").text()) + .toEqual(sort_order[2]); + expect(view.$el.find(".forum-nav-thread:nth-child(4) .forum-nav-thread-title").text()) + .toEqual(sort_order[3]); + return expect(view.$el.find(".forum-nav-sort-control").val()).toEqual(type); + }; + + describe("thread rendering should be correct", function() { + var checkRender; + checkRender = function(threads, type, sort_order) { + var discussion, view; + discussion = new Discussion(_.map(threads, function(thread) { + return new Thread(thread); + }), { + pages: 1, + sort: type + }); + view = makeView(discussion); + view.render(); + checkThreadsOrdering(view, sort_order, type); + expect(view.$el.find(".forum-nav-thread-comments-count:visible").length) + .toEqual(type === "votes" ? 0 : 4); + expect(view.$el.find(".forum-nav-thread-votes-count:visible").length) + .toEqual(type === "votes" ? 4 : 0); + if (type === "votes") { + return expect(_.map(view.$el.find(".forum-nav-thread-votes-count"), function(element) { + return $(element).text().trim(); + })).toEqual(["+25 votes", "+20 votes", "+42 votes", "+12 votes"]); + } + }; + + it("with sort preference activity", function() { + return checkRender(this.threads, "activity", ["Thread1", "Thread2", "Thread3", "Thread4"]); + }); + + it("with sort preference votes", function() { + return checkRender(this.threads, "votes", ["Thread4", "Thread1", "Thread2", "Thread3"]); + }); + + it("with sort preference comments", function() { + return checkRender(this.threads, "comments", ["Thread1", "Thread4", "Thread3", "Thread2"]); + }); + }); + + describe("Sort change should be correct", function() { + var changeSorting; + changeSorting = function(threads, selected_type, new_type, sort_order) { + var discussion, sortControl, sorted_threads, view; + discussion = new Discussion(_.map(threads, function(thread) { + return new Thread(thread); + }), { + pages: 1, + sort: selected_type + }); + view = makeView(discussion); + view.render(); + sortControl = view.$el.find(".forum-nav-sort-control"); + expect(sortControl.val()).toEqual(selected_type); + sorted_threads = []; + if (new_type === 'activity') { + sorted_threads = [threads[0], threads[3], threads[1], threads[2]]; + } else if (new_type === 'comments') { + sorted_threads = [threads[0], threads[3], threads[2], threads[1]]; + } else if (new_type === 'votes') { + sorted_threads = [threads[3], threads[0], threads[1], threads[2]]; + } + $.ajax.and.callFake(function(params) { + params.success({ + "discussion_data": sorted_threads, + page: 1, + num_pages: 1 + }); + return { + always: function() { + } + }; + }); + sortControl.val(new_type).change(); + expect($.ajax).toHaveBeenCalled(); + checkThreadsOrdering(view, sort_order, new_type); + }; + + it("with sort preference activity", function() { + changeSorting( + this.threads, "comments", "activity", ["Thread1", "Thread4", "Thread3", "Thread2"] + ); + }); + + it("with sort preference votes", function() { + changeSorting(this.threads, "activity", "votes", ["Thread4", "Thread1", "Thread2", "Thread3"]); + }); + + it("with sort preference comments", function() { + changeSorting(this.threads, "votes", "comments", ["Thread1", "Thread4", "Thread3", "Thread2"]); + }); + }); + describe("search alerts", function() { + var testAlertMessages; + + testAlertMessages = function(expectedMessages) { + return expect($(".search-alert .message").map(function() { + return $(this).html(); + }).get()).toEqual(expectedMessages); + }; + + it("renders and removes search alerts", function() { + var bar, foo; + testAlertMessages([]); + foo = this.view.addSearchAlert("foo"); + testAlertMessages(["foo"]); + bar = this.view.addSearchAlert("bar"); + testAlertMessages(["foo", "bar"]); + this.view.removeSearchAlert(foo.cid); + testAlertMessages(["bar"]); + this.view.removeSearchAlert(bar.cid); + return testAlertMessages([]); + }); + + it("clears all search alerts", function() { + this.view.addSearchAlert("foo"); + this.view.addSearchAlert("bar"); + this.view.addSearchAlert("baz"); + testAlertMessages(["foo", "bar", "baz"]); + this.view.clearSearchAlerts(); + return testAlertMessages([]); + }); + }); + + describe("search spell correction", function() { + var testCorrection; + + beforeEach(function() { + return spyOn(this.view, "searchForUser"); + }); + + testCorrection = function(view, correctedText) { + spyOn(view, "addSearchAlert"); + $.ajax.and.callFake(function(params) { + params.success({ + discussion_data: [], + page: 42, + num_pages: 99, + corrected_text: correctedText + }, 'success'); + return { + always: function() { + } + }; + }); + view.searchFor("dummy"); + return expect($.ajax).toHaveBeenCalled(); + }; + + it("adds a search alert when an alternate term was searched", function() { + testCorrection(this.view, "foo"); + expect(this.view.addSearchAlert.calls.count()).toEqual(1); + return expect(this.view.addSearchAlert.calls.mostRecent().args[0]).toMatch(/foo/); + }); + + it("does not add a search alert when no alternate term was searched", function() { + testCorrection(this.view, null); + expect(this.view.addSearchAlert.calls.count()).toEqual(1); + return expect(this.view.addSearchAlert.calls.mostRecent().args[0]).toMatch(/no threads matched/i); + }); + + it("clears search alerts when a new search is performed", function() { + spyOn(this.view, "clearSearchAlerts"); + spyOn(DiscussionUtil, "safeAjax"); + this.view.searchFor("dummy"); + return expect(this.view.clearSearchAlerts).toHaveBeenCalled(); + }); + + it("clears search alerts when the underlying collection changes", function() { + spyOn(this.view, "clearSearchAlerts"); + spyOn(this.view, "renderThread"); + this.view.collection.trigger("change", new Thread({ + id: 1 + })); + return expect(this.view.clearSearchAlerts).toHaveBeenCalled(); + }); + }); + + describe("Search events", function() { + it("perform search when enter pressed inside search textfield", function() { + setupAjax(); + spyOn(this.view, "searchFor"); + this.view.$el.find(".forum-nav-search-input").trigger($.Event("keydown", { + which: 13 + })); + return expect(this.view.searchFor).toHaveBeenCalled(); + }); + + it("perform search when search icon is clicked", function() { + setupAjax(); + spyOn(this.view, "searchFor"); + this.view.$el.find(".fa-search").click(); + return expect(this.view.searchFor).toHaveBeenCalled(); + }); + }); + + describe("username search", function() { + var setAjaxResults; + + it("makes correct ajax calls", function() { + $.ajax.and.callFake(function(params) { + expect(params.data.username).toEqual("testing-username"); + expect(params.url.path()).toEqual(DiscussionUtil.urlFor("users")); + params.success({ + users: [] + }, 'success'); + return { + always: function() { + } + }; + }); + this.view.searchForUser("testing-username"); + return expect($.ajax).toHaveBeenCalled(); + }); + + setAjaxResults = function(threadSuccess, userResult) { + return $.ajax.and.callFake(function(params) { + if (params.data.text && threadSuccess) { + params.success({ + discussion_data: [], + page: 42, + num_pages: 99, + corrected_text: "dummy" + }, "success"); + } else if (params.data.username) { + params.success({ + users: userResult + }, "success"); + } + return { + always: function() { + } + }; + }); + }; + + it("gets called after a thread search succeeds", function() { + spyOn(this.view, "searchForUser").and.callThrough(); + setAjaxResults(true, []); + this.view.searchFor("gizmo"); + expect(this.view.searchForUser).toHaveBeenCalled(); + return expect($.ajax.calls.mostRecent().args[0].data.username).toEqual("gizmo"); + }); + + it("does not get called after a thread search fails", function() { + spyOn(this.view, "searchForUser").and.callThrough(); + setAjaxResults(false, []); + this.view.searchFor("gizmo"); + return expect(this.view.searchForUser).not.toHaveBeenCalled(); + }); + + it("adds a search alert when an username was matched", function() { + spyOn(this.view, "addSearchAlert"); + setAjaxResults(true, [ + { + username: "gizmo", + id: "1" + } + ]); + this.view.searchForUser("dummy"); + expect($.ajax).toHaveBeenCalled(); + expect(this.view.addSearchAlert).toHaveBeenCalled(); + return expect(this.view.addSearchAlert.calls.mostRecent().args[0]).toMatch(/gizmo/); + }); + + it("does not add a search alert when no username was matched", function() { + spyOn(this.view, "addSearchAlert"); + setAjaxResults(true, []); + this.view.searchForUser("dummy"); + expect($.ajax).toHaveBeenCalled(); + return expect(this.view.addSearchAlert).not.toHaveBeenCalled(); + }); + }); + + describe("post type renders correctly", function() { + it("for discussion", function() { + renderSingleThreadWithProps({ + thread_type: "discussion" + }); + expect($(".forum-nav-thread-wrapper-0 .icon")).toHaveClass("fa-comments"); + return expect($(".forum-nav-thread-wrapper-0 .sr")).toHaveText("discussion"); + }); + + it("for answered question", function() { + renderSingleThreadWithProps({ + thread_type: "question", + endorsed: true + }); + expect($(".forum-nav-thread-wrapper-0 .icon")).toHaveClass("fa-check-square-o"); + return expect($(".forum-nav-thread-wrapper-0 .sr")).toHaveText("answered question"); + }); + + it("for unanswered question", function() { + renderSingleThreadWithProps({ + thread_type: "question", + endorsed: false + }); + expect($(".forum-nav-thread-wrapper-0 .icon")).toHaveClass("fa-question"); + return expect($(".forum-nav-thread-wrapper-0 .sr")).toHaveText("unanswered question"); + }); + }); + + describe("post labels render correctly", function() { + beforeEach(function() { + this.moderatorId = "42"; + this.administratorId = "43"; + this.communityTaId = "44"; + return DiscussionUtil.loadRoles({ + "Moderator": [parseInt(this.moderatorId)], + "Administrator": [parseInt(this.administratorId)], + "Community TA": [parseInt(this.communityTaId)] + }); + }); + + it("for pinned", function() { + renderSingleThreadWithProps({ + pinned: true + }); + return expect($(".post-label-pinned").length).toEqual(1); + }); + + it("for following", function() { + renderSingleThreadWithProps({ + subscribed: true + }); + return expect($(".post-label-following").length).toEqual(1); + }); + + it("for moderator", function() { + renderSingleThreadWithProps({ + user_id: this.moderatorId + }); + return expect($(".post-label-by-staff").length).toEqual(1); + }); + + it("for administrator", function() { + renderSingleThreadWithProps({ + user_id: this.administratorId + }); + return expect($(".post-label-by-staff").length).toEqual(1); + }); + + it("for community TA", function() { + renderSingleThreadWithProps({ + user_id: this.communityTaId + }); + return expect($(".post-label-by-community-ta").length).toEqual(1); + }); + + it("when none should be present", function() { + renderSingleThreadWithProps({}); + return expect($(".forum-nav-thread-labels").length).toEqual(0); + }); + }); + + describe("browse menu", function() { + var expectBrowseMenuVisible; + afterEach(function() { + return $("body").unbind("click"); + }); + + expectBrowseMenuVisible = function(isVisible) { + expect($(".forum-nav-browse-menu:visible").length).toEqual(isVisible ? 1 : 0); + return expect($(".forum-nav-thread-list-wrapper:visible").length).toEqual(isVisible ? 0 : 1); + }; + + it("should not be visible by default", function() { + return expectBrowseMenuVisible(false); + }); + + it("should show when header button is clicked", function() { + $(".forum-nav-browse").click(); + return expectBrowseMenuVisible(true); + }); + + describe("when shown", function() { + beforeEach(function() { + return $(".forum-nav-browse").click(); + }); + + it("should hide when header button is clicked", function() { + $(".forum-nav-browse").click(); + return expectBrowseMenuVisible(false); + }); + + it("should hide when a click outside the menu occurs", function() { + $(".forum-nav-search-input").click(); + return expectBrowseMenuVisible(false); + }); + + it("should hide when a search is executed", function() { + setupAjax(); + $(".forum-nav-search-input").trigger($.Event("keydown", { + which: 13 + })); + return expectBrowseMenuVisible(false); + }); + + it("should hide when a category is clicked", function() { + $(".forum-nav-browse-title")[0].click(); + return expectBrowseMenuVisible(false); + }); + + it("should still be shown when filter input is clicked", function() { + $(".forum-nav-browse-filter-input").click(); + return expectBrowseMenuVisible(true); + }); + + describe("filtering", function() { + var checkFilter; + checkFilter = function(filterText, expectedItems) { + var visibleItems; + $(".forum-nav-browse-filter-input").val(filterText).keyup(); + visibleItems = $(".forum-nav-browse-title:visible").map(function(i, elem) { + return $(elem).text(); + }).get(); + return expect(visibleItems).toEqual(expectedItems); + }; + + it("should be case-insensitive", function() { + return checkFilter("other", ["Other Category"]); + }); + + it("should match partial words", function() { + return checkFilter("ateg", ["Other Category"]); + }); + + it("should show ancestors and descendants of matches", function() { + return checkFilter("Target", ["Parent", "Target", "Child"]); + }); + + it("should handle multiple words regardless of order", function() { + return checkFilter("Following Posts", ["Posts I'm Following"]); + }); + + it("should handle multiple words in different depths", function() { + return checkFilter("Parent Child", ["Parent", "Target", "Child"]); + }); + }); + }); + + describe("selecting an item", function() { + var testSelectionRequest; + + it("should clear the search box", function() { + setupAjax(); + $(".forum-nav-search-input").val("foobar"); + $(".forum-nav-browse-menu-following .forum-nav-browse-title").click(); + return expect($(".forum-nav-search-input").val()).toEqual(""); + }); + + it("should change the button text", function() { + setupAjax(); + $(".forum-nav-browse-menu-following .forum-nav-browse-title").click(); + return expect($(".forum-nav-browse-current").text()).toEqual("Posts I'm Following"); + }); + + it("should show/hide the cohort selector", function() { + var self = this; + DiscussionSpecHelper.makeModerator(); + this.view.render(); + setupAjax(); + return _.each([ + { + selector: ".forum-nav-browse-menu-all", + cohortVisibility: true + }, { + selector: ".forum-nav-browse-menu-following", + cohortVisibility: false + }, { + selector: ".forum-nav-browse-menu-item:" + + "has(.forum-nav-browse-menu-item .forum-nav-browse-menu-item)", + cohortVisibility: false + }, { + selector: "[data-discussion-id=child]", + cohortVisibility: false + }, { + selector: "[data-discussion-id=other]", + cohortVisibility: true + } + ], function(itemInfo) { + self.view.$("" + itemInfo.selector + " > .forum-nav-browse-title").click(); + return expect(self.view.$(".forum-nav-filter-cohort").is(":visible")) + .toEqual(itemInfo.cohortVisibility); + }); + }); + + testSelectionRequest = function(callback, itemText) { + setupAjax(callback); + $(".forum-nav-browse-title:contains(" + itemText + ")").click(); + return expect($.ajax).toHaveBeenCalled(); + }; + + it("should get all discussions", function() { + return testSelectionRequest(function(params) { + return expect(params.url.path()).toEqual(DiscussionUtil.urlFor("threads")); + }, "All"); + }); + + it("should get followed threads", function() { + testSelectionRequest(function(params) { + return expect(params.url.path()) + .toEqual(DiscussionUtil.urlFor("followed_threads", window.user.id)); + }, "Following"); + return expect($.ajax.calls.mostRecent().args[0].data.group_id).toBeUndefined(); + }); + + it("should get threads for the selected leaf", function() { + return testSelectionRequest(function(params) { + expect(params.url.path()).toEqual(DiscussionUtil.urlFor("search")); + return expect(params.data.commentable_ids).toEqual("child"); + }, "Child"); + }); + + it("should get threads for children of the selected intermediate node", function() { + return testSelectionRequest(function(params) { + expect(params.url.path()).toEqual(DiscussionUtil.urlFor("search")); + return expect(params.data.commentable_ids).toEqual("child,sibling"); + }, "Parent"); + }); + }); + }); + }); +}).call(this); diff --git a/common/static/common/js/spec/discussion/view/discussion_thread_profile_view_spec.js b/common/static/common/js/spec/discussion/view/discussion_thread_profile_view_spec.js new file mode 100644 index 0000000000..1f72753efd --- /dev/null +++ b/common/static/common/js/spec/discussion/view/discussion_thread_profile_view_spec.js @@ -0,0 +1,156 @@ +/* globals Discussion, DiscussionSpecHelper, DiscussionThreadProfileView, Thread */ +(function() { + 'use strict'; + describe("DiscussionThreadProfileView", function() { + var checkBody, checkPostWithImages, makeThread, makeView, spyConvertMath; + beforeEach(function() { + DiscussionSpecHelper.setUpGlobals(); + DiscussionSpecHelper.setUnderscoreFixtures(); + this.threadData = { + id: "1", + body: "dummy body", + discussion: new Discussion(), + abuse_flaggers: [], + commentable_id: 'dummy_discussion', + votes: { + up_count: "42" + }, + created_at: "2014-09-09T20:11:08Z" + }; + this.imageTag = '
';
+ window.MathJax = {
+ Hub: {
+ Queue: function() {
+ }
+ }
+ };
+ });
+ makeView = function(thread) {
+ var view;
+ view = new DiscussionThreadProfileView({
+ model: thread
+ });
+ spyConvertMath(view);
+ return view;
+ };
+ makeThread = function(threadData) {
+ var thread;
+ thread = new Thread(threadData);
+ thread.discussion = new Discussion();
+ return thread;
+ };
+ spyConvertMath = function(view) {
+ return spyOn(view, "convertMath").and.callFake(function() {
+ return this.model.set('markdownBody', this.model.get('body'));
+ });
+ };
+ checkPostWithImages = function(numberOfImages, truncatedText, threadData, imageTag) {
+ var expectedHtml, expectedText, i, testText, view, _i, _ref;
+ expectedHtml = ''; + threadData.body = '
'; + testText = ''; + expectedText = ''; + if (truncatedText) { + testText = new Array(100).join('test '); + expectedText = testText.substring(0, 139) + '…'; + } else { + testText = 'Test body'; + expectedText = 'Test body'; + // I really have no idea what it is supposed to mean - probably just iteration, but better be safe + for ( + i = _i = 0, _ref = numberOfImages - 1; + 0 <= _ref ? _i <= _ref : _i >= _ref; + i = 0 <= _ref ? ++_i : --_i + ) { + threadData.body = threadData.body + imageTag; + if (i === 0) { + expectedHtml = expectedHtml + imageTag; + } else { + expectedHtml = expectedHtml + 'image omitted'; + } + } + } + threadData.body = threadData.body + '' + testText + '
'; + if (numberOfImages > 1) { + expectedHtml = expectedHtml + '' + expectedText + + 'Some images in this post have been omitted
'; + } else { + expectedHtml = expectedHtml + '' + expectedText + ''; + } + view = makeView(makeThread(threadData)); + view.render(); + return expect(view.$el.find(".post-body").html()).toEqual(expectedHtml); + }; + checkBody = function(truncated, view, threadData) { + var expectedOutput, inputHtmlStripped, outputHtmlStripped; + view.render(); + if (!truncated) { + expect(view.model.get("body")).toEqual(view.model.get("abbreviatedBody")); + return expect(view.$el.find(".post-body").html()).toEqual(threadData.body); + } else { + expect(view.model.get("body")).not.toEqual(view.model.get("abbreviatedBody")); + expect(view.$el.find(".post-body").html()).not.toEqual(threadData.body); + outputHtmlStripped = view.$el.find(".post-body").html().replace(/(<([^>]+)>)/ig, ""); + outputHtmlStripped = outputHtmlStripped.replace("Some images in this post have been omitted", ""); + outputHtmlStripped = outputHtmlStripped.replace("image omitted", ""); + inputHtmlStripped = threadData.body.replace(/(<([^>]+)>)/ig, ""); + expectedOutput = inputHtmlStripped.substring(0, 139) + '…'; + expect(outputHtmlStripped).toEqual(expectedOutput); + return expect(view.$el.find(".post-body").html().indexOf("…")).toBeGreaterThan(0); + } + }; + describe("Body markdown should be correct", function() { + var numImages, truncatedText, _i, _j, _len, _len1, _ref, _ref1; + it("untruncated text without markdown body", function() { + var view; + this.threadData.body = "Test body"; + view = makeView(makeThread(this.threadData)); + return checkBody(false, view, this.threadData); + }); + it("truncated text without markdown body", function() { + var view; + this.threadData.body = new Array(100).join("test "); + view = makeView(makeThread(this.threadData)); + return checkBody(true, view, this.threadData); + }); + it("untruncated text with markdown body", function() { + var view; + this.threadData.body = '' + this.imageTag + 'Google top search engine
'; + view = makeView(makeThread(this.threadData)); + return checkBody(false, view, this.threadData); + }); + it("truncated text with markdown body", function() { + var testText, view; + testText = new Array(100).join("test "); + this.threadData.body = '' + this.imageTag + this.imageTag + '' + testText + '
'; + view = makeView(makeThread(this.threadData)); + return checkBody(true, view, this.threadData); + }); + _ref = [1, 2, 10]; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + numImages = _ref[_i]; + _ref1 = [true, false]; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + truncatedText = _ref1[_j]; + it( + "body with " + numImages + " images and " + (truncatedText ? "truncated" : "untruncated") + + " text", + // suppressing Don't make functions within a loop. + /* jshint -W083 */ + function() { + return checkPostWithImages(numImages, truncatedText, this.threadData, this.imageTag); + } + /* jshint +W083 */ + ); + } + } + it("check the thread retrieve url", function() { + var thread; + thread = makeThread(this.threadData); + return expect(thread.urlFor('retrieve')) + .toBe('/courses/edX/999/test/discussion/forum/dummy_discussion/threads/1'); + }); + }); + }); + +}).call(this); diff --git a/common/static/common/js/spec/discussion/view/discussion_thread_show_view_spec.js b/common/static/common/js/spec/discussion/view/discussion_thread_show_view_spec.js new file mode 100644 index 0000000000..7e9df2b269 --- /dev/null +++ b/common/static/common/js/spec/discussion/view/discussion_thread_show_view_spec.js @@ -0,0 +1,191 @@ +/* globals DiscussionSpecHelper, DiscussionThreadShowView, DiscussionUtil, DiscussionViewSpecHelper, Thread */ +(function() { + 'use strict'; + + var $$course_id = "$$course_id"; + describe("DiscussionThreadShowView", function() { + beforeEach(function() { + DiscussionSpecHelper.setUpGlobals(); + DiscussionSpecHelper.setUnderscoreFixtures(); + this.user = DiscussionUtil.getUser(); + this.threadData = { + id: "dummy", + user_id: this.user.id, + username: this.user.get('username'), + course_id: $$course_id, + title: "dummy title", + body: "this is a thread", + created_at: "2013-04-03T20:08:39Z", + abuse_flaggers: [], + votes: { + up_count: 42 + }, + thread_type: "discussion", + closed: false, + pinned: false, + type: "thread" + }; + this.thread = new Thread(this.threadData); + this.view = new DiscussionThreadShowView({ + model: this.thread + }); + this.view.setElement($("#fixture-element")); + return spyOn(this.view, "convertMath"); + }); + describe("voting", function() { + it("renders the vote state correctly", function() { + return DiscussionViewSpecHelper.checkRenderVote(this.view, this.thread); + }); + it("votes correctly via click", function() { + return DiscussionViewSpecHelper.checkUpvote(this.view, this.thread, this.user, $.Event("click")); + }); + it("votes correctly via spacebar", function() { + return DiscussionViewSpecHelper.checkUpvote(this.view, this.thread, this.user, $.Event("keydown", { + which: 32 + })); + }); + it("unvotes correctly via click", function() { + return DiscussionViewSpecHelper.checkUnvote(this.view, this.thread, this.user, $.Event("click")); + }); + it("unvotes correctly via spacebar", function() { + return DiscussionViewSpecHelper.checkUnvote(this.view, this.thread, this.user, $.Event("keydown", { + which: 32 + })); + }); + }); + describe("pinning", function() { + var expectPinnedRendered; + expectPinnedRendered = function(view, model) { + var button, pinned; + pinned = model.get('pinned'); + button = view.$el.find(".action-pin"); + expect(button.hasClass("is-checked")).toBe(pinned); + return expect(button.attr("aria-checked")).toEqual(pinned.toString()); + }; + it("renders the pinned state correctly", function() { + this.view.render(); + expectPinnedRendered(this.view, this.thread); + this.thread.set('pinned', false); + this.view.render(); + expectPinnedRendered(this.view, this.thread); + this.thread.set('pinned', true); + this.view.render(); + return expectPinnedRendered(this.view, this.thread); + }); + it("exposes the pinning control only to authorized users", function() { + this.thread.updateInfo({ + ability: { + can_openclose: false + } + }); + this.view.render(); + expect(this.view.$el.find(".action-pin").closest(".is-hidden")).toExist(); + this.thread.updateInfo({ + ability: { + can_openclose: true + } + }); + this.view.render(); + return expect(this.view.$el.find(".action-pin").closest(".is-hidden")).not.toExist(); + }); + it("handles events correctly", function() { + this.view.render(); + return DiscussionViewSpecHelper.checkButtonEvents(this.view, "togglePin", ".action-pin"); + }); + }); + describe("labels", function() { + var expectOneElement; + expectOneElement = function(view, selector, visible) { + var elements; + if (typeof visible === "undefined" || visible === null) { + visible = true; + } + view.render(); + elements = view.$el.find(selector); + expect(elements.length).toEqual(1); + if (visible) { + return expect(elements).not.toHaveClass("is-hidden"); + } else { + return expect(elements).toHaveClass("is-hidden"); + } + }; + it('displays the closed label when appropriate', function() { + expectOneElement(this.view, '.post-label-closed', false); + this.thread.set('closed', true); + return expectOneElement(this.view, '.post-label-closed'); + }); + it('displays the pinned label when appropriate', function() { + expectOneElement(this.view, '.post-label-pinned', false); + this.thread.set('pinned', true); + return expectOneElement(this.view, '.post-label-pinned'); + }); + it('displays the reported label when appropriate for a non-staff user', function() { + expectOneElement(this.view, '.post-label-reported', false); + this.thread.set('abuse_flaggers', [DiscussionUtil.getUser().id]); + expectOneElement(this.view, '.post-label-reported'); + this.thread.set('abuse_flaggers', [DiscussionUtil.getUser().id + 1]); + return expectOneElement(this.view, '.post-label-reported', false); + }); + it('displays the reported label when appropriate for a flag moderator', function() { + DiscussionSpecHelper.makeModerator(); + expectOneElement(this.view, '.post-label-reported', false); + this.thread.set('abuse_flaggers', [DiscussionUtil.getUser().id]); + expectOneElement(this.view, '.post-label-reported'); + this.thread.set('abuse_flaggers', [DiscussionUtil.getUser().id + 1]); + return expectOneElement(this.view, '.post-label-reported'); + }); + }); + describe("author display", function() { + var checkUserLink; + beforeEach(function() { + return this.thread.set('user_url', 'test_user_url'); + }); + checkUserLink = function(element, is_ta, is_staff) { + expect(element.find('a.username').length).toEqual(1); + expect(element.find('a.username').text()).toEqual('test_user'); + expect(element.find('a.username').attr('href')).toEqual('test_user_url'); + expect(element.find('.user-label-community-ta').length).toEqual(is_ta ? 1 : 0); + return expect(element.find('.user-label-staff').length).toEqual(is_staff ? 1 : 0); + }; + it("renders correctly for a student-authored thread", function() { + var $el; + $el = $('#fixture-element').html(this.view.getAuthorDisplay()); + return checkUserLink($el, false, false); + }); + it("renders correctly for a community TA-authored thread", function() { + var $el; + this.thread.set('community_ta_authored', true); + $el = $('#fixture-element').html(this.view.getAuthorDisplay()); + return checkUserLink($el, true, false); + }); + it("renders correctly for a staff-authored thread", function() { + var $el; + this.thread.set('staff_authored', true); + $el = $('#fixture-element').html(this.view.getAuthorDisplay()); + return checkUserLink($el, false, true); + }); + it("renders correctly for an anonymously-authored thread", function() { + var $el; + this.thread.set('username', null); + $el = $('#fixture-element').html(this.view.getAuthorDisplay()); + expect($el.find('a.username').length).toEqual(0); + return expect($el.text()).toMatch(/^(\s*)anonymous(\s*)$/); + }); + }); + describe("cohorting", function() { + it("renders correctly for an uncohorted thread", function() { + this.view.render(); + return expect(this.view.$('.group-visibility-label').text().trim()) + .toEqual('This post is visible to everyone.'); + }); + it("renders correctly for a cohorted thread", function() { + this.thread.set('group_id', '1'); + this.thread.set('group_name', 'Mock Cohort'); + this.view.render(); + return expect(this.view.$('.group-visibility-label').text().trim()) + .toEqual('This post is visible only to Mock Cohort.'); + }); + }); + }); + +}).call(this); diff --git a/common/static/common/js/spec/discussion/view/discussion_thread_view_spec.js b/common/static/common/js/spec/discussion/view/discussion_thread_view_spec.js new file mode 100644 index 0000000000..cb7b7a346e --- /dev/null +++ b/common/static/common/js/spec/discussion/view/discussion_thread_view_spec.js @@ -0,0 +1,482 @@ +/* global + Discussion, DiscussionThreadShowView, DiscussionViewSpecHelper, DiscussionSpecHelper, DiscussionThreadView, + DiscussionUtil, Thread, DiscussionContentView, ThreadResponseShowView +*/ +(function() { + 'use strict'; + describe("DiscussionThreadView", function() { + var assertContentVisible, assertExpandedContentVisible, assertResponseCountAndPaginationCorrect, + createAjaxResponseJson, createTestResponseJson, postResponse, renderWithContent, renderWithTestResponses; + beforeEach(function() { + var deferred; + DiscussionSpecHelper.setUpGlobals(); + DiscussionSpecHelper.setUnderscoreFixtures(); + jasmine.clock().install(); + this.threadData = DiscussionViewSpecHelper.makeThreadWithProps({}); + this.thread = new Thread(this.threadData); + this.discussion = new Discussion(this.thread); + deferred = $.Deferred(); + spyOn($, "ajax").and.returnValue(deferred); + spyOn(DiscussionThreadShowView.prototype, "convertMath"); + spyOn(DiscussionContentView.prototype, "makeWmdEditor"); + spyOn(DiscussionUtil, "makeWmdEditor"); + spyOn(DiscussionUtil, "setWmdContent"); + return spyOn(ThreadResponseShowView.prototype, "convertMath"); + }); + afterEach(function() { + $.ajax.calls.reset(); + return jasmine.clock().uninstall(); + }); + renderWithContent = function(view, content) { + $.ajax.and.callFake(function(params) { + params.success(createAjaxResponseJson(content, false), 'success'); + return { + always: function() { + } + }; + }); + view.render(); + return jasmine.clock().tick(100); + }; + renderWithTestResponses = function(view, count, options) { + var index; + return renderWithContent(view, _.extend({ + resp_total: count, + children: count > 0 ? (function() { + var _i, _results; + _results = []; + for (index = _i = 1; 1 <= count ? _i <= count : _i >= count; index = 1 <= count ? ++_i : --_i) { + _results.push(createTestResponseJson(index)); + } + return _results; + })() : [] + }, options)); + }; + createTestResponseJson = function(index) { + return { + user_id: window.user.id, + body: "Response " + index, + id: "id_" + index, + created_at: "2015-01-01T22:20:28Z" + }; + }; + assertContentVisible = function(view, selector, visible) { + var content; + content = view.$el.find(selector); + expect(content.length).toBeGreaterThan(0); + return content.each(function(i, elem) { + return expect($(elem).is(":visible")).toEqual(visible); + }); + }; + assertExpandedContentVisible = function(view, expanded) { + expect(view.$el.hasClass("expanded")).toEqual(expanded); + assertContentVisible(view, ".post-extended-content", expanded); + assertContentVisible(view, ".forum-thread-expand", !expanded); + return assertContentVisible(view, ".forum-thread-collapse", expanded); + }; + assertResponseCountAndPaginationCorrect = function(view, countText, displayCountText, buttonText) { + expect(view.$el.find(".response-count").text()).toEqual(countText); + if (displayCountText) { + expect(view.$el.find(".response-display-count").text()).toEqual(displayCountText); + } else { + expect(view.$el.find(".response-display-count").length).toEqual(0); + } + if (buttonText) { + return expect(view.$el.find(".load-response-button").text()).toEqual(buttonText); + } else { + return expect(view.$el.find(".load-response-button").length).toEqual(0); + } + }; + createAjaxResponseJson = function(content, can_act) { + return { + content: content, + annotated_content_info: { + ability: { + editable: can_act, + can_delete: can_act, + can_reply: can_act, + can_vote: can_act + } + } + }; + }; + postResponse = function(view, index) { + var responseText, testResponseJson; + testResponseJson = createTestResponseJson(index); + responseText = testResponseJson.body; + spyOn(view, "getWmdContent").and.returnValue(responseText); + $.ajax.and.callFake(function(params) { + expect(params.type).toEqual("POST"); + expect(params.data.body).toEqual(responseText); + params.success(createAjaxResponseJson(testResponseJson, true), 'success'); + return { + always: function() { + } + }; + }); + return view.$(".discussion-submit-post").click(); + }; + describe("closed and open Threads", function() { + var checkCommentForm, checkVoteDisplay, createDiscussionThreadView; + createDiscussionThreadView = function(originallyClosed, mode) { + var discussion, thread, threadData, view; + threadData = DiscussionViewSpecHelper.makeThreadWithProps({ + closed: originallyClosed + }); + thread = new Thread(threadData); + discussion = new Discussion(thread); + view = new DiscussionThreadView({ + model: thread, + el: $("#fixture-element"), + mode: mode, + course_settings: DiscussionSpecHelper.makeCourseSettings() + }); + renderWithTestResponses(view, 1); + if (mode === "inline") { + view.expand(); + } + spyOn(DiscussionUtil, "updateWithUndo").and.callFake(function(model, updates) { + return model.set(updates); + }); + return view; + }; + checkCommentForm = function(originallyClosed, mode) { + var view; + view = createDiscussionThreadView(originallyClosed, mode); + expect(view.$('.comment-form').closest('li').is(":visible")).toBe(!originallyClosed); + expect(view.$(".discussion-reply-new").is(":visible")).toBe(!originallyClosed); + view.$(".action-close").click(); + expect(view.$('.comment-form').closest('li').is(":visible")).toBe(originallyClosed); + return expect(view.$(".discussion-reply-new").is(":visible")).toBe(originallyClosed); + }; + checkVoteDisplay = function(originallyClosed, mode) { + var view; + view = createDiscussionThreadView(originallyClosed, mode); + expect(view.$('.thread-main-wrapper .action-vote').is(":visible")).toBe(!originallyClosed); + expect(view.$('.thread-main-wrapper .display-vote').is(":visible")).toBe(originallyClosed); + view.$(".action-close").click(); + expect(view.$('.action-vote').is(":visible")).toBe(originallyClosed); + return expect(view.$('.display-vote').is(":visible")).toBe(!originallyClosed); + }; + return _.each(["tab", "inline"], function(mode) { + it( + "Test that in " + mode + " mode when a closed thread is opened the comment form is displayed", + function() { return checkCommentForm(true, mode); } + ); + it( + "Test that in " + mode + " mode when a open thread is closed the comment form is hidden", + function() { return checkCommentForm(false, mode); } + ); + it( + "Test that in " + mode + " mode when a closed thread is opened the vote button is displayed and " + + "vote count is hidden", + function() { return checkVoteDisplay(true, mode); } + ); + it( + "Test that in " + mode + " mode when a open thread is closed the vote button is hidden and " + + "vote count is displayed", + function() { return checkVoteDisplay(false, mode); } + ); + }); + }); + describe("tab mode", function() { + beforeEach(function() { + this.view = new DiscussionThreadView({ + model: this.thread, + el: $("#fixture-element"), + mode: "tab", + course_settings: DiscussionSpecHelper.makeCourseSettings() + }); + }); + describe("responses", function() { + it("can post a first response", function() { + renderWithTestResponses(this.view, 0); + postResponse(this.view, 1); + expect(this.view.$(".forum-response").length).toBe(1); + expect(this.view.$(".post-actions-list").find(".action-edit").parent(".is-hidden").length).toBe(1); + return expect(this.view.$(".response-actions-list").find(".action-edit") + .parent().not(".is-hidden").length).toBe(1); + }); + it("can post a second response", function() { + renderWithTestResponses(this.view, 1); + expect(this.view.$(".forum-response").length).toBe(1); + expect(this.view.$(".post-actions-list").find(".action-edit").parent(".is-hidden").length).toBe(1); + expect(this.view.$(".response-actions-list").find(".action-edit").parent() + .not(".is-hidden").length).toBe(1); + postResponse(this.view, 2); + expect(this.view.$(".forum-response").length).toBe(2); + expect(this.view.$(".post-actions-list").find(".action-edit").parent(".is-hidden").length).toBe(1); + return expect(this.view.$(".response-actions-list").find(".action-edit").parent() + .not(".is-hidden").length).toBe(2); + }); + }); + describe("response count and pagination", function() { + it("correctly render for a thread with no responses", function() { + renderWithTestResponses(this.view, 0); + return assertResponseCountAndPaginationCorrect(this.view, "0 responses", null, null); + }); + it("correctly render for a thread with one response", function() { + renderWithTestResponses(this.view, 1); + return assertResponseCountAndPaginationCorrect( + this.view, "1 response", "Showing all responses", null + ); + }); + it("correctly render for a thread with one additional page", function() { + renderWithTestResponses(this.view, 1, { + resp_total: 2 + }); + return assertResponseCountAndPaginationCorrect( + this.view, "2 responses", "Showing first response", "Load all responses" + ); + }); + it("correctly render for a thread with multiple additional pages", function() { + renderWithTestResponses(this.view, 2, { + resp_total: 111 + }); + return assertResponseCountAndPaginationCorrect( + this.view, "111 responses", "Showing first 2 responses", "Load next 100 responses" + ); + }); + describe("on clicking the load more button", function() { + beforeEach(function() { + renderWithTestResponses(this.view, 1, { + resp_total: 5 + }); + return assertResponseCountAndPaginationCorrect( + this.view, "5 responses", "Showing first response", "Load all responses" + ); + }); + it("correctly re-render when all threads have loaded", function() { + renderWithTestResponses(this.view, 5, { + resp_total: 5 + }); + this.view.$el.find(".load-response-button").click(); + return assertResponseCountAndPaginationCorrect( + this.view, "5 responses", "Showing all responses", null + ); + }); + it("correctly re-render when one page remains", function() { + renderWithTestResponses(this.view, 3, { + resp_total: 42 + }); + this.view.$el.find(".load-response-button").click(); + return assertResponseCountAndPaginationCorrect( + this.view, "42 responses", "Showing first 3 responses", "Load all responses" + ); + }); + it("correctly re-render when multiple pages remain", function() { + renderWithTestResponses(this.view, 3, { + resp_total: 111 + }); + this.view.$el.find(".load-response-button").click(); + return assertResponseCountAndPaginationCorrect( + this.view, "111 responses", "Showing first 3 responses", "Load next 100 responses" + ); + }); + }); + }); + }); + describe("inline mode", function() { + beforeEach(function() { + this.view = new DiscussionThreadView({ + model: this.thread, + el: $("#fixture-element"), + mode: "inline", + course_settings: DiscussionSpecHelper.makeCourseSettings() + }); + }); + describe("render", function() { + it("shows content that should be visible when collapsed", function() { + this.view.render(); + return assertExpandedContentVisible(this.view, false); + }); + it("does not render any responses by default", function() { + this.view.render(); + expect($.ajax).not.toHaveBeenCalled(); + return expect(this.view.$el.find(".responses li").length).toEqual(0); + }); + }); + describe("focus", function() { + it("sends focus to the conversation when opened", function(done) { + var self; + DiscussionViewSpecHelper.setNextResponseContent({ + resp_total: 0, + children: [] + }); + this.view.render(); + this.view.expand(); + self = this; + return jasmine.waitUntil(function() { + var article; + article = self.view.$el.find('.discussion-article'); + return article[0] === article[0].ownerDocument.activeElement; + }).then(function() { + return done(); + }); + }); + }); + describe("expand/collapse", function() { + it("shows/hides appropriate content", function() { + DiscussionViewSpecHelper.setNextResponseContent({ + resp_total: 0, + children: [] + }); + this.view.render(); + this.view.expand(); + assertExpandedContentVisible(this.view, true); + this.view.collapse(); + return assertExpandedContentVisible(this.view, false); + }); + it("switches between the abbreviated and full body", function() { + var expectedAbbreviation, longBody; + DiscussionViewSpecHelper.setNextResponseContent({ + resp_total: 0, + children: [] + }); + longBody = new Array(100).join("test "); + expectedAbbreviation = DiscussionUtil.abbreviateString(longBody, 140); + this.thread.set("body", longBody); + this.view.render(); + expect($(".post-body").text()).toEqual(expectedAbbreviation); + expect(DiscussionThreadShowView.prototype.convertMath).toHaveBeenCalled(); + DiscussionThreadShowView.prototype.convertMath.calls.reset(); + this.view.expand(); + expect($(".post-body").text()).toEqual(longBody); + expect(DiscussionThreadShowView.prototype.convertMath).toHaveBeenCalled(); + DiscussionThreadShowView.prototype.convertMath.calls.reset(); + this.view.collapse(); + expect($(".post-body").text()).toEqual(expectedAbbreviation); + return expect(DiscussionThreadShowView.prototype.convertMath).toHaveBeenCalled(); + }); + it("strips script tags appropriately", function() { + var longMaliciousBody, maliciousAbbreviation; + DiscussionViewSpecHelper.setNextResponseContent({ + resp_total: 0, + children: [] + }); + longMaliciousBody = new Array(100).join( + "\n" + ); + this.thread.set("body", longMaliciousBody); + maliciousAbbreviation = DiscussionUtil.abbreviateString(this.thread.get('body'), 140); + this.view.render(); + expect($(".post-body").html()).not.toEqual(maliciousAbbreviation); + expect($(".post-body").text()).toEqual(maliciousAbbreviation); + expect($(".post-body").html()).not.toContain("