mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-13 14:43:37 -04:00
Courses i18n
Also, removed duplicated 'Continue' string
This commit is contained in:
parent
78548b550f
commit
e284ec7959
22 changed files with 497 additions and 315 deletions
|
@ -259,7 +259,6 @@
|
|||
victory_sign_up_poke: "Want to save your code? Create a free account!"
|
||||
victory_rate_the_level: "How fun was this level?"
|
||||
victory_return_to_ladder: "Return to Ladder"
|
||||
victory_play_continue: "Continue"
|
||||
victory_saving_progress: "Saving Progress"
|
||||
victory_go_home: "Go Home"
|
||||
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_become_a_viking: "Become a Viking"
|
||||
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_running: "Running"
|
||||
tome_cast_button_ran: "Ran"
|
||||
|
@ -286,7 +282,6 @@
|
|||
tome_available_spells: "Available Spells"
|
||||
tome_your_skills: "Your Skills"
|
||||
tome_current_method: "Current Method"
|
||||
hud_continue_short: "Continue"
|
||||
code_saved: "Code Saved"
|
||||
skip_tutorial: "Skip (esc)"
|
||||
keyboard_shortcuts: "Key Shortcuts"
|
||||
|
@ -905,7 +900,6 @@
|
|||
concepts_covered: "Concepts Covered"
|
||||
students: "Students"
|
||||
students1: "students"
|
||||
expand_details: "Expand details"
|
||||
concepts: "Concepts"
|
||||
levels: "levels"
|
||||
played: "Played"
|
||||
|
@ -939,12 +933,6 @@
|
|||
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"
|
||||
|
@ -965,6 +953,149 @@
|
|||
topics: "Topics"
|
||||
hours_content: "Hours of content:"
|
||||
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: "You’re 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:
|
||||
archmage_title: "Archmage"
|
||||
|
|
|
@ -3,7 +3,7 @@ extends /templates/core/modal-base
|
|||
block modal-header-content
|
||||
.clearfix
|
||||
.text-center
|
||||
h2 Enroll Students in Paid Courses
|
||||
h2(data-i18n="courses.enroll_paid")
|
||||
p= view.classroom.get('name')
|
||||
|
||||
block modal-body-content
|
||||
|
@ -12,9 +12,9 @@ block modal-body-content
|
|||
- var remainingLic = totalLic - usedLic;
|
||||
.text-center
|
||||
p
|
||||
strong.spr You have
|
||||
strong.spr= remainingLic
|
||||
strong unused paid enrollments
|
||||
strong.spr(data-i18n="courses.you_have1")
|
||||
strong= remainingLic
|
||||
strong.spl(data-i18n="courses.you_have2")
|
||||
|
||||
.row
|
||||
.col-sm-10.col-sm-offset-1
|
||||
|
@ -24,13 +24,14 @@ block modal-body-content
|
|||
.radio
|
||||
label
|
||||
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
|
||||
label
|
||||
input(type="radio", name="targets" value="selection")
|
||||
span.spr Use paid enrollments for the following students:
|
||||
span(data-i18n="courses.use_multiple")
|
||||
else
|
||||
p Use paid enrollments for the following students:
|
||||
p(data-i18n="courses.use_multiple")
|
||||
|
||||
.well.form-group
|
||||
for user in view.users.models
|
||||
|
@ -41,33 +42,33 @@ block modal-body-content
|
|||
span.spr= user.broadName()
|
||||
if paid
|
||||
span (
|
||||
span already enrolled
|
||||
span(data-i18n="courses.already_enrolled")
|
||||
span )
|
||||
|
||||
#error-alert.alert.alert-danger.hide
|
||||
|
||||
|
||||
#progress-area.hide
|
||||
.progress
|
||||
.progress-bar
|
||||
|
||||
|
||||
#submit-form-area.text-center
|
||||
p
|
||||
span.spr Total students:
|
||||
span.spr(data-i18n="courses.total_students")
|
||||
span#total-selected-span.spr
|
||||
span#not-depleted-span
|
||||
| (
|
||||
span.spr licenses remaining:
|
||||
span.spr(data-i18n="courses.licenses_remaining")
|
||||
span#licenses-remaining-span
|
||||
| )
|
||||
span#depleted-span
|
||||
span#depleted-span
|
||||
| (
|
||||
span insufficient paid enrollments
|
||||
span(data-i18n="courses.insufficient_enrollments")
|
||||
| )
|
||||
|
||||
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
|
||||
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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
extends /templates/core/modal-base
|
||||
|
||||
block modal-header-content
|
||||
h3 Change Course Language
|
||||
h3(data-i18n="courses.change_language")
|
||||
.clearfix
|
||||
|
||||
block modal-body-content
|
||||
|
@ -9,20 +9,26 @@ block modal-body-content
|
|||
- var currentLanguage = (me.get('aceConfig') || {}).language || 'python';
|
||||
button.lang-choice-btn.btn.btn-success.btn-lg(data-language='python')
|
||||
if currentLanguage === 'python'
|
||||
| Keep Using Python
|
||||
span.spr(data-i18n="courses.keep_using")
|
||||
span Python
|
||||
else
|
||||
| Switch To Python
|
||||
|
||||
p - OR -
|
||||
|
||||
span.spr(data-i18n="courses.switch_to")
|
||||
span Python
|
||||
|
||||
p
|
||||
span.spr -
|
||||
span.text-uppercase(data-i18n="general.or")
|
||||
span.spl -
|
||||
|
||||
button.lang-choice-btn.btn.btn-default(data-language='javascript')
|
||||
if currentLanguage === 'javascript'
|
||||
| Keep Using JavaScript
|
||||
span.spr(data-i18n="courses.keep_using")
|
||||
span JavaScript
|
||||
else
|
||||
| Switch to JavaScript
|
||||
|
||||
span.spr(data-i18n="courses.switch_to")
|
||||
span JavaScript
|
||||
|
||||
#saving-progress.progress.progress-striped.active.hide
|
||||
.progress-bar(style="width: 100%")
|
||||
|
||||
block modal-footer-content
|
||||
|
|
@ -3,7 +3,7 @@ extends /templates/core/modal-base
|
|||
block modal-header-content
|
||||
.clearfix
|
||||
.text-center
|
||||
h2.modal-title Greetings!
|
||||
h2.modal-title(data-i18n="courses.greetings")
|
||||
h3(data-i18n="choose_hero.programming_language_description")
|
||||
|
||||
block modal-body-content
|
||||
|
@ -12,14 +12,13 @@ block modal-body-content
|
|||
img(src="/images/common/code_languages/python_small.png")
|
||||
span.spl Python
|
||||
p(data-i18n="choose_hero.python_blurb")
|
||||
|
||||
|
||||
button.lang-choice-btn.btn.btn-default(data-language='javascript')
|
||||
img(src="/images/common/code_languages/javascript_small.png")
|
||||
span.spl JavaScript
|
||||
p(data-i18n="choose_hero.javascript_blurb")
|
||||
|
||||
|
||||
#saving-progress.progress.progress-striped.active.hide
|
||||
.progress-bar(style="width: 100%")
|
||||
|
||||
block modal-footer-content
|
||||
|
|
@ -20,9 +20,8 @@ block modal-body-content
|
|||
label(data-i18n="choose_hero.programming_language")
|
||||
select.form-control#programming-language-select
|
||||
- var aceConfig = view.classroom ? view.classroom.get('aceConfig') || {} : {};
|
||||
option(value="python", selected=aceConfig.language==='python') Learn Python
|
||||
option(value="javascript", selected=aceConfig.language==='javascript') Learn JavaScript
|
||||
.language-locked Language cannot be changed once students join a class.
|
||||
option(value="python", selected=aceConfig.language==='python', data-i18n="courses.learn_p")
|
||||
option(value="javascript", selected=aceConfig.language==='javascript', data-i18n="courses.learn_j")
|
||||
|
||||
block modal-footer-content
|
||||
if view.classroom
|
||||
|
|
|
@ -4,20 +4,20 @@ block content
|
|||
|
||||
- var isOwner = view.classroom ? view.classroom.get('ownerID') === me.id : false;
|
||||
if isOwner
|
||||
a(href="/courses/teachers") Back to my classrooms
|
||||
a(href="/courses/teachers", data-i18n="courses.back_classrooms")
|
||||
else
|
||||
a(href="/courses") Back to my courses
|
||||
|
||||
a(href="/courses", data-i18n="courses.back_courses")
|
||||
|
||||
if !me.isAnonymous()
|
||||
h1
|
||||
span.spr= view.classroom.get('name')
|
||||
if isOwner
|
||||
a#edit-class-details-link
|
||||
small Edit class details
|
||||
|
||||
small(data-i18n="courses.edit_details")
|
||||
|
||||
if view.classroom.get('description')
|
||||
p= view.classroom.get('description')
|
||||
|
||||
|
||||
h3(data-i18n="courses.stats")
|
||||
table.progress-stats-container
|
||||
- var stats = view.classStats()
|
||||
|
@ -26,7 +26,7 @@ block content
|
|||
td
|
||||
span.spr= _.size(view.classroom.get('members'))
|
||||
span (
|
||||
span.spr enrolled in paid courses:
|
||||
span.spr(data-i18n="courses.enrolled_courses")
|
||||
span= stats.enrolledUsers
|
||||
span )
|
||||
tr
|
||||
|
@ -41,17 +41,17 @@ block content
|
|||
tr
|
||||
td(data-i18n="courses.total_levels")
|
||||
td= stats.totalLevelsComplete
|
||||
|
||||
|
||||
h1
|
||||
| Students
|
||||
span(data-i18n="courses.students")
|
||||
if view.teacherMode
|
||||
.pull-right#main-button-area
|
||||
button#add-students-btn.btn.btn-primary.text-uppercase Add Students
|
||||
button#activate-licenses-btn.btn.btn-info.text-uppercase Enroll Students in Paid Courses
|
||||
a.btn.btn-success.text-uppercase(href="/courses/purchase?from-classroom="+view.classroom.id) Purchase Enrollments
|
||||
|
||||
button#add-students-btn.btn.btn-primary.text-uppercase(data-i18n="courses.add_students")
|
||||
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, data-i18n="courses.purchase_enrollments")
|
||||
|
||||
hr
|
||||
|
||||
|
||||
for user in view.users.models
|
||||
.row
|
||||
.col-md-6
|
||||
|
@ -60,16 +60,22 @@ block content
|
|||
if view.teacherMode
|
||||
a.remove-student-link.pull-right.text-uppercase(data-user-id=user.id)
|
||||
span.glyphicon.glyphicon-remove
|
||||
span.spl remove student
|
||||
span.spl(data-i18n="courses.remove_student")
|
||||
- var lastPlayedString = view.userLastPlayedString(user);
|
||||
- var playtime = view.userPlaytimeString(user);
|
||||
if lastPlayedString || playtime
|
||||
#student-stats-row.row
|
||||
if lastPlayedString
|
||||
.col-sm-6 Last Played: #{lastPlayedString}
|
||||
.col-sm-6
|
||||
span(data-i18n="user.last_played")
|
||||
span.spr :
|
||||
span= lastPlayedString
|
||||
if playtime
|
||||
.col-sm-6 Playtime: #{playtime}
|
||||
|
||||
.col-sm-6
|
||||
span(data-i18n="clans.playtime")
|
||||
span.spr :
|
||||
span= playtime
|
||||
|
||||
- var paidFor = user.get('coursePrepaidID');
|
||||
for courseInstance in view.courseInstances.models
|
||||
- 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
|
||||
else if paidFor
|
||||
.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
|
||||
.text-center
|
||||
p
|
||||
em
|
||||
span.spr Enroll
|
||||
strong.spr= user.broadName()
|
||||
span to assign paid courses.
|
||||
span.spr(data-i18n="courses.enroll")
|
||||
strong= user.broadName()
|
||||
span.spl(data-i18n="courses.to_assign")
|
||||
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
|
||||
|
|
|
@ -3,9 +3,9 @@ extends /templates/base
|
|||
block content
|
||||
|
||||
if view.teacherMode
|
||||
a(href="/courses/teachers") Back to my classrooms
|
||||
a(href="/courses/teachers", data-i18n="courses.back_classrooms")
|
||||
else
|
||||
a(href="/courses") Back to my courses
|
||||
a(href="/courses", data-i18n="courses.back_courses")
|
||||
br
|
||||
br
|
||||
|
||||
|
@ -31,7 +31,7 @@ block content
|
|||
.col-md-6
|
||||
button.btn.btn-success.btn-select-instance(data-i18n="courses.select")
|
||||
else if !course || !courseInstance
|
||||
h1(data-i18n="common.loading") Loading...
|
||||
h1(data-i18n="common.loading")
|
||||
else
|
||||
p
|
||||
// TODO: format this text all good and stuff
|
||||
|
@ -44,7 +44,9 @@ block content
|
|||
span(data-i18n='courses.unnamed_class')
|
||||
|
||||
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
|
||||
span
|
||||
strong= view.getOwnerName()
|
||||
|
@ -52,8 +54,10 @@ block content
|
|||
h1
|
||||
| #{course.get('name')}
|
||||
if view.courseComplete
|
||||
span.spl - Complete!
|
||||
|
||||
span.spl -
|
||||
span.spl(data-i18n='courses.complete')
|
||||
span !
|
||||
|
||||
p
|
||||
if courseInstance.get('description')
|
||||
each line in courseInstance.get('description').split('\n')
|
||||
|
@ -67,43 +71,46 @@ block content
|
|||
form.form#school-form
|
||||
.form-group
|
||||
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
|
||||
| (
|
||||
span(data-i18n="signup.optional") optional
|
||||
span(data-i18n="signup.optional")
|
||||
| ):
|
||||
.input-border
|
||||
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-info.btn-submit.save-school(type="submit") Save
|
||||
button.btn.btn-primary.btn-submit.no-school(type="submit", data-i18n='courses.none')
|
||||
button.btn.btn-info.btn-submit.save-school(type="submit", data-i18n='courses.save')
|
||||
.row
|
||||
if view.singlePlayerMode && !me.isAnonymous()
|
||||
.col-md-6.col-md-offset-3
|
||||
a.btn.btn-lg.btn-success(href="/play")
|
||||
h1 Play the Campaign
|
||||
p You’re ready to take the next step! Explore hundreds of challenging levels, learn advanced programming skills, and compete in multiplayer arenas!
|
||||
h1(data-i18n='courses.play_campaign_title')
|
||||
p(data-i18n='courses.play_campaign_description')
|
||||
else if view.singlePlayerMode && me.isAnonymous()
|
||||
.col-md-6
|
||||
a.btn.btn-lg.btn-success.signup-button
|
||||
h1 Create an Account
|
||||
p Sign up for a FREE CodeCombat account and gain access to more levels, more programming skills, and more fun!
|
||||
h1(data-i18n='courses.create_account_title')
|
||||
p(data-i18n='courses.create_account_description')
|
||||
.col-md-6
|
||||
a.btn.btn-lg.btn-success(href="/play")
|
||||
h1 Preview Campaign
|
||||
p Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account.
|
||||
h1(data-i18n='courses.preview_campaign_title')
|
||||
p(data-i18n='courses.preview_campaign_description')
|
||||
else if !view.singlePlayerMode
|
||||
.col-md-6
|
||||
if view.arenaLevel
|
||||
a.btn.btn-lg.btn-success.btn-play-level(data-level-slug=view.arenaLevel.slug, data-level-id=view.arenaLevel.original)
|
||||
h1
|
||||
span Arena
|
||||
| :
|
||||
span.spl= view.arenaLevel.name
|
||||
span(data-i18n='courses.arena')
|
||||
span.spr :
|
||||
span= view.arenaLevel.name
|
||||
p= view.arenaLevel.description.replace(/!\[.*?\)/, '')
|
||||
else
|
||||
a.btn.btn-lg.btn-success.disabled
|
||||
h1 Arena Coming Soon
|
||||
p We are working on a multiplayer arena for classrooms at the end of #{course.get('name')}.
|
||||
h1(data-i18n='courses.arena_soon_title') Arena Coming Soon
|
||||
p
|
||||
span.spr(data-i18n='courses.arena_soon_description')
|
||||
span= course.get('name')
|
||||
span .
|
||||
.col-md-6
|
||||
if view.nextCourseInstance
|
||||
a.btn.btn-lg.btn-success(href="/courses/#{view.nextCourse.id}/#{view.nextCourseInstance.id}")
|
||||
|
@ -112,17 +119,17 @@ block content
|
|||
else if view.nextCourse
|
||||
a.btn.btn-lg.btn-success.disabled
|
||||
h1= view.nextCourse.get('name')
|
||||
p
|
||||
em NOT ENROLLED
|
||||
p Ask your teacher to enroll you in the next course.
|
||||
p.text-uppercase
|
||||
em(data-i18n='courses.not_enrolled1')
|
||||
p(data-i18n='courses.not_enrolled2')
|
||||
else
|
||||
a.btn.btn-lg.btn-success(disabled=!view.nextCourse ? "disabled" : "")
|
||||
h1 Next Course
|
||||
p
|
||||
em COMING SOON
|
||||
p We are hard at work making more courses for you!
|
||||
h1(data-i18n='courses.next_course')
|
||||
p.text-uppercase
|
||||
em(data-i18n='courses.coming_soon1')
|
||||
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
|
||||
thead
|
||||
tr
|
||||
|
|
|
@ -19,7 +19,7 @@ block content
|
|||
else if view.state === 'purchasing'
|
||||
p
|
||||
.alert.alert-info(data-i18n="courses.purchasing_course")
|
||||
else
|
||||
else
|
||||
.well.well-lg.enroll-container
|
||||
if view.price > 0
|
||||
h1.center(data-i18n="courses.buy_course")
|
||||
|
|
|
@ -3,122 +3,132 @@ extends /templates/base
|
|||
block content
|
||||
h3.text-right
|
||||
if me.isAnonymous()
|
||||
a(href="/teachers") Teachers, click here!
|
||||
a(href="/teachers")
|
||||
span(data-i18n="courses.teachers_click")
|
||||
span !
|
||||
else
|
||||
a(href="/courses/teachers") Teachers, click here!
|
||||
a(href="/courses/teachers")
|
||||
span(data-i18n="courses.teachers_click")
|
||||
span !
|
||||
|
||||
#main-content
|
||||
if me.isAnonymous()
|
||||
|
||||
h1.text-center Adventurers, welcome to Courses!
|
||||
h1.text-center(data-i18n="courses.welcome_to_courses")
|
||||
|
||||
.text-center
|
||||
p
|
||||
h3 Ready to play?
|
||||
h3(data-i18n="courses.ready_to_play")
|
||||
p
|
||||
button#start-new-game-btn.btn.btn-default Start New Game
|
||||
p - OR -
|
||||
button#start-new-game-btn.btn.btn-default(data-i18n="courses.start_new_game")
|
||||
p
|
||||
span.spr -
|
||||
span.text-uppercase(data-i18n="general.or")
|
||||
span.spl -
|
||||
p
|
||||
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
|
||||
li basic syntax to control your character
|
||||
li while loops to solve pesky puzzles
|
||||
li strings & variables to customize actions
|
||||
li how to defeat an ogre (important life skills!)
|
||||
|
||||
li(data-i18n="courses.play_now_learn_1")
|
||||
li(data-i18n="courses.play_now_learn_2")
|
||||
li(data-i18n="courses.play_now_learn_3")
|
||||
li(data-i18n="courses.play_now_learn_4")
|
||||
|
||||
else
|
||||
|
||||
|
||||
- var showHOCComplete = false;
|
||||
if view.hocCourseInstance
|
||||
- var course = view.courses.get(view.hocCourseInstance.get('courseID'));
|
||||
- var campaign = view.campaigns.get(course.get('campaignID'));
|
||||
- var stats = campaign.statsForSessions(view.hocCourseInstance.sessions);
|
||||
- showHOCComplete = stats.levels.done && !view.classrooms.size();
|
||||
|
||||
|
||||
.text-center
|
||||
if !showHOCComplete
|
||||
h1 Welcome to your Courses page!
|
||||
h1(data-i18n="courses.welcome_to_page") Welcome to your Courses page!
|
||||
else
|
||||
h1 Amazing! You've completed the Hour of Code course!
|
||||
h2 Ready for more? Play the campaign mode!
|
||||
h1(data-i18n="courses.completed_hoc")
|
||||
h2(data-i18n="courses.ready_for_more_header")
|
||||
ul.text-left
|
||||
li Use gems to unlock new items!
|
||||
li Play through brand new worlds and challenges
|
||||
li Learn even more programming!
|
||||
li(data-i18n="courses.ready_for_more_1")
|
||||
li(data-i18n="courses.ready_for_more_2")
|
||||
li(data-i18n="courses.ready_for_more_3")
|
||||
a.btn.btn-lg.btn-success(href="/play") Play Now
|
||||
|
||||
|
||||
if view.hocCourseInstance && !view.classrooms.size()
|
||||
h3 Saved Games
|
||||
h3(data-i18n="courses.saved_games")
|
||||
hr
|
||||
|
||||
|
||||
.course-instance-entry
|
||||
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'
|
||||
small
|
||||
a#change-language-link change language
|
||||
a#change-language-link(data-i18n="courses.change_language")
|
||||
+course-instance-body(view.hocCourseInstance)
|
||||
.clearfix
|
||||
|
||||
|
||||
else if view.classrooms.size()
|
||||
h3.text-uppercase My Classes
|
||||
h3.text-uppercase(data-i18n="courses.my_classes")
|
||||
hr
|
||||
|
||||
|
||||
for classroom in view.classrooms.models
|
||||
- var justAdded = classroom.id === view.classroomJustAdded;
|
||||
- var classroomClass = justAdded ? 'just-added' : '';
|
||||
if justAdded
|
||||
#just-added-text.text-center Class successfully added!
|
||||
|
||||
#just-added-text.text-center(data-i18n="courses.class_added")
|
||||
|
||||
//- sigh
|
||||
div(class=classroomClass)
|
||||
h3
|
||||
span.spr= classroom.get('name')
|
||||
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});
|
||||
for courseInstance in courseInstances
|
||||
|
||||
|
||||
.course-instance-entry
|
||||
- var course = view.courses.get(courseInstance.get('courseID'));
|
||||
h3
|
||||
span.spr= course.get('name')
|
||||
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)
|
||||
.clearfix
|
||||
|
||||
|
||||
else
|
||||
.text-center
|
||||
button#start-new-game-btn.btn.btn-success.btn-lg Start New Game
|
||||
|
||||
h3.text-uppercase Join A Class
|
||||
button#start-new-game-btn.btn.btn-success.btn-lg(data-i18n="courses.start_new_game")
|
||||
|
||||
h3.text-uppercase(data-i18n="courses.join_class")
|
||||
hr
|
||||
|
||||
|
||||
form#join-class-form.form-inline
|
||||
.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
|
||||
input#class-code-input.form-control(placeholder="<Enter Class Code>", value=view.classCode)
|
||||
input#join-class-button.btn.btn-default(type="submit" value="Join")
|
||||
|
||||
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", data-i18n="[value]courses.join", value="Join")
|
||||
|
||||
if view.state === 'enrolling'
|
||||
.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
|
||||
.alert.alert-danger= view.errorMessage
|
||||
|
||||
|
||||
|
||||
|
||||
#begin-hoc-area.hide
|
||||
h3.text-center(data-i18n="common.loading")
|
||||
.progress.progress-striped.active
|
||||
.progress-bar(style="width: 100%")
|
||||
|
||||
|
||||
|
||||
|
||||
mixin course-instance-body(courseInstance)
|
||||
- var course = view.courses.get(courseInstance.get('courseID'));
|
||||
- var campaign = view.campaigns.get(course.get('campaignID'));
|
||||
|
@ -126,39 +136,38 @@ mixin course-instance-body(courseInstance)
|
|||
if stats.levels.done
|
||||
.text-success
|
||||
span.glyphicon.glyphicon-ok
|
||||
span.spl Course Complete!
|
||||
span.spl(data-i18n="courses.course_complete")
|
||||
span !
|
||||
.pull-right
|
||||
if stats.levels.done
|
||||
- var arenaLevel = stats.levels.arena;
|
||||
if arenaLevel
|
||||
- var arenaURL = "/play/ladder/"+arenaLevel.slug+"/course/"+courseInstance.id;
|
||||
a.btn.btn-warning.btn-lg(href=arenaURL)
|
||||
| Play Arena
|
||||
span(data-i18n="courses.play_arena")
|
||||
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()
|
||||
- var lastLevel = stats.levels.lastPlayed;
|
||||
- var levelURL = "/play/level/"+lastLevel.slug+"?course="+courseInstance.get('courseID')+"&course-instance="+courseInstance.id;
|
||||
a.btn.btn-success.btn-lg(href=levelURL)
|
||||
| Continue
|
||||
span(data-i18n="common.continue")
|
||||
else
|
||||
- var firstLevel = stats.levels.first;
|
||||
- var levelURL = "/play/level/"+firstLevel.slug+"?course="+courseInstance.get('courseID')+"&course-instance="+courseInstance.id;
|
||||
a.btn.btn-info.btn-lg(href=levelURL)
|
||||
| Start
|
||||
|
||||
span(data-i18n="courses.start")
|
||||
|
||||
div
|
||||
span Playtime
|
||||
span(data-i18n="clans.playtime")
|
||||
span.spr :
|
||||
span= moment.duration(stats.playtime, 'seconds').humanize()
|
||||
|
||||
|
||||
if stats.levels.lastPlayed
|
||||
div
|
||||
span Last Level
|
||||
span(data-i18n="courses.last_level")
|
||||
span.spr :
|
||||
span= stats.levels.lastPlayed.name
|
||||
|
||||
.progress
|
||||
.progress-bar(style="width:"+stats.levels.pctDone)= stats.levels.pctDone
|
||||
|
||||
|
||||
|
|
|
@ -3,51 +3,59 @@ extends /templates/base
|
|||
block content
|
||||
.pull-right
|
||||
if me.isAnonymous()
|
||||
a(href="/teachers") Teachers, click here!
|
||||
a(href="/teachers")
|
||||
span(data-i18n="courses.teachers_click")
|
||||
span !
|
||||
else
|
||||
a(href="/courses/teachers") Teachers, click here!
|
||||
a(href="/courses/teachers")
|
||||
span(data-i18n="courses.teachers_click")
|
||||
span !
|
||||
br
|
||||
|
||||
h1.text-center Adventurers, welcome to our Hour of Code!
|
||||
h1.text-center(data-i18n="courses.welcome_to_hoc")
|
||||
|
||||
#main-content
|
||||
.well.text-center
|
||||
if !me.isAnonymous()
|
||||
p
|
||||
strong.spr Logged in as:
|
||||
strong.spr(data-i18n="courses.logged_in_as")
|
||||
strong= me.get('name') || me.get('email')
|
||||
|
||||
p
|
||||
span.spr Not you?
|
||||
a#log-out-link Logout
|
||||
span.spr(data-i18n="courses.not_you")
|
||||
a#log-out-link(data-i18n="login.logout")
|
||||
|
||||
hr
|
||||
|
||||
if !view.lastLevel
|
||||
p
|
||||
strong Ready to play?
|
||||
strong(data-i18n="courses.ready_to_play")
|
||||
|
||||
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
|
||||
|
||||
p
|
||||
strong Hi adventurer, welcome back!
|
||||
strong(data-i18n="courses.welcome_back")
|
||||
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
|
||||
em.spr
|
||||
span.spr Last Played:
|
||||
span(data-i18n="clans.last_played")
|
||||
span.spr :
|
||||
span= view.lastLevel.get('name').replace('Course :', '')
|
||||
|
||||
if me.isAnonymous()
|
||||
p
|
||||
strong More options:
|
||||
strong(data-i18n="courses.more_options")
|
||||
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()
|
||||
p - OR -
|
||||
p
|
||||
span.spr -
|
||||
span.text-uppercase(data-i18n="general.or")
|
||||
span.spl -
|
||||
|
||||
p
|
||||
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%")
|
||||
|
||||
|
||||
h3.text-center PLAY NOW TO LEARN
|
||||
h3.text-center.text-uppercase(data-i18n="courses.play_now_learn_header")
|
||||
ul
|
||||
li basic syntax to control your character
|
||||
li while loops to solve pesky puzzles
|
||||
li strings & variables to customize actions
|
||||
li how to defeat an ogre (important life skills!)
|
||||
li(data-i18n="courses.play_now_learn_1")
|
||||
li(data-i18n="courses.play_now_learn_2")
|
||||
li(data-i18n="courses.play_now_learn_3")
|
||||
li(data-i18n="courses.play_now_learn_4")
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
extends /templates/core/modal-base
|
||||
|
||||
block modal-header-content
|
||||
h2 Add Students
|
||||
h2(data-i18n="courses.add_students")
|
||||
h3= view.classroom.get('name')
|
||||
|
||||
block modal-body-content
|
||||
h3 Option 1: Invite students via email
|
||||
p Students will automatically be sent an invitation to join this class, and will
|
||||
| need to create an account with a username and password.
|
||||
h3(data-i18n="courses.option1_header")
|
||||
p(data-i18n="courses.option1_body")
|
||||
.form
|
||||
.form-group
|
||||
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-success-alert.alert.alert-success.hide(data-i18n="play_level.done")
|
||||
|
||||
h3 Option 2: Send URL to your students
|
||||
p Students will be asked to enter an email address, username and password to create an account.
|
||||
|
||||
h3(data-i18n="courses.option2_header")
|
||||
p(data-i18n="courses.option2_body")
|
||||
|
||||
.row
|
||||
.col-sm-9
|
||||
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
|
||||
#copied-alert.alert.alert-info.hide Copied
|
||||
#copy-failed-alert.alert.alert-danger.hide Error copying
|
||||
|
||||
h3 Option 3: Direct students to codecombat.com/courses
|
||||
p Give students the following passcode to enter along with an email address,
|
||||
| username and password when they create an account.
|
||||
|
||||
|
||||
h3(data-i18n="courses.option3_header")
|
||||
p(data-i18n="courses.option3_body")
|
||||
|
||||
.text-center
|
||||
#class-code-well.well= view.classCode
|
||||
|
|
|
@ -3,22 +3,25 @@ extends /templates/base
|
|||
block content
|
||||
|
||||
if view.state === 'purchasing'
|
||||
p.text-center Purchasing...
|
||||
p.text-center(data-i18n="buy_gems.purchasing")
|
||||
.progress.progress-striped.active
|
||||
.progress-bar(style="width: 100%")
|
||||
|
||||
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
|
||||
if view.fromClassroom
|
||||
a(href="/courses/"+view.fromClassroom) Return to classroom
|
||||
a(href="/courses/"+view.fromClassroom, data-i18n="courses.return_to_class")
|
||||
else
|
||||
a(href="/courses/teachers") Return to course management.
|
||||
|
||||
a(href="/courses/teachers", data-i18n="courses.return_to_course_man")
|
||||
|
||||
else
|
||||
|
||||
h2.text-center Purchase Enrollments
|
||||
h2.text-center(data-i18n="courses.purchase_enrollments")
|
||||
br
|
||||
|
||||
if view.state === 'error'
|
||||
|
@ -30,21 +33,21 @@ block content
|
|||
.row
|
||||
.col-md-4
|
||||
.col-md-3
|
||||
strong.uppercase unused paid enrollments
|
||||
strong.uppercase(data-i18n="courses.you_have2")
|
||||
.col-md-1
|
||||
strong= remainingEnrollments
|
||||
br
|
||||
.row
|
||||
.col-md-4
|
||||
.col-md-3
|
||||
strong.uppercase students not enrolled
|
||||
strong.uppercase(data-i18n="courses.students_not_enrolled")
|
||||
.row
|
||||
.col-md-4
|
||||
.col-md-3
|
||||
each classroom in view.classrooms.models
|
||||
if classroom.get('members').length > 0
|
||||
.not-enrolled= classroom.get('name')
|
||||
.not-enrolled Total Across All Classes
|
||||
.not-enrolled(data-i18n="courses.total_all_classes")
|
||||
.col-md-1
|
||||
- var totalNotEnrolled = 0
|
||||
each classroom in view.classrooms.models
|
||||
|
@ -58,7 +61,7 @@ block content
|
|||
br
|
||||
|
||||
p.text-center
|
||||
strong How many additional paid enrollments do you need?
|
||||
strong(data-i18n="courses.how_many_enrollments")
|
||||
br
|
||||
|
||||
p.text-center
|
||||
|
@ -70,13 +73,16 @@ block content
|
|||
|
||||
.container-fluid
|
||||
.row
|
||||
.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.
|
||||
| You may assign each course to each student individually.
|
||||
.col-md-offset-3.col-md-6
|
||||
span(data-i18n="courses.each_student_access")
|
||||
br
|
||||
|
||||
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
|
||||
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")
|
||||
|
|
|
@ -2,26 +2,25 @@ extends /templates/core/modal-base
|
|||
|
||||
block modal-header-content
|
||||
.text-center
|
||||
h3.modal-title Remove Student
|
||||
h3.modal-title(data-i18n="courses.remove_student1")
|
||||
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
|
||||
p.text-center
|
||||
| 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.
|
||||
span(data-i18n="courses.remove_description1")
|
||||
if view.user.get('coursePrepaidID')
|
||||
| The activated paid license will not be returned.
|
||||
|
||||
span(data-i18n="courses.remove_description2")
|
||||
|
||||
block modal-footer-content
|
||||
#remove-student-buttons.text-center
|
||||
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
|
||||
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
|
||||
.progress
|
||||
.progress-bar
|
||||
p.text-info Removing user
|
||||
p.text-info(data-i18n="courses.removing_user")
|
||||
|
|
|
@ -2,46 +2,50 @@ extends /templates/base
|
|||
|
||||
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
|
||||
.form-group
|
||||
.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
|
||||
input#classroom-code-input.form-control(
|
||||
data-i18n="[placeholder]courses.enter_here",
|
||||
placeholder='<enter unlock code here>',
|
||||
value=view.classCode,
|
||||
disabled=view.state==='enrolling')
|
||||
|
||||
|
||||
if view.state === 'enrolling'
|
||||
.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'
|
||||
.alert.alert-danger= view.stateMessage
|
||||
|
||||
|
||||
- var justJoinedCourseInstance = view.courseInstances.find(function(ci) { return ci.justJoined; });
|
||||
if justJoinedCourseInstance
|
||||
- var course = view.courses.get(justJoinedCourseInstance.get('courseID'));
|
||||
- var classroom = view.classrooms.get(justJoinedCourseInstance.get('classroomID'));
|
||||
if course && classroom
|
||||
.alert.alert-info
|
||||
span.spr Successfully joined "#{classroom.get('name')}"!
|
||||
a(href="/courses/#{course.id}/#{justJoinedCourseInstance.id}")
|
||||
strong Click here to start taking "#{course.get('name')}".
|
||||
|
||||
span.spr(data-i18n="courses.successfully_joined")
|
||||
span.spr "#{classroom.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-heading
|
||||
.panel-title My Courses
|
||||
|
||||
.panel-title(data-i18n="courses.my_courses")
|
||||
|
||||
.list-group
|
||||
.list-group-item
|
||||
.row
|
||||
.col-sm-3
|
||||
strong Classroom
|
||||
strong(data-i18n="courses.classroom")
|
||||
.col-sm-3
|
||||
strong Course
|
||||
strong(data-i18n="courses.course")
|
||||
for courseInstance in view.courseInstances.models
|
||||
- var classroom = view.classrooms.get(courseInstance.get('classroomID'))
|
||||
- var course = view.courses.get(courseInstance.get('courseID'))
|
||||
|
@ -57,14 +61,14 @@ block content
|
|||
if course
|
||||
| #{course.get('name')}
|
||||
.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-heading
|
||||
.panel-title My Classes
|
||||
.panel-title(data-i18n="courses.my_classes")
|
||||
.list-group
|
||||
for classroom in view.classrooms.models
|
||||
.list-group-item
|
||||
.row
|
||||
.col-sm-3= classroom.get('name')
|
||||
.col-sm-9= classroom.get('description')
|
||||
.col-sm-9= classroom.get('description')
|
||||
|
|
|
@ -2,12 +2,12 @@ extends /templates/core/modal-base
|
|||
|
||||
block modal-header-content
|
||||
.clearfix
|
||||
|
||||
|
||||
|
||||
|
||||
block modal-body-content
|
||||
.text-center
|
||||
h2.modal-title(data-i18n="login.log_in")
|
||||
|
||||
|
||||
form.form
|
||||
.form-group
|
||||
label.control-label(for="email")
|
||||
|
@ -15,9 +15,9 @@ block modal-body-content
|
|||
input#email.input-large.form-control(name="email", type="email")
|
||||
.form-group
|
||||
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")
|
||||
|
||||
|
||||
#errors-alert.alert.alert-danger.hide
|
||||
|
||||
.text-center
|
||||
|
@ -25,6 +25,6 @@ block modal-body-content
|
|||
p
|
||||
a#create-new-account-link(data-i18n="login.signup_switch")
|
||||
p
|
||||
a(data-toggle="coco-modal", data-target="core/RecoverModal", data-i18n="login.forgot_password") Forgot your password?
|
||||
|
||||
block modal-footer-content
|
||||
a(data-toggle="coco-modal", data-target="core/RecoverModal", data-i18n="login.forgot_password")
|
||||
|
||||
block modal-footer-content
|
||||
|
|
|
@ -2,50 +2,50 @@ extends /templates/core/modal-base
|
|||
|
||||
block modal-header-content
|
||||
.clearfix
|
||||
|
||||
|
||||
|
||||
|
||||
block modal-body-content
|
||||
.text-center
|
||||
h2.modal-title(data-i18n="signup.sign_up")
|
||||
|
||||
|
||||
form.form
|
||||
.form-group
|
||||
label.control-label(for="email")
|
||||
span(data-i18n="general.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
|
||||
label.control-label(for="name")
|
||||
span(data-i18n="general.name") Name
|
||||
span(data-i18n="general.name")
|
||||
if me.get('name')
|
||||
input#name.input-large.form-control(name="name", type="text", value="#{me.get('name')}")
|
||||
else
|
||||
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
|
||||
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")
|
||||
.help-block pick something you can remember
|
||||
.help-block(data-i18n="courses.pick_something")
|
||||
.form-group
|
||||
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)
|
||||
.help-block optional - ask your teacher to give you one!
|
||||
.help-block(data-i18n="courses.optional_ask")
|
||||
.form-group
|
||||
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")
|
||||
.help-block optional - what school do you go to?
|
||||
|
||||
.help-block(data-i18n="courses.optional_school")
|
||||
|
||||
#errors-alert.alert.alert-danger.hide
|
||||
|
||||
.text-center
|
||||
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
|
||||
a#skip-link Skip this, I'll create an account later!
|
||||
a#skip-link(data-i18n="courses.skip_this")
|
||||
else
|
||||
input#sign-up-btn.btn.btn-default(data-i18n="[value]signup.sign_up", type="submit")
|
||||
|
||||
block modal-footer-content
|
||||
|
||||
block modal-footer-content
|
||||
|
|
|
@ -4,9 +4,13 @@ block content
|
|||
|
||||
.text-center
|
||||
if me.isAnonymous() || !me.get('name')
|
||||
.welcome Welcome!
|
||||
.welcome
|
||||
span(data-i18n="courses.welcome")
|
||||
span !
|
||||
else
|
||||
.welcome Welcome, #{me.get('name')}!
|
||||
.welcome
|
||||
span(data-i18n="courses.welcome")
|
||||
span , #{me.get('name')}!
|
||||
|
||||
.container-fluid
|
||||
.row
|
||||
|
@ -14,58 +18,55 @@ block content
|
|||
.col-md-8
|
||||
.well
|
||||
.text-center
|
||||
strong.uppercase Getting Started with Courses
|
||||
strong.uppercase(data-i18n="courses.getting_started")
|
||||
br
|
||||
.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
|
||||
ol
|
||||
li Create a new class by clicking the green "Create New Class" button below.
|
||||
li Once you've created a class, click the blue "Add Students" button.
|
||||
li You'll see student's progress below as they sign up and join your class.
|
||||
li(data-i18n="courses.getting_started_1")
|
||||
li(data-i18n="courses.getting_started_2")
|
||||
li(data-i18n="courses.getting_started_3")
|
||||
br
|
||||
.text-center
|
||||
strong Additional Resources
|
||||
strong(data-i18n="courses.addicional_resources")
|
||||
ul
|
||||
li
|
||||
span.spr Download/print our
|
||||
a.spr(href='http://codecombat.com/docs/CodeCombatTeacherGuideCourse1.pdf') Course 1 Teacher's Guide
|
||||
span for explanations and solutions to each level.
|
||||
span.spr(data-i18n="courses.addicional_resources_1_pref")
|
||||
a(href='http://codecombat.com/docs/CodeCombatTeacherGuideCourse1.pdf', data-i18n="courses.addicional_resources_1_mid")
|
||||
span.spl(data-i18n="courses.addicional_resources_1_suff")
|
||||
li
|
||||
span.spr Complete our
|
||||
a.spr(href='/teachers/freetrial') Teacher Survey
|
||||
span to get 15 more hours of content for FREE for 2 months.
|
||||
span.spr(data-i18n="courses.addicional_resources_2_pref")
|
||||
a(href='/teachers/freetrial', data-i18n="teachers_survey.title")
|
||||
span.spl(data-i18n="courses.addicional_resources_2_suff")
|
||||
li
|
||||
span.spr Visit our
|
||||
a.spr(href='http://discourse.codecombat.com/c/teachers') Teacher Forums
|
||||
span to connect to fellow educators who are using CodeCombat.
|
||||
span.spr(data-i18n="courses.addicional_resources_3_pref")
|
||||
a(href='http://discourse.codecombat.com/c/teachers', data-i18n="courses.addicional_resources_3_mid")
|
||||
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
|
||||
.container-fluid
|
||||
each classroom in view.classrooms.models
|
||||
+classroom(classroom)
|
||||
else
|
||||
.no-students No classes yet!
|
||||
.no-students(data-i18n="courses.no_classes")
|
||||
|
||||
.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
|
||||
.section-header Available Courses
|
||||
|
||||
.section-header(data-i18n="courses.available_courses")
|
||||
|
||||
if !me.isAnonymous()
|
||||
p.text-center
|
||||
strong.spr Unused enrollments available:
|
||||
strong.spr(data-i18n="courses.unused_enrollments")
|
||||
strong.spr= view.prepaids.totalAvailable()
|
||||
a.btn.btn-success.btn(href="/courses/purchase") Purchase Enrollments
|
||||
|
||||
p
|
||||
| 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.
|
||||
|
||||
a.btn.btn-success.btn(href="/courses/purchase", data-i18n="courses.purchase_enrollments")
|
||||
|
||||
p(data-i18n="courses.students_access")
|
||||
|
||||
.container-fluid
|
||||
- var courses = view.courses.models;
|
||||
- var i = 0;
|
||||
|
@ -95,7 +96,7 @@ mixin classroom(classroom)
|
|||
else
|
||||
span.spr.class-name (Python)
|
||||
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});
|
||||
each courseInstance in courseInstances
|
||||
+course(courseInstance, classMemberCount)
|
||||
|
@ -108,15 +109,15 @@ mixin classroom(classroom)
|
|||
else
|
||||
span.spr.class-name (Python)
|
||||
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
|
||||
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
|
||||
if classMemberCount > 0
|
||||
.col-md-4.text-center
|
||||
.class-count= classMemberCount
|
||||
.active-courses(style='margin:6px;') students
|
||||
a.btn.btn-info.uppercase(href='/courses/#{classroom.id}') view/edit
|
||||
.active-courses(style='margin:6px;', data-i18n="courses.students1")
|
||||
a.btn.btn-info.uppercase(href='/courses/#{classroom.id}', data-i18n="courses.view_edit")
|
||||
.row
|
||||
.col-md-12
|
||||
.divider
|
||||
|
@ -127,7 +128,9 @@ mixin course(courseInstance, classMemberCount)
|
|||
- var course = view.courses.get(courseInstance.get('courseID'));
|
||||
p
|
||||
.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')
|
||||
span.spr.course-concept(data-i18n="concepts." + concept)
|
||||
|
||||
|
@ -138,11 +141,14 @@ mixin course-info(course)
|
|||
span.spr.course-name= course.get('name')
|
||||
p= course.get('description')
|
||||
p
|
||||
strong.spr Concepts:
|
||||
strong
|
||||
span(data-i18n="courses.concepts")
|
||||
span.spr :
|
||||
each concept in course.get('concepts')
|
||||
span(data-i18n="concepts." + concept)
|
||||
if course.get('concepts').indexOf(concept) !== course.get('concepts').length - 1
|
||||
span.spr ,
|
||||
p
|
||||
strong.spr Length:
|
||||
span #{course.get('duration') || 0} hours
|
||||
strong.spr(data-i18n="courses.length")
|
||||
span= course.get('duration') || 0
|
||||
span.spl(data-i18n="units.hours")
|
||||
|
|
|
@ -121,7 +121,7 @@ block modal-footer-content
|
|||
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
|
||||
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
|
||||
button.btn.btn-illustrated.btn-success.leaderboard-button.btn-lg(data-dismiss="modal", data-i18n="leaderboard.view_other_solutions") View Other Solutions
|
||||
|
|
|
@ -7,11 +7,11 @@ User = require 'models/User'
|
|||
module.exports = class ActivateLicensesModal extends ModalView
|
||||
id: 'activate-licenses-modal'
|
||||
template: template
|
||||
|
||||
|
||||
events:
|
||||
'change input': 'updateSelectionSpans'
|
||||
'submit form': 'onSubmitForm'
|
||||
|
||||
|
||||
initialize: (options) ->
|
||||
@classroom = options.classroom
|
||||
@users = options.users
|
||||
|
@ -20,7 +20,7 @@ module.exports = class ActivateLicensesModal extends ModalView
|
|||
@prepaids.comparator = '_id'
|
||||
@prepaids.fetchByCreator(me.id)
|
||||
@supermodel.loadCollection(@prepaids, 'prepaids')
|
||||
|
||||
|
||||
afterRender: ->
|
||||
super()
|
||||
@updateSelectionSpans()
|
||||
|
@ -38,11 +38,11 @@ module.exports = class ActivateLicensesModal extends ModalView
|
|||
@$('#not-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)
|
||||
|
||||
|
||||
showProgress: ->
|
||||
@$('#submit-form-area').addClass('hide')
|
||||
@$('#progress-area').removeClass('hide')
|
||||
|
||||
|
||||
hideProgress: ->
|
||||
@$('#submit-form-area').removeClass('hide')
|
||||
@$('#progress-area').addClass('hide')
|
||||
|
@ -91,5 +91,5 @@ module.exports = class ActivateLicensesModal extends ModalView
|
|||
@$('#error-alert').text(message).removeClass('hide')
|
||||
})
|
||||
|
||||
finishRedeemUsers: ->
|
||||
finishRedeemUsers: ->
|
||||
@trigger 'redeem-users'
|
||||
|
|
|
@ -79,7 +79,7 @@ module.exports = class CourseEnrollView extends RootView
|
|||
onChangeCourse: (e) ->
|
||||
@selectedCourse = _.find @courses.models, (a) -> a.id is $(e.target).val()
|
||||
@renderNewPrice()
|
||||
|
||||
|
||||
onChangeProgrammingLanguageSelect: (e) ->
|
||||
@selectedLanguage = @$('#programming-language-select').val()
|
||||
|
||||
|
@ -99,7 +99,7 @@ module.exports = class CourseEnrollView extends RootView
|
|||
token: token
|
||||
timestamp: new Date().getTime()
|
||||
aceConfig: { language: @selectedLanguage }
|
||||
|
||||
|
||||
data.courseID = @selectedCourse.id if @selectedCourse
|
||||
jqxhr = $.post('/db/course_instance/-/create', data)
|
||||
jqxhr.done (data, textStatus, jqXHR) =>
|
||||
|
|
|
@ -4,7 +4,7 @@ template = require 'templates/courses/remove-student-modal'
|
|||
module.exports = class RemoveStudentModal extends ModalView
|
||||
id: 'remove-student-modal'
|
||||
template: template
|
||||
|
||||
|
||||
events:
|
||||
'click #remove-student-btn': 'onClickRemoveStudentButton'
|
||||
|
||||
|
@ -33,5 +33,4 @@ module.exports = class RemoveStudentModal extends ModalView
|
|||
pct = (100 * (@totalJobs - @toRemove.length) / @totalJobs).toFixed(1) + '%'
|
||||
@$('#remove-student-progress .progress-bar').css('width', pct)
|
||||
@listenToOnce model, 'sync', ->
|
||||
@removeStudent()
|
||||
|
||||
@removeStudent()
|
||||
|
|
|
@ -66,7 +66,7 @@ module.exports = class LevelDialogueView extends CocoView
|
|||
group.append(button)
|
||||
response.button = $('button:last', group)
|
||||
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')
|
||||
if not @escapePressed and not @isFullScreen()
|
||||
group.append('<span class="hud-hint">' + sk + '</span>')
|
||||
|
|
Loading…
Reference in a new issue