Courses i18n

Also, removed duplicated 'Continue' string
This commit is contained in:
Imperadeiro98 2015-12-08 20:05:08 +00:00
parent 78548b550f
commit e284ec7959
22 changed files with 497 additions and 315 deletions

View file

@ -259,7 +259,6 @@
victory_sign_up_poke: "Want to save your code? Create a free account!" victory_sign_up_poke: "Want to save your code? Create a free account!"
victory_rate_the_level: "How fun was this level?" victory_rate_the_level: "How fun was this level?"
victory_return_to_ladder: "Return to Ladder" victory_return_to_ladder: "Return to Ladder"
victory_play_continue: "Continue"
victory_saving_progress: "Saving Progress" victory_saving_progress: "Saving Progress"
victory_go_home: "Go Home" victory_go_home: "Go Home"
victory_review: "Tell us more!" victory_review: "Tell us more!"
@ -272,9 +271,6 @@
victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks." victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
victory_become_a_viking: "Become a Viking" victory_become_a_viking: "Become a Viking"
guide_title: "Guide" guide_title: "Guide"
tome_minion_spells: "Your Minions' Spells" # Only in old-style levels.
tome_read_only_spells: "Read-Only Spells" # Only in old-style levels.
tome_other_units: "Other Units" # Only in old-style levels.
tome_cast_button_run: "Run" tome_cast_button_run: "Run"
tome_cast_button_running: "Running" tome_cast_button_running: "Running"
tome_cast_button_ran: "Ran" tome_cast_button_ran: "Ran"
@ -286,7 +282,6 @@
tome_available_spells: "Available Spells" tome_available_spells: "Available Spells"
tome_your_skills: "Your Skills" tome_your_skills: "Your Skills"
tome_current_method: "Current Method" tome_current_method: "Current Method"
hud_continue_short: "Continue"
code_saved: "Code Saved" code_saved: "Code Saved"
skip_tutorial: "Skip (esc)" skip_tutorial: "Skip (esc)"
keyboard_shortcuts: "Key Shortcuts" keyboard_shortcuts: "Key Shortcuts"
@ -905,7 +900,6 @@
concepts_covered: "Concepts Covered" concepts_covered: "Concepts Covered"
students: "Students" students: "Students"
students1: "students" students1: "students"
expand_details: "Expand details"
concepts: "Concepts" concepts: "Concepts"
levels: "levels" levels: "levels"
played: "Played" played: "Played"
@ -939,12 +933,6 @@
free_trial: "Free trial for teachers!" free_trial: "Free trial for teachers!"
get_access: "to get individual access to all courses for evalutaion purposes." get_access: "to get individual access to all courses for evalutaion purposes."
questions: "Questions?" 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" teachers_click: "Teachers Click Here"
students_click: "Students Click Here" students_click: "Students Click Here"
courses_on_coco: "Courses on CodeCombat" courses_on_coco: "Courses on CodeCombat"
@ -965,6 +953,149 @@
topics: "Topics" topics: "Topics"
hours_content: "Hours of content:" hours_content: "Hours of content:"
get_free: "Get FREE course" get_free: "Get FREE course"
enroll_paid: "Enroll Students in Paid Courses"
you_have1: "You have"
you_have2: "unused paid enrollments"
use_one: "Use 1 paid enrollment for"
use_multiple: "Use paid enrollments for the following students:"
already_enrolled: "already enrolled"
licenses_remaining: "licenses remaining:"
insufficient_enrollments: "insufficient paid enrollments"
enroll_students: "Enroll Students"
get_enrollments: "Get More Enrollments"
change_language: "Change Course Language"
keep_using: "Keep Using"
switch_to: "Switch To"
greetings: "Greetings!"
learn_p: "Learn Python"
learn_j: "Learn JavaScript"
back_classrooms: "Back to my classrooms"
back_courses: "Back to my courses"
edit_details: "Edit class details"
enrolled_courses: "enrolled in paid courses:"
purchase_enrollments: "Purchase Enrollments"
remove_student: "remove student"
assign: "Assign"
to_assign: "to assign paid courses."
teacher: "Teacher"
complete: "Complete"
none: "None"
save: "Save"
play_campaign_title: "Play the Campaign"
play_campaign_description: "Youre ready to take the next step! Explore hundreds of challenging levels, learn advanced programming skills, and compete in multiplayer arenas!"
create_account_title: "Create an Account"
create_account_description: "Sign up for a FREE CodeCombat account and gain access to more levels, more programming skills, and more fun!"
preview_campaign_title: "Preview Campaign"
preview_campaign_description: "Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account."
arena: "Arena"
arena_soon_title: "Arena Coming Soon"
arena_soon_description: "We are working on a multiplayer arena for classrooms at the end of"
not_enrolled1: "Not enrolled"
not_enrolled2: "Ask your teacher to enroll you in the next course."
next_course: "Next Course"
coming_soon1: "Coming soon"
coming_soon2: "We are hard at work making more courses for you!"
available_levels: "Available Levels"
welcome_to_courses: "Adventurers, welcome to Courses!"
ready_to_play: "Ready to play?"
start_new_game: "Start New Game"
play_now_learn_header: "Play now to learn"
play_now_learn_1: "basic syntax to control your character"
play_now_learn_2: "while loops to solve pesky puzzles"
play_now_learn_3: "strings & variables to customize actions"
play_now_learn_4: "how to defeat an ogre (important life skills!)"
welcome_to_page: "Welcome to your Courses page!"
completed_hoc: "Amazing! You've completed the Hour of Code course!"
ready_for_more_header: "Ready for more? Play the campaign mode!"
ready_for_more_1: "Use gems to unlock new items!"
ready_for_more_2: "Play through brand new worlds and challenges"
ready_for_more_3: "Learn even more programming!"
saved_games: "Saved Games"
hoc: "Hour of Code"
change_language: "change language"
my_classes: "My Classes"
class_added: "Class successfully added!"
view_class: "view class"
view_levels: "view levels"
join_class: "Join A Class"
ask_teacher_for_code: "Ask your teacher if you have a CodeCombat class code! If so, enter it below:"
enter_c_code: "<Enter Class Code>"
join: "Join"
joining: "Joining class"
course_complete: "Course Complete"
play_arena: "Play Arena"
start: "Start"
last_level: "Last Level"
welcome_to_hoc: "Adventurers, welcome to our Hour of Code!"
logged_in_as: "Logged in as:"
not_you: "Not you?"
welcome_back: "Hi adventurer, welcome back!"
continue_playing: "Continue Playing"
more_options: "More options:"
option1_header: "Option 1: Invite students via email"
option1_body: "Students will automatically be sent an invitation to join this class, and will need to create an account with a username and password."
option2_header: "Option 2: Send URL to your students"
option2_body: "Students will be asked to enter an email address, username and password to create an account."
option3_header: "Option 3: Direct students to codecombat.com/courses"
option3_body: "Give students the following passcode to enter along with an email address, username and password when they create an account."
thank_you_pref: "Thank you for your purchase! You can now assign"
thank_you_suff: "more students to paid courses."
return_to_class: "Return to classroom"
return_to_course_man: "Return to course management."
students_not_enrolled: "students not enrolled"
total_all_classes: "Total Across All Classes"
how_many_enrollments: "How many additional paid enrollments do you need?"
each_student_access: "Each student in a class will get access to Courses 2-4 once they are enrolled in paid courses. You may assign each course to each student individually."
purchase_now: "Purchase Now"
enrollments: "enrollments"
remove_student1: "Remove Student"
are_you_sure: "Are you sure you want to remove this student from this class?"
remove_description1: "Student will lose access to this classroom and assigned classes. Progress and gameplay is NOT lost, and the student can be added back to the classroom at any time."
remove_description2: "The activated paid license will not be returned."
keep_student: "Keep Student"
removing_user: "Removing user"
to_join_ask: "To join a class, ask your teacher for an unlock code."
join_class: "Join Class"
enter_here: "<enter unlock code here>"
successfully_joined: "Successfully joined"
click_to_start: "Click here to start taking"
my_courses: "My Courses"
classroom: "Classroom"
use_school_email: "use your school email if you have one"
unique_name: "a unique name no one has chosen"
pick_something: "pick something you can remember"
class_code: "Class Code"
optional_ask: "optional - ask your teacher to give you one!"
optional_school: "optional - what school do you go to?"
start_playing: "Start Playing"
skip_this: "Skip this, I'll create an account later!"
welcome: "Welcome"
getting_started: "Getting Started with Courses"
download_getting_started: "Download Getting Started Guide [PDF]"
getting_started_1: "Create a new class by clicking the green 'Create New Class' button below."
getting_started_2: "Once you've created a class, click the blue 'Add Students' button."
getting_started_3: "You'll see student's progress below as they sign up and join your class."
addicional_resources: "Additional Resources"
addicional_resources_1_pref: "Download/print our"
addicional_resources_1_mid: "Course 1 Teacher's Guide"
addicional_resources_1_suff: "explanations and solutions to each level."
addicional_resources_2_pref: "Complete our"
addicional_resources_2_suff: "to get 15 more hours of content for FREE for 2 months."
addicional_resources_3_pref: "Visit our"
addicional_resources_3_mid: "Teacher Forums"
addicional_resources_3_suff: "to connect to fellow educators who are using CodeCombat."
your_classes: "Your Classes"
no_classes: "No classes yet!"
create_new_class1: "create new class"
available_courses: "Available Courses"
unused_enrollments: "Unused enrollments available:"
students_access: "All students get access to Introduction to Computer Science for free. One enrollment per student is required to assign them to paid CodeCombat courses. A single student does not need multiple enrollments to access all paid courses."
active_courses: "active courses"
no_students: "No students yet!"
add_students1: "add students"
view_edit: "view/edit"
students_enrolled: "students enrolled"
length: "Length:"
classes: classes:
archmage_title: "Archmage" archmage_title: "Archmage"

View file

@ -3,7 +3,7 @@ extends /templates/core/modal-base
block modal-header-content block modal-header-content
.clearfix .clearfix
.text-center .text-center
h2 Enroll Students in Paid Courses h2(data-i18n="courses.enroll_paid")
p= view.classroom.get('name') p= view.classroom.get('name')
block modal-body-content block modal-body-content
@ -12,9 +12,9 @@ block modal-body-content
- var remainingLic = totalLic - usedLic; - var remainingLic = totalLic - usedLic;
.text-center .text-center
p p
strong.spr You have strong.spr(data-i18n="courses.you_have1")
strong.spr= remainingLic strong= remainingLic
strong unused paid enrollments strong.spl(data-i18n="courses.you_have2")
.row .row
.col-sm-10.col-sm-offset-1 .col-sm-10.col-sm-offset-1
@ -24,13 +24,14 @@ block modal-body-content
.radio .radio
label label
input(type="radio", name="targets" value="given" checked=true) input(type="radio", name="targets" value="given" checked=true)
span.spr Use 1 paid enrollment for #{view.user.broadName()} span.spr(data-i18n="courses.use_one")
span= view.user.broadName()
.radio .radio
label label
input(type="radio", name="targets" value="selection") input(type="radio", name="targets" value="selection")
span.spr Use paid enrollments for the following students: span(data-i18n="courses.use_multiple")
else else
p Use paid enrollments for the following students: p(data-i18n="courses.use_multiple")
.well.form-group .well.form-group
for user in view.users.models for user in view.users.models
@ -41,33 +42,33 @@ block modal-body-content
span.spr= user.broadName() span.spr= user.broadName()
if paid if paid
span ( span (
span already enrolled span(data-i18n="courses.already_enrolled")
span ) span )
#error-alert.alert.alert-danger.hide #error-alert.alert.alert-danger.hide
#progress-area.hide #progress-area.hide
.progress .progress
.progress-bar .progress-bar
#submit-form-area.text-center #submit-form-area.text-center
p p
span.spr Total students: span.spr(data-i18n="courses.total_students")
span#total-selected-span.spr span#total-selected-span.spr
span#not-depleted-span span#not-depleted-span
| ( | (
span.spr licenses remaining: span.spr(data-i18n="courses.licenses_remaining")
span#licenses-remaining-span span#licenses-remaining-span
| ) | )
span#depleted-span span#depleted-span
| ( | (
span insufficient paid enrollments span(data-i18n="courses.insufficient_enrollments")
| ) | )
p p
button#activate-licenses-btn.btn.btn-success.text-uppercase(type="submit") Enroll Students button#activate-licenses-btn.btn.btn-success.text-uppercase(type="submit", data-i18n="courses.enroll_students")
p p
a#get-more-licenses-btn.btn.btn-info.text-uppercase(href="/courses/purchase") Get More Enrollments a#get-more-licenses-btn.btn.btn-info.text-uppercase(href="/courses/purchase", data-i18n="courses.get_enrollments")
block modal-footer-content block modal-footer-content

View file

@ -1,7 +1,7 @@
extends /templates/core/modal-base extends /templates/core/modal-base
block modal-header-content block modal-header-content
h3 Change Course Language h3(data-i18n="courses.change_language")
.clearfix .clearfix
block modal-body-content block modal-body-content
@ -9,20 +9,26 @@ block modal-body-content
- var currentLanguage = (me.get('aceConfig') || {}).language || 'python'; - var currentLanguage = (me.get('aceConfig') || {}).language || 'python';
button.lang-choice-btn.btn.btn-success.btn-lg(data-language='python') button.lang-choice-btn.btn.btn-success.btn-lg(data-language='python')
if currentLanguage === 'python' if currentLanguage === 'python'
| Keep Using Python span.spr(data-i18n="courses.keep_using")
span Python
else else
| Switch To Python span.spr(data-i18n="courses.switch_to")
span Python
p - OR -
p
span.spr -
span.text-uppercase(data-i18n="general.or")
span.spl -
button.lang-choice-btn.btn.btn-default(data-language='javascript') button.lang-choice-btn.btn.btn-default(data-language='javascript')
if currentLanguage === 'javascript' if currentLanguage === 'javascript'
| Keep Using JavaScript span.spr(data-i18n="courses.keep_using")
span JavaScript
else else
| Switch to JavaScript span.spr(data-i18n="courses.switch_to")
span JavaScript
#saving-progress.progress.progress-striped.active.hide #saving-progress.progress.progress-striped.active.hide
.progress-bar(style="width: 100%") .progress-bar(style="width: 100%")
block modal-footer-content block modal-footer-content

View file

@ -3,7 +3,7 @@ extends /templates/core/modal-base
block modal-header-content block modal-header-content
.clearfix .clearfix
.text-center .text-center
h2.modal-title Greetings! h2.modal-title(data-i18n="courses.greetings")
h3(data-i18n="choose_hero.programming_language_description") h3(data-i18n="choose_hero.programming_language_description")
block modal-body-content block modal-body-content
@ -12,14 +12,13 @@ block modal-body-content
img(src="/images/common/code_languages/python_small.png") img(src="/images/common/code_languages/python_small.png")
span.spl Python span.spl Python
p(data-i18n="choose_hero.python_blurb") p(data-i18n="choose_hero.python_blurb")
button.lang-choice-btn.btn.btn-default(data-language='javascript') button.lang-choice-btn.btn.btn-default(data-language='javascript')
img(src="/images/common/code_languages/javascript_small.png") img(src="/images/common/code_languages/javascript_small.png")
span.spl JavaScript span.spl JavaScript
p(data-i18n="choose_hero.javascript_blurb") p(data-i18n="choose_hero.javascript_blurb")
#saving-progress.progress.progress-striped.active.hide #saving-progress.progress.progress-striped.active.hide
.progress-bar(style="width: 100%") .progress-bar(style="width: 100%")
block modal-footer-content block modal-footer-content

View file

@ -20,9 +20,8 @@ block modal-body-content
label(data-i18n="choose_hero.programming_language") label(data-i18n="choose_hero.programming_language")
select.form-control#programming-language-select select.form-control#programming-language-select
- var aceConfig = view.classroom ? view.classroom.get('aceConfig') || {} : {}; - var aceConfig = view.classroom ? view.classroom.get('aceConfig') || {} : {};
option(value="python", selected=aceConfig.language==='python') Learn Python option(value="python", selected=aceConfig.language==='python', data-i18n="courses.learn_p")
option(value="javascript", selected=aceConfig.language==='javascript') Learn JavaScript option(value="javascript", selected=aceConfig.language==='javascript', data-i18n="courses.learn_j")
.language-locked Language cannot be changed once students join a class.
block modal-footer-content block modal-footer-content
if view.classroom if view.classroom

View file

@ -4,20 +4,20 @@ block content
- var isOwner = view.classroom ? view.classroom.get('ownerID') === me.id : false; - var isOwner = view.classroom ? view.classroom.get('ownerID') === me.id : false;
if isOwner if isOwner
a(href="/courses/teachers") Back to my classrooms a(href="/courses/teachers", data-i18n="courses.back_classrooms")
else else
a(href="/courses") Back to my courses a(href="/courses", data-i18n="courses.back_courses")
if !me.isAnonymous() if !me.isAnonymous()
h1 h1
span.spr= view.classroom.get('name') span.spr= view.classroom.get('name')
if isOwner if isOwner
a#edit-class-details-link a#edit-class-details-link
small Edit class details small(data-i18n="courses.edit_details")
if view.classroom.get('description') if view.classroom.get('description')
p= view.classroom.get('description') p= view.classroom.get('description')
h3(data-i18n="courses.stats") h3(data-i18n="courses.stats")
table.progress-stats-container table.progress-stats-container
- var stats = view.classStats() - var stats = view.classStats()
@ -26,7 +26,7 @@ block content
td td
span.spr= _.size(view.classroom.get('members')) span.spr= _.size(view.classroom.get('members'))
span ( span (
span.spr enrolled in paid courses: span.spr(data-i18n="courses.enrolled_courses")
span= stats.enrolledUsers span= stats.enrolledUsers
span ) span )
tr tr
@ -41,17 +41,17 @@ block content
tr tr
td(data-i18n="courses.total_levels") td(data-i18n="courses.total_levels")
td= stats.totalLevelsComplete td= stats.totalLevelsComplete
h1 h1
| Students span(data-i18n="courses.students")
if view.teacherMode if view.teacherMode
.pull-right#main-button-area .pull-right#main-button-area
button#add-students-btn.btn.btn-primary.text-uppercase Add Students button#add-students-btn.btn.btn-primary.text-uppercase(data-i18n="courses.add_students")
button#activate-licenses-btn.btn.btn-info.text-uppercase Enroll Students in Paid Courses button#activate-licenses-btn.btn.btn-info.text-uppercase(data-i18n="courses.enroll_paid")
a.btn.btn-success.text-uppercase(href="/courses/purchase?from-classroom="+view.classroom.id) Purchase Enrollments a.btn.btn-success.text-uppercase(href="/courses/purchase?from-classroom="+view.classroom.id, data-i18n="courses.purchase_enrollments")
hr hr
for user in view.users.models for user in view.users.models
.row .row
.col-md-6 .col-md-6
@ -60,16 +60,22 @@ block content
if view.teacherMode if view.teacherMode
a.remove-student-link.pull-right.text-uppercase(data-user-id=user.id) a.remove-student-link.pull-right.text-uppercase(data-user-id=user.id)
span.glyphicon.glyphicon-remove span.glyphicon.glyphicon-remove
span.spl remove student span.spl(data-i18n="courses.remove_student")
- var lastPlayedString = view.userLastPlayedString(user); - var lastPlayedString = view.userLastPlayedString(user);
- var playtime = view.userPlaytimeString(user); - var playtime = view.userPlaytimeString(user);
if lastPlayedString || playtime if lastPlayedString || playtime
#student-stats-row.row #student-stats-row.row
if lastPlayedString if lastPlayedString
.col-sm-6 Last Played: #{lastPlayedString} .col-sm-6
span(data-i18n="user.last_played")
span.spr :
span= lastPlayedString
if playtime if playtime
.col-sm-6 Playtime: #{playtime} .col-sm-6
span(data-i18n="clans.playtime")
span.spr :
span= playtime
- var paidFor = user.get('coursePrepaidID'); - var paidFor = user.get('coursePrepaidID');
for courseInstance in view.courseInstances.models for courseInstance in view.courseInstances.models
- var inCourse = _.contains(courseInstance.get('members'), user.id); - var inCourse = _.contains(courseInstance.get('members'), user.id);
@ -107,16 +113,20 @@ block content
.progress-bar.progress-bar-default(style=css, data-content=content, data-toggle='popover')= i .progress-bar.progress-bar-default(style=css, data-content=content, data-toggle='popover')= i
else if paidFor else if paidFor
.text-center .text-center
button.enable-btn.btn.btn-info.btn-sm.text-uppercase(data-user-id=user.id, data-course-instance-cid=courseInstance.cid) Assign #{course.get('name')} button.enable-btn.btn.btn-info.btn-sm.text-uppercase(data-user-id=user.id, data-course-instance-cid=courseInstance.cid)
span.spr(data-i18n="courses.assign")
span= course.get('name')
if view.teacherMode && !paidFor if view.teacherMode && !paidFor
.text-center .text-center
p p
em em
span.spr Enroll span.spr(data-i18n="courses.enroll")
strong.spr= user.broadName() strong= user.broadName()
span to assign paid courses. span.spl(data-i18n="courses.to_assign")
p p
button.activate-single-license-btn.btn.btn-info.btn-sm.text-uppercase(data-user-id=user.id) Enroll #{user.broadName()} button.activate-single-license-btn.btn.btn-info.btn-sm.text-uppercase(data-user-id=user.id)
span.spr(data-i18n="courses.enroll")
span= user.broadName()
hr hr

View file

@ -3,9 +3,9 @@ extends /templates/base
block content block content
if view.teacherMode if view.teacherMode
a(href="/courses/teachers") Back to my classrooms a(href="/courses/teachers", data-i18n="courses.back_classrooms")
else else
a(href="/courses") Back to my courses a(href="/courses", data-i18n="courses.back_courses")
br br
br br
@ -31,7 +31,7 @@ block content
.col-md-6 .col-md-6
button.btn.btn-success.btn-select-instance(data-i18n="courses.select") button.btn.btn-success.btn-select-instance(data-i18n="courses.select")
else if !course || !courseInstance else if !course || !courseInstance
h1(data-i18n="common.loading") Loading... h1(data-i18n="common.loading")
else else
p p
// TODO: format this text all good and stuff // TODO: format this text all good and stuff
@ -44,7 +44,9 @@ block content
span(data-i18n='courses.unnamed_class') span(data-i18n='courses.unnamed_class')
if !view.owner.isNew() && view.getOwnerName() && courseInstance.get('name') != 'Single Player' if !view.owner.isNew() && view.getOwnerName() && courseInstance.get('name') != 'Single Player'
span.spl.spr - Teacher: span.spl -
span.spl(data-i18n='courses.teacher')
span.spr :
//a(href="/user/#{view.owner.id}") // Don't link to profiles until we improve them //a(href="/user/#{view.owner.id}") // Don't link to profiles until we improve them
span span
strong= view.getOwnerName() strong= view.getOwnerName()
@ -52,8 +54,10 @@ block content
h1 h1
| #{course.get('name')} | #{course.get('name')}
if view.courseComplete if view.courseComplete
span.spl - Complete! span.spl -
span.spl(data-i18n='courses.complete')
span !
p p
if courseInstance.get('description') if courseInstance.get('description')
each line in courseInstance.get('description').split('\n') each line in courseInstance.get('description').split('\n')
@ -67,43 +71,46 @@ block content
form.form#school-form form.form#school-form
.form-group .form-group
label.control-label(for="course-complete-school-input") label.control-label(for="course-complete-school-input")
span.spr(data-i18n="signup.school_name") School Name and City span.spr(data-i18n="signup.school_name")
em.optional-note em.optional-note
| ( | (
span(data-i18n="signup.optional") optional span(data-i18n="signup.optional")
| ): | ):
.input-border .input-border
input#course-complete-school-input.input-large.form-control(name="schoolName", data-i18n="[placeholder]signup.school_name_placeholder") input#course-complete-school-input.input-large.form-control(name="schoolName", data-i18n="[placeholder]signup.school_name_placeholder")
button.btn.btn-primary.btn-submit.no-school(type="submit") None button.btn.btn-primary.btn-submit.no-school(type="submit", data-i18n='courses.none')
button.btn.btn-info.btn-submit.save-school(type="submit") Save button.btn.btn-info.btn-submit.save-school(type="submit", data-i18n='courses.save')
.row .row
if view.singlePlayerMode && !me.isAnonymous() if view.singlePlayerMode && !me.isAnonymous()
.col-md-6.col-md-offset-3 .col-md-6.col-md-offset-3
a.btn.btn-lg.btn-success(href="/play") a.btn.btn-lg.btn-success(href="/play")
h1 Play the Campaign h1(data-i18n='courses.play_campaign_title')
p Youre ready to take the next step! Explore hundreds of challenging levels, learn advanced programming skills, and compete in multiplayer arenas! p(data-i18n='courses.play_campaign_description')
else if view.singlePlayerMode && me.isAnonymous() else if view.singlePlayerMode && me.isAnonymous()
.col-md-6 .col-md-6
a.btn.btn-lg.btn-success.signup-button a.btn.btn-lg.btn-success.signup-button
h1 Create an Account h1(data-i18n='courses.create_account_title')
p Sign up for a FREE CodeCombat account and gain access to more levels, more programming skills, and more fun! p(data-i18n='courses.create_account_description')
.col-md-6 .col-md-6
a.btn.btn-lg.btn-success(href="/play") a.btn.btn-lg.btn-success(href="/play")
h1 Preview Campaign h1(data-i18n='courses.preview_campaign_title')
p Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account. p(data-i18n='courses.preview_campaign_description')
else if !view.singlePlayerMode else if !view.singlePlayerMode
.col-md-6 .col-md-6
if view.arenaLevel if view.arenaLevel
a.btn.btn-lg.btn-success.btn-play-level(data-level-slug=view.arenaLevel.slug, data-level-id=view.arenaLevel.original) a.btn.btn-lg.btn-success.btn-play-level(data-level-slug=view.arenaLevel.slug, data-level-id=view.arenaLevel.original)
h1 h1
span Arena span(data-i18n='courses.arena')
| : span.spr :
span.spl= view.arenaLevel.name span= view.arenaLevel.name
p= view.arenaLevel.description.replace(/!\[.*?\)/, '') p= view.arenaLevel.description.replace(/!\[.*?\)/, '')
else else
a.btn.btn-lg.btn-success.disabled a.btn.btn-lg.btn-success.disabled
h1 Arena Coming Soon h1(data-i18n='courses.arena_soon_title') Arena Coming Soon
p We are working on a multiplayer arena for classrooms at the end of #{course.get('name')}. p
span.spr(data-i18n='courses.arena_soon_description')
span= course.get('name')
span .
.col-md-6 .col-md-6
if view.nextCourseInstance if view.nextCourseInstance
a.btn.btn-lg.btn-success(href="/courses/#{view.nextCourse.id}/#{view.nextCourseInstance.id}") a.btn.btn-lg.btn-success(href="/courses/#{view.nextCourse.id}/#{view.nextCourseInstance.id}")
@ -112,17 +119,17 @@ block content
else if view.nextCourse else if view.nextCourse
a.btn.btn-lg.btn-success.disabled a.btn.btn-lg.btn-success.disabled
h1= view.nextCourse.get('name') h1= view.nextCourse.get('name')
p p.text-uppercase
em NOT ENROLLED em(data-i18n='courses.not_enrolled1')
p Ask your teacher to enroll you in the next course. p(data-i18n='courses.not_enrolled2')
else else
a.btn.btn-lg.btn-success(disabled=!view.nextCourse ? "disabled" : "") a.btn.btn-lg.btn-success(disabled=!view.nextCourse ? "disabled" : "")
h1 Next Course h1(data-i18n='courses.next_course')
p p.text-uppercase
em COMING SOON em(data-i18n='courses.coming_soon1')
p We are hard at work making more courses for you! p(data-i18n='courses.coming_soon2')
.available-courses-title Available Levels .available-courses-title(data-i18n='courses.available_levels')
table.table.table-striped.table-condensed table.table.table-striped.table-condensed
thead thead
tr tr

View file

@ -19,7 +19,7 @@ block content
else if view.state === 'purchasing' else if view.state === 'purchasing'
p p
.alert.alert-info(data-i18n="courses.purchasing_course") .alert.alert-info(data-i18n="courses.purchasing_course")
else else
.well.well-lg.enroll-container .well.well-lg.enroll-container
if view.price > 0 if view.price > 0
h1.center(data-i18n="courses.buy_course") h1.center(data-i18n="courses.buy_course")

View file

@ -3,122 +3,132 @@ extends /templates/base
block content block content
h3.text-right h3.text-right
if me.isAnonymous() if me.isAnonymous()
a(href="/teachers") Teachers, click here! a(href="/teachers")
span(data-i18n="courses.teachers_click")
span !
else else
a(href="/courses/teachers") Teachers, click here! a(href="/courses/teachers")
span(data-i18n="courses.teachers_click")
span !
#main-content #main-content
if me.isAnonymous() if me.isAnonymous()
h1.text-center Adventurers, welcome to Courses! h1.text-center(data-i18n="courses.welcome_to_courses")
.text-center .text-center
p p
h3 Ready to play? h3(data-i18n="courses.ready_to_play")
p p
button#start-new-game-btn.btn.btn-default Start New Game button#start-new-game-btn.btn.btn-default(data-i18n="courses.start_new_game")
p - OR - p
span.spr -
span.text-uppercase(data-i18n="general.or")
span.spl -
p p
button#log-in-btn.btn.btn-default(data-i18n="login.log_in") button#log-in-btn.btn.btn-default(data-i18n="login.log_in")
h3#play-now-to-learn-header.text-center PLAY NOW TO LEARN h3#play-now-to-learn-header.text-center.text-uppercase(data-i18n="courses.play_now_learn_header")
ul ul
li basic syntax to control your character li(data-i18n="courses.play_now_learn_1")
li while loops to solve pesky puzzles li(data-i18n="courses.play_now_learn_2")
li strings & variables to customize actions li(data-i18n="courses.play_now_learn_3")
li how to defeat an ogre (important life skills!) li(data-i18n="courses.play_now_learn_4")
else else
- var showHOCComplete = false; - var showHOCComplete = false;
if view.hocCourseInstance if view.hocCourseInstance
- var course = view.courses.get(view.hocCourseInstance.get('courseID')); - var course = view.courses.get(view.hocCourseInstance.get('courseID'));
- var campaign = view.campaigns.get(course.get('campaignID')); - var campaign = view.campaigns.get(course.get('campaignID'));
- var stats = campaign.statsForSessions(view.hocCourseInstance.sessions); - var stats = campaign.statsForSessions(view.hocCourseInstance.sessions);
- showHOCComplete = stats.levels.done && !view.classrooms.size(); - showHOCComplete = stats.levels.done && !view.classrooms.size();
.text-center .text-center
if !showHOCComplete if !showHOCComplete
h1 Welcome to your Courses page! h1(data-i18n="courses.welcome_to_page") Welcome to your Courses page!
else else
h1 Amazing! You've completed the Hour of Code course! h1(data-i18n="courses.completed_hoc")
h2 Ready for more? Play the campaign mode! h2(data-i18n="courses.ready_for_more_header")
ul.text-left ul.text-left
li Use gems to unlock new items! li(data-i18n="courses.ready_for_more_1")
li Play through brand new worlds and challenges li(data-i18n="courses.ready_for_more_2")
li Learn even more programming! li(data-i18n="courses.ready_for_more_3")
a.btn.btn-lg.btn-success(href="/play") Play Now a.btn.btn-lg.btn-success(href="/play") Play Now
if view.hocCourseInstance && !view.classrooms.size() if view.hocCourseInstance && !view.classrooms.size()
h3 Saved Games h3(data-i18n="courses.saved_games")
hr hr
.course-instance-entry .course-instance-entry
h3 h3
span.spr Hour of Code: Course 1 span(data-i18n="courses.hoc")
span.spr :
span.spr(data-i18n="courses.course")
span 1
span.spr= (me.get('aceConfig') || {}).language === 'python' ? 'Python' : 'JavaScript' span.spr= (me.get('aceConfig') || {}).language === 'python' ? 'Python' : 'JavaScript'
small small
a#change-language-link change language a#change-language-link(data-i18n="courses.change_language")
+course-instance-body(view.hocCourseInstance) +course-instance-body(view.hocCourseInstance)
.clearfix .clearfix
else if view.classrooms.size() else if view.classrooms.size()
h3.text-uppercase My Classes h3.text-uppercase(data-i18n="courses.my_classes")
hr hr
for classroom in view.classrooms.models for classroom in view.classrooms.models
- var justAdded = classroom.id === view.classroomJustAdded; - var justAdded = classroom.id === view.classroomJustAdded;
- var classroomClass = justAdded ? 'just-added' : ''; - var classroomClass = justAdded ? 'just-added' : '';
if justAdded if justAdded
#just-added-text.text-center Class successfully added! #just-added-text.text-center(data-i18n="courses.class_added")
//- sigh //- sigh
div(class=classroomClass) div(class=classroomClass)
h3 h3
span.spr= classroom.get('name') span.spr= classroom.get('name')
span.spr (#{(classroom.get('aceConfig') || {}).language === 'python' ? 'Python' : 'JavaScript'}) span.spr (#{(classroom.get('aceConfig') || {}).language === 'python' ? 'Python' : 'JavaScript'})
a(href="/courses/"+classroom.id) view class a(href="/courses/"+classroom.id, data-i18n="courses.view_class")
- var courseInstances = view.courseInstances.where({classroomID: classroom.id}); - var courseInstances = view.courseInstances.where({classroomID: classroom.id});
for courseInstance in courseInstances for courseInstance in courseInstances
.course-instance-entry .course-instance-entry
- var course = view.courses.get(courseInstance.get('courseID')); - var course = view.courses.get(courseInstance.get('courseID'));
h3 h3
span.spr= course.get('name') span.spr= course.get('name')
small small
a(href="/courses/"+courseInstance.get('courseID')+'/'+courseInstance.id) view levels a(href="/courses/"+courseInstance.get('courseID')+'/'+courseInstance.id, data-i18n="courses.view_levels")
+course-instance-body(courseInstance) +course-instance-body(courseInstance)
.clearfix .clearfix
else else
.text-center .text-center
button#start-new-game-btn.btn.btn-success.btn-lg Start New Game button#start-new-game-btn.btn.btn-success.btn-lg(data-i18n="courses.start_new_game")
h3.text-uppercase Join A Class h3.text-uppercase(data-i18n="courses.join_class")
hr hr
form#join-class-form.form-inline form#join-class-form.form-inline
.help-block .help-block
em Ask your teacher if you have a CodeCombat class code! If so, enter it below: em(data-i18n="courses.ask_teacher_for_code")
.form-group .form-group
input#class-code-input.form-control(placeholder="<Enter Class Code>", value=view.classCode) input#class-code-input.form-control(data-i18n="[placeholder]courses.enter_c_code", placeholder="<Enter Class Code>", value=view.classCode)
input#join-class-button.btn.btn-default(type="submit" value="Join") input#join-class-button.btn.btn-default(type="submit", data-i18n="[value]courses.join", value="Join")
if view.state === 'enrolling' if view.state === 'enrolling'
.progress.progress-striped.active .progress.progress-striped.active
.progress-bar(style="width: 100%") Joining class .progress-bar(style="width: 100%", data-i18n="courses.joining") Joining class
if view.errorMessage if view.errorMessage
.alert.alert-danger= view.errorMessage .alert.alert-danger= view.errorMessage
#begin-hoc-area.hide #begin-hoc-area.hide
h3.text-center(data-i18n="common.loading") h3.text-center(data-i18n="common.loading")
.progress.progress-striped.active .progress.progress-striped.active
.progress-bar(style="width: 100%") .progress-bar(style="width: 100%")
mixin course-instance-body(courseInstance) mixin course-instance-body(courseInstance)
- var course = view.courses.get(courseInstance.get('courseID')); - var course = view.courses.get(courseInstance.get('courseID'));
- var campaign = view.campaigns.get(course.get('campaignID')); - var campaign = view.campaigns.get(course.get('campaignID'));
@ -126,39 +136,38 @@ mixin course-instance-body(courseInstance)
if stats.levels.done if stats.levels.done
.text-success .text-success
span.glyphicon.glyphicon-ok span.glyphicon.glyphicon-ok
span.spl Course Complete! span.spl(data-i18n="courses.course_complete")
span !
.pull-right .pull-right
if stats.levels.done if stats.levels.done
- var arenaLevel = stats.levels.arena; - var arenaLevel = stats.levels.arena;
if arenaLevel if arenaLevel
- var arenaURL = "/play/ladder/"+arenaLevel.slug+"/course/"+courseInstance.id; - var arenaURL = "/play/ladder/"+arenaLevel.slug+"/course/"+courseInstance.id;
a.btn.btn-warning.btn-lg(href=arenaURL) a.btn.btn-warning.btn-lg(href=arenaURL)
| Play Arena span(data-i18n="courses.play_arena")
else else
a.btn.btn-default.btn-lg(disabled=true) Course Complete a.btn.btn-default.btn-lg(disabled=true, data-i18n="courses.course_complete")
else if courseInstance.sessions.size() else if courseInstance.sessions.size()
- var lastLevel = stats.levels.lastPlayed; - var lastLevel = stats.levels.lastPlayed;
- var levelURL = "/play/level/"+lastLevel.slug+"?course="+courseInstance.get('courseID')+"&course-instance="+courseInstance.id; - var levelURL = "/play/level/"+lastLevel.slug+"?course="+courseInstance.get('courseID')+"&course-instance="+courseInstance.id;
a.btn.btn-success.btn-lg(href=levelURL) a.btn.btn-success.btn-lg(href=levelURL)
| Continue span(data-i18n="common.continue")
else else
- var firstLevel = stats.levels.first; - var firstLevel = stats.levels.first;
- var levelURL = "/play/level/"+firstLevel.slug+"?course="+courseInstance.get('courseID')+"&course-instance="+courseInstance.id; - var levelURL = "/play/level/"+firstLevel.slug+"?course="+courseInstance.get('courseID')+"&course-instance="+courseInstance.id;
a.btn.btn-info.btn-lg(href=levelURL) a.btn.btn-info.btn-lg(href=levelURL)
| Start span(data-i18n="courses.start")
div div
span Playtime span(data-i18n="clans.playtime")
span.spr : span.spr :
span= moment.duration(stats.playtime, 'seconds').humanize() span= moment.duration(stats.playtime, 'seconds').humanize()
if stats.levels.lastPlayed if stats.levels.lastPlayed
div div
span Last Level span(data-i18n="courses.last_level")
span.spr : span.spr :
span= stats.levels.lastPlayed.name span= stats.levels.lastPlayed.name
.progress .progress
.progress-bar(style="width:"+stats.levels.pctDone)= stats.levels.pctDone .progress-bar(style="width:"+stats.levels.pctDone)= stats.levels.pctDone

View file

@ -3,51 +3,59 @@ extends /templates/base
block content block content
.pull-right .pull-right
if me.isAnonymous() if me.isAnonymous()
a(href="/teachers") Teachers, click here! a(href="/teachers")
span(data-i18n="courses.teachers_click")
span !
else else
a(href="/courses/teachers") Teachers, click here! a(href="/courses/teachers")
span(data-i18n="courses.teachers_click")
span !
br br
h1.text-center Adventurers, welcome to our Hour of Code! h1.text-center(data-i18n="courses.welcome_to_hoc")
#main-content #main-content
.well.text-center .well.text-center
if !me.isAnonymous() if !me.isAnonymous()
p p
strong.spr Logged in as: strong.spr(data-i18n="courses.logged_in_as")
strong= me.get('name') || me.get('email') strong= me.get('name') || me.get('email')
p p
span.spr Not you? span.spr(data-i18n="courses.not_you")
a#log-out-link Logout a#log-out-link(data-i18n="login.logout")
hr hr
if !view.lastLevel if !view.lastLevel
p p
strong Ready to play? strong(data-i18n="courses.ready_to_play")
p p
button#start-new-game-btn.btn.btn-success.btn-lg Start New Game button#start-new-game-btn.btn.btn-success.btn-lg(data-i18n="courses.start_new_game")
else else
p p
strong Hi adventurer, welcome back! strong(data-i18n="courses.welcome_back")
p p
button#continue-playing-btn.btn.btn-success.btn-lg Continue Playing button#continue-playing-btn.btn.btn-success.btn-lg(data-i18n="courses.continue_playing")
p p
em.spr em.spr
span.spr Last Played: span(data-i18n="clans.last_played")
span.spr :
span= view.lastLevel.get('name').replace('Course :', '') span= view.lastLevel.get('name').replace('Course :', '')
if me.isAnonymous() if me.isAnonymous()
p p
strong More options: strong(data-i18n="courses.more_options")
p p
button#start-new-game-btn.btn.btn-default.btn-lg Start New Game button#start-new-game-btn.btn.btn-default.btn-lg(data-i18n="courses.start_new_game")
if me.isAnonymous() if me.isAnonymous()
p - OR - p
span.spr -
span.text-uppercase(data-i18n="general.or")
span.spl -
p p
button#log-in-btn.btn.btn-default.btn-lg(data-i18n="login.log_in") button#log-in-btn.btn.btn-default.btn-lg(data-i18n="login.log_in")
@ -58,9 +66,9 @@ block content
.progress-bar(style="width: 100%") .progress-bar(style="width: 100%")
h3.text-center PLAY NOW TO LEARN h3.text-center.text-uppercase(data-i18n="courses.play_now_learn_header")
ul ul
li basic syntax to control your character li(data-i18n="courses.play_now_learn_1")
li while loops to solve pesky puzzles li(data-i18n="courses.play_now_learn_2")
li strings & variables to customize actions li(data-i18n="courses.play_now_learn_3")
li how to defeat an ogre (important life skills!) li(data-i18n="courses.play_now_learn_4")

View file

@ -1,13 +1,12 @@
extends /templates/core/modal-base extends /templates/core/modal-base
block modal-header-content block modal-header-content
h2 Add Students h2(data-i18n="courses.add_students")
h3= view.classroom.get('name') h3= view.classroom.get('name')
block modal-body-content block modal-body-content
h3 Option 1: Invite students via email h3(data-i18n="courses.option1_header")
p Students will automatically be sent an invitation to join this class, and will p(data-i18n="courses.option1_body")
| need to create an account with a username and password.
.form .form
.form-group .form-group
textarea#invite-emails-textarea.form-control textarea#invite-emails-textarea.form-control
@ -17,9 +16,9 @@ block modal-body-content
#invite-emails-sending-alert.alert.alert-info.hide(data-i18n="common.sending") #invite-emails-sending-alert.alert.alert-info.hide(data-i18n="common.sending")
#invite-emails-success-alert.alert.alert-success.hide(data-i18n="play_level.done") #invite-emails-success-alert.alert.alert-success.hide(data-i18n="play_level.done")
h3 Option 2: Send URL to your students h3(data-i18n="courses.option2_header")
p Students will be asked to enter an email address, username and password to create an account. p(data-i18n="courses.option2_body")
.row .row
.col-sm-9 .col-sm-9
input.form-control#join-url-input(value=view.joinURL) input.form-control#join-url-input(value=view.joinURL)
@ -27,10 +26,9 @@ block modal-body-content
button#copy-url-btn.btn.btn-fixed.btn-default.text-uppercase Copy URL button#copy-url-btn.btn.btn-fixed.btn-default.text-uppercase Copy URL
#copied-alert.alert.alert-info.hide Copied #copied-alert.alert.alert-info.hide Copied
#copy-failed-alert.alert.alert-danger.hide Error copying #copy-failed-alert.alert.alert-danger.hide Error copying
h3 Option 3: Direct students to codecombat.com/courses h3(data-i18n="courses.option3_header")
p Give students the following passcode to enter along with an email address, p(data-i18n="courses.option3_body")
| username and password when they create an account.
.text-center .text-center
#class-code-well.well= view.classCode #class-code-well.well= view.classCode

View file

@ -3,22 +3,25 @@ extends /templates/base
block content block content
if view.state === 'purchasing' if view.state === 'purchasing'
p.text-center Purchasing... p.text-center(data-i18n="buy_gems.purchasing")
.progress.progress-striped.active .progress.progress-striped.active
.progress-bar(style="width: 100%") .progress-bar(style="width: 100%")
else if view.state === 'purchased' else if view.state === 'purchased'
p Thank you for your purchase! You can now assign #{view.numberOfStudents} more students to paid courses. p
span.spr(data-i18n="courses.thank_you_pref")
span= view.numberOfStudents
span.spl(data-i18n="courses.thank_you_suff")
p.text-center p.text-center
if view.fromClassroom if view.fromClassroom
a(href="/courses/"+view.fromClassroom) Return to classroom a(href="/courses/"+view.fromClassroom, data-i18n="courses.return_to_class")
else else
a(href="/courses/teachers") Return to course management. a(href="/courses/teachers", data-i18n="courses.return_to_course_man")
else else
h2.text-center Purchase Enrollments h2.text-center(data-i18n="courses.purchase_enrollments")
br br
if view.state === 'error' if view.state === 'error'
@ -30,21 +33,21 @@ block content
.row .row
.col-md-4 .col-md-4
.col-md-3 .col-md-3
strong.uppercase unused paid enrollments strong.uppercase(data-i18n="courses.you_have2")
.col-md-1 .col-md-1
strong= remainingEnrollments strong= remainingEnrollments
br br
.row .row
.col-md-4 .col-md-4
.col-md-3 .col-md-3
strong.uppercase students not enrolled strong.uppercase(data-i18n="courses.students_not_enrolled")
.row .row
.col-md-4 .col-md-4
.col-md-3 .col-md-3
each classroom in view.classrooms.models each classroom in view.classrooms.models
if classroom.get('members').length > 0 if classroom.get('members').length > 0
.not-enrolled= classroom.get('name') .not-enrolled= classroom.get('name')
.not-enrolled Total Across All Classes .not-enrolled(data-i18n="courses.total_all_classes")
.col-md-1 .col-md-1
- var totalNotEnrolled = 0 - var totalNotEnrolled = 0
each classroom in view.classrooms.models each classroom in view.classrooms.models
@ -58,7 +61,7 @@ block content
br br
p.text-center p.text-center
strong How many additional paid enrollments do you need? strong(data-i18n="courses.how_many_enrollments")
br br
p.text-center p.text-center
@ -70,13 +73,16 @@ block content
.container-fluid .container-fluid
.row .row
.col-md-offset-3.col-md-6 .col-md-offset-3.col-md-6
| Each student in a class will get access to Courses 2-4 once they are enrolled in paid courses. span(data-i18n="courses.each_student_access")
| You may assign each course to each student individually.
br br
p.text-center#price-form-group p.text-center#price-form-group
strong Total: #{view.numberOfStudents} enrollments x $#{view.pricePerStudent.toFixed(2)} = #{view.getPriceString()} strong
span(data-i18n="account_prepaid.purchase_total")
span.spr : #{view.numberOfStudents}
span(data-i18n="courses.enrollments")
span.spl x $#{view.pricePerStudent.toFixed(2)} = #{view.getPriceString()}
p.text-center p.text-center
button#purchase-btn.btn.btn-lg.btn-success.uppercase Purchase Now button#purchase-btn.btn.btn-lg.btn-success.uppercase(data-i18n="courses.purchase_now")

View file

@ -2,26 +2,25 @@ extends /templates/core/modal-base
block modal-header-content block modal-header-content
.text-center .text-center
h3.modal-title Remove Student h3.modal-title(data-i18n="courses.remove_student1")
span.glyphicon.glyphicon-warning-sign.text-danger span.glyphicon.glyphicon-warning-sign.text-danger
h3 Are you sure you want to remove this student from this class? h3(data-i18n="courses.are_you_sure")
block modal-body-content block modal-body-content
p.text-center p.text-center
| Student will lose access to this classroom and assigned classes. span(data-i18n="courses.remove_description1")
| Progress and gameplay is NOT lost, and the student can be added back to the classroom at any time.
if view.user.get('coursePrepaidID') if view.user.get('coursePrepaidID')
| The activated paid license will not be returned. span(data-i18n="courses.remove_description2")
block modal-footer-content block modal-footer-content
#remove-student-buttons.text-center #remove-student-buttons.text-center
p p
button.btn.btn-lg.btn-success.text-uppercase(data-dismiss="modal") Keep Student button.btn.btn-lg.btn-success.text-uppercase(data-dismiss="modal", data-i18n="courses.keep_student")
p - OR - p - OR -
p p
button#remove-student-btn.btn.btn-lg.btn-default.text-uppercase Remove Student button#remove-student-btn.btn.btn-lg.btn-default.text-uppercase(data-i18n="courses.remove_student1")
#remove-student-progress.text-center.hide #remove-student-progress.text-center.hide
.progress .progress
.progress-bar .progress-bar
p.text-info Removing user p.text-info(data-i18n="courses.removing_user")

View file

@ -2,46 +2,50 @@ extends /templates/base
block content block content
p To join a class, ask your teacher for an unlock code. p(data-i18n="courses.to_join_ask")
#join-classroom-form.form-horizontal #join-classroom-form.form-horizontal
.form-group .form-group
.col-sm-2 .col-sm-2
button#join-class-btn.btn.btn-default.btn-block(disabled=view.state==='enrolling') Join Class button#join-class-btn.btn.btn-default.btn-block(disabled=view.state==='enrolling', data-i18n="courses.join_class")
.col-sm-6 .col-sm-6
input#classroom-code-input.form-control( input#classroom-code-input.form-control(
data-i18n="[placeholder]courses.enter_here",
placeholder='<enter unlock code here>', placeholder='<enter unlock code here>',
value=view.classCode, value=view.classCode,
disabled=view.state==='enrolling') disabled=view.state==='enrolling')
if view.state === 'enrolling' if view.state === 'enrolling'
.progress.progress-striped.active .progress.progress-striped.active
.progress-bar(style="width: 100%") Joining class .progress-bar(style="width: 100%", data-i18n="courses.joining")
if view.state === 'unknown_error' if view.state === 'unknown_error'
.alert.alert-danger= view.stateMessage .alert.alert-danger= view.stateMessage
- var justJoinedCourseInstance = view.courseInstances.find(function(ci) { return ci.justJoined; }); - var justJoinedCourseInstance = view.courseInstances.find(function(ci) { return ci.justJoined; });
if justJoinedCourseInstance if justJoinedCourseInstance
- var course = view.courses.get(justJoinedCourseInstance.get('courseID')); - var course = view.courses.get(justJoinedCourseInstance.get('courseID'));
- var classroom = view.classrooms.get(justJoinedCourseInstance.get('classroomID')); - var classroom = view.classrooms.get(justJoinedCourseInstance.get('classroomID'));
if course && classroom if course && classroom
.alert.alert-info .alert.alert-info
span.spr Successfully joined "#{classroom.get('name')}"! span.spr(data-i18n="courses.successfully_joined")
a(href="/courses/#{course.id}/#{justJoinedCourseInstance.id}") span.spr "#{classroom.get('name')}"!
strong Click here to start taking "#{course.get('name')}". a(href="/courses/#{course.id}/#{justJoinedCourseInstance.id}")
strong
span.spr(data-i18n="courses.click_to_start")
span "#{course.get('name')}".
.panel.panel-default .panel.panel-default
.panel-heading .panel-heading
.panel-title My Courses .panel-title(data-i18n="courses.my_courses")
.list-group .list-group
.list-group-item .list-group-item
.row .row
.col-sm-3 .col-sm-3
strong Classroom strong(data-i18n="courses.classroom")
.col-sm-3 .col-sm-3
strong Course strong(data-i18n="courses.course")
for courseInstance in view.courseInstances.models for courseInstance in view.courseInstances.models
- var classroom = view.classrooms.get(courseInstance.get('classroomID')) - var classroom = view.classrooms.get(courseInstance.get('classroomID'))
- var course = view.courses.get(courseInstance.get('courseID')) - var course = view.courses.get(courseInstance.get('courseID'))
@ -57,14 +61,14 @@ block content
if course if course
| #{course.get('name')} | #{course.get('name')}
.col-sm-6 .col-sm-6
a.btn.btn-default.btn-sm(href="/courses/#{course.id}/#{courseInstance.id}") Enter a.btn.btn-default.btn-sm(href="/courses/#{course.id}/#{courseInstance.id}", data-i18n="courses.enter")
.panel.panel-default .panel.panel-default
.panel-heading .panel-heading
.panel-title My Classes .panel-title(data-i18n="courses.my_classes")
.list-group .list-group
for classroom in view.classrooms.models for classroom in view.classrooms.models
.list-group-item .list-group-item
.row .row
.col-sm-3= classroom.get('name') .col-sm-3= classroom.get('name')
.col-sm-9= classroom.get('description') .col-sm-9= classroom.get('description')

View file

@ -2,12 +2,12 @@ extends /templates/core/modal-base
block modal-header-content block modal-header-content
.clearfix .clearfix
block modal-body-content block modal-body-content
.text-center .text-center
h2.modal-title(data-i18n="login.log_in") h2.modal-title(data-i18n="login.log_in")
form.form form.form
.form-group .form-group
label.control-label(for="email") label.control-label(for="email")
@ -15,9 +15,9 @@ block modal-body-content
input#email.input-large.form-control(name="email", type="email") input#email.input-large.form-control(name="email", type="email")
.form-group .form-group
label.control-label(for="password") label.control-label(for="password")
span(data-i18n="general.password") Password span(data-i18n="general.password")
input#password.input-large.form-control(name="password", type="password") input#password.input-large.form-control(name="password", type="password")
#errors-alert.alert.alert-danger.hide #errors-alert.alert.alert-danger.hide
.text-center .text-center
@ -25,6 +25,6 @@ block modal-body-content
p p
a#create-new-account-link(data-i18n="login.signup_switch") a#create-new-account-link(data-i18n="login.signup_switch")
p p
a(data-toggle="coco-modal", data-target="core/RecoverModal", data-i18n="login.forgot_password") Forgot your password? a(data-toggle="coco-modal", data-target="core/RecoverModal", data-i18n="login.forgot_password")
block modal-footer-content block modal-footer-content

View file

@ -2,50 +2,50 @@ extends /templates/core/modal-base
block modal-header-content block modal-header-content
.clearfix .clearfix
block modal-body-content block modal-body-content
.text-center .text-center
h2.modal-title(data-i18n="signup.sign_up") h2.modal-title(data-i18n="signup.sign_up")
form.form form.form
.form-group .form-group
label.control-label(for="email") label.control-label(for="email")
span(data-i18n="general.email") span(data-i18n="general.email")
input#email.input-large.form-control(name="email", type="email") input#email.input-large.form-control(name="email", type="email")
.help-block use your school email if you have one .help-block(data-i18n="courses.use_school_email")
.form-group .form-group
label.control-label(for="name") label.control-label(for="name")
span(data-i18n="general.name") Name span(data-i18n="general.name")
if me.get('name') if me.get('name')
input#name.input-large.form-control(name="name", type="text", value="#{me.get('name')}") input#name.input-large.form-control(name="name", type="text", value="#{me.get('name')}")
else else
input#name.input-large.form-control(name="name", type="text", value="", placeholder="e.g. Alex W the Skater") input#name.input-large.form-control(name="name", type="text", value="", placeholder="e.g. Alex W the Skater")
.help-block a unique name no one has chosen .help-block(data-i18n="courses.unique_name")
.form-group .form-group
label.control-label(for="password") label.control-label(for="password")
span(data-i18n="general.password") Password span(data-i18n="general.password")
input#password.input-large.form-control(name="password", type="password") input#password.input-large.form-control(name="password", type="password")
.help-block pick something you can remember .help-block(data-i18n="courses.pick_something")
.form-group .form-group
label.control-label(for="class-code-input") label.control-label(for="class-code-input")
span Class Code span(data-i18n="courses.class_code")
input#class-code-input.input-large.form-control(name="classCode", value=view.classCode) input#class-code-input.input-large.form-control(name="classCode", value=view.classCode)
.help-block optional - ask your teacher to give you one! .help-block(data-i18n="courses.optional_ask")
.form-group .form-group
label.control-label(for="school-input") label.control-label(for="school-input")
span(data-i18n="signup.school_name") School Name and City span(data-i18n="signup.school_name")
input#school-input.input-large.form-control(name="schoolName", data-i18n="[placeholder]signup.school_name_placeholder") input#school-input.input-large.form-control(name="schoolName", data-i18n="[placeholder]signup.school_name_placeholder")
.help-block optional - what school do you go to? .help-block(data-i18n="courses.optional_school")
#errors-alert.alert.alert-danger.hide #errors-alert.alert.alert-danger.hide
.text-center .text-center
if view.willPlay if view.willPlay
input#sign-up-btn.btn.btn-default(type="submit", value="Start Playing") input#sign-up-btn.btn.btn-default(type="submit", data-i18n="[value]courses.start_playing", value="Start Playing")
p p
a#skip-link Skip this, I'll create an account later! a#skip-link(data-i18n="courses.skip_this")
else else
input#sign-up-btn.btn.btn-default(data-i18n="[value]signup.sign_up", type="submit") input#sign-up-btn.btn.btn-default(data-i18n="[value]signup.sign_up", type="submit")
block modal-footer-content block modal-footer-content

View file

@ -4,9 +4,13 @@ block content
.text-center .text-center
if me.isAnonymous() || !me.get('name') if me.isAnonymous() || !me.get('name')
.welcome Welcome! .welcome
span(data-i18n="courses.welcome")
span !
else else
.welcome Welcome, #{me.get('name')}! .welcome
span(data-i18n="courses.welcome")
span , #{me.get('name')}!
.container-fluid .container-fluid
.row .row
@ -14,58 +18,55 @@ block content
.col-md-8 .col-md-8
.well .well
.text-center .text-center
strong.uppercase Getting Started with Courses strong.uppercase(data-i18n="courses.getting_started")
br br
.text-center .text-center
a.btn.btn-info(href='http://codecombat.com/docs/CodeCombatHourofCodeGettingStartedGuide.pdf') Download Getting Started Guide [PDF] a.btn.btn-info(href='http://codecombat.com/docs/CodeCombatHourofCodeGettingStartedGuide.pdf', data-i18n="courses.download_getting_started")
br br
ol ol
li Create a new class by clicking the green "Create New Class" button below. li(data-i18n="courses.getting_started_1")
li Once you've created a class, click the blue "Add Students" button. li(data-i18n="courses.getting_started_2")
li You'll see student's progress below as they sign up and join your class. li(data-i18n="courses.getting_started_3")
br br
.text-center .text-center
strong Additional Resources strong(data-i18n="courses.addicional_resources")
ul ul
li li
span.spr Download/print our span.spr(data-i18n="courses.addicional_resources_1_pref")
a.spr(href='http://codecombat.com/docs/CodeCombatTeacherGuideCourse1.pdf') Course 1 Teacher's Guide a(href='http://codecombat.com/docs/CodeCombatTeacherGuideCourse1.pdf', data-i18n="courses.addicional_resources_1_mid")
span for explanations and solutions to each level. span.spl(data-i18n="courses.addicional_resources_1_suff")
li li
span.spr Complete our span.spr(data-i18n="courses.addicional_resources_2_pref")
a.spr(href='/teachers/freetrial') Teacher Survey a(href='/teachers/freetrial', data-i18n="teachers_survey.title")
span to get 15 more hours of content for FREE for 2 months. span.spl(data-i18n="courses.addicional_resources_2_suff")
li li
span.spr Visit our span.spr(data-i18n="courses.addicional_resources_3_pref")
a.spr(href='http://discourse.codecombat.com/c/teachers') Teacher Forums a(href='http://discourse.codecombat.com/c/teachers', data-i18n="courses.addicional_resources_3_mid")
span to connect to fellow educators who are using CodeCombat. span.spl(data-i18n="courses.addicional_resources_3_suff")
.section-header Your Classes .section-header(data-i18n="courses.your_classes")
if view.classrooms.models.length > 0 if view.classrooms.models.length > 0
.container-fluid .container-fluid
each classroom in view.classrooms.models each classroom in view.classrooms.models
+classroom(classroom) +classroom(classroom)
else else
.no-students No classes yet! .no-students(data-i18n="courses.no_classes")
.text-center .text-center
button.btn.btn-lg.btn-success.uppercase.create-new-class create new class button.btn.btn-lg.btn-success.uppercase.create-new-class(data-i18n="courses.create_new_class1")
br br
.section-header Available Courses .section-header(data-i18n="courses.available_courses")
if !me.isAnonymous() if !me.isAnonymous()
p.text-center p.text-center
strong.spr Unused enrollments available: strong.spr(data-i18n="courses.unused_enrollments")
strong.spr= view.prepaids.totalAvailable() strong.spr= view.prepaids.totalAvailable()
a.btn.btn-success.btn(href="/courses/purchase") Purchase Enrollments a.btn.btn-success.btn(href="/courses/purchase", data-i18n="courses.purchase_enrollments")
p p(data-i18n="courses.students_access")
| All students get access to Introduction to Computer Science for free.
| One enrollment per student is required to assign them to paid CodeCombat courses.
| A single student does not need multiple enrollments to access all paid courses.
.container-fluid .container-fluid
- var courses = view.courses.models; - var courses = view.courses.models;
- var i = 0; - var i = 0;
@ -95,7 +96,7 @@ mixin classroom(classroom)
else else
span.spr.class-name (Python) span.spr.class-name (Python)
a.edit-classroom-small(data-i18n="courses.edit_settings", data-classroom-id="#{classroom.id}") a.edit-classroom-small(data-i18n="courses.edit_settings", data-classroom-id="#{classroom.id}")
.active-courses active courses .active-courses(data-i18n="courses.active_courses")
- var courseInstances = view.courseInstances.where({classroomID: classroom.id}); - var courseInstances = view.courseInstances.where({classroomID: classroom.id});
each courseInstance in courseInstances each courseInstance in courseInstances
+course(courseInstance, classMemberCount) +course(courseInstance, classMemberCount)
@ -108,15 +109,15 @@ mixin classroom(classroom)
else else
span.spr.class-name (Python) span.spr.class-name (Python)
a.edit-classroom-small(data-i18n="courses.edit_settings", data-classroom-id="#{classroom.id}") a.edit-classroom-small(data-i18n="courses.edit_settings", data-classroom-id="#{classroom.id}")
.no-students No students yet! .no-students(data-i18n="courses.no_students")
.text-center .text-center
button.btn.btn-info.uppercase.btn-add-students(data-classroom-id="#{classroom.id}") add students button.btn.btn-info.uppercase.btn-add-students(data-classroom-id="#{classroom.id}", data-i18n="courses.add_students1")
br br
if classMemberCount > 0 if classMemberCount > 0
.col-md-4.text-center .col-md-4.text-center
.class-count= classMemberCount .class-count= classMemberCount
.active-courses(style='margin:6px;') students .active-courses(style='margin:6px;', data-i18n="courses.students1")
a.btn.btn-info.uppercase(href='/courses/#{classroom.id}') view/edit a.btn.btn-info.uppercase(href='/courses/#{classroom.id}', data-i18n="courses.view_edit")
.row .row
.col-md-12 .col-md-12
.divider .divider
@ -127,7 +128,9 @@ mixin course(courseInstance, classMemberCount)
- var course = view.courses.get(courseInstance.get('courseID')); - var course = view.courses.get(courseInstance.get('courseID'));
p p
.course-name= course.get('name') .course-name= course.get('name')
.course-enrolled #{courseMemberCount} / #{classMemberCount} students enrolled .course-enrolled
span #{courseMemberCount} / #{classMemberCount}
span.spl(data-i18n="courses.students_enrolled")
each concept in course.get('concepts') each concept in course.get('concepts')
span.spr.course-concept(data-i18n="concepts." + concept) span.spr.course-concept(data-i18n="concepts." + concept)
@ -138,11 +141,14 @@ mixin course-info(course)
span.spr.course-name= course.get('name') span.spr.course-name= course.get('name')
p= course.get('description') p= course.get('description')
p p
strong.spr Concepts: strong
span(data-i18n="courses.concepts")
span.spr :
each concept in course.get('concepts') each concept in course.get('concepts')
span(data-i18n="concepts." + concept) span(data-i18n="concepts." + concept)
if course.get('concepts').indexOf(concept) !== course.get('concepts').length - 1 if course.get('concepts').indexOf(concept) !== course.get('concepts').length - 1
span.spr , span.spr ,
p p
strong.spr Length: strong.spr(data-i18n="courses.length")
span #{course.get('duration') || 0} hours span= course.get('duration') || 0
span.spl(data-i18n="units.hours")

View file

@ -121,7 +121,7 @@ block modal-footer-content
else if level.get('type') === 'hero-ladder' else if level.get('type') === 'hero-ladder'
button.btn.btn-illustrated.btn-primary.btn-lg.return-to-ladder-button(data-href="/play/ladder/#{level.get('slug')}#my-matches", data-dismiss="modal", data-i18n="play_level.victory_return_to_ladder") Return to Ladder button.btn.btn-illustrated.btn-primary.btn-lg.return-to-ladder-button(data-href="/play/ladder/#{level.get('slug')}#my-matches", data-dismiss="modal", data-i18n="play_level.victory_return_to_ladder") Return to Ladder
else else
button.btn.btn-illustrated.btn-success.btn-lg.world-map-button.next-level-button.hide#continue-button(data-i18n="play_level.victory_play_continue") Continue button.btn.btn-illustrated.btn-success.btn-lg.world-map-button.next-level-button.hide#continue-button(data-i18n="common.continue") Continue
if !me.get('anonymous') && !showHourOfCodeDoneButton && showLeaderboard if !me.get('anonymous') && !showHourOfCodeDoneButton && showLeaderboard
button.btn.btn-illustrated.btn-success.leaderboard-button.btn-lg(data-dismiss="modal", data-i18n="leaderboard.view_other_solutions") View Other Solutions button.btn.btn-illustrated.btn-success.leaderboard-button.btn-lg(data-dismiss="modal", data-i18n="leaderboard.view_other_solutions") View Other Solutions

View file

@ -7,11 +7,11 @@ User = require 'models/User'
module.exports = class ActivateLicensesModal extends ModalView module.exports = class ActivateLicensesModal extends ModalView
id: 'activate-licenses-modal' id: 'activate-licenses-modal'
template: template template: template
events: events:
'change input': 'updateSelectionSpans' 'change input': 'updateSelectionSpans'
'submit form': 'onSubmitForm' 'submit form': 'onSubmitForm'
initialize: (options) -> initialize: (options) ->
@classroom = options.classroom @classroom = options.classroom
@users = options.users @users = options.users
@ -20,7 +20,7 @@ module.exports = class ActivateLicensesModal extends ModalView
@prepaids.comparator = '_id' @prepaids.comparator = '_id'
@prepaids.fetchByCreator(me.id) @prepaids.fetchByCreator(me.id)
@supermodel.loadCollection(@prepaids, 'prepaids') @supermodel.loadCollection(@prepaids, 'prepaids')
afterRender: -> afterRender: ->
super() super()
@updateSelectionSpans() @updateSelectionSpans()
@ -38,11 +38,11 @@ module.exports = class ActivateLicensesModal extends ModalView
@$('#not-depleted-span').toggleClass('hide', depleted) @$('#not-depleted-span').toggleClass('hide', depleted)
@$('#depleted-span').toggleClass('hide', !depleted) @$('#depleted-span').toggleClass('hide', !depleted)
@$('#activate-licenses-btn').toggleClass('disabled', depleted).toggleClass('btn-success', not depleted).toggleClass('btn-default', depleted) @$('#activate-licenses-btn').toggleClass('disabled', depleted).toggleClass('btn-success', not depleted).toggleClass('btn-default', depleted)
showProgress: -> showProgress: ->
@$('#submit-form-area').addClass('hide') @$('#submit-form-area').addClass('hide')
@$('#progress-area').removeClass('hide') @$('#progress-area').removeClass('hide')
hideProgress: -> hideProgress: ->
@$('#submit-form-area').removeClass('hide') @$('#submit-form-area').removeClass('hide')
@$('#progress-area').addClass('hide') @$('#progress-area').addClass('hide')
@ -91,5 +91,5 @@ module.exports = class ActivateLicensesModal extends ModalView
@$('#error-alert').text(message).removeClass('hide') @$('#error-alert').text(message).removeClass('hide')
}) })
finishRedeemUsers: -> finishRedeemUsers: ->
@trigger 'redeem-users' @trigger 'redeem-users'

View file

@ -79,7 +79,7 @@ module.exports = class CourseEnrollView extends RootView
onChangeCourse: (e) -> onChangeCourse: (e) ->
@selectedCourse = _.find @courses.models, (a) -> a.id is $(e.target).val() @selectedCourse = _.find @courses.models, (a) -> a.id is $(e.target).val()
@renderNewPrice() @renderNewPrice()
onChangeProgrammingLanguageSelect: (e) -> onChangeProgrammingLanguageSelect: (e) ->
@selectedLanguage = @$('#programming-language-select').val() @selectedLanguage = @$('#programming-language-select').val()
@ -99,7 +99,7 @@ module.exports = class CourseEnrollView extends RootView
token: token token: token
timestamp: new Date().getTime() timestamp: new Date().getTime()
aceConfig: { language: @selectedLanguage } aceConfig: { language: @selectedLanguage }
data.courseID = @selectedCourse.id if @selectedCourse data.courseID = @selectedCourse.id if @selectedCourse
jqxhr = $.post('/db/course_instance/-/create', data) jqxhr = $.post('/db/course_instance/-/create', data)
jqxhr.done (data, textStatus, jqXHR) => jqxhr.done (data, textStatus, jqXHR) =>

View file

@ -4,7 +4,7 @@ template = require 'templates/courses/remove-student-modal'
module.exports = class RemoveStudentModal extends ModalView module.exports = class RemoveStudentModal extends ModalView
id: 'remove-student-modal' id: 'remove-student-modal'
template: template template: template
events: events:
'click #remove-student-btn': 'onClickRemoveStudentButton' 'click #remove-student-btn': 'onClickRemoveStudentButton'
@ -33,5 +33,4 @@ module.exports = class RemoveStudentModal extends ModalView
pct = (100 * (@totalJobs - @toRemove.length) / @totalJobs).toFixed(1) + '%' pct = (100 * (@totalJobs - @toRemove.length) / @totalJobs).toFixed(1) + '%'
@$('#remove-student-progress .progress-bar').css('width', pct) @$('#remove-student-progress .progress-bar').css('width', pct)
@listenToOnce model, 'sync', -> @listenToOnce model, 'sync', ->
@removeStudent() @removeStudent()

View file

@ -66,7 +66,7 @@ module.exports = class LevelDialogueView extends CocoView
group.append(button) group.append(button)
response.button = $('button:last', group) response.button = $('button:last', group)
else else
s = $.i18n.t('play_level.hud_continue_short', defaultValue: 'Continue') s = $.i18n.t('common.continue', defaultValue: 'Continue')
sk = $.i18n.t('play_level.skip_tutorial', defaultValue: 'skip: esc') sk = $.i18n.t('play_level.skip_tutorial', defaultValue: 'skip: esc')
if not @escapePressed and not @isFullScreen() if not @escapePressed and not @isFullScreen()
group.append('<span class="hud-hint">' + sk + '</span>') group.append('<span class="hud-hint">' + sk + '</span>')