Merge pull request #3059 from Imperadeiro98/master
Added i18n to courses
This commit is contained in:
commit
4582a4499f
5 changed files with 224 additions and 111 deletions
app
locale
templates/courses
views/courses
|
@ -844,6 +844,90 @@
|
||||||
last_played: "Last played"
|
last_played: "Last played"
|
||||||
leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances."
|
leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances."
|
||||||
|
|
||||||
|
courses:
|
||||||
|
course: "Course"
|
||||||
|
courses: "courses"
|
||||||
|
not_enrolled: "You are not enrolled in this course."
|
||||||
|
visit_pref: "Please visit the"
|
||||||
|
visit_suf: "page to enroll."
|
||||||
|
select_class: "Select one of your classes"
|
||||||
|
unnamed: "*unnamed*"
|
||||||
|
select: "Select"
|
||||||
|
unnamed_class: "Unnamed Class"
|
||||||
|
edit_settings: "edit class settings"
|
||||||
|
edit_settings1: "Edit Class Settings"
|
||||||
|
progress: "Class Progress"
|
||||||
|
add_students: "Add Students"
|
||||||
|
stats: "Statistics"
|
||||||
|
total_students: "Total students:"
|
||||||
|
average_time: "Average level play time:"
|
||||||
|
total_time: "Total play time:"
|
||||||
|
average_levels: "Average levels completed:"
|
||||||
|
total_levels: "Total levels completed:"
|
||||||
|
furthest_level: "Furthest level completed:"
|
||||||
|
concepts_covered: "Concepts Covered"
|
||||||
|
students: "Students"
|
||||||
|
students1: "students"
|
||||||
|
expand_details: "Expand details"
|
||||||
|
concepts: "Concepts"
|
||||||
|
levels: "levels"
|
||||||
|
played: "Played"
|
||||||
|
play_time: "Play time:"
|
||||||
|
completed: "Completed:"
|
||||||
|
invite_students: "Invite students to join this class."
|
||||||
|
enter_emails: "Enter student emails to invite, one per line"
|
||||||
|
send_invites: "Send Invites"
|
||||||
|
title: "Title"
|
||||||
|
description: "Description"
|
||||||
|
languages_available: "Select programming languages available to the class:"
|
||||||
|
all_lang: "All Languages"
|
||||||
|
show_progress: "Show student progress to everyone in the class"
|
||||||
|
creating_class: "Creating class..."
|
||||||
|
purchasing_course: "Purchasing course..."
|
||||||
|
buy_course: "Buy Course"
|
||||||
|
buy_course1: "Buy this course"
|
||||||
|
create_class: "Create Class"
|
||||||
|
select_all_courses: "Select 'All Courses' for a 50% discount!"
|
||||||
|
all_courses: "All Courses"
|
||||||
|
number_students: "Number of students"
|
||||||
|
enter_number_students: "Enter the number of students you need for this class."
|
||||||
|
name_class: "Name your class"
|
||||||
|
displayed_course_page: "This will be displayed on the course page for you and your students. It can be changed later."
|
||||||
|
buy: "Buy"
|
||||||
|
purchasing_for: "You are purchasing a license for"
|
||||||
|
creating_for: "You are creating a class for"
|
||||||
|
for: "for" # Like in 'for 30 students'
|
||||||
|
receive_code: "Afterwards you will receive an unlock code to distribute to your students, which they can use to enroll in your class."
|
||||||
|
free_trial: "Free trial for teachers!"
|
||||||
|
get_access: "to get individual access to all courses for evalutaion purposes."
|
||||||
|
questions: "Questions?"
|
||||||
|
faq: "Courses FAQ"
|
||||||
|
question: "Q:" # Like in 'Question'
|
||||||
|
question1: "What's the difference between these courses and the single player game?"
|
||||||
|
answer: "A:" # Like in 'Answer'
|
||||||
|
answer1: "The single player game is designed for individuals, while the courses are designed for classes."
|
||||||
|
answer2: "The single player game has items, gems, hero selection, leveling up, and in-app purchases. Courses have classroom management features and streamlined student-focused level pacing."
|
||||||
|
teachers_click: "Teachers Click Here"
|
||||||
|
students_click: "Students Click Here"
|
||||||
|
courses_on_coco: "Courses on CodeCombat"
|
||||||
|
designed_to: "Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours."
|
||||||
|
more_in_less: "Learn more in less time"
|
||||||
|
no_experience: "No coding experience necesssary"
|
||||||
|
easy_monitor: "Easily monitor student progress"
|
||||||
|
purchase_for_class: "Purchase a course for your entire class. It's easy to sign up your students!"
|
||||||
|
see_the: "See the"
|
||||||
|
more_info: "for more information."
|
||||||
|
choose_course: "Choose Your Course:"
|
||||||
|
enter_code: "Enter an unlock code"
|
||||||
|
enter_code1: "Enter unlock code"
|
||||||
|
enroll: "Enroll"
|
||||||
|
pick_from_classes: "Pick from your current classes"
|
||||||
|
enter: "Enter"
|
||||||
|
or: "Or"
|
||||||
|
topics: "Topics"
|
||||||
|
hours_content: "Hours of content:"
|
||||||
|
get_free: "Get FREE course"
|
||||||
|
|
||||||
classes:
|
classes:
|
||||||
archmage_title: "Archmage"
|
archmage_title: "Archmage"
|
||||||
archmage_title_description: "(Coder)"
|
archmage_title_description: "(Coder)"
|
||||||
|
@ -1180,6 +1264,7 @@
|
||||||
bad_input: "Bad input."
|
bad_input: "Bad input."
|
||||||
server_error: "Server error."
|
server_error: "Server error."
|
||||||
unknown: "Unknown error."
|
unknown: "Unknown error."
|
||||||
|
error: "ERROR"
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
sessions: "Sessions"
|
sessions: "Sessions"
|
||||||
|
|
|
@ -10,13 +10,13 @@ block content
|
||||||
if (noCourseInstance || noCourseInstanceSelected) && course
|
if (noCourseInstance || noCourseInstanceSelected) && course
|
||||||
h1= course.get('name')
|
h1= course.get('name')
|
||||||
if noCourseInstance
|
if noCourseInstance
|
||||||
p You are not enrolled in this course.
|
p(data-i18n="courses.not_enrolled")
|
||||||
p
|
p
|
||||||
span.spr Please visit the
|
span.spr(data-i18n="courses.visit_pref")
|
||||||
a.spr(href="/courses") courses
|
a(href="/courses", data-i18n="courses.courses")
|
||||||
span page to enroll.
|
span.spl(data-i18n="courses.visit_suf")
|
||||||
else if noCourseInstanceSelected
|
else if noCourseInstanceSelected
|
||||||
p Select one of your classes
|
p(data-i18n="courses.select_class")
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.col-md-6
|
.col-md-6
|
||||||
|
@ -25,13 +25,13 @@ block content
|
||||||
if courseInstance.get('name')
|
if courseInstance.get('name')
|
||||||
option(value="#{courseInstance.id}")= courseInstance.get('name')
|
option(value="#{courseInstance.id}")= courseInstance.get('name')
|
||||||
else
|
else
|
||||||
option(value="#{courseInstance.id}") *unnamed*
|
option(value="#{courseInstance.id}", data-i18n="courses.unnamed")
|
||||||
.col-md-6
|
.col-md-6
|
||||||
button.btn.btn-success.btn-select-instance Select
|
button.btn.btn-success.btn-select-instance(data-i18n="courses.select")
|
||||||
else if !course || !courseInstance
|
else if !course || !courseInstance
|
||||||
h1 Loading...
|
h1(data-i18n="common.loading") Loading...
|
||||||
else
|
else
|
||||||
h1= courseInstance.get('name') || 'Unnamed Class'
|
h1= courseInstance.get('name') || $.i18n.t('courses.unnamed_class')
|
||||||
small.spl (#{course.get('name')})
|
small.spl (#{course.get('name')})
|
||||||
|
|
||||||
p
|
p
|
||||||
|
@ -41,17 +41,17 @@ block content
|
||||||
if adminMode && courseInstance
|
if adminMode && courseInstance
|
||||||
+settings-dialog
|
+settings-dialog
|
||||||
p
|
p
|
||||||
button.btn.btn-xs(data-toggle='modal', data-target='#settingsModal') edit class settings
|
button.btn.btn-xs(data-toggle='modal', data-target='#settingsModal', data-i18n="courses.edit_settings")
|
||||||
|
|
||||||
div.well.well-sm(role='tabpanel')
|
div.well.well-sm(role='tabpanel')
|
||||||
ul.nav.nav-pills(role='tablist')
|
ul.nav.nav-pills(role='tablist')
|
||||||
li.active(role='presentation')
|
li.active(role='presentation')
|
||||||
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Class Progress
|
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab', data-i18n="courses.progress")
|
||||||
if adminMode
|
if adminMode
|
||||||
li(role='presentation')
|
li(role='presentation')
|
||||||
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students
|
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab', data-i18n="courses.add_students")
|
||||||
li(role='presentation')
|
li(role='presentation')
|
||||||
a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels
|
a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab', data-i18n="nav.play")
|
||||||
.tab-content
|
.tab-content
|
||||||
.tab-pane.active#progress(role='tabpanel')
|
.tab-pane.active#progress(role='tabpanel')
|
||||||
+progress-tab
|
+progress-tab
|
||||||
|
@ -71,38 +71,38 @@ mixin progress-tab
|
||||||
+progress-members
|
+progress-members
|
||||||
|
|
||||||
mixin progress-summary-stats
|
mixin progress-summary-stats
|
||||||
h3 Statistics
|
h3(data-i18n="courses.stats")
|
||||||
table.progress-stats-container
|
table.progress-stats-container
|
||||||
tr
|
tr
|
||||||
td Total students:
|
td(data-i18n="courses.total_students")
|
||||||
td
|
td
|
||||||
if courseInstance
|
if courseInstance
|
||||||
div #{courseInstance.get('members').length}
|
div #{courseInstance.get('members').length}
|
||||||
if instanceStats
|
if instanceStats
|
||||||
tr
|
tr
|
||||||
td Average level play time:
|
td(data-i18n="courses.average_time")
|
||||||
if instanceStats.averageLevelPlaytime > 0
|
if instanceStats.averageLevelPlaytime > 0
|
||||||
td= moment.duration(instanceStats.averageLevelPlaytime, "seconds").humanize()
|
td= moment.duration(instanceStats.averageLevelPlaytime, "seconds").humanize()
|
||||||
else
|
else
|
||||||
td 0
|
td 0
|
||||||
tr
|
tr
|
||||||
td Total play time:
|
td(data-i18n="courses.total_time")
|
||||||
if instanceStats.totalPlayTime > 0
|
if instanceStats.totalPlayTime > 0
|
||||||
td= moment.duration(instanceStats.totalPlayTime, "seconds").humanize()
|
td= moment.duration(instanceStats.totalPlayTime, "seconds").humanize()
|
||||||
else
|
else
|
||||||
td 0
|
td 0
|
||||||
tr
|
tr
|
||||||
td Average levels completed:
|
td(data-i18n="courses.average_levels")
|
||||||
td #{instanceStats.averageLevelsCompleted.toFixed(2)}
|
td #{instanceStats.averageLevelsCompleted.toFixed(2)}
|
||||||
tr
|
tr
|
||||||
td Total levels completed:
|
td(data-i18n="courses.total_levels")
|
||||||
td= instanceStats.totalLevelsCompleted
|
td= instanceStats.totalLevelsCompleted
|
||||||
tr
|
tr
|
||||||
td Furthest level completed:
|
td(data-i18n="courses.furthest_level")
|
||||||
td= instanceStats.furthestLevelCompleted.replace('Course: ', '')
|
td= instanceStats.furthestLevelCompleted.replace('Course: ', '')
|
||||||
|
|
||||||
mixin progress-summary-concepts
|
mixin progress-summary-concepts
|
||||||
h3 Concepts Covered
|
h3(data-i18n="courses.concepts_covered")
|
||||||
if course && courseInstance && conceptsCompleted
|
if course && courseInstance && conceptsCompleted
|
||||||
table.progress-concepts-container
|
table.progress-concepts-container
|
||||||
each concept in course.get('concepts')
|
each concept in course.get('concepts')
|
||||||
|
@ -116,29 +116,29 @@ mixin progress-summary-concepts
|
||||||
span - #{conceptCompletion}%
|
span - #{conceptCompletion}%
|
||||||
|
|
||||||
mixin progress-members
|
mixin progress-members
|
||||||
h3 Students
|
h3(data-i18n="courses.students")
|
||||||
table.table.table-condensed
|
table.table.table-condensed
|
||||||
thead
|
thead
|
||||||
tr
|
tr
|
||||||
th
|
th
|
||||||
span.progress-member-header.spr Name
|
span.progress-member-header.spr(data-i18n="clans.name")
|
||||||
if memberSort === 'nameAsc'
|
if memberSort === 'nameAsc'
|
||||||
span.progress-member-header.glyphicon.glyphicon-chevron-up
|
span.progress-member-header.glyphicon.glyphicon-chevron-up
|
||||||
else if memberSort === 'nameDesc'
|
else if memberSort === 'nameDesc'
|
||||||
span.progress-member-header.glyphicon.glyphicon-chevron-down
|
span.progress-member-header.glyphicon.glyphicon-chevron-down
|
||||||
th
|
th
|
||||||
span.progress-header.spr Progress
|
span.progress-header.spr(data-i18n="clans.progress")
|
||||||
if memberSort === 'progressAsc'
|
if memberSort === 'progressAsc'
|
||||||
span.progress-header.glyphicon.glyphicon-chevron-up
|
span.progress-header.glyphicon.glyphicon-chevron-up
|
||||||
else if memberSort === 'progressDesc'
|
else if memberSort === 'progressDesc'
|
||||||
span.progress-header.glyphicon.glyphicon-chevron-down
|
span.progress-header.glyphicon.glyphicon-chevron-down
|
||||||
else
|
else
|
||||||
span(style='padding-left:16px;')
|
span(style='padding-left:16px;')
|
||||||
span.progress-key.progress-key-complete complete
|
span.progress-key.progress-key-complete(data-i18n="clans.complete_1")
|
||||||
span.progress-key.progress-key-started started
|
span.progress-key.progress-key-started(data-i18n="clans.started_1")
|
||||||
span.progress-key not started
|
span.progress-key(data-i18n="clans.not_started_1")
|
||||||
input.progress-expand-checkbox(type='checkbox')
|
input.progress-expand-checkbox(type='checkbox')
|
||||||
span.spl.progress-expand-label Expand details
|
span.spl.progress-expand-label(data-i18n="courses.expand_details")
|
||||||
tbody
|
tbody
|
||||||
each memberID in sortedMembers
|
each memberID in sortedMembers
|
||||||
tr
|
tr
|
||||||
|
@ -146,19 +146,19 @@ mixin progress-members
|
||||||
+progress-members-individual(memberID)
|
+progress-members-individual(memberID)
|
||||||
td.progress-cell
|
td.progress-cell
|
||||||
if showExpandedProgress
|
if showExpandedProgress
|
||||||
.progress-concepts-label Concepts
|
.progress-concepts-label(data-i18n="courses.concepts")
|
||||||
+progress-members-concepts(memberID)
|
+progress-members-concepts(memberID)
|
||||||
.progess-levels-label Levels
|
.progess-levels-label(data-i18n="nav.play")
|
||||||
+progress-members-levels-expanded(memberID)
|
+progress-members-levels-expanded(memberID)
|
||||||
else
|
else
|
||||||
table
|
table
|
||||||
tbody
|
tbody
|
||||||
tr
|
tr
|
||||||
td.progress-concepts-label Concepts
|
td.progress-concepts-label(data-i18n="courses.concepts")
|
||||||
td.progress-condensed-cell
|
td.progress-condensed-cell
|
||||||
+progress-members-concepts(memberID)
|
+progress-members-concepts(memberID)
|
||||||
tr
|
tr
|
||||||
td.progess-levels-label Levels
|
td.progess-levels-label(data-i18n="nav.play")
|
||||||
td.progress-condensed-cell
|
td.progress-condensed-cell
|
||||||
+progress-members-levels-condensed(memberID)
|
+progress-members-levels-condensed(memberID)
|
||||||
|
|
||||||
|
@ -166,8 +166,12 @@ mixin progress-members-individual(memberID)
|
||||||
- var name = memberUserMap[memberID] ? memberUserMap[memberID].get('name') : 'Anoner'
|
- var name = memberUserMap[memberID] ? memberUserMap[memberID].get('name') : 'Anoner'
|
||||||
a(href="/user/#{memberID}")= name || 'Anoner'
|
a(href="/user/#{memberID}")= name || 'Anoner'
|
||||||
if memberStats && memberStats[memberID]
|
if memberStats && memberStats[memberID]
|
||||||
div #{memberStats[memberID].totalLevelsCompleted} levels
|
div
|
||||||
div Played #{moment.duration(memberStats[memberID].totalPlayTime, "seconds").humanize()}
|
span #{memberStats[memberID].totalLevelsCompleted}
|
||||||
|
span.spl(data-i18n="courses.levels")
|
||||||
|
div
|
||||||
|
span.spr(data-i18n="courses.played")
|
||||||
|
span #{moment.duration(memberStats[memberID].totalPlayTime, "seconds").humanize()}
|
||||||
|
|
||||||
mixin progress-members-concepts(memberID)
|
mixin progress-members-concepts(memberID)
|
||||||
if course && userLevelStateMap[memberID]
|
if course && userLevelStateMap[memberID]
|
||||||
|
@ -215,41 +219,49 @@ mixin progress-members-levels-condensed(memberID)
|
||||||
mixin progress-members-popup-completed(i, level)
|
mixin progress-members-popup-completed(i, level)
|
||||||
.progress-popup-container
|
.progress-popup-container
|
||||||
h3 #{i + 1}. #{level.name.replace('Course: ', '')}
|
h3 #{i + 1}. #{level.name.replace('Course: ', '')}
|
||||||
p Play time: #{moment.duration(level.playtime, "seconds").humanize()}
|
p
|
||||||
p Completed: #{moment(level.changed).format('MMMM Do YYYY, h:mm:ss a')}
|
span.spr(data-i18n="courses.play_time")
|
||||||
|
span #{moment.duration(level.playtime, "seconds").humanize()}
|
||||||
|
p
|
||||||
|
span.spr(data-i18n="courses.completed")
|
||||||
|
span #{moment(level.changed).format('MMMM Do YYYY, h:mm:ss a')}
|
||||||
if adminMode
|
if adminMode
|
||||||
strong Click to view solution.
|
strong(data-i18n="clans.view_solution")
|
||||||
|
|
||||||
mixin progress-members-popup-started(i, level)
|
mixin progress-members-popup-started(i, level)
|
||||||
.progress-popup-container
|
.progress-popup-container
|
||||||
h3 #{i + 1}. #{level.name.replace('Course: ', '')}
|
h3 #{i + 1}. #{level.name.replace('Course: ', '')}
|
||||||
p Play time: #{moment.duration(level.playtime, "seconds").humanize()}
|
p
|
||||||
p Last played: #{moment(level.changed).format('MMMM Do YYYY, h:mm:ss a')}
|
span.spr(data-i18n="courses.play_time")
|
||||||
|
span #{moment.duration(level.playtime, "seconds").humanize()}
|
||||||
|
p
|
||||||
|
span.spr(data-i18n="clans.last_played")
|
||||||
|
span #{moment(level.changed).format('MMMM Do YYYY, h:mm:ss a')}
|
||||||
if adminMode
|
if adminMode
|
||||||
strong Click to view solution.
|
strong(data-i18n="clans.view_solution")
|
||||||
|
|
||||||
mixin invite-tab
|
mixin invite-tab
|
||||||
p Invite students to join this class.
|
p(data-i18n="courses.invite_students")
|
||||||
p TODO: Student unlock code
|
p TODO: Student unlock code
|
||||||
p TODO: Class capacity
|
p TODO: Class capacity
|
||||||
textarea.invite-emails(rows=3, placeholder="Enter student emails to invite, one per line")
|
textarea.invite-emails(rows=3, data-i18n="[placeholder]courses.enter_emails", placeholder="Enter student emails to invite, one per line")
|
||||||
div(style='margin-top:10px;')
|
div(style='margin-top:10px;')
|
||||||
button.btn.btn-success.btn-invite Send Invites
|
button.btn.btn-success.btn-invite(data-i18n="courses.send_invites")
|
||||||
|
|
||||||
mixin levels-tab
|
mixin levels-tab
|
||||||
table.table.table-striped.table-condensed
|
table.table.table-striped.table-condensed
|
||||||
thead
|
thead
|
||||||
tr
|
tr
|
||||||
th
|
th
|
||||||
th Status
|
th(data-i18n="clans.status")
|
||||||
th Level
|
th(data-i18n="resources.level")
|
||||||
th Concepts
|
th(data-i18n="courses.concepts")
|
||||||
tbody
|
tbody
|
||||||
if campaign
|
if campaign
|
||||||
each level, levelID in campaign.get('levels')
|
each level, levelID in campaign.get('levels')
|
||||||
tr
|
tr
|
||||||
td
|
td
|
||||||
button.btn.btn-success.btn-play-level(data-level-slug=level.slug) Play
|
button.btn.btn-success.btn-play-level(data-level-slug=level.slug, data-i18n="home.play")
|
||||||
td
|
td
|
||||||
if userLevelStateMap[me.id]
|
if userLevelStateMap[me.id]
|
||||||
div= userLevelStateMap[me.id][levelID]
|
div= userLevelStateMap[me.id][levelID]
|
||||||
|
@ -266,24 +278,24 @@ mixin settings-dialog
|
||||||
.modal-header
|
.modal-header
|
||||||
button.close(data-dismiss='modal')
|
button.close(data-dismiss='modal')
|
||||||
span ×
|
span ×
|
||||||
h3.modal-title Edit Class Settings
|
h3.modal-title(data-i18n="courses.edit_settings1")
|
||||||
.modal-body
|
.modal-body
|
||||||
p
|
p
|
||||||
strong Title
|
strong(data-i18n="courses.title")
|
||||||
p
|
p
|
||||||
input.settings-name-input(type='text', value="#{courseInstance.get('name') || ''}")
|
input.settings-name-input(type='text', value="#{courseInstance.get('name') || ''}")
|
||||||
p
|
p
|
||||||
strong Description
|
strong(data-i18n="courses.description")
|
||||||
p
|
p
|
||||||
textarea.settings-description-input(rows=2)= courseInstance.get('description')
|
textarea.settings-description-input(rows=2)= courseInstance.get('description')
|
||||||
p Select programming languages available to the class:
|
p(data-i18n="courses.languages_available")
|
||||||
p
|
p
|
||||||
select.form-control.settings-language-select
|
select.form-control.settings-language-select
|
||||||
option(value="Python") Python
|
option(value="Python") Python
|
||||||
option(value="JavaScript") JavaScript
|
option(value="JavaScript") JavaScript
|
||||||
option(value="All Languages") All Languages
|
option(value="All Languages", data-i18n="courses.all_lang")
|
||||||
p
|
p
|
||||||
input.settings-public-progress(type='checkbox', checked)
|
input.settings-public-progress(type='checkbox', checked)
|
||||||
span.spl Show student progress to everyone in the class
|
span.spl(data-i18n="courses.show_progress")
|
||||||
.modal-footer
|
.modal-footer
|
||||||
button.btn.btn-save-settings(data-i18n="common.save_changes")
|
button.btn.btn-save-settings(data-i18n="common.save_changes")
|
||||||
|
|
|
@ -9,67 +9,81 @@ block content
|
||||||
|
|
||||||
if state === 'declined' || state === 'unknown_error'
|
if state === 'declined' || state === 'unknown_error'
|
||||||
p
|
p
|
||||||
.alert.alert-danger ERROR #{stateMessage}
|
.alert.alert-danger
|
||||||
|
span.spr(data-i18n="loading_error.error")
|
||||||
|
span #{stateMessage}
|
||||||
|
|
||||||
if state === 'creating'
|
if state === 'creating'
|
||||||
p
|
p
|
||||||
.alert.alert-info Creating class...
|
.alert.alert-info(data-i18n="courses.creating_class")
|
||||||
else if state === 'purchasing'
|
else if state === 'purchasing'
|
||||||
p
|
p
|
||||||
.alert.alert-info Purchasing course...
|
.alert.alert-info(data-i18n="courses.purchasing_course")
|
||||||
else
|
else
|
||||||
.well.well-lg.enroll-container
|
.well.well-lg.enroll-container
|
||||||
if price > 0
|
if price > 0
|
||||||
h1.center Buy Course
|
h1.center(data-i18n="courses.buy_course")
|
||||||
else
|
else
|
||||||
h1.center Create Class
|
h1.center(data-i18n="courses.create_class")
|
||||||
h3 1. Course
|
h3
|
||||||
|
span 1.
|
||||||
|
span.spl(data-i18n="courses.course")
|
||||||
if courses.length > 2
|
if courses.length > 2
|
||||||
p Select 'All Courses' for a 50% discount!
|
p(data-i18n="courses.select_all_courses")
|
||||||
.form-group
|
.form-group
|
||||||
select.form-control.course-select
|
select.form-control.course-select
|
||||||
each course in courses
|
each course in courses
|
||||||
option(value="#{course.id}")= course.get('name')
|
option(value="#{course.id}")= course.get('name')
|
||||||
if courses.length > 1
|
if courses.length > 1
|
||||||
option(value="All Courses") All Courses
|
option(value="All Courses", data-i18n="courses.all_courses")
|
||||||
|
|
||||||
h3 2. Number of students
|
h3
|
||||||
p Enter the number of students you need for this class.
|
span 2.
|
||||||
|
span.spl(data-i18n="courses.number_students")
|
||||||
|
p(data-i18n="courses.enter_number_students")
|
||||||
input.input-seats(type='text', value="#{seats}")
|
input.input-seats(type='text', value="#{seats}")
|
||||||
|
|
||||||
h3 3. Name your class
|
h3
|
||||||
p This will be displayed on the course page for you and your students. It can be changed later.
|
span 3.
|
||||||
|
span.spl(data-i18n="courses.name_class")
|
||||||
|
p(data-i18n="courses.displayed_course_page")
|
||||||
input.class-name(type='text', placeholder="Mrs. Smith's 4th Period", value="#{className ? className : ''}")
|
input.class-name(type='text', placeholder="Mrs. Smith's 4th Period", value="#{className ? className : ''}")
|
||||||
|
|
||||||
if price > 0
|
if price > 0
|
||||||
h3 4. Buy
|
h3
|
||||||
|
span 4.
|
||||||
|
span.spl(data-i18n="courses.buy") Buy
|
||||||
else
|
else
|
||||||
h3 4. Create Class
|
h3
|
||||||
|
span 4.
|
||||||
|
span.spl(data-i18n="courses.create_class")
|
||||||
p
|
p
|
||||||
if price > 0
|
if price > 0
|
||||||
span.spr You are purchasing a license for
|
span.spr(data-i18n="courses.purchasing_for")
|
||||||
else
|
else
|
||||||
span.spr You are creating a class for
|
span.spr(data-i18n="courses.creating_for")
|
||||||
strong.spr #{selectedCourseTitle}
|
strong.spr #{selectedCourseTitle}
|
||||||
span.spr for
|
span.spr(data-i18n="courses.for")
|
||||||
strong #{seats} students
|
strong
|
||||||
| .
|
span #{seats}
|
||||||
p Afterwards you will receive an unlock code to distribute to your students, which they can use to enroll in your class.
|
span.spl(data-i18n="courses.students1")
|
||||||
|
span .
|
||||||
|
p(data-i18n="courses.receive_code")
|
||||||
p.center
|
p.center
|
||||||
if price > 0
|
if price > 0
|
||||||
button.btn.btn-success.btn-lg.btn-buy $#{(price / 100.0).toFixed(2)}
|
button.btn.btn-success.btn-lg.btn-buy $#{(price / 100.0).toFixed(2)}
|
||||||
else
|
else
|
||||||
button.btn.btn-success.btn-lg.btn-buy Create Class
|
button.btn.btn-success.btn-lg.btn-buy(data-i18n="courses.create_class")
|
||||||
+trial-and-questions
|
+trial-and-questions
|
||||||
|
|
||||||
mixin trial-and-questions
|
mixin trial-and-questions
|
||||||
h3 Free trial for teachers!
|
h3(data-i18n="courses.free_trial")
|
||||||
p
|
p
|
||||||
span.spr Please fill out our
|
span.spr(data-i18n="teachers.teacher_subs_1")
|
||||||
a(href='/teachers/freetrial', data-i18n="teachers.teacher_subs_2")
|
a(href='/teachers/freetrial', data-i18n="teachers.teacher_subs_2")
|
||||||
span.spl to get individual access to all courses for evalutaion purposes.
|
span.spl(data-i18n="courses.get_access")
|
||||||
|
|
||||||
h3 Questions?
|
h3(data-i18n="courses.questions")
|
||||||
p
|
p
|
||||||
span Please contact
|
span(data-i18n="teachers_survey.contact_1")
|
||||||
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
||||||
|
|
|
@ -22,34 +22,34 @@ block content
|
||||||
- i++
|
- i++
|
||||||
|
|
||||||
mixin student-main
|
mixin student-main
|
||||||
button.btn.btn-warning.btn-teacher Teachers Click Here
|
button.btn.btn-warning.btn-teacher(data-i18n="courses.teachers_click")
|
||||||
h1.center Courses on CodeCombat
|
h1.center(data-i18n="courses.courses_on_coco")
|
||||||
|
|
||||||
mixin teacher-main
|
mixin teacher-main
|
||||||
button.btn.btn-warning.btn-student Students Click Here
|
button.btn.btn-warning.btn-student(data-i18n="courses.students_click")
|
||||||
h1.center Courses on CodeCombat
|
h1.center(data-i18n="courses.courses_on_coco")
|
||||||
.info-container
|
.info-container
|
||||||
p Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours.
|
p(data-i18n="courses.designed_to")
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.col-md-6
|
.col-md-6
|
||||||
ul
|
ul
|
||||||
li Learn more in less time
|
li(data-i18n="courses.more_in_less")
|
||||||
li No coding experience necesssary
|
li(data-i18n="courses.no_experience")
|
||||||
li Easily monitor student progress
|
li(data-i18n="courses.easy_monitor")
|
||||||
|
|
||||||
p Purchase a course for your entire class. It's easy to sign up your students!
|
p(data-i18n="courses.purchase_for_class")
|
||||||
p.faq-blurb
|
p.faq-blurb
|
||||||
span.spr See the courses
|
span.spr(data-i18n="courses.see_the")
|
||||||
a.spr.courses-faq FAQ
|
a.courses-faq(data-i18n="courses.faq")
|
||||||
span for more information.
|
span.spl(data-i18n="courses.more_info")
|
||||||
.col-md-6
|
.col-md-6
|
||||||
img.img-quote(src="/images/pages/courses/coco_complab.png")
|
img.img-quote(src="/images/pages/courses/coco_complab.png")
|
||||||
p
|
p
|
||||||
.well.well-sm
|
.well.well-sm
|
||||||
div.praise-quote "#{praise.quote}"
|
div.praise-quote "#{praise.quote}"
|
||||||
div.praise-caption - #{praise.source}
|
div.praise-caption - #{praise.source}
|
||||||
h2.center Choose Your Course:
|
h2.center(data-i18n="courses.choose_course")
|
||||||
|
|
||||||
mixin student-dialog(course)
|
mixin student-dialog(course)
|
||||||
.modal.continue-dialog(id="continueModal#{course.id}")
|
.modal.continue-dialog(id="continueModal#{course.id}")
|
||||||
|
@ -64,13 +64,13 @@ mixin student-dialog(course)
|
||||||
.col-md-12
|
.col-md-12
|
||||||
.well.well-sm
|
.well.well-sm
|
||||||
p
|
p
|
||||||
div.instruction-label Enter an unlock code
|
div.instruction-label(data-i18n="courses.enter_code")
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.col-md-8
|
.col-md-8
|
||||||
input.code-input(type='text', placeholder="Enter unlock code")
|
input.code-input(type='text', data-i18n="[placeholder]courses.enter_code1", placeholder="Enter unlock code")
|
||||||
.col-md-4
|
.col-md-4
|
||||||
button.btn.btn-success.btn-enroll Enroll
|
button.btn.btn-success.btn-enroll(data-i18n="courses.enroll")
|
||||||
|
|
||||||
mixin teacher-dialog(course)
|
mixin teacher-dialog(course)
|
||||||
.modal.continue-dialog(id="continueModal#{course.id}")
|
.modal.continue-dialog(id="continueModal#{course.id}")
|
||||||
|
@ -86,7 +86,7 @@ mixin teacher-dialog(course)
|
||||||
.col-md-12
|
.col-md-12
|
||||||
.well.well-sm
|
.well.well-sm
|
||||||
p
|
p
|
||||||
div.instruction-label Pick from your current classes
|
div.instruction-label(data-i18n="courses.pick_from_classes")
|
||||||
.container-fluid
|
.container-fluid
|
||||||
.row
|
.row
|
||||||
.col-md-8
|
.col-md-8
|
||||||
|
@ -96,15 +96,15 @@ mixin teacher-dialog(course)
|
||||||
if inst.get('name')
|
if inst.get('name')
|
||||||
option(value="#{inst.id}")= inst.get('name')
|
option(value="#{inst.id}")= inst.get('name')
|
||||||
else
|
else
|
||||||
option(value="#{inst.id}") *unnamed*
|
option(value="#{inst.id}", data-i18n="courses.unnamed")
|
||||||
.col-md-4
|
.col-md-4
|
||||||
button.btn.btn-success.btn-enter(data-course-id="#{course.id}") Enter
|
button.btn.btn-success.btn-enter(data-course-id="#{course.id}", data-i18n="courses.enter")
|
||||||
.row.button-row.center.row-pick-class
|
.row.button-row.center.row-pick-class
|
||||||
.col-md-12
|
.col-md-12
|
||||||
div.or Or
|
div.or(data-i18n="courses.or")
|
||||||
.row.button-row.center
|
.row.button-row.center
|
||||||
.col-md-12
|
.col-md-12
|
||||||
button.btn.btn-success.btn-lg.btn-buy(data-course-id="#{course.id}") Buy this course
|
button.btn.btn-success.btn-lg.btn-buy(data-course-id="#{course.id}", data-i18n="courses.buy_course1")
|
||||||
|
|
||||||
mixin course-block(course)
|
mixin course-block(course)
|
||||||
if studentMode
|
if studentMode
|
||||||
|
@ -125,18 +125,20 @@ mixin course-block(course)
|
||||||
img.course-image(src="#{course.get('screenshot')}")
|
img.course-image(src="#{course.get('screenshot')}")
|
||||||
.row.button-row
|
.row.button-row
|
||||||
.col-md-6
|
.col-md-6
|
||||||
strong Topics
|
strong(data-i18n="courses.topics")
|
||||||
ul
|
ul
|
||||||
each concept in course.get('concepts')
|
each concept in course.get('concepts')
|
||||||
li(data-i18n="concepts." + concept)
|
li(data-i18n="concepts." + concept)
|
||||||
strong Hours of content: #{course.get('duration')}
|
strong
|
||||||
|
span.spr(data-i18n="courses.hours_content")
|
||||||
|
span #{course.get('duration')}
|
||||||
.col-md-6.center(style='margin-top: 40px;')
|
.col-md-6.center(style='margin-top: 40px;')
|
||||||
if studentMode
|
if studentMode
|
||||||
if enrolledCourses[course.id]
|
if enrolledCourses[course.id]
|
||||||
a.btn.btn-lg.btn-success.btn-continue(href="/courses/#{course.id}?student=true") Continue
|
a.btn.btn-lg.btn-success.btn-continue(href="/courses/#{course.id}?student=true", data-i18n="common.continue")
|
||||||
else
|
else
|
||||||
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Enter
|
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}", data-i18n="courses.enter") Enter
|
||||||
else if enrolledCourses[course.id]
|
else if enrolledCourses[course.id]
|
||||||
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Continue
|
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}", data-i18n="common.continue")
|
||||||
else
|
else
|
||||||
button.btn.btn-lg.btn-success.btn-buy(data-course-id="#{course.id}") #{course.get('pricePerSeat') === 0 ? 'Get FREE course' : 'Buy course'}
|
button.btn.btn-lg.btn-success.btn-buy(data-course-id="#{course.id}") #{course.get('pricePerSeat') === 0 ? $.i18n.t('courses.get_free') : $.i18n.t('courses.buy_course')}
|
||||||
|
|
|
@ -45,10 +45,10 @@ module.exports = class CoursesView extends RootView
|
||||||
@enrolledCourses[courseInstance.get('courseID')] = true for courseInstance in @courseInstances.models
|
@enrolledCourses[courseInstance.get('courseID')] = true for courseInstance in @courseInstances.models
|
||||||
|
|
||||||
setupCoursesFAQPopover: ->
|
setupCoursesFAQPopover: ->
|
||||||
popoverTitle = "<h3>Courses FAQ<button type='button' class='close' onclick='$('.courses-faq').popover('hide');'>×</button></h3>"
|
popoverTitle = "<h3>" + $.i18n.t('courses.faq') + "<button type='button' class='close' onclick='$('.courses-faq').popover('hide');'>×</button></h3>"
|
||||||
popoverContent = "<p><strong>Q:</strong> What's the difference between these courses and the single player game?</p>"
|
popoverContent = "<p><strong>" + $.i18n.t('courses.question') + "</strong> " + $.i18n.t('courses.question1') + "</p>"
|
||||||
popoverContent += "<p><strong>A:</strong> The single player game is designed for individuals, while the courses are designed for classes.</p>"
|
popoverContent += "<p><strong>" + $.i18n.t('courses.answer') + "</strong> " + $.i18n.t('courses.answer1') + "</p>"
|
||||||
popoverContent += "<p>The single player game has items, gems, hero selection, leveling up, and in-app purchases. Courses have classroom management features and streamlined student-focused level pacing.</p>"
|
popoverContent += "<p>" + $.i18n.t('courses.answer2') + "</p>"
|
||||||
@$el.find('.courses-faq').popover(
|
@$el.find('.courses-faq').popover(
|
||||||
animation: true
|
animation: true
|
||||||
html: true
|
html: true
|
||||||
|
|
Reference in a new issue