This commit is contained in:
Nicholas Winter 2015-09-12 06:54:32 -07:00
commit a4c1a599da
15 changed files with 447 additions and 132 deletions

View file

@ -206,3 +206,40 @@ module.exports.getCoursesPrice = getSponsoredSubsAmount = (courses, seats=20) ->
else else
pricePerSeat = parseInt(totalPricePerSeat) pricePerSeat = parseInt(totalPricePerSeat)
seats * pricePerSeat seats * pricePerSeat
module.exports.getCoursePraise = getCoursePraise = ->
praise = [
{
quote: "The kids love it."
source: "Leo Joseph Tran, Athlos Leadership Academy"
},
{
quote: "My students have been using the site for a couple of weeks and they love it."
source: "Scott Hatfield, Computer Applications Teacher, School Technology Coordinator, Eastside Middle School"
},
{
quote: "Thanks for the captivating site. My eighth graders love it."
source: "Janet Cook, Ansbach Middle/High School"
},
{
quote: "My students have started working on CodeCombat and love it! I love that they are learning coding and problem solving skills without them even knowing it!!"
source: "Kristin Huff, Special Education Teacher, Webb City School District"
},
{
quote: "I recently introduced Code Combat to a few of my fifth graders and they are loving it!"
source: "Shauna Hamman, Fifth Grade Teacher, Four Peaks Elementary School"
},
{
quote: "Overall I think it's a fantastic service. Variables, arrays, loops, all covered in very fun and imaginative ways. Every kid who has tried it is a fan."
source: "Aibinder Andrew, Technology Teacher"
},
{
quote: "I love what you have created. The kids are so engaged."
source: "Desmond Smith, 4KS Academy"
},
{
quote: "My students love the website and I hope on having content structured around it in the near future."
source: "Michael Leonard, Science Teacher, Clearwater Central Catholic High School"
}
]
praise[_.random(0, praise.length - 1)]

View file

@ -485,46 +485,46 @@ module.exports = nativeDescription: "български език", englishDescri
# subscribe_prepaid: "Click Subscribe to use prepaid code" # subscribe_prepaid: "Click Subscribe to use prepaid code"
# using_prepaid: "Using prepaid code for monthly subscription" # using_prepaid: "Using prepaid code for monthly subscription"
# choose_hero: choose_hero:
# choose_hero: "Choose Your Hero" choose_hero: "Избери си герой"
# programming_language: "Programming Language" programming_language: "Език за програмиране"
# programming_language_description: "Which programming language do you want to use?" programming_language_description: "Кой език за програмиране би искал да използваш?"
# default: "Default" default: "По подразбиране"
# experimental: "Experimental" experimental: "Експериментално"
# python_blurb: "Simple yet powerful, great for beginners and experts." python_blurb: "Прост,но мощен, идеален за начинаещи и експерти."
# javascript_blurb: "The language of the web. (Not the same as Java.)" javascript_blurb: "Езикът на мрежата. (Не е същия като Java.)"
# coffeescript_blurb: "Nicer JavaScript syntax." coffeescript_blurb: "По-добър синтаксис от JavaScript."
# clojure_blurb: "A modern Lisp." clojure_blurb: "Модерен Lisp."
# lua_blurb: "Game scripting language." lua_blurb: "Скриптен език за игри."
# io_blurb: "Simple but obscure." io_blurb: "Прост, но неизвестен."
# status: "Status" status: "Статус"
# hero_type: "Type" hero_type: "Тип"
# weapons: "Weapons" weapons: "Оръжия"
# weapons_warrior: "Swords - Short Range, No Magic" weapons_warrior: "Мечове - Къс Обсег, Без Магия"
# weapons_ranger: "Crossbows, Guns - Long Range, No Magic" weapons_ranger: "Арбалети, Пистолети - Далечен Обсег, Без магия"
# weapons_wizard: "Wands, Staffs - Long Range, Magic" weapons_wizard: "Жезли, Принадлежности - Далечен Обсег, Магия"
# attack: "Damage" # Can also translate as "Attack" attack: "Щета" # Може също да се преведе като "Атака"
# health: "Health" health: "Здраве"
# speed: "Speed" speed: "Скорост"
# regeneration: "Regeneration" regeneration: "Възстановяване"
# range: "Range" # As in "attack or visual range" range: "Обсег" # както в "обсег на атаката или визуален обсег"
# blocks: "Blocks" # As in "this shield blocks this much damage" blocks: "Защита" # както в "този щит може да те защити от много удари"
# backstab: "Backstab" # As in "this dagger does this much backstab damage" backstab: "Удар в гърба" # както в "тази кама може да е много опасна при удар в гърба"
# skills: "Skills" skills: "Умения"
# attack_1: "Deals" attack_1: "Количество"
# attack_2: "of listed" attack_2: "на изброените"
# attack_3: "weapon damage." attack_3: "щети от оръжия."
# health_1: "Gains" health_1: "Печалби"
# health_2: "of listed" health_2: "от изброените"
# health_3: "armor health." health_3: "защитни брони."
# speed_1: "Moves at" speed_1: "Движения"
# speed_2: "meters per second." speed_2: "в метри за секунда"
# available_for_purchase: "Available for Purchase" # Shows up when you have unlocked, but not purchased, a hero in the hero store available_for_purchase: "На разположение за закупуване" # Показва се когато сте достигнали, но не сте закупили герой от магазина за герои "
# 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: "Ниво на отключване:" # Етикет за нивото, което трябва да достигнеш за да отключиш определен герой (кликни на заключения герой в магазина за да видиш)
# restricted_to_certain_heroes: "Only certain heroes can play this level." restricted_to_certain_heroes: "Само определени герои могат да играят това ниво."
# 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 Skils while playing a level to see most of this
# read_only: "read-only" # read_only: "read-only"
# action_name: "name" # action_name: "name"
# action_cooldown: "Takes" # action_cooldown: "Takes"

View file

@ -255,8 +255,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
victory_new_item: "Objeto Nuevo" victory_new_item: "Objeto Nuevo"
victory_viking_code_school: "Santo cielo, Holy smokes, el nivel que acabas de pasar era dificil! Si todavía no eres un desarrollador de software, deberías serlo. Acabas de conseguir una aceptación por vía rápida con la Escuela Vikinga de Có, donde tú puedes llevar tus habilidades al siguiente nivel y convertirteen un desarrollador web profesional en 14 semanas." victory_viking_code_school: "Santo cielo, Holy smokes, el nivel que acabas de pasar era dificil! Si todavía no eres un desarrollador de software, deberías serlo. Acabas de conseguir una aceptación por vía rápida con la Escuela Vikinga de Có, donde tú puedes llevar tus habilidades al siguiente nivel y convertirteen un desarrollador web profesional en 14 semanas."
victory_become_a_viking: "Conviértete en un Vikingo" victory_become_a_viking: "Conviértete en un Vikingo"
# victory_bloc: "Great work! Your skills are improving, and someone's taking notice. If you've considered becoming a software developer, this may be your lucky day. Bloc is an online bootcamp that pairs you 1-on-1 with an expert mentor who will help train you into a professional developer! By beating A Mayhem of Munchkins, you're now eligible for a $500 price reduction with the code: CCRULES" # victory_bloc: "¡Buen trabajo! Tus habilidades están mejorando, y alguien ya se dió cuenta. Si has considerado convertirte en un desarrollador de software, este podría ser tu día de suerte. Bloc es un online bootcamp que te pairs 1-on-1 with an expert mentor who will help train you into a professional developer! By beating A Mayhem of Munchkins, you're now eligible for a $500 price reduction with the code: CCRULES"
# victory_bloc_cta: "Meet your mentor learn about Bloc" victory_bloc_cta: "Conoce a tu mentor aprende acerca de Bloc"
guide_title: "Guía" guide_title: "Guía"
tome_minion_spells: "Hechizos de tus Secuaces" # Only in old-style levels. tome_minion_spells: "Hechizos de tus Secuaces" # Only in old-style levels.
tome_read_only_spells: "Hechizos de Sólo Lectura" # Only in old-style levels. tome_read_only_spells: "Hechizos de Sólo Lectura" # Only in old-style levels.
@ -438,19 +438,19 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
payment_methods_blurb1: "Actualmente aceptamos tarjetas de credito y Alipay." payment_methods_blurb1: "Actualmente aceptamos tarjetas de credito y Alipay."
payment_methods_blurb2: "Si necesitas una forma alternativa de pago, por favor contactarse" payment_methods_blurb2: "Si necesitas una forma alternativa de pago, por favor contactarse"
# sale_already_subscribed: "You're already subscribed!" # sale_already_subscribed: "You're already subscribed!"
# sale_blurb1: "Save 35%" sale_blurb1: "Ahorra 35%"
# sale_blurb2: "off regular subscription price of $120 for a whole year!" # {changed} # sale_blurb2: "off regular subscription price of $120 for a whole year!" # {changed}
# sale_button: "Sale!" # sale_button: "Sale!"
# sale_button_title: "Save 35% when you purchase a 1 year subscription" # sale_button_title: "Save 35% when you purchase a 1 year subscription"
# sale_click_here: "Click Here" sale_click_here: "Haz Click Aquí"
# sale_ends: "Ends" sale_ends: "Termina"
# sale_extended: "*Existing subscriptions will be extended by 1 year." # sale_extended: "*Existing subscriptions will be extended by 1 year."
# sale_feature_here: "Here's what you'll get:" # sale_feature_here: "Here's what you'll get:"
# sale_feature2: "Access to 9 powerful <strong>new heroes</strong> with unique skills!" # sale_feature2: "Access to 9 powerful <strong>new heroes</strong> with unique skills!"
# sale_feature4: "<strong>42,000 bonus gems</strong> awarded immediately!" # sale_feature4: "<strong>42,000 bonus gems</strong> awarded immediately!"
# sale_continue: "Ready to continue adventuring?" # sale_continue: "Ready to continue adventuring?"
# sale_limited_time: "Limited time offer!" sale_limited_time: "¡Oferta por tiempo limitado!"
# sale_new_heroes: "New heroes!" sale_new_heroes: "¡Nuevos héroes!"
# sale_title: "Back to School Sale" # sale_title: "Back to School Sale"
# sale_view_button: "Buy 1 year subscription for" # sale_view_button: "Buy 1 year subscription for"
stripe_description: "Suscripción Mensual" stripe_description: "Suscripción Mensual"
@ -547,7 +547,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
options: options:
general_options: "Opciones Generales" # Check out the Options tab in the Game Menu while playing a level general_options: "Opciones Generales" # Check out the Options tab in the Game Menu while playing a level
volume_label: "Volumen" volume_label: "Volúmen"
music_label: "Música" music_label: "Música"
music_description: "Música encendida/apagada." music_description: "Música encendida/apagada."
editor_config: "Config. de Editor" editor_config: "Config. de Editor"
@ -582,7 +582,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
press_paragraph_1_link: "paquete de prensa" press_paragraph_1_link: "paquete de prensa"
press_paragraph_1_suffix: ". Todos los logos e imágenes pueden ser usados sin contactarnos directamente." press_paragraph_1_suffix: ". Todos los logos e imágenes pueden ser usados sin contactarnos directamente."
team: "Equipo" team: "Equipo"
george_title: "CEO" # {change} george_title: "Director Ejecutivo"
george_blurb: "Negociante" george_blurb: "Negociante"
scott_title: "Programador" # {change} scott_title: "Programador" # {change}
scott_blurb: "Razonable" scott_blurb: "Razonable"
@ -665,10 +665,10 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
denied_2: "denegada." denied_2: "denegada."
contact_1: "Por favor contáctenos" contact_1: "Por favor contáctenos"
contact_2: "si tiene más preguntas." contact_2: "si tiene más preguntas."
# description_1: "We offer free subscriptions to teachers for evaluation purposes. You can find more information on our" # description_1: "Ofrecemos free subscriptions to teachers for evaluation purposes. You can find more information on our"
description_2: "página" description_2: "página"
description_3: "de maestros." description_3: "de maestros."
# description_4: "Please fill out this quick survey and well email you setup instructions." # description_4: "Por favor fill out this quick survey and well email you setup instructions."
email: "Dirección de email" email: "Dirección de email"
school: "Nombre del colegio" school: "Nombre del colegio"
location: "Nombre de la ciudad" location: "Nombre de la ciudad"
@ -688,7 +688,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
cla_url: "CLA" cla_url: "CLA"
cla_suffix: "." cla_suffix: "."
cla_agree: "ACEPTO" cla_agree: "ACEPTO"
# owner_approve: "An owner will need to approve it before your changes will become visible." owner_approve: "Un dueño necesitará aprobarlo antes de que tus cambios puedan ser visibles."
contact: contact:
contact_us: "Contacta a CodeCombat" contact_us: "Contacta a CodeCombat"
@ -779,12 +779,12 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
introduction: "Mira las maneras en las que puedes involucrarte adelante y decide qué es más divertido. ¡Queremos trabajar contigo!" introduction: "Mira las maneras en las que puedes involucrarte adelante y decide qué es más divertido. ¡Queremos trabajar contigo!"
level_editor_prefix: "Usar CodeCombat" level_editor_prefix: "Usar CodeCombat"
level_editor_suffix: "para crear y editar niveles. Los han creado niveles para sus clases, amigos, hackatones, estudiantes, familiares. Si crear un nuevo juego luce intimidante puedes ¡comenzar con base en uno nuestro!" level_editor_suffix: "para crear y editar niveles. Los han creado niveles para sus clases, amigos, hackatones, estudiantes, familiares. Si crear un nuevo juego luce intimidante puedes ¡comenzar con base en uno nuestro!"
thang_editor_prefix: "Nosotros llamamos a las unidades del juego 'thangs'. Usa el" thang_editor_prefix: "Nosotros llamamos a las unidades del juego 'Tiliches'. Usa el"
thang_editor_suffix: "para modificar el arte de CodeCombat. Permite a las unidades lanzar proyectiles, altera la dirección de una animación, cambia los puntos de vida de una unidad o sube tu propio sprite de vectores." thang_editor_suffix: "para modificar el arte de CodeCombat. Permite a las unidades lanzar proyectiles, altera la dirección de una animación, cambia los puntos de vida de una unidad o sube tu propio sprite de vectores."
article_editor_prefix: "¿Ves algún error en nuestros documentos? ¿Quieres hacer algunas instrucciones para tus propias creaciones? Revisa el" article_editor_prefix: "¿Ves algún error en nuestros documentos? ¿Quieres hacer algunas instrucciones para tus propias creaciones? Revisa el"
article_editor_suffix: "y ayuda a los jugadores de CodeCombat conseguir lo más posible de su tiempo jugando." article_editor_suffix: "y ayuda a los jugadores de CodeCombat conseguir lo más posible de su tiempo jugando."
find_us: "Encuentranos en etsos sitios" find_us: "Encuentranos en etsos sitios"
# social_github: "Check out all our code on GitHub" social_github: "Checa todo nuestro código en el GitHub"
social_blog: "Lee el blog de CodeCombat en Sett" social_blog: "Lee el blog de CodeCombat en Sett"
social_discource: "Unite a la discusión en nuestro foro" social_discource: "Unite a la discusión en nuestro foro"
social_facebook: "Me Gusta CodeCombat en Facebook" social_facebook: "Me Gusta CodeCombat en Facebook"
@ -806,7 +806,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
my_clans: "Mis Clanes" my_clans: "Mis Clanes"
clan_name: "Nombre del clan" clan_name: "Nombre del clan"
name: "Nombre" name: "Nombre"
# chieftain: "Chieftain" chieftain: "Cacique/Líder" #Chieftain/Leader literally
type: "Tipo" type: "Tipo"
edit_clan_name: "Editar el nombre del Clan" edit_clan_name: "Editar el nombre del Clan"
edit_clan_description: "Editar descripción del clan" edit_clan_description: "Editar descripción del clan"
@ -836,7 +836,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
latest_achievement: "último logro" latest_achievement: "último logro"
playtime: "Tiempo de juego" playtime: "Tiempo de juego"
last_played: "Último jugado" last_played: "Último jugado"
# leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances." # leagues_explanation: "Juega en una liga contra otros miembros del clan en these multiplayer arena instances."
classes: classes:
archmage_title: "Archimago" archmage_title: "Archimago"
@ -861,7 +861,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
editor: editor:
main_title: "Editor de CodeCombat" main_title: "Editor de CodeCombat"
article_title: "Editor de Artículo" article_title: "Editor de Artículo"
thang_title: "Editor de Thangs" thang_title: "Editor de Tiliches"
level_title: "Editor de Nivel" level_title: "Editor de Nivel"
achievement_title: "Editor de logros" achievement_title: "Editor de logros"
poll_title: "Editor de Encuesta" poll_title: "Editor de Encuesta"
@ -884,23 +884,23 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
wiki: "Wiki" wiki: "Wiki"
live_chat: "Chat en vivo" live_chat: "Chat en vivo"
thang_main: "Principal" thang_main: "Principal"
thang_spritesheets: "Spritesheets" thang_spritesheets: "Hojas de figuras( para animaciones )"
thang_colors: "Colores" thang_colors: "Colores"
level_some_options: "¿Algunas opciones?" level_some_options: "¿Algunas opciones?"
level_tab_thangs: "Thangs" level_tab_thangs: "Tiliches" #Verificar cual es mejor: Cachivache, Tiliche, Artilugio, Bagatela, Cosa
level_tab_scripts: "Scripts" level_tab_scripts: "Scripts"
level_tab_settings: "Opciones" level_tab_settings: "Opciones"
level_tab_components: "Componentes" level_tab_components: "Componentes"
level_tab_systems: "Sistemas" level_tab_systems: "Sistemas"
level_tab_docs: "Documentación" level_tab_docs: "Documentación"
level_tab_thangs_title: "Thangs Actuales" level_tab_thangs_title: "Tiliches Actuales"
level_tab_thangs_all: "Todo" level_tab_thangs_all: "Todo"
level_tab_thangs_conditions: "Condiciones Iniciales" level_tab_thangs_conditions: "Condiciones Iniciales"
level_tab_thangs_add: "Agregar Thangs" level_tab_thangs_add: "Agregar Tiliches"
# level_tab_thangs_search: "Search thangs" level_tab_thangs_search: "Buscar thangs"
add_components: "Agregar Componentes" add_components: "Agregar Componentes"
component_configs: "Configuraciones del Componente" component_configs: "Configuraciones del Componente"
config_thang: "Doble clic para configurar un thang" config_thang: "Doble clic para configurar un Tiliche"
delete: "Borrar" delete: "Borrar"
duplicate: "Duplicar" duplicate: "Duplicar"
stop_duplicate: "Parar de Duplicar" stop_duplicate: "Parar de Duplicar"
@ -911,7 +911,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
level_systems_tab_title: "Sistemas Actuales" level_systems_tab_title: "Sistemas Actuales"
level_systems_btn_new: "Crear Nuevo Sistema" level_systems_btn_new: "Crear Nuevo Sistema"
level_systems_btn_add: "Agregar Sistema" level_systems_btn_add: "Agregar Sistema"
level_components_title: "Regresar a todos los Thangs" level_components_title: "Regresar a todos los Tiliches"
level_components_type: "Tipo" level_components_type: "Tipo"
level_component_edit_title: "Editar Componente" level_component_edit_title: "Editar Componente"
level_component_config_schema: "Config Schema" level_component_config_schema: "Config Schema"
@ -921,17 +921,17 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
new_component_title: "Crear Nuevo Componente" new_component_title: "Crear Nuevo Componente"
new_component_field_system: "Sistema" new_component_field_system: "Sistema"
new_article_title: "Crear un Nuevo Artículo" new_article_title: "Crear un Nuevo Artículo"
new_thang_title: "Crear un Nuevo tipo de Thang" new_thang_title: "Crear un Nuevo tipo de Tiliche"
new_level_title: "Crear un Nuevo Nivel" new_level_title: "Crear un Nuevo Nivel"
new_article_title_login: "Ingresa para Crear un Nuevo Artículo" new_article_title_login: "Ingresa para Crear un Nuevo Artículo"
new_thang_title_login: "Ingresa para crear un nuevo tipo de Thang" new_thang_title_login: "Ingresa para crear un nuevo tipo de Tiliche"
new_level_title_login: "Ingresa para Crear un Nuevo Nivel" new_level_title_login: "Ingresa para Crear un Nuevo Nivel"
new_achievement_title: "Crear un Nuevo Logro" new_achievement_title: "Crear un Nuevo Logro"
new_achievement_title_login: "Ingresa para Crear un Nuevo Logro" new_achievement_title_login: "Ingresa para Crear un Nuevo Logro"
new_poll_title: "Crear una nueva encuesta" new_poll_title: "Crear una nueva encuesta"
new_poll_title_login: "Ingresa para crear una nueva encuesta" new_poll_title_login: "Ingresa para crear una nueva encuesta"
article_search_title: "Buscar Artículos aquí" article_search_title: "Buscar Artículos aquí"
thang_search_title: "Buscar tipos de Thang aquí" thang_search_title: "Buscar tipos de Tiliche aquí"
level_search_title: "Buscar Niveles aquí" level_search_title: "Buscar Niveles aquí"
achievement_search_title: "Buscar logros" achievement_search_title: "Buscar logros"
poll_search_title: "Buscar Encuesta" poll_search_title: "Buscar Encuesta"
@ -943,8 +943,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
pop_i18n: "Poblar I18N" pop_i18n: "Poblar I18N"
tasks: "Tareas" tasks: "Tareas"
clear_storage: "Borrar tus cambios locales" clear_storage: "Borrar tus cambios locales"
# add_system_title: "Add Systems to Level" add_system_title: "Agregar Sistemas al Level"
# done_adding: "Done Adding" done_adding: "Se terminó de agregar"
article: article:
edit_btn_preview: "Vista previa" edit_btn_preview: "Vista previa"
@ -1026,7 +1026,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
my_matches: "Mis Partidas" my_matches: "Mis Partidas"
simulate: "Simular" simulate: "Simular"
simulation_explanation: "¡Simulando tus juegos puedes mejorar tu posición más rápido!" simulation_explanation: "¡Simulando tus juegos puedes mejorar tu posición más rápido!"
# simulation_explanation_leagues: "You will mainly help simulate games for allied players in your clans and courses." # simulation_explanation_leagues: "Principalmente ayudarás a simular juegos for allied players in your clans and courses."
simulate_games: "¡Simular Juegos!" simulate_games: "¡Simular Juegos!"
simulate_all: "REINICIAR Y SIMULAR JUEGOS" simulate_all: "REINICIAR Y SIMULAR JUEGOS"
games_simulated_by: "Juegos simulados por ti:" games_simulated_by: "Juegos simulados por ti:"
@ -1047,7 +1047,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
rank_failed: "Fallo al Clasificar" rank_failed: "Fallo al Clasificar"
rank_being_ranked: "Juego Siendo Clasificado" rank_being_ranked: "Juego Siendo Clasificado"
rank_last_submitted: "Presentado" rank_last_submitted: "Presentado"
help_simulate: "Ayudar simulando juego?" help_simulate: "¿Ayudar simulando juego?"
code_being_simulated: "Tu nuevo código está siendo simulado por otros jugadores para clasificación. Esto se refrescará a medida que vengan nuevas partidas." code_being_simulated: "Tu nuevo código está siendo simulado por otros jugadores para clasificación. Esto se refrescará a medida que vengan nuevas partidas."
no_ranked_matches_pre: "Sin partidas clasificadas para el " no_ranked_matches_pre: "Sin partidas clasificadas para el "
no_ranked_matches_post: " equipo! Juega en contra de algunos competidores y luego vuelve aquí para ver tu juego clasificado." no_ranked_matches_post: " equipo! Juega en contra de algunos competidores y luego vuelve aquí para ver tu juego clasificado."
@ -1077,7 +1077,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
tournament_blurb_blog: "en nuestro blog" tournament_blurb_blog: "en nuestro blog"
rules: "Reglas" rules: "Reglas"
winners: "Ganadores" winners: "Ganadores"
# league: "League" league: "Liga"
user: user:
stats: "Estados" stats: "Estados"
@ -1093,7 +1093,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
no_achievements: "Sin Logros todavía." no_achievements: "Sin Logros todavía."
favorite_prefix: "Idioma favorito " favorite_prefix: "Idioma favorito "
favorite_postfix: "." favorite_postfix: "."
not_member_of_clans: "No se es miembro de ningún clan todavía." not_member_of_clans: "No eres miembro de ningún clan todavía."
achievements: achievements:
last_earned: "Último Ganado" last_earned: "Último Ganado"
@ -1118,7 +1118,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
no_recent_games: "No juegos jugados duramente las últimas dos semanas." no_recent_games: "No juegos jugados duramente las últimas dos semanas."
payments: "Pagos" payments: "Pagos"
purchased: "Comprado" purchased: "Comprado"
# sale: "Sale" sale: "Venta"
subscription: "Suscripción" subscription: "Suscripción"
invoices: "Facturas" invoices: "Facturas"
service_apple: "Apple" service_apple: "Apple"
@ -1128,14 +1128,14 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
price: "Precio" price: "Precio"
gems: "Gemas" gems: "Gemas"
active: "Activo" active: "Activo"
subscribed: "Suscripto" subscribed: "Suscrito"
unsubscribed: "Insuscripto" unsubscribed: "Desuscrito"
active_until: "Activo Hasta" active_until: "Activo Hasta"
cost: "Costo" cost: "Costo"
next_payment: "Próximo Pago" next_payment: "Próximo Pago"
card: "Tarjeta" card: "Tarjeta"
status_unsubscribed_active: "No estas suscripto y no se te cobrará, pero tu cuenta está activa por ahora." status_unsubscribed_active: "No estas suscrito y no se te cobrará, pero tu cuenta está activa por ahora."
status_unsubscribed: "Obtén acceso a nuevos niveles, heroés, items y gemas extras con la suscripción a CodeCombat!" status_unsubscribed: "¡Obtén acceso a nuevos niveles, héroes, items y gemas extras con la suscripción a CodeCombat!"
account_invoices: account_invoices:
amount: "Cantidad en dólares." amount: "Cantidad en dólares."
@ -1181,13 +1181,13 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
systems: "Sistemas" systems: "Sistemas"
component: "Componente" component: "Componente"
components: "Componentes" components: "Componentes"
thang: "Thang" thang: "Tiliche"
thangs: "Thangs" thangs: "Tiliches"
level_session: "Tu Sesión" level_session: "Tu Sesión"
opponent_session: "Sesión del Oponente" opponent_session: "Sesión del Oponente"
article: "Artícule" article: "Artícule"
user_names: "Nombres de usuario" user_names: "Nombres de usuario"
thang_names: "Nombres de thang" thang_names: "Nombres de Tiliche"
files: "Archivos" files: "Archivos"
top_simulators: "Mejores simuladores" top_simulators: "Mejores simuladores"
source_document: "Documento fuente" source_document: "Documento fuente"
@ -1211,35 +1211,35 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
poll: "Encuesta" poll: "Encuesta"
user_polls_record: "Historia de Visitas de Encuestas" user_polls_record: "Historia de Visitas de Encuestas"
# concepts: concepts:
# advanced_strings: "Advanced Strings" advanced_strings: "Manipulación Avanzada de Cadenas" #used Advanced Strings Handling instead of Advanced Strings
# algorithms: "Algorithms" algorithms: "Algoritmos"
# arguments: "Arguments" arguments: "Argumentos"
# arithmetic: "Arithmetic" arithmetic: "Aritmética"
# arrays: "Arrays" arrays: "Arreglos"
# basic_syntax: "Basic Syntax" basic_syntax: "Sintaxis Básica"
# boolean_logic: "Boolean Logic" boolean_logic: "Lógica Booleana"
# break_statements: "Break Statements" # break_statements: "Break Statements"
# classes: "Classes" classes: "Clases"
# continue_statements: "Continue Statements" # continue_statements: "Continue Statements"
# for_loops: "For Loops" for_loops: "Ciclos For"
# functions: "Functions" functions: "Funciones"
# graphics: "Graphics" graphics: "Gráficos"
# if_statements: "If Statements" # if_statements: "If Statements"
# input_handling: "Input Handling" # input_handling: "Input Handling"
# math_operations: "Math Operations" math_operations: "Operaciones Matemáticas"
# object_literals: "Object Literals" # object_literals: "Object Literals"
# parameters: "Parameters" parameters: "Parámetros"
# strings: "Strings" strings: "Cadenas"
# variables: "Variables" variables: "Variables"
# vectors: "Vectors" vectors: "Vectores"
# while_loops: "Loops" while_loops: "Ciclos While"
# recursion: "Recursion" recursion: "Recursividad"
delta: delta:
added: "Agregado" added: "Agregado"
modified: "Modificado" modified: "Modificado"
# not_modified: "Not Modified" not_modified: "No Modificado"
deleted: "Borrado" deleted: "Borrado"
moved_index: "Índice movido" moved_index: "Índice movido"
text_diff: "Diferir Texto" text_diff: "Diferir Texto"

View file

@ -7,6 +7,7 @@ _.extend CourseSchema.properties,
campaignID: c.objectId() campaignID: c.objectId()
concepts: c.array {title: 'Programming Concepts', uniqueItems: true}, c.concept concepts: c.array {title: 'Programming Concepts', uniqueItems: true}, c.concept
description: {type: 'string'} description: {type: 'string'}
duration: {trype: 'number', description: 'Approximate hours of content'}
pricePerSeat: {type: 'number', description: 'Price per seat in USD cents.'} pricePerSeat: {type: 'number', description: 'Price per seat in USD cents.'}
screenshot: c.url {title: 'URL', description: 'Link to course screenshot.'} screenshot: c.url {title: 'URL', description: 'Link to course screenshot.'}

View file

@ -0,0 +1,68 @@
#courses-view
.center
text-align: center
.code-input
width: 100%
.course-image
width: 100%
.course-panel
margin: 20px
.faq-blurb
font-size: 14px
.continue-dialog .modal-dialog
background-color: white
max-width: 400px
.instruction-label
font-size: 14pt
.or
margin-bottom: 20px
font-size: 14pt
.btn-enroll
margin-top: 20px
.center
text-align: center
.concepts-container
width: 200px
.contact-container
margin-top: 20px
text-align: center
.info-container
margin: 0% 10%
font-size: 18px
.monitoring-img-container
margin-top: 10px
.praise-caption
font-size: 14px
.praise-quote
font-size: 20px
font-style: italic
.progress-container
font-size: 20px
.img-quote
height: 160px
.popover
z-index: 1050
min-width: 400px
h3
background: transparent
border: 0
font-size: 30px

View file

@ -1,4 +1,4 @@
#course-details-view #course-details-mock-view
.section-selector .section-selector
margin-bottom: 0px margin-bottom: 0px

View file

@ -1,4 +1,4 @@
#course-enroll-view #course-enroll-mock-view
.btn-buy .btn-buy
margin: 20px 0px margin: 20px 0px

View file

@ -1,4 +1,4 @@
#courses-view #courses-mock-view
.center .center
text-align: center text-align: center

View file

@ -8,19 +8,136 @@ block content
span *UNDER CONSTRUCTION, please send feedback to span *UNDER CONSTRUCTION, please send feedback to
a.spl(href='mailto:team@codecombat.com') team@codecombat.com a.spl(href='mailto:team@codecombat.com') team@codecombat.com
h1(style='text-align: center;') Courses br
if studentMode
+student-main
else
+teacher-main
.container-fluid .container-fluid
.row(style='font-size: 20px;') - var i = 0
.col-md-3 while i < courses.length
.col-md-3 Name .row
.col-md-3 Description +course-block(courses[i], instances)
.col-md-3 Concepts - i++
each course in courses if i < courses.length
.row(style='border-top: 1px solid gray; padding: 10px;') +course-block(courses[i], instances)
.col-md-3 - i++
img(src="#{course.get('screenshot')}", style="width: 100%;")
.col-md-3 mixin student-main
p= course.get('name') button.btn.btn-warning.btn-teacher Teachers Click Here
a(href="/editor/campaign/#{course.get('campaignID')}") Campaign (levels) h1.center Courses on CodeCombat
.col-md-3= course.get('description')
.col-md-3= course.get('concepts').join(' ') mixin teacher-main
button.btn.btn-warning.btn-student Students Click Here
h1.center Courses on CodeCombat
.info-container
p Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours.
.container-fluid
.row
.col-md-6
ul
li Learn more in less time
li No coding experience necesssary
li Easily monitor student progress
p Purchase a course for your entire class. It's easy to sign up your students!
p.faq-blurb
span.spr See the courses
a.spr.courses-faq FAQ
span for more information.
.col-md-6
img.img-quote(src="/images/pages/courses/coco_complab.png")
p
.well.well-sm
div.praise-quote "#{praise.quote}"
div.praise-caption - #{praise.source}
h2.center Choose Your Course:
mixin student-dialog(course)
.modal.continue-dialog(id="continueModal#{course.id}")
.modal-dialog
.modal-header
button.close(data-dismiss='modal')
span &times;
h3.modal-title= course.get('name')
.modal-body
.container-fluid
.row.button-row
.col-md-12
.well.well-sm
p
div.instruction-label Enter an unlock code
.container-fluid
.row
.col-md-8
input.code-input(type='text', placeholder="Enter unlock code")
.col-md-4
button.btn.btn-success.btn-enroll Enroll
mixin teacher-dialog(course)
.modal.continue-dialog(id="continueModal#{course.id}")
.modal-dialog
.modal-header
button.close(data-dismiss='modal')
span &times;
h3.modal-title= course.get('name')
.modal-body
.container-fluid
if enrolledCourses[course.id]
.row.button-row.row-pick-class
.col-md-12
.well.well-sm
p
div.instruction-label Pick from your current classes
.container-fluid
.row
.col-md-8
select.form-control.select-session
each inst in instances
if inst.get('name')
option(value="#{inst.id}")= inst.get('name')
else
option(value="#{inst.id}") *unnamed*
.col-md-4
button.btn.btn-success.btn-enter(data-course-id="#{course.id}") Enter
.row.button-row.center.row-pick-class
.col-md-12
div.or Or
.row.button-row.center
.col-md-12
button.btn.btn-success.btn-lg.btn-buy(data-course-id="#{course.id}") Buy this course
mixin course-block(course)
if studentMode
+student-dialog(course)
else
+teacher-dialog(course)
.col-md-6
.well.panel.course-panel(class=enrolledCourses[course.id] ? 'panel-success' : 'panel-info')
.panel-heading
.panel-title
span.spr #{course.get('name')}
strong #{enrolledCourses[course.id] ? '[ enrolled ]' : ''}
.panel-body
.container-fluid
.row
.col-md-12
p
img.course-image(src="#{course.get('screenshot')}")
.row.button-row
.col-md-6
strong Topics
ul
each concept in course.get('concepts')
li(data-i18n="concepts." + concept)
strong Hours of content: #{course.get('duration')}
.col-md-6.center(style='margin-top: 40px;')
if studentMode
if enrolledCourses[course.id]
a.btn.btn-lg.btn-success.btn-continue(href="/courses/#{course.id}?student=true") Continue
else
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Enter
else if enrolledCourses[course.id]
button.btn.btn-lg.btn-success.btn-continue(data-toggle='modal', data-target="#continueModal#{course.id}") Continue
else
button.btn.btn-lg.btn-success.btn-buy(data-course-id="#{course.id}") #{course.get('pricePerSeat') === 0 ? 'Get FREE course' : 'Buy course'}

View file

@ -20,7 +20,7 @@ module.exports = class CourseEnrollView extends RootView
subscriptions: subscriptions:
'stripe:received-token': 'onStripeReceivedToken' 'stripe:received-token': 'onStripeReceivedToken'
constructor: (options, @courseID=0) -> constructor: (options, @courseID) ->
super options super options
@courseID ?= options.courseID @courseID ?= options.courseID
@seats = 20 @seats = 20
@ -99,7 +99,7 @@ module.exports = class CourseEnrollView extends RootView
createClass: (token) -> createClass: (token) ->
data = data =
name: $('.class-name').val() name: @className
seats: @seats seats: @seats
token: token token: token
data.courseID = @selectedCourse.id if @selectedCourse data.courseID = @selectedCourse.id if @selectedCourse

View file

@ -1,18 +1,95 @@
RootView = require 'views/core/RootView' app = require 'core/application'
template = require 'templates/courses/courses'
CocoCollection = require 'collections/CocoCollection' CocoCollection = require 'collections/CocoCollection'
Course = require 'models/Course' Course = require 'models/Course'
CourseInstance = require 'models/CourseInstance'
RootView = require 'views/core/RootView'
template = require 'templates/courses/courses'
utils = require 'core/utils'
module.exports = class CoursesView extends RootView module.exports = class CoursesView extends RootView
id: 'courses-view' id: 'courses-view'
template: template template: template
events:
'click .btn-buy': 'onClickBuy'
'click .btn-enroll': 'onClickEnroll'
'click .btn-enter': 'onClickEnter'
'click .btn-student': 'onClickStudent'
'click .btn-teacher': 'onClickTeacher'
constructor: (options) -> constructor: (options) ->
super options super(options)
@praise = utils.getCoursePraise()
@studentMode = utils.getQueryVariable('student', false) or options.studentMode
@courses = new CocoCollection([], { url: "/db/course", model: Course}) @courses = new CocoCollection([], { url: "/db/course", model: Course})
@supermodel.loadCollection(@courses, 'courses') @supermodel.loadCollection(@courses, 'courses')
@courseInstances = new CocoCollection([], { url: "/db/user/#{me.id}/course_instances", model: CourseInstance})
@listenToOnce @courseInstances, 'sync', @onCourseInstancesLoaded
@supermodel.loadCollection(@courseInstances, 'course_instances')
getRenderData: -> getRenderData: ->
context = super() context = super()
context.courses = @courses.models ? [] context.courses = @courses.models ? []
context.enrolledCourses = @enrolledCourses ? {}
context.instances = @courseInstances.models ? []
context.praise = @praise
context.studentMode = @studentMode
context context
afterRender: ->
super()
@setupCoursesFAQPopover()
onCourseInstancesLoaded: ->
@enrolledCourses = {}
@enrolledCourses[courseInstance.get('courseID')] = true for courseInstance in @courseInstances.models
setupCoursesFAQPopover: ->
popoverTitle = "<h3>Courses FAQ<button type='button' class='close' onclick='$(&#39;.courses-faq&#39;).popover(&#39;hide&#39;);'>&times;</button></h3>"
popoverContent = "<p><strong>Q:</strong> What's the difference between these courses and the single player game?</p>"
popoverContent += "<p><strong>A:</strong> The single player game is designed for individuals, while the courses are designed for classes.</p>"
popoverContent += "<p>The single player game has items, gems, hero selection, leveling up, and in-app purchases. Courses have classroom management features and streamlined student-focused level pacing.</p>"
@$el.find('.courses-faq').popover(
animation: true
html: true
placement: 'top'
trigger: 'click'
title: popoverTitle
content: popoverContent
container: @$el
).on 'shown.bs.popover', =>
application.tracker?.trackEvent 'Subscription payment methods hover'
onClickBuy: (e) ->
courseID = $(e.target).data('course-id')
route = "/courses/enroll/#{courseID}"
viewClass = require 'views/courses/CourseEnrollView'
viewArgs = [{}, courseID]
navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
Backbone.Mediator.publish 'router:navigate', navigationEvent
onClickEnroll: (e) ->
alert('TODO: redeem course prepaid and navigate to correct course instance')
onClickEnter: (e) ->
$('.continue-dialog').modal('hide')
courseID = $(e.target).data('course-id')
courseInstanceID = $('.select-session').val()
viewClass = require 'views/courses/CourseDetailsView'
viewArgs = [{courseInstanceID:courseInstanceID}, courseID]
navigationEvent = route: "/courses/#{courseID}", viewClass: viewClass, viewArgs: viewArgs
Backbone.Mediator.publish 'router:navigate', navigationEvent
onClickStudent: (e) ->
route = "/courses?student=true"
viewClass = require 'views/courses/CoursesView'
viewArgs = [studentMode: true]
navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
Backbone.Mediator.publish 'router:navigate', navigationEvent
onClickTeacher: (e) ->
route = "/courses?student=false"
viewClass = require 'views/courses/CoursesView'
viewArgs = [studentMode: false]
navigationEvent = route: route, viewClass: viewClass, viewArgs: viewArgs
Backbone.Mediator.publish 'router:navigate', navigationEvent

View file

@ -6,7 +6,7 @@ CocoCollection = require 'collections/CocoCollection'
Campaign = require 'models/Campaign' Campaign = require 'models/Campaign'
module.exports = class CourseDetailsView extends RootView module.exports = class CourseDetailsView extends RootView
id: 'course-details-view' id: 'course-details-mock-view'
template: template template: template
events: events:

View file

@ -3,7 +3,7 @@ RootView = require 'views/core/RootView'
template = require 'templates/courses/mock1/course-enroll' template = require 'templates/courses/mock1/course-enroll'
module.exports = class CourseEnrollView extends RootView module.exports = class CourseEnrollView extends RootView
id: 'course-enroll-view' id: 'course-enroll-mock-view'
template: template template: template
events: events:

View file

@ -4,7 +4,7 @@ RootView = require 'views/core/RootView'
template = require 'templates/courses/mock1/courses' template = require 'templates/courses/mock1/courses'
module.exports = class CoursesView extends RootView module.exports = class CoursesView extends RootView
id: 'courses-view' id: 'courses-mock-view'
template: template template: template
events: events:

View file

@ -4,10 +4,9 @@
// mongo <address>:<port>/<database> <script file> -u <username> -p <password> // mongo <address>:<port>/<database> <script file> -u <username> -p <password>
// NOTE: uses name as unique identifier, so changing the name will insert a new course // NOTE: uses name as unique identifier, so changing the name will insert a new course
// NOTE: concepts should match actual campaign levels
// NOTE: pricePerSeat in USD cents // NOTE: pricePerSeat in USD cents
var documents = var courses =
[ [
{ {
name: "Introduction to Computer Science", name: "Introduction to Computer Science",
@ -15,6 +14,7 @@ var documents =
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"), campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables'], 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),
pricePerSeat: NumberInt(0), pricePerSeat: NumberInt(0),
screenshot: "/images/pages/courses/101_info.png" screenshot: "/images/pages/courses/101_info.png"
}, },
@ -24,6 +24,7 @@ var documents =
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"), campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
concepts: ['basic_syntax', 'arguments', 'while_loops', 'strings', 'variables', 'if_statements'], 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),
pricePerSeat: NumberInt(400), pricePerSeat: NumberInt(400),
screenshot: "/images/pages/courses/102_info.png" screenshot: "/images/pages/courses/102_info.png"
}, },
@ -33,16 +34,30 @@ var documents =
campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"), campaignID: ObjectId("55b29efd1cd6abe8ce07db0d"),
concepts: ['if_statements', 'arithmetic'], concepts: ['if_statements', 'arithmetic'],
description: "Learn how to handle input.", description: "Learn how to handle input.",
duration: NumberInt(5),
pricePerSeat: NumberInt(400), pricePerSeat: NumberInt(400),
screenshot: "/images/pages/courses/103_info.png" screenshot: "/images/pages/courses/103_info.png"
} }
]; ];
for (var i = 0; i < documents.length; i++) { print("Finding course concepts..");
var doc = documents[i]; for (var i = 0; i < courses.length; i++) {
db.courses.update({name: doc.name}, doc, {upsert: true}); var concepts = {};
var cursor = db.campaigns.find({_id: courses[i].campaignID}, {'levels': 1});
if (cursor.hasNext()) {
var doc = cursor.next();
for (var levelID in doc.levels) {
for (var j = 0; j < doc.levels[levelID].concepts.length; j++) {
concepts[doc.levels[levelID].concepts[j]] = true;
}
}
}
courses[i].concepts = Object.keys(concepts);
} }
function log(str) { print("Updating courses..");
print(new Date().toISOString() + " " + str); for (var i = 0; i < courses.length; i++) {
db.courses.update({name: courses[i].name}, courses[i], {upsert: true});
} }
print("Done.");