mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-14 01:31:15 -05:00
Merge branch 'master' into production
This commit is contained in:
commit
51f1de0131
13 changed files with 371 additions and 129 deletions
BIN
app/assets/docs/CodeCombatCoursesGettingStartedGuide.pdf
Normal file → Executable file
BIN
app/assets/docs/CodeCombatCoursesGettingStartedGuide.pdf
Normal file → Executable file
Binary file not shown.
BIN
app/assets/docs/CodeCombatTeacherGuideCourse2.pdf
Executable file
BIN
app/assets/docs/CodeCombatTeacherGuideCourse2.pdf
Executable file
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 164 KiB |
|
@ -990,8 +990,10 @@
|
||||||
getting_started_3: "You'll see student's progress below as they sign up and join your class."
|
getting_started_3: "You'll see student's progress below as they sign up and join your class."
|
||||||
additional_resources: "Additional Resources"
|
additional_resources: "Additional Resources"
|
||||||
additional_resources_1_pref: "Download/print our"
|
additional_resources_1_pref: "Download/print our"
|
||||||
additional_resources_1_mid: "Course 1 Teacher's Guide"
|
additional_resources_1_mid: "Course 1" # {change}
|
||||||
additional_resources_1_suff: "explanations and solutions to each level."
|
additional_resources_1_mid2: "and"
|
||||||
|
additional_resources_1_mid3: "Course 2"
|
||||||
|
additional_resources_1_suff: "teacher's guides with solutions for each level." # {change}
|
||||||
additional_resources_2_pref: "Complete our"
|
additional_resources_2_pref: "Complete our"
|
||||||
additional_resources_2_suff: "to get two free enrollments for the rest of our paid courses."
|
additional_resources_2_suff: "to get two free enrollments for the rest of our paid courses."
|
||||||
additional_resources_3_pref: "Visit our"
|
additional_resources_3_pref: "Visit our"
|
||||||
|
@ -1000,6 +1002,9 @@
|
||||||
additional_resources_4_pref: "Check out our"
|
additional_resources_4_pref: "Check out our"
|
||||||
additional_resources_4_mid: "Schools Page"
|
additional_resources_4_mid: "Schools Page"
|
||||||
additional_resources_4_suff: "to learn more about CodeCombat's classroom offerings."
|
additional_resources_4_suff: "to learn more about CodeCombat's classroom offerings."
|
||||||
|
educator_wiki_pref: "Or check out our new"
|
||||||
|
educator_wiki_mid: "educator wiki"
|
||||||
|
educator_wiki_suff: "to browse the guide online."
|
||||||
your_classes: "Your Classes"
|
your_classes: "Your Classes"
|
||||||
no_classes: "No classes yet!"
|
no_classes: "No classes yet!"
|
||||||
create_new_class1: "create new class"
|
create_new_class1: "create new class"
|
||||||
|
|
|
@ -660,7 +660,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
password_tab: "Contraseña"
|
password_tab: "Contraseña"
|
||||||
emails_tab: "Correos"
|
emails_tab: "Correos"
|
||||||
admin: "Admin"
|
admin: "Admin"
|
||||||
# manage_subscription: "Click here to manage your subscription."
|
manage_subscription: "Click aquí para administrar tu subscripción"
|
||||||
new_password: "Nueva Contraseña"
|
new_password: "Nueva Contraseña"
|
||||||
new_password_verify: "Verificar"
|
new_password_verify: "Verificar"
|
||||||
type_in_email: "Ingrese su correo electrónico para confirmar la eliminación de su cuenta."
|
type_in_email: "Ingrese su correo electrónico para confirmar la eliminación de su cuenta."
|
||||||
|
@ -865,26 +865,26 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
topics: "Tópicos"
|
topics: "Tópicos"
|
||||||
hours_content: "Horas de contenido:"
|
hours_content: "Horas de contenido:"
|
||||||
get_free: "Obtenga curso GRATIS"
|
get_free: "Obtenga curso GRATIS"
|
||||||
# enroll_paid: "Enroll Students in Paid Courses"
|
enroll_paid: "Anotar estudiantes en cursos pagos."
|
||||||
you_have1: "Tiene"
|
you_have1: "Tiene"
|
||||||
# you_have2: "unused paid enrollments"
|
# you_have2: "unused paid enrollments"
|
||||||
# use_one: "Use 1 paid enrollment for"
|
# use_one: "Use 1 paid enrollment for"
|
||||||
# use_multiple: "Use paid enrollments for the following students:"
|
# use_multiple: "Use paid enrollments for the following students:"
|
||||||
# already_enrolled: "already enrolled"
|
# already_enrolled: "already enrolled"
|
||||||
# licenses_remaining: "licenses remaining:"
|
licenses_remaining: "licencias restantes:"
|
||||||
# insufficient_enrollments: "insufficient paid enrollments"
|
# insufficient_enrollments: "insufficient paid enrollments"
|
||||||
# enroll_students: "Enroll Students"
|
# enroll_students: "Enroll Students"
|
||||||
# get_enrollments: "Get More Enrollments"
|
# get_enrollments: "Get More Enrollments"
|
||||||
# change_language: "Change Course Language"
|
change_language: "Cambiar idioma del curso"
|
||||||
keep_using: "Seguir Usando"
|
keep_using: "Seguir Usando"
|
||||||
switch_to: "Cambiar a"
|
switch_to: "Cambiar a"
|
||||||
greetings: "Saludos!"
|
greetings: "Saludos!"
|
||||||
learn_p: "Aprender Python"
|
learn_p: "Aprender Python"
|
||||||
learn_j: "Aprender JavaScript"
|
learn_j: "Aprender JavaScript"
|
||||||
# language_cannot_change: "Language cannot be changed once students join a class."
|
language_cannot_change: "El lenguaje no puede ser cambiado una vez que el estudiante ingreso a la clase."
|
||||||
# back_classrooms: "Back to my classrooms"
|
back_classrooms: "Volver a mis aulas"
|
||||||
# back_courses: "Back to my courses"
|
back_courses: "Volver a mis cursos"
|
||||||
# edit_details: "Edit class details"
|
edit_details: "Editar detallesde clase"
|
||||||
# enrolled_courses: "enrolled in paid courses:"
|
# enrolled_courses: "enrolled in paid courses:"
|
||||||
# purchase_enrollments: "Purchase Enrollments"
|
# purchase_enrollments: "Purchase Enrollments"
|
||||||
remove_student: "Quitar alumno"
|
remove_student: "Quitar alumno"
|
||||||
|
@ -898,14 +898,14 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
play_campaign_description: "Estas listo para dar el siguiente paso! Explora cientos de desafiantes niveles, aprende habilidades avanzadas de programación, y compite en arenas multijugador!"
|
play_campaign_description: "Estas listo para dar el siguiente paso! Explora cientos de desafiantes niveles, aprende habilidades avanzadas de programación, y compite en arenas multijugador!"
|
||||||
create_account_title: "Crea una Cuenta"
|
create_account_title: "Crea una Cuenta"
|
||||||
create_account_description: "Registrate gratis con una cuenta CodeCombat y obten acceso a mas niveles, mas habilidades de programacion, y mas diversion!"
|
create_account_description: "Registrate gratis con una cuenta CodeCombat y obten acceso a mas niveles, mas habilidades de programacion, y mas diversion!"
|
||||||
# preview_campaign_title: "Preview Campaign"
|
preview_campaign_title: "Previsualizar campaña"
|
||||||
# preview_campaign_description: "Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account."
|
# preview_campaign_description: "Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account."
|
||||||
arena: "Arena"
|
arena: "Arena"
|
||||||
# arena_soon_title: "Arena Coming Soon"
|
arena_soon_title: "Arena pronto disponible"
|
||||||
# arena_soon_description: "We are working on a multiplayer arena for classrooms at the end of"
|
# arena_soon_description: "We are working on a multiplayer arena for classrooms at the end of"
|
||||||
not_enrolled1: "No inscrito"
|
not_enrolled1: "No inscrito"
|
||||||
# not_enrolled2: "Ask your teacher to enroll you in the next course."
|
not_enrolled2: "Preguntale a tu maestro para anotarte en el proximo curso."
|
||||||
# next_course: "Next Course"
|
next_course: "Próximo curso"
|
||||||
coming_soon1: "Próximamente"
|
coming_soon1: "Próximamente"
|
||||||
coming_soon2: "Estamos trabajando duro para hacer mas cursos para ti!"
|
coming_soon2: "Estamos trabajando duro para hacer mas cursos para ti!"
|
||||||
available_levels: "Niveles Disponibles"
|
available_levels: "Niveles Disponibles"
|
||||||
|
@ -917,62 +917,62 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
# play_now_learn_2: "while loops to solve pesky puzzles"
|
# play_now_learn_2: "while loops to solve pesky puzzles"
|
||||||
play_now_learn_3: "cadenas & variables para personalizar acciones"
|
play_now_learn_3: "cadenas & variables para personalizar acciones"
|
||||||
play_now_learn_4: "como vencer a un ogro (habilidades importantes en la vida!)"
|
play_now_learn_4: "como vencer a un ogro (habilidades importantes en la vida!)"
|
||||||
# welcome_to_page: "Welcome to your Courses page!"
|
welcome_to_page: "¡Bienvenido a tu página de cursose!"
|
||||||
# completed_hoc: "Amazing! You've completed the Hour of Code course!"
|
completed_hoc: "¡Asombroso! ¡Has completado el curso de la hora de código!"
|
||||||
ready_for_more_header: "Listo para mas? Juega el modo campaña!"
|
ready_for_more_header: "Listo para mas? Juega el modo campaña!"
|
||||||
ready_for_more_1: "Usa las gemas para desbloquear nuevos objetos!"
|
ready_for_more_1: "Usa las gemas para desbloquear nuevos objetos!"
|
||||||
# ready_for_more_2: "Play through brand new worlds and challenges"
|
ready_for_more_2: "Juega atravez de nuevos mundos y desafios"
|
||||||
# ready_for_more_3: "Learn even more programming!"
|
ready_for_more_3: "¡Aprendé todavía más programando!"
|
||||||
saved_games: "Juegos Guardados"
|
saved_games: "Juegos Guardados"
|
||||||
# hoc: "Hour of Code"
|
hoc: "Hora del código"
|
||||||
my_classes: "Mis Clases"
|
my_classes: "Mis Clases"
|
||||||
# class_added: "Class successfully added!"
|
class_added: "Clase añadida satisfactoriamente!"
|
||||||
# view_class: "view class"
|
view_class: "ver clase"
|
||||||
view_levels: "ver niveles"
|
view_levels: "ver niveles"
|
||||||
# join_class: "Join A Class"
|
join_class: "Unirse a clase"
|
||||||
# ask_teacher_for_code: "Ask your teacher if you have a CodeCombat class code! If so, enter it below:"
|
ask_teacher_for_code: "Preguntalé a tu profesor si tu tienes un código de CodeCombat! Si lo tiene, ingresalo debajo:"
|
||||||
# enter_c_code: "<Enter Class Code>"
|
# enter_c_code: "<Enter Class Code>"
|
||||||
# join: "Join"
|
join: "Unirse"
|
||||||
# joining: "Joining class"
|
joining: "Uniendose a claseJoining class"
|
||||||
# course_complete: "Course Complete"
|
course_complete: "Curso completo"
|
||||||
# play_arena: "Play Arena"
|
play_arena: "Jugar Arena"
|
||||||
start: "Iniciar"
|
start: "Iniciar"
|
||||||
# last_level: "Last Level"
|
last_level: "Último nivel"
|
||||||
# welcome_to_hoc: "Adventurers, welcome to our Hour of Code!"
|
welcome_to_hoc: "Aventureros, bienvenidos a su Hora del Código!!"
|
||||||
# logged_in_as: "Logged in as:"
|
logged_in_as: "Logeado como:"
|
||||||
# not_you: "Not you?"
|
not_you: "No eres tú?"
|
||||||
# welcome_back: "Hi adventurer, welcome back!"
|
welcome_back: "Hola aventurero, bienvenido nuevamente!"
|
||||||
# continue_playing: "Continue Playing"
|
continue_playing: "Seguir jugando"
|
||||||
# more_options: "More options:"
|
more_options: "Másopciones:"
|
||||||
# option1_header: "Option 1: Invite students via email"
|
option1_header: "Opción 1: Invitar estudiantes vía 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."
|
# 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_header: "Opción 2: Enviarles la URL a tus estudiantes"
|
||||||
# option2_body: "Students will be asked to enter an email address, username and password to create an account."
|
# 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_header: "Opción 3: Dirigir estudiantes a 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."
|
# 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_pref: "Gracias por tu compra! Ahora puedes asignar"
|
||||||
# thank_you_suff: "more students to paid courses."
|
thank_you_suff: "más estudiantes a cursos pagos."
|
||||||
# return_to_class: "Return to classroom"
|
# return_to_class: "Return to classroom"
|
||||||
# return_to_course_man: "Return to course management."
|
# return_to_course_man: "Return to course management."
|
||||||
# students_not_enrolled: "students not enrolled"
|
# students_not_enrolled: "students not enrolled"
|
||||||
# total_all_classes: "Total Across All Classes"
|
# total_all_classes: "Total Across All Classes"
|
||||||
# how_many_enrollments: "How many additional paid enrollments do you need?"
|
# 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."
|
# 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"
|
purchase_now: "Comprar Ahora"
|
||||||
# enrollments: "enrollments"
|
# enrollments: "enrollments"
|
||||||
remove_student1: "Quitar alumno"
|
remove_student1: "Quitar alumno"
|
||||||
# are_you_sure: "Are you sure you want to remove this student from this class?"
|
are_you_sure: "¿Estás seguro que quieres quitar este alumno de tu clase?"
|
||||||
# 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_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."
|
# remove_description2: "The activated paid license will not be returned."
|
||||||
keep_student: "Mantener alumno"
|
keep_student: "Mantener alumno"
|
||||||
# removing_user: "Removing user"
|
removing_user: "Removiendo usuario"
|
||||||
# to_join_ask: "To join a class, ask your teacher for an unlock code."
|
to_join_ask: "Para ingresar a una clase, preguntale a tu maestro por un código de acceso."
|
||||||
# join_this_class: "Join Class"
|
join_this_class: "Ingresar clase"
|
||||||
# enter_here: "<enter unlock code here>"
|
enter_here: "<Ingresar el código aquí>"
|
||||||
# successfully_joined: "Successfully joined"
|
# successfully_joined: "Successfully joined"
|
||||||
# click_to_start: "Click here to start taking"
|
# click_to_start: "Click here to start taking"
|
||||||
# my_courses: "My Courses"
|
my_courses: "Mis Cursos"
|
||||||
# classroom: "Classroom"
|
classroom: "Aulas"
|
||||||
# use_school_email: "use your school email if you have one"
|
# use_school_email: "use your school email if you have one"
|
||||||
# unique_name: "a unique name no one has chosen"
|
# unique_name: "a unique name no one has chosen"
|
||||||
pick_something: "Escoge algo que recuerdes"
|
pick_something: "Escoge algo que recuerdes"
|
||||||
|
|
|
@ -587,35 +587,35 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
more_info_3: "でCodeCombatを使っている教育者の仲間とつながりましょう。"
|
more_info_3: "でCodeCombatを使っている教育者の仲間とつながりましょう。"
|
||||||
|
|
||||||
teachers_survey:
|
teachers_survey:
|
||||||
# title: "Teacher Survey"
|
title: "教師用アンケート"
|
||||||
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
|
must_be_logged: "最初にログインしてください。アカウントを作成するか、上記のメニューからログインしてください。"
|
||||||
# retrieving: "Retrieving information..."
|
retrieving: "情報を取得しています..."
|
||||||
# being_reviewed_1: "Your application for a free trial is being"
|
being_reviewed_1: "無料トライアルの申し込みが"
|
||||||
# being_reviewed_2: "reviewed."
|
being_reviewed_2: "レビューされています。"
|
||||||
# approved_1: "Your application for a free trial was"
|
approved_1: "無料トライアルの申し込みが"
|
||||||
# approved_2: "approved!"
|
approved_2: "承認されました!"
|
||||||
# approved_4: "You can now enroll your students on the"
|
approved_4: "以下のページで生徒を入会させることができます:"
|
||||||
# approved_5: "courses"
|
approved_5: "コース"
|
||||||
# approved_6: "page."
|
approved_6: "ページ。"
|
||||||
# denied_1: "Your application for a free trial has been"
|
denied_1: "無料トライアルの申し込みが"
|
||||||
# denied_2: "denied."
|
denied_2: "拒否されました。"
|
||||||
# contact_1: "Please contact"
|
contact_1: "お問い合わせください"
|
||||||
# contact_2: "if you have further questions."
|
contact_2: "ご質問がある場合は"
|
||||||
# description_1: "We offer free trials to teachers. You will be given 2 free enrollments which can be used to enroll students in paid courses."
|
description_1: "教師の方に無料トライアルを提供しています。有料コースで生徒さんを入会させるのに使用できる、2つの無料入会権が与えられます。"
|
||||||
# description_1b: "You can find more information on our"
|
description_1b: "詳細は以下のページで参照してください:"
|
||||||
# description_2: "teachers"
|
description_2: "教師用"
|
||||||
# description_3: "page."
|
description_3: "ページ。"
|
||||||
# description_4: "Please fill out this quick survey and we’ll email you setup instructions."
|
description_4: "この簡易アンケートに記入をお願いします。設定手順をメールにてお送りします。"
|
||||||
# email: "Email Address"
|
email: "電子メールアドレス"
|
||||||
school: "学校名"
|
school: "学校名"
|
||||||
location: "市町村"
|
location: "市町村"
|
||||||
# age_students: "How old are your students?"
|
age_students: "生徒さんの年齢を教えてください。"
|
||||||
# under: "Under"
|
under: "未満"
|
||||||
# other: "Other:"
|
other: "その他:"
|
||||||
# amount_students: "How many students do you teach?"
|
amount_students: "何人の生徒さんをお持ちですか?"
|
||||||
# hear_about: "How did you hear about CodeCombat?"
|
hear_about: "CodeCombatをどのようにお知りなりましたか?"
|
||||||
# fill_fields: "Please fill out all fields."
|
fill_fields: "全てのフィールドを記入してください。"
|
||||||
# thanks: "Thanks! We'll send you setup instructions shortly."
|
thanks: "ありがとうございます。設定の手順を追ってお送りします。"
|
||||||
|
|
||||||
versions:
|
versions:
|
||||||
save_version_title: "新しいバージョンをセーブ"
|
save_version_title: "新しいバージョンをセーブ"
|
||||||
|
@ -623,9 +623,9 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
submitting_patch: "パッチを送信中..."
|
submitting_patch: "パッチを送信中..."
|
||||||
cla_prefix: "変更を適用するには, 私達のCLAに同意する必要があります。"
|
cla_prefix: "変更を適用するには, 私達のCLAに同意する必要があります。"
|
||||||
cla_url: "CLA"
|
cla_url: "CLA"
|
||||||
# cla_suffix: "."
|
cla_suffix: "。"
|
||||||
cla_agree: "同意する"
|
cla_agree: "同意する"
|
||||||
# owner_approve: "An owner will need to approve it before your changes will become visible."
|
owner_approve: "ユーザーは変更が実際に表示される前に同意する必要があります。"
|
||||||
|
|
||||||
contact:
|
contact:
|
||||||
contact_us: "お問い合わせ"
|
contact_us: "お問い合わせ"
|
||||||
|
@ -660,23 +660,23 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
password_tab: "パスワード"
|
password_tab: "パスワード"
|
||||||
emails_tab: "メール"
|
emails_tab: "メール"
|
||||||
admin: "管理者"
|
admin: "管理者"
|
||||||
# manage_subscription: "Click here to manage your subscription."
|
manage_subscription: "購読を管理するにはここをクリックしてください。"
|
||||||
new_password: "新パスワード"
|
new_password: "新パスワード"
|
||||||
new_password_verify: "新パスワードを再入力"
|
new_password_verify: "新パスワードを再入力"
|
||||||
type_in_email: "アカウントの削除を確認するために、メールアドレスを入力して下さい。"
|
type_in_email: "アカウントの削除を確認するために、メールアドレスを入力して下さい。"
|
||||||
type_in_email_progress: "進捗を消すために、メールアドレスを入力してください。"
|
type_in_email_progress: "進捗を消すために、メールアドレスを入力してください。"
|
||||||
type_in_password: "そして、パスワードを入力してください。"
|
type_in_password: "そして、パスワードを入力してください。"
|
||||||
email_subscriptions: "ニュースレターの購読"
|
email_subscriptions: "ニュースレターの購読"
|
||||||
email_subscriptions_none: "No Email Subscriptions."
|
email_subscriptions_none: "ニュースレターの購読はありません。"
|
||||||
email_announcements: "お知らせ"
|
email_announcements: "お知らせ"
|
||||||
email_announcements_description: "CodeCombatの最新のニュースや進展をメールで受け取る"
|
email_announcements_description: "CodeCombatの最新のニュースや進展をメールで受け取る"
|
||||||
email_notifications: "通知"
|
email_notifications: "通知"
|
||||||
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
|
email_notifications_summary: "CodeCombatアクティビティに関する自動電子メール通知の管理。"
|
||||||
# email_any_notes: "Any Notifications"
|
email_any_notes: "すべての通知"
|
||||||
# email_any_notes_description: "Disable to stop all activity notification emails."
|
email_any_notes_description: "アクティビティすべての通知メールを停止することを無効にします。"
|
||||||
email_news: "ニュース"
|
email_news: "ニュース"
|
||||||
email_recruit_notes: "求人"
|
email_recruit_notes: "求人"
|
||||||
# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job."
|
email_recruit_notes_description: "上手にプレイしてくれる場合、(更に良い)仕事を紹介するためにこちらから連絡を差し上げる場合があります。"
|
||||||
contributor_emails: "開発を手伝ってくれる人向けのメール"
|
contributor_emails: "開発を手伝ってくれる人向けのメール"
|
||||||
contribute_prefix: "私達は開発を手伝ってくれる人を探しています。 詳しくは "
|
contribute_prefix: "私達は開発を手伝ってくれる人を探しています。 詳しくは "
|
||||||
contribute_page: "こちらのページ"
|
contribute_page: "こちらのページ"
|
||||||
|
|
|
@ -142,7 +142,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
save: "저장"
|
save: "저장"
|
||||||
publish: "내보내기"
|
publish: "내보내기"
|
||||||
create: "생성"
|
create: "생성"
|
||||||
fork: "Fork"
|
fork: "포크"
|
||||||
play: "시작" # When used as an action verb, like "Play next level"
|
play: "시작" # When used as an action verb, like "Play next level"
|
||||||
retry: "재시도"
|
retry: "재시도"
|
||||||
actions: "행동"
|
actions: "행동"
|
||||||
|
@ -164,8 +164,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
accepted: "적용됨"
|
accepted: "적용됨"
|
||||||
rejected: "거부됨"
|
rejected: "거부됨"
|
||||||
withdrawn: "취소됨"
|
withdrawn: "취소됨"
|
||||||
# accept: "Accept"
|
accept: "승인"
|
||||||
# reject: "Reject"
|
reject: "보류"
|
||||||
# withdraw: "Withdraw"
|
# withdraw: "Withdraw"
|
||||||
submitter: "제출자"
|
submitter: "제출자"
|
||||||
submitted: "제출됨"
|
submitted: "제출됨"
|
||||||
|
@ -224,9 +224,9 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
# completed_level: "Completed Level:"
|
# completed_level: "Completed Level:"
|
||||||
# course: "Course:"
|
# course: "Course:"
|
||||||
done: "완료"
|
done: "완료"
|
||||||
# next_level: "Next Level:"
|
next_level: "다음 레벨:"
|
||||||
# next_game: "Next game"
|
next_game: "다음 게임"
|
||||||
# show_menu: "Show game menu"
|
show_menu: "게임 매뉴 보이기"
|
||||||
home: "홈" # Not used any more, will be removed soon.
|
home: "홈" # Not used any more, will be removed soon.
|
||||||
level: "레벨" # Like "Level: Dungeons of Kithgard"
|
level: "레벨" # Like "Level: Dungeons of Kithgard"
|
||||||
skip: "넘어가기"
|
skip: "넘어가기"
|
||||||
|
@ -265,8 +265,8 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
# 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: "바이킹이 되세요"
|
victory_become_a_viking: "바이킹이 되세요"
|
||||||
guide_title: "가이드"
|
guide_title: "가이드"
|
||||||
# tome_cast_button_run: "Run"
|
tome_cast_button_run: "실행"
|
||||||
# tome_cast_button_running: "Running"
|
tome_cast_button_running: "실행중"
|
||||||
# tome_cast_button_ran: "Ran"
|
# tome_cast_button_ran: "Ran"
|
||||||
# tome_submit_button: "Submit"
|
# tome_submit_button: "Submit"
|
||||||
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
|
# tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
|
||||||
|
@ -274,13 +274,13 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
# tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methods).
|
# tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methods).
|
||||||
tome_select_a_thang: "누군가를 선택하세요. "
|
tome_select_a_thang: "누군가를 선택하세요. "
|
||||||
tome_available_spells: "사용 가능한 마법"
|
tome_available_spells: "사용 가능한 마법"
|
||||||
# tome_your_skills: "Your Skills"
|
tome_your_skills: "당신의 스킬"
|
||||||
# tome_current_method: "Current Method"
|
# tome_current_method: "Current Method"
|
||||||
# code_saved: "Code Saved"
|
code_saved: "코드가 저장됨"
|
||||||
skip_tutorial: "넘기기 (esc)"
|
skip_tutorial: "넘기기 (esc)"
|
||||||
keyboard_shortcuts: "단축키"
|
keyboard_shortcuts: "단축키"
|
||||||
loading_ready: "준비!"
|
loading_ready: "준비!"
|
||||||
# loading_start: "Start Level"
|
loading_start: "레벨 시작"
|
||||||
problem_alert_title: "코드를 수정하세요"
|
problem_alert_title: "코드를 수정하세요"
|
||||||
time_current: "현재:"
|
time_current: "현재:"
|
||||||
time_total: "최대:"
|
time_total: "최대:"
|
||||||
|
@ -368,11 +368,11 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
day: "오늘"
|
day: "오늘"
|
||||||
week: "이번 주"
|
week: "이번 주"
|
||||||
# all: "All-Time"
|
# all: "All-Time"
|
||||||
# time: "Time"
|
time: "시간"
|
||||||
# damage_taken: "Damage Taken"
|
# damage_taken: "Damage Taken"
|
||||||
# damage_dealt: "Damage Dealt"
|
# damage_dealt: "Damage Dealt"
|
||||||
# difficulty: "Difficulty"
|
difficulty: "난이도"
|
||||||
# gold_collected: "Gold Collected"
|
gold_collected: "수집된 골드"
|
||||||
|
|
||||||
inventory:
|
inventory:
|
||||||
equipped_item: "장착됨"
|
equipped_item: "장착됨"
|
||||||
|
@ -399,7 +399,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
recovered: "gem 구매후 브라우져를 새로고침 하세요."
|
recovered: "gem 구매후 브라우져를 새로고침 하세요."
|
||||||
price: "x{{gems}} / 한달"
|
price: "x{{gems}} / 한달"
|
||||||
|
|
||||||
# subscribe:
|
subscribe:
|
||||||
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
|
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
|
||||||
# feature1: "110+ basic levels across 4 worlds"
|
# feature1: "110+ basic levels across 4 worlds"
|
||||||
# feature2: "10 powerful <strong>new heroes</strong> with unique skills!"
|
# feature2: "10 powerful <strong>new heroes</strong> with unique skills!"
|
||||||
|
@ -408,16 +408,16 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
# feature5: "Video tutorials"
|
# feature5: "Video tutorials"
|
||||||
# feature6: "Premium email support"
|
# feature6: "Premium email support"
|
||||||
# feature7: "Private <strong>Clans</strong>"
|
# feature7: "Private <strong>Clans</strong>"
|
||||||
# free: "Free"
|
free: "프리"
|
||||||
# month: "month"
|
month: "달"
|
||||||
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
|
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
|
||||||
# subscribe_title: "Subscribe"
|
subscribe_title: "구독"
|
||||||
# unsubscribe: "Unsubscribe"
|
unsubscribe: "구독 해제"
|
||||||
# confirm_unsubscribe: "Confirm Unsubscribe"
|
confirm_unsubscribe: "구독 해제 확인"
|
||||||
# never_mind: "Never Mind, I Still Love You"
|
# never_mind: "Never Mind, I Still Love You"
|
||||||
# thank_you_months_prefix: "Thank you for supporting us these last"
|
# thank_you_months_prefix: "Thank you for supporting us these last"
|
||||||
# thank_you_months_suffix: "months."
|
# thank_you_months_suffix: "months."
|
||||||
# thank_you: "Thank you for supporting CodeCombat."
|
thank_you: "CodeCombat을 도와주셔서 감사합니다."
|
||||||
# sorry_to_see_you_go: "Sorry to see you go! Please let us know what we could have done better."
|
# sorry_to_see_you_go: "Sorry to see you go! Please let us know what we could have done better."
|
||||||
# unsubscribe_feedback_placeholder: "O, what have we done?"
|
# unsubscribe_feedback_placeholder: "O, what have we done?"
|
||||||
# parent_button: "Ask your parent"
|
# parent_button: "Ask your parent"
|
||||||
|
@ -496,29 +496,29 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
# level_to_unlock: "Level to unlock:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
# level_to_unlock: "Level to unlock:" # Label for which level you have to beat to unlock a particular hero (click a locked hero in the store to see)
|
||||||
# restricted_to_certain_heroes: "Only certain heroes can play this level."
|
# restricted_to_certain_heroes: "Only certain heroes can play this level."
|
||||||
|
|
||||||
# skill_docs:
|
skill_docs:
|
||||||
# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
|
# writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
|
||||||
# read_only: "read-only"
|
# read_only: "read-only"
|
||||||
# action: "Action"
|
# action: "Action"
|
||||||
# spell: "Spell"
|
# spell: "Spell"
|
||||||
# action_name: "name"
|
action_name: "이름"
|
||||||
# action_cooldown: "Takes"
|
# action_cooldown: "Takes"
|
||||||
# action_specific_cooldown: "Cooldown"
|
# action_specific_cooldown: "Cooldown"
|
||||||
# action_damage: "Damage"
|
action_damage: "데미지"
|
||||||
# action_range: "Range"
|
action_range: "사거리"
|
||||||
# action_radius: "Radius"
|
# action_radius: "Radius"
|
||||||
# action_duration: "Duration"
|
# action_duration: "Duration"
|
||||||
# example: "Example"
|
example: "예제"
|
||||||
# ex: "ex" # Abbreviation of "example"
|
ex: "예시" # Abbreviation of "example"
|
||||||
# current_value: "Current Value"
|
# current_value: "Current Value"
|
||||||
# default_value: "Default value"
|
# default_value: "Default value"
|
||||||
# parameters: "Parameters"
|
# parameters: "Parameters"
|
||||||
# returns: "Returns"
|
returns: "뒤로가기"
|
||||||
# granted_by: "Granted by"
|
# granted_by: "Granted by"
|
||||||
|
|
||||||
# save_load:
|
save_load:
|
||||||
# granularity_saved_games: "Saved"
|
granularity_saved_games: "저장됨"
|
||||||
# granularity_change_history: "History"
|
granularity_change_history: "기록"
|
||||||
|
|
||||||
options:
|
options:
|
||||||
# general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level
|
# general_options: "General Options" # Check out the Options tab in the Game Menu while playing a level
|
||||||
|
@ -586,20 +586,20 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
# more_info_2: "teachers forum"
|
# more_info_2: "teachers forum"
|
||||||
# more_info_3: "is a good place to connect with fellow educators who are using CodeCombat."
|
# more_info_3: "is a good place to connect with fellow educators who are using CodeCombat."
|
||||||
|
|
||||||
# teachers_survey:
|
teachers_survey:
|
||||||
# title: "Teacher Survey"
|
# title: "Teacher Survey"
|
||||||
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
|
# must_be_logged: "You must be logged in first. Please create an account or log in from the menu above."
|
||||||
# retrieving: "Retrieving information..."
|
# retrieving: "Retrieving information..."
|
||||||
# being_reviewed_1: "Your application for a free trial is being"
|
# being_reviewed_1: "Your application for a free trial is being"
|
||||||
# being_reviewed_2: "reviewed."
|
being_reviewed_2: "검토됨."
|
||||||
# approved_1: "Your application for a free trial was"
|
# approved_1: "Your application for a free trial was"
|
||||||
# approved_2: "approved!"
|
# approved_2: "approved!"
|
||||||
# approved_4: "You can now enroll your students on the"
|
# approved_4: "You can now enroll your students on the"
|
||||||
# approved_5: "courses"
|
# approved_5: "courses"
|
||||||
# approved_6: "page."
|
approved_6: "페이지."
|
||||||
# denied_1: "Your application for a free trial has been"
|
# denied_1: "Your application for a free trial has been"
|
||||||
# denied_2: "denied."
|
denied_2: "거절됨."
|
||||||
# contact_1: "Please contact"
|
contact_1: "연락해주세요."
|
||||||
# contact_2: "if you have further questions."
|
# contact_2: "if you have further questions."
|
||||||
# description_1: "We offer free trials to teachers. You will be given 2 free enrollments which can be used to enroll students in paid courses."
|
# description_1: "We offer free trials to teachers. You will be given 2 free enrollments which can be used to enroll students in paid courses."
|
||||||
# description_1b: "You can find more information on our"
|
# description_1b: "You can find more information on our"
|
||||||
|
@ -620,7 +620,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
|
||||||
versions:
|
versions:
|
||||||
save_version_title: "새로운 버전을 저장합니다"
|
save_version_title: "새로운 버전을 저장합니다"
|
||||||
new_major_version: "신규 버전"
|
new_major_version: "신규 버전"
|
||||||
# submitting_patch: "Submitting Patch..."
|
submitting_patch: "패치 적용중..."
|
||||||
cla_prefix: "변경사항을 저장하기 위해서는, 먼저 계약사항에 동의 하셔야 합니다."
|
cla_prefix: "변경사항을 저장하기 위해서는, 먼저 계약사항에 동의 하셔야 합니다."
|
||||||
cla_url: "CLA"
|
cla_url: "CLA"
|
||||||
cla_suffix: "."
|
cla_suffix: "."
|
||||||
|
|
|
@ -34,7 +34,13 @@ block content
|
||||||
li
|
li
|
||||||
span.spr(data-i18n="courses.additional_resources_1_pref")
|
span.spr(data-i18n="courses.additional_resources_1_pref")
|
||||||
a(href='http://codecombat.com/docs/CodeCombatTeacherGuideCourse1.pdf', data-i18n="courses.additional_resources_1_mid")
|
a(href='http://codecombat.com/docs/CodeCombatTeacherGuideCourse1.pdf', data-i18n="courses.additional_resources_1_mid")
|
||||||
span.spl(data-i18n="courses.additional_resources_1_suff")
|
span.spl.spr(data-i18n="courses.additional_resources_1_mid2")
|
||||||
|
a(href='http://codecombat.com/docs/CodeCombatTeacherGuideCourse2.pdf', data-i18n="courses.additional_resources_1_mid3")
|
||||||
|
span.spl.spr(data-i18n="courses.additional_resources_1_suff")
|
||||||
|
li
|
||||||
|
span.spr(data-i18n="courses.educator_wiki_pref")
|
||||||
|
a(href='https://sites.google.com/a/codecombat.com/teacher-guides/', data-i18n="courses.educator_wiki_mid")
|
||||||
|
span.spl(data-i18n="courses.educator_wiki_suff")
|
||||||
li
|
li
|
||||||
span.spr(data-i18n="courses.additional_resources_2_pref")
|
span.spr(data-i18n="courses.additional_resources_2_pref")
|
||||||
a(href='/teachers/freetrial', data-i18n="teachers_survey.title")
|
a(href='/teachers/freetrial', data-i18n="teachers_survey.title")
|
||||||
|
|
|
@ -43,6 +43,7 @@ module.exports = class SubscribeModal extends ModalView
|
||||||
@setupPaymentMethodsInfoPopover()
|
@setupPaymentMethodsInfoPopover()
|
||||||
if @basicProduct
|
if @basicProduct
|
||||||
@$el.find('.gem-amount').html $.i18n.t('subscribe.feature4').replace('{{gems}}', @basicProduct.get('gems'))
|
@$el.find('.gem-amount').html $.i18n.t('subscribe.feature4').replace('{{gems}}', @basicProduct.get('gems'))
|
||||||
|
@playSound 'game-menu-open'
|
||||||
|
|
||||||
setupParentButtonPopover: ->
|
setupParentButtonPopover: ->
|
||||||
popoverTitle = $.i18n.t 'subscribe.parent_email_title'
|
popoverTitle = $.i18n.t 'subscribe.parent_email_title'
|
||||||
|
@ -221,3 +222,7 @@ module.exports = class SubscribeModal extends ModalView
|
||||||
@state = 'unknown_error'
|
@state = 'unknown_error'
|
||||||
@stateMessage = "#{xhr.status}: #{xhr.responseText}"
|
@stateMessage = "#{xhr.status}: #{xhr.responseText}"
|
||||||
@render()
|
@render()
|
||||||
|
|
||||||
|
onHidden: ->
|
||||||
|
super()
|
||||||
|
@playSound 'game-menu-close'
|
||||||
|
|
43
scripts/analytics/mongodb/queries/schoolCounts.js
Normal file
43
scripts/analytics/mongodb/queries/schoolCounts.js
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
// Print out school user counts
|
||||||
|
|
||||||
|
// Usage:
|
||||||
|
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
|
||||||
|
|
||||||
|
|
||||||
|
var scriptStartTime = new Date();
|
||||||
|
|
||||||
|
var cursor = db.users.find({
|
||||||
|
$and: [
|
||||||
|
{anonymous: false},
|
||||||
|
{schoolName: {$exists: true}},
|
||||||
|
{schoolName: {$ne: ''}}
|
||||||
|
]
|
||||||
|
}, {schoolName: 1});
|
||||||
|
|
||||||
|
var schoolCountMap = {};
|
||||||
|
while (cursor.hasNext()) {
|
||||||
|
var doc = cursor.next();
|
||||||
|
if (!schoolCountMap[doc.schoolName]) schoolCountMap[doc.schoolName] = 0;
|
||||||
|
schoolCountMap[doc.schoolName]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
var schoolCounts = [];
|
||||||
|
for (var schoolName in schoolCountMap) {
|
||||||
|
schoolCounts.push({schoolName: schoolName, count: schoolCountMap[schoolName]});
|
||||||
|
}
|
||||||
|
schoolCounts.sort(function(a, b) {
|
||||||
|
if (a.count > b.count) return -1;
|
||||||
|
else if (a.count === b.count) return 0;
|
||||||
|
return 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (var i = 0; i < schoolCounts.length; i++) {
|
||||||
|
if (schoolCounts[i].count >= 10)
|
||||||
|
print(schoolCounts[i].count, schoolCounts[i].schoolName);
|
||||||
|
}
|
||||||
|
|
||||||
|
log("Script runtime: " + (new Date() - scriptStartTime));
|
||||||
|
|
||||||
|
function log(str) {
|
||||||
|
print(new Date().toISOString() + " " + str);
|
||||||
|
}
|
182
scripts/analytics/mongodb/queries/userTypesBySchool.js
Normal file
182
scripts/analytics/mongodb/queries/userTypesBySchool.js
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
/* global printjson */
|
||||||
|
/* global db */
|
||||||
|
// Find user type counts by school
|
||||||
|
|
||||||
|
// Usage:
|
||||||
|
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
|
||||||
|
|
||||||
|
// TODO: include data for users with unknown school
|
||||||
|
|
||||||
|
var scriptStartTime = new Date();
|
||||||
|
|
||||||
|
var toString = Object.prototype.toString;
|
||||||
|
var _ = {
|
||||||
|
isString: function (obj) {
|
||||||
|
return toString.call(obj) == '[object String]';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var printLineMax = 40;
|
||||||
|
|
||||||
|
var schoolTypes = ['courses paid', 'courses trial', 'courses free', 'campaign paid', 'campaign trial', 'campaign free'];
|
||||||
|
|
||||||
|
var schoolTypeCounts = getSchoolTypeCounts();
|
||||||
|
|
||||||
|
schoolTypeCounts.sort(function(a, b) {
|
||||||
|
if (a['courses paid'] > b['courses paid']) return -1;
|
||||||
|
else if (a['courses paid'] === b['courses paid'] && a['courses trial'] > b['courses trial']) return -1;
|
||||||
|
else if (a['courses paid'] === b['courses paid'] && a['courses trial'] == b['courses trial'] && a['courses free'] > b['courses free']) return -1;
|
||||||
|
else if (a['courses paid'] === b['courses paid'] && a['courses trial'] == b['courses trial'] && a['courses free'] === b['courses free'] && a['campaign paid'] > b['campaign paid']) return -1;
|
||||||
|
else if (a['courses paid'] === b['courses paid'] && a['courses trial'] == b['courses trial'] && a['courses free'] === b['courses free'] && a['campaign paid'] === b['campaign paid'] && a['campaign trial'] > b['campaign trial']) return -1;
|
||||||
|
else if (a['courses paid'] === b['courses paid'] && a['courses trial'] == b['courses trial'] && a['courses free'] === b['courses free'] && a['campaign paid'] === b['campaign paid'] && a['campaign trial'] === b['campaign trial'] && a['campaign free'] > b['campaign free']) return -1;
|
||||||
|
else if (a['courses paid'] === b['courses paid'] && a['courses trial'] == b['courses trial'] && a['courses free'] === b['courses free'] && a['campaign paid'] === b['campaign paid'] && a['campaign trial'] === b['campaign trial'] && a['campaign free'] === b['campaign free']) return 0;
|
||||||
|
return 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
print('total\tcourses paid\tcourses trial\tcourses free\tcampaign paid\tcampaign trial\tcampaign free\tschool');
|
||||||
|
for (var i = 0; i < schoolTypeCounts.length; i++) {
|
||||||
|
var schoolData = schoolTypeCounts[i];
|
||||||
|
print(schoolData['total'], '\t', schoolData['courses paid'], '\t', schoolData['courses trial'], '\t', schoolData['courses free'], '\t', schoolData['campaign paid'], '\t', schoolData['campaign trial'], '\t', schoolData['campaign free'], '\t', schoolData.schoolName);
|
||||||
|
if (i >= printLineMax - 1) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
schoolTypeCounts.sort(function(a, b) {
|
||||||
|
if (a.total > b.total) return -1;
|
||||||
|
else if (a.total === b.total) return 0;
|
||||||
|
return 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
print('total\tcourses paid\tcourses trial\tcourses free\tcampaign paid\tcampaign trial\tcampaign free\tschool');
|
||||||
|
for (var i = 0; i < schoolTypeCounts.length; i++) {
|
||||||
|
var schoolData = schoolTypeCounts[i];
|
||||||
|
print(schoolData['total'], '\t', schoolData['courses paid'], '\t', schoolData['courses trial'], '\t', schoolData['courses free'], '\t', schoolData['campaign paid'], '\t', schoolData['campaign trial'], '\t', schoolData['campaign free'], '\t', schoolData.schoolName);
|
||||||
|
if (i >= printLineMax - 1) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
log("Script runtime: " + (new Date() - scriptStartTime));
|
||||||
|
|
||||||
|
|
||||||
|
function getSchoolTypeCounts() {
|
||||||
|
// Find users with school data
|
||||||
|
log("Finding users with a school name..");
|
||||||
|
var prepaidIDs = [];
|
||||||
|
var userIDs = [];
|
||||||
|
var prepaidUserMap = {};
|
||||||
|
var userSchoolMap = {};
|
||||||
|
var userSubscriptionMap = {};
|
||||||
|
var cursor = db.users.find({
|
||||||
|
$and: [
|
||||||
|
{anonymous: false},
|
||||||
|
{schoolName: {$exists: true}},
|
||||||
|
{schoolName: {$ne: ''}}
|
||||||
|
]
|
||||||
|
}, {coursePrepaidID: 1, schoolName: 1, stripe: 1});
|
||||||
|
while (cursor.hasNext()) {
|
||||||
|
var doc = cursor.next();
|
||||||
|
var userID = doc._id.valueOf();
|
||||||
|
if (doc.coursePrepaidID) {
|
||||||
|
prepaidIDs.push(doc.coursePrepaidID);
|
||||||
|
var prepaidID = doc.coursePrepaidID.valueOf();
|
||||||
|
if (!prepaidUserMap[prepaidID]) prepaidUserMap[prepaidID] = [];
|
||||||
|
prepaidUserMap[prepaidID].push(userID);
|
||||||
|
}
|
||||||
|
if (doc.stripe && (doc.stripe.sponsorID || doc.stripe.subscriptionID || _.isString(doc.stripe.free) && new Date() < new Date(doc.stripe.free))) {
|
||||||
|
userSubscriptionMap[userID] = true;
|
||||||
|
}
|
||||||
|
userIDs.push(userID);
|
||||||
|
userSchoolMap[userID] = doc.schoolName;
|
||||||
|
}
|
||||||
|
log("Users with schools: " + userIDs.length);
|
||||||
|
// printjson(userSubscriptionMap);
|
||||||
|
|
||||||
|
// Find user types
|
||||||
|
var userTypeMap = {};
|
||||||
|
|
||||||
|
// courses paid: coursePrepaidID set, prepaid not trial
|
||||||
|
// courses trial: coursePrepaidID set, prepaid has trialRequestID set
|
||||||
|
log("Finding courses prepaids..");
|
||||||
|
var cursor = db.prepaids.find({_id: {$in: prepaidIDs}}, {properties: 1});
|
||||||
|
while (cursor.hasNext()) {
|
||||||
|
var doc = cursor.next();
|
||||||
|
var prepaidID = doc._id.valueOf();
|
||||||
|
if (prepaidUserMap[prepaidID]) {
|
||||||
|
var type = doc.properties && doc.properties.trialRequestID ? 'courses trial' : 'courses paid';
|
||||||
|
for (var i = 0; i < prepaidUserMap[prepaidID].length; i++) {
|
||||||
|
userTypeMap[prepaidUserMap[prepaidID][i]] = type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print("ERROR");
|
||||||
|
printjson(doc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// printjson(userTypeMap);
|
||||||
|
|
||||||
|
// courses free: class member, no coursePrepaidID not set
|
||||||
|
log("Finding classrooms..");
|
||||||
|
var userClassroomMap = {};
|
||||||
|
var cursor = db.classrooms.find({}, {members: 1});
|
||||||
|
while (cursor.hasNext()) {
|
||||||
|
var doc = cursor.next();
|
||||||
|
if (doc.members) {
|
||||||
|
for (var i = 0; i < doc.members.length; i++) {
|
||||||
|
userClassroomMap[doc.members[i].valueOf()] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var i = 0; i < userIDs.length; i++) {
|
||||||
|
if (!userTypeMap[userIDs[i]] && userClassroomMap[userIDs[i]]) {
|
||||||
|
userTypeMap[userIDs[i]] = 'courses free';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// campaign trial: has subscription and trial request
|
||||||
|
log("Finding trial requests..");
|
||||||
|
var cursor = db.trial.requests.find({status: 'approved'}, {applicant: 1});
|
||||||
|
while (cursor.hasNext()) {
|
||||||
|
var doc = cursor.next();
|
||||||
|
if (doc.applicant) {
|
||||||
|
var userID = doc.applicant.valueOf();
|
||||||
|
if (!userTypeMap[userID] && userSubscriptionMap[userID]) userTypeMap[userID] = 'campaign trial';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// campaign paid: has subscription, no approved trial request
|
||||||
|
// campaign free: no other matches
|
||||||
|
log("Setting remaining user types to campaign paid or free..");
|
||||||
|
for (var i = 0; i < userIDs.length; i++) {
|
||||||
|
if (!userTypeMap[userIDs[i]]) userTypeMap[userIDs[i]] = userSubscriptionMap[userIDs[i]] ? 'campaign paid' : 'campaign free';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tally user types per school
|
||||||
|
var schoolTypeCountMap = {};
|
||||||
|
for (var userID in userTypeMap) {
|
||||||
|
var schoolName = userSchoolMap[userID];
|
||||||
|
var type = userTypeMap[userID];
|
||||||
|
if (!schoolTypeCountMap[schoolName]) schoolTypeCountMap[schoolName] = {};
|
||||||
|
if (!schoolTypeCountMap[schoolName][type]) schoolTypeCountMap[schoolName][type] = 0;
|
||||||
|
schoolTypeCountMap[schoolName][type]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
var schoolTypeCounts = [];
|
||||||
|
for (var schoolName in schoolTypeCountMap) {
|
||||||
|
var schoolData = {schoolName: schoolName, total: 0};
|
||||||
|
for (var type in schoolTypeCountMap[schoolName]) {
|
||||||
|
schoolData[type] = schoolTypeCountMap[schoolName][type];
|
||||||
|
schoolData.total += schoolTypeCountMap[schoolName][type];
|
||||||
|
}
|
||||||
|
for (var i = 0; i < schoolTypes.length; i++) {
|
||||||
|
if (!schoolData[schoolTypes[i]]) schoolData[schoolTypes[i]] = 0;
|
||||||
|
}
|
||||||
|
schoolTypeCounts.push(schoolData);
|
||||||
|
}
|
||||||
|
log("School count: " + schoolTypeCounts.length);
|
||||||
|
|
||||||
|
return schoolTypeCounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function log(str) {
|
||||||
|
print(new Date().toISOString() + " " + str);
|
||||||
|
}
|
|
@ -12,10 +12,8 @@ var courses =
|
||||||
name: "Introduction to Computer Science",
|
name: "Introduction to Computer Science",
|
||||||
slug: "introduction-to-computer-science",
|
slug: "introduction-to-computer-science",
|
||||||
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
|
||||||
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables'],
|
|
||||||
description: "Learn basic syntax, while loops, and the CodeCombat environment.",
|
description: "Learn basic syntax, while loops, and the CodeCombat environment.",
|
||||||
duration: NumberInt(1),
|
duration: NumberInt(1),
|
||||||
pricePerSeat: NumberInt(0),
|
|
||||||
free: true,
|
free: true,
|
||||||
screenshot: "/images/pages/courses/101_info.png"
|
screenshot: "/images/pages/courses/101_info.png"
|
||||||
},
|
},
|
||||||
|
@ -23,10 +21,8 @@ var courses =
|
||||||
name: "Computer Science 2",
|
name: "Computer Science 2",
|
||||||
slug: "computer-science-2",
|
slug: "computer-science-2",
|
||||||
campaignID: ObjectId("562f88e84df18473073c74e2"),
|
campaignID: ObjectId("562f88e84df18473073c74e2"),
|
||||||
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables', 'if_statements'],
|
|
||||||
description: "Introduce Arguments, Variables, If Statements, and Arithmetic.",
|
description: "Introduce Arguments, Variables, If Statements, and Arithmetic.",
|
||||||
duration: NumberInt(5),
|
duration: NumberInt(5),
|
||||||
pricePerSeat: NumberInt(400),
|
|
||||||
free: false,
|
free: false,
|
||||||
screenshot: "/images/pages/courses/102_info.png"
|
screenshot: "/images/pages/courses/102_info.png"
|
||||||
},
|
},
|
||||||
|
@ -34,10 +30,8 @@ var courses =
|
||||||
name: "Computer Science 3",
|
name: "Computer Science 3",
|
||||||
slug: "computer-science-3",
|
slug: "computer-science-3",
|
||||||
campaignID: ObjectId("56462ac4410c528505e1160a"),
|
campaignID: ObjectId("56462ac4410c528505e1160a"),
|
||||||
concepts: ['if_statements', 'arithmetic'],
|
|
||||||
description: "Introduces arithmetic, counters, advanced while loops, break, continue, arrays.",
|
description: "Introduces arithmetic, counters, advanced while loops, break, continue, arrays.",
|
||||||
duration: NumberInt(5),
|
duration: NumberInt(5),
|
||||||
pricePerSeat: NumberInt(400),
|
|
||||||
free: false,
|
free: false,
|
||||||
screenshot: "/images/pages/courses/103_info.png"
|
screenshot: "/images/pages/courses/103_info.png"
|
||||||
},
|
},
|
||||||
|
@ -45,12 +39,19 @@ var courses =
|
||||||
name: "Computer Science 4",
|
name: "Computer Science 4",
|
||||||
slug: "computer-science-4",
|
slug: "computer-science-4",
|
||||||
campaignID: ObjectId("56462c1133f1478605ebd018"),
|
campaignID: ObjectId("56462c1133f1478605ebd018"),
|
||||||
concepts: ['if_statements', 'arithmetic'],
|
|
||||||
description: "Introduces object literals, for loops, function definitions, drawing, and modulo.",
|
description: "Introduces object literals, for loops, function definitions, drawing, and modulo.",
|
||||||
duration: NumberInt(5),
|
duration: NumberInt(5),
|
||||||
pricePerSeat: NumberInt(400),
|
|
||||||
free: false,
|
free: false,
|
||||||
screenshot: "/images/pages/courses/104_info.png"
|
screenshot: "/images/pages/courses/104_info.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Computer Science 5",
|
||||||
|
slug: "computer-science-5",
|
||||||
|
campaignID: ObjectId("568ad069a6584820004437f2"),
|
||||||
|
description: "Introduces function parameters, function return values and algorithms.",
|
||||||
|
duration: NumberInt(5),
|
||||||
|
free: false,
|
||||||
|
screenshot: "/images/pages/courses/105_info.png"
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ describe 'lib/FacebookHandler.coffee', ->
|
||||||
expect(FB.api).toHaveBeenCalled()
|
expect(FB.api).toHaveBeenCalled()
|
||||||
apiArgs = FB.api.calls.argsFor(0)
|
apiArgs = FB.api.calls.argsFor(0)
|
||||||
expect(apiArgs[0]).toBe('/me')
|
expect(apiArgs[0]).toBe('/me')
|
||||||
apiArgs[1](mockMe) # sending the 'response'
|
apiArgs[2](mockMe) # sending the 'response'
|
||||||
request = jasmine.Ajax.requests.mostRecent()
|
request = jasmine.Ajax.requests.mostRecent()
|
||||||
expect(request).toBeDefined()
|
expect(request).toBeDefined()
|
||||||
params = JSON.parse request.params
|
params = JSON.parse request.params
|
||||||
|
|
Loading…
Reference in a new issue