3
AUTHORS
3
AUTHORS
@@ -236,3 +236,6 @@ Brian Beggs <macdiesel@gmail.com>
|
||||
Bill DeRusha <bill@edx.org>
|
||||
Kevin Falcone <kevin@edx.org>
|
||||
Mirjam Škarica <mirjamskarica@gmail.com>
|
||||
Saleem Latif <saleem@edx.org>
|
||||
Julien Paillé <julien.paille@openfun.fr>
|
||||
Michael Frey <mfrey@edx.org>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
"""
|
||||
Tests for the fix_not_found management command
|
||||
"""
|
||||
|
||||
from django.core.management import call_command
|
||||
from xmodule.modulestore import ModuleStoreEnum
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
|
||||
|
||||
|
||||
class TestFixNotFound(ModuleStoreTestCase):
|
||||
"""
|
||||
Tests for the fix_not_found management command
|
||||
"""
|
||||
def test_fix_not_found_non_split(self):
|
||||
"""
|
||||
The management command doesn't work on non split courses
|
||||
"""
|
||||
course = CourseFactory(default_store=ModuleStoreEnum.Type.mongo)
|
||||
with self.assertRaises(SystemExit):
|
||||
call_command("fix_not_found", unicode(course.id))
|
||||
|
||||
def test_fix_not_found(self):
|
||||
course = CourseFactory.create(default_store=ModuleStoreEnum.Type.split)
|
||||
ItemFactory.create(category='chapter', parent_location=course.location)
|
||||
|
||||
# get course again in order to update its children list
|
||||
course = self.store.get_course(course.id)
|
||||
|
||||
# create a dangling usage key that we'll add to the course's children list
|
||||
dangling_pointer = course.id.make_usage_key('chapter', 'DanglingPointer')
|
||||
|
||||
course.children.append(dangling_pointer)
|
||||
self.store.update_item(course, self.user.id)
|
||||
|
||||
# the course block should now point to two children, one of which
|
||||
# doesn't actually exist
|
||||
self.assertEqual(len(course.children), 2)
|
||||
self.assertIn(dangling_pointer, course.children)
|
||||
|
||||
call_command("fix_not_found", unicode(course.id))
|
||||
|
||||
# make sure the dangling pointer was removed from
|
||||
# the course block's children
|
||||
course = self.store.get_course(course.id)
|
||||
self.assertEqual(len(course.children), 1)
|
||||
self.assertNotIn(dangling_pointer, course.children)
|
||||
@@ -218,7 +218,7 @@ class CertificateManager(object):
|
||||
# including the actual 'certificates' list that we're working with in this context
|
||||
certificates = course.certificates.get('certificates', [])
|
||||
if only_active:
|
||||
certificates = [certificate for certificate in certificates if certificate['is_active']]
|
||||
certificates = [certificate for certificate in certificates if certificate.get('is_active', False)]
|
||||
return certificates
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -446,6 +446,45 @@ class CertificatesDetailHandlerTestCase(EventTestMixin, CourseTestCase, Certific
|
||||
self.assertEqual(course_certificates[1].get('name'), u'New test certificate')
|
||||
self.assertEqual(course_certificates[1].get('description'), 'New test description')
|
||||
|
||||
def test_can_edit_certificate_without_is_active(self):
|
||||
"""
|
||||
Tests user should be able to edit certificate, if is_active attribute is not present
|
||||
for given certificate. Old courses might not have is_active attribute in certificate data.
|
||||
"""
|
||||
certificates = [
|
||||
{
|
||||
'id': 1,
|
||||
'name': 'certificate with is_active',
|
||||
'description': 'Description ',
|
||||
'signatories': [],
|
||||
'version': CERTIFICATE_SCHEMA_VERSION,
|
||||
}
|
||||
]
|
||||
self.course.certificates = {'certificates': certificates}
|
||||
self.save_course()
|
||||
|
||||
expected = {
|
||||
u'id': 1,
|
||||
u'version': CERTIFICATE_SCHEMA_VERSION,
|
||||
u'name': u'New test certificate',
|
||||
u'description': u'New test description',
|
||||
u'is_active': True,
|
||||
u'course_title': u'Course Title Override',
|
||||
u'signatories': []
|
||||
|
||||
}
|
||||
|
||||
response = self.client.post(
|
||||
self._url(cid=1),
|
||||
data=json.dumps(expected),
|
||||
content_type="application/json",
|
||||
HTTP_ACCEPT="application/json",
|
||||
HTTP_X_REQUESTED_WITH="XMLHttpRequest",
|
||||
)
|
||||
self.assertEqual(response.status_code, 201)
|
||||
content = json.loads(response.content)
|
||||
self.assertEqual(content, expected)
|
||||
|
||||
def test_can_delete_certificate_with_signatories(self):
|
||||
"""
|
||||
Delete certificate
|
||||
|
||||
@@ -98,7 +98,9 @@ FEATURES['ENABLE_DISCUSSION_SERVICE'] = False
|
||||
USE_I18N = True
|
||||
|
||||
# Include the lettuce app for acceptance testing, including the 'harvest' django-admin command
|
||||
INSTALLED_APPS += ('lettuce.django',)
|
||||
# django.contrib.staticfiles used to be loaded by lettuce, now we must add it ourselves
|
||||
# django.contrib.staticfiles is not added to lms as there is a ^/static$ route built in to the app
|
||||
INSTALLED_APPS += ('lettuce.django', 'django.contrib.staticfiles')
|
||||
LETTUCE_APPS = ('contentstore',)
|
||||
LETTUCE_BROWSER = os.environ.get('LETTUCE_BROWSER', 'chrome')
|
||||
|
||||
|
||||
@@ -170,9 +170,6 @@ FEATURES = {
|
||||
# Teams feature
|
||||
'ENABLE_TEAMS': True,
|
||||
|
||||
# Teams search feature
|
||||
'ENABLE_TEAMS_SEARCH': False,
|
||||
|
||||
# Show video bumper in Studio
|
||||
'ENABLE_VIDEO_BUMPER': False,
|
||||
|
||||
@@ -280,13 +277,6 @@ XQUEUE_INTERFACE = {
|
||||
simplefilter('ignore')
|
||||
|
||||
################################# Middleware ###################################
|
||||
# List of finder classes that know how to find static files in
|
||||
# various locations.
|
||||
STATICFILES_FINDERS = (
|
||||
'staticfiles.finders.FileSystemFinder',
|
||||
'staticfiles.finders.AppDirectoriesFinder',
|
||||
'pipeline.finders.PipelineFinder',
|
||||
)
|
||||
|
||||
# List of callables that know how to import templates from various sources.
|
||||
TEMPLATE_LOADERS = (
|
||||
@@ -463,9 +453,23 @@ MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
|
||||
##### EMBARGO #####
|
||||
EMBARGO_SITE_REDIRECT_URL = None
|
||||
|
||||
############################### Pipeline #######################################
|
||||
############################### PIPELINE #######################################
|
||||
|
||||
# Process static files using RequireJS Optimizer
|
||||
STATICFILES_STORAGE = 'openedx.core.lib.django_require.staticstorage.OptimizedCachedRequireJsStorage'
|
||||
|
||||
# List of finder classes that know how to find static files in various locations.
|
||||
# Note: the pipeline finder is included to be able to discover optimized files
|
||||
STATICFILES_FINDERS = [
|
||||
'staticfiles.finders.FileSystemFinder',
|
||||
'staticfiles.finders.AppDirectoriesFinder',
|
||||
'pipeline.finders.PipelineFinder',
|
||||
]
|
||||
|
||||
# Don't use compression by default
|
||||
PIPELINE_CSS_COMPRESSOR = None
|
||||
PIPELINE_JS_COMPRESSOR = None
|
||||
|
||||
from openedx.core.lib.rooted_paths import rooted_glob
|
||||
|
||||
PIPELINE_CSS = {
|
||||
@@ -553,7 +557,9 @@ PIPELINE_JS_COMPRESSOR = None
|
||||
STATICFILES_IGNORE_PATTERNS = (
|
||||
"*.py",
|
||||
"*.pyc",
|
||||
# it would be nice if we could do, for example, "**/*.scss",
|
||||
"*.html",
|
||||
|
||||
# It would be nice if we could do, for example, "**/*.scss",
|
||||
# but these strings get passed down to the `fnmatch` module,
|
||||
# which doesn't support that. :(
|
||||
# http://docs.python.org/2/library/fnmatch.html
|
||||
@@ -566,6 +572,10 @@ STATICFILES_IGNORE_PATTERNS = (
|
||||
"coffee/*/*/*.coffee",
|
||||
"coffee/*/*/*/*.coffee",
|
||||
|
||||
# Ignore tests
|
||||
"spec",
|
||||
"spec_helpers",
|
||||
|
||||
# Symlinks used by js-test-tool
|
||||
"xmodule_js",
|
||||
"common_static",
|
||||
|
||||
@@ -33,8 +33,14 @@ FEATURES['PREVIEW_LMS_BASE'] = "preview." + LMS_BASE
|
||||
|
||||
########################### PIPELINE #################################
|
||||
|
||||
# Skip RequireJS optimizer in development
|
||||
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'
|
||||
# Skip packaging and optimization in development
|
||||
STATICFILES_STORAGE = 'pipeline.storage.NonPackagingPipelineStorage'
|
||||
|
||||
# Revert to the default set of finders as we don't want the production pipeline
|
||||
STATICFILES_FINDERS = [
|
||||
'staticfiles.finders.FileSystemFinder',
|
||||
'staticfiles.finders.AppDirectoriesFinder',
|
||||
]
|
||||
|
||||
############################# ADVANCED COMPONENTS #############################
|
||||
|
||||
|
||||
@@ -281,8 +281,5 @@ SEARCH_ENGINE = "search.tests.mock_search_engine.MockSearchEngine"
|
||||
# teams feature
|
||||
FEATURES['ENABLE_TEAMS'] = True
|
||||
|
||||
# teams search
|
||||
FEATURES['ENABLE_TEAMS_SEARCH'] = True
|
||||
|
||||
# Dummy secret key for dev/test
|
||||
SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd'
|
||||
|
||||
@@ -20,7 +20,17 @@ DATABASES = {
|
||||
},
|
||||
|
||||
}
|
||||
######################### Static file overrides ####################################
|
||||
|
||||
######################### PIPELINE ####################################
|
||||
|
||||
# Use RequireJS optimized storage
|
||||
STATICFILES_STORAGE = 'openedx.core.lib.django_require.staticstorage.OptimizedCachedRequireJsStorage'
|
||||
|
||||
# Revert to the default set of finders as we don't want to dynamically pick up files from the pipeline
|
||||
STATICFILES_FINDERS = [
|
||||
'staticfiles.finders.FileSystemFinder',
|
||||
'staticfiles.finders.AppDirectoriesFinder',
|
||||
]
|
||||
|
||||
# Redirect to the test_root folder within the repo
|
||||
TEST_ROOT = REPO_ROOT / "test_root"
|
||||
@@ -33,4 +43,3 @@ STATIC_ROOT = (TEST_ROOT / "staticfiles" / "cms").abspath()
|
||||
# 1. Uglify is by far the slowest part of the build process
|
||||
# 2. Having full source code makes debugging tests easier for developers
|
||||
os.environ['REQUIRE_BUILD_PROFILE_OPTIMIZE'] = 'none'
|
||||
PIPELINE_JS_COMPRESSOR = None
|
||||
|
||||
@@ -27,8 +27,9 @@ require.config({
|
||||
"jquery.immediateDescendents": "coffee/src/jquery.immediateDescendents",
|
||||
"datepair": "js/vendor/timepicker/datepair",
|
||||
"date": "js/vendor/date",
|
||||
"text": 'js/vendor/requirejs/text',
|
||||
"moment": "js/vendor/moment.min",
|
||||
"moment-with-locales": "js/vendor/moment-with-locales.min",
|
||||
"text": 'js/vendor/requirejs/text',
|
||||
"underscore": "js/vendor/underscore-min",
|
||||
"underscore.string": "js/vendor/underscore.string.min",
|
||||
"backbone": "js/vendor/backbone-min",
|
||||
|
||||
@@ -23,6 +23,8 @@ requirejs.config({
|
||||
"jquery.simulate": "xmodule_js/common_static/js/vendor/jquery.simulate",
|
||||
"datepair": "xmodule_js/common_static/js/vendor/timepicker/datepair",
|
||||
"date": "xmodule_js/common_static/js/vendor/date",
|
||||
"moment": "xmodule_js/common_static/js/vendor/moment.min",
|
||||
"moment-with-locales": "xmodule_js/common_static/js/vendor/moment-with-locales.min",
|
||||
"text": "xmodule_js/common_static/js/vendor/requirejs/text",
|
||||
"underscore": "xmodule_js/common_static/js/vendor/underscore-min",
|
||||
"underscore.string": "xmodule_js/common_static/js/vendor/underscore.string.min",
|
||||
|
||||
@@ -46,8 +46,8 @@ function(_, str, Backbone, BackboneRelational, gettext) {
|
||||
'title': gettext('Signatory title should span over maximum of 2 lines.')
|
||||
}, errors);
|
||||
}
|
||||
else if ((lines.length > 1 && (lines[0].length > 40 || lines[1].length > 40)) ||
|
||||
(lines.length === 1 && title.length > 40)) {
|
||||
else if ((lines.length > 1 && (lines[0].length > 53 && lines[1].length > 53)) ||
|
||||
(lines.length === 1 && title.length > 106)) {
|
||||
errors = _.extend({
|
||||
'title': gettext('Signatory title should have maximum of 40 characters per line.')
|
||||
}, errors);
|
||||
|
||||
@@ -246,7 +246,7 @@ function(_, Course, CertificatesCollection, CertificateModel, CertificateDetails
|
||||
});
|
||||
|
||||
setValuesToInputs(this.view, {
|
||||
inputSignatoryTitle: 'New Signatory Test Title longer than 40 characters in length'
|
||||
inputSignatoryTitle: 'This is a certificate signatory title that has waaaaaaay more than 106 characters, in order to cause an exception.'
|
||||
});
|
||||
|
||||
setValuesToInputs(this.view, {
|
||||
|
||||
@@ -228,7 +228,7 @@ function(_, Course, CertificateModel, SignatoryModel, CertificatesCollection, Ce
|
||||
}
|
||||
);
|
||||
|
||||
it('signatories should not save when title has more than 40 characters per line', function() {
|
||||
it('signatories should not save when fields have too many characters per line', function() {
|
||||
this.view.$(SELECTORS.addSignatoryButton).click();
|
||||
setValuesToInputs(this.view, {
|
||||
inputCertificateName: 'New Certificate Name'
|
||||
@@ -239,7 +239,7 @@ function(_, Course, CertificateModel, SignatoryModel, CertificatesCollection, Ce
|
||||
});
|
||||
|
||||
setValuesToInputs(this.view, {
|
||||
inputSignatoryTitle: 'New Signatory title longer than 40 characters on one line'
|
||||
inputSignatoryTitle: 'This is a certificate signatory title that has waaaaaaay more than 106 characters, in order to cause an exception.'
|
||||
});
|
||||
|
||||
setValuesToInputs(this.view, {
|
||||
|
||||
@@ -574,6 +574,25 @@ define(["jquery", "underscore", "underscore.string", "common/js/spec_helpers/aja
|
||||
});
|
||||
});
|
||||
|
||||
it('also works for older-style add component links', function () {
|
||||
// Some third party xblocks (problem-builder in particular) expect add
|
||||
// event handlers on custom <a> add buttons which is what the platform
|
||||
// used to use instead of <button>s.
|
||||
// This can be removed once there is a proper API that XBlocks can use
|
||||
// to add children or allow authors to add children.
|
||||
renderContainerPage(this, mockContainerXBlockHtml);
|
||||
$(".add-xblock-component-button").each(function() {
|
||||
var htmlAsLink = $($(this).prop('outerHTML').replace(/(<\/?)button/g, "$1a"));
|
||||
$(this).replaceWith(htmlAsLink);
|
||||
});
|
||||
$(".add-xblock-component-button").first().click();
|
||||
EditHelpers.verifyXBlockRequest(requests, {
|
||||
"category": "discussion",
|
||||
"type": "discussion",
|
||||
"parent_locator": "locator-group-A"
|
||||
});
|
||||
});
|
||||
|
||||
it('shows a notification while creating', function () {
|
||||
var notificationSpy = EditHelpers.createNotificationSpy();
|
||||
renderContainerPage(this, mockContainerXBlockHtml);
|
||||
|
||||
@@ -6,8 +6,8 @@ define(["jquery", "underscore", "gettext", "js/views/baseview", "common/js/compo
|
||||
function ($, _, gettext, BaseView, ViewUtils, AddXBlockButton, AddXBlockMenu) {
|
||||
var AddXBlockComponent = BaseView.extend({
|
||||
events: {
|
||||
'click .new-component .new-component-type button.multiple-templates': 'showComponentTemplates',
|
||||
'click .new-component .new-component-type button.single-template': 'createNewComponent',
|
||||
'click .new-component .new-component-type .multiple-templates': 'showComponentTemplates',
|
||||
'click .new-component .new-component-type .single-template': 'createNewComponent',
|
||||
'click .new-component .cancel-button': 'closeNewComponent',
|
||||
'click .new-component-templates .new-component-template .button-component': 'createNewComponent',
|
||||
'click .new-component-templates .cancel-button': 'closeNewComponent'
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
</div>
|
||||
<div class="input-wrap field text add-signatory-title <% if(error && error.title) { print('error'); } %>">
|
||||
<label for="signatory-title-<%= signatory_number %>"><%= gettext("Title ") %></label>
|
||||
<textarea id="signatory-title-<%= signatory_number %>" class="collection-name-input text input-text signatory-title-input" name="signatory-title" cols="40" rows="2" placeholder="<%= gettext("Title of the signatory") %>" aria-describedby="signatory-title-<%= signatory_number %>-tip" maxlength="80"><%= title %></textarea>
|
||||
<span id="signatory-title-<%= signatory_number %>-tip" class="tip tip-stacked"><%= gettext("The title of this signatory as it should appear on certificates. Maximum 2 lines, 40 characters each.") %></span>
|
||||
<textarea id="signatory-title-<%= signatory_number %>" class="collection-name-input text input-text signatory-title-input" name="signatory-title" cols="40" rows="2" placeholder="<%= gettext("Title of the signatory") %>" aria-describedby="signatory-title-<%= signatory_number %>-tip" maxlength="106"><%= title %></textarea>
|
||||
<span id="signatory-title-<%= signatory_number %>-tip" class="tip tip-stacked"><%= gettext("The title of this signatory as it should appear on certificates. Maximum of 106 characters.") %></span>
|
||||
<% if(error && error.title) { %>
|
||||
<span class="message-error"><%= error.title %></span>
|
||||
<% } %>
|
||||
@@ -44,7 +44,7 @@
|
||||
<span id="signatory-signature-<%= signatory_number %>-tip" class="tip tip-stacked"><%= gettext("Image must be 450px X 150px transparent PNG") %></span>
|
||||
</div>
|
||||
<button type="button" class="action action-upload-signature">Upload Signature Image</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
@@ -100,6 +100,9 @@ class CourseMode(models.Model):
|
||||
# Modes that allow a student to pursue a verified certificate
|
||||
VERIFIED_MODES = [VERIFIED, PROFESSIONAL]
|
||||
|
||||
# Modes that allow a student to pursue a non-verified certificate
|
||||
NON_VERIFIED_MODES = [HONOR, AUDIT, NO_ID_PROFESSIONAL_MODE]
|
||||
|
||||
# Modes that allow a student to earn credit with a university partner
|
||||
CREDIT_MODES = [CREDIT_MODE]
|
||||
|
||||
|
||||
@@ -29,6 +29,9 @@ while patched.
|
||||
# All major functions are documented, the rest are self-evident shells.
|
||||
# pylint: disable=no-member
|
||||
# Pylint doesn't see our decorator `translate_with` add the `_` method.
|
||||
# pylint: disable=test-inherits-tests
|
||||
# This test file intentionally defines one base test class (UgettextTest) and
|
||||
# patches the gettext function under test for all subsequent inheriting classes.
|
||||
from unittest import TestCase
|
||||
|
||||
from ddt import data
|
||||
|
||||
@@ -29,7 +29,7 @@ from django.utils import timezone
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.auth.hashers import make_password
|
||||
from django.contrib.auth.signals import user_logged_in, user_logged_out
|
||||
from django.db import models, IntegrityError
|
||||
from django.db import models, IntegrityError, transaction
|
||||
from django.db.models import Count
|
||||
from django.db.models.signals import pre_save, post_save
|
||||
from django.dispatch import receiver, Signal
|
||||
@@ -894,16 +894,32 @@ class CourseEnrollment(models.Model):
|
||||
if user.id is None:
|
||||
user.save()
|
||||
|
||||
enrollment, created = CourseEnrollment.objects.get_or_create(
|
||||
user=user,
|
||||
course_id=course_key,
|
||||
)
|
||||
try:
|
||||
enrollment, created = CourseEnrollment.objects.get_or_create(
|
||||
user=user,
|
||||
course_id=course_key,
|
||||
)
|
||||
|
||||
# If we *did* just create a new enrollment, set some defaults
|
||||
if created:
|
||||
enrollment.mode = "honor"
|
||||
enrollment.is_active = False
|
||||
enrollment.save()
|
||||
# If we *did* just create a new enrollment, set some defaults
|
||||
if created:
|
||||
enrollment.mode = "honor"
|
||||
enrollment.is_active = False
|
||||
enrollment.save()
|
||||
except IntegrityError:
|
||||
log.info(
|
||||
(
|
||||
"An integrity error occurred while getting-or-creating the enrollment"
|
||||
"for course key %s and student %s. This can occur if two processes try to get-or-create "
|
||||
"the enrollment at the same time and the database is set to REPEATABLE READ. We will try "
|
||||
"committing the transaction and retrying."
|
||||
),
|
||||
course_key, user
|
||||
)
|
||||
transaction.commit()
|
||||
enrollment = CourseEnrollment.objects.get(
|
||||
user=user,
|
||||
course_id=course_key,
|
||||
)
|
||||
|
||||
return enrollment
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ from xmodule.modulestore.tests.factories import CourseFactory
|
||||
from student.tests.factories import UserFactory, CourseEnrollmentFactory
|
||||
from certificates.tests.factories import GeneratedCertificateFactory # pylint: disable=import-error
|
||||
from certificates.api import get_certificate_url # pylint: disable=import-error
|
||||
from course_modes.models import CourseMode
|
||||
|
||||
# pylint: disable=no-member
|
||||
|
||||
@@ -42,6 +43,15 @@ class CertificateDisplayTest(ModuleStoreTestCase):
|
||||
self._create_certificate(enrollment_mode)
|
||||
self._check_can_download_certificate()
|
||||
|
||||
@patch.dict('django.conf.settings.FEATURES', {'CERTIFICATES_HTML_VIEW': False})
|
||||
def test_display_verified_certificate_no_id(self):
|
||||
"""
|
||||
Confirm that if we get a certificate with a no-id-professional mode
|
||||
we still can download our certificate
|
||||
"""
|
||||
self._create_certificate(CourseMode.NO_ID_PROFESSIONAL_MODE)
|
||||
self._check_can_download_certificate_no_id()
|
||||
|
||||
@ddt.data('verified', 'honor')
|
||||
@override_settings(CERT_NAME_SHORT='Test_Certificate')
|
||||
@patch.dict('django.conf.settings.FEATURES', {'CERTIFICATES_HTML_VIEW': True})
|
||||
@@ -105,6 +115,16 @@ class CertificateDisplayTest(ModuleStoreTestCase):
|
||||
self.assertContains(response, u'Download Your ID Verified')
|
||||
self.assertContains(response, self.DOWNLOAD_URL)
|
||||
|
||||
def _check_can_download_certificate_no_id(self):
|
||||
"""
|
||||
Inspects the dashboard to see if a certificate for a non verified course enrollment
|
||||
is present
|
||||
"""
|
||||
response = self.client.get(reverse('dashboard'))
|
||||
self.assertContains(response, u'Download')
|
||||
self.assertContains(response, u'(PDF)')
|
||||
self.assertContains(response, self.DOWNLOAD_URL)
|
||||
|
||||
def _check_can_not_download_certificate(self):
|
||||
"""
|
||||
Make sure response does not have any of the download certificate buttons
|
||||
|
||||
@@ -120,6 +120,7 @@ def initial_setup(server):
|
||||
world.visit('/')
|
||||
|
||||
except WebDriverException:
|
||||
LOGGER.warn("Error acquiring %s browser, retrying", browser_driver, exc_info=True)
|
||||
if hasattr(world, 'browser'):
|
||||
world.browser.quit()
|
||||
num_attempts += 1
|
||||
|
||||
@@ -69,8 +69,8 @@ class IntegrationTestLTI(testutil.TestCase):
|
||||
self.assertTrue(login_response['Location'].endswith(reverse('signin_user')))
|
||||
register_response = self.client.get(login_response['Location'])
|
||||
self.assertEqual(register_response.status_code, 200)
|
||||
self.assertIn('currentProvider": "LTI Test Tool Consumer"', register_response.content)
|
||||
self.assertIn('"errorMessage": null', register_response.content)
|
||||
self.assertIn('"currentProvider": "LTI Test Tool Consumer"', register_response.content)
|
||||
self.assertIn('"errorMessage": null', register_response.content)
|
||||
|
||||
# Now complete the form:
|
||||
ajax_register_response = self.client.post(
|
||||
@@ -153,7 +153,7 @@ class IntegrationTestLTI(testutil.TestCase):
|
||||
register_response = self.client.get(login_response['Location'])
|
||||
self.assertEqual(register_response.status_code, 200)
|
||||
self.assertIn(
|
||||
'currentProvider": "Tool Consumer with Secret in Settings"',
|
||||
'"currentProvider": "Tool Consumer with Secret in Settings"',
|
||||
register_response.content
|
||||
)
|
||||
self.assertIn('"errorMessage": null', register_response.content)
|
||||
self.assertIn('"errorMessage": null', register_response.content)
|
||||
|
||||
@@ -1,13 +1,20 @@
|
||||
"""
|
||||
Third_party_auth integration tests using a mock version of the TestShib provider
|
||||
"""
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
import json
|
||||
import unittest
|
||||
import httpretty
|
||||
from mock import patch
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
from openedx.core.lib.json_utils import EscapedEdxJSONEncoder
|
||||
|
||||
from student.tests.factories import UserFactory
|
||||
from third_party_auth.tasks import fetch_saml_metadata
|
||||
from third_party_auth.tests import testutil
|
||||
import unittest
|
||||
|
||||
|
||||
TESTSHIB_ENTITY_ID = 'https://idp.testshib.org/idp/shibboleth'
|
||||
TESTSHIB_METADATA_URL = 'https://mock.testshib.org/metadata/testshib-providers.xml'
|
||||
@@ -81,11 +88,11 @@ class TestShibIntegrationTest(testutil.SAMLTestCase):
|
||||
# We'd now like to see if the "You've successfully signed into TestShib" message is
|
||||
# shown, but it's managed by a JavaScript runtime template, and we can't run JS in this
|
||||
# type of test, so we just check for the variable that triggers that message.
|
||||
self.assertIn('"currentProvider": "TestShib"', register_response.content)
|
||||
self.assertIn('"errorMessage": null', register_response.content)
|
||||
self.assertIn('"currentProvider": "TestShib"', register_response.content)
|
||||
self.assertIn('"errorMessage": null', register_response.content)
|
||||
# Now do a crude check that the data (e.g. email) from the provider is displayed in the form:
|
||||
self.assertIn('"defaultValue": "myself@testshib.org"', register_response.content)
|
||||
self.assertIn('"defaultValue": "Me Myself And I"', register_response.content)
|
||||
self.assertIn('"defaultValue": "myself@testshib.org"', register_response.content)
|
||||
self.assertIn('"defaultValue": "Me Myself And I"', register_response.content)
|
||||
# Now complete the form:
|
||||
ajax_register_response = self.client.post(
|
||||
reverse('user_api_registration'),
|
||||
@@ -128,8 +135,8 @@ class TestShibIntegrationTest(testutil.SAMLTestCase):
|
||||
# We'd now like to see if the "You've successfully signed into TestShib" message is
|
||||
# shown, but it's managed by a JavaScript runtime template, and we can't run JS in this
|
||||
# type of test, so we just check for the variable that triggers that message.
|
||||
self.assertIn('"currentProvider": "TestShib"', login_response.content)
|
||||
self.assertIn('"errorMessage": null', login_response.content)
|
||||
self.assertIn('"currentProvider": "TestShib"', login_response.content)
|
||||
self.assertIn('"errorMessage": null', login_response.content)
|
||||
# Now the user enters their username and password.
|
||||
# The AJAX on the page will log them in:
|
||||
ajax_login_response = self.client.post(
|
||||
@@ -183,7 +190,7 @@ class TestShibIntegrationTest(testutil.SAMLTestCase):
|
||||
response = self.client.get(self.login_page_url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn("TestShib", response.content)
|
||||
self.assertIn(TPA_TESTSHIB_LOGIN_URL.replace('&', '&'), response.content)
|
||||
self.assertIn(json.dumps(TPA_TESTSHIB_LOGIN_URL, cls=EscapedEdxJSONEncoder), response.content)
|
||||
return response
|
||||
|
||||
def _check_register_page(self):
|
||||
@@ -191,7 +198,7 @@ class TestShibIntegrationTest(testutil.SAMLTestCase):
|
||||
response = self.client.get(self.register_page_url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn("TestShib", response.content)
|
||||
self.assertIn(TPA_TESTSHIB_REGISTER_URL.replace('&', '&'), response.content)
|
||||
self.assertIn(json.dumps(TPA_TESTSHIB_REGISTER_URL, cls=EscapedEdxJSONEncoder), response.content)
|
||||
return response
|
||||
|
||||
def _configure_testshib_provider(self, **kwargs):
|
||||
|
||||
@@ -145,7 +145,7 @@ class TrackMiddleware(object):
|
||||
# this: _ga=GA1.2.1033501218.1368477899. The clientId is this part: 1033501218.1368477899.
|
||||
google_analytics_cookie = request.COOKIES.get('_ga')
|
||||
if google_analytics_cookie is None:
|
||||
context['client_id'] = None
|
||||
context['client_id'] = request.META.get('HTTP_X_EDX_GA_CLIENT_ID')
|
||||
else:
|
||||
context['client_id'] = '.'.join(google_analytics_cookie.split('.')[2:])
|
||||
|
||||
|
||||
@@ -136,12 +136,16 @@ class TrackMiddlewareTestCase(TestCase):
|
||||
def test_request_headers(self):
|
||||
ip_address = '10.0.0.0'
|
||||
user_agent = 'UnitTest/1.0'
|
||||
client_id_header = '123.123'
|
||||
|
||||
factory = RequestFactory(REMOTE_ADDR=ip_address, HTTP_USER_AGENT=user_agent)
|
||||
factory = RequestFactory(
|
||||
REMOTE_ADDR=ip_address, HTTP_USER_AGENT=user_agent, HTTP_X_EDX_GA_CLIENT_ID=client_id_header
|
||||
)
|
||||
request = factory.get('/some-path')
|
||||
context = self.get_context_for_request(request)
|
||||
|
||||
self.assert_dict_subset(context, {
|
||||
'ip': ip_address,
|
||||
'agent': user_agent,
|
||||
'client_id': client_id_header
|
||||
})
|
||||
|
||||
@@ -99,6 +99,35 @@ def emit_field_changed_events(instance, user, db_table, excluded_fields=None, hi
|
||||
del instance._changed_fields
|
||||
|
||||
|
||||
def truncate_fields(old_value, new_value):
|
||||
"""
|
||||
Truncates old_value and new_value for analytics event emission if necessary.
|
||||
|
||||
Args:
|
||||
old_value(obj): the value before the change
|
||||
new_value(obj): the new value being saved
|
||||
|
||||
Returns:
|
||||
a dictionary with the following fields:
|
||||
'old': the truncated old value
|
||||
'new': the truncated new value
|
||||
'truncated': the list of fields that have been truncated
|
||||
"""
|
||||
# Compute the maximum value length so that two copies can fit into the maximum event size
|
||||
# in addition to all the other fields recorded.
|
||||
max_value_length = settings.TRACK_MAX_EVENT / 4
|
||||
|
||||
serialized_old_value, old_was_truncated = _get_truncated_setting_value(old_value, max_length=max_value_length)
|
||||
serialized_new_value, new_was_truncated = _get_truncated_setting_value(new_value, max_length=max_value_length)
|
||||
truncated_values = []
|
||||
if old_was_truncated:
|
||||
truncated_values.append("old")
|
||||
if new_was_truncated:
|
||||
truncated_values.append("new")
|
||||
|
||||
return {'old': serialized_old_value, 'new': serialized_new_value, 'truncated': truncated_values}
|
||||
|
||||
|
||||
def emit_setting_changed_event(user, db_table, setting_name, old_value, new_value):
|
||||
"""Emits an event for a change in a setting.
|
||||
|
||||
@@ -112,27 +141,15 @@ def emit_setting_changed_event(user, db_table, setting_name, old_value, new_valu
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
# Compute the maximum value length so that two copies can fit into the maximum event size
|
||||
# in addition to all the other fields recorded.
|
||||
max_value_length = settings.TRACK_MAX_EVENT / 4
|
||||
truncated_fields = truncate_fields(old_value, new_value)
|
||||
|
||||
truncated_fields['setting'] = setting_name
|
||||
truncated_fields['user_id'] = user.id
|
||||
truncated_fields['table'] = db_table
|
||||
|
||||
serialized_old_value, old_was_truncated = _get_truncated_setting_value(old_value, max_length=max_value_length)
|
||||
serialized_new_value, new_was_truncated = _get_truncated_setting_value(new_value, max_length=max_value_length)
|
||||
truncated_values = []
|
||||
if old_was_truncated:
|
||||
truncated_values.append("old")
|
||||
if new_was_truncated:
|
||||
truncated_values.append("new")
|
||||
tracker.emit(
|
||||
USER_SETTINGS_CHANGED_EVENT_NAME,
|
||||
{
|
||||
"setting": setting_name,
|
||||
"old": serialized_old_value,
|
||||
"new": serialized_new_value,
|
||||
"truncated": truncated_values,
|
||||
"user_id": user.id,
|
||||
"table": db_table,
|
||||
}
|
||||
truncated_fields
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -16,11 +16,12 @@
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<p id="answer_${id}" class="answer"></p>
|
||||
|
||||
<div id="input_${id}_preview" class="equation">
|
||||
\[\]
|
||||
<img src="${STATIC_URL}images/spinner.gif" class="loading" alt="Loading"/>
|
||||
</div>
|
||||
<p id="answer_${id}" class="answer"></p>
|
||||
</div>
|
||||
|
||||
<div class="script_placeholder" data-src="${previewer}"/>
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
% endfor
|
||||
</select>
|
||||
|
||||
<span id="answer_${id}"></span>
|
||||
<div class="indicator-container">
|
||||
<span class="status ${status.classname}"
|
||||
id="status_${id}"
|
||||
@@ -20,6 +19,7 @@
|
||||
<span class="sr">${value|h} - ${status.display_name}</span>
|
||||
</span>
|
||||
</div>
|
||||
<p class="answer" id="answer_${id}"></p>
|
||||
% if msg:
|
||||
<span class="message">${msg|n}</span>
|
||||
% endif
|
||||
|
||||
@@ -406,7 +406,6 @@ div.problem {
|
||||
margin-top: 3px;
|
||||
|
||||
.MathJax_Display {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
@@ -429,6 +428,11 @@ div.problem {
|
||||
}
|
||||
}
|
||||
|
||||
// Fix for formulaequationinput, overriding MathJax_Display default style to allow "loading" image to sit next to it
|
||||
section.formulaequationinput div.equation .MathJax_Display {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
// Hides equation previews in symbolic response problems when printing
|
||||
[id^='display'].equation {
|
||||
@media print {
|
||||
@@ -713,13 +717,10 @@ div.problem {
|
||||
height: 46px;
|
||||
}
|
||||
|
||||
> .incorrect, .correct, .unanswered {
|
||||
|
||||
.status {
|
||||
display: inline-block;
|
||||
margin-top: ($baseline/2);
|
||||
background: none;
|
||||
}
|
||||
.status {
|
||||
display: inline-block;
|
||||
margin-top: ($baseline/2);
|
||||
background: none;
|
||||
}
|
||||
|
||||
// CASE: incorrect answer
|
||||
@@ -746,8 +747,8 @@ div.problem {
|
||||
}
|
||||
}
|
||||
|
||||
// CASE: unanswered
|
||||
> .unanswered {
|
||||
// CASE: unanswered and unsubmitted
|
||||
> .unanswered, > .unsubmitted {
|
||||
|
||||
input {
|
||||
border: 2px solid $gray-l4;
|
||||
|
||||
@@ -39,6 +39,7 @@ $sequence--border-color: #C8C8C8;
|
||||
margin: -4px 0 ($baseline*1.5);
|
||||
position: relative;
|
||||
border-bottom: none;
|
||||
z-index: 0;
|
||||
|
||||
@media print {
|
||||
display: none;
|
||||
|
||||
@@ -97,13 +97,10 @@ class DiscussionModule(DiscussionFields, XModule):
|
||||
|
||||
def get_course(self):
|
||||
"""
|
||||
Return the CourseDescriptor at the root of the tree we're in.
|
||||
Return CourseDescriptor by course id.
|
||||
"""
|
||||
block = self
|
||||
while block.parent:
|
||||
block = block.get_parent()
|
||||
|
||||
return block
|
||||
course = self.runtime.modulestore.get_course(self.course_id)
|
||||
return course
|
||||
|
||||
|
||||
class DiscussionDescriptor(DiscussionFields, MetadataOnlyEditingDescriptor, RawDescriptor):
|
||||
|
||||
@@ -312,7 +312,7 @@ class SplitBulkWriteMixin(BulkOperationsMixin):
|
||||
if bulk_write_record.active:
|
||||
bulk_write_record.index = updated_index_entry
|
||||
else:
|
||||
self.db_connection.update_course_index(updated_index_entry, course_key)
|
||||
self.db_connection.update_course_index(updated_index_entry, course_context=course_key)
|
||||
|
||||
def get_structure(self, course_key, version_guid):
|
||||
bulk_write_record = self._get_bulk_ops_record(course_key)
|
||||
|
||||
@@ -90,16 +90,20 @@
|
||||
*/
|
||||
setPage: function (page) {
|
||||
var oldPage = this.currentPage,
|
||||
self = this;
|
||||
return this.goTo(page - (this.isZeroIndexed ? 1 : 0), {reset: true}).then(
|
||||
self = this,
|
||||
deferred = $.Deferred();
|
||||
this.goTo(page - (this.isZeroIndexed ? 1 : 0), {reset: true}).then(
|
||||
function () {
|
||||
self.isStale = false;
|
||||
self.trigger('page_changed');
|
||||
deferred.resolve();
|
||||
},
|
||||
function () {
|
||||
self.currentPage = oldPage;
|
||||
deferred.fail();
|
||||
}
|
||||
);
|
||||
return deferred.promise();
|
||||
},
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<div class="page-header-search wrapper-search-<%= type %>">
|
||||
<form class="search-form">
|
||||
<div class="wrapper-search-input">
|
||||
<label for="search-<%= type %>" class="search-label">><%- searchLabel %></label>
|
||||
<label for="search-<%= type %>" class="search-label"><%- searchLabel %></label>
|
||||
<input id="search-<%= type %>" class="search-field" type="text" value="<%- searchString %>" placeholder="<%- searchLabel %>" />
|
||||
<button type="button" class="action action-clear <%= searchLabel ? '' : 'is-hidden' %>" aria-label="<%- gettext('Clear search') %>">
|
||||
<i class="icon fa fa-times-circle" aria-hidden="true"></i><span class="sr"><%- gettext('Search') %></span>
|
||||
|
||||
@@ -1,192 +1,195 @@
|
||||
describe('edx.utils.validate', function () {
|
||||
;(function (define) {
|
||||
'use strict';
|
||||
define(['jquery', 'js/utils/edx.utils.validate'],
|
||||
function($) {
|
||||
|
||||
var fixture = null,
|
||||
field = null,
|
||||
result = null,
|
||||
MIN_LENGTH = 2,
|
||||
MAX_LENGTH = 20,
|
||||
VALID_STRING = 'xsy_is_awesome',
|
||||
SHORT_STRING = 'x',
|
||||
LONG_STRING = 'xsy_is_way_too_awesome',
|
||||
EMAIL_ERROR_FRAGMENT = 'formatted',
|
||||
MIN_ERROR_FRAGMENT = 'least',
|
||||
MAX_ERROR_FRAGMENT = 'up to',
|
||||
REQUIRED_ERROR_FRAGMENT = 'Please enter your',
|
||||
CUSTOM_MESSAGE = 'custom message';
|
||||
var fixture = null,
|
||||
field = null,
|
||||
result = null,
|
||||
MIN_LENGTH = 2,
|
||||
MAX_LENGTH = 20,
|
||||
VALID_STRING = 'xsy_is_awesome',
|
||||
SHORT_STRING = 'x',
|
||||
LONG_STRING = 'xsy_is_way_too_awesome',
|
||||
EMAIL_ERROR_FRAGMENT = 'formatted',
|
||||
MIN_ERROR_FRAGMENT = 'least',
|
||||
MAX_ERROR_FRAGMENT = 'up to',
|
||||
REQUIRED_ERROR_FRAGMENT = 'Please enter your',
|
||||
CUSTOM_MESSAGE = 'custom message';
|
||||
|
||||
var createFixture = function( type, name, required, minlength, maxlength, value ) {
|
||||
setFixtures('<input id="field" type=' + type + '>');
|
||||
var createFixture = function( type, name, required, minlength, maxlength, value ) {
|
||||
setFixtures('<input id="field" type=' + type + '>');
|
||||
|
||||
field = $('#field');
|
||||
field.prop('required', required);
|
||||
field.attr({
|
||||
name: name,
|
||||
minlength: minlength,
|
||||
maxlength: maxlength,
|
||||
value: value
|
||||
field = $('#field');
|
||||
field.prop('required', required);
|
||||
field.attr({
|
||||
name: name,
|
||||
minlength: minlength,
|
||||
maxlength: maxlength,
|
||||
value: value
|
||||
});
|
||||
};
|
||||
|
||||
var expectValid = function() {
|
||||
result = edx.utils.validate(field);
|
||||
expect(result.isValid).toBe(true);
|
||||
};
|
||||
|
||||
var expectInvalid = function( errorFragment ) {
|
||||
result = edx.utils.validate(field);
|
||||
expect(result.isValid).toBe(false);
|
||||
expect(result.message).toMatch(errorFragment);
|
||||
};
|
||||
|
||||
it('succeeds if an optional field is left blank', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, '');
|
||||
expectValid();
|
||||
});
|
||||
};
|
||||
|
||||
var expectValid = function() {
|
||||
result = edx.utils.validate(field);
|
||||
expect(result.isValid).toBe(true);
|
||||
};
|
||||
it('succeeds if a required field is provided a valid value', function () {
|
||||
createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, VALID_STRING);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
var expectInvalid = function( errorFragment ) {
|
||||
result = edx.utils.validate(field);
|
||||
expect(result.isValid).toBe(false);
|
||||
expect(result.message).toMatch(errorFragment);
|
||||
};
|
||||
it('fails if a required field is left blank', function () {
|
||||
createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, '');
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if an optional field is left blank', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, '');
|
||||
expectValid();
|
||||
it('fails if a field is provided a value below its minimum character limit', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, SHORT_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectInvalid(MIN_ERROR_FRAGMENT);
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectInvalid(MIN_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if a field with no minimum character limit is provided a value below its maximum character limit', function () {
|
||||
createFixture('text', 'username', false, null, MAX_LENGTH, SHORT_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('fails if a required field with no minimum character limit is left blank', function () {
|
||||
createFixture('text', 'username', true, null, MAX_LENGTH, '');
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('fails if a field is provided a value above its maximum character limit', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, LONG_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectInvalid(MAX_ERROR_FRAGMENT);
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectInvalid(MAX_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if a field with no maximum character limit is provided a value above its minimum character limit', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, null, LONG_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('succeeds if a field with no character limits is provided a value', function () {
|
||||
createFixture('text', 'username', false, null, null, VALID_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('fails if an email field is provided an invalid address', function () {
|
||||
createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart');
|
||||
|
||||
// Verify optional field behavior
|
||||
expectInvalid(EMAIL_ERROR_FRAGMENT);
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', false);
|
||||
expectInvalid(EMAIL_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if an email field is provided a valid address', function () {
|
||||
createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart@label.tld');
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('succeeds if a checkbox is optional, or required and checked, but fails if a required checkbox is unchecked', function () {
|
||||
createFixture('checkbox', 'checkbox', false, null, null, 'value');
|
||||
|
||||
// Optional, unchecked
|
||||
expectValid();
|
||||
|
||||
// Optional, checked
|
||||
field.prop('checked', true);
|
||||
expectValid();
|
||||
|
||||
// Required, checked
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
|
||||
// Required, unchecked
|
||||
field.prop('checked', false);
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if a select is optional, or required and default is selected, but fails if a required select has the default option selected', function () {
|
||||
var select = [
|
||||
'<select id="dropdown" name="country">',
|
||||
'<option value="" data-isdefault="true">Please select a country</option>',
|
||||
'<option value="BE">Belgium</option>',
|
||||
'<option value="DE">Germany</option>',
|
||||
'</select>'
|
||||
].join('');
|
||||
|
||||
setFixtures(select);
|
||||
|
||||
field = $('#dropdown');
|
||||
|
||||
// Optional
|
||||
expectValid();
|
||||
|
||||
// Required, default text selected
|
||||
field.attr('required', true);
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
|
||||
// Required, country selected
|
||||
field.val('BE');
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('returns a custom error message if an invalid field has one attached', function () {
|
||||
// Create a blank required field
|
||||
createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, '');
|
||||
|
||||
// Attach a custom error message to the field
|
||||
field.data('errormsg-required', CUSTOM_MESSAGE);
|
||||
|
||||
expectInvalid(CUSTOM_MESSAGE);
|
||||
});
|
||||
});
|
||||
|
||||
it('succeeds if a required field is provided a valid value', function () {
|
||||
createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, VALID_STRING);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('fails if a required field is left blank', function () {
|
||||
createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, '');
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('fails if a field is provided a value below its minimum character limit', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, SHORT_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectInvalid(MIN_ERROR_FRAGMENT);
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectInvalid(MIN_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if a field with no minimum character limit is provided a value below its maximum character limit', function () {
|
||||
createFixture('text', 'username', false, null, MAX_LENGTH, SHORT_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('fails if a required field with no minimum character limit is left blank', function () {
|
||||
createFixture('text', 'username', true, null, MAX_LENGTH, '');
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('fails if a field is provided a value above its maximum character limit', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, LONG_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectInvalid(MAX_ERROR_FRAGMENT);
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectInvalid(MAX_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if a field with no maximum character limit is provided a value above its minimum character limit', function () {
|
||||
createFixture('text', 'username', false, MIN_LENGTH, null, LONG_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('succeeds if a field with no character limits is provided a value', function () {
|
||||
createFixture('text', 'username', false, null, null, VALID_STRING);
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('fails if an email field is provided an invalid address', function () {
|
||||
createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart');
|
||||
|
||||
// Verify optional field behavior
|
||||
expectInvalid(EMAIL_ERROR_FRAGMENT);
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', false);
|
||||
expectInvalid(EMAIL_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if an email field is provided a valid address', function () {
|
||||
createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart@label.tld');
|
||||
|
||||
// Verify optional field behavior
|
||||
expectValid();
|
||||
|
||||
// Verify required field behavior
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('succeeds if a checkbox is optional, or required and checked, but fails if a required checkbox is unchecked', function () {
|
||||
createFixture('checkbox', 'checkbox', false, null, null, 'value');
|
||||
|
||||
// Optional, unchecked
|
||||
expectValid();
|
||||
|
||||
// Optional, checked
|
||||
field.prop('checked', true);
|
||||
expectValid();
|
||||
|
||||
// Required, checked
|
||||
field.prop('required', true);
|
||||
expectValid();
|
||||
|
||||
// Required, unchecked
|
||||
field.prop('checked', false);
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
});
|
||||
|
||||
it('succeeds if a select is optional, or required and default is selected, but fails if a required select has the default option selected', function () {
|
||||
var select = [
|
||||
'<select id="dropdown" name="country">',
|
||||
'<option value="" data-isdefault="true">Please select a country</option>',
|
||||
'<option value="BE">Belgium</option>',
|
||||
'<option value="DE">Germany</option>',
|
||||
'</select>'
|
||||
].join('');
|
||||
|
||||
setFixtures(select);
|
||||
|
||||
field = $('#dropdown');
|
||||
|
||||
// Optional
|
||||
expectValid();
|
||||
|
||||
// Required, default text selected
|
||||
field.attr('required', true);
|
||||
expectInvalid(REQUIRED_ERROR_FRAGMENT);
|
||||
|
||||
// Required, country selected
|
||||
field.val('BE');
|
||||
expectValid();
|
||||
});
|
||||
|
||||
it('returns a custom error message if an invalid field has one attached', function () {
|
||||
// Create a blank required field
|
||||
createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, '');
|
||||
|
||||
// Attach a custom error message to the field
|
||||
field.data('errormsg-required', CUSTOM_MESSAGE);
|
||||
|
||||
expectInvalid(CUSTOM_MESSAGE);
|
||||
});
|
||||
});
|
||||
}).call(this, define || RequireJS.define);
|
||||
|
||||
@@ -1,186 +1,193 @@
|
||||
var edx = edx || {};
|
||||
|
||||
(function( $, _, _s, gettext ) {
|
||||
;(function (define) {
|
||||
'use strict';
|
||||
define([
|
||||
'jquery',
|
||||
'underscore',
|
||||
'underscore.string',
|
||||
'gettext'
|
||||
],
|
||||
function($, _, _s, gettext) {
|
||||
var utils;
|
||||
|
||||
/* Mix non-conflicting functions from underscore.string
|
||||
* (all but include, contains, and reverse) into the
|
||||
* Underscore namespace. In practice, this mixin is done
|
||||
* by the access view, but doing it here helps keep the
|
||||
* utility self-contained.
|
||||
*/
|
||||
_.mixin( _.str.exports() );
|
||||
/* Mix non-conflicting functions from underscore.string
|
||||
* (all but include, contains, and reverse) into the
|
||||
* Underscore namespace. In practice, this mixin is done
|
||||
* by the access view, but doing it here helps keep the
|
||||
* utility self-contained.
|
||||
*/
|
||||
if (_.isUndefined(_s)) {
|
||||
_s = _.str;
|
||||
}
|
||||
_.mixin( _s.exports() );
|
||||
|
||||
edx.utils = edx.utils || {};
|
||||
utils = (function(){
|
||||
var _fn = {
|
||||
validate: {
|
||||
|
||||
var utils = (function(){
|
||||
var _fn = {
|
||||
validate: {
|
||||
msg: {
|
||||
email: '<li><%- gettext("The email address you\'ve provided isn\'t formatted correctly.") %></li>',
|
||||
min: '<li><%- _.sprintf( gettext("%(field)s must have at least %(count)d characters."), context ) %></li>',
|
||||
max: '<li><%- _.sprintf( gettext("%(field)s can only contain up to %(count)d characters."), context ) %></li>',
|
||||
required: '<li><%- _.sprintf( gettext("Please enter your %(field)s."), context ) %></li>',
|
||||
custom: '<li><%= content %></li>'
|
||||
},
|
||||
|
||||
msg: {
|
||||
email: '<li><%- gettext("The email address you\'ve provided isn\'t formatted correctly.") %></li>',
|
||||
min: '<li><%- _.sprintf( gettext("%(field)s must have at least %(count)d characters."), context ) %></li>',
|
||||
max: '<li><%- _.sprintf( gettext("%(field)s can only contain up to %(count)d characters."), context ) %></li>',
|
||||
required: '<li><%- _.sprintf( gettext("Please enter your %(field)s."), context ) %></li>',
|
||||
custom: '<li><%= content %></li>'
|
||||
},
|
||||
field: function( el ) {
|
||||
var $el = $(el),
|
||||
required = true,
|
||||
min = true,
|
||||
max = true,
|
||||
email = true,
|
||||
response = {},
|
||||
isBlank = _fn.validate.isBlank( $el );
|
||||
|
||||
field: function( el ) {
|
||||
var $el = $(el),
|
||||
required = true,
|
||||
min = true,
|
||||
max = true,
|
||||
email = true,
|
||||
response = {},
|
||||
isBlank = _fn.validate.isBlank( $el );
|
||||
|
||||
if ( _fn.validate.isRequired( $el ) ) {
|
||||
if ( isBlank ) {
|
||||
required = false;
|
||||
} else {
|
||||
if ( _fn.validate.isRequired( $el ) ) {
|
||||
if ( isBlank ) {
|
||||
required = false;
|
||||
} else {
|
||||
min = _fn.validate.str.minlength( $el );
|
||||
max = _fn.validate.str.maxlength( $el );
|
||||
email = _fn.validate.email.valid( $el );
|
||||
}
|
||||
} else if ( !isBlank ) {
|
||||
min = _fn.validate.str.minlength( $el );
|
||||
max = _fn.validate.str.maxlength( $el );
|
||||
email = _fn.validate.email.valid( $el );
|
||||
}
|
||||
} else if ( !isBlank ) {
|
||||
min = _fn.validate.str.minlength( $el );
|
||||
max = _fn.validate.str.maxlength( $el );
|
||||
email = _fn.validate.email.valid( $el );
|
||||
}
|
||||
|
||||
response.isValid = required && min && max && email;
|
||||
response.isValid = required && min && max && email;
|
||||
|
||||
if ( !response.isValid ) {
|
||||
_fn.validate.removeDefault( $el );
|
||||
if ( !response.isValid ) {
|
||||
_fn.validate.removeDefault( $el );
|
||||
|
||||
response.message = _fn.validate.getMessage( $el, {
|
||||
required: required,
|
||||
min: min,
|
||||
max: max,
|
||||
email: email
|
||||
});
|
||||
}
|
||||
|
||||
return response;
|
||||
},
|
||||
|
||||
str: {
|
||||
minlength: function( $el ) {
|
||||
var min = $el.attr('minlength') || 0;
|
||||
|
||||
return min <= $el.val().length;
|
||||
},
|
||||
|
||||
maxlength: function( $el ) {
|
||||
var max = $el.attr('maxlength') || false;
|
||||
|
||||
return ( !!max ) ? max >= $el.val().length : true;
|
||||
}
|
||||
},
|
||||
|
||||
isRequired: function( $el ) {
|
||||
return $el.attr('required');
|
||||
},
|
||||
|
||||
isBlank: function( $el ) {
|
||||
var type = $el.attr('type'),
|
||||
isBlank;
|
||||
|
||||
if ( type === 'checkbox' ) {
|
||||
isBlank = !$el.prop('checked');
|
||||
} else if ( type === 'select' ) {
|
||||
isBlank = ( $el.data('isdefault') === true );
|
||||
} else {
|
||||
isBlank = !$el.val();
|
||||
}
|
||||
|
||||
return isBlank;
|
||||
},
|
||||
|
||||
email: {
|
||||
// This is the same regex used to validate email addresses in Django 1.4
|
||||
regex: new RegExp(
|
||||
[
|
||||
'(^[-!#$%&\'*+/=?^_`{}|~0-9A-Z]+(\\.[-!#$%&\'*+/=?^_`{}|~0-9A-Z]+)*',
|
||||
'|^"([\\001-\\010\\013\\014\\016-\\037!#-\\[\\]-\\177]|\\\\[\\001-\\011\\013\\014\\016-\\177])*"',
|
||||
')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\\.)+[A-Z]{2,6}\\.?$)',
|
||||
'|\\[(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\]$'
|
||||
].join(''), 'i'
|
||||
),
|
||||
|
||||
valid: function( $el ) {
|
||||
return $el.attr('type') === 'email' ? _fn.validate.email.format( $el.val() ) : true;
|
||||
},
|
||||
|
||||
format: function( str ) {
|
||||
return _fn.validate.email.regex.test( str );
|
||||
}
|
||||
},
|
||||
|
||||
getLabel: function( id ) {
|
||||
// Extract the field label, remove the asterisk (if it appears) and any extra whitespace
|
||||
return $("label[for=" + id + "]").text().split("*")[0].trim();
|
||||
},
|
||||
|
||||
getMessage: function( $el, tests ) {
|
||||
var txt = [],
|
||||
tpl,
|
||||
label,
|
||||
obj,
|
||||
customMsg;
|
||||
|
||||
_.each( tests, function( value, key ) {
|
||||
if ( !value ) {
|
||||
label = _fn.validate.getLabel( $el.attr('id') );
|
||||
customMsg = $el.data('errormsg-' + key) || false;
|
||||
|
||||
// If the field has a custom error msg attached, use it
|
||||
if ( customMsg ) {
|
||||
tpl = _fn.validate.msg.custom;
|
||||
|
||||
obj = {
|
||||
content: customMsg
|
||||
};
|
||||
} else {
|
||||
tpl = _fn.validate.msg[key];
|
||||
|
||||
obj = {
|
||||
// We pass the context object to the template so that
|
||||
// we can perform variable interpolation using sprintf
|
||||
context: {
|
||||
field: label
|
||||
}
|
||||
};
|
||||
|
||||
if ( key === 'min' ) {
|
||||
obj.context.count = parseInt( $el.attr('minlength'), 10 );
|
||||
} else if ( key === 'max' ) {
|
||||
obj.context.count = parseInt( $el.attr('maxlength'), 10 );
|
||||
}
|
||||
}
|
||||
|
||||
txt.push( _.template( tpl, obj ) );
|
||||
response.message = _fn.validate.getMessage( $el, {
|
||||
required: required,
|
||||
min: min,
|
||||
max: max,
|
||||
email: email
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return txt.join(' ');
|
||||
},
|
||||
return response;
|
||||
},
|
||||
|
||||
// Removes the default HTML5 validation pop-up
|
||||
removeDefault: function( $el ) {
|
||||
if ( $el.setCustomValidity ) {
|
||||
$el.setCustomValidity(' ');
|
||||
str: {
|
||||
minlength: function( $el ) {
|
||||
var min = $el.attr('minlength') || 0;
|
||||
|
||||
return min <= $el.val().length;
|
||||
},
|
||||
|
||||
maxlength: function( $el ) {
|
||||
var max = $el.attr('maxlength') || false;
|
||||
|
||||
return ( !!max ) ? max >= $el.val().length : true;
|
||||
}
|
||||
},
|
||||
|
||||
isRequired: function( $el ) {
|
||||
return $el.attr('required');
|
||||
},
|
||||
|
||||
isBlank: function( $el ) {
|
||||
var type = $el.attr('type'),
|
||||
isBlank;
|
||||
|
||||
if ( type === 'checkbox' ) {
|
||||
isBlank = !$el.prop('checked');
|
||||
} else if ( type === 'select' ) {
|
||||
isBlank = ( $el.data('isdefault') === true );
|
||||
} else {
|
||||
isBlank = !$el.val();
|
||||
}
|
||||
|
||||
return isBlank;
|
||||
},
|
||||
|
||||
email: {
|
||||
// This is the same regex used to validate email addresses in Django 1.4
|
||||
regex: new RegExp(
|
||||
[
|
||||
'(^[-!#$%&\'*+/=?^_`{}|~0-9A-Z]+(\\.[-!#$%&\'*+/=?^_`{}|~0-9A-Z]+)*',
|
||||
'|^"([\\001-\\010\\013\\014\\016-\\037!#-\\[\\]-\\177]|\\\\[\\001-\\011\\013\\014\\016-\\177])*"',
|
||||
')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\\.)+[A-Z]{2,6}\\.?$)',
|
||||
'|\\[(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\]$'
|
||||
].join(''), 'i'
|
||||
),
|
||||
|
||||
valid: function( $el ) {
|
||||
return $el.attr('type') === 'email' ? _fn.validate.email.format( $el.val() ) : true;
|
||||
},
|
||||
|
||||
format: function( str ) {
|
||||
return _fn.validate.email.regex.test( str );
|
||||
}
|
||||
},
|
||||
|
||||
getLabel: function( id ) {
|
||||
// Extract the field label, remove the asterisk (if it appears) and any extra whitespace
|
||||
return $("label[for=" + id + "]").text().split("*")[0].trim();
|
||||
},
|
||||
|
||||
getMessage: function( $el, tests ) {
|
||||
var txt = [],
|
||||
tpl,
|
||||
label,
|
||||
obj,
|
||||
customMsg;
|
||||
|
||||
_.each( tests, function( value, key ) {
|
||||
if ( !value ) {
|
||||
label = _fn.validate.getLabel( $el.attr('id') );
|
||||
customMsg = $el.data('errormsg-' + key) || false;
|
||||
|
||||
// If the field has a custom error msg attached, use it
|
||||
if ( customMsg ) {
|
||||
tpl = _fn.validate.msg.custom;
|
||||
|
||||
obj = {
|
||||
content: customMsg
|
||||
};
|
||||
} else {
|
||||
tpl = _fn.validate.msg[key];
|
||||
|
||||
obj = {
|
||||
// We pass the context object to the template so that
|
||||
// we can perform variable interpolation using sprintf
|
||||
context: {
|
||||
field: label
|
||||
}
|
||||
};
|
||||
|
||||
if ( key === 'min' ) {
|
||||
obj.context.count = parseInt( $el.attr('minlength'), 10 );
|
||||
} else if ( key === 'max' ) {
|
||||
obj.context.count = parseInt( $el.attr('maxlength'), 10 );
|
||||
}
|
||||
}
|
||||
|
||||
txt.push( _.template( tpl, obj ) );
|
||||
}
|
||||
});
|
||||
|
||||
return txt.join(' ');
|
||||
},
|
||||
|
||||
// Removes the default HTML5 validation pop-up
|
||||
removeDefault: function( $el ) {
|
||||
if ( $el.setCustomValidity ) {
|
||||
$el.setCustomValidity(' ');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
validate: _fn.validate.field
|
||||
};
|
||||
return {
|
||||
validate: _fn.validate.field
|
||||
};
|
||||
|
||||
})();
|
||||
})();
|
||||
|
||||
edx.utils.validate = utils.validate;
|
||||
|
||||
})( jQuery, _, _.str, gettext );
|
||||
return utils;
|
||||
});
|
||||
}).call(this, define || RequireJS.define);
|
||||
|
||||
80
common/static/js/vendor/moment-with-locales.min.js
vendored
Normal file
80
common/static/js/vendor/moment-with-locales.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
62
common/test/acceptance/pages/common/utils.py
Normal file
62
common/test/acceptance/pages/common/utils.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""
|
||||
Utility methods common to Studio and the LMS.
|
||||
"""
|
||||
from bok_choy.promise import EmptyPromise
|
||||
from ...tests.helpers import disable_animations
|
||||
|
||||
|
||||
def wait_for_notification(page):
|
||||
"""
|
||||
Waits for the "mini-notification" to appear and disappear on the given page (subclass of PageObject).
|
||||
"""
|
||||
def _is_saving():
|
||||
"""Whether or not the notification is currently showing."""
|
||||
return page.q(css='.wrapper-notification-mini.is-shown').present
|
||||
|
||||
def _is_saving_done():
|
||||
"""Whether or not the notification is finished showing."""
|
||||
return page.q(css='.wrapper-notification-mini.is-hiding').present
|
||||
|
||||
EmptyPromise(_is_saving, 'Notification should have been shown.', timeout=60).fulfill()
|
||||
EmptyPromise(_is_saving_done, 'Notification should have been hidden.', timeout=60).fulfill()
|
||||
|
||||
|
||||
def click_css(page, css, source_index=0, require_notification=True):
|
||||
"""
|
||||
Click the button/link with the given css and index on the specified page (subclass of PageObject).
|
||||
|
||||
Will only consider elements that are displayed and have a height and width greater than zero.
|
||||
|
||||
If require_notification is False (default value is True), the method will return immediately.
|
||||
Otherwise, it will wait for the "mini-notification" to appear and disappear.
|
||||
"""
|
||||
def _is_visible(element):
|
||||
"""Is the given element visible?"""
|
||||
# Only make the call to size once (instead of once for the height and once for the width)
|
||||
# because otherwise you will trigger a extra query on a remote element.
|
||||
return element.is_displayed() and all(size > 0 for size in element.size.itervalues())
|
||||
|
||||
# Disable all animations for faster testing with more reliable synchronization
|
||||
disable_animations(page)
|
||||
# Click on the element in the browser
|
||||
page.q(css=css).filter(_is_visible).nth(source_index).click()
|
||||
|
||||
if require_notification:
|
||||
wait_for_notification(page)
|
||||
|
||||
# Some buttons trigger ajax posts
|
||||
# (e.g. .add-missing-groups-button as configured in split_test_author_view.js)
|
||||
# so after you click anything wait for the ajax call to finish
|
||||
page.wait_for_ajax()
|
||||
|
||||
|
||||
def confirm_prompt(page, cancel=False, require_notification=None):
|
||||
"""
|
||||
Ensures that a modal prompt and confirmation button are visible, then clicks the button. The prompt is canceled iff
|
||||
cancel is True.
|
||||
"""
|
||||
page.wait_for_element_visibility('.prompt', 'Prompt is visible')
|
||||
confirmation_button_css = '.prompt .action-' + ('secondary' if cancel else 'primary')
|
||||
page.wait_for_element_visibility(confirmation_button_css, 'Confirmation button is visible')
|
||||
require_notification = (not cancel) if require_notification is None else require_notification
|
||||
click_css(page, confirmation_button_css, require_notification=require_notification)
|
||||
@@ -6,15 +6,15 @@ Teams pages.
|
||||
from .course_page import CoursePage
|
||||
from .discussion import InlineDiscussionPage
|
||||
from ..common.paging import PaginatedUIMixin
|
||||
from ...pages.studio.utils import confirm_prompt
|
||||
from ...pages.common.utils import confirm_prompt
|
||||
|
||||
from .fields import FieldsMixin
|
||||
|
||||
|
||||
TOPIC_CARD_CSS = 'div.wrapper-card-core'
|
||||
CARD_TITLE_CSS = 'h3.card-title'
|
||||
MY_TEAMS_BUTTON_CSS = 'a.nav-item[data-index="0"]'
|
||||
BROWSE_BUTTON_CSS = 'a.nav-item[data-index="1"]'
|
||||
MY_TEAMS_BUTTON_CSS = '.nav-item[data-index="0"]'
|
||||
BROWSE_BUTTON_CSS = '.nav-item[data-index="1"]'
|
||||
TEAMS_LINK_CSS = '.action-view'
|
||||
TEAMS_HEADER_CSS = '.teams-header'
|
||||
CREATE_TEAM_LINK_CSS = '.create-team'
|
||||
@@ -23,23 +23,48 @@ CREATE_TEAM_LINK_CSS = '.create-team'
|
||||
class TeamCardsMixin(object):
|
||||
"""Provides common operations on the team card component."""
|
||||
|
||||
def _bounded_selector(self, css):
|
||||
"""Bind the CSS to a particular tabpanel (e.g. My Teams or Browse)."""
|
||||
return '{tabpanel_id} {css}'.format(tabpanel_id=getattr(self, 'tabpanel_id', ''), css=css)
|
||||
|
||||
def view_first_team(self):
|
||||
"""Click the 'view' button of the first team card on the page."""
|
||||
self.q(css=self._bounded_selector('a.action-view')).first.click()
|
||||
|
||||
@property
|
||||
def team_cards(self):
|
||||
"""Get all the team cards on the page."""
|
||||
return self.q(css='.team-card')
|
||||
return self.q(css=self._bounded_selector('.team-card'))
|
||||
|
||||
@property
|
||||
def team_names(self):
|
||||
"""Return the names of each team on the page."""
|
||||
return self.q(css='h3.card-title').map(lambda e: e.text).results
|
||||
return self.q(css=self._bounded_selector('h3.card-title')).map(lambda e: e.text).results
|
||||
|
||||
@property
|
||||
def team_descriptions(self):
|
||||
"""Return the names of each team on the page."""
|
||||
return self.q(css='p.card-description').map(lambda e: e.text).results
|
||||
return self.q(css=self._bounded_selector('p.card-description')).map(lambda e: e.text).results
|
||||
|
||||
|
||||
class TeamsPage(CoursePage):
|
||||
class BreadcrumbsMixin(object):
|
||||
"""Provides common operations on teams page breadcrumb links."""
|
||||
|
||||
@property
|
||||
def header_page_breadcrumbs(self):
|
||||
"""Get the page breadcrumb text displayed by the page header"""
|
||||
return self.q(css='.page-header .breadcrumbs')[0].text
|
||||
|
||||
def click_all_topics(self):
|
||||
""" Click on the "All Topics" breadcrumb """
|
||||
self.q(css='a.nav-item').filter(text='All Topics')[0].click()
|
||||
|
||||
def click_specific_topic(self, topic):
|
||||
""" Click on the breadcrumb for a specific topic """
|
||||
self.q(css='a.nav-item').filter(text=topic)[0].click()
|
||||
|
||||
|
||||
class TeamsPage(CoursePage, BreadcrumbsMixin):
|
||||
"""
|
||||
Teams page/tab.
|
||||
"""
|
||||
@@ -88,7 +113,7 @@ class TeamsPage(CoursePage):
|
||||
|
||||
# Click to "My Team" and verify that it contains the expected number of teams.
|
||||
self.q(css=MY_TEAMS_BUTTON_CSS).click()
|
||||
|
||||
self.wait_for_ajax()
|
||||
self.wait_for(
|
||||
lambda: len(self.q(css='.team-card')) == expected_count,
|
||||
description="Expected number of teams is wrong"
|
||||
@@ -102,6 +127,11 @@ class TeamsPage(CoursePage):
|
||||
""" Click on the breadcrumb for a specific topic """
|
||||
self.q(css='a.nav-item').filter(text=topic)[0].click()
|
||||
|
||||
@property
|
||||
def warning_message(self):
|
||||
"""Return the text of the team warning message."""
|
||||
return self.q(css='.warning').results[0].text
|
||||
|
||||
|
||||
class MyTeamsPage(CoursePage, PaginatedUIMixin, TeamCardsMixin):
|
||||
"""
|
||||
@@ -109,6 +139,7 @@ class MyTeamsPage(CoursePage, PaginatedUIMixin, TeamCardsMixin):
|
||||
"""
|
||||
|
||||
url_path = "teams/#my-teams"
|
||||
tabpanel_id = '#tabpanel-my-teams'
|
||||
|
||||
def is_browser_on_page(self):
|
||||
"""Check if the "My Teams" tab is being viewed."""
|
||||
@@ -140,7 +171,7 @@ class BrowseTopicsPage(CoursePage, PaginatedUIMixin):
|
||||
@property
|
||||
def topic_names(self):
|
||||
"""Return a list of the topic names present on the page."""
|
||||
return self.q(css=CARD_TITLE_CSS).map(lambda e: e.text).results
|
||||
return self.q(css='#tabpanel-browse ' + CARD_TITLE_CSS).map(lambda e: e.text).results
|
||||
|
||||
@property
|
||||
def topic_descriptions(self):
|
||||
@@ -164,7 +195,7 @@ class BrowseTopicsPage(CoursePage, PaginatedUIMixin):
|
||||
self.wait_for_ajax()
|
||||
|
||||
|
||||
class BaseTeamsPage(CoursePage, PaginatedUIMixin, TeamCardsMixin):
|
||||
class BaseTeamsPage(CoursePage, PaginatedUIMixin, TeamCardsMixin, BreadcrumbsMixin):
|
||||
"""
|
||||
The paginated UI for browsing teams within a Topic on the Teams
|
||||
page.
|
||||
@@ -202,6 +233,11 @@ class BaseTeamsPage(CoursePage, PaginatedUIMixin, TeamCardsMixin):
|
||||
lambda e: e.is_selected()
|
||||
).results[0].text.strip()
|
||||
|
||||
@property
|
||||
def team_names(self):
|
||||
"""Get all the team names on the page."""
|
||||
return self.q(css=CARD_TITLE_CSS).map(lambda e: e.text).results
|
||||
|
||||
def click_create_team_link(self):
|
||||
""" Click on create team link."""
|
||||
query = self.q(css=CREATE_TEAM_LINK_CSS)
|
||||
@@ -273,9 +309,9 @@ class SearchTeamsPage(BaseTeamsPage):
|
||||
self.url_path = "teams/#topics/{topic_id}/search".format(topic_id=self.topic['id'])
|
||||
|
||||
|
||||
class CreateOrEditTeamPage(CoursePage, FieldsMixin):
|
||||
class TeamManagementPage(CoursePage, FieldsMixin, BreadcrumbsMixin):
|
||||
"""
|
||||
Create team page.
|
||||
Team page for creation, editing, and deletion.
|
||||
"""
|
||||
def __init__(self, browser, course_id, topic):
|
||||
"""
|
||||
@@ -284,15 +320,13 @@ class CreateOrEditTeamPage(CoursePage, FieldsMixin):
|
||||
representation of a topic following the same convention as a
|
||||
course module's topic.
|
||||
"""
|
||||
super(CreateOrEditTeamPage, self).__init__(browser, course_id)
|
||||
super(TeamManagementPage, self).__init__(browser, course_id)
|
||||
self.topic = topic
|
||||
self.url_path = "teams/#topics/{topic_id}/create-team".format(topic_id=self.topic['id'])
|
||||
|
||||
def is_browser_on_page(self):
|
||||
"""Check if we're on the create team page for a particular topic."""
|
||||
has_correct_url = self.url.endswith(self.url_path)
|
||||
teams_create_view_present = self.q(css='.team-edit-fields').present
|
||||
return has_correct_url and teams_create_view_present
|
||||
return self.q(css='.team-edit-fields').present
|
||||
|
||||
@property
|
||||
def header_page_name(self):
|
||||
@@ -304,11 +338,6 @@ class CreateOrEditTeamPage(CoursePage, FieldsMixin):
|
||||
"""Get the page description displayed by the page header"""
|
||||
return self.q(css='.page-header .page-description')[0].text
|
||||
|
||||
@property
|
||||
def header_page_breadcrumbs(self):
|
||||
"""Get the page breadcrumb text displayed by the page header"""
|
||||
return self.q(css='.page-header .breadcrumbs')[0].text
|
||||
|
||||
@property
|
||||
def validation_message_text(self):
|
||||
"""Get the error message text"""
|
||||
@@ -324,8 +353,70 @@ class CreateOrEditTeamPage(CoursePage, FieldsMixin):
|
||||
self.q(css='.create-team .action-cancel').first.click()
|
||||
self.wait_for_ajax()
|
||||
|
||||
@property
|
||||
def delete_team_button(self):
|
||||
"""Returns the 'delete team' button."""
|
||||
return self.q(css='.action-delete').first
|
||||
|
||||
class TeamPage(CoursePage, PaginatedUIMixin):
|
||||
def click_membership_button(self):
|
||||
"""Clicks the 'edit membership' button"""
|
||||
self.q(css='.action-edit-members').first.click()
|
||||
self.wait_for_ajax()
|
||||
|
||||
@property
|
||||
def membership_button_present(self):
|
||||
"""Checks if the edit membership button is present"""
|
||||
return self.q(css='.action-edit-members').present
|
||||
|
||||
|
||||
class EditMembershipPage(CoursePage):
|
||||
"""
|
||||
Staff or discussion-privileged user page to remove troublesome or inactive
|
||||
students from a team
|
||||
"""
|
||||
def __init__(self, browser, course_id, team):
|
||||
"""
|
||||
Set up `self.url_path` on instantiation, since it dynamically
|
||||
reflects the current team.
|
||||
"""
|
||||
super(EditMembershipPage, self).__init__(browser, course_id)
|
||||
self.team = team
|
||||
self.url_path = "teams/#teams/{topic_id}/{team_id}/edit-team/manage-members".format(
|
||||
topic_id=self.team['topic_id'], team_id=self.team['id']
|
||||
)
|
||||
|
||||
def is_browser_on_page(self):
|
||||
"""Check if we're on the team membership page for a particular team."""
|
||||
self.wait_for_ajax()
|
||||
|
||||
if self.q(css='.edit-members').present:
|
||||
return True
|
||||
empty_query = self.q(css='.teams-main>.page-content>p').first
|
||||
return (
|
||||
len(empty_query.results) > 0 and
|
||||
empty_query[0].text == "This team does not have any members."
|
||||
)
|
||||
|
||||
@property
|
||||
def team_members(self):
|
||||
"""Returns the number of team members shown on the page."""
|
||||
return len(self.q(css='.team-member'))
|
||||
|
||||
def click_first_remove(self):
|
||||
"""Clicks the remove link on the first member listed."""
|
||||
self.q(css='.action-remove-member').first.click()
|
||||
|
||||
def confirm_delete_membership_dialog(self):
|
||||
"""Click 'delete' on the warning dialog."""
|
||||
confirm_prompt(self, require_notification=False)
|
||||
self.wait_for_ajax()
|
||||
|
||||
def cancel_delete_membership_dialog(self):
|
||||
"""Click 'delete' on the warning dialog."""
|
||||
confirm_prompt(self, cancel=True)
|
||||
|
||||
|
||||
class TeamPage(CoursePage, PaginatedUIMixin, BreadcrumbsMixin):
|
||||
"""
|
||||
The page for a specific Team within the Teams tab
|
||||
"""
|
||||
@@ -422,7 +513,7 @@ class TeamPage(CoursePage, PaginatedUIMixin):
|
||||
|
||||
def click_first_profile_image(self):
|
||||
"""Clicks on first team member's profile image"""
|
||||
self.q(css='.page-content-secondary .members-info > .team-member').first.click()
|
||||
self.q(css='.page-content-secondary .members-info .team-member').first.click()
|
||||
|
||||
@property
|
||||
def first_member_username(self):
|
||||
@@ -474,11 +565,6 @@ class TeamPage(CoursePage, PaginatedUIMixin):
|
||||
""" Returns True if New Post button is present else False """
|
||||
return self.q(css='.discussion-module .new-post-btn').present
|
||||
|
||||
def click_all_topics_breadcrumb(self):
|
||||
"""Navigate to the 'All Topics' page."""
|
||||
self.q(css='.breadcrumbs a').results[0].click()
|
||||
self.wait_for_ajax()
|
||||
|
||||
@property
|
||||
def edit_team_button_present(self):
|
||||
""" Returns True if Edit Team button is present else False """
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from bok_choy.page_object import PageObject
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from utils import click_css
|
||||
from ..common.utils import click_css
|
||||
from selenium.webdriver.support.ui import Select
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,9 @@ from bok_choy.page_object import PageObject
|
||||
from bok_choy.promise import Promise, EmptyPromise
|
||||
from . import BASE_URL
|
||||
|
||||
from .utils import click_css, confirm_prompt, type_in_codemirror
|
||||
from ..common.utils import click_css, confirm_prompt
|
||||
|
||||
from .utils import type_in_codemirror
|
||||
|
||||
|
||||
class ContainerPage(PageObject):
|
||||
|
||||
@@ -9,7 +9,8 @@ import os
|
||||
import re
|
||||
import requests
|
||||
|
||||
from .utils import click_css
|
||||
from ..common.utils import click_css
|
||||
|
||||
from .library import LibraryPage
|
||||
from .course_page import CoursePage
|
||||
from . import BASE_URL
|
||||
|
||||
@@ -9,7 +9,9 @@ from .component_editor import ComponentEditorView
|
||||
from .container import XBlockWrapper
|
||||
from ...pages.studio.users import UsersPageMixin
|
||||
from ...pages.studio.pagination import PaginatedMixin
|
||||
from .utils import confirm_prompt, wait_for_notification
|
||||
|
||||
from ..common.utils import confirm_prompt, wait_for_notification
|
||||
|
||||
from . import BASE_URL
|
||||
|
||||
|
||||
|
||||
@@ -9,9 +9,11 @@ from bok_choy.promise import EmptyPromise
|
||||
from selenium.webdriver.support.ui import Select
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
|
||||
from ..common.utils import click_css, confirm_prompt
|
||||
|
||||
from .course_page import CoursePage
|
||||
from .container import ContainerPage
|
||||
from .utils import set_input_value_and_save, set_input_value, click_css, confirm_prompt
|
||||
from .utils import set_input_value_and_save, set_input_value
|
||||
|
||||
|
||||
class CourseOutlineItem(object):
|
||||
|
||||
@@ -139,7 +139,7 @@ class CertificatesPage(CoursePage):
|
||||
Clicks the main action presented by the prompt (such as 'Delete')
|
||||
"""
|
||||
self.wait_for_confirmation_prompt()
|
||||
self.q(css='a.button.action-primary').first.click()
|
||||
self.q(css='button.action-primary').first.click()
|
||||
self.wait_for_ajax()
|
||||
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
Course Group Configurations page.
|
||||
"""
|
||||
from bok_choy.promise import EmptyPromise
|
||||
from ..common.utils import confirm_prompt
|
||||
from .course_page import CoursePage
|
||||
from .utils import confirm_prompt
|
||||
|
||||
|
||||
class GroupConfigurationsPage(CoursePage):
|
||||
|
||||
@@ -4,8 +4,8 @@ Course Textbooks page.
|
||||
|
||||
import requests
|
||||
from path import Path as path
|
||||
from ..common.utils import click_css
|
||||
from .course_page import CoursePage
|
||||
from .utils import click_css
|
||||
|
||||
|
||||
class TextbooksPage(CoursePage):
|
||||
|
||||
@@ -3,52 +3,9 @@ Utility methods useful for Studio page tests.
|
||||
"""
|
||||
from selenium.webdriver.common.action_chains import ActionChains
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from bok_choy.promise import EmptyPromise
|
||||
from bok_choy.javascript import js_defined
|
||||
|
||||
from ...tests.helpers import disable_animations
|
||||
|
||||
|
||||
def click_css(page, css, source_index=0, require_notification=True):
|
||||
"""
|
||||
Click the button/link with the given css and index on the specified page (subclass of PageObject).
|
||||
|
||||
Will only consider elements that are displayed and have a height and width greater than zero.
|
||||
|
||||
If require_notification is False (default value is True), the method will return immediately.
|
||||
Otherwise, it will wait for the "mini-notification" to appear and disappear.
|
||||
"""
|
||||
def _is_visible(el):
|
||||
# Only make the call to size once (instead of once for the height and once for the width)
|
||||
# because otherwise you will trigger a extra query on a remote element.
|
||||
return el.is_displayed() and all(size > 0 for size in el.size.itervalues())
|
||||
|
||||
# Disable all animations for faster testing with more reliable synchronization
|
||||
disable_animations(page)
|
||||
# Click on the element in the browser
|
||||
page.q(css=css).filter(lambda el: _is_visible(el)).nth(source_index).click()
|
||||
|
||||
if require_notification:
|
||||
wait_for_notification(page)
|
||||
|
||||
# Some buttons trigger ajax posts
|
||||
# (e.g. .add-missing-groups-button as configured in split_test_author_view.js)
|
||||
# so after you click anything wait for the ajax call to finish
|
||||
page.wait_for_ajax()
|
||||
|
||||
|
||||
def wait_for_notification(page):
|
||||
"""
|
||||
Waits for the "mini-notification" to appear and disappear on the given page (subclass of PageObject).
|
||||
"""
|
||||
def _is_saving():
|
||||
return page.q(css='.wrapper-notification-mini.is-shown').present
|
||||
|
||||
def _is_saving_done():
|
||||
return page.q(css='.wrapper-notification-mini.is-hiding').present
|
||||
|
||||
EmptyPromise(_is_saving, 'Notification should have been shown.', timeout=60).fulfill()
|
||||
EmptyPromise(_is_saving_done, 'Notification should have been hidden.', timeout=60).fulfill()
|
||||
from ..common.utils import click_css, wait_for_notification
|
||||
|
||||
|
||||
@js_defined('window.jQuery')
|
||||
@@ -177,18 +134,6 @@ def get_codemirror_value(page, index=0, find_prefix="$"):
|
||||
)
|
||||
|
||||
|
||||
def confirm_prompt(page, cancel=False, require_notification=None):
|
||||
"""
|
||||
Ensures that a modal prompt and confirmation button are visible, then clicks the button. The prompt is canceled iff
|
||||
cancel is True.
|
||||
"""
|
||||
page.wait_for_element_visibility('.prompt', 'Prompt is visible')
|
||||
confirmation_button_css = '.prompt .action-' + ('secondary' if cancel else 'primary')
|
||||
page.wait_for_element_visibility(confirmation_button_css, 'Confirmation button is visible')
|
||||
require_notification = (not cancel) if require_notification is None else require_notification
|
||||
click_css(page, confirmation_button_css, require_notification=require_notification)
|
||||
|
||||
|
||||
def set_input_value(page, css, value):
|
||||
"""
|
||||
Sets the text field with the given label (display name) to the specified value.
|
||||
|
||||
@@ -8,8 +8,8 @@ from bok_choy.promise import EmptyPromise, Promise
|
||||
from bok_choy.javascript import wait_for_js, js_defined
|
||||
from ....tests.helpers import YouTubeStubConfig
|
||||
from ...lms.video.video import VideoPage
|
||||
from ...common.utils import wait_for_notification
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
from ..utils import wait_for_notification
|
||||
|
||||
|
||||
CLASS_SELECTORS = {
|
||||
|
||||
@@ -334,7 +334,7 @@ class EventsTestMixin(TestCase):
|
||||
captured_events.append(event)
|
||||
|
||||
@contextmanager
|
||||
def assert_events_match_during(self, event_filter=None, expected_events=None):
|
||||
def assert_events_match_during(self, event_filter=None, expected_events=None, in_order=True):
|
||||
"""
|
||||
Context manager that ensures that events matching the `event_filter` and `expected_events` are emitted.
|
||||
|
||||
@@ -351,7 +351,7 @@ class EventsTestMixin(TestCase):
|
||||
with self.capture_events(event_filter, len(expected_events), captured_events):
|
||||
yield
|
||||
|
||||
self.assert_events_match(expected_events, captured_events)
|
||||
self.assert_events_match(expected_events, captured_events, in_order=in_order)
|
||||
|
||||
def wait_for_events(self, start_time=None, event_filter=None, number_of_matches=1, timeout=None):
|
||||
"""
|
||||
@@ -477,17 +477,29 @@ class EventsTestMixin(TestCase):
|
||||
|
||||
self.assertEquals(len(matching_events), 0, description)
|
||||
|
||||
def assert_events_match(self, expected_events, actual_events):
|
||||
def assert_events_match(self, expected_events, actual_events, in_order=True):
|
||||
"""Assert that each actual event matches one of the expected events.
|
||||
|
||||
Args:
|
||||
expected_events (List): a list of dicts representing the expected events.
|
||||
actual_events (List): a list of dicts that were actually recorded.
|
||||
in_order (bool): if True then the events must be in the same order (defaults to True).
|
||||
"""
|
||||
Assert that each item in the expected events sequence matches its counterpart at the same index in the actual
|
||||
events sequence.
|
||||
"""
|
||||
for expected_event, actual_event in zip(expected_events, actual_events):
|
||||
assert_event_matches(
|
||||
expected_event,
|
||||
actual_event,
|
||||
tolerate=EventMatchTolerates.lenient()
|
||||
)
|
||||
if in_order:
|
||||
for expected_event, actual_event in zip(expected_events, actual_events):
|
||||
assert_event_matches(
|
||||
expected_event,
|
||||
actual_event,
|
||||
tolerate=EventMatchTolerates.lenient()
|
||||
)
|
||||
else:
|
||||
for expected_event in expected_events:
|
||||
actual_event = next(event for event in actual_events if is_matching_event(expected_event, event))
|
||||
assert_event_matches(
|
||||
expected_event,
|
||||
actual_event or {},
|
||||
tolerate=EventMatchTolerates.lenient()
|
||||
)
|
||||
|
||||
def relative_path_to_absolute_uri(self, relative_path):
|
||||
"""Return an aboslute URI given a relative path taking into account the test context."""
|
||||
|
||||
@@ -7,7 +7,8 @@ from nose.plugins.attrib import attr
|
||||
|
||||
from ..helpers import UniqueCourseTest, remove_file
|
||||
from ...pages.common.logout import LogoutPage
|
||||
from ...pages.studio.utils import add_html_component, click_css, type_in_codemirror
|
||||
from ...pages.common.utils import click_css
|
||||
from ...pages.studio.utils import add_html_component, type_in_codemirror
|
||||
from ...pages.studio.auto_auth import AutoAuthPage
|
||||
from ...pages.studio.overview import CourseOutlinePage
|
||||
from ...pages.studio.container import ContainerPage
|
||||
|
||||
@@ -7,7 +7,8 @@ import json
|
||||
from bok_choy.web_app_test import WebAppTest
|
||||
from ..helpers import generate_course_key
|
||||
from ...pages.common.logout import LogoutPage
|
||||
from ...pages.studio.utils import add_html_component, click_css, type_in_codemirror
|
||||
from ...pages.common.utils import click_css
|
||||
from ...pages.studio.utils import add_html_component, type_in_codemirror
|
||||
from ...pages.studio.auto_auth import AutoAuthPage
|
||||
from ...pages.studio.overview import CourseOutlinePage
|
||||
from ...pages.studio.container import ContainerPage
|
||||
|
||||
@@ -5,6 +5,7 @@ End-to-end tests for the LMS Instructor Dashboard.
|
||||
|
||||
import time
|
||||
|
||||
from flaky import flaky
|
||||
from nose.plugins.attrib import attr
|
||||
from bok_choy.promise import EmptyPromise
|
||||
|
||||
@@ -221,6 +222,7 @@ class ProctoredExamsTest(BaseInstructorDashboardTest):
|
||||
# Start the proctored exam.
|
||||
self.courseware_page.start_timed_exam()
|
||||
|
||||
@flaky # TODO fix this, see SOL-1183
|
||||
def test_can_add_remove_allowance(self):
|
||||
"""
|
||||
Make sure that allowances can be added and removed.
|
||||
|
||||
@@ -5,7 +5,6 @@ Bok choy acceptance tests for problems in the LMS
|
||||
See also old lettuce tests in lms/djangoapps/courseware/features/problems.feature
|
||||
"""
|
||||
from textwrap import dedent
|
||||
from flaky import flaky
|
||||
|
||||
from ..helpers import UniqueCourseTest
|
||||
from ...pages.studio.auto_auth import AutoAuthPage
|
||||
@@ -180,7 +179,6 @@ class ProblemHintWithHtmlTest(ProblemsTest, EventsTestMixin):
|
||||
<problem>
|
||||
<p>question text</p>
|
||||
<stringresponse answer="A">
|
||||
<stringequalhint answer="B">aa <a href="#">bb</a> cc</stringequalhint>
|
||||
<stringequalhint answer="C"><a href="#">aa bb</a> cc</stringequalhint>
|
||||
<textline size="20"/>
|
||||
</stringresponse>
|
||||
@@ -192,7 +190,6 @@ class ProblemHintWithHtmlTest(ProblemsTest, EventsTestMixin):
|
||||
""")
|
||||
return XBlockFixtureDesc('problem', 'PROBLEM HTML HINT TEST', data=xml)
|
||||
|
||||
@flaky # TODO fix this, see TNL-3183
|
||||
def test_check_hint(self):
|
||||
"""
|
||||
Test clicking Check shows the extended hint in the problem message.
|
||||
@@ -200,25 +197,16 @@ class ProblemHintWithHtmlTest(ProblemsTest, EventsTestMixin):
|
||||
self.courseware_page.visit()
|
||||
problem_page = ProblemPage(self.browser)
|
||||
self.assertEqual(problem_page.problem_text[0], u'question text')
|
||||
problem_page.fill_answer('B')
|
||||
problem_page.click_check()
|
||||
self.assertEqual(problem_page.message_text, u'Incorrect: aa bb cc')
|
||||
problem_page.fill_answer('C')
|
||||
problem_page.click_check()
|
||||
self.assertEqual(problem_page.message_text, u'Incorrect: aa bb cc')
|
||||
# Check for corresponding tracking event
|
||||
actual_events = self.wait_for_events(
|
||||
event_filter={'event_type': 'edx.problem.hint.feedback_displayed'},
|
||||
number_of_matches=2
|
||||
number_of_matches=1
|
||||
)
|
||||
self.assert_events_match(
|
||||
[{'event': {'hint_label': u'Incorrect',
|
||||
'trigger_type': 'single',
|
||||
'student_answer': [u'B'],
|
||||
'correctness': False,
|
||||
'question_type': 'stringresponse',
|
||||
'hints': [{'text': 'aa <a href="#">bb</a> cc'}]}},
|
||||
{'event': {'hint_label': u'Incorrect',
|
||||
'trigger_type': 'single',
|
||||
'student_answer': [u'C'],
|
||||
'correctness': False,
|
||||
|
||||
@@ -7,12 +7,10 @@ import time
|
||||
|
||||
from dateutil.parser import parse
|
||||
import ddt
|
||||
from flaky import flaky
|
||||
from nose.plugins.attrib import attr
|
||||
from uuid import uuid4
|
||||
from unittest import skip
|
||||
|
||||
from ..helpers import UniqueCourseTest, EventsTestMixin
|
||||
from ..helpers import EventsTestMixin, UniqueCourseTest
|
||||
from ...fixtures import LMS_BASE_URL
|
||||
from ...fixtures.course import CourseFixture
|
||||
from ...fixtures.discussion import (
|
||||
@@ -23,7 +21,16 @@ from ...pages.lms.auto_auth import AutoAuthPage
|
||||
from ...pages.lms.course_info import CourseInfoPage
|
||||
from ...pages.lms.learner_profile import LearnerProfilePage
|
||||
from ...pages.lms.tab_nav import TabNavPage
|
||||
from ...pages.lms.teams import TeamsPage, MyTeamsPage, BrowseTopicsPage, BrowseTeamsPage, CreateOrEditTeamPage, TeamPage
|
||||
from ...pages.lms.teams import (
|
||||
TeamsPage,
|
||||
MyTeamsPage,
|
||||
BrowseTopicsPage,
|
||||
BrowseTeamsPage,
|
||||
TeamManagementPage,
|
||||
EditMembershipPage,
|
||||
TeamPage
|
||||
)
|
||||
from ...pages.common.utils import confirm_prompt
|
||||
|
||||
|
||||
TOPICS_PER_PAGE = 12
|
||||
@@ -197,6 +204,42 @@ class TeamsTabTest(TeamsTabBase):
|
||||
)
|
||||
self.verify_teams_present(True)
|
||||
|
||||
@ddt.data(
|
||||
'topics/{topic_id}',
|
||||
'topics/{topic_id}/search',
|
||||
'teams/{topic_id}/{team_id}/edit-team',
|
||||
'teams/{topic_id}/{team_id}'
|
||||
)
|
||||
def test_unauthorized_error_message(self, route):
|
||||
"""Ensure that an error message is shown to the user if they attempt
|
||||
to take an action which makes an AJAX request while not signed
|
||||
in.
|
||||
"""
|
||||
topics = self.create_topics(1)
|
||||
topic = topics[0]
|
||||
self.set_team_configuration(
|
||||
{u'max_team_size': 10, u'topics': topics},
|
||||
global_staff=True
|
||||
)
|
||||
team = self.create_teams(topic, 1)[0]
|
||||
self.teams_page.visit()
|
||||
self.browser.delete_cookie('sessionid')
|
||||
url = self.browser.current_url.split('#')[0]
|
||||
self.browser.get(
|
||||
'{url}#{route}'.format(
|
||||
url=url,
|
||||
route=route.format(
|
||||
topic_id=topic['id'],
|
||||
team_id=team['id']
|
||||
)
|
||||
)
|
||||
)
|
||||
self.teams_page.wait_for_ajax()
|
||||
self.assertEqual(
|
||||
self.teams_page.warning_message,
|
||||
u"Your request could not be completed. Reload the page and try again."
|
||||
)
|
||||
|
||||
@ddt.data(
|
||||
('browse', '.topics-list'),
|
||||
# TODO: find a reliable way to match the "My Teams" tab
|
||||
@@ -250,6 +293,14 @@ class MyTeamsTest(TeamsTabBase):
|
||||
self.topic = {u"name": u"Example Topic", u"id": "example_topic", u"description": "Description"}
|
||||
self.set_team_configuration({'course_id': self.course_id, 'max_team_size': 10, 'topics': [self.topic]})
|
||||
self.my_teams_page = MyTeamsPage(self.browser, self.course_id)
|
||||
self.page_viewed_event = {
|
||||
'event_type': 'edx.team.page_viewed',
|
||||
'event': {
|
||||
'page_name': 'my-teams',
|
||||
'topic_id': None,
|
||||
'team_id': None
|
||||
}
|
||||
}
|
||||
|
||||
def test_not_member_of_any_teams(self):
|
||||
"""
|
||||
@@ -259,7 +310,8 @@ class MyTeamsTest(TeamsTabBase):
|
||||
And I should see no teams
|
||||
And I should see a message that I belong to no teams.
|
||||
"""
|
||||
self.my_teams_page.visit()
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=[self.page_viewed_event]):
|
||||
self.my_teams_page.visit()
|
||||
self.assertEqual(len(self.my_teams_page.team_cards), 0, msg='Expected to see no team cards')
|
||||
self.assertEqual(
|
||||
self.my_teams_page.q(css='.page-content-main').text,
|
||||
@@ -277,7 +329,8 @@ class MyTeamsTest(TeamsTabBase):
|
||||
"""
|
||||
teams = self.create_teams(self.topic, 1)
|
||||
self.create_membership(self.user_info['username'], teams[0]['id'])
|
||||
self.my_teams_page.visit()
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=[self.page_viewed_event]):
|
||||
self.my_teams_page.visit()
|
||||
self.verify_teams(self.my_teams_page, teams)
|
||||
|
||||
|
||||
@@ -339,7 +392,7 @@ class BrowseTopicsTest(TeamsTabBase):
|
||||
browse_teams_page = BrowseTeamsPage(self.browser, self.course_id, topic)
|
||||
self.assertTrue(browse_teams_page.is_browser_on_page())
|
||||
browse_teams_page.click_create_team_link()
|
||||
create_team_page = CreateOrEditTeamPage(self.browser, self.course_id, topic)
|
||||
create_team_page = TeamManagementPage(self.browser, self.course_id, topic)
|
||||
create_team_page.value_for_text_field(field_id='name', value='Team Name', press_enter=False)
|
||||
create_team_page.value_for_textarea_field(
|
||||
field_id='description',
|
||||
@@ -348,8 +401,9 @@ class BrowseTopicsTest(TeamsTabBase):
|
||||
create_team_page.submit_form()
|
||||
team_page = TeamPage(self.browser, self.course_id)
|
||||
self.assertTrue(team_page.is_browser_on_page)
|
||||
team_page.click_all_topics_breadcrumb()
|
||||
team_page.click_all_topics()
|
||||
self.assertTrue(self.topics_page.is_browser_on_page())
|
||||
self.topics_page.wait_for_ajax()
|
||||
self.assertEqual(topic_name, self.topics_page.topic_names[0])
|
||||
|
||||
def test_list_topics(self):
|
||||
@@ -475,6 +529,28 @@ class BrowseTopicsTest(TeamsTabBase):
|
||||
self.assertEqual(browse_teams_page.header_name, 'Example Topic')
|
||||
self.assertEqual(browse_teams_page.header_description, 'Description')
|
||||
|
||||
def test_page_viewed_event(self):
|
||||
"""
|
||||
Scenario: Visiting the browse topics page should fire a page viewed event.
|
||||
Given I am enrolled in a course with a team configuration and a topic
|
||||
When I visit the browse topics page
|
||||
Then my browser should post a page viewed event
|
||||
"""
|
||||
topic = {u"name": u"Example Topic", u"id": u"example_topic", u"description": "Description"}
|
||||
self.set_team_configuration(
|
||||
{u"max_team_size": 1, u"topics": [topic]}
|
||||
)
|
||||
events = [{
|
||||
'event_type': 'edx.team.page_viewed',
|
||||
'event': {
|
||||
'page_name': 'browse',
|
||||
'topic_id': None,
|
||||
'team_id': None
|
||||
}
|
||||
}]
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=events):
|
||||
self.topics_page.visit()
|
||||
|
||||
|
||||
@attr('shard_5')
|
||||
@ddt.ddt
|
||||
@@ -706,7 +782,6 @@ class BrowseTeamsWithinTopicTest(TeamsTabBase):
|
||||
self.browse_teams_page.click_browse_all_teams_link()
|
||||
self.assertTrue(self.topics_page.is_browser_on_page())
|
||||
|
||||
@skip('Disabled until search connectivity issues are resolved, see TNL-3206')
|
||||
def test_search(self):
|
||||
"""
|
||||
Scenario: User should be able to search for a team
|
||||
@@ -716,34 +791,76 @@ class BrowseTeamsWithinTopicTest(TeamsTabBase):
|
||||
Then I should see the search result page
|
||||
And the search header should be shown
|
||||
And 0 results should be shown
|
||||
And my browser should fire a page viewed event for the search page
|
||||
And a searched event should have been fired
|
||||
"""
|
||||
# Note: all searches will return 0 results with the mock search server
|
||||
# used by Bok Choy.
|
||||
search_text = 'banana'
|
||||
self.create_teams(self.topic, 5)
|
||||
self.browse_teams_page.visit()
|
||||
search_results_page = self.browse_teams_page.search('banana')
|
||||
self.verify_search_header(search_results_page, 'banana')
|
||||
events = [{
|
||||
'event_type': 'edx.team.page_viewed',
|
||||
'event': {
|
||||
'page_name': 'search-teams',
|
||||
'topic_id': self.topic['id'],
|
||||
'team_id': None
|
||||
}
|
||||
}, {
|
||||
'event_type': 'edx.team.searched',
|
||||
'event': {
|
||||
'search_text': search_text,
|
||||
'topic_id': self.topic['id'],
|
||||
'number_of_results': 0
|
||||
}
|
||||
}]
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=events, in_order=False):
|
||||
search_results_page = self.browse_teams_page.search(search_text)
|
||||
self.verify_search_header(search_results_page, search_text)
|
||||
self.assertTrue(search_results_page.get_pagination_header_text().startswith('Showing 0 out of 0 total'))
|
||||
|
||||
def test_page_viewed_event(self):
|
||||
"""
|
||||
Scenario: Visiting the browse page should fire a page viewed event.
|
||||
Given I am enrolled in a course with a team configuration and a topic
|
||||
When I visit the Teams page
|
||||
Then my browser should post a page viewed event for the teams page
|
||||
"""
|
||||
self.create_teams(self.topic, 5)
|
||||
events = [{
|
||||
'event_type': 'edx.team.page_viewed',
|
||||
'event': {
|
||||
'page_name': 'single-topic',
|
||||
'topic_id': self.topic['id'],
|
||||
'team_id': None
|
||||
}
|
||||
}]
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=events):
|
||||
self.browse_teams_page.visit()
|
||||
|
||||
|
||||
@attr('shard_5')
|
||||
class TeamFormActions(TeamsTabBase):
|
||||
"""
|
||||
Base class for create & edit team.
|
||||
Base class for create, edit, and delete team.
|
||||
"""
|
||||
TEAM_DESCRIPTION = 'The Avengers are a fictional team of superheroes.'
|
||||
|
||||
topic = {'name': 'Example Topic', 'id': 'example_topic', 'description': 'Description'}
|
||||
TEAMS_NAME = 'Avengers'
|
||||
|
||||
def setUp(self):
|
||||
super(TeamFormActions, self).setUp()
|
||||
self.team_management_page = TeamManagementPage(self.browser, self.course_id, self.topic)
|
||||
|
||||
def verify_page_header(self, title, description, breadcrumbs):
|
||||
"""
|
||||
Verify that the page header correctly reflects the
|
||||
create team header, description and breadcrumb.
|
||||
"""
|
||||
self.assertEqual(self.create_or_edit_team_page.header_page_name, title)
|
||||
self.assertEqual(self.create_or_edit_team_page.header_page_description, description)
|
||||
self.assertEqual(self.create_or_edit_team_page.header_page_breadcrumbs, breadcrumbs)
|
||||
self.assertEqual(self.team_management_page.header_page_name, title)
|
||||
self.assertEqual(self.team_management_page.header_page_description, description)
|
||||
self.assertEqual(self.team_management_page.header_page_breadcrumbs, breadcrumbs)
|
||||
|
||||
def verify_and_navigate_to_create_team_page(self):
|
||||
"""Navigates to the create team page and verifies."""
|
||||
@@ -763,7 +880,7 @@ class TeamFormActions(TeamsTabBase):
|
||||
|
||||
self.team_page.click_edit_team_button()
|
||||
|
||||
self.create_or_edit_team_page.wait_for_page()
|
||||
self.team_management_page.wait_for_page()
|
||||
|
||||
# Edit page header.
|
||||
self.verify_page_header(
|
||||
@@ -786,33 +903,37 @@ class TeamFormActions(TeamsTabBase):
|
||||
|
||||
def fill_create_or_edit_form(self):
|
||||
"""Fill the create/edit team form fields with appropriate values."""
|
||||
self.create_or_edit_team_page.value_for_text_field(field_id='name', value=self.TEAMS_NAME, press_enter=False)
|
||||
self.create_or_edit_team_page.value_for_textarea_field(
|
||||
self.team_management_page.value_for_text_field(
|
||||
field_id='name',
|
||||
value=self.TEAMS_NAME,
|
||||
press_enter=False
|
||||
)
|
||||
self.team_management_page.value_for_textarea_field(
|
||||
field_id='description',
|
||||
value=self.TEAM_DESCRIPTION
|
||||
)
|
||||
self.create_or_edit_team_page.value_for_dropdown_field(field_id='language', value='English')
|
||||
self.create_or_edit_team_page.value_for_dropdown_field(field_id='country', value='Pakistan')
|
||||
self.team_management_page.value_for_dropdown_field(field_id='language', value='English')
|
||||
self.team_management_page.value_for_dropdown_field(field_id='country', value='Pakistan')
|
||||
|
||||
def verify_all_fields_exist(self):
|
||||
"""
|
||||
Verify the fields for create/edit page.
|
||||
"""
|
||||
self.assertEqual(
|
||||
self.create_or_edit_team_page.message_for_field('name'),
|
||||
self.team_management_page.message_for_field('name'),
|
||||
'A name that identifies your team (maximum 255 characters).'
|
||||
)
|
||||
self.assertEqual(
|
||||
self.create_or_edit_team_page.message_for_textarea_field('description'),
|
||||
self.team_management_page.message_for_textarea_field('description'),
|
||||
'A short description of the team to help other learners understand '
|
||||
'the goals or direction of the team (maximum 300 characters).'
|
||||
)
|
||||
self.assertEqual(
|
||||
self.create_or_edit_team_page.message_for_field('country'),
|
||||
self.team_management_page.message_for_field('country'),
|
||||
'The country that team members primarily identify with.'
|
||||
)
|
||||
self.assertEqual(
|
||||
self.create_or_edit_team_page.message_for_field('language'),
|
||||
self.team_management_page.message_for_field('language'),
|
||||
'The language that team members primarily use to communicate with each other.'
|
||||
)
|
||||
|
||||
@@ -827,7 +948,6 @@ class CreateTeamTest(TeamFormActions):
|
||||
super(CreateTeamTest, self).setUp()
|
||||
self.set_team_configuration({'course_id': self.course_id, 'max_team_size': 10, 'topics': [self.topic]})
|
||||
|
||||
self.create_or_edit_team_page = CreateOrEditTeamPage(self.browser, self.course_id, self.topic)
|
||||
self.browse_teams_page = BrowseTeamsPage(self.browser, self.course_id, self.topic)
|
||||
self.browse_teams_page.visit()
|
||||
|
||||
@@ -855,14 +975,14 @@ class CreateTeamTest(TeamFormActions):
|
||||
Then I should see the error message and highlighted fields.
|
||||
"""
|
||||
self.verify_and_navigate_to_create_team_page()
|
||||
self.create_or_edit_team_page.submit_form()
|
||||
self.team_management_page.submit_form()
|
||||
|
||||
self.assertEqual(
|
||||
self.create_or_edit_team_page.validation_message_text,
|
||||
self.team_management_page.validation_message_text,
|
||||
'Check the highlighted fields below and try again.'
|
||||
)
|
||||
self.assertTrue(self.create_or_edit_team_page.error_for_field(field_id='name'))
|
||||
self.assertTrue(self.create_or_edit_team_page.error_for_field(field_id='description'))
|
||||
self.assertTrue(self.team_management_page.error_for_field(field_id='name'))
|
||||
self.assertTrue(self.team_management_page.error_for_field(field_id='description'))
|
||||
|
||||
def test_user_can_see_error_message_for_incorrect_data(self):
|
||||
"""
|
||||
@@ -877,7 +997,7 @@ class CreateTeamTest(TeamFormActions):
|
||||
self.verify_and_navigate_to_create_team_page()
|
||||
|
||||
# Fill the name field with >255 characters to see validation message.
|
||||
self.create_or_edit_team_page.value_for_text_field(
|
||||
self.team_management_page.value_for_text_field(
|
||||
field_id='name',
|
||||
value='EdX is a massive open online course (MOOC) provider and online learning platform. '
|
||||
'It hosts online university-level courses in a wide range of disciplines to a worldwide '
|
||||
@@ -889,13 +1009,13 @@ class CreateTeamTest(TeamFormActions):
|
||||
'edX has more than 4 million users taking more than 500 courses online.',
|
||||
press_enter=False
|
||||
)
|
||||
self.create_or_edit_team_page.submit_form()
|
||||
self.team_management_page.submit_form()
|
||||
|
||||
self.assertEqual(
|
||||
self.create_or_edit_team_page.validation_message_text,
|
||||
self.team_management_page.validation_message_text,
|
||||
'Check the highlighted fields below and try again.'
|
||||
)
|
||||
self.assertTrue(self.create_or_edit_team_page.error_for_field(field_id='name'))
|
||||
self.assertTrue(self.team_management_page.error_for_field(field_id='name'))
|
||||
|
||||
def test_user_can_create_new_team_successfully(self):
|
||||
"""
|
||||
@@ -921,21 +1041,17 @@ class CreateTeamTest(TeamFormActions):
|
||||
|
||||
expected_events = [
|
||||
{
|
||||
'event_type': 'edx.team.created',
|
||||
'event': {
|
||||
'course_id': self.course_id,
|
||||
}
|
||||
'event_type': 'edx.team.created'
|
||||
},
|
||||
{
|
||||
'event_type': 'edx.team.learner_added',
|
||||
'event': {
|
||||
'course_id': self.course_id,
|
||||
'add_method': 'added_on_create',
|
||||
}
|
||||
}
|
||||
]
|
||||
with self.assert_events_match_during(event_filter=self.only_team_events, expected_events=expected_events):
|
||||
self.create_or_edit_team_page.submit_form()
|
||||
self.team_management_page.submit_form()
|
||||
|
||||
# Verify that the page is shown for the new team
|
||||
team_page = TeamPage(self.browser, self.course_id)
|
||||
@@ -967,7 +1083,7 @@ class CreateTeamTest(TeamFormActions):
|
||||
self.assertTrue(self.browse_teams_page.get_pagination_header_text().startswith('Showing 0 out of 0 total'))
|
||||
|
||||
self.verify_and_navigate_to_create_team_page()
|
||||
self.create_or_edit_team_page.cancel_team()
|
||||
self.team_management_page.cancel_team()
|
||||
|
||||
self.assertTrue(self.browse_teams_page.is_browser_on_page())
|
||||
self.assertTrue(self.browse_teams_page.get_pagination_header_text().startswith('Showing 0 out of 0 total'))
|
||||
@@ -977,6 +1093,147 @@ class CreateTeamTest(TeamFormActions):
|
||||
|
||||
self.verify_my_team_count(0)
|
||||
|
||||
def test_page_viewed_event(self):
|
||||
"""
|
||||
Scenario: Visiting the create team page should fire a page viewed event.
|
||||
Given I am enrolled in a course with a team configuration and a topic
|
||||
When I visit the create team page
|
||||
Then my browser should post a page viewed event
|
||||
"""
|
||||
events = [{
|
||||
'event_type': 'edx.team.page_viewed',
|
||||
'event': {
|
||||
'page_name': 'new-team',
|
||||
'topic_id': self.topic['id'],
|
||||
'team_id': None
|
||||
}
|
||||
}]
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=events):
|
||||
self.verify_and_navigate_to_create_team_page()
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class DeleteTeamTest(TeamFormActions):
|
||||
"""
|
||||
Tests for deleting teams.
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super(DeleteTeamTest, self).setUp()
|
||||
|
||||
self.set_team_configuration(
|
||||
{'course_id': self.course_id, 'max_team_size': 10, 'topics': [self.topic]},
|
||||
global_staff=True
|
||||
)
|
||||
|
||||
self.team = self.create_teams(self.topic, num_teams=1)[0]
|
||||
self.team_page = TeamPage(self.browser, self.course_id, team=self.team)
|
||||
|
||||
#need to have a membership to confirm it gets deleted as well
|
||||
self.create_membership(self.user_info['username'], self.team['id'])
|
||||
|
||||
self.team_page.visit()
|
||||
|
||||
def test_cancel_delete(self):
|
||||
"""
|
||||
Scenario: The user should be able to cancel the Delete Team dialog
|
||||
Given I am staff user for a course with a team
|
||||
When I visit the Team profile page
|
||||
Then I should see the Edit Team button
|
||||
And When I click edit team button
|
||||
Then I should see the Delete Team button
|
||||
When I click the delete team button
|
||||
And I cancel the prompt
|
||||
And I refresh the page
|
||||
Then I should still see the team
|
||||
"""
|
||||
self.delete_team(cancel=True)
|
||||
self.assertTrue(self.team_management_page.is_browser_on_page())
|
||||
self.browser.refresh()
|
||||
self.team_management_page.wait_for_page()
|
||||
self.assertEqual(
|
||||
' '.join(('All Topics', self.topic['name'], self.team['name'])),
|
||||
self.team_management_page.header_page_breadcrumbs
|
||||
)
|
||||
|
||||
@ddt.data('Moderator', 'Community TA', 'Administrator', None)
|
||||
def test_delete_team(self, role):
|
||||
"""
|
||||
Scenario: The user should be able to see and navigate to the delete team page.
|
||||
Given I am staff user for a course with a team
|
||||
When I visit the Team profile page
|
||||
Then I should see the Edit Team button
|
||||
And When I click edit team button
|
||||
Then I should see the Delete Team button
|
||||
When I click the delete team button
|
||||
And I confirm the prompt
|
||||
Then I should see the browse teams page
|
||||
And the team should not be present
|
||||
"""
|
||||
# If role is None, remain logged in as global staff
|
||||
if role is not None:
|
||||
AutoAuthPage(
|
||||
self.browser,
|
||||
course_id=self.course_id,
|
||||
staff=False,
|
||||
roles=role
|
||||
).visit()
|
||||
self.team_page.visit()
|
||||
self.delete_team(require_notification=False)
|
||||
browse_teams_page = BrowseTeamsPage(self.browser, self.course_id, self.topic)
|
||||
self.assertTrue(browse_teams_page.is_browser_on_page())
|
||||
self.assertNotIn(self.team['name'], browse_teams_page.team_names)
|
||||
|
||||
def delete_team(self, **kwargs):
|
||||
"""
|
||||
Delete a team. Passes `kwargs` to `confirm_prompt`.
|
||||
Expects edx.team.deleted event to be emitted, with correct course_id.
|
||||
Also expects edx.team.learner_removed event to be emitted for the
|
||||
membership that is removed as a part of the delete operation.
|
||||
"""
|
||||
|
||||
self.team_page.click_edit_team_button()
|
||||
self.team_management_page.wait_for_page()
|
||||
self.team_management_page.delete_team_button.click()
|
||||
|
||||
if 'cancel' in kwargs and kwargs['cancel'] is True:
|
||||
confirm_prompt(self.team_management_page, **kwargs)
|
||||
else:
|
||||
expected_events = [
|
||||
{
|
||||
'event_type': 'edx.team.deleted',
|
||||
'event': {
|
||||
'team_id': self.team['id']
|
||||
}
|
||||
},
|
||||
{
|
||||
'event_type': 'edx.team.learner_removed',
|
||||
'event': {
|
||||
'team_id': self.team['id'],
|
||||
'remove_method': 'team_deleted',
|
||||
'user_id': self.user_info['user_id']
|
||||
}
|
||||
}
|
||||
]
|
||||
with self.assert_events_match_during(
|
||||
event_filter=self.only_team_events, expected_events=expected_events
|
||||
):
|
||||
confirm_prompt(self.team_management_page, **kwargs)
|
||||
|
||||
def test_delete_team_updates_topics(self):
|
||||
"""
|
||||
Scenario: Deleting a team should update the team count on the topics page
|
||||
Given I am staff user for a course with a team
|
||||
And I delete a team
|
||||
When I navigate to the browse topics page
|
||||
Then the team count for the deletd team's topic should be updated
|
||||
"""
|
||||
self.delete_team(require_notification=False)
|
||||
BrowseTeamsPage(self.browser, self.course_id, self.topic).click_all_topics()
|
||||
topics_page = BrowseTopicsPage(self.browser, self.course_id)
|
||||
self.assertTrue(topics_page.is_browser_on_page())
|
||||
self.teams_page.verify_topic_team_count(0)
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class EditTeamTest(TeamFormActions):
|
||||
@@ -991,7 +1248,6 @@ class EditTeamTest(TeamFormActions):
|
||||
{'course_id': self.course_id, 'max_team_size': 10, 'topics': [self.topic]},
|
||||
global_staff=True
|
||||
)
|
||||
self.create_or_edit_team_page = CreateOrEditTeamPage(self.browser, self.course_id, self.topic)
|
||||
|
||||
self.team = self.create_teams(self.topic, num_teams=1)[0]
|
||||
self.team_page = TeamPage(self.browser, self.course_id, team=self.team)
|
||||
@@ -1019,6 +1275,7 @@ class EditTeamTest(TeamFormActions):
|
||||
Then I should see the Edit Team button
|
||||
And When I click edit team button
|
||||
Then I should see the edit team page
|
||||
And an analytics event should be fired
|
||||
When I edit all the fields with appropriate data
|
||||
And I click Update button
|
||||
Then I should see the page for my team with updated data
|
||||
@@ -1032,7 +1289,51 @@ class EditTeamTest(TeamFormActions):
|
||||
self.verify_and_navigate_to_edit_team_page()
|
||||
|
||||
self.fill_create_or_edit_form()
|
||||
self.create_or_edit_team_page.submit_form()
|
||||
|
||||
expected_events = [
|
||||
{
|
||||
'event_type': 'edx.team.changed',
|
||||
'event': {
|
||||
'team_id': self.team['id'],
|
||||
'field': 'country',
|
||||
'old': 'AF',
|
||||
'new': 'PK',
|
||||
'truncated': [],
|
||||
}
|
||||
},
|
||||
{
|
||||
'event_type': 'edx.team.changed',
|
||||
'event': {
|
||||
'team_id': self.team['id'],
|
||||
'field': 'name',
|
||||
'old': self.team['name'],
|
||||
'new': self.TEAMS_NAME,
|
||||
'truncated': [],
|
||||
}
|
||||
},
|
||||
{
|
||||
'event_type': 'edx.team.changed',
|
||||
'event': {
|
||||
'team_id': self.team['id'],
|
||||
'field': 'language',
|
||||
'old': 'aa',
|
||||
'new': 'en',
|
||||
'truncated': [],
|
||||
}
|
||||
},
|
||||
{
|
||||
'event_type': 'edx.team.changed',
|
||||
'event': {
|
||||
'team_id': self.team['id'],
|
||||
'field': 'description',
|
||||
'old': self.team['description'],
|
||||
'new': self.TEAM_DESCRIPTION,
|
||||
'truncated': [],
|
||||
}
|
||||
},
|
||||
]
|
||||
with self.assert_events_match_during(event_filter=self.only_team_events, expected_events=expected_events):
|
||||
self.team_management_page.submit_form()
|
||||
|
||||
self.team_page.wait_for_page()
|
||||
|
||||
@@ -1065,7 +1366,7 @@ class EditTeamTest(TeamFormActions):
|
||||
self.verify_and_navigate_to_edit_team_page()
|
||||
|
||||
self.fill_create_or_edit_form()
|
||||
self.create_or_edit_team_page.cancel_team()
|
||||
self.team_management_page.cancel_team()
|
||||
|
||||
self.team_page.wait_for_page()
|
||||
|
||||
@@ -1117,7 +1418,7 @@ class EditTeamTest(TeamFormActions):
|
||||
self.verify_and_navigate_to_edit_team_page()
|
||||
|
||||
self.fill_create_or_edit_form()
|
||||
self.create_or_edit_team_page.submit_form()
|
||||
self.team_management_page.submit_form()
|
||||
|
||||
self.team_page.wait_for_page()
|
||||
|
||||
@@ -1128,6 +1429,125 @@ class EditTeamTest(TeamFormActions):
|
||||
language='English'
|
||||
)
|
||||
|
||||
def test_page_viewed_event(self):
|
||||
"""
|
||||
Scenario: Visiting the edit team page should fire a page viewed event.
|
||||
Given I am enrolled in a course with a team configuration and a topic
|
||||
When I visit the edit team page
|
||||
Then my browser should post a page viewed event
|
||||
"""
|
||||
events = [{
|
||||
'event_type': 'edx.team.page_viewed',
|
||||
'event': {
|
||||
'page_name': 'edit-team',
|
||||
'topic_id': self.topic['id'],
|
||||
'team_id': self.team['id']
|
||||
}
|
||||
}]
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=events):
|
||||
self.verify_and_navigate_to_edit_team_page()
|
||||
|
||||
|
||||
@ddt.ddt
|
||||
class EditMembershipTest(TeamFormActions):
|
||||
"""
|
||||
Tests for administrating from the team membership page
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super(EditMembershipTest, self).setUp()
|
||||
|
||||
self.set_team_configuration(
|
||||
{'course_id': self.course_id, 'max_team_size': 10, 'topics': [self.topic]},
|
||||
global_staff=True
|
||||
)
|
||||
self.team_management_page = TeamManagementPage(self.browser, self.course_id, self.topic)
|
||||
self.team = self.create_teams(self.topic, num_teams=1)[0]
|
||||
|
||||
#make sure a user exists on this team so we can edit the membership
|
||||
self.create_membership(self.user_info['username'], self.team['id'])
|
||||
|
||||
self.edit_membership_page = EditMembershipPage(self.browser, self.course_id, self.team)
|
||||
self.team_page = TeamPage(self.browser, self.course_id, team=self.team)
|
||||
|
||||
def edit_membership_helper(self, role, cancel=False):
|
||||
"""
|
||||
Helper for common functionality in edit membership tests.
|
||||
Checks for all relevant assertions about membership being removed,
|
||||
including verify edx.team.learner_removed events are emitted.
|
||||
"""
|
||||
if role is not None:
|
||||
AutoAuthPage(
|
||||
self.browser,
|
||||
course_id=self.course_id,
|
||||
staff=False,
|
||||
roles=role
|
||||
).visit()
|
||||
|
||||
self.team_page.visit()
|
||||
self.team_page.click_edit_team_button()
|
||||
self.team_management_page.wait_for_page()
|
||||
|
||||
self.assertTrue(
|
||||
self.team_management_page.membership_button_present
|
||||
)
|
||||
|
||||
self.team_management_page.click_membership_button()
|
||||
self.edit_membership_page.wait_for_page()
|
||||
self.edit_membership_page.click_first_remove()
|
||||
if cancel:
|
||||
self.edit_membership_page.cancel_delete_membership_dialog()
|
||||
self.assertEqual(self.edit_membership_page.team_members, 1)
|
||||
else:
|
||||
expected_events = [
|
||||
{
|
||||
'event_type': 'edx.team.learner_removed',
|
||||
'event': {
|
||||
'team_id': self.team['id'],
|
||||
'remove_method': 'removed_by_admin',
|
||||
'user_id': self.user_info['user_id']
|
||||
}
|
||||
}
|
||||
]
|
||||
with self.assert_events_match_during(
|
||||
event_filter=self.only_team_events, expected_events=expected_events
|
||||
):
|
||||
self.edit_membership_page.confirm_delete_membership_dialog()
|
||||
self.assertEqual(self.edit_membership_page.team_members, 0)
|
||||
self.assertTrue(self.edit_membership_page.is_browser_on_page)
|
||||
|
||||
@ddt.data('Moderator', 'Community TA', 'Administrator', None)
|
||||
def test_remove_membership(self, role):
|
||||
"""
|
||||
Scenario: The user should be able to remove a membership
|
||||
Given I am staff user for a course with a team
|
||||
When I visit the Team profile page
|
||||
Then I should see the Edit Team button
|
||||
And When I click edit team button
|
||||
Then I should see the Edit Membership button
|
||||
And When I click the edit membership button
|
||||
Then I should see the edit membership page
|
||||
And When I click the remove button and confirm the dialog
|
||||
Then my membership should be removed, and I should remain on the page
|
||||
"""
|
||||
self.edit_membership_helper(role, cancel=False)
|
||||
|
||||
@ddt.data('Moderator', 'Community TA', 'Administrator', None)
|
||||
def test_cancel_remove_membership(self, role):
|
||||
"""
|
||||
Scenario: The user should be able to remove a membership
|
||||
Given I am staff user for a course with a team
|
||||
When I visit the Team profile page
|
||||
Then I should see the Edit Team button
|
||||
And When I click edit team button
|
||||
Then I should see the Edit Membership button
|
||||
And When I click the edit membership button
|
||||
Then I should see the edit membership page
|
||||
And When I click the remove button and cancel the dialog
|
||||
Then my membership should not be removed, and I should remain on the page
|
||||
"""
|
||||
self.edit_membership_helper(role, cancel=True)
|
||||
|
||||
|
||||
@attr('shard_5')
|
||||
@ddt.ddt
|
||||
@@ -1360,13 +1780,14 @@ class TeamPageTest(TeamsTabBase):
|
||||
And if I switch to "My Team", the team I have joined is displayed
|
||||
"""
|
||||
self._set_team_configuration_and_membership(create_membership=False)
|
||||
self.team_page.visit()
|
||||
teams_page = BrowseTeamsPage(self.browser, self.course_id, self.topic)
|
||||
teams_page.visit()
|
||||
teams_page.view_first_team()
|
||||
self.assertTrue(self.team_page.join_team_button_present)
|
||||
expected_events = [
|
||||
{
|
||||
'event_type': 'edx.team.learner_added',
|
||||
'event': {
|
||||
'course_id': self.course_id,
|
||||
'add_method': 'joined_from_team_view'
|
||||
}
|
||||
}
|
||||
@@ -1377,7 +1798,7 @@ class TeamPageTest(TeamsTabBase):
|
||||
self.assertFalse(self.team_page.join_team_message_present)
|
||||
self.assert_team_details(num_members=1, is_member=True)
|
||||
|
||||
# Verify that if one switches to "My Team" without reloading the page, the newly created team is shown.
|
||||
# Verify that if one switches to "My Team" without reloading the page, the newly joined team is shown.
|
||||
self.teams_page.click_all_topics()
|
||||
self.verify_my_team_count(1)
|
||||
|
||||
@@ -1445,7 +1866,6 @@ class TeamPageTest(TeamsTabBase):
|
||||
{
|
||||
'event_type': 'edx.team.learner_removed',
|
||||
'event': {
|
||||
'course_id': self.course_id,
|
||||
'remove_method': 'self_removal'
|
||||
}
|
||||
}
|
||||
@@ -1458,3 +1878,22 @@ class TeamPageTest(TeamsTabBase):
|
||||
# Verify that if one switches to "My Team" without reloading the page, the old team no longer shows.
|
||||
self.teams_page.click_all_topics()
|
||||
self.verify_my_team_count(0)
|
||||
|
||||
def test_page_viewed_event(self):
|
||||
"""
|
||||
Scenario: Visiting the team profile page should fire a page viewed event.
|
||||
Given I am enrolled in a course with a team configuration and a topic
|
||||
When I visit the team profile page
|
||||
Then my browser should post a page viewed event
|
||||
"""
|
||||
self._set_team_configuration_and_membership()
|
||||
events = [{
|
||||
'event_type': 'edx.team.page_viewed',
|
||||
'event': {
|
||||
'page_name': 'single-team',
|
||||
'topic_id': self.topic['id'],
|
||||
'team_id': self.teams[0]['id']
|
||||
}
|
||||
}]
|
||||
with self.assert_events_match_during(self.only_team_events, expected_events=events):
|
||||
self.team_page.visit()
|
||||
|
||||
@@ -4,6 +4,7 @@ Acceptance tests for Studio's Setting pages
|
||||
from unittest import skip
|
||||
from .base_studio_test import StudioCourseTest
|
||||
from ...pages.studio.settings_certificates import CertificatesPage
|
||||
from flaky import flaky
|
||||
|
||||
|
||||
class CertificatesTest(StudioCourseTest):
|
||||
@@ -106,7 +107,7 @@ class CertificatesTest(StudioCourseTest):
|
||||
|
||||
self.assertIn("Updated Course Title Override 2", certificate.course_title)
|
||||
|
||||
@skip # TODO fix this, see SOL-1053
|
||||
@flaky # TODO fix this, see SOL-1199
|
||||
def test_can_delete_certificate(self):
|
||||
"""
|
||||
Scenario: Ensure that the user can delete certificate.
|
||||
|
||||
Binary file not shown.
@@ -51,6 +51,7 @@
|
||||
# wd3bbas <mohed.alabbas@gmail.com>, 2014
|
||||
# Nabeel El-Dughailib <nabeel@qordoba.com>, 2014-2015
|
||||
# Najwan Al Rousan <najwanrousan@gmail.com>, 2013
|
||||
# soliman osman <solimanosman@windowslive.com>, 2015
|
||||
# #-#-#-#-# mako.po (edx-platform) #-#-#-#-#
|
||||
# edX translation file
|
||||
# Copyright (C) 2015 edX
|
||||
@@ -101,6 +102,7 @@
|
||||
# Najwan Al Rousan <najwanrousan@gmail.com>, 2013
|
||||
# omarithawi <oithawi@qrf.org>, 2015
|
||||
# Sarina Canelake <sarina@edx.org>, 2014
|
||||
# soliman osman <solimanosman@windowslive.com>, 2015
|
||||
# #-#-#-#-# messages.po (edx-platform) #-#-#-#-#
|
||||
# edX translation file
|
||||
# Copyright (C) 2013 edX
|
||||
@@ -129,7 +131,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-08-12 08:13+0000\n"
|
||||
"Last-Translator: Ahmed Jazzar <ajazzar@edraak.org>\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n"
|
||||
@@ -8403,6 +8405,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr "الرقم التعريفي الذي جرى توفيره حول الموضوع {topic_id} غير صالح."
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
@@ -48,7 +48,7 @@
|
||||
# Nabeel El-Dughailib <nabeel@qordoba.com>, 2014-2015
|
||||
# Najwan Al Rousan <najwanrousan@gmail.com>, 2013
|
||||
# RaghadG <raghad_g@yahoo.com>, 2014
|
||||
# soliman osman <solimanosman@windowslive.com>, 2014
|
||||
# soliman osman <solimanosman@windowslive.com>, 2014-2015
|
||||
# #-#-#-#-# underscore.po (edx-platform) #-#-#-#-#
|
||||
# edX translation file
|
||||
# Copyright (C) 2015 edX
|
||||
@@ -81,8 +81,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/open-edx/edx-platform/language/ar/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -139,6 +139,7 @@ msgstr "موافق"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -154,6 +155,7 @@ msgstr "إلغاء"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
@@ -220,7 +222,7 @@ msgstr "خطأ"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
@@ -2526,6 +2528,55 @@ msgstr ""
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Remove"
|
||||
msgstr "حذف"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2537,9 +2588,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2618,6 +2669,17 @@ msgstr ""
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2647,6 +2709,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -4251,11 +4323,6 @@ msgstr "تحميل صورة"
|
||||
msgid "Change image"
|
||||
msgstr "تغيير الصورة"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr "حذف"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr "جاري الحذف"
|
||||
@@ -5941,6 +6008,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -6117,6 +6196,10 @@ msgstr "إجراء التحقّق الآن"
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -37,8 +37,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.1a\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:15:47.324123\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:47+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:47:23.251524\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -9566,6 +9566,11 @@ msgstr ""
|
||||
"Thé süpplïéd töpïç ïd {topic_id} ïs nöt välïd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тєтυя#"
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
"Érrör çönnéçtïng tö élästïçséärçh Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тє#"
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
@@ -26,8 +26,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.1a\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:15:47.640544\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:46+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:47:23.562016\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -84,6 +84,7 @@ msgstr "ÖK Ⱡ'σя#"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -99,6 +100,7 @@ msgstr "Çänçél Ⱡ'σяєм ιρѕυ#"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
#: cms/templates/js/certificate-details.underscore
|
||||
#: cms/templates/js/certificate-editor.underscore
|
||||
#: cms/templates/js/content-group-details.underscore
|
||||
@@ -177,7 +179,7 @@ msgstr "Érrör Ⱡ'σяєм ιρѕ#"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
@@ -190,7 +192,6 @@ msgstr "Sävé Ⱡ'σяєм ι#"
|
||||
#. browser when a user needs to edit HTML
|
||||
#: cms/static/js/views/modals/edit_xblock.js
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: common/static/common/templates/image-modal.underscore
|
||||
#: common/static/common/templates/discussion/forum-action-close.underscore
|
||||
msgid "Close"
|
||||
@@ -2556,6 +2557,73 @@ msgstr ""
|
||||
"Téäm désçrïptïön çännöt hävé möré thän 300 çhäräçtérs. Ⱡ'σяєм ιρѕυм ∂σłσя "
|
||||
"ѕιт αмєт, ¢σηѕє¢тєтυя α#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
"Àn érrör öççürréd whïlé rémövïng thé mémßér fröm thé téäm. Trý ägäïn. Ⱡ'σяєм"
|
||||
" ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
"Thïs téäm döés nöt hävé äný mémßérs. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тєтυ#"
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr "Jöïnéd %(date)s Ⱡ'σяєм ιρѕυм ∂σłσ#"
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr "Läst Àçtïvïtý %(date)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr "Rémövé thïs téäm mémßér? Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢ση#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
"Thïs léärnér wïll ßé rémövéd fröm thé téäm, ällöwïng änöthér léärnér tö täké"
|
||||
" thé äväïläßlé spöt. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
#: lms/djangoapps/teams/static/teams/templates/edit-team-member.underscore
|
||||
msgid "Remove"
|
||||
msgstr "Rémövé Ⱡ'σяєм ιρѕυ#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr "Délété thïs téäm? Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
"Délétïng ä téäm ïs pérmänént änd çännöt ßé ündöné. Àll mémßérs äré rémövéd "
|
||||
"fröm thé téäm, änd téäm dïsçüssïöns çän nö löngér ßé äççésséd. Ⱡ'σяєм ιρѕυм "
|
||||
"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя "
|
||||
"ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ "
|
||||
"ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ "
|
||||
"¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє "
|
||||
"¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт "
|
||||
"ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒƒι¢ια ∂єѕєяυηт мσłłιт αηιм ι∂ єѕт łαвσ#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
"Téäm \"%(team)s\" süççéssfüllý délétéd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
|
||||
"¢σηѕє¢тє#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2569,10 +2637,10 @@ msgid "and others"
|
||||
msgstr "änd öthérs Ⱡ'σяєм ιρѕυм ∂σłσ#"
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr "Läst Àçtïvïtý %(date)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr "Läst äçtïvïtý %(date)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "View %(span_start)s %(team_name)s %(span_end)s"
|
||||
@@ -2658,6 +2726,27 @@ msgstr "Mý Téäm Ⱡ'σяєм ιρѕυм #"
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr "Bröwsé %(sr_start)s téäms %(sr_end)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
"Ýöür réqüést çöüld nöt ßé çömplétéd. Rélöäd thé pägé änd trý ägäïn. Ⱡ'σяєм "
|
||||
"ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
"Ýöür réqüést çöüld nöt ßé çömplétéd düé tö ä sérvér prößlém. Rélöäd thé pägé"
|
||||
" änd trý ägäïn. Ìf thé ïssüé pérsïsts, çlïçk thé Hélp täß tö répört thé "
|
||||
"prößlém. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ "
|
||||
"єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм"
|
||||
" νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα "
|
||||
"¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт"
|
||||
" єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт "
|
||||
"¢υρι∂αтαт ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒƒι¢ια ∂єѕєяυηт мσ#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr "Téäm Séärçh Ⱡ'σяєм ιρѕυм ∂σłσя #"
|
||||
@@ -2692,6 +2781,18 @@ msgstr ""
|
||||
"Ìf ýöü mäké sïgnïfïçänt çhängés, mäké süré ýöü nötïfý mémßérs öf thé téäm "
|
||||
"ßéföré mäkïng thésé çhängés. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr "Mémßérshïp Ⱡ'σяєм ιρѕυм ∂σłσ#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
"Ýöü çän rémövé mémßérs fröm thïs téäm, éspéçïällý ïf théý hävé nöt "
|
||||
"pärtïçïpätéd ïn thé téäm's äçtïvïtý. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr "Séärçh téäms Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
|
||||
@@ -4528,11 +4629,6 @@ msgstr "Ûplöäd än ïmägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
|
||||
msgid "Change image"
|
||||
msgstr "Çhängé ïmägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr "Rémövé Ⱡ'σяєм ιρѕυ#"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr "Rémövïng Ⱡ'σяєм ιρѕυм ∂#"
|
||||
@@ -6435,6 +6531,18 @@ msgstr "Çänçél téäm çréätïng. Ⱡ'σяєм ιρѕυм ∂σłσя ѕι
|
||||
msgid "Cancel team updating."
|
||||
msgstr "Çänçél téäm üpdätïng. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr "Ìnstrüçtör tööls Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr "Délété Téäm Ⱡ'σяєм ιρѕυм ∂σłσя #"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr "Édït Mémßérshïp Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -6625,6 +6733,10 @@ msgstr "Vérïfý Nöw Ⱡ'σяєм ιρѕυм ∂σłσ#"
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr "Märk Éxäm Às Çömplétéd Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢#"
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr "tïméd Ⱡ'σяєм ιρѕ#"
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr "Énd Mý Éxäm Ⱡ'σяєм ιρѕυм ∂σłσя #"
|
||||
|
||||
Binary file not shown.
@@ -172,7 +172,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-06-29 17:10+0000\n"
|
||||
"Last-Translator: Cristian Salamea <ovnicraft@gmail.com>\n"
|
||||
"Language-Team: Spanish (Latin America) (http://www.transifex.com/open-edx/edx-platform/language/es_419/)\n"
|
||||
@@ -434,7 +434,7 @@ msgstr "Profesional en educación"
|
||||
|
||||
#: common/djangoapps/course_modes/views.py
|
||||
msgid "Enrollment is closed"
|
||||
msgstr "Las inscripciones están cerradas"
|
||||
msgstr "Inscripciones cerradas"
|
||||
|
||||
#: common/djangoapps/course_modes/views.py
|
||||
msgid "Enrollment mode not supported"
|
||||
@@ -8628,6 +8628,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr "El ID de tema proporcionado {topic_id} no es válido"
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
@@ -99,8 +99,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: Spanish (Latin America) (http://www.transifex.com/open-edx/edx-platform/language/es_419/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -157,6 +157,7 @@ msgstr "Aceptar"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -172,6 +173,7 @@ msgstr "Cancelar"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete"
|
||||
msgstr "Borrar"
|
||||
|
||||
@@ -238,7 +240,7 @@ msgstr "Error"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
@@ -2498,6 +2500,55 @@ msgstr "Ingrese la descripción del equipo."
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr "La descripción no puede tener más de 300 caracteres."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr "Usted no es actualmente miembro de ningún equipo."
|
||||
@@ -2509,9 +2560,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2586,6 +2637,17 @@ msgstr "Mi equipo"
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr "Explorar %(sr_start)s equpos %(sr_end)s"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2615,6 +2677,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -4229,11 +4301,6 @@ msgstr "Subir una imagen"
|
||||
msgid "Change image"
|
||||
msgstr "Cambiar imagen"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr "Eliminando"
|
||||
@@ -5923,6 +5990,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -6100,6 +6179,10 @@ msgstr "Verificar ahora"
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr "Marcar el examen como completado"
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr "Terminar mi examen"
|
||||
|
||||
Binary file not shown.
@@ -178,7 +178,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-06-19 17:16+0000\n"
|
||||
"Last-Translator: Xavier Antoviaque <xavier@antoviaque.org>\n"
|
||||
"Language-Team: French (http://www.transifex.com/open-edx/edx-platform/language/fr/)\n"
|
||||
@@ -8142,6 +8142,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
@@ -110,8 +110,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: French (http://www.transifex.com/open-edx/edx-platform/language/fr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -168,6 +168,7 @@ msgstr "OK"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -183,6 +184,7 @@ msgstr "Annuler"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete"
|
||||
msgstr "Supprimer"
|
||||
|
||||
@@ -249,7 +251,7 @@ msgstr "Erreur"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
@@ -2519,6 +2521,55 @@ msgstr ""
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Remove"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2530,9 +2581,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2605,6 +2656,17 @@ msgstr ""
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2634,6 +2696,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -4225,11 +4297,6 @@ msgstr "Charger une image"
|
||||
msgid "Change image"
|
||||
msgstr "Modifier l'image"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr "Suppression en cours"
|
||||
@@ -5890,6 +5957,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -6067,6 +6146,10 @@ msgstr "Vérifier Maintenant"
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -61,7 +61,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-05-28 20:00+0000\n"
|
||||
"Last-Translator: Nadav Stark <nadav@yeda.org.il>\n"
|
||||
"Language-Team: Hebrew (http://www.transifex.com/open-edx/edx-platform/language/he/)\n"
|
||||
@@ -7428,6 +7428,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
@@ -44,8 +44,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: Hebrew (http://www.transifex.com/open-edx/edx-platform/language/he/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -102,6 +102,7 @@ msgstr ""
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -117,6 +118,7 @@ msgstr ""
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
#: cms/templates/js/certificate-details.underscore
|
||||
#: cms/templates/js/certificate-editor.underscore
|
||||
#: cms/templates/js/content-group-details.underscore
|
||||
@@ -195,7 +197,7 @@ msgstr ""
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
@@ -208,7 +210,6 @@ msgstr ""
|
||||
#. browser when a user needs to edit HTML
|
||||
#: cms/static/js/views/modals/edit_xblock.js
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: common/static/common/templates/image-modal.underscore
|
||||
#: common/static/common/templates/discussion/forum-action-close.underscore
|
||||
msgid "Close"
|
||||
@@ -2399,6 +2400,57 @@ msgstr ""
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
#: lms/djangoapps/teams/static/teams/templates/edit-team-member.underscore
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2410,9 +2462,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2485,6 +2537,17 @@ msgstr ""
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2514,6 +2577,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -3970,11 +4043,6 @@ msgstr ""
|
||||
msgid "Change image"
|
||||
msgstr ""
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr ""
|
||||
@@ -5565,6 +5633,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -5735,6 +5815,10 @@ msgstr ""
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -9,6 +9,7 @@
|
||||
# Amol Bhave <ammubhave@gmail.com>, 2013
|
||||
# anant agarwal <agarwal@cag.csail.mit.edu>, 2013
|
||||
# Anant Vima <anant.vima@anu.edu.au>, 2014
|
||||
# CHANDRA SHEKHAR SHARMA <shekharsharma041@gmail.com>, 2015
|
||||
# ria1234 <contactpayal@yahoo.com.au>, 2014
|
||||
# Goutam Kumar Dey <de_kumargoutam@yahoo.co.in>, 2014
|
||||
# gvidushiin <gvidushiin@gmail.com>, 2014
|
||||
@@ -48,6 +49,7 @@
|
||||
#
|
||||
# Translators:
|
||||
# Amol Bhave <ammubhave@gmail.com>, 2013
|
||||
# CHANDRA SHEKHAR SHARMA <shekharsharma041@gmail.com>, 2015
|
||||
# ria1234 <contactpayal@yahoo.com.au>, 2014
|
||||
# Goutam Kumar Dey <de_kumargoutam@yahoo.co.in>, 2014
|
||||
# gvidushiin <gvidushiin@gmail.com>, 2014
|
||||
@@ -72,7 +74,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-06-28 20:21+0000\n"
|
||||
"Last-Translator: ria1234 <contactpayal@yahoo.com.au>\n"
|
||||
"Language-Team: Hindi (http://www.transifex.com/open-edx/edx-platform/language/hi/)\n"
|
||||
@@ -94,12 +96,12 @@ msgstr "चर्चा"
|
||||
#: cms/djangoapps/contentstore/views/component.py
|
||||
#: lms/djangoapps/class_dashboard/dashboard_data.py
|
||||
msgid "Problem"
|
||||
msgstr ""
|
||||
msgstr "समस्या"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/component.py
|
||||
#: common/lib/xmodule/xmodule/video_module/video_module.py
|
||||
msgid "Advanced"
|
||||
msgstr ""
|
||||
msgstr "उन्नत"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/entrance_exam.py
|
||||
#: lms/djangoapps/courseware/tabs.py cms/templates/settings.html
|
||||
@@ -108,17 +110,13 @@ msgstr ""
|
||||
|
||||
#: cms/djangoapps/contentstore/views/helpers.py
|
||||
#: lms/djangoapps/class_dashboard/dashboard_data.py
|
||||
#: cms/templates/course_outline.html lms/templates/seq_module.html
|
||||
#: lms/templates/ccx/schedule.html
|
||||
#: lms/templates/instructor/instructor_dashboard_2/metrics.html
|
||||
msgid "Section"
|
||||
msgstr ""
|
||||
msgstr "खंड"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/helpers.py
|
||||
#: lms/djangoapps/class_dashboard/dashboard_data.py
|
||||
#: lms/templates/ccx/schedule.html
|
||||
msgid "Subsection"
|
||||
msgstr ""
|
||||
msgstr "उपखंड"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/helpers.py
|
||||
#: lms/djangoapps/instructor/views/tools.py
|
||||
@@ -7553,6 +7551,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
@@ -8829,7 +8831,7 @@ msgstr ""
|
||||
|
||||
#: cms/djangoapps/contentstore/views/component.py
|
||||
msgid "HTML"
|
||||
msgstr ""
|
||||
msgstr "एच टी एम एल"
|
||||
|
||||
#: cms/djangoapps/contentstore/views/component.py
|
||||
msgid "Video"
|
||||
@@ -9133,7 +9135,7 @@ msgstr "यह पेज मौजूद नहीं है"
|
||||
#: lms/templates/instructor/instructor_dashboard_2/metrics.html
|
||||
#: lms/templates/student_profile/learner_profile.html
|
||||
msgid "Loading"
|
||||
msgstr ""
|
||||
msgstr "लोड हो रहा है"
|
||||
|
||||
#: cms/templates/asset_index.html lms/templates/courseware/courseware.html
|
||||
msgid "close"
|
||||
@@ -15896,7 +15898,7 @@ msgstr ""
|
||||
|
||||
#: cms/templates/500.html
|
||||
msgid "If the problem persists, please email us at {email_link}."
|
||||
msgstr ""
|
||||
msgstr "यदि समस्या बनी रहती है तो कृपया {email} इस ईमेल पर संपर्क करें."
|
||||
|
||||
#: cms/templates/activation_active.html cms/templates/activation_complete.html
|
||||
#: cms/templates/activation_invalid.html
|
||||
@@ -15905,7 +15907,7 @@ msgstr ""
|
||||
|
||||
#: cms/templates/activation_active.html
|
||||
msgid "Your account is already active"
|
||||
msgstr ""
|
||||
msgstr "आपका खाता वर्तमान में सक्रीय है"
|
||||
|
||||
#: cms/templates/activation_active.html
|
||||
msgid ""
|
||||
@@ -15969,11 +15971,11 @@ msgstr "विषय-वस्तु"
|
||||
#: cms/templates/ux/reference/course-create-rerun.html
|
||||
#: cms/templates/ux/reference/outline.html
|
||||
msgid "Page Actions"
|
||||
msgstr ""
|
||||
msgstr "पृष्ठ के कार्यकलाप"
|
||||
|
||||
#: cms/templates/asset_index.html cms/templates/videos_index.html
|
||||
msgid "Upload New File"
|
||||
msgstr ""
|
||||
msgstr "नई फाइल अपलोड करें"
|
||||
|
||||
#: cms/templates/asset_index.html
|
||||
msgid "Adding Files for Your Course"
|
||||
|
||||
Binary file not shown.
@@ -33,6 +33,7 @@
|
||||
#
|
||||
# Translators:
|
||||
# Bhupendra Singh Rajawat <bsrajawat14@gmail.com>, 2014
|
||||
# CHANDRA SHEKHAR SHARMA <shekharsharma041@gmail.com>, 2015
|
||||
# Goutam Kumar Dey <de_kumargoutam@yahoo.co.in>, 2014
|
||||
# Vijay Dhama <vjdhama26@gmail.com>, 2015
|
||||
# #-#-#-#-# underscore-studio.po (edx-platform) #-#-#-#-#
|
||||
@@ -46,8 +47,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: Hindi (http://www.transifex.com/open-edx/edx-platform/language/hi/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -71,7 +72,7 @@ msgstr ""
|
||||
#: cms/static/js/views/utils/xblock_utils.js lms/static/js/ccx/schedule.js
|
||||
#: lms/static/js/views/fields.js
|
||||
msgid "Saving"
|
||||
msgstr ""
|
||||
msgstr "सेव हो रहा है"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -104,6 +105,7 @@ msgstr "ठीक"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -119,6 +121,7 @@ msgstr "रद्द करें"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
#: cms/templates/js/certificate-details.underscore
|
||||
#: cms/templates/js/certificate-editor.underscore
|
||||
#: cms/templates/js/content-group-details.underscore
|
||||
@@ -132,25 +135,20 @@ msgstr "रद्द करें"
|
||||
#: cms/templates/js/xblock-outline.underscore
|
||||
#: common/static/common/templates/discussion/forum-action-delete.underscore
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
msgstr "नष्ट करें"
|
||||
|
||||
#. Translators: This is the status of an active video upload
|
||||
#: cms/static/js/models/active_video_upload.js cms/static/js/views/assets.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Uploading"
|
||||
msgstr ""
|
||||
msgstr "अपलोड हो रहा है"
|
||||
|
||||
#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
#: cms/static/js/views/assets.js
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: cms/templates/js/asset-library.underscore
|
||||
#: cms/templates/js/previous-video-upload-list.underscore
|
||||
#: cms/templates/js/signatory-details.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
msgstr "नाम"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -162,7 +160,7 @@ msgstr ""
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: lms/static/coffee/src/instructor_dashboard/util.js
|
||||
msgid "Unknown"
|
||||
msgstr ""
|
||||
msgstr "अपरिचित"
|
||||
|
||||
#: cms/static/js/views/metadata.js lms/static/js/views/file_uploader.js
|
||||
msgid "Upload File"
|
||||
@@ -186,24 +184,19 @@ msgstr ""
|
||||
msgid "Error"
|
||||
msgstr ""
|
||||
|
||||
#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
#: cms/static/js/views/modals/base_modal.js
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: cms/templates/js/certificate-editor.underscore
|
||||
#: cms/templates/js/content-group-editor.underscore
|
||||
#: cms/templates/js/course_info_handouts.underscore
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-form.underscore
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
msgstr "सेव करें"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -276,7 +269,7 @@ msgstr "जवाब देखें"
|
||||
|
||||
#: common/lib/xmodule/xmodule/js/src/capa/display.js
|
||||
msgid "Answer hidden"
|
||||
msgstr ""
|
||||
msgstr "छुपा हुआ उत्तर"
|
||||
|
||||
#: common/lib/xmodule/xmodule/js/src/capa/display.js
|
||||
msgid "Status: unsubmitted"
|
||||
@@ -408,13 +401,9 @@ msgstr ""
|
||||
msgid "Add to Dictionary"
|
||||
msgstr ""
|
||||
|
||||
#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: cms/templates/js/add-xblock-component-menu-problem.underscore
|
||||
msgid "Advanced"
|
||||
msgstr ""
|
||||
msgstr "उन्नत"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -689,16 +678,12 @@ msgstr ""
|
||||
msgid "Delete table"
|
||||
msgstr ""
|
||||
|
||||
#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: cms/templates/js/certificate-editor.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: lms/templates/commerce/receipt.underscore
|
||||
#: lms/templates/verify_student/payment_confirmation_step.underscore
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
msgstr "विवरण"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -730,11 +715,6 @@ msgstr ""
|
||||
msgid "Edit HTML"
|
||||
msgstr ""
|
||||
|
||||
#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: cms/templates/js/certificate-details.underscore
|
||||
#: cms/templates/js/content-group-details.underscore
|
||||
#: cms/templates/js/course_info_handouts.underscore
|
||||
@@ -744,7 +724,7 @@ msgstr ""
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/forum-action-edit.underscore
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "परिवर्तन करें"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -1241,10 +1221,12 @@ msgstr ""
|
||||
msgid "Prev"
|
||||
msgstr ""
|
||||
|
||||
#. #-#-#-#-# djangojs-partial.po (edx-platform) #-#-#-#-#
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: lms/static/coffee/src/customwmd.js
|
||||
#: cms/templates/js/asset-library.underscore
|
||||
msgid "Preview"
|
||||
msgstr "पूर्वावलोकन"
|
||||
|
||||
@@ -2413,6 +2395,57 @@ msgstr ""
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
#: lms/djangoapps/teams/static/teams/templates/edit-team-member.underscore
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2424,9 +2457,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2499,6 +2532,17 @@ msgstr ""
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2528,6 +2572,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -4013,11 +4067,6 @@ msgstr ""
|
||||
msgid "Change image"
|
||||
msgstr ""
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr ""
|
||||
@@ -4521,10 +4570,12 @@ msgid "Max file size exceeded"
|
||||
msgstr ""
|
||||
|
||||
#: cms/static/js/views/assets.js
|
||||
#: cms/templates/js/asset-upload-modal.underscore
|
||||
msgid "Choose File"
|
||||
msgstr "फाइल का चयन करें "
|
||||
|
||||
#: cms/static/js/views/assets.js cms/static/js/views/assets.js.c
|
||||
#: cms/templates/js/asset-upload-modal.underscore
|
||||
msgid "Upload New File"
|
||||
msgstr "नई फाइल अपलोड किजिये "
|
||||
|
||||
@@ -5154,7 +5205,7 @@ msgstr ""
|
||||
#: common/static/common/templates/components/paging-footer.underscore
|
||||
#: common/static/common/templates/discussion/pagination.underscore
|
||||
msgid "Previous"
|
||||
msgstr ""
|
||||
msgstr "पिछला"
|
||||
|
||||
#: cms/templates/js/previous-video-upload-list.underscore
|
||||
#: lms/djangoapps/support/static/support/templates/certificates_results.underscore
|
||||
@@ -5203,11 +5254,11 @@ msgstr ""
|
||||
|
||||
#: common/static/common/templates/discussion/discussion-home.underscore
|
||||
msgid "Find discussions"
|
||||
msgstr ""
|
||||
msgstr "चर्चाओं को ढूंढें"
|
||||
|
||||
#: common/static/common/templates/discussion/discussion-home.underscore
|
||||
msgid "Focus in on specific topics"
|
||||
msgstr ""
|
||||
msgstr "ख़ास विषयों पर ध्यान केंद्रित करें"
|
||||
|
||||
#: common/static/common/templates/discussion/discussion-home.underscore
|
||||
msgid "Search for specific posts"
|
||||
@@ -5625,6 +5676,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -5795,6 +5858,10 @@ msgstr ""
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr ""
|
||||
@@ -6713,7 +6780,7 @@ msgstr ""
|
||||
|
||||
#: cms/templates/js/active-video-upload.underscore
|
||||
msgid "status"
|
||||
msgstr ""
|
||||
msgstr "स्थिति"
|
||||
|
||||
#: cms/templates/js/add-xblock-component-button.underscore
|
||||
msgid "Add Component:"
|
||||
|
||||
Binary file not shown.
@@ -87,8 +87,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"PO-Revision-Date: 2015-08-14 05:59+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 07:58+0000\n"
|
||||
"Last-Translator: Hongseob Lee <shevious@gmail.com>\n"
|
||||
"Language-Team: Korean (Korea) (http://www.transifex.com/open-edx/edx-platform/language/ko_KR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -572,15 +572,15 @@ msgstr "없음"
|
||||
|
||||
#: common/djangoapps/student/models.py
|
||||
msgid "{platform_name} Honor Code Certificate for {course_name}"
|
||||
msgstr " {platform_name} {course_name} 명예 과정 수료증"
|
||||
msgstr " {platform_name} {course_name} 명예 과정 이수증"
|
||||
|
||||
#: common/djangoapps/student/models.py
|
||||
msgid "{platform_name} Verified Certificate for {course_name}"
|
||||
msgstr "{platform_name} {course_name} 수료증"
|
||||
msgstr "{platform_name} {course_name} 이수증"
|
||||
|
||||
#: common/djangoapps/student/models.py
|
||||
msgid "{platform_name} Professional Certificate for {course_name}"
|
||||
msgstr "{platform_name}{course_name} 전문 과정 수료증"
|
||||
msgstr "{platform_name}{course_name} 전문 과정 이수증"
|
||||
|
||||
#: common/djangoapps/student/models.py
|
||||
msgid ""
|
||||
@@ -601,7 +601,7 @@ msgstr ""
|
||||
|
||||
#: common/djangoapps/student/models.py
|
||||
msgid "{platform_name} Certificate for {course_name}"
|
||||
msgstr "{platform_name} {course_name} 강좌 수료증"
|
||||
msgstr "{platform_name} {course_name} 강좌 이수증"
|
||||
|
||||
#: common/djangoapps/student/models.py
|
||||
msgid "The ISO 639-1 language code for this language."
|
||||
@@ -1750,7 +1750,8 @@ msgid ""
|
||||
"Defines when to randomize the variables specified in the associated Python "
|
||||
"script. For problems that do not randomize values, specify \"Never\". "
|
||||
msgstr ""
|
||||
"파이톤 스크립트로 명시된 변수들을 언제 임의 추출할 지 정합니다. 값 임의 추출이 되지 않는 문제들은, \"Never\"를 입력하세요."
|
||||
"Python 스크립트로 명시된 변수들을 언제 임의 추출할 지 정합니다. 값 임의 추출이 되지 않는 문제들은, \"Never\"를 "
|
||||
"입력하세요."
|
||||
|
||||
#: common/lib/xmodule/xmodule/capa_base.py
|
||||
msgid "On Reset"
|
||||
@@ -1804,7 +1805,7 @@ msgstr "다음 문제의 답 제출까지 학습자가 대기해야 하는 시
|
||||
#: common/lib/xmodule/xmodule/combined_open_ended_module.py
|
||||
#: common/lib/xmodule/xmodule/peer_grading_module.py
|
||||
msgid "Problem Weight"
|
||||
msgstr "문제의 비중 "
|
||||
msgstr "문제의 가중치"
|
||||
|
||||
#: common/lib/xmodule/xmodule/capa_base.py
|
||||
msgid ""
|
||||
@@ -2140,7 +2141,7 @@ msgstr ""
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Course Advertised Start Date"
|
||||
msgstr "강좌 홍보 시작 일"
|
||||
msgstr "대략적인 강좌 개강 시기"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
@@ -2236,7 +2237,7 @@ msgstr ""
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Discussion Topic Mapping"
|
||||
msgstr "게시물 주제 Mapping하기"
|
||||
msgstr "게시물 주제 도표화 하기"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
@@ -2266,7 +2267,7 @@ msgstr ""
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Course Announcement Date"
|
||||
msgstr "강좌 개설 공지일"
|
||||
msgstr "대략적인 개강 시기"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Enter the date to announce your course."
|
||||
@@ -2309,12 +2310,12 @@ msgstr "True 또는 False 를 입력합니다. True 를 입력하면 모바일
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Video Upload Credentials"
|
||||
msgstr "비디오 업로드 자격"
|
||||
msgstr "동영상 업로드 자격"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Enter the unique identifier for your course's video files provided by edX."
|
||||
msgstr "K-MOOC 에서 제공되는 강좌의 비디오 파일의 고유 식별자를 입력하십시오."
|
||||
msgstr "강좌의 동영상 파일의 고유 식별자를 입력하십시오."
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
@@ -2557,7 +2558,7 @@ msgstr "이것을 원한다면, 주제를 만들 때 게시일을 먼 미래로
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Explore edX's Support Tools"
|
||||
msgstr "KMOOC의 지원 도구 보기"
|
||||
msgstr "K-MOOC의 지원 도구 보기"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Explore the Studio Help Forum"
|
||||
@@ -2685,19 +2686,19 @@ msgstr "학습자들이 사용할 수있는 외부 로그인을 입력합니다.
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Certificates Downloadable Before End"
|
||||
msgstr "강좌 종료 전에 다운로드할 수 있는 수료증"
|
||||
msgstr "강좌 종료 전에 다운로드할 수 있는 이수증"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Enter true or false. If true, students can download certificates before the "
|
||||
"course ends, if they've met certificate requirements."
|
||||
msgstr ""
|
||||
"True 또는 False를 입력합니다. True를 입력하면, 수료증 취득 요건을 만족한 학습자들에 한해 강좌 종료 전, 수료증을 "
|
||||
"True 또는 False를 입력합니다. True를 입력하면, 이수증 취득 요건을 만족한 학습자들에 한해 강좌 종료 전, 이수증을 "
|
||||
"다운로드할 수 있습니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Certificates Display Behavior"
|
||||
msgstr "수료증 표시"
|
||||
msgstr "이수증 표시"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
@@ -2710,7 +2711,7 @@ msgid ""
|
||||
"early_with_info. To display only the links to passing students as soon as "
|
||||
"certificates are generated, enter early_no_info."
|
||||
msgstr ""
|
||||
"'end', 'early_with_info', 'early_no_info'중 하나를 입력하십시오. 수료증 생성 후, 수료증 취득 요건을 "
|
||||
"'end', 'early_with_info', 'early_no_info'중 하나를 입력하십시오. 수료증 생성 후, 이수증 취득 요건을 "
|
||||
"통과한 학습자들은 대시보드에서 수료증에 대한 링크를 확인할 수 있습니다. 불합격 학생들은 평가에 대한 정보를 확인할 수 있습니다. "
|
||||
"기본값은 'end'이며, 이를 입력할 경우 종강일 후에 수료증에 대한 정보가 표시됩니다. 수료증이 생성되자마자 학생들이 볼 수 있게 "
|
||||
"하려면 'early_with_info'을 지정하십시오. 통과한 학습자들에게만 생성 직후부터 볼 수 있게 하려면 "
|
||||
@@ -2737,43 +2738,43 @@ msgstr "Open Badges 발행"
|
||||
msgid ""
|
||||
"Issue Open Badges badges for this course. Badges are generated when "
|
||||
"certificates are created."
|
||||
msgstr "이 강좌의 Open Badges를 발행합니다. Badges는 수료증이 생성된 후 만들어집니다. "
|
||||
msgstr "이 강좌의 Open Badges를 발행합니다. Badges는 이수증이 생성된 후 만들어집니다. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Use this setting only when generating PDF certificates. Between quotation "
|
||||
"marks, enter the short name of the course to use on the certificate that "
|
||||
"students receive when they complete the course."
|
||||
msgstr "이 설정을 PDF 수료증 생성 시에만 사용합니다. 인용 부호 사이에, 수료증에 들어갈 이 강좌의 이름을 입력하세요. "
|
||||
msgstr "이 설정을 PDF 이수증 생성 시에만 사용합니다. 인용 부호 사이에, 이수증에 들어갈 이 강좌의 이름을 입력하세요. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Certificate Name (Short)"
|
||||
msgstr "수료증 이름 (단축)"
|
||||
msgstr "이수증 이름 (단축)"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid ""
|
||||
"Use this setting only when generating PDF certificates. Between quotation "
|
||||
"marks, enter the long name of the course to use on the certificate that "
|
||||
"students receive when they complete the course."
|
||||
msgstr "이 설정을 PDF 수료증 생성 시에만 사용합니다. 인용 부호 사이에, 수료증에 들어갈 이 강좌의 이름을 입력하세요. "
|
||||
msgstr "이 설정을 PDF 이수증 생성 시에만 사용합니다. 인용 부호 사이에, 이수증에 들어갈 이 강좌의 이름을 입력하세요. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Certificate Name (Long)"
|
||||
msgstr "수료증 이름 (정식)"
|
||||
msgstr "이수증 이름 (정식)"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Certificate Web/HTML View Enabled"
|
||||
msgstr "수료증 웹/HTML 보기 활성화"
|
||||
msgstr "이수증 웹/HTML 보기 활성화"
|
||||
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "If true, certificate Web/HTML views are enabled for the course."
|
||||
msgstr "True를 입력하면, 강좌에서 수료증 웹/HTML 보기가 가능합니다."
|
||||
msgstr "True를 입력하면, 강좌에서 이수증 웹/HTML 보기가 가능합니다."
|
||||
|
||||
#. Translators: This field is the container for course-specific certifcate
|
||||
#. configuration values
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Certificate Web/HTML View Overrides"
|
||||
msgstr "수료증 웹/HTML 보기 중단"
|
||||
msgstr "이수증 웹/HTML 보기 중단"
|
||||
|
||||
#. Translators: These overrides allow for an alternative configuration of the
|
||||
#. certificate web view
|
||||
@@ -2789,7 +2790,7 @@ msgstr ""
|
||||
#. configuration values
|
||||
#: common/lib/xmodule/xmodule/course_module.py
|
||||
msgid "Certificate Configuration"
|
||||
msgstr "수료증 설정"
|
||||
msgstr "이수증 설정"
|
||||
|
||||
#. Translators: These overrides allow for an alternative configuration of the
|
||||
#. certificate web view
|
||||
@@ -3031,7 +3032,7 @@ msgstr "범주 "
|
||||
msgid ""
|
||||
"A category name for the discussion. This name appears in the left pane of "
|
||||
"the discussion forum for the course."
|
||||
msgstr "게시판의 범주명입니다. 이 명칭은 강좌의 게시판 중 왼쪽 영역에 나타납니다. "
|
||||
msgstr "게시판 범주명으로, 게시판 메뉴에 들어갔을 때 화면 왼쪽에 나타납니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/discussion_module.py
|
||||
msgid "Subcategory"
|
||||
@@ -3041,11 +3042,11 @@ msgstr "하위 범주 "
|
||||
msgid ""
|
||||
"A subcategory name for the discussion. This name appears in the left pane of"
|
||||
" the discussion forum for the course."
|
||||
msgstr "게시판의 하위 범주입니다. 이 범주명은 게시판의 왼쪽 영역에서 보입니다. "
|
||||
msgstr "게시판 하위 범주명입니다. 게시판 메뉴에 들어갔을 때 화면 왼쪽에 나타나며, 범주명 아래에 위치하게 됩니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/html_module.py
|
||||
msgid "Text"
|
||||
msgstr "텍스트"
|
||||
msgstr "Text"
|
||||
|
||||
#: common/lib/xmodule/xmodule/html_module.py
|
||||
#: common/lib/xmodule/xmodule/peer_grading_module.py
|
||||
@@ -3062,8 +3063,8 @@ msgid ""
|
||||
"HTML. Select Raw to edit HTML directly. If you change this setting, you must"
|
||||
" save the component and then re-open it for editing."
|
||||
msgstr ""
|
||||
"화면 편집기를 선택하면 내용 입력시 자동으로 HTML을 생성할 수 있습니다. 또한 RAW를 선택하면 HTML을 직접 편집할 수있습니다. "
|
||||
"설정을 변경하려면 구성 요소를 저장한 후 편집을 위해 다시 열어야 합니다. "
|
||||
"Visual을 선택하면 내용 입력시 자동으로 HTML을 생성할 수 있습니다. 또한 Raw 를 선택하면 HTML을 직접 편집할 수있습니다."
|
||||
" 설정을 변경하려면 구성 요소를 저장한 후 편집을 위해 다시 열어야 합니다. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/html_module.py
|
||||
msgid "Editor"
|
||||
@@ -3071,11 +3072,11 @@ msgstr "편집기"
|
||||
|
||||
#: common/lib/xmodule/xmodule/html_module.py
|
||||
msgid "Visual"
|
||||
msgstr "화면 편집기"
|
||||
msgstr "Visual "
|
||||
|
||||
#: common/lib/xmodule/xmodule/html_module.py
|
||||
msgid "Raw"
|
||||
msgstr "직접 HTML 편집"
|
||||
msgstr "Raw "
|
||||
|
||||
#: common/lib/xmodule/xmodule/html_module.py
|
||||
msgid "HTML for the additional pages"
|
||||
@@ -3177,7 +3178,7 @@ msgstr "이메일 주소가 없습니다. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/library_content_module.py
|
||||
msgid "Any Type"
|
||||
msgstr "어떤 유형"
|
||||
msgstr "모든 유형"
|
||||
|
||||
#: common/lib/xmodule/xmodule/library_content_module.py
|
||||
#: cms/templates/widgets/header.html
|
||||
@@ -3237,7 +3238,7 @@ msgstr "이 구성요소의 사용 기한이 끝났습니다. 보관함에 새
|
||||
#. double quotes)
|
||||
#: common/lib/xmodule/xmodule/library_content_module.py
|
||||
msgid "{refresh_icon} Update now."
|
||||
msgstr "{refresh_icon} 지금 업데이트합니다."
|
||||
msgstr "{refresh_icon} 지금 업데이트"
|
||||
|
||||
#: common/lib/xmodule/xmodule/library_content_module.py
|
||||
msgid "Library is invalid, corrupt, or has been deleted."
|
||||
@@ -3826,9 +3827,9 @@ msgid ""
|
||||
"problems in your course. Valid values are \"always\", \"onreset\", "
|
||||
"\"never\", and \"per_student\"."
|
||||
msgstr ""
|
||||
"문제의 변수 값이 무작위로 설정될 횟수의 기본값을 지정하세요. 파이톤 스크립트를 제공하는 것이 아니라면, \"never\"를 지정하면 "
|
||||
"됩니다. 제공할 예정이라면, \"always\", \"onreset\", \"never\", 또는 \"per_student\"중에서 "
|
||||
"지정하세요. "
|
||||
"문제의 변수 값이 무작위로 설정될 횟수의 기본값을 지정하세요. Python 스크립트를 제공하는 것이 아니라면, \"never\"를 "
|
||||
"지정하면 됩니다. 제공할 예정이라면, \"always\", \"onreset\", \"never\", 또는 "
|
||||
"\"per_student\"중에서 지정하세요. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/modulestore/inheritance.py
|
||||
msgid "Days Early for Beta Users"
|
||||
@@ -3916,16 +3917,16 @@ msgstr "학습자들이 어떻게 집단으로 구성될 지를 정하는 설정
|
||||
|
||||
#: common/lib/xmodule/xmodule/modulestore/inheritance.py
|
||||
msgid "Enable video caching system"
|
||||
msgstr "비디오 캐싱 사용하기"
|
||||
msgstr "동영상 캐싱 시스템 이용하기"
|
||||
|
||||
#: common/lib/xmodule/xmodule/modulestore/inheritance.py
|
||||
msgid ""
|
||||
"Enter true or false. If true, video caching will be used for HTML5 videos."
|
||||
msgstr "True 또는 False를 입력합니다. True를 입력하면, 비디오 캐싱은 HTML5 비디오에 사용됩니다."
|
||||
msgstr "True 또는 False를 입력합니다. True를 입력하면, 동영상 캐싱은 HTML5 동영상에 사용됩니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/modulestore/inheritance.py
|
||||
msgid "Video Pre-Roll"
|
||||
msgstr "비디오 Pre-Roll"
|
||||
msgstr "동영상 Pre-Roll"
|
||||
|
||||
#: common/lib/xmodule/xmodule/modulestore/inheritance.py
|
||||
msgid ""
|
||||
@@ -4205,7 +4206,7 @@ msgstr "Invalid encoding type, transcripts should be UTF-8 encoded."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_module.py
|
||||
msgid "Basic"
|
||||
msgstr "기초"
|
||||
msgstr "기본"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_module.py
|
||||
msgid ""
|
||||
@@ -4215,13 +4216,13 @@ msgstr "video URL 입니다. YouTube URL 이나 mp4, ogg, .webm 파일을 링크
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_module.py
|
||||
msgid "Default Video URL"
|
||||
msgstr "비디오 URL 기본값"
|
||||
msgstr "동영상 URL 기본값"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
"The name students see. This name appears in the course ribbon and as a "
|
||||
"header for the video."
|
||||
msgstr "학습자가 보는 제목입니다. 강좌 ribbon에 제목으로 보입니다."
|
||||
msgstr "학습자가 보는 제목입니다. 강좌 리본에 제목으로 보입니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Component Display Name"
|
||||
@@ -4229,12 +4230,12 @@ msgstr "표시될 구성요소 이름"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Current position in the video."
|
||||
msgstr "비디오에서 현재 위치"
|
||||
msgstr "동영상에서 현재 위치"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
"Optional, for older browsers: the YouTube ID for the normal speed video."
|
||||
msgstr "이전 버전의 브라우저 사용자에게 선택 사항으로, 표준 속도의 비디오를 위해 YouTube ID를 입력하세요. "
|
||||
msgstr "이전 버전의 브라우저 사용자에게 선택 사항으로, 표준 속도의 동영상을 위해 YouTube ID를 입력하세요. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "YouTube ID"
|
||||
@@ -4242,11 +4243,11 @@ msgstr "YouTube ID"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Optional, for older browsers: the YouTube ID for the .75x speed video."
|
||||
msgstr "이전 버전의 브라우저 사용자에게 선택 사항으로, .75x속도의 비디오를 위해 YouTube ID를 입력하세요."
|
||||
msgstr "이전 버전의 브라우저 사용자에게 선택 사항으로, .75x속도의 동영상을 위해 YouTube ID를 입력하세요."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "YouTube ID for .75x speed"
|
||||
msgstr ".75x속도의 비디오를 위해 YouTube ID를 입력하세요."
|
||||
msgstr ".75x배속의 YouTube ID"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
@@ -4255,15 +4256,15 @@ msgstr "선택사항 입니다. 1.25x속도의 YouTube ID를 적습니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "YouTube ID for 1.25x speed"
|
||||
msgstr " 1.25x속도의 비디오를 위해 YouTube ID를 입력하세요."
|
||||
msgstr " 1.25x 배속의 YouTube ID"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Optional, for older browsers: the YouTube ID for the 1.5x speed video."
|
||||
msgstr "이전 버전의 브라우저 사용자에게 선택 사항으로, 1.5x속도의 비디오를 위해 YouTube ID를 입력하세요."
|
||||
msgstr "이전 버전의 브라우저 사용자에게 선택 사항으로, 1.5x속도의 동영상을 위해 YouTube ID를 입력하세요."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "YouTube ID for 1.5x speed"
|
||||
msgstr "1.5x속도의 비디오"
|
||||
msgstr "1.5x배속의 YouTube ID"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
@@ -4271,12 +4272,12 @@ msgid ""
|
||||
" Not supported in the native mobile app: the full video file will play. "
|
||||
"Formatted as HH:MM:SS. The maximum value is 23:59:59."
|
||||
msgstr ""
|
||||
"비디오 전체가 재생되는 것을 원하지 않는다면, 비디오 재생 시작 시간을 설정하십시오. 지원이 되지 않는 관계로, 모바일 앱에서는 전체가 "
|
||||
"동영상 전체가 재생되는 것을 원하지 않는다면, 동영상 재생 시작 시간을 설정하십시오. 지원이 되지 않는 관계로, 모바일 앱에서는 전체가 "
|
||||
"재생될 것입니다. HH:MM:SS 형식으로 입력하면 됩니다. 최대값은 23:59:59입니다. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Video Start Time"
|
||||
msgstr "비디오 시작 시간"
|
||||
msgstr "동영상 시작 시간"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
@@ -4284,12 +4285,12 @@ msgid ""
|
||||
"Not supported in the native mobile app: the full video file will play. "
|
||||
"Formatted as HH:MM:SS. The maximum value is 23:59:59."
|
||||
msgstr ""
|
||||
"비디오 전체가 재생되는 것을 원하지 않는다면, 비디오 정지 시간을 설정하십시오. 지원이 되지 않는 관계로, 모바일 앱에서는 전체가 재생될"
|
||||
"동영상 전체가 재생되는 것을 원하지 않는다면, 동영상 정지 시간을 설정하십시오. 지원이 되지 않는 관계로, 모바일 앱에서는 전체가 재생될"
|
||||
" 것입니다. HH:MM:SS 형식으로 입력하면 됩니다. 최대값은 23:59:59입니다. "
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Video Stop Time"
|
||||
msgstr "비디오 정지 시간"
|
||||
msgstr "동영상 정지 시간"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "The external URL to download the video."
|
||||
@@ -4305,12 +4306,12 @@ msgid ""
|
||||
"they cannot use the edX video player or do not have access to YouTube. You "
|
||||
"must add at least one non-YouTube URL in the Video File URLs field."
|
||||
msgstr ""
|
||||
"K-MOOC 비디오 플레이어나 YouTube에 접근할 수 없는 학습자들을 위해, 다른 포맷의 비디오를 다운로드할 수 있게 합니다. 이를 "
|
||||
"K-MOOC 동영상 플레이어나 YouTube에 접근할 수 없는 학습자들을 위해, 다른 포맷의 동영상을 다운로드할 수 있게 합니다. 이를 "
|
||||
"위해 최소 1개 이상의 YouTube URL을 Video File URLs 필드에 입력해야 합니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Video Download Allowed"
|
||||
msgstr "비디오 다운로드 허용"
|
||||
msgstr "동영상 다운로드 허용"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
@@ -4321,14 +4322,14 @@ msgid ""
|
||||
"the student's computer. To allow students to download these videos, set "
|
||||
"Video Download Allowed to True."
|
||||
msgstr ""
|
||||
"YouTube 버전이 아닌 비디오를 게시할 경우 URL입니다. 각 URL은 .mpeg, .mp4, .ogg, 또는 .webm으로 끝나야"
|
||||
"YouTube 버전이 아닌 동영상을 게시할 경우 URL입니다. 각 URL은 .mpeg, .mp4, .ogg, 또는 .webm으로 끝나야"
|
||||
" 하며, YouTube의 URL은 될 수 없습니다. (브라우저 호환성을 위해, .mp4 및 .webm 사용을 권합니다.) 학습자들은 "
|
||||
"자신의 컴퓨터와 호환이 되며, 목록에 첫 번째로 올라온 비디오를 볼 수 있을 것입니다. 학습자들이 이 비디오를 다운로드할 수 있도록 "
|
||||
"하려면 '비디오 다운로드 허용하기'를 True로 설정합니다."
|
||||
"자신의 컴퓨터와 호환이 되며, 목록에 첫 번째로 올라온 동영상을 볼 수 있을 것입니다. 학습자들이 이 동영상을 다운로드할 수 있도록 "
|
||||
"하려면 '동영상 다운로드 허용하기'를 True로 설정합니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Video File URLs"
|
||||
msgstr "비디오 파일 URLs"
|
||||
msgstr "동영상 파일 URL"
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
@@ -4342,7 +4343,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"True로 설정하면, 기본적으로 학습자들은 .srt 또는 .txt 인 자막 파일을 다운로드할 수 있습니다. 다른 형식으로 다운로드할 수 "
|
||||
"있는 자막을 제공하려는 경우, 학습 자료 필드를 사용하여 업로드하는 것이 좋습니다. 다른 방법으로는 파일 및 업로드 페이지에 자막 파일을"
|
||||
" 올리거나 여기 자막에 URL을 추가할 수 있습니다. 학습자들은 비디오 아래에서 자막 다운로드 링크를 볼 수 있습니다."
|
||||
" 올리거나 여기 자막에 URL을 추가할 수 있습니다. 학습자들은 동영상 아래에서 자막 다운로드 링크를 볼 수 있습니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Downloadable Transcript URL"
|
||||
@@ -4356,7 +4357,7 @@ msgid ""
|
||||
"format, upload a file by using the Upload Handout field."
|
||||
msgstr ""
|
||||
"모든 학습자가 자막 파일을 다운로드할 수 있으며, 다운로드 링크는 동영상 하단에 표시됩니다. 기본적으로 자막은 .srt 또는 .txt "
|
||||
"파일입니다. 다른 형식으로 자막을 제공하려면 '업로드 강의자료 필드'에서 파일을 업로드하면 됩니다."
|
||||
"파일입니다. 다른 형식으로 자막을 제공하려면 '업로드 학습 자료 필드'에서 파일을 업로드하면 됩니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Download Transcript Allowed"
|
||||
@@ -4367,7 +4368,7 @@ msgid ""
|
||||
"The default transcript for the video, from the Default Timed Transcript "
|
||||
"field on the Basic tab. This transcript should be in English. You don't have"
|
||||
" to change this setting."
|
||||
msgstr "비디오의 기본 자막입니다. 이는 영어이어야 하고, 이 설정을 변경할 필요가 없습니다."
|
||||
msgstr "동영상의 기본 자막입니다. 이는 영어이어야 하고, 이 설정을 변경할 필요가 없습니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Default Timed Transcript"
|
||||
@@ -4434,14 +4435,14 @@ msgstr ""
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid "Upload Handout"
|
||||
msgstr "강의자료 업로드 "
|
||||
msgstr "학습 자료 업로드 "
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
msgid ""
|
||||
"Specify whether access to this video is limited to browsers only, or if it "
|
||||
"can be accessed from other applications including mobile apps."
|
||||
msgstr ""
|
||||
"이 비디오에 대한 접근이 브라우저에 제한되어 있는지, 혹은 모바일 앱을 포함한 다른 어플리케이션으로도 접근할 수 있는지 여부를 "
|
||||
"이 동영상에 대한 접근이 브라우저에 제한되어 있는지, 혹은 모바일 앱을 포함한 다른 어플리케이션으로도 접근할 수 있는지 여부를 "
|
||||
"설정합니다."
|
||||
|
||||
#: common/lib/xmodule/xmodule/video_module/video_xfields.py
|
||||
@@ -4452,7 +4453,7 @@ msgid ""
|
||||
"were not assigned a Video ID, enter values in those other fields and ignore "
|
||||
"this field."
|
||||
msgstr ""
|
||||
"K-MOOC로 부터 이 구성요소를 재생할 비디오 ID를 할당받았다면, 여기에 ID를 입력하세요. 이 경우, 기본 비디오 URL 혹은 "
|
||||
"K-MOOC로 부터 이 구성요소를 재생할 동영상 ID를 할당받았다면, 여기에 ID를 입력하세요. 이 경우, 기본 비디오 URL 혹은 "
|
||||
"비디오 파일 URL에 어떤 값도 입력하지 마십시오. 비디오 ID를 할당받지 않았다면, 다른 필드에 값을 입력하거나 이 필드를 무시해도 "
|
||||
"됩니다. "
|
||||
|
||||
@@ -4576,14 +4577,14 @@ msgid ""
|
||||
"A human-readable description of the example certificate. For example, "
|
||||
"'verified' or 'honor' to differentiate between two types of certificates."
|
||||
msgstr ""
|
||||
"예시 수료증에 대한 설명을 입력합니다. 예를 들어, '인증 수료증' 또는 '명예 수료증'으로 수료증의 두 종류를 구분하는 것이 있습니다."
|
||||
"예시 이수증에 대한 설명을 입력합니다. 예를 들어, '인증 수료증' 또는 '명예 수료증'으로 수료증의 두 종류를 구분하는 것이 있습니다."
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid ""
|
||||
"A unique identifier for the example certificate. This is used when we "
|
||||
"receive a response from the queue to determine which example certificate was"
|
||||
" processed."
|
||||
msgstr "수료증의 고유 식별자입니다. 이것은 큐에서 응답을 받을 때 어떤 수료증이 처리되었는지를 알아내기 위해 필요합니다. "
|
||||
msgstr "이수증의 고유 식별자입니다. 이것은 큐에서 응답을 받을 때 어떤 수료증이 처리되었는지를 알아내기 위해 필요합니다. "
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid ""
|
||||
@@ -4591,28 +4592,28 @@ msgid ""
|
||||
"response from the queue to validate that the sender is the same entity we "
|
||||
"asked to generate the certificate."
|
||||
msgstr ""
|
||||
"수료증 예시의 접근 키입니다. 이것은 큐에서 응답을 받을 때, 저희가 수료증 생성을 요청한 대상과 발신자가 같은지 인증하기 위해 "
|
||||
"이수증 예시의 접근 키입니다. 이것은 큐에서 응답을 받을 때, 저희가 이수증 생성을 요청한 대상과 발신자가 같은지 인증하기 위해 "
|
||||
"필요합니다."
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid "The full name that will appear on the certificate."
|
||||
msgstr "수료증에 표시될 이름"
|
||||
msgstr "이수증에 표시될 이름"
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid "The template file to use when generating the certificate."
|
||||
msgstr "수료증을 생성할 때 사용할 템플릿 파일"
|
||||
msgstr "이수증을 생성할 때 사용할 템플릿 파일"
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid "The status of the example certificate."
|
||||
msgstr "수료증 예시의 상태"
|
||||
msgstr "이수증 예시의 상태"
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid "The reason an error occurred during certificate generation."
|
||||
msgstr "수료증 생성 중 발생한 오류 원인"
|
||||
msgstr "이수증 생성 중 발생한 오류 원인"
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid "The download URL for the generated certificate."
|
||||
msgstr "생성된 수료증의 다운로드 URL"
|
||||
msgstr "생성된 이수증의 다운로드 URL"
|
||||
|
||||
#: lms/djangoapps/certificates/models.py
|
||||
msgid "The badge image must be square."
|
||||
@@ -4703,7 +4704,7 @@ msgid ""
|
||||
"agreed to abide by {platform_name}'s honor code and completed all of the "
|
||||
"required tasks for this course under its guidelines."
|
||||
msgstr ""
|
||||
"{cert_type}수료증은 {platform_name} 학습자가 {platform_name}의 명예 과정을 수강하면서 해당 강좌의 "
|
||||
"{cert_type}이수증은 {platform_name} 학습자가 {platform_name}의 명예 과정을 수강하면서 해당 강좌의 "
|
||||
"방침에 따라 과제를 모두 완료했음을 증명합니다. "
|
||||
|
||||
#. Translators: This text describes the 'ID Verified' course certificate
|
||||
@@ -4717,7 +4718,7 @@ msgid ""
|
||||
"required tasks for this course under its guidelines, as well as having their"
|
||||
" photo ID checked to verify their identity."
|
||||
msgstr ""
|
||||
"{cert_type}수료증은 {platform_name} 학습자가 {platform_name}의 명예 과정을 수강하면서 해당 강좌의 "
|
||||
"{cert_type}이수증은 {platform_name} 학습자가 {platform_name}의 명예 과정을 수강하면서 해당 강좌의 "
|
||||
"방침에 따라 과제를 모두 완료했으며, 사진을 통한 신분 확인 절차까지 거쳤음을 증명합니다. "
|
||||
|
||||
#. Translators: This text describes the 'XSeries' course certificate type.
|
||||
@@ -4728,7 +4729,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"An {cert_type} Certificate demonstrates a high level of achievement in a "
|
||||
"program of study, and includes verification of the student's identity."
|
||||
msgstr "{cert_type} 수료증은 학습자의 프로그램 성취도가 상위에 있음을 증명하며, 학습자의 신분 확인까지 포함합니다. "
|
||||
msgstr "{cert_type} 이수증은 학습자의 프로그램 성취도가 상위에 있음을 증명하며, 학습자의 신분 확인까지 포함합니다. "
|
||||
|
||||
#. Translators: The format of the date includes the full name of the month
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
@@ -4754,7 +4755,7 @@ msgstr "{platform_name} 성과 정보"
|
||||
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "More Information About {user_name}'s Certificate:"
|
||||
msgstr "{user_name}님의 수료증에 관한 추가 정보"
|
||||
msgstr "{user_name}님의 이수증에 관한 추가 정보"
|
||||
|
||||
#. Translators: This line appears on the page just before the generation date
|
||||
#. for the certificate
|
||||
@@ -4766,11 +4767,11 @@ msgstr "발행일:"
|
||||
#. each individual certificate
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "Certificate ID Number"
|
||||
msgstr "수료증 ID 번호"
|
||||
msgstr "이수증 ID 번호"
|
||||
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "About {platform_name} Certificates"
|
||||
msgstr "{platform_name} 수료증 정보"
|
||||
msgstr "{platform_name} 이수증 정보"
|
||||
|
||||
#. Translators: This text describes the purpose (and therefore, value) of a
|
||||
#. course certificate
|
||||
@@ -4784,13 +4785,13 @@ msgid ""
|
||||
"require completing additional steps, such as <a href='{verified_cert_url}'> "
|
||||
"verifying your identity</a>."
|
||||
msgstr ""
|
||||
"{platform_name}는 수료증을 통해 성과를 인정합니다. 수료증은 {platform_name} 학습자가 <a "
|
||||
"{platform_name}는 이수증을 통해 성과를 인정합니다. 수료증은 {platform_name} 학습자가 <a "
|
||||
"href='{tos_url}'>{platform_name} 명예 과정</a>의 다양한 학습 활동들을 수행하였을 때 주어집니다. 일부 "
|
||||
"수료증 발급을 위해서는 <a href='{verified_cert_url}'> 신분 확인 </a>과 같은 추가 절차가 요구되기도 합니다."
|
||||
"이수증 발급을 위해서는 <a href='{verified_cert_url}'> 신분 확인 </a>과 같은 추가 절차가 요구되기도 합니다."
|
||||
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "How {platform_name} Validates Student Certificates"
|
||||
msgstr "{platform_name} 수료증을 인증하는 방식 "
|
||||
msgstr "{platform_name} 이수증을 인증하는 방식 "
|
||||
|
||||
#. Translators: This text describes the validation mechanism for a
|
||||
#. certificate file (known as GPG security)
|
||||
@@ -4801,13 +4802,13 @@ msgid ""
|
||||
"key. For independent verification, {platform_name} uses what is called a "
|
||||
"\"detached signature\""\"."
|
||||
msgstr ""
|
||||
"{platform_name}이 발급한 수료증은 gpg key 기호를 가집니다. 이에 {platform_name}의 public key를 "
|
||||
"{platform_name}이 발급한 이수증은 gpg key 기호를 가집니다. 이에 {platform_name}의 public key를 "
|
||||
"가진 사람이라면 누구나에 의해 독립적으로 인증을 받을 수 있습니다. 독립 인증을 위해, {platform_name}은 \"분리된 "
|
||||
"서명\""\"이라 불리는 것을 사용합니다."
|
||||
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "Validate this certificate for yourself"
|
||||
msgstr "수료증을 스스로 인증합니다."
|
||||
msgstr "이수증을 스스로 인증합니다."
|
||||
|
||||
#. Translators: This text describes (at a high level) the mission and charter
|
||||
#. the edX platform and organization
|
||||
@@ -4871,14 +4872,14 @@ msgid ""
|
||||
"successfully completed, received a passing grade, and was awarded a "
|
||||
"{platform_name} {certificate_type} Certificate of Completion in "
|
||||
msgstr ""
|
||||
"강좌를 성공적으로 마쳤으며, 수료증 취득 기준 성적을 통과하였으므로 {platform_name} {certificate_type} "
|
||||
"수료증을 취득했습니다."
|
||||
"강좌를 성공적으로 마쳤으며, 이수증 취득 기준 성적을 통과하였으므로 {platform_name} {certificate_type} "
|
||||
"이수증을 취득했습니다."
|
||||
|
||||
#. Translators: This line is displayed to a user who has completed a course
|
||||
#. and achieved a certification
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "{fullname}, you've earned a certificate!"
|
||||
msgstr "{fullname}님은 수료증을 취득하셨습니다! "
|
||||
msgstr "{fullname}님은 이수증을 취득하셨습니다! "
|
||||
|
||||
#. Translators: This line congratulates the user and instructs them to share
|
||||
#. their accomplishment on social networks
|
||||
@@ -4907,7 +4908,7 @@ msgstr "모든 저작권이 보호됩니다."
|
||||
#. recognized
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "Invalid Certificate"
|
||||
msgstr "유효하지 않은 수료증"
|
||||
msgstr "유효하지 않은 이수증"
|
||||
|
||||
#. Translators: The & characters represent an ampersand character and can
|
||||
#. be ignored
|
||||
@@ -4919,7 +4920,7 @@ msgstr "서비스 및 명예 과정 약관"
|
||||
#. the purpose of the page
|
||||
#: lms/djangoapps/certificates/views/webview.py
|
||||
msgid "Certificate Validation"
|
||||
msgstr "수료증 확인"
|
||||
msgstr "이수증 확인"
|
||||
|
||||
#: lms/djangoapps/class_dashboard/dashboard_data.py
|
||||
#: lms/djangoapps/instructor/views/api.py
|
||||
@@ -5089,7 +5090,7 @@ msgstr "강좌 내용"
|
||||
#: lms/djangoapps/courseware/tabs.py
|
||||
#: lms/djangoapps/instructor/views/instructor_dashboard.py
|
||||
msgid "Course Info"
|
||||
msgstr "공지사항"
|
||||
msgstr "강좌 정보"
|
||||
|
||||
#: lms/djangoapps/courseware/tabs.py lms/templates/courseware/syllabus.html
|
||||
msgid "Syllabus"
|
||||
@@ -5139,7 +5140,7 @@ msgstr "{username} 학습자는 {location} 문제에 접근하지 않았습니
|
||||
|
||||
#: lms/djangoapps/courseware/views.py
|
||||
msgid "You must be signed in to {platform_name} to create a certificate."
|
||||
msgstr "수료증을 생성하기 위해 {platform_name}에 로그인해야 합니다. "
|
||||
msgstr "이수증을 생성하기 위해 {platform_name}에 로그인해야 합니다. "
|
||||
|
||||
#: lms/djangoapps/courseware/views.py
|
||||
msgid "Course is not valid"
|
||||
@@ -5147,15 +5148,15 @@ msgstr "강좌가 유효하지 않습니다."
|
||||
|
||||
#: lms/djangoapps/courseware/views.py
|
||||
msgid "Your certificate will be available when you pass the course."
|
||||
msgstr "강좌 이수를 완료하면 수료증을 받을 수 있습니다. "
|
||||
msgstr "강좌 이수를 완료하면 이수증을 받을 수 있습니다. "
|
||||
|
||||
#: lms/djangoapps/courseware/views.py
|
||||
msgid "Certificate has already been created."
|
||||
msgstr "수료증이 이미 만들어졌습니다. "
|
||||
msgstr "이수증이 이미 만들어졌습니다. "
|
||||
|
||||
#: lms/djangoapps/courseware/views.py
|
||||
msgid "Certificate is being created."
|
||||
msgstr "수료증이 만들어지고 있습니다. "
|
||||
msgstr "이수증이 만들어지고 있습니다. "
|
||||
|
||||
#: lms/djangoapps/dashboard/git_import.py
|
||||
msgid ""
|
||||
@@ -5249,7 +5250,7 @@ msgstr "실패했습니다. {email_addr} 이메일은 이미 {external_id}로
|
||||
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid "Password must be supplied if not using certificates"
|
||||
msgstr "수료증을 이용하지 않을 경우 비밀번호가 필요합니다."
|
||||
msgstr "이수증을 이용하지 않을 경우 비밀번호가 필요합니다."
|
||||
|
||||
#: lms/djangoapps/dashboard/sysadmin.py
|
||||
msgid "email address required (not username)"
|
||||
@@ -5884,7 +5885,7 @@ msgid ""
|
||||
"started. You can view the status of the generation task in the \"Pending "
|
||||
"Tasks\" section."
|
||||
msgstr ""
|
||||
"이 강좌를 수강하는 모든 학습자의 수료증 생성 작업이 시작되었습니다. 생성 작업의 상태를 \"대기중인 작업\" 에서 볼 수 있습니다."
|
||||
"이 강좌를 수강하는 모든 학습자의 이수증 생성 작업이 시작되었습니다. 생성 작업의 상태를 \"대기중인 작업\" 에서 볼 수 있습니다."
|
||||
|
||||
#: lms/djangoapps/instructor/views/coupons.py
|
||||
msgid "coupon id is None"
|
||||
@@ -5960,7 +5961,7 @@ msgstr ""
|
||||
#: lms/djangoapps/support/views/index.py cms/templates/certificates.html
|
||||
#: cms/templates/export.html cms/templates/widgets/header.html
|
||||
msgid "Certificates"
|
||||
msgstr "수료증"
|
||||
msgstr "이수증"
|
||||
|
||||
#: lms/djangoapps/instructor/views/instructor_dashboard.py
|
||||
msgid "Please Enter the numeric value for the course price"
|
||||
@@ -6264,7 +6265,7 @@ msgstr "수강신청 보고서 생성 중"
|
||||
#. messages as {action}.
|
||||
#: lms/djangoapps/instructor_task/tasks.py
|
||||
msgid "certificates generated"
|
||||
msgstr "생성된 수료증"
|
||||
msgstr "생성된 이수증"
|
||||
|
||||
#. Translators: This is a past-tense verb that is inserted into task progress
|
||||
#. messages as {action}.
|
||||
@@ -6929,7 +6930,7 @@ msgstr "대학"
|
||||
|
||||
#: lms/djangoapps/shoppingcart/reports.py
|
||||
msgid "Course Announce Date"
|
||||
msgstr "강좌 개설 공지일"
|
||||
msgstr "대략적인 개강 시기"
|
||||
|
||||
#: lms/djangoapps/shoppingcart/reports.py cms/templates/settings.html
|
||||
#: lms/templates/instructor/instructor_dashboard_2/executive_summary.html
|
||||
@@ -7807,6 +7808,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr "제공된 주제 ID {topic_id}가 유효하지 않습니다."
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
@@ -7921,7 +7926,7 @@ msgstr "선택된 가격이 유효한 숫자가 아닙니다."
|
||||
|
||||
#: lms/djangoapps/verify_student/views.py
|
||||
msgid "This course doesn't support paid certificates"
|
||||
msgstr "본 강좌는 유료 수료증을 지원하지 않습니다."
|
||||
msgstr "본 강좌는 유료 이수증을 지원하지 않습니다."
|
||||
|
||||
#: lms/djangoapps/verify_student/views.py
|
||||
msgid "No selected price or selected price is below minimum."
|
||||
@@ -8267,7 +8272,7 @@ msgstr "요구 비용:"
|
||||
|
||||
#: lms/templates/support/refund.html
|
||||
msgid "CertificateItem Status:"
|
||||
msgstr "수료증 상태:"
|
||||
msgstr "이수증 상태:"
|
||||
|
||||
#: lms/templates/support/refund.html
|
||||
msgid "Order Status:"
|
||||
@@ -8864,7 +8869,7 @@ msgstr ""
|
||||
#. below a field meant to hold the user's full name.
|
||||
#: openedx/core/djangoapps/user_api/views.py lms/templates/register.html
|
||||
msgid "Needed for any certificates you may earn"
|
||||
msgstr "앞으로 받게 될 수료증에 필요합니다."
|
||||
msgstr "앞으로 받게 될 이수증에 필요합니다."
|
||||
|
||||
#. Translators: This label appears above a field on the registration form
|
||||
#. meant to hold the user's public username.
|
||||
@@ -9617,11 +9622,11 @@ msgstr "{b_start}공식:{b_end} 기관의 로고와 교수자의 서명이 담
|
||||
msgid ""
|
||||
"{b_start}Easily shareable:{b_end} Add the certificate to your CV or resume, "
|
||||
"or post it directly on LinkedIn"
|
||||
msgstr "{b_start}공유 용이:{b_end} 이력서에 강좌 수료증을 추가하거나 LinkedIn에 바로 게시하세요."
|
||||
msgstr "{b_start}공유 용이:{b_end} 이력서에 강좌 이수증을 추가하거나 LinkedIn에 바로 게시하세요."
|
||||
|
||||
#: common/templates/course_modes/choose.html
|
||||
msgid "Pursue a Verified Certificate"
|
||||
msgstr "인증된 강좌 수료증을 받으세요."
|
||||
msgstr "인증된 강좌 이수증을 받으세요."
|
||||
|
||||
#: common/templates/course_modes/choose.html
|
||||
msgid ""
|
||||
@@ -9629,20 +9634,20 @@ msgid ""
|
||||
"this valuable credential to improve your job prospects and advance your "
|
||||
"career, or highlight your certificate in school applications."
|
||||
msgstr ""
|
||||
"인증된 강좌 수료증으로 당신의 새로운 지식과 기술을 돋보이게 하세요. 보다 나은 직업을 갖도록 하는데 가치있는 증명서로 활용하세요. 또한"
|
||||
" 학교 입학 지원서에 강좌 수료증을 강조해 보세요."
|
||||
"인증된 강좌 이수증으로 당신의 새로운 지식과 기술을 돋보이게 하세요. 보다 나은 직업을 갖도록 하는데 가치있는 증명서로 활용하세요. 또한"
|
||||
" 학교 입학 지원서에 강좌 이수증을 강조해 보세요."
|
||||
|
||||
#: common/templates/course_modes/choose.html
|
||||
msgid ""
|
||||
"{b_start}Official: {b_end}Receive an instructor-signed certificate with the "
|
||||
"institution's logo"
|
||||
msgstr "{b_start}공식:{b_end} 기관의 로고와 교수자의 서명이 담긴 강좌 수료증을 받으세오."
|
||||
msgstr "{b_start}공식:{b_end} 기관의 로고와 교수자의 서명이 담긴 강좌 이수증을 받으세오."
|
||||
|
||||
#: common/templates/course_modes/choose.html
|
||||
msgid ""
|
||||
"{b_start}Easily shareable: {b_end}Add the certificate to your CV or resume, "
|
||||
"or post it directly on LinkedIn"
|
||||
msgstr "{b_start}공유 용이:{b_end} 이력서에 강좌 수료증을 추가하거나 LinkedIn에 바로 게시하세요."
|
||||
msgstr "{b_start}공유 용이:{b_end} 이력서에 강좌 이수증을 추가하거나 LinkedIn에 바로 게시하세요."
|
||||
|
||||
#: common/templates/course_modes/choose.html
|
||||
msgid ""
|
||||
@@ -9710,7 +9715,7 @@ msgstr "수강중인 강좌 "
|
||||
|
||||
#: lms/templates/dashboard.html
|
||||
msgid "Looks like you haven't enrolled in any courses yet."
|
||||
msgstr "아직 수강하는 강의가 없군요!"
|
||||
msgstr "아직 수강하는 강좌가 없군요."
|
||||
|
||||
#: lms/templates/dashboard.html
|
||||
msgid "Find courses now!"
|
||||
@@ -9756,7 +9761,7 @@ msgstr "설정 저장"
|
||||
#: lms/templates/dashboard/_dashboard_course_listing.html
|
||||
#: lms/templates/instructor/instructor_dashboard_2/membership.html
|
||||
msgid "Unenroll"
|
||||
msgstr "수강 취소"
|
||||
msgstr "등록 취소"
|
||||
|
||||
#: lms/templates/edit_unit_link.html
|
||||
msgid "View Unit in Studio"
|
||||
@@ -10640,7 +10645,7 @@ msgstr "예: 당신의 이름(포럼에 표시된)"
|
||||
|
||||
#: lms/templates/signup_modal.html
|
||||
msgid "e.g. Your Name (for certificates)"
|
||||
msgstr "예: 당신의 이름(수료증용)"
|
||||
msgstr "예: 당신의 이름(이수증용)"
|
||||
|
||||
#: lms/templates/signup_modal.html
|
||||
msgid "<i>Welcome</i> {name}"
|
||||
@@ -10842,7 +10847,7 @@ msgstr "운영팀/교수자 목록 다운로드(CSV파일)"
|
||||
|
||||
#: lms/templates/sysadmin_dashboard.html
|
||||
msgid "Administer Courses"
|
||||
msgstr "관리자 강의"
|
||||
msgstr "관리자 강좌"
|
||||
|
||||
#. Translators: Repo is short for git repository or source of
|
||||
#. courseware; see http://git-scm.com/about
|
||||
@@ -10860,7 +10865,7 @@ msgstr "분기 저장소 (선택)"
|
||||
#. Translators: Github is a popular website for hosting code
|
||||
#: lms/templates/sysadmin_dashboard.html
|
||||
msgid "Load new course from github"
|
||||
msgstr "github로부터 새 강의 올림"
|
||||
msgstr "github로부터 새 강좌 올림"
|
||||
|
||||
#. Translators: 'dir' is short for 'directory'
|
||||
#: lms/templates/sysadmin_dashboard.html
|
||||
@@ -10939,7 +10944,7 @@ msgstr "소스"
|
||||
|
||||
#: lms/templates/tracking_log.html
|
||||
msgid "type"
|
||||
msgstr "유형"
|
||||
msgstr "종류"
|
||||
|
||||
#: lms/templates/unsubscribe.html
|
||||
msgid "Unsubscribe Successful!"
|
||||
@@ -10984,7 +10989,7 @@ msgstr ""
|
||||
|
||||
#: lms/templates/video.html
|
||||
msgid "Skip to a navigable version of this video's transcript."
|
||||
msgstr "비디오자막 "
|
||||
msgstr "동영상 자막의 조작이 가능한 버전으로 이동"
|
||||
|
||||
#: lms/templates/video.html
|
||||
msgid "Loading video player"
|
||||
@@ -10996,7 +11001,7 @@ msgstr "동영상 플레이"
|
||||
|
||||
#: lms/templates/video.html
|
||||
msgid "No playable video sources found."
|
||||
msgstr "재생 가능한 비디오 소스가 없습니다!"
|
||||
msgstr "재생 가능한 동영상 소스가 없습니다."
|
||||
|
||||
#: lms/templates/video.html
|
||||
msgid "Skip to end of transcript."
|
||||
@@ -11008,7 +11013,7 @@ msgstr "자막 처음으로 돌아 가세요."
|
||||
|
||||
#: lms/templates/video.html
|
||||
msgid "Download video"
|
||||
msgstr "비디오 다운로드"
|
||||
msgstr "동영상 다운로드"
|
||||
|
||||
#: lms/templates/video.html
|
||||
msgid "Download transcript"
|
||||
@@ -11016,7 +11021,7 @@ msgstr "자막 다운로드"
|
||||
|
||||
#: lms/templates/video.html
|
||||
msgid "Download Handout"
|
||||
msgstr "프린트물 다운로드"
|
||||
msgstr "학습 자료 다운로드"
|
||||
|
||||
#: lms/templates/word_cloud.html
|
||||
msgid "Your words:"
|
||||
@@ -11389,7 +11394,7 @@ msgstr "학습자 성적 다운로드"
|
||||
|
||||
#: lms/templates/certificates/_accomplishment-banner.html
|
||||
msgid "Print or share your certificate:"
|
||||
msgstr "강좌 수료증을 인쇄하거나 공유하기"
|
||||
msgstr "강좌 이수증을 인쇄하거나 공유하기"
|
||||
|
||||
#: lms/templates/certificates/_accomplishment-banner.html
|
||||
msgid "I completed the {course_title} course on {platform_name}."
|
||||
@@ -11398,11 +11403,11 @@ msgstr "{platform_name}에서 제공하는 {course_title} 강좌를 완료했습
|
||||
#: lms/templates/certificates/_accomplishment-banner.html
|
||||
msgid ""
|
||||
"I completed a course on {platform_name}. Take a look at my certificate."
|
||||
msgstr "{platform_name}의 한 강좌를 완료 했습니다. 제 강좌 수료증을 살펴보세요."
|
||||
msgstr "{platform_name}의 한 강좌를 완료 했습니다. 제 강좌 이수증을 살펴보세요."
|
||||
|
||||
#: lms/templates/certificates/_accomplishment-banner.html
|
||||
msgid "Click the link to see my certificate."
|
||||
msgstr "저의 강좌 수료증을 보기 위해 링크를 클릭해주세요."
|
||||
msgstr "저의 강좌 이수증을 보기 위해 링크를 클릭해 주세요."
|
||||
|
||||
#: lms/templates/certificates/_accomplishment-banner.html
|
||||
msgid "Post on Facebook"
|
||||
@@ -11427,7 +11432,7 @@ msgstr "Mozilla Backpack에 추가하기"
|
||||
|
||||
#: lms/templates/certificates/_accomplishment-banner.html
|
||||
msgid "Print Certificate"
|
||||
msgstr "강좌 수료증 인쇄하기"
|
||||
msgstr "강좌 이수증 인쇄하기"
|
||||
|
||||
#: lms/templates/certificates/_accomplishment-header.html
|
||||
msgid "{platform_name} Home"
|
||||
@@ -11443,32 +11448,32 @@ msgstr "다음 기관에서 제공하는"
|
||||
|
||||
#: lms/templates/certificates/invalid.html
|
||||
msgid "This is an invalid certificate number"
|
||||
msgstr "유효하지 않은 수료증 번호입니다. "
|
||||
msgstr "유효하지 않은 이수증 번호입니다. "
|
||||
|
||||
#: lms/templates/certificates/invalid.html
|
||||
msgid "This Certificate Does Not Exist"
|
||||
msgstr "강좌 수료증이 존재하지 않습니다."
|
||||
msgstr "강좌 이수증이 존재하지 않습니다."
|
||||
|
||||
#: lms/templates/certificates/invalid.html
|
||||
msgid ""
|
||||
"We cannot find a certificate on file that matches this URL or ID number."
|
||||
msgstr "URL 혹은 ID번호와 일치하는 수료증을 찾을 수 없습니다."
|
||||
msgstr "URL 혹은 ID번호와 일치하는 이수증을 찾을 수 없습니다."
|
||||
|
||||
#: lms/templates/certificates/invalid.html
|
||||
msgid "Looking for a Particular Certificate?"
|
||||
msgstr "특정 강좌 수료증을 찾고 있습니까?"
|
||||
msgstr "특정 강좌 이수증을 찾고 있습니까?"
|
||||
|
||||
#: lms/templates/certificates/invalid.html
|
||||
msgid ""
|
||||
"Ensure that the ID number is an exact match of the ID number on the PDF or "
|
||||
"print certificate you are referencing."
|
||||
msgstr "ID 번호가 PDF나 출력한 강좌 수료증의 ID 번호와 정확히 일치 하는지 확인하세요."
|
||||
msgstr "ID 번호가 PDF나 출력한 강좌 이수증의 ID 번호와 정확히 일치 하는지 확인하세요."
|
||||
|
||||
#: lms/templates/certificates/invalid.html
|
||||
msgid ""
|
||||
"If you are trying to validate a certificate with this ID number, it may be a"
|
||||
" forgery."
|
||||
msgstr "ID 번호를 포함한 강좌 수료증이 유효한지 확인한다면 위조입니다. "
|
||||
msgstr "ID 번호를 포함한 강좌 이수증이 유효한지 확인한다면 위조입니다. "
|
||||
|
||||
#: lms/templates/chat/toggle_chat.html
|
||||
msgid "Open Chat"
|
||||
@@ -11924,7 +11929,7 @@ msgstr "공지사항"
|
||||
|
||||
#: lms/templates/courseware/info.html
|
||||
msgid "Handout Navigation"
|
||||
msgstr "유인물 찾아가기"
|
||||
msgstr "학습 자료 찾기"
|
||||
|
||||
#: lms/templates/courseware/info.html
|
||||
msgid "Course Handouts"
|
||||
@@ -11990,7 +11995,7 @@ msgid ""
|
||||
"have disabled those features for courses with more than {max_enrollment} "
|
||||
"students."
|
||||
msgstr ""
|
||||
"이러한 버튼의 일부는 더 큰 강의에서는 작동하지 않습니다. {max_enrollment} 명 이상이 수강하는 강의에서는 이 기능들을 "
|
||||
"이러한 버튼의 일부는 더 큰 강좌에서는 작동하지 않습니다. {max_enrollment} 명 이상이 수강하는 강좌에서는 이 기능들을 "
|
||||
"이용할 수 없습니다. "
|
||||
|
||||
#: lms/templates/courseware/legacy_instructor_dashboard.html
|
||||
@@ -12005,7 +12010,7 @@ msgid ""
|
||||
"enrolled students), visit the Student Admin section of the Instructor "
|
||||
"Dashboard."
|
||||
msgstr ""
|
||||
"성적기록부를 보려면, 교수자 대시보드의 학습자 관리 섹션을 방문하세요. (성적기록부는 수강신청한 학습자가 적은 강의에서만 "
|
||||
"성적기록부를 보려면, 교수자 대시보드의 학습자 관리 섹션을 방문하세요. (성적기록부는 수강신청한 학습자가 적은 강좌에서만 "
|
||||
"이용가능합니다.)"
|
||||
|
||||
#: lms/templates/courseware/legacy_instructor_dashboard.html
|
||||
@@ -12186,20 +12191,20 @@ msgstr "'{username}' ({email})의 학습 진행 상황"
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "Your certificate is available"
|
||||
msgstr "강좌 수료증이 준비되었습니다."
|
||||
msgstr "강좌 이수증이 준비되었습니다."
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid ""
|
||||
"You can keep working for a higher grade, or request your certificate now."
|
||||
msgstr "더 높은 성적을 받기 위해 계속 하거나, 지금 수료증을 신청할 수도 있습니다. "
|
||||
msgstr "더 높은 성적을 받기 위해 계속 하거나, 지금 이수증을 신청할 수도 있습니다. "
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "View certificate in a new browser window or tab."
|
||||
msgstr "새 브라우저 창/탭에서 강좌 수료증이 열립니다."
|
||||
msgstr "새 브라우저 창/탭에서 강좌 이수증이 열립니다."
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "View Certificate"
|
||||
msgstr "강좌 수료증 보기"
|
||||
msgstr "강좌 이수증 보기"
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "PDF will open in a new browser window or tab."
|
||||
@@ -12207,7 +12212,7 @@ msgstr "PDF는 새로운 브라우져 창 혹은 탭에 열릴 것입니다."
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "Download Your Certificate"
|
||||
msgstr "강좌 수료증 다운로드하기"
|
||||
msgstr "강좌 이수증 다운로드하기"
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "We're working on it..."
|
||||
@@ -12218,16 +12223,16 @@ msgid ""
|
||||
"We're creating your certificate. You can keep working in your courses and a "
|
||||
"link to it will appear here and on your Dashboard when it is ready."
|
||||
msgstr ""
|
||||
"강좌 수료증을 생성하고 있습니다. 강좌를 계속 학습할 수 있으며, 수료증 생성이 완료되면 대시보드의 지금 이 영역에서 링크가 나타날 "
|
||||
"강좌 이수증을 생성하고 있습니다. 강좌를 계속 학습할 수 있으며, 이수증 생성이 완료되면 대시보드의 지금 이 영역에서 링크가 나타날 "
|
||||
"것입니다. "
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "Congratulations, you qualified for a certificate!"
|
||||
msgstr "축하합니다. 당신은 강좌 수료증을 받기 위한 조건을 모두 충족하였습니다. "
|
||||
msgstr "축하합니다. 당신은 강좌 이수증을 받기 위한 조건을 모두 충족하였습니다. "
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "Request Certificate"
|
||||
msgstr "강좌 수료증 신청하기"
|
||||
msgstr "강좌 이수증 신청하기"
|
||||
|
||||
#: lms/templates/courseware/progress.html
|
||||
msgid "Requirements for Course Credit"
|
||||
@@ -12393,7 +12398,7 @@ msgstr "{cert_name_short}이 만들어지고 있습니다."
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_certificate_information.html
|
||||
msgid "This link will open the certificate web view"
|
||||
msgstr "링크는 강좌 수료증을 웹으로 보게 될것입니다."
|
||||
msgstr "링크는 강좌 이수증을 웹으로 보게 될것입니다."
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_certificate_information.html
|
||||
msgid "View {cert_name_short}"
|
||||
@@ -12427,7 +12432,7 @@ msgstr "강좌 피드백 조사를 완료하세요."
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_certificate_information.html
|
||||
msgid "Add Certificate to LinkedIn Profile"
|
||||
msgstr "LinkedIn 프로필에 강좌 수료증 추가하기"
|
||||
msgstr "LinkedIn 프로필에 강좌 이수증 추가하기"
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_certificate_information.html
|
||||
msgid "Share on LinkedIn"
|
||||
@@ -12440,7 +12445,7 @@ msgid ""
|
||||
"{cert_name_short}. An honor code {cert_name_short} has been granted instead."
|
||||
msgstr ""
|
||||
"{cert_name_long} 발급 과정에서 귀하의 유효한 인증 사진을 받지 못했기 때문에, {cert_name_short}인증 "
|
||||
"수료증을 수여할 수 없습니다. 대신 {cert_name_short}명예 수료증 발급은 가능합니다. "
|
||||
"이수증을 수여할 수 없습니다. 대신 {cert_name_short}명예 수료증 발급은 가능합니다. "
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_course_listing.html
|
||||
msgid "{course_number} {course_name} Home Page"
|
||||
@@ -12472,7 +12477,7 @@ msgstr "개강 - {start_date}"
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_course_listing.html
|
||||
msgid "View Archived Course"
|
||||
msgstr "저장된 강좌 보기"
|
||||
msgstr "완료된 강좌 보기"
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_course_listing.html
|
||||
#: lms/templates/shoppingcart/registration_code_receipt.html
|
||||
@@ -12716,7 +12721,7 @@ msgstr "인증 다시 제출하기"
|
||||
msgid ""
|
||||
"To receive a verified certificate, you have to submit a new photo of "
|
||||
"yourself and your government-issued photo ID before the course ends."
|
||||
msgstr "인증된 강좌 수료증을 받기 위해서, 강좌가 끝나기 전에 새로운 사진과 정부가 발행한 사진이 있는 신분증을 제출해야 합니다. "
|
||||
msgstr "인증된 강좌 이수증을 받기 위해서, 강좌가 끝나기 전에 새로운 사진과 정부가 발행한 사진이 있는 신분증을 제출해야 합니다. "
|
||||
|
||||
#: lms/templates/dashboard/_dashboard_third_party_error.html
|
||||
msgid "Could Not Link Accounts"
|
||||
@@ -13494,7 +13499,7 @@ msgid ""
|
||||
"All purchases are final. For more information, see the {site_name} "
|
||||
"cancellation policy."
|
||||
msgstr ""
|
||||
"납입처리가 되지 않으면, 이 코드를 사용한 학습자 등록이 취소되며 학습자는 강의 자료를 이용할 수 없을 것입니다. 더 많은 정보를 "
|
||||
"납입처리가 되지 않으면, 이 코드를 사용한 학습자 등록이 취소되며 학습자는 강좌 자료를 이용할 수 없을 것입니다. 더 많은 정보를 "
|
||||
"알아보고 싶으시면, {site_name} 취소 정책을 살펴보세요. "
|
||||
|
||||
#: lms/templates/emails/registration_codes_sale_invoice_attachment.txt
|
||||
@@ -13730,27 +13735,27 @@ msgstr "만기일 추가"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Example Certificates"
|
||||
msgstr "예비 수료증"
|
||||
msgstr "예비 이수증"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Generate example certificates for the course."
|
||||
msgstr "강좌 예비 수료증 생성하기"
|
||||
msgstr "강좌 예비 이수증 생성하기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Generate Example Certificates"
|
||||
msgstr "예비 수료증 생성하기"
|
||||
msgstr "예비 이수증 생성하기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Generating example {name} certificate"
|
||||
msgstr "{name} 의 예비 수료증 생성하기"
|
||||
msgstr "{name} 의 예비 이수증 생성하기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Error generating example {name} certificate: {error}"
|
||||
msgstr "{name}의 예비 수료증 생성시 오류 발생: {error}"
|
||||
msgstr "{name}의 예비 이수증 생성시 오류 발생: {error}"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "View {name} certificate"
|
||||
msgstr "{name}의 수료증 보기"
|
||||
msgstr "{name}의 이수증 보기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Refresh Status"
|
||||
@@ -13758,25 +13763,25 @@ msgstr "다시 불러오기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Student-Generated Certificates"
|
||||
msgstr "학습자 생성 수료증"
|
||||
msgstr "학습자 생성 이수증"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Disable Student-Generated Certificates"
|
||||
msgstr "학습자 생성 수료증 비활성화하기"
|
||||
msgstr "학습자 생성 이수증 비활성화하기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Enable Student-Generated Certificates"
|
||||
msgstr "학습자 생성 수료증 활성화하기"
|
||||
msgstr "학습자 생성 이수증 활성화하기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid ""
|
||||
"You must successfully generate example certificates before you enable "
|
||||
"student-generated certificates."
|
||||
msgstr "학습자 생성 수료증을 활성화하기 전에 반드시 예비 수료증을 성공적으로 생성해야 합니다."
|
||||
msgstr "학습자 생성 이수증을 활성화하기 전에 반드시 예비 이수증을 성공적으로 생성해야 합니다."
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
msgid "Generate Certificates"
|
||||
msgstr "수료증 생성하기"
|
||||
msgstr "이수증 생성하기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/certificates.html
|
||||
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
|
||||
@@ -14122,7 +14127,7 @@ msgstr "강좌의 요약이 포함된 HTML 파일 생성하기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/e-commerce.html
|
||||
msgid "Create Executive Summary"
|
||||
msgstr "강좌의 요약 생성하기"
|
||||
msgstr "강좌 소개 만들기"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/e-commerce.html
|
||||
msgid "Available Reports"
|
||||
@@ -15067,7 +15072,7 @@ msgstr "사전 평가 조정"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
|
||||
msgid "Student's {platform_name} email address or username:"
|
||||
msgstr "학습자의 {platform_name} 이메일 주소 혹은 사용자명:"
|
||||
msgstr "학습자의 {platform_name} 이메일 주소 혹은 아이디"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
|
||||
msgid ""
|
||||
@@ -15077,7 +15082,7 @@ msgstr "학습자 사전 평가와 관련해서 선택해 주세요. 선택 결
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
|
||||
msgid "Reset Number of Student Attempts"
|
||||
msgstr "학습자 재시도 횟수 초기화"
|
||||
msgstr "학습자 응시 횟수 초기화"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
|
||||
msgid "Rescore All Problems"
|
||||
@@ -15095,11 +15100,11 @@ msgstr "모든 학습자의 정답과 전체 사전 평가 점수 또한 삭제
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
|
||||
msgid "Delete Student's Answers and Scores"
|
||||
msgstr "학습자의 답과 점수 삭제"
|
||||
msgstr "학습자의 답안과 점수 삭제"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
|
||||
msgid "Show Student's Exam Adjustment History"
|
||||
msgstr "학습자의 시험 조정 이력 살펴보기"
|
||||
msgstr "사전 평가 조정 기록 "
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/student_admin.html
|
||||
msgid "Then select an action"
|
||||
@@ -15388,7 +15393,7 @@ msgid ""
|
||||
"account activation message to {email}. To activate your account and start "
|
||||
"enrolling in courses, click the link in the message."
|
||||
msgstr ""
|
||||
"{platform_name}에 계정을 만들었습니다. {email}로 활성화 메일을 보냈으니, 강의에 등록하고 싶다면 메일에 링크를 "
|
||||
"{platform_name}에 계정을 만들었습니다. {email}로 활성화 메일을 보냈으니, 강좌에 등록하고 싶다면 메일에 링크를 "
|
||||
"클릭해주세요."
|
||||
|
||||
#: lms/templates/registration/activation_complete.html
|
||||
@@ -15716,7 +15721,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"You have successfully enrolled in {course_name}. This course has now been "
|
||||
"added to your dashboard."
|
||||
msgstr "{course_name}에 등록되었습니다. dashboard에 강의가 추가되었습니다."
|
||||
msgstr "{course_name}에 등록되었습니다. 교수자 대시보드에 강좌가 추가되었습니다."
|
||||
|
||||
#: lms/templates/shoppingcart/registration_code_receipt.html
|
||||
#: lms/templates/shoppingcart/registration_code_redemption.html
|
||||
@@ -16020,7 +16025,7 @@ msgid ""
|
||||
"If you have any questions about this course or this form, you can contact <a"
|
||||
" href=\"{mail_to_link}\"\">{mail_to_link}</a>."
|
||||
msgstr ""
|
||||
"이 강의나 형식에 대해 질문이 있다면 <a href=\"{mail_to_link}\"\">{mail_to_link}</a>로 "
|
||||
"이 강좌나 형식에 대해 질문이 있다면 <a href=\"{mail_to_link}\"\">{mail_to_link}</a>로 "
|
||||
"연락해주세요."
|
||||
|
||||
#: lms/templates/verify_student/face_upload.html
|
||||
@@ -16053,7 +16058,7 @@ msgstr "{course_name}의 인증 마감일은 {date}까지였습니다. 인증을
|
||||
msgid ""
|
||||
"The deadline to upgrade to a verified certificate for this course has "
|
||||
"passed. You can still earn an honor code certificate."
|
||||
msgstr "인증 수료증으로 업그레이드할 수 있는 날짜가 지났습니다. 명예 수료증은 지금 발급 가능합니다. "
|
||||
msgstr "인증 이수증으로 업그레이드할 수 있는 날짜가 지났습니다. 명예 이수증은 지금 발급 가능합니다. "
|
||||
|
||||
#: lms/templates/verify_student/pay_and_verify.html
|
||||
msgid "Upgrade Your Enrollment For {course_name}."
|
||||
@@ -16196,7 +16201,7 @@ msgstr "계정 활성화가 완료되었습니다."
|
||||
msgid ""
|
||||
"Thank you for activating your account. You may now sign in and start using "
|
||||
"{studio_name} to author courses."
|
||||
msgstr "계정 활성화에 감사합니다. 로그인 후 {studio_name}를 사용해서 강의를 만들어 보세요!"
|
||||
msgstr "계정 활성화에 감사합니다. 로그인 후 {studio_name}를 사용해서 강좌를 만들어 보세요!"
|
||||
|
||||
#: cms/templates/activation_invalid.html
|
||||
msgid "Your account activation is invalid"
|
||||
@@ -16615,7 +16620,7 @@ msgstr "예: CS101"
|
||||
msgid ""
|
||||
"The unique number that identifies the new course within the organization. "
|
||||
"(This number is often the same as the original course number.)"
|
||||
msgstr "기관 안에서 새로운 강의를 식별하는 고유 번호입니다. (이 숫자들은 강의 원래 번호와 동일합니다.)"
|
||||
msgstr "기관 안에서 새로운 강좌를 식별하는 고유 번호입니다. (이 숫자들은 강의 원래 번호와 동일합니다.)"
|
||||
|
||||
#: cms/templates/course-create-rerun.html cms/templates/index.html
|
||||
#: cms/templates/settings.html
|
||||
@@ -16637,7 +16642,7 @@ msgstr "신규 강좌가 운영될 기간입니다. (보통 이 값은 원래의
|
||||
|
||||
#: cms/templates/course-create-rerun.html
|
||||
msgid "Create Re-run"
|
||||
msgstr "Re-run 만들기"
|
||||
msgstr "강좌 재개강하기"
|
||||
|
||||
#: cms/templates/course-create-rerun.html
|
||||
msgid "When will my course re-run start?"
|
||||
@@ -16672,7 +16677,7 @@ msgstr "귀하는 강좌 운영팀의 유일한 구성원입니다. 수강신청
|
||||
|
||||
#: cms/templates/course-create-rerun.html
|
||||
msgid "Learn more about Course Re-runs"
|
||||
msgstr "강의를 다시 실행에 대해 자세히 알아보기"
|
||||
msgstr "강좌 재재강에 대해 자세히 알아보기"
|
||||
|
||||
#: cms/templates/course_info.html
|
||||
msgid "Course Updates"
|
||||
@@ -16696,7 +16701,7 @@ msgstr "강좌 개요"
|
||||
#: cms/templates/course_outline.html
|
||||
msgid ""
|
||||
"This course was created as a re-run. Some manual configuration is needed."
|
||||
msgstr "강좌가 재운영으로 생성되어졌습니다. 일부 직접설정이 필요합니다."
|
||||
msgstr "재개강된 강좌입니다. 일부 사항은 다시 설정해야 합니다."
|
||||
|
||||
#: cms/templates/course_outline.html
|
||||
msgid ""
|
||||
@@ -17027,7 +17032,7 @@ msgid ""
|
||||
"information."
|
||||
msgstr ""
|
||||
"{em_start}주의:{em_end} : MATLAB의 API 키 LTI passports, 주석 비밀 토큰 문자열 및 주석 스토리지 "
|
||||
"URL은 강의 정보를 내보내는 데이터에 포함되어 있습니다. 내보내기 파일을 공유하는 경우는 강의 내보내기에 관한 기밀 또는 라이센스 고유"
|
||||
"URL은 강좌 정보를 내보내는 데이터에 포함되어 있습니다. 내보내기 파일을 공유하는 경우는 강의 내보내기에 관한 기밀 또는 라이센스 고유"
|
||||
" information.Learn 이상을 공유 할 수 있습니다."
|
||||
|
||||
#: cms/templates/export.html
|
||||
@@ -17164,7 +17169,7 @@ msgstr ""
|
||||
|
||||
#: cms/templates/export.html
|
||||
msgid "Learn more about exporting a course"
|
||||
msgstr "강의 내보내기에 대해 자세히 알아보기"
|
||||
msgstr "강좌 내보내기에 대해 자세히 알아보기"
|
||||
|
||||
#: cms/templates/export_git.html
|
||||
msgid "Export Course to Git"
|
||||
@@ -17475,7 +17480,7 @@ msgstr "강의 그 이상입니다."
|
||||
msgid ""
|
||||
"Quickly create videos, text snippets, inline discussions, and a variety of "
|
||||
"problem types."
|
||||
msgstr "빠르게 비디오, 텍스트 구절, 인라인 토의 및 여러 유형의 질문을 만드십시요."
|
||||
msgstr "빠르게 동영상, 텍스트 구절, 인라인 토의 및 여러 유형의 질문을 만드십시오."
|
||||
|
||||
#: cms/templates/howitworks.html
|
||||
msgid "Publishing on Date"
|
||||
@@ -17736,7 +17741,7 @@ msgstr ""
|
||||
|
||||
#: cms/templates/import.html
|
||||
msgid "Learn more about importing a course"
|
||||
msgstr "강의 가져오기에 대해 자세히 알아보기"
|
||||
msgstr "강좌 가져오기에 대해 자세히 알아보기"
|
||||
|
||||
#: cms/templates/index.html cms/templates/widgets/header.html
|
||||
msgid "{studio_name} Home"
|
||||
@@ -17865,7 +17870,7 @@ msgstr "주의: 강좌 URL의 일부로 영어 알파벳과 숫자로 작성하
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Courses Being Processed"
|
||||
msgstr "강의가 처리중입니다."
|
||||
msgstr "강좌가 처리중입니다."
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Course Run:"
|
||||
@@ -17907,7 +17912,7 @@ msgstr "콘텐츠 보관함"
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Re-run Course"
|
||||
msgstr "강의 다시 시작하기"
|
||||
msgstr "강좌 다시 시작하기"
|
||||
|
||||
#: cms/templates/index.html
|
||||
msgid "Are you staff on an existing {studio_name} course?"
|
||||
@@ -18342,7 +18347,7 @@ msgstr "{studio_name}계정이 있으신가요?"
|
||||
msgid ""
|
||||
"Ready to start creating online courses? Sign up below and start creating "
|
||||
"your first {platform_name} course today."
|
||||
msgstr "아래 항목을 입력하고, {platform_name} 강의를 만들어 보세요."
|
||||
msgstr "아래 항목을 입력하고, {platform_name} 강좌를 만들어 보세요."
|
||||
|
||||
#: cms/templates/register.html
|
||||
msgid "Required Information to Sign Up for {studio_name}"
|
||||
@@ -18437,7 +18442,7 @@ msgstr "이 필드는 비활성화 되어있습니다: 이 정보는 변경될
|
||||
|
||||
#: cms/templates/settings.html
|
||||
msgid "Course Summary Page"
|
||||
msgstr "강좌 요약"
|
||||
msgstr "강좌 소개"
|
||||
|
||||
#: cms/templates/settings.html
|
||||
msgid "(for student enrollment and access)"
|
||||
@@ -18474,8 +18479,8 @@ msgid ""
|
||||
"announced. To provide content for the page and preview it, follow the "
|
||||
"instructions provided by your Program Manager."
|
||||
msgstr ""
|
||||
"귀하의 강좌가 공지되기 전까지는 강좌 요약이 보이게 될 것입니다. 요약 페이지에 내용을 넣고 미리보기 위해서, Program "
|
||||
"Manager 제공 안내사항을 참고하세요. "
|
||||
"귀하의 강좌가 공지되기 전까지는 강좌 개요가 보이게 될 것입니다. 개요 페이지에 내용을 넣고 미리보기 위해서, 플랫폼에서 제공하는 "
|
||||
"도움말을 참고하세요. "
|
||||
|
||||
#: cms/templates/settings.html
|
||||
msgid "Course Credit Requirements"
|
||||
@@ -18568,8 +18573,8 @@ msgid ""
|
||||
"To provide the course start and registration dates as shown on your course "
|
||||
"summary page, follow the instructions provided by your Program Manager."
|
||||
msgstr ""
|
||||
"이는 <strong>강좌 내용이 보일 기간</strong>을 뜻하지만, <strong> 강좌 요약</strong>에 나타나지 않습니다. "
|
||||
"강좌 시작일과 수강신청일을 강좌 요약에 나타나게 하려면, 프로그램 관리자가 제공하는 안내 사항을 참고하세요."
|
||||
"이는 <strong>강좌 내용이 보일 기간</strong>을 뜻하지만, <strong> 강좌 개요</strong>에 나타나지 않습니다. "
|
||||
"강좌 시작일과 수강신청일을 강좌 개요에 나타나게 하려면, 플랫폼에서 제공하는 도움말을 참고하세요."
|
||||
|
||||
#: cms/templates/settings.html
|
||||
msgid "Course Details"
|
||||
@@ -18609,13 +18614,13 @@ msgstr "강좌 개요"
|
||||
|
||||
#: cms/templates/settings.html
|
||||
msgid "your course summary page"
|
||||
msgstr "강좌 요약"
|
||||
msgstr "강좌 소개"
|
||||
|
||||
#: cms/templates/settings.html
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Introductions, prerequisites, FAQs that are used on %s (formatted in HTML)"
|
||||
msgstr "%s 에 들어가게 될 내용으로 강좌 소개, 선수 과목, 자주 하는 질문 등의 내용을 입력하면 됩니다.(HTML 형식)"
|
||||
msgstr "%s 에 들어가게 될 내용으로 강좌 개요, 선수 과목, 자주 하는 질문 등의 내용을 입력하면 됩니다.(HTML 형식)"
|
||||
|
||||
#: cms/templates/settings.html
|
||||
msgid "Course Image"
|
||||
@@ -18903,7 +18908,7 @@ msgstr "{platform_name} edge"
|
||||
|
||||
#: cms/templates/textbooks.html
|
||||
msgid "New Textbook"
|
||||
msgstr "새 교재"
|
||||
msgstr "신규 교재"
|
||||
|
||||
#: cms/templates/textbooks.html
|
||||
msgid "Why should I break my textbook into chapters?"
|
||||
@@ -18994,7 +18999,7 @@ msgstr ""
|
||||
|
||||
#: cms/templates/videos_index.html
|
||||
msgid "How do I get the videos into my course?"
|
||||
msgstr "내 강의에서 비디오를 얻으려면 어떻게 해야하나요?"
|
||||
msgstr "내 강좌에서 동영상을 얻으려면 어떻게 해야하나요?"
|
||||
|
||||
#: cms/templates/videos_index.html
|
||||
msgid ""
|
||||
@@ -19202,7 +19207,7 @@ msgstr "현재 로그인된 사용자이름:"
|
||||
|
||||
#: cms/templates/widgets/metadata-edit.html
|
||||
msgid "Launch Latex Source Compiler"
|
||||
msgstr "Latex 소스 컴파일러 기동"
|
||||
msgstr "LaTex 소스 컴파일러 실행"
|
||||
|
||||
#: cms/templates/widgets/problem-edit.html
|
||||
msgid "Heading 1"
|
||||
@@ -19387,7 +19392,7 @@ msgstr "이 글을 삭제하려고 하는 동안, 글이 수정되었습니다.
|
||||
|
||||
#: wiki/forms.py
|
||||
msgid "Lock article"
|
||||
msgstr "글 잠금"
|
||||
msgstr "문서 편집 잠금"
|
||||
|
||||
#: wiki/forms.py
|
||||
msgid "Deny all users access to edit this article."
|
||||
|
||||
Binary file not shown.
@@ -53,8 +53,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: Korean (Korea) (http://www.transifex.com/open-edx/edx-platform/language/ko_KR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -111,6 +111,7 @@ msgstr "확인"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -126,6 +127,7 @@ msgstr "취소"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete"
|
||||
msgstr "삭제"
|
||||
|
||||
@@ -187,7 +189,7 @@ msgstr "오류"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
@@ -679,7 +681,7 @@ msgstr "설명"
|
||||
#. browser when a user needs to edit HTML
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
msgid "Dimensions"
|
||||
msgstr " 차원"
|
||||
msgstr " 이미지 크기"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -1029,7 +1031,7 @@ msgstr "링크 편집/삽입"
|
||||
#. browser when a user needs to edit HTML
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
msgid "Insert/edit video"
|
||||
msgstr "비디오 편집/삽입"
|
||||
msgstr "동영상 편집/삽입"
|
||||
|
||||
#. Translators: this is a message from the raw HTML editor displayed in the
|
||||
#. browser when a user needs to edit HTML
|
||||
@@ -1608,7 +1610,7 @@ msgid ""
|
||||
"\n"
|
||||
"Proceed to the Advanced Editor and convert this problem to XML?"
|
||||
msgstr ""
|
||||
"고급 편집기를 사용한다면, 이 문제는 XML로 전환되며, 단순 편집기 인터페이스로 다시 돌아올 수 없습니다. \n"
|
||||
"고급 편집기를 사용한다면, 이 문제는 XML로 전환되며, 간편 편집기 인터페이스로 다시 돌아올 수 없습니다. \n"
|
||||
"고급 편집기에서 이 문제를 XML로 전환하시겠습니까?"
|
||||
|
||||
#: common/lib/xmodule/xmodule/js/src/sequence/display.js
|
||||
@@ -2228,7 +2230,7 @@ msgstr "지우기"
|
||||
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
msgid "Text"
|
||||
msgstr "텍스트"
|
||||
msgstr "Text"
|
||||
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
msgid "Video"
|
||||
@@ -2345,6 +2347,55 @@ msgstr ""
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Remove"
|
||||
msgstr "제거"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2356,9 +2407,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2430,6 +2481,17 @@ msgstr ""
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2459,6 +2521,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -3530,19 +3602,19 @@ msgstr "학습집단이 비활성화되었습니다."
|
||||
|
||||
#: lms/static/js/instructor_dashboard/certificates.js
|
||||
msgid "Allow students to generate certificates for this course?"
|
||||
msgstr "학습자의 수료증 생성을 허용하시겠습니까?"
|
||||
msgstr "학습자의 이수증 생성을 허용하시겠습니까?"
|
||||
|
||||
#: lms/static/js/instructor_dashboard/certificates.js
|
||||
msgid "Prevent students from generating certificates in this course?"
|
||||
msgstr "학습자의 수료증 생성을 제한하시겠습니까?"
|
||||
msgstr "학습자의 이수증 생성을 제한하시겠습니까?"
|
||||
|
||||
#: lms/static/js/instructor_dashboard/certificates.js
|
||||
msgid "Start generating certificates for all students in this course?"
|
||||
msgstr "본 강좌의 모든 학습자를 위한 강좌 수료증 생성을 시작하시겠습니까?"
|
||||
msgstr "본 강좌의 모든 학습자를 위한 강좌 이수증 생성을 시작하시겠습니까?"
|
||||
|
||||
#: lms/static/js/instructor_dashboard/certificates.js
|
||||
msgid "Error while generating certificates. Please try again."
|
||||
msgstr "강좌 수료증을 발급하는 동안 오류가 발생했습니다. 다시 시도하세요."
|
||||
msgstr "강좌 이수증을 발급하는 동안 오류가 발생했습니다. 다시 시도하세요."
|
||||
|
||||
#: lms/static/js/instructor_dashboard/ecommerce.js
|
||||
msgid ""
|
||||
@@ -3632,7 +3704,7 @@ msgstr "실명"
|
||||
msgid ""
|
||||
"The name that appears on your certificates. Other learners never see your "
|
||||
"full name."
|
||||
msgstr "수료증에 나타나는 이름입니다. 다른 학습자들은 당신의 이름을 볼 수 없습니다. "
|
||||
msgstr "이수증에 나타나는 이름입니다. 다른 학습자들은 당신의 이름을 볼 수 없습니다. "
|
||||
|
||||
#: lms/static/js/student_account/views/account_settings_factory.js
|
||||
msgid "Email Address"
|
||||
@@ -3814,7 +3886,7 @@ msgstr "사진을 제출 할 수 없습니다."
|
||||
|
||||
#: lms/static/js/verify_student/views/make_payment_step_view.js
|
||||
msgid "Professional Education Verified Certificate"
|
||||
msgstr "전문 과정 수료증 "
|
||||
msgstr "전문 과정 이수증"
|
||||
|
||||
#: lms/static/js/verify_student/views/make_payment_step_view.js
|
||||
msgid "Professional Education"
|
||||
@@ -3822,11 +3894,11 @@ msgstr "전문 교육 과정"
|
||||
|
||||
#: lms/static/js/verify_student/views/make_payment_step_view.js
|
||||
msgid "Verified Certificate upgrade"
|
||||
msgstr "인증 수료증 업그레이드하기"
|
||||
msgstr "인증 이수증 업그레이드하기"
|
||||
|
||||
#: lms/static/js/verify_student/views/make_payment_step_view.js
|
||||
msgid "Verified Certificate"
|
||||
msgstr "인증 수료증"
|
||||
msgstr "인증 이수증"
|
||||
|
||||
#: lms/static/js/verify_student/views/make_payment_step_view.js
|
||||
msgid "Checkout"
|
||||
@@ -3934,10 +4006,6 @@ msgstr "이미지 업로드"
|
||||
msgid "Change image"
|
||||
msgstr "이미지 변경"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Remove"
|
||||
msgstr "제거"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr "제거하기"
|
||||
@@ -4494,7 +4562,7 @@ msgstr ""
|
||||
|
||||
#: cms/static/js/views/edit_chapter.js
|
||||
msgid "Please select a PDF file to upload."
|
||||
msgstr "업로드 할 PDF 파일을 선택하세요."
|
||||
msgstr "업로드할 PDF 파일을 선택하세요."
|
||||
|
||||
#. Translators: 'count' is number of groups that the group
|
||||
#. configuration contains.
|
||||
@@ -5521,6 +5589,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -5691,6 +5771,10 @@ msgstr ""
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -225,7 +225,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-07-20 00:15+0000\n"
|
||||
"Last-Translator: javiercencig <javier@jecnet.com.br>\n"
|
||||
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/open-edx/edx-platform/language/pt_BR/)\n"
|
||||
@@ -7946,6 +7946,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
@@ -152,8 +152,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/open-edx/edx-platform/language/pt_BR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -208,6 +208,7 @@ msgstr "Cancelar"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete"
|
||||
msgstr "Apagar"
|
||||
|
||||
@@ -2464,6 +2465,55 @@ msgstr ""
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Remove"
|
||||
msgstr "Remover"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2475,9 +2525,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2549,6 +2599,17 @@ msgstr ""
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2578,6 +2639,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -4125,10 +4196,6 @@ msgstr "Carregar uma imagem"
|
||||
msgid "Change image"
|
||||
msgstr "Trocar imagem"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Remove"
|
||||
msgstr "Remover"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr "Removendo"
|
||||
@@ -5729,6 +5796,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -5899,6 +5978,10 @@ msgstr ""
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -37,8 +37,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.1a\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:15:47.324123\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:47+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:47:23.251524\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -8274,6 +8274,10 @@ msgstr "فثطف_سثشقذا شري خقيثق_زغ ذشررخف زث حقخد
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr "فاث سعححمهثي فخحهذ هي {topic_id} هس رخف دشمهي"
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr "ثققخق ذخررثذفهرل فخ ثمشسفهذسثشقذا"
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
@@ -26,8 +26,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.1a\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:15:47.640544\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:46+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:47:23.562016\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: openedx-translation <openedx-translation@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -84,6 +84,7 @@ msgstr "خن"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -99,6 +100,7 @@ msgstr "ذشرذثم"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
#: cms/templates/js/certificate-details.underscore
|
||||
#: cms/templates/js/certificate-editor.underscore
|
||||
#: cms/templates/js/content-group-details.underscore
|
||||
@@ -177,7 +179,7 @@ msgstr "ثققخق"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-course-wide.underscore
|
||||
#: lms/templates/instructor/instructor_dashboard_2/cohort-discussions-inline.underscore
|
||||
@@ -190,7 +192,6 @@ msgstr "سشدث"
|
||||
#. browser when a user needs to edit HTML
|
||||
#: cms/static/js/views/modals/edit_xblock.js
|
||||
#: common/lib/xmodule/xmodule/js/src/html/edit.js
|
||||
#: cms/templates/js/signatory-editor.underscore
|
||||
#: common/static/common/templates/image-modal.underscore
|
||||
#: common/static/common/templates/discussion/forum-action-close.underscore
|
||||
msgid "Close"
|
||||
@@ -2440,6 +2441,61 @@ msgstr "ثرفثق فثشو يثسذقهحفهخر."
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr "فثشو يثسذقهحفهخر ذشررخف اشدث وخقث فاشر 300 ذاشقشذفثقس."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr "شر ثققخق خذذعققثي صاهمث قثوخدهرل فاث وثوزثق بقخو فاث فثشو. فقغ شلشهر."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr "فاهس فثشو يخثس رخف اشدث شرغ وثوزثقس."
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr "تخهرثي %(date)s"
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr "مشسف شذفهدهفغ %(date)s"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr "قثوخدث فاهس فثشو وثوزثق?"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
"فاهس مثشقرثق صهمم زث قثوخدثي بقخو فاث فثشو, شممخصهرل شرخفاثق مثشقرثق فخ فشنث"
|
||||
" فاث شدشهمشزمث سحخف."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
#: lms/djangoapps/teams/static/teams/templates/edit-team-member.underscore
|
||||
msgid "Remove"
|
||||
msgstr "قثوخدث"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr "يثمثفث فاهس فثشو?"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
"يثمثفهرل ش فثشو هس حثقوشرثرف شري ذشررخف زث عريخرث. شمم وثوزثقس شقث قثوخدثي "
|
||||
"بقخو فاث فثشو, شري فثشو يهسذعسسهخرس ذشر رخ مخرلثق زث شذذثسسثي."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr "فثشو \"%(team)s\" سعذذثسسبعممغ يثمثفثي."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr "غخع شقث رخف ذعققثرفمغ ش وثوزثق خب شرغ فثشو."
|
||||
@@ -2451,9 +2507,9 @@ msgid "and others"
|
||||
msgstr "شري خفاثقس"
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr "مشسف شذفهدهفغ %(date)s"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2530,6 +2586,20 @@ msgstr "وغ فثشو"
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr "زقخصسث %(sr_start)s فثشوس %(sr_end)s"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr "غخعق قثضعثسف ذخعمي رخف زث ذخوحمثفثي. قثمخشي فاث حشلث شري فقغ شلشهر."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
"غخعق قثضعثسف ذخعمي رخف زث ذخوحمثفثي يعث فخ ش سثقدثق حقخزمثو. قثمخشي فاث حشلث"
|
||||
" شري فقغ شلشهر. هب فاث هسسعث حثقسهسفس, ذمهذن فاث اثمح فشز فخ قثحخقف فاث "
|
||||
"حقخزمثو."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr "فثشو سثشقذا"
|
||||
@@ -2563,6 +2633,18 @@ msgstr ""
|
||||
"هب غخع وشنث سهلرهبهذشرف ذاشرلثس, وشنث سعقث غخع رخفهبغ وثوزثقس خب فاث فثشو "
|
||||
"زثبخقث وشنهرل فاثسث ذاشرلثس."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr "وثوزثقساهح"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
"غخع ذشر قثوخدث وثوزثقس بقخو فاهس فثشو, ثسحثذهشممغ هب فاثغ اشدث رخف "
|
||||
"حشقفهذهحشفثي هر فاث فثشو'س شذفهدهفغ."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr "سثشقذا فثشوس"
|
||||
@@ -4128,11 +4210,6 @@ msgstr "عحمخشي شر هوشلث"
|
||||
msgid "Change image"
|
||||
msgstr "ذاشرلث هوشلث"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr "قثوخدث"
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr "قثوخدهرل"
|
||||
@@ -5815,6 +5892,18 @@ msgstr "ذشرذثم فثشو ذقثشفهرل."
|
||||
msgid "Cancel team updating."
|
||||
msgstr "ذشرذثم فثشو عحيشفهرل."
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr "هرسفقعذفخق فخخمس"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr "يثمثفث فثشو"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr "ثيهف وثوزثقساهح"
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr "شقث غخع اشدهرل فقخعزمث بهريهرل ش فثشو فخ تخهر?"
|
||||
@@ -5992,6 +6081,10 @@ msgstr "دثقهبغ رخص"
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr "وشقن ثطشو شس ذخوحمثفثي"
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr "فهوثي"
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr "ثري وغ ثطشو"
|
||||
|
||||
Binary file not shown.
@@ -180,7 +180,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-08-05 08:47+0000\n"
|
||||
"Last-Translator: Weyedide <weyedide@gmail.com>\n"
|
||||
"Language-Team: Russian (http://www.transifex.com/open-edx/edx-platform/language/ru/)\n"
|
||||
@@ -7562,6 +7562,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
@@ -8609,7 +8613,10 @@ msgstr ""
|
||||
msgid "Highest level of education completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/signup_modal.html
|
||||
#. #-#-#-#-# django-partial.po (edx-platform) #-#-#-#-#
|
||||
#. Translators: This label appears above a dropdown menu on the registration
|
||||
#. form used to select the user's year of birth.
|
||||
#: openedx/core/djangoapps/user_api/views.py lms/templates/signup_modal.html
|
||||
msgid "Year of birth"
|
||||
msgstr "Год рождения"
|
||||
|
||||
@@ -13439,7 +13446,7 @@ msgstr ""
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
|
||||
msgid "Course End Date:"
|
||||
msgstr ""
|
||||
msgstr "Дата окончания курса:"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
|
||||
msgid "Has the course started?"
|
||||
@@ -13459,7 +13466,7 @@ msgstr "Курс уже закончился?"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
|
||||
msgid "Number of sections:"
|
||||
msgstr ""
|
||||
msgstr "Количество разделов:"
|
||||
|
||||
#: lms/templates/instructor/instructor_dashboard_2/course_info.html
|
||||
msgid "Grade Cutoffs:"
|
||||
|
||||
Binary file not shown.
@@ -101,8 +101,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:06+0000\n"
|
||||
"PO-Revision-Date: 2015-09-04 14:08+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:15+0000\n"
|
||||
"PO-Revision-Date: 2015-09-11 12:17+0000\n"
|
||||
"Last-Translator: Sarina Canelake <sarina@edx.org>\n"
|
||||
"Language-Team: Russian (http://www.transifex.com/open-edx/edx-platform/language/ru/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -159,6 +159,7 @@ msgstr "ОК"
|
||||
#: cms/templates/js/edit-textbook.underscore
|
||||
#: cms/templates/js/group-configuration-editor.underscore
|
||||
#: cms/templates/js/section-name-edit.underscore
|
||||
#: cms/templates/js/signatory-actions.underscore
|
||||
#: cms/templates/js/xblock-string-field-editor.underscore
|
||||
#: common/static/common/templates/discussion/new-post.underscore
|
||||
#: common/static/common/templates/discussion/response-comment-edit.underscore
|
||||
@@ -174,6 +175,7 @@ msgstr "Отмена"
|
||||
#: cms/static/js/views/manage_users_and_roles.js
|
||||
#: cms/static/js/views/show_textbook.js
|
||||
#: common/static/js/vendor/ova/catch/js/catch.js
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete"
|
||||
msgstr "Удалить"
|
||||
|
||||
@@ -2458,6 +2460,57 @@ msgstr ""
|
||||
msgid "Team description cannot have more than 300 characters."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "An error occurred while removing the member from the team. Try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "This team does not have any members."
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Joined %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid "Remove this team member?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
msgid ""
|
||||
"This learner will be removed from the team, allowing another learner to take"
|
||||
" the available spot."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/edit_team_members.js
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
#: lms/djangoapps/teams/static/teams/templates/edit-team-member.underscore
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Delete this team?"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid ""
|
||||
"Deleting a team is permanent and cannot be undone. All members are removed "
|
||||
"from the team, and team discussions can no longer be accessed."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/instructor_tools.js
|
||||
msgid "Team \"%(team)s\" successfully deleted."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/my_teams.js
|
||||
msgid "You are not currently a member of any team."
|
||||
msgstr ""
|
||||
@@ -2469,9 +2522,9 @@ msgid "and others"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'date' is a placeholder for a fuzzy, relative timestamp (see:
|
||||
#. https://github.com/rmm5t/jquery-timeago)
|
||||
#. http://momentjs.com/)
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
msgid "Last Activity %(date)s"
|
||||
msgid "Last activity %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/team_card.js
|
||||
@@ -2546,6 +2599,17 @@ msgstr ""
|
||||
msgid "Browse %(sr_start)s teams %(sr_end)s"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Your request could not be completed. Reload the page and try again."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"Your request could not be completed due to a server problem. Reload the page"
|
||||
" and try again. If the issue persists, click the Help tab to report the "
|
||||
"problem."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Team Search"
|
||||
msgstr ""
|
||||
@@ -2575,6 +2639,16 @@ msgid ""
|
||||
"before making these changes."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid ""
|
||||
"You can remove members from this team, especially if they have not "
|
||||
"participated in the team's activity."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/js/views/teams_tab.js
|
||||
msgid "Search teams"
|
||||
msgstr ""
|
||||
@@ -4045,11 +4119,6 @@ msgstr ""
|
||||
msgid "Change image"
|
||||
msgstr ""
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
#: cms/templates/js/video/metadata-translations-item.underscore
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
|
||||
#: lms/static/js/views/image_field.js
|
||||
msgid "Removing"
|
||||
msgstr ""
|
||||
@@ -5655,6 +5724,18 @@ msgstr ""
|
||||
msgid "Cancel team updating."
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Instructor tools"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Delete Team"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/instructor-tools.underscore
|
||||
msgid "Edit Membership"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/static/teams/templates/team-actions.underscore
|
||||
msgid "Are you having trouble finding a team to join?"
|
||||
msgstr ""
|
||||
@@ -5825,6 +5906,10 @@ msgstr ""
|
||||
msgid "Mark Exam As Completed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "timed"
|
||||
msgstr ""
|
||||
|
||||
#: lms/templates/courseware/proctored-exam-status.underscore
|
||||
msgid "End My Exam"
|
||||
msgstr ""
|
||||
|
||||
Binary file not shown.
@@ -142,6 +142,7 @@
|
||||
# Junjie, 2014
|
||||
# 刘洋 <liuyang2011@tsinghua.edu.cn>, 2013
|
||||
# Lucas H. Xu <xuh@bu.edu>, 2015
|
||||
# Wheathana <mr_wheat@sina.cn>, 2015
|
||||
# pku9104038 <pku9104038@hotmail.com>, 2014
|
||||
# ruiruillp <gaier1993@163.com>, 2015
|
||||
# Sarina Canelake <sarina@edx.org>, 2014
|
||||
@@ -211,6 +212,7 @@
|
||||
# 匡冲 <kuangchong07@gmail.com>, 2013
|
||||
# LIU NIAN <lauraqq@gmail.com>, 2015
|
||||
# 刘洋 <liuyang2011@tsinghua.edu.cn>, 2013
|
||||
# Wheathana <mr_wheat@sina.cn>, 2015
|
||||
# pku9104038 <pku9104038@hotmail.com>, 2014
|
||||
# ruiruillp <gaier1993@163.com>, 2015
|
||||
# Scott Huang <sc.h@aol.com>, 2014
|
||||
@@ -263,7 +265,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: edx-platform\n"
|
||||
"Report-Msgid-Bugs-To: openedx-translation@googlegroups.com\n"
|
||||
"POT-Creation-Date: 2015-09-04 14:07+0000\n"
|
||||
"POT-Creation-Date: 2015-09-11 12:16+0000\n"
|
||||
"PO-Revision-Date: 2015-06-18 03:04+0000\n"
|
||||
"Last-Translator: louyihua <supermouselyh@hotmail.com>\n"
|
||||
"Language-Team: Chinese (China) (http://www.transifex.com/open-edx/edx-platform/language/zh_CN/)\n"
|
||||
@@ -7647,6 +7649,10 @@ msgstr ""
|
||||
msgid "The supplied topic id {topic_id} is not valid"
|
||||
msgstr ""
|
||||
|
||||
#: lms/djangoapps/teams/views.py
|
||||
msgid "Error connecting to elasticsearch"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: 'ordering' is a string describing a way
|
||||
#. of ordering a list. For example, {ordering} may be
|
||||
#. 'name', indicating that the user wants to sort the
|
||||
|
||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user