mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-25 00:28:31 -05:00
Merge remote-tracking branch 'codecombat/master' into translation
This commit is contained in:
commit
10c394ce9c
21 changed files with 940 additions and 195 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -97,4 +97,5 @@ temp/
|
||||||
Dockerfile
|
Dockerfile
|
||||||
### If you add something here, copy it to the end of .npmignore, too. ###
|
### If you add something here, copy it to the end of .npmignore, too. ###
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode/
|
||||||
|
|
|
@ -9,7 +9,8 @@ It's both a startup and a community project, completely open source under the [M
|
||||||
|
|
||||||
### [Getting Started](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-General-Information)
|
### [Getting Started](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-General-Information)
|
||||||
|
|
||||||
We've made it easy to fork the project, run a simple script that'll install all the dependencies, and get a local copy of CodeCombat running right away on [Mac](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-Mac-and-Vagrant), [Linux](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-Linux), or [Windows](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-Windows). See [the docs for details](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-General-Information).
|
We've made it easy to fork the project, run a simple script that'll install all the dependencies, and get a local copy of CodeCombat running right away on [Mac](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-Mac), [Linux](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-Linux), [Windows](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-Windows), or
|
||||||
|
[Vagrant](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-Vagrant). See [the docs for details](https://github.com/codecombat/codecombat/wiki/Dev-Setup:-General-Information).
|
||||||
|
|
||||||
### [Getting In Touch](https://github.com/codecombat/codecombat/wiki/Developer-organization)
|
### [Getting In Touch](https://github.com/codecombat/codecombat/wiki/Developer-organization)
|
||||||
|
|
||||||
|
|
BIN
app/assets/images/pages/careers/recruiting.png
Normal file
BIN
app/assets/images/pages/careers/recruiting.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 75 KiB |
|
@ -43,6 +43,8 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
|
|
||||||
'beta': go('HomeView')
|
'beta': go('HomeView')
|
||||||
|
|
||||||
|
'careers(/:position)': go('CareersView')
|
||||||
|
|
||||||
'cla': go('CLAView')
|
'cla': go('CLAView')
|
||||||
|
|
||||||
'clans': go('clans/ClansView')
|
'clans': go('clans/ClansView')
|
||||||
|
|
|
@ -1079,6 +1079,7 @@
|
||||||
tournament_blurb: "Write code, collect gold, build armies, crush foes, win prizes, and upgrade your career in our $40,000 Greed tournament! Check out the details"
|
tournament_blurb: "Write code, collect gold, build armies, crush foes, win prizes, and upgrade your career in our $40,000 Greed tournament! Check out the details"
|
||||||
tournament_blurb_criss_cross: "Win bids, construct paths, outwit opponents, grab gems, and upgrade your career in our Criss-Cross tournament! Check out the details"
|
tournament_blurb_criss_cross: "Win bids, construct paths, outwit opponents, grab gems, and upgrade your career in our Criss-Cross tournament! Check out the details"
|
||||||
tournament_blurb_zero_sum: "Unleash your coding creativity in both gold gathering and battle tactics in this alpine mirror match between red sorcerer and blue sorcerer. The tournament began on Friday, March 27 and will run until Monday, April 6 at 5PM PDT. Compete for fun and glory! Check out the details"
|
tournament_blurb_zero_sum: "Unleash your coding creativity in both gold gathering and battle tactics in this alpine mirror match between red sorcerer and blue sorcerer. The tournament began on Friday, March 27 and will run until Monday, April 6 at 5PM PDT. Compete for fun and glory! Check out the details"
|
||||||
|
tournament_blurb_ace_of_coders: "Battle it out in the frozen glacier in this domination-style mirror match! The tournament began on Wednesday, September 16 and will run until Wednesday, October 14 at 5PM PDT. Check out the details"
|
||||||
tournament_blurb_blog: "on our blog"
|
tournament_blurb_blog: "on our blog"
|
||||||
rules: "Rules"
|
rules: "Rules"
|
||||||
winners: "Winners"
|
winners: "Winners"
|
||||||
|
|
|
@ -23,7 +23,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
profile: "Perfil"
|
profile: "Perfil"
|
||||||
stats: "Estadísticas"
|
stats: "Estadísticas"
|
||||||
code: "Código"
|
code: "Código"
|
||||||
admin: "Admin" # Only shows up when you are an admin
|
admin: "Administrador" # Only shows up when you are an admin
|
||||||
home: "Inicio"
|
home: "Inicio"
|
||||||
contribute: "Contribuir"
|
contribute: "Contribuir"
|
||||||
legal: "Legal"
|
legal: "Legal"
|
||||||
|
@ -122,7 +122,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
secondary: "Secundario"
|
secondary: "Secundario"
|
||||||
armor: "Armadura"
|
armor: "Armadura"
|
||||||
accessories: "Accesorios"
|
accessories: "Accesorios"
|
||||||
misc: "Misc"
|
misc: "Misceláneo"
|
||||||
books: "Libros"
|
books: "Libros"
|
||||||
|
|
||||||
common:
|
common:
|
||||||
|
@ -253,9 +253,9 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
victory_experience_gained: "XP Ganada"
|
victory_experience_gained: "XP Ganada"
|
||||||
victory_gems_gained: "Gemas Ganadas"
|
victory_gems_gained: "Gemas Ganadas"
|
||||||
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: "¡Changos macacos!, 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: "¡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: "¡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 campo de entrenamiento online que te conecta 1 a 1 con un mentor experto que te ayudará a entrenarte para convertirte ¡En un desarrollador profesional! Al vencer A Mayhem of Munchkins, eres elegible para una reducción de $500 USD usando el código: CCRULES"
|
||||||
victory_bloc_cta: "Conoce a tu mentor – aprende acerca de 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.
|
||||||
|
@ -605,7 +605,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
title: "CodeCombat para Profesores"
|
title: "CodeCombat para Profesores"
|
||||||
intro_1: "CodeCombat es un juego online que enseña a programar.Los estudiantes escriben código en idiomas de programación real."
|
intro_1: "CodeCombat es un juego online que enseña a programar.Los estudiantes escriben código en idiomas de programación real."
|
||||||
intro_2: "No se necesita experiencia previa!"
|
intro_2: "No se necesita experiencia previa!"
|
||||||
free_title: "¿Cuanto cuesta?"
|
free_title: "¿Cuánto cuesta?"
|
||||||
cost_china: "CodeCombat es gratis en China por los primeros cinco niveles, despues cuesta $9.99(dólares) por mes para tener acceso a 120+ niveles que son exclusivos en nuestros servidores en China." # {change}
|
cost_china: "CodeCombat es gratis en China por los primeros cinco niveles, despues cuesta $9.99(dólares) por mes para tener acceso a 120+ niveles que son exclusivos en nuestros servidores en China." # {change}
|
||||||
free_1: "CodeCombat Basic es GRATIS! Hay 70+ niveles gratis que cubren cada concepto." # {change}
|
free_1: "CodeCombat Basic es GRATIS! Hay 70+ niveles gratis que cubren cada concepto." # {change}
|
||||||
free_2: "Una suscripción mensual le da acceso a tutoriales en vídeo y niveles extra para practicar."
|
free_2: "Una suscripción mensual le da acceso a tutoriales en vídeo y niveles extra para practicar."
|
||||||
|
@ -618,7 +618,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
sub_includes_2: "Más de 40 niveles de práctica" # {change}
|
sub_includes_2: "Más de 40 niveles de práctica" # {change}
|
||||||
sub_includes_3: "Video tutoriales"
|
sub_includes_3: "Video tutoriales"
|
||||||
sub_includes_4: "Soporte de correo electronico Premium"
|
sub_includes_4: "Soporte de correo electronico Premium"
|
||||||
sub_includes_5: "7 heroes nuevos con habilidades unicas que dominar" # {change}
|
sub_includes_5: "7 héroes nuevos con habilidades unicas que dominar" # {change}
|
||||||
sub_includes_6: "bonificación de 3500 gemas cada mes"
|
sub_includes_6: "bonificación de 3500 gemas cada mes"
|
||||||
sub_includes_7: "Clanes privados"
|
sub_includes_7: "Clanes privados"
|
||||||
monitor_progress_title: "¿Cómo monitoreo el progreso del estudiante?"
|
monitor_progress_title: "¿Cómo monitoreo el progreso del estudiante?"
|
||||||
|
@ -1329,8 +1329,8 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
|
||||||
custom_avatar: " CodeCombat Avatar Personalizado"
|
custom_avatar: " CodeCombat Avatar Personalizado"
|
||||||
heap: "Por seis meses acceso \"Startup\"."
|
heap: "Por seis meses acceso \"Startup\"."
|
||||||
credits: "creditos"
|
credits: "creditos"
|
||||||
one_month_coupon: "Cupón: elegí entre Rails o HTML."
|
one_month_coupon: "Cupón: elige entre Rails o HTML."
|
||||||
one_month_discount: "descuento del 30%: elegí entre Rails o HTML"
|
one_month_discount: "descuento del 30%: elige entre Rails o HTML"
|
||||||
license: "licencia"
|
license: "licencia"
|
||||||
oreilly: "ebook de su elección"
|
oreilly: "ebook de su elección"
|
||||||
|
|
||||||
|
|
|
@ -79,8 +79,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
|
||||||
adjust_volume: "Ajustar volúmen"
|
adjust_volume: "Ajustar volúmen"
|
||||||
campaign_multiplayer: "Arenas Multijugador"
|
campaign_multiplayer: "Arenas Multijugador"
|
||||||
campaign_multiplayer_description: "... en las que tu código se enfrentará al de otros jugadores."
|
campaign_multiplayer_description: "... en las que tu código se enfrentará al de otros jugadores."
|
||||||
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
|
campaign_old_multiplayer: "(Obsoleto) Antiguas Arenas Multijugador"
|
||||||
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
|
campaign_old_multiplayer_description: "Reliquias de una era más civilizada. Ninguna simulación es ejecutada para estas arenas multijugador antiguas y sin héroes."
|
||||||
|
|
||||||
share_progress_modal:
|
share_progress_modal:
|
||||||
blurb: "¡Estás teniendo un gran progreso! Cuéntale a alguien que tanto habeis aprendido con CodeCombat." # {change}
|
blurb: "¡Estás teniendo un gran progreso! Cuéntale a alguien que tanto habeis aprendido con CodeCombat." # {change}
|
||||||
|
@ -147,7 +147,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
|
||||||
unwatch: "Pasar"
|
unwatch: "Pasar"
|
||||||
submit_patch: "Enviar Parche"
|
submit_patch: "Enviar Parche"
|
||||||
submit_changes: "Enviar Cambios"
|
submit_changes: "Enviar Cambios"
|
||||||
# save_changes: "Save Changes"
|
save_changes: "Guardar cambios"
|
||||||
|
|
||||||
general:
|
general:
|
||||||
and: "y"
|
and: "y"
|
||||||
|
@ -247,16 +247,16 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
|
||||||
victory_saving_progress: "Salvando Progreso"
|
victory_saving_progress: "Salvando Progreso"
|
||||||
victory_go_home: "Ir a Inicio"
|
victory_go_home: "Ir a Inicio"
|
||||||
victory_review: "¡Cuéntanos más!"
|
victory_review: "¡Cuéntanos más!"
|
||||||
# victory_review_placeholder: "How was the level?"
|
victory_review_placeholder: "¿Cómo estuvo el nivel?"
|
||||||
victory_hour_of_code_done: "¿Ya terminaste?"
|
victory_hour_of_code_done: "¿Ya terminaste?"
|
||||||
victory_hour_of_code_done_yes: "Si, ¡He terminado con mi hora de código!"
|
victory_hour_of_code_done_yes: "Si, ¡He terminado con mi hora de código!"
|
||||||
victory_experience_gained: "XP Conseguida"
|
victory_experience_gained: "XP Conseguida"
|
||||||
victory_gems_gained: "Gemas Conseguidas"
|
victory_gems_gained: "Gemas Conseguidas"
|
||||||
victory_new_item: "Nuevo artículo"
|
victory_new_item: "Nuevo artículo"
|
||||||
# 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: "Jolínes, 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: "Convertirse en un vikingo"
|
victory_become_a_viking: "Convertirse 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 campo de entrenamiento online que te conecta 1 a 1 con un mentor experto que te ayudará a entrenarte para convertirte ¡En un desarrollador profesional! Al vencer A Mayhem of Munchkins, eres elegible para una reducción de $500 USD usando el código: 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: "Los hechizos de tus súbditos" # Only in old-style levels.
|
tome_minion_spells: "Los hechizos de tus súbditos" # Only in old-style levels.
|
||||||
tome_read_only_spells: "Hechizos de solo lectura" # Only in old-style levels.
|
tome_read_only_spells: "Hechizos de solo lectura" # Only in old-style levels.
|
||||||
|
@ -286,9 +286,9 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
|
||||||
time_goto: "Ir a:"
|
time_goto: "Ir a:"
|
||||||
non_user_code_problem_title: "No puede cargar un nivel"
|
non_user_code_problem_title: "No puede cargar un nivel"
|
||||||
infinite_loop_title: "Bucle infinito detectado"
|
infinite_loop_title: "Bucle infinito detectado"
|
||||||
# infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
|
infinite_loop_description: "El código inicial para construir el mundo no terminó de ejecutarse. Probablemente es muy lento o tiene un loop infinito. O puede ser un bug. Puedes tratar ejecutando este código nuevamente o reiniciar el código a su estado por defecto. Si eso no lo arregla, haznos saber."
|
||||||
# check_dev_console: "You can also open the developer console to see what might be going wrong."
|
check_dev_console: "También podeis abrir la consola de desarrollo para ver que puede salir mal."
|
||||||
# check_dev_console_link: "(instructions)"
|
check_dev_console_link: "(instrucciones)"
|
||||||
infinite_loop_try_again: "Inténtalo de nuevo"
|
infinite_loop_try_again: "Inténtalo de nuevo"
|
||||||
infinite_loop_reset_level: "Reiniciar nivel"
|
infinite_loop_reset_level: "Reiniciar nivel"
|
||||||
infinite_loop_comment_out: "Comenta mi código"
|
infinite_loop_comment_out: "Comenta mi código"
|
||||||
|
@ -296,7 +296,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
|
||||||
tip_scrub_shortcut: "Ctrl+[ y Ctrl+] rebobina y avanza hacia adelante." # {change}
|
tip_scrub_shortcut: "Ctrl+[ y Ctrl+] rebobina y avanza hacia adelante." # {change}
|
||||||
tip_guide_exists: "Haz clic en la guía arriba de la página para más información útil."
|
tip_guide_exists: "Haz clic en la guía arriba de la página para más información útil."
|
||||||
tip_open_source: "¡CodeCombat es 100% open source!"
|
tip_open_source: "¡CodeCombat es 100% open source!"
|
||||||
# tip_tell_friends: "Enjoying CodeCombat? Tell your friends about us!"
|
tip_tell_friends: "¿Disfrutando de CodeCombat? ¡Cuéntale a tus amigos acerca de nosotros!"
|
||||||
tip_beta_launch: "CodeCombat lanzó su beta en Octubre de 2013."
|
tip_beta_launch: "CodeCombat lanzó su beta en Octubre de 2013."
|
||||||
tip_think_solution: "Piensa en la solución, no en el problema."
|
tip_think_solution: "Piensa en la solución, no en el problema."
|
||||||
tip_theory_practice: "En teoría, no hay diferencia entre la teoría y la práctica. Pero en la práctica, la hay. - Yogi Berra"
|
tip_theory_practice: "En teoría, no hay diferencia entre la teoría y la práctica. Pero en la práctica, la hay. - Yogi Berra"
|
||||||
|
@ -329,7 +329,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
|
||||||
tip_code_never_lies: "El código nunca os miente, los comentarios algunas veces. — Ron Jeffries"
|
tip_code_never_lies: "El código nunca os miente, los comentarios algunas veces. — Ron Jeffries"
|
||||||
tip_reusable_software: "Antes de que el software pueda ser reutilizable, primero debe ser utilizable."
|
tip_reusable_software: "Antes de que el software pueda ser reutilizable, primero debe ser utilizable."
|
||||||
tip_optimization_operator: "Cada lenguaje tiene un operator para optimización. En la mayoría de los lenguajes dicho operador es ‘//’"
|
tip_optimization_operator: "Cada lenguaje tiene un operator para optimización. En la mayoría de los lenguajes dicho operador es ‘//’"
|
||||||
# tip_lines_of_code: "Measuring programming progress by lines of code is like measuring aircraft building progress by weight. — Bill Gates"
|
tip_lines_of_code: "Medir el progreso en la programación en líneas de código es como medir el progreso de construcción de una aeronave por su peso. — Bill Gates"
|
||||||
# tip_source_code: "I want to change the world but they would not give me the source code."
|
# tip_source_code: "I want to change the world but they would not give me the source code."
|
||||||
tip_javascript_java: "Java es a JavaScript lo que un automóvil es a un móvil. - Chris Heilmann"
|
tip_javascript_java: "Java es a JavaScript lo que un automóvil es a un móvil. - Chris Heilmann"
|
||||||
tip_move_forward: "Lo que sea que hagas, sigue hacia adelante. - Martin Luther King Jr."
|
tip_move_forward: "Lo que sea que hagas, sigue hacia adelante. - Martin Luther King Jr."
|
||||||
|
|
|
@ -255,8 +255,8 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
victory_new_item: "ニューアイテム"
|
victory_new_item: "ニューアイテム"
|
||||||
victory_viking_code_school: "あなたはハードレベルのホーリー・スモークを打ち破りました! もしあなたが既にソフトウェア開発者でないなら, ぜひやってみましょう. あなたはちょうどViking Code Scoolで受け入れられるための出世街道にいます,そこでは次のレベルへのスキルを取得でき、14週間でプロのWeb開発者になれます。"
|
victory_viking_code_school: "あなたはハードレベルのホーリー・スモークを打ち破りました! もしあなたが既にソフトウェア開発者でないなら, ぜひやってみましょう. あなたはちょうどViking Code Scoolで受け入れられるための出世街道にいます,そこでは次のレベルへのスキルを取得でき、14週間でプロのWeb開発者になれます。"
|
||||||
victory_become_a_viking: "バイキングになる"
|
victory_become_a_viking: "バイキングになる"
|
||||||
# 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: "すばらしい偉業ですね!あなたのスキルは伸びています、そしてそれに注目している人もいます。もしあなたがソフトウェア開発者になろうと考えているなら今日は幸運な日です。Blocはエキスパートのメンターが一対一であなたをプロの開発者に訓練するブートキャンプです!Mayhem of Munchkinsを倒したあなたはコードにより500ドルの割引の対象となっています。: CCRULES"
|
||||||
# victory_bloc_cta: "Meet your mentor – learn about Bloc"
|
victory_bloc_cta: "あなたのメンターに会う – Blockについて学ぶ"
|
||||||
guide_title: "ガイド"
|
guide_title: "ガイド"
|
||||||
tome_minion_spells: "操作できるキャラクターの呪文" # Only in old-style levels.
|
tome_minion_spells: "操作できるキャラクターの呪文" # Only in old-style levels.
|
||||||
tome_read_only_spells: "読込専用の呪文" # Only in old-style levels.
|
tome_read_only_spells: "読込専用の呪文" # Only in old-style levels.
|
||||||
|
@ -401,7 +401,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
|
|
||||||
subscribe:
|
subscribe:
|
||||||
comparison_blurb: "CodeCombatへ課金してスキルを磨きましょう!"
|
comparison_blurb: "CodeCombatへ課金してスキルを磨きましょう!"
|
||||||
feature1: "100以上の基本レベルが4つの世界に" # {change}
|
feature1: "110以上の基本レベルが4つの世界に" # {change}
|
||||||
feature2: "10人のパワフルな <strong>ニューヒーロー</strong> とユニークなスキル!" # {change}
|
feature2: "10人のパワフルな <strong>ニューヒーロー</strong> とユニークなスキル!" # {change}
|
||||||
feature3: "70以上のボーナスレベル"
|
feature3: "70以上のボーナスレベル"
|
||||||
feature4: "<strong>3500のジェム</strong>が毎月ボーナス!"
|
feature4: "<strong>3500のジェム</strong>が毎月ボーナス!"
|
||||||
|
@ -607,29 +607,29 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
intro_2: "プログラミングの経験は必要ありません!"
|
intro_2: "プログラミングの経験は必要ありません!"
|
||||||
free_title: "価格について"
|
free_title: "価格について"
|
||||||
# cost_china: "CodeCombat in China is free for the first five levels, after which it costs $9.99 USD per month for access to our other 180+ levels on our exclusive China servers."
|
# cost_china: "CodeCombat in China is free for the first five levels, after which it costs $9.99 USD per month for access to our other 180+ levels on our exclusive China servers."
|
||||||
free_1: "CodeCombat は基本的に無料です!100以上のレベルが無料です。" # {change}
|
free_1: "CodeCombat は基本的に無料です!110以上のレベルが無料です。" # {change}
|
||||||
free_2: "月々の課金をするとビデオのチュートリアルにアクセスでき、また追加のレベルが楽しめます。"
|
free_2: "月々の課金をするとビデオのチュートリアルにアクセスでき、また追加のレベルが楽しめます。"
|
||||||
teacher_subs_title: "教育関係者は無料のサブスクリプションを得ることができます!"
|
teacher_subs_title: "教育関係者は無料のサブスクリプションを得ることができます!"
|
||||||
teacher_subs_1: "" # {change}
|
teacher_subs_1: "" # {change}
|
||||||
teacher_subs_2: "に連絡して無料の月々のサブスクリプションを得ましょう。" # {change}
|
teacher_subs_2: "に連絡して無料の月々のサブスクリプションを得ましょう。" # {change}
|
||||||
# teacher_subs_3: "to set up your subscription."
|
# teacher_subs_3: "to set up your subscription."
|
||||||
sub_includes_title: "サブスクリプションの内容について"
|
sub_includes_title: "サブスクリプションの内容について"
|
||||||
sub_includes_1: "100以上の基本レベルに加えて、生徒は月々のサブスクリプションを得て次の機能が使えます:" # {change}
|
sub_includes_1: "110以上の基本レベルに加えて、生徒は月々のサブスクリプションを得て次の機能が使えます:" # {change}
|
||||||
sub_includes_2: "70以上の練習レベル"
|
sub_includes_2: "70以上の練習レベル"
|
||||||
sub_includes_3: "ビデオチュートリアル"
|
sub_includes_3: "ビデオチュートリアル"
|
||||||
sub_includes_4: "メールによるサポート"
|
sub_includes_4: "メールによるサポート"
|
||||||
sub_includes_5: "10人の新しいヒーローとマスターのユニークなスキル" # {change}
|
sub_includes_5: "10人の新しいヒーローとマスターのユニークなスキル" # {change}
|
||||||
sub_includes_6: "3500のジェムが月々支給されます"
|
sub_includes_6: "3500のジェムが月々支給されます"
|
||||||
sub_includes_7: "プライベートクラン"
|
sub_includes_7: "プライベートクラン"
|
||||||
# monitor_progress_title: "How do I monitor student progress?"
|
monitor_progress_title: "生徒の進捗状況を確認するにはどうすればよいですか?"
|
||||||
# monitor_progress_1: "Student progress can be monitored by creating a"
|
monitor_progress_1: "生徒の進捗状況を確認するには"
|
||||||
# monitor_progress_2: "for your class."
|
monitor_progress_2: "クラスをつくります。"
|
||||||
# monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the"
|
monitor_progress_3: "生徒を追加するには, あなたのクランの招待リンクを送信します, 招待リンクは"
|
||||||
# monitor_progress_4: "page."
|
monitor_progress_4: "ページ上にあります。"
|
||||||
# monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page."
|
monitor_progress_5: "生徒が参加したら, クランページで生徒の進捗状況の概要が表示されます。"
|
||||||
# private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
|
private_clans_1: "プライベートクランは各学生のプライバシーが向上し進捗情報が詳細化しています。"
|
||||||
# private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a"
|
private_clans_2: "プライベートクランを作るには, "
|
||||||
# private_clans_3: "."
|
private_clans_3: "を作成するとき、'クランをプライベートにする'のチェックボックスをチェックします。"
|
||||||
who_for_title: "CodeCombat が必要なひと"
|
who_for_title: "CodeCombat が必要なひと"
|
||||||
who_for_1: "私たちは CodeCombat を9歳以上の生徒にオススメしています。プログラミングの経験は必要ありません。"
|
who_for_1: "私たちは CodeCombat を9歳以上の生徒にオススメしています。プログラミングの経験は必要ありません。"
|
||||||
who_for_2: "私たちは男女問わず遊べるように CodeCombat をデザインしました。"
|
who_for_2: "私たちは男女問わず遊べるように CodeCombat をデザインしました。"
|
||||||
|
@ -765,14 +765,14 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
continue_script: "以前のスクリプトを続ける。"
|
continue_script: "以前のスクリプトを続ける。"
|
||||||
skip_scripts: "過去のスキップできるスクリプトをスキップする。"
|
skip_scripts: "過去のスキップできるスクリプトをスキップする。"
|
||||||
toggle_playback: "トグル:プレイ/ポーズ"
|
toggle_playback: "トグル:プレイ/ポーズ"
|
||||||
# scrub_playback: "Scrub back and forward through time."
|
scrub_playback: "早戻し・早送り."
|
||||||
# single_scrub_playback: "Scrub back and forward through time by a single frame."
|
single_scrub_playback: "1フレームごとに早戻し・早送りをする。"
|
||||||
# scrub_execution: "Scrub through current spell execution."
|
scrub_execution: "現在のスペルの実行まで早戻し・早送り。"
|
||||||
# toggle_debug: "Toggle debug display."
|
toggle_debug: "トグル:ディスプレイのデバッグ"
|
||||||
# toggle_grid: "Toggle grid overlay."
|
toggle_grid: "トグル:オーバーレイをグリッド"
|
||||||
# toggle_pathfinding: "Toggle pathfinding overlay."
|
toggle_pathfinding: "トグル:オーバーレイの経路探索"
|
||||||
# beautify: "Beautify your code by standardizing its formatting."
|
beautify: "フォーマットを標準化してコードを美しくする。"
|
||||||
# maximize_editor: "Maximize/minimize code editor."
|
maximize_editor: "コードエディターの最大化/最小化。"
|
||||||
|
|
||||||
community:
|
community:
|
||||||
main_title: "CodeCombatコミュニティー"
|
main_title: "CodeCombatコミュニティー"
|
||||||
|
@ -836,7 +836,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
latest_achievement: "最新業績"
|
latest_achievement: "最新業績"
|
||||||
playtime: "プレイ時間"
|
playtime: "プレイ時間"
|
||||||
last_played: "最終プレイ"
|
last_played: "最終プレイ"
|
||||||
# leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances."
|
leagues_explanation: "リーグで他のマルチアリーナインスタンス内の他のクランメンバーとプレイ"
|
||||||
|
|
||||||
classes:
|
classes:
|
||||||
archmage_title: "アークメイジ"
|
archmage_title: "アークメイジ"
|
||||||
|
@ -1077,7 +1077,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
|
||||||
# tournament_blurb_blog: "on our blog"
|
# tournament_blurb_blog: "on our blog"
|
||||||
rules: "ルール"
|
rules: "ルール"
|
||||||
winners: "勝者"
|
winners: "勝者"
|
||||||
# league: "League"
|
league: "リーグ"
|
||||||
|
|
||||||
user:
|
user:
|
||||||
stats: "ステータス"
|
stats: "ステータス"
|
||||||
|
|
|
@ -340,7 +340,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
tip_recurse: "Итерация свойственна человеку, рекурсия божественна. - L. Peter Deutsch"
|
tip_recurse: "Итерация свойственна человеку, рекурсия божественна. - L. Peter Deutsch"
|
||||||
tip_free_your_mind: "Отвлекись от всего, Нео. Страх, неверие, сомнения отбрось — очисти свой разум. - Morpheus"
|
tip_free_your_mind: "Отвлекись от всего, Нео. Страх, неверие, сомнения отбрось — очисти свой разум. - Morpheus"
|
||||||
tip_strong_opponents: "Даже сильнейший противник имеет слабость. - Itachi Uchiha"
|
tip_strong_opponents: "Даже сильнейший противник имеет слабость. - Itachi Uchiha"
|
||||||
# tip_paper_and_pen: "Before you start coding, you can always plan with a sheet of paper and a pen."
|
tip_paper_and_pen: "Прежде чем приступить к решению, попробуй решить задачу с помощью бумаги и ручки."
|
||||||
|
|
||||||
game_menu:
|
game_menu:
|
||||||
inventory_tab: "Инвентарь"
|
inventory_tab: "Инвентарь"
|
||||||
|
@ -437,24 +437,24 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
payment_methods_title: "Принимаемые методы оплаты"
|
payment_methods_title: "Принимаемые методы оплаты"
|
||||||
payment_methods_blurb1: "На данный момент мы принимаем кредитные карты и Alipay."
|
payment_methods_blurb1: "На данный момент мы принимаем кредитные карты и Alipay."
|
||||||
payment_methods_blurb2: "Если вам необходим альтернативный способ оплаты, пожалуйста, свяжитесь"
|
payment_methods_blurb2: "Если вам необходим альтернативный способ оплаты, пожалуйста, свяжитесь"
|
||||||
# sale_already_subscribed: "You're already subscribed!"
|
sale_already_subscribed: "У вас уже есть подписка!"
|
||||||
# sale_blurb1: "Save 35%"
|
sale_blurb1: "Скидка 35%"
|
||||||
# sale_blurb2: "off regular subscription price of $120 for a whole year!" # {changed}
|
sale_blurb2: "от годовой подписки за $120 на весь год!" # {changed}
|
||||||
# sale_button: "Sale!"
|
sale_button: "Распродажа!"
|
||||||
# sale_button_title: "Save 35% when you purchase a 1 year subscription"
|
sale_button_title: "Сэкономьте 35% при приобретении годовой подписки"
|
||||||
# sale_click_here: "Click Here"
|
sale_click_here: "Нажмите сюда"
|
||||||
# sale_ends: "Ends"
|
sale_ends: "Заканчивается"
|
||||||
# sale_extended: "*Existing subscriptions will be extended by 1 year."
|
sale_extended: "*Текущие подписки будут продлены на год."
|
||||||
# sale_feature_here: "Here's what you'll get:"
|
sale_feature_here: "Вот что вы получите:"
|
||||||
# sale_feature2: "Access to 9 powerful <strong>new heroes</strong> with unique skills!"
|
sale_feature2: "Доступ к 9 сильным<strong>новым героям</strong>с уникальными умениями!"
|
||||||
# sale_feature4: "<strong>42,000 bonus gems</strong> awarded immediately!"
|
sale_feature4: "<strong>42,000 бонусных самоцветов</strong> в подарок!"
|
||||||
# sale_continue: "Ready to continue adventuring?"
|
sale_continue: "Готовы продолжить путешествие?"
|
||||||
# sale_limited_time: "Limited time offer!"
|
sale_limited_time: "Ограниченное предложение!"
|
||||||
# sale_new_heroes: "New heroes!"
|
sale_new_heroes: "Новые герои!"
|
||||||
# sale_title: "Back to School Sale"
|
sale_title: "Назад на школьную распродажу"
|
||||||
# sale_view_button: "Buy 1 year subscription for"
|
sale_view_button: "Купи годовую подписку за"
|
||||||
stripe_description: "Месячная подписка"
|
stripe_description: "Месячная подписка"
|
||||||
# stripe_description_year_sale: "1 Year Subscription (35% discount)"
|
stripe_description_year_sale: "Годовая подписка (35% скидка)"
|
||||||
subscription_required_to_play: "Чтобы сыграть этот уровень нужна подписка."
|
subscription_required_to_play: "Чтобы сыграть этот уровень нужна подписка."
|
||||||
unlock_help_videos: "Подпишитесь, чтобы разблокировать все обучающие видео."
|
unlock_help_videos: "Подпишитесь, чтобы разблокировать все обучающие видео."
|
||||||
personal_sub: "Личная подписка" # Accounts Subscription View below
|
personal_sub: "Личная подписка" # Accounts Subscription View below
|
||||||
|
@ -836,7 +836,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
latest_achievement: "Последнее достижение"
|
latest_achievement: "Последнее достижение"
|
||||||
playtime: "Время игры"
|
playtime: "Время игры"
|
||||||
last_played: "Последняя игра"
|
last_played: "Последняя игра"
|
||||||
# leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances."
|
leagues_explanation: "Играйте в лиге против других членов клана на мультиплеерной арене."
|
||||||
|
|
||||||
classes:
|
classes:
|
||||||
archmage_title: "Архимаг"
|
archmage_title: "Архимаг"
|
||||||
|
@ -1026,7 +1026,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
my_matches: "Мои матчи"
|
my_matches: "Мои матчи"
|
||||||
simulate: "Симулирование"
|
simulate: "Симулирование"
|
||||||
simulation_explanation: "Симулированием игр вы сможете быстрее получить оценку игры!"
|
simulation_explanation: "Симулированием игр вы сможете быстрее получить оценку игры!"
|
||||||
# simulation_explanation_leagues: "You will mainly help simulate games for allied players in your clans and courses."
|
simulation_explanation_leagues: "Вы поможете симулировать игры для союзных игроков в вашем клане или курсе."
|
||||||
simulate_games: "Симулировать игры!"
|
simulate_games: "Симулировать игры!"
|
||||||
simulate_all: "СБРОСИТЬ И СИМУЛИРОВАТЬ ИГРЫ"
|
simulate_all: "СБРОСИТЬ И СИМУЛИРОВАТЬ ИГРЫ"
|
||||||
games_simulated_by: "Игры, симулированные вами:"
|
games_simulated_by: "Игры, симулированные вами:"
|
||||||
|
@ -1077,7 +1077,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
tournament_blurb_blog: "в нашем блоге"
|
tournament_blurb_blog: "в нашем блоге"
|
||||||
rules: "Правила"
|
rules: "Правила"
|
||||||
winners: "Победители"
|
winners: "Победители"
|
||||||
# league: "League"
|
league: "Лига"
|
||||||
|
|
||||||
user:
|
user:
|
||||||
stats: "Характеристики"
|
stats: "Характеристики"
|
||||||
|
@ -1118,7 +1118,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
no_recent_games: "Нет сыгранных игр за последние две недели."
|
no_recent_games: "Нет сыгранных игр за последние две недели."
|
||||||
payments: "Платежи"
|
payments: "Платежи"
|
||||||
purchased: "Куплено"
|
purchased: "Куплено"
|
||||||
# sale: "Sale"
|
sale: "Распродажа"
|
||||||
subscription: "Подписка"
|
subscription: "Подписка"
|
||||||
invoices: "Счета"
|
invoices: "Счета"
|
||||||
service_apple: "Apple"
|
service_apple: "Apple"
|
||||||
|
@ -1218,18 +1218,18 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
arithmetic: "Арифметика"
|
arithmetic: "Арифметика"
|
||||||
arrays: "Массивы"
|
arrays: "Массивы"
|
||||||
basic_syntax: "Базовый синтаксис"
|
basic_syntax: "Базовый синтаксис"
|
||||||
boolean_logic: "Булева логика"
|
boolean_logic: "Булевая логика"
|
||||||
# break_statements: "Break Statements"
|
break_statements: "Оператор \"break\""
|
||||||
classes: "Классы"
|
classes: "Классы"
|
||||||
# continue_statements: "Continue Statements"
|
continue_statements: "Оператор \"continue\""
|
||||||
for_loops: "Циклы \"for\""
|
for_loops: "Циклы \"for\""
|
||||||
functions: "Функции"
|
functions: "Функции"
|
||||||
# graphics: "Graphics"
|
graphics: "Графика"
|
||||||
if_statements: "Условные операторы"
|
if_statements: "Условные операторы"
|
||||||
input_handling: "Обработка ввода"
|
input_handling: "Обработка ввода"
|
||||||
math_operations: "Математические операции"
|
math_operations: "Математические операции"
|
||||||
object_literals: "Литералы объектов"
|
object_literals: "Литералы объектов"
|
||||||
# parameters: "Parameters"
|
parameters: "Параметры"
|
||||||
strings: "Строки"
|
strings: "Строки"
|
||||||
variables: "Переменные"
|
variables: "Переменные"
|
||||||
vectors: "Векторы"
|
vectors: "Векторы"
|
||||||
|
|
|
@ -652,33 +652,33 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
sys_requirements_1: "Оскільки CodeCombat — це гра, для нормальної роботи він вимагає у комп'ютерів більше, ніж відео чи текстові посібники. Ми оптимізували його для швидкої роботи в усіх сучасних браузерах і на старіших машинах, щоб кожен міг грати. І ось наші підказки, як отримати від CodeCombat якнайбільше:" # {change}
|
sys_requirements_1: "Оскільки CodeCombat — це гра, для нормальної роботи він вимагає у комп'ютерів більше, ніж відео чи текстові посібники. Ми оптимізували його для швидкої роботи в усіх сучасних браузерах і на старіших машинах, щоб кожен міг грати. І ось наші підказки, як отримати від CodeCombat якнайбільше:" # {change}
|
||||||
sys_requirements_2: "Використовуйте новіші версії Chrome або Firefox." # {change}
|
sys_requirements_2: "Використовуйте новіші версії Chrome або Firefox." # {change}
|
||||||
|
|
||||||
# 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 subscription is being"
|
being_reviewed_1: "Ваша заявка на безкоштовну пробну підписку зараз"
|
||||||
# being_reviewed_2: "reviewed."
|
being_reviewed_2: "на розгляді."
|
||||||
# approved_1: "Your application for a free trial subscription was"
|
approved_1: "Ваша заявка на безкоштовну пробну підписку була"
|
||||||
# approved_2: "approved."
|
approved_2: "затверджена."
|
||||||
# approved_3: "Further instructions have been sent to"
|
approved_3: "Подальші інструкції були вислані на"
|
||||||
# denied_1: "Your application for a free trial subscription 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 subscriptions to teachers for evaluation purposes. You can find more information on our"
|
description_1: "Ми пропонуємо безкоштовні підписки вчителям в цілях ознайомлення. Ви можете знайти більше інформації на нашій сторінці"
|
||||||
# description_2: "teachers"
|
# description_2: "teachers"
|
||||||
# description_3: "page."
|
# description_3: "page."
|
||||||
# description_4: "Please fill out this quick survey and we’ll email you setup instructions."
|
description_4: "Будь ласка, заповніть цю маленьку анкету і ми надішлемо вам інструкції з установки на email."
|
||||||
# email: "Email Address"
|
email: "Email-адреса"
|
||||||
# school: "Name of School"
|
school: "Найменування школи"
|
||||||
# location: "Name of City"
|
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: "Зберегти нову версію"
|
||||||
|
@ -688,7 +688,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
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: "Зв'язатися з CodeCombat"
|
contact_us: "Зв'язатися з CodeCombat"
|
||||||
|
@ -716,7 +716,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
picture_tab: "Аватар"
|
picture_tab: "Аватар"
|
||||||
delete_account_tab: "Вилучити свій акаунт"
|
delete_account_tab: "Вилучити свій акаунт"
|
||||||
wrong_email: "Неправильний email"
|
wrong_email: "Неправильний email"
|
||||||
# wrong_password: "Wrong Password"
|
wrong_password: "Невірний пароль"
|
||||||
upload_picture: "Відвантажити зображення"
|
upload_picture: "Відвантажити зображення"
|
||||||
delete_this_account: "Вилучити цей акаунт назовсім"
|
delete_this_account: "Вилучити цей акаунт назовсім"
|
||||||
god_mode: "Режим Бога"
|
god_mode: "Режим Бога"
|
||||||
|
@ -726,7 +726,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
new_password: "Новий пароль"
|
new_password: "Новий пароль"
|
||||||
new_password_verify: "Підтвердження паролю"
|
new_password_verify: "Підтвердження паролю"
|
||||||
type_in_email: "Введіть свій email, щоб підтвердити вилучення" # {change}
|
type_in_email: "Введіть свій email, щоб підтвердити вилучення" # {change}
|
||||||
# type_in_password: "Also, type in your password."
|
type_in_password: "Також введіть ваш пароль."
|
||||||
email_subscriptions: "Email-підписки"
|
email_subscriptions: "Email-підписки"
|
||||||
email_subscriptions_none: "Жодних підписок."
|
email_subscriptions_none: "Жодних підписок."
|
||||||
email_announcements: "Оголошення"
|
email_announcements: "Оголошення"
|
||||||
|
@ -757,7 +757,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
keyboard_shortcuts: "Клавіатурні скорочення"
|
keyboard_shortcuts: "Клавіатурні скорочення"
|
||||||
space: "Пробіл"
|
space: "Пробіл"
|
||||||
enter: "Enter"
|
enter: "Enter"
|
||||||
# press_enter: "press enter"
|
press_enter: "Натисність enter"
|
||||||
escape: "Escape"
|
escape: "Escape"
|
||||||
shift: "Shift"
|
shift: "Shift"
|
||||||
run_code: "Виконати поточний код."
|
run_code: "Виконати поточний код."
|
||||||
|
@ -784,7 +784,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
article_editor_prefix: "Бачили помилку у якомусь з наших доків? Хочете зробити якісь інструкції до своїх творінь? Огляньте "
|
article_editor_prefix: "Бачили помилку у якомусь з наших доків? Хочете зробити якісь інструкції до своїх творінь? Огляньте "
|
||||||
article_editor_suffix: "і допоможіть гравцям CodeCombat отримати максимум зі свого ігрового часу."
|
article_editor_suffix: "і допоможіть гравцям CodeCombat отримати максимум зі свого ігрового часу."
|
||||||
find_us: "Шукайте нас на цих сайтах"
|
find_us: "Шукайте нас на цих сайтах"
|
||||||
# social_github: "Check out all our code on GitHub"
|
social_github: "Подивіться код нашого проекту на GitHub"
|
||||||
social_blog: "Читайте наш блоґ на Sett"
|
social_blog: "Читайте наш блоґ на Sett"
|
||||||
social_discource: "Приєднайтеся до обговорення на форумі"
|
social_discource: "Приєднайтеся до обговорення на форумі"
|
||||||
social_facebook: "Вподобайте CodeCombat на Facebook"
|
social_facebook: "Вподобайте CodeCombat на Facebook"
|
||||||
|
@ -801,7 +801,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
make_private: "Зробити клан приватним"
|
make_private: "Зробити клан приватним"
|
||||||
subs_only: "лише для підписчиків"
|
subs_only: "лише для підписчиків"
|
||||||
create_clan: "Створити новий клан"
|
create_clan: "Створити новий клан"
|
||||||
# private_preview: "Preview"
|
private_preview: "Прев'ю"
|
||||||
public_clans: "Публічні клани"
|
public_clans: "Публічні клани"
|
||||||
my_clans: "Мої клани"
|
my_clans: "Мої клани"
|
||||||
clan_name: "Назва клану"
|
clan_name: "Назва клану"
|
||||||
|
@ -826,7 +826,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
not_started_1: "не розпочато"
|
not_started_1: "не розпочато"
|
||||||
started_1: "розпочато"
|
started_1: "розпочато"
|
||||||
complete_1: "завершено"
|
complete_1: "завершено"
|
||||||
# exp_levels: "Expand levels"
|
exp_levels: "Розкрити рівні"
|
||||||
rem_hero: "Вилучити героя"
|
rem_hero: "Вилучити героя"
|
||||||
status: "Статус"
|
status: "Статус"
|
||||||
complete_2: "Завершено"
|
complete_2: "Завершено"
|
||||||
|
@ -836,7 +836,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
latest_achievement: "Останнє досягнення"
|
latest_achievement: "Останнє досягнення"
|
||||||
playtime: "Тривалість гри"
|
playtime: "Тривалість гри"
|
||||||
last_played: "Остання гра"
|
last_played: "Остання гра"
|
||||||
# leagues_explanation: "Play in a league against other clan members in these multiplayer arena instances."
|
leagues_explanation: "Грайте в лізі проти інших членів клану на мультіплєєрній арені."
|
||||||
|
|
||||||
classes:
|
classes:
|
||||||
archmage_title: "Архімаг"
|
archmage_title: "Архімаг"
|
||||||
|
@ -873,8 +873,8 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
indoor: "Кімната"
|
indoor: "Кімната"
|
||||||
desert: "Пустеля"
|
desert: "Пустеля"
|
||||||
grassy: "Подвір'я"
|
grassy: "Подвір'я"
|
||||||
# mountain: "Mountain"
|
mountain: "Гора"
|
||||||
# glacier: "Glacier"
|
glacier: "Льодовик"
|
||||||
small: "Малий"
|
small: "Малий"
|
||||||
large: "Великий"
|
large: "Великий"
|
||||||
fork_title: "Форк нової версії"
|
fork_title: "Форк нової версії"
|
||||||
|
@ -897,7 +897,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
level_tab_thangs_all: "Усі"
|
level_tab_thangs_all: "Усі"
|
||||||
level_tab_thangs_conditions: "Початковий статус"
|
level_tab_thangs_conditions: "Початковий статус"
|
||||||
level_tab_thangs_add: "Додати об'єкти"
|
level_tab_thangs_add: "Додати об'єкти"
|
||||||
# level_tab_thangs_search: "Search thangs"
|
level_tab_thangs_search: "Знайти об'єкти"
|
||||||
add_components: "Додати коментарі"
|
add_components: "Додати коментарі"
|
||||||
component_configs: "Налаштування компонента"
|
component_configs: "Налаштування компонента"
|
||||||
config_thang: "Подвійний клік для конфігуровання об'єктів"
|
config_thang: "Подвійний клік для конфігуровання об'єктів"
|
||||||
|
@ -943,8 +943,8 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
pop_i18n: "Додати I18N"
|
pop_i18n: "Додати I18N"
|
||||||
tasks: "Завдання"
|
tasks: "Завдання"
|
||||||
clear_storage: "Очистити свої локальні зміни"
|
clear_storage: "Очистити свої локальні зміни"
|
||||||
# add_system_title: "Add Systems to Level"
|
add_system_title: "Додати системи на рівень"
|
||||||
# done_adding: "Done Adding"
|
done_adding: "Додано"
|
||||||
|
|
||||||
article:
|
article:
|
||||||
edit_btn_preview: "Перегляд"
|
edit_btn_preview: "Перегляд"
|
||||||
|
@ -1067,17 +1067,17 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
fight: "У бій!"
|
fight: "У бій!"
|
||||||
watch_victory: "Подивитись Вашу перемогу"
|
watch_victory: "Подивитись Вашу перемогу"
|
||||||
defeat_the: "Перемогти"
|
defeat_the: "Перемогти"
|
||||||
# tournament_started: ", started"
|
tournament_started: ", розпочинається."
|
||||||
tournament_ends: "Турнір завершуються"
|
tournament_ends: "Турнір завершується"
|
||||||
tournament_ended: "Турнір завершено"
|
tournament_ended: "Турнір завершено"
|
||||||
tournament_rules: "Правила турніру"
|
tournament_rules: "Правила турніру"
|
||||||
tournament_blurb: "Пиши код, збирай золото, будуй армії, розбивай ворогів, вигравай призи і покращуй свою кар'єру у нашому Greed Турнірі на 40 000 $! Дізнайся більше "
|
tournament_blurb: "Пиши код, збирай золото, будуй армії, розбивай ворогів, вигравай призи і покращуй свою кар'єру у нашому Greed Турнірі на 40 000 $! Дізнайся більше "
|
||||||
tournament_blurb_criss_cross: "Вигравай ставки, створюй шляхи, перехитри опонентів, збирай самоцвіти і покращуй свою кар'єру у нашому Criss-Cross Турнірі! Дізнайся більше "
|
tournament_blurb_criss_cross: "Вигравай ставки, створюй шляхи, перехитри опонентів, збирай самоцвіти і покращуй свою кар'єру у нашому Criss-Cross Турнірі! Дізнайся більше "
|
||||||
# tournament_blurb_zero_sum: "Unleash your coding creativity in both gold gathering and battle tactics in this alpine mirror match between red sorcerer and blue sorcerer. The tournament began on Friday, March 27 and will run until Monday, April 6 at 5PM PDT. Compete for fun and glory! Check out the details"
|
tournament_blurb_zero_sum: "Надайте волю своєї програмістської фантазії у збиранні золота і бойової тактиці в цьому високогірному дзеркальному матчі між червоним чарівником і синім чарівником. Турнір розпочався в п'ятницю, 27 березня, і продовжиться до 17.00 PDT понеділка, 6 квітня. Беріть участь для веселощів і слави! Подивіться деталі"
|
||||||
tournament_blurb_blog: "у нашому блозі"
|
tournament_blurb_blog: "у нашому блозі"
|
||||||
rules: "Правила"
|
rules: "Правила"
|
||||||
winners: "Переможці"
|
winners: "Переможці"
|
||||||
# league: "League"
|
league: "Ліга"
|
||||||
|
|
||||||
user:
|
user:
|
||||||
stats: "Статистика"
|
stats: "Статистика"
|
||||||
|
@ -1211,19 +1211,19 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
poll: "Опитування"
|
poll: "Опитування"
|
||||||
user_polls_record: "Історія голосування в опитуваннях"
|
user_polls_record: "Історія голосування в опитуваннях"
|
||||||
|
|
||||||
# concepts:
|
concepts:
|
||||||
# advanced_strings: "Advanced Strings"
|
advanced_strings: "Продвинуті строки"
|
||||||
# algorithms: "Algorithms"
|
algorithms: "Алгоритми"
|
||||||
# arguments: "Arguments"
|
arguments: "Аргументи"
|
||||||
# arithmetic: "Arithmetic"
|
arithmetic: "Арифметика"
|
||||||
# arrays: "Arrays"
|
arrays: "Масиви"
|
||||||
# basic_syntax: "Basic Syntax"
|
basic_syntax: "Базовий синтаксис"
|
||||||
# boolean_logic: "Boolean Logic"
|
boolean_logic: "Булева логіка"
|
||||||
# break_statements: "Break Statements"
|
# break_statements: "Break Statements"
|
||||||
# classes: "Classes"
|
classes: "Класи"
|
||||||
# continue_statements: "Continue Statements"
|
# continue_statements: "Continue Statements"
|
||||||
# for_loops: "For Loops"
|
for_loops: "Цикл For"
|
||||||
# functions: "Functions"
|
functions: "Функції"
|
||||||
# graphics: "Graphics"
|
# graphics: "Graphics"
|
||||||
# if_statements: "If Statements"
|
# if_statements: "If Statements"
|
||||||
# input_handling: "Input Handling"
|
# input_handling: "Input Handling"
|
||||||
|
@ -1233,13 +1233,13 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
# strings: "Strings"
|
# strings: "Strings"
|
||||||
# variables: "Variables"
|
# variables: "Variables"
|
||||||
# vectors: "Vectors"
|
# vectors: "Vectors"
|
||||||
# while_loops: "Loops"
|
while_loops: "Цикли"
|
||||||
# recursion: "Recursion"
|
recursion: "Рекурсія"
|
||||||
|
|
||||||
delta:
|
delta:
|
||||||
added: "Додано"
|
added: "Додано"
|
||||||
modified: "Змінено"
|
modified: "Змінено"
|
||||||
# not_modified: "Not Modified"
|
not_modified: "Не змінено"
|
||||||
deleted: "Вилучено"
|
deleted: "Вилучено"
|
||||||
moved_index: "Переміщено індекс"
|
moved_index: "Переміщено індекс"
|
||||||
text_diff: "Різниця тексту"
|
text_diff: "Різниця тексту"
|
||||||
|
@ -1409,57 +1409,57 @@ module.exports = nativeDescription: "Українська", englishDescription:
|
||||||
work_role: "Назва посади"
|
work_role: "Назва посади"
|
||||||
work_role_help: "Як називалась Ваша посада чи роль?"
|
work_role_help: "Як називалась Ваша посада чи роль?"
|
||||||
work_duration: "Тривалість"
|
work_duration: "Тривалість"
|
||||||
# work_duration_help: "When did you hold this gig?"
|
work_duration_help: "Як довго ви працювали на цій посаді?"
|
||||||
work_description: "Опис"
|
work_description: "Опис"
|
||||||
work_description_help: "Що Ви там робили? (140 символів; необов'язково)"
|
work_description_help: "Що Ви там робили? (140 символів; необов'язково)"
|
||||||
education: "Освіта"
|
education: "Освіта"
|
||||||
# education_header: "Recount your academic ordeals"
|
education_header: "Вкажіть вашу освіту"
|
||||||
# education_blurb: "List your academic ordeals."
|
education_blurb: "Перелік ваших навчальних випробувань"
|
||||||
education_school: "Школа"
|
education_school: "Школа"
|
||||||
# education_school_help: "Name of your school."
|
education_school_help: "Найменування навчального закладу."
|
||||||
education_degree: "Ступінь"
|
education_degree: "Ступінь"
|
||||||
# education_degree_help: "What was your degree and field of study?"
|
education_degree_help: "Яка ваша ступінь і область дослідження?"
|
||||||
# education_duration: "Dates"
|
education_duration: "Дати"
|
||||||
education_duration_help: "Коли?"
|
education_duration_help: "Коли?"
|
||||||
education_description: "Опис"
|
education_description: "Опис"
|
||||||
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
|
education_description_help: "Виділіть що-небудь з цього навчального досвіду. (140 символів; опціонально)"
|
||||||
our_notes: "Наші примітки"
|
our_notes: "Наші примітки"
|
||||||
remarks: "Примітки"
|
remarks: "Примітки"
|
||||||
projects: "Роботи"
|
projects: "Роботи"
|
||||||
# projects_header: "Add 3 projects"
|
projects_header: "Додайте 3 проекти"
|
||||||
# projects_header_2: "Projects (Top 3)"
|
projects_header_2: "Проекти (3 найкращих)"
|
||||||
# projects_blurb: "Highlight your projects to amaze employers."
|
projects_blurb: "Вкажіть ваші проекти, щоб вразити роботодавців."
|
||||||
project_name: "Назва проекту"
|
project_name: "Назва проекту"
|
||||||
# project_name_help: "What was the project called?"
|
project_name_help: "Яка у проекта була назва?"
|
||||||
project_description: "Опис"
|
project_description: "Опис"
|
||||||
project_description_help: "Коротко опишіть проект."
|
project_description_help: "Коротко опишіть проект."
|
||||||
project_picture: "Зображення"
|
project_picture: "Зображення"
|
||||||
# project_picture_help: "Upload a 230x115px or larger image showing off the project."
|
project_picture_help: "Завантажте зображення розміром 230x115 пікселів або більше, що демонструє проект."
|
||||||
project_link: "Посилання"
|
project_link: "Посилання"
|
||||||
project_link_help: "Посилання на проект."
|
project_link_help: "Посилання на проект."
|
||||||
# player_code: "Player Code"
|
player_code: "Код гравця"
|
||||||
|
|
||||||
employers:
|
employers:
|
||||||
deprecation_warning_title: "Вибачте, зараз CodeCombat не пропонує роботу."
|
deprecation_warning_title: "Вибачте, зараз CodeCombat не пропонує роботу."
|
||||||
deprecation_warning: "Наразі ми зосередилися на рівнях для новачків замість пошуків розробників-експертів."
|
deprecation_warning: "Наразі ми зосередилися на рівнях для новачків замість пошуків розробників-експертів."
|
||||||
hire_developers_not_credentials: "Наймаємо розробників, а не рекомендаційні листи." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section.
|
hire_developers_not_credentials: "Наймаємо розробників, а не рекомендаційні листи." # We are not actively recruiting right now, so there's no need to add new translations for the rest of this section.
|
||||||
# get_started: "Get Started"
|
get_started: "Почнемо"
|
||||||
# already_screened: "We've already technically screened all our candidates"
|
already_screened: "Ми вже технічно просіяли всіх наших кандидатів"
|
||||||
# filter_further: ", but you can also filter further:"
|
filter_further: ", але ви можете профільтрувати далі:"
|
||||||
filter_visa: "Visa"
|
filter_visa: "Visa"
|
||||||
# filter_visa_yes: "US Authorized"
|
filter_visa_yes: "Дозвіл на роботу в США"
|
||||||
# filter_visa_no: "Not Authorized"
|
filter_visa_no: "Немає дозволу на роботу"
|
||||||
# filter_education_top: "Top School"
|
filter_education_top: "Вища освіта"
|
||||||
# filter_education_other: "Other"
|
filter_education_other: "Інше"
|
||||||
filter_role_web_developer: "веб-розробник"
|
filter_role_web_developer: "веб-розробник"
|
||||||
filter_role_software_developer: "розробник програм"
|
filter_role_software_developer: "розробник програм"
|
||||||
filter_role_mobile_developer: "мобільний розробник"
|
filter_role_mobile_developer: "мобільний розробник"
|
||||||
filter_experience: "Досвід"
|
filter_experience: "Досвід"
|
||||||
# filter_experience_senior: "Senior"
|
filter_experience_senior: "Досвідчений (Senior)"
|
||||||
# filter_experience_junior: "Junior"
|
filter_experience_junior: "Початківець (Junior)"
|
||||||
# filter_experience_recent_grad: "Recent Grad"
|
filter_experience_recent_grad: "Випускник"
|
||||||
filter_experience_student: "Студент коледжу"
|
filter_experience_student: "Студент коледжу"
|
||||||
# filter_results: "results"
|
filter_results: "результати"
|
||||||
# start_hiring: "Start hiring."
|
# start_hiring: "Start hiring."
|
||||||
# reasons: "Three reasons you should hire through us:"
|
# reasons: "Three reasons you should hire through us:"
|
||||||
# everyone_looking: "Everyone here is looking for their next opportunity."
|
# everyone_looking: "Everyone here is looking for their next opportunity."
|
||||||
|
|
18
app/styles/careers.sass
Normal file
18
app/styles/careers.sass
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#careers-view
|
||||||
|
|
||||||
|
.big-side-margins
|
||||||
|
margin-left: 15%
|
||||||
|
margin-right: 15%
|
||||||
|
|
||||||
|
.big-text
|
||||||
|
font-size: 16px
|
||||||
|
|
||||||
|
.center
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
.praise-author
|
||||||
|
font-size: 12px
|
||||||
|
|
||||||
|
.praise-quote
|
||||||
|
font-size: 20px
|
||||||
|
font-style: italic
|
|
@ -1,7 +1,142 @@
|
||||||
#course-details-view
|
#course-details-view
|
||||||
|
|
||||||
.edit-description-input
|
.invite-emails
|
||||||
|
width: 50%
|
||||||
|
|
||||||
|
.progress-cell
|
||||||
|
padding: 2px
|
||||||
|
padding-bottom: 10px
|
||||||
|
|
||||||
|
.progress-popup-container
|
||||||
|
display: none
|
||||||
|
position: absolute
|
||||||
|
padding: 10px
|
||||||
|
border: 1px solid black
|
||||||
|
z-index: 3
|
||||||
|
background-color: blanchedalmond
|
||||||
|
font-size: 10pt
|
||||||
|
|
||||||
|
.progress-concept-cell
|
||||||
|
display: inline-block
|
||||||
|
white-space: nowrap
|
||||||
|
font-size: 12px
|
||||||
|
line-height: 12px
|
||||||
|
border: 1px solid gray
|
||||||
|
margin: 0px
|
||||||
|
padding: 2px
|
||||||
|
|
||||||
|
.progress-concept-cell-complete
|
||||||
|
background-color: lightgray
|
||||||
|
|
||||||
|
.progress-concept-cell-started
|
||||||
|
background-color: lightgreen
|
||||||
|
|
||||||
|
.progress-concept-completion-container
|
||||||
|
font-size: 10pt
|
||||||
|
|
||||||
|
.progress-concepts-label
|
||||||
|
color: #317EAC
|
||||||
|
font-size: 12pt
|
||||||
|
font-weight: bold
|
||||||
|
margin-top: 8px
|
||||||
|
margin-bottom: 4px
|
||||||
|
|
||||||
|
.progress-concept-summary
|
||||||
|
width: 100%
|
||||||
|
background-color: white
|
||||||
|
cursor: default
|
||||||
|
display: inline-block
|
||||||
|
white-space: nowrap
|
||||||
|
font-size: 9pt
|
||||||
|
font-weight: normal
|
||||||
|
border: 1px solid gray
|
||||||
|
margin: 0px
|
||||||
|
padding: 2px
|
||||||
|
background-color: white
|
||||||
|
|
||||||
|
.progress-concepts-container
|
||||||
width: 100%
|
width: 100%
|
||||||
|
|
||||||
.edit-name-input
|
.progress-condensed-cell
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
.progress-header
|
||||||
|
margin-right: 14px
|
||||||
|
cursor: pointer
|
||||||
|
|
||||||
|
.progress-key
|
||||||
|
cursor: default
|
||||||
|
display: inline-block
|
||||||
|
white-space: nowrap
|
||||||
|
font-size: 12px
|
||||||
|
line-height: 12px
|
||||||
|
font-weight: normal
|
||||||
|
border: 1px solid gray
|
||||||
|
margin: 0px
|
||||||
|
padding: 2px
|
||||||
|
|
||||||
|
.progress-key-complete
|
||||||
|
background-color: lightgray
|
||||||
|
|
||||||
|
.progress-key-started
|
||||||
|
background-color: lightgreen
|
||||||
|
|
||||||
|
.progress-expand-checkbox
|
||||||
|
margin-left: 14px
|
||||||
|
|
||||||
|
.progress-expand-label
|
||||||
|
font-weight: normal
|
||||||
|
font-size: 14px
|
||||||
|
|
||||||
|
.progress-level-cell
|
||||||
|
display: inline-block
|
||||||
|
white-space: nowrap
|
||||||
|
font-size: 12px
|
||||||
|
line-height: 12px
|
||||||
|
border: 1px solid gray
|
||||||
|
margin: 0px
|
||||||
|
padding: 2px
|
||||||
|
|
||||||
|
.progress-level-cell-complete
|
||||||
|
cursor: pointer
|
||||||
|
background-color: lightgray
|
||||||
|
|
||||||
|
.progress-level-cell-started
|
||||||
|
cursor: pointer
|
||||||
|
background-color: lightgreen
|
||||||
|
|
||||||
|
.progess-levels-label
|
||||||
|
color: #317EAC
|
||||||
|
font-size: 12pt
|
||||||
|
font-weight: bold
|
||||||
|
margin-top: 8px
|
||||||
|
|
||||||
|
.progress-member-cell
|
||||||
|
width: 150px
|
||||||
|
|
||||||
|
.progress-member-header
|
||||||
|
cursor: pointer
|
||||||
|
display: inline-block
|
||||||
|
padding: 2px
|
||||||
|
|
||||||
|
.progress-stats-container
|
||||||
|
font-size: 12pt
|
||||||
|
td
|
||||||
|
padding-right: 8px
|
||||||
|
|
||||||
|
.progress-summary-container
|
||||||
|
font-size: 14pt
|
||||||
|
|
||||||
|
#settingsModal .modal-dialog
|
||||||
|
background-color: white
|
||||||
|
font-size: 14pt
|
||||||
|
|
||||||
|
.settings-description-input
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
.settings-language-select
|
||||||
|
width: 200px
|
||||||
|
display: inline
|
||||||
|
|
||||||
|
.settings-name-input
|
||||||
width: 50%
|
width: 50%
|
||||||
|
|
131
app/templates/careers.jade
Normal file
131
app/templates/careers.jade
Normal file
|
@ -0,0 +1,131 @@
|
||||||
|
extends /templates/base
|
||||||
|
|
||||||
|
block content
|
||||||
|
|
||||||
|
//- DO NOT localize / i18n
|
||||||
|
|
||||||
|
.center
|
||||||
|
img(src="/images/pages/careers/recruiting.png")
|
||||||
|
|
||||||
|
if position === 'software-engineer'
|
||||||
|
h1.center Software Engineer
|
||||||
|
+company-blurb
|
||||||
|
|
||||||
|
.big-side-margins
|
||||||
|
h3 Engineering at CodeCombat
|
||||||
|
|
||||||
|
.big-text
|
||||||
|
p We are just getting started, and there is so much more to build. Over the next year, we'll be pushing hard on mobile, gameplay, and education tools. We are looking for strong engineers who are eager to jump in and take the lead on shipping these projects and more.
|
||||||
|
|
||||||
|
p CodeCombat is built with Node, Backbone, and CoffeeScript. If you don’t know these particular technologies yet we’ll help you ramp up in no time.
|
||||||
|
|
||||||
|
h3 Upcoming Projects
|
||||||
|
|
||||||
|
.big-text
|
||||||
|
p
|
||||||
|
strong iPad app
|
||||||
|
div Bring the CodeCombat experience to the iPad
|
||||||
|
|
||||||
|
p
|
||||||
|
strong Social debugging
|
||||||
|
div Allow players to jump in and help others that are stuck
|
||||||
|
|
||||||
|
p
|
||||||
|
strong Language parsing and manipulation
|
||||||
|
div Dial up the intelligence behind our language parsers so we can help players fix their code
|
||||||
|
|
||||||
|
p
|
||||||
|
strong Adaptive pacing
|
||||||
|
div Modify level difficulties or skip some altogether to ensure players are at maximum fun
|
||||||
|
|
||||||
|
p
|
||||||
|
strong Real-time multiplayer
|
||||||
|
div Wouldn’t it be cool if players could battle head-to-head or team up in an epic real-time dungeon? Great, you should come help us build it!
|
||||||
|
|
||||||
|
+next-steps
|
||||||
|
|
||||||
|
else if position === 'software-engineer-ios'
|
||||||
|
h1.center Software Engineer, iOS
|
||||||
|
+company-blurb
|
||||||
|
|
||||||
|
.big-side-margins
|
||||||
|
h3 iOS at CodeCombat
|
||||||
|
|
||||||
|
.big-text
|
||||||
|
p Want to write the first iPad app for CodeCombat? We’re looking for a product-focused engineer to translate our core gameplay and educational tools into an experience that feels like it was born on the iPad.
|
||||||
|
|
||||||
|
p Building a great iPad experience is important to CodeCombat because many classrooms are using iPads instead of desktops with their students. It’s essential that we bring CodeCombat to those students as well.
|
||||||
|
|
||||||
|
p We’re looking for someone who is well-versed in iOS development, has a strong understanding of good UX, and isn’t afraid to get their hands dirty in the backend code.
|
||||||
|
|
||||||
|
+next-steps
|
||||||
|
|
||||||
|
else if position === 'game-designer'
|
||||||
|
h1.center Game Designer
|
||||||
|
+company-blurb
|
||||||
|
|
||||||
|
.big-side-margins
|
||||||
|
|
||||||
|
h3 Game Design at CodeCombat
|
||||||
|
|
||||||
|
.big-text
|
||||||
|
p Our game levels are a core piece of CodeCombat. Much of the work we do revolves around improving them or the way they’re accessed by our players.
|
||||||
|
|
||||||
|
h3 Example Projects
|
||||||
|
|
||||||
|
.big-text
|
||||||
|
p
|
||||||
|
strong Build levels
|
||||||
|
div Turn learning computer science concepts into a game! For example, teach loops by creating a patterned maze.
|
||||||
|
|
||||||
|
p
|
||||||
|
strong Tune levels
|
||||||
|
div We have extensive analytics on where players get confused or stop having fun. You’ll dig into that data to come up with balance tweaks, helpful asides, and improved pacing for all our levels.
|
||||||
|
|
||||||
|
p
|
||||||
|
strong Create level components
|
||||||
|
div Code up new hero abilities, spells, items, and enemies that will be used across multiple levels.
|
||||||
|
|
||||||
|
h3 Requirements
|
||||||
|
|
||||||
|
.big-text
|
||||||
|
p We’re looking for someone with some programming experience, has played through the CodeCombat levels, can creatively bring levels to life, and has an eye for detail.
|
||||||
|
|
||||||
|
+next-steps
|
||||||
|
|
||||||
|
else
|
||||||
|
.center
|
||||||
|
h1 Available Positions
|
||||||
|
.big-text
|
||||||
|
p
|
||||||
|
a(href="/careers/software-engineer") Software Engineer
|
||||||
|
p
|
||||||
|
a(href="/careers/software-engineer-ios") Software Engineer, iOS
|
||||||
|
p
|
||||||
|
a(href="/careers/game-designer") Game Designer
|
||||||
|
br
|
||||||
|
p Don't see a position that suits you, but still want to to contribute?
|
||||||
|
p
|
||||||
|
span.spr Please contact us at
|
||||||
|
a(href="mailto:careers@codecombat.com") careers@codecombat.com
|
||||||
|
|
||||||
|
mixin company-blurb
|
||||||
|
.big-side-margins.big-text
|
||||||
|
p CodeCombat is changing how kids learn computer science, using real programming languages to explore an adventure game. Students start with simple function calls to move a hero and before long they’re writing functions to send archers to the eastern defenses.
|
||||||
|
|
||||||
|
p Our teacher tools allow CodeCombat to create classroom experiences which are awesome and effective.
|
||||||
|
|
||||||
|
.big-side-margins
|
||||||
|
p
|
||||||
|
.praise-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!!
|
||||||
|
.praise-author - Kristin Huff, Teacher, Webb City School District
|
||||||
|
|
||||||
|
p We’re looking for team members who can help us reach our students around the world. If you are passionate about gaming or education, a self starter, and looking to join a small scrappy team, we want to meet you!
|
||||||
|
|
||||||
|
mixin next-steps
|
||||||
|
h3 Next Steps
|
||||||
|
.big-text
|
||||||
|
p If this sounds exciting to you, we want to hear from you!
|
||||||
|
p
|
||||||
|
span.spr Please send a resume (and anything else you’d like us to see) to
|
||||||
|
a(href="mailto:careers@codecombat.com") careers@codecombat.com
|
|
@ -9,23 +9,254 @@ block content
|
||||||
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
a.spl(href='mailto:team@codecombat.com') team@codecombat.com
|
||||||
div(style='border-bottom: 1px solid black;')
|
div(style='border-bottom: 1px solid black;')
|
||||||
|
|
||||||
h1(style='text-align: center;') Course
|
if me.isAnonymous()
|
||||||
if course
|
h1 TODO: logged out
|
||||||
div= course.get('name')
|
else if !course || !courseInstance
|
||||||
div= course.get('description')
|
h1 Loading...
|
||||||
div= course.get('campaignID')
|
|
||||||
div= course.get('concepts')
|
|
||||||
else
|
else
|
||||||
div No course found.
|
h1= courseInstance.get('name') || 'Unnamed Class'
|
||||||
|
small.spl (#{course.get('name')})
|
||||||
|
|
||||||
h1(style='text-align: center;') Class
|
|
||||||
if courseInstance
|
|
||||||
p
|
p
|
||||||
div= courseInstance.get('name') || 'Class Name'
|
if courseInstance.get('description')
|
||||||
div= courseInstance.get('description')
|
each line in courseInstance.get('description').split('\n')
|
||||||
div= courseInstance.get('courseID')
|
div= line
|
||||||
div= courseInstance.get('ownerID')
|
if adminMode && courseInstance
|
||||||
div= courseInstance.get('members')
|
+settings-dialog
|
||||||
div= courseInstance.get('prepaidID')
|
p
|
||||||
|
button.btn.btn-xs(data-toggle='modal', data-target='#settingsModal') edit class settings
|
||||||
|
|
||||||
|
div.well.well-sm(role='tabpanel')
|
||||||
|
ul.nav.nav-pills(role='tablist')
|
||||||
|
li.active(role='presentation')
|
||||||
|
a(href='#progress', aria-controls='progress', role='tab', data-toggle='tab') Class Progress
|
||||||
|
if adminMode
|
||||||
|
li(role='presentation')
|
||||||
|
a(href='#invite', aria-controls='invite', role='tab', data-toggle='tab') Add Students
|
||||||
|
li(role='presentation')
|
||||||
|
a(href='#levels', aria-controls='levels', role='tab', data-toggle='tab') Levels
|
||||||
|
.tab-content
|
||||||
|
.tab-pane.active#progress(role='tabpanel')
|
||||||
|
+progress-tab
|
||||||
|
if adminMode
|
||||||
|
.tab-pane#invite(role='tabpanel')
|
||||||
|
+invite-tab
|
||||||
|
.tab-pane#levels(role='tabpanel')
|
||||||
|
+levels-tab
|
||||||
|
|
||||||
|
mixin progress-tab
|
||||||
|
.container-fluid.progress-summary-container
|
||||||
|
.row
|
||||||
|
.col-md-6
|
||||||
|
+progress-summary-stats
|
||||||
|
.col-md-6
|
||||||
|
+progress-summary-concepts
|
||||||
|
+progress-members
|
||||||
|
|
||||||
|
mixin progress-summary-stats
|
||||||
|
h3 Statistics
|
||||||
|
table.progress-stats-container
|
||||||
|
tr
|
||||||
|
td Total students:
|
||||||
|
td
|
||||||
|
if courseInstance
|
||||||
|
div #{courseInstance.get('members').length}
|
||||||
|
tr
|
||||||
|
td Average level play time:
|
||||||
|
td TODO
|
||||||
|
tr
|
||||||
|
td Total play time:
|
||||||
|
td TODO
|
||||||
|
tr
|
||||||
|
td Average levels completed:
|
||||||
|
td TODO
|
||||||
|
tr
|
||||||
|
td Total levels completed:
|
||||||
|
td TODO
|
||||||
|
tr
|
||||||
|
td Furthest level completed:
|
||||||
|
td TODO
|
||||||
|
|
||||||
|
mixin progress-summary-concepts
|
||||||
|
h3 Concepts Covered
|
||||||
|
if course && courseInstance && conceptsCompleted
|
||||||
|
table.progress-concepts-container
|
||||||
|
each concept in course.get('concepts')
|
||||||
|
- var conceptCompletion = Math.round(parseFloat(conceptsCompleted[concept]) / courseInstance.get('members').length * 100)
|
||||||
|
if isNaN(conceptCompletion)
|
||||||
|
- conceptCompletion = 0
|
||||||
|
tr
|
||||||
|
td.progress-concept-completion-container
|
||||||
|
span.progress-concept-summary(style="width:#{conceptCompletion}%;")
|
||||||
|
span.spr(data-i18n="concepts." + concept)
|
||||||
|
span - #{conceptCompletion}%
|
||||||
|
|
||||||
|
mixin progress-members
|
||||||
|
h3 Students
|
||||||
|
table.table.table-condensed
|
||||||
|
thead
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
span.progress-member-header.spr Name
|
||||||
|
if memberSort === 'nameAsc'
|
||||||
|
span.progress-member-header.glyphicon.glyphicon-chevron-up
|
||||||
|
else if memberSort === 'nameDesc'
|
||||||
|
span.progress-member-header.glyphicon.glyphicon-chevron-down
|
||||||
|
th
|
||||||
|
span.progress-header.spr Progress
|
||||||
|
if memberSort === 'progressAsc'
|
||||||
|
span.progress-header.glyphicon.glyphicon-chevron-up
|
||||||
|
else if memberSort === 'progressDesc'
|
||||||
|
span.progress-header.glyphicon.glyphicon-chevron-down
|
||||||
else
|
else
|
||||||
p No classes found.
|
span(style='padding-left:16px;')
|
||||||
|
span.progress-key.progress-key-complete complete
|
||||||
|
span.progress-key.progress-key-started started
|
||||||
|
span.progress-key not started
|
||||||
|
input.progress-expand-checkbox(type='checkbox')
|
||||||
|
span.spl.progress-expand-label Expand details
|
||||||
|
tbody
|
||||||
|
each memberID in sortedMembers
|
||||||
|
tr
|
||||||
|
td.progress-member-cell
|
||||||
|
+progress-members-individual(memberID)
|
||||||
|
td.progress-cell
|
||||||
|
if showExpandedProgress
|
||||||
|
.progress-concepts-label Concepts
|
||||||
|
+progress-members-concepts(memberID)
|
||||||
|
.progess-levels-label Levels
|
||||||
|
+progress-members-levels-expanded(memberID)
|
||||||
|
else
|
||||||
|
table
|
||||||
|
tbody
|
||||||
|
tr
|
||||||
|
td.progress-concepts-label Concepts
|
||||||
|
td.progress-condensed-cell
|
||||||
|
+progress-members-concepts(memberID)
|
||||||
|
tr
|
||||||
|
td.progess-levels-label Levels
|
||||||
|
td.progress-condensed-cell
|
||||||
|
+progress-members-levels-condensed(memberID)
|
||||||
|
|
||||||
|
mixin progress-members-individual(memberID)
|
||||||
|
- var name = memberUserMap[memberID] ? memberUserMap[memberID].get('name') : 'Anoner'
|
||||||
|
a(href="/user/#{memberID}")= name || 'Anoner'
|
||||||
|
div TODO: levels completed
|
||||||
|
div TODO: total time played
|
||||||
|
div TODO: last played
|
||||||
|
|
||||||
|
mixin progress-members-concepts(memberID)
|
||||||
|
if course && userLevelStateMap[memberID]
|
||||||
|
each concept in course.get('concepts')
|
||||||
|
if userConceptStateMap[memberID][concept] === 'complete'
|
||||||
|
span.spr.progress-concept-cell.progress-concept-cell-complete(data-i18n="concepts." + concept)
|
||||||
|
else if userConceptStateMap[memberID][concept] === 'started'
|
||||||
|
span.spr.progress-concept-cell.progress-concept-cell-started(data-i18n="concepts." + concept)
|
||||||
|
else if showExpandedProgress
|
||||||
|
span.spr.progress-concept-cell.progress-concept-cell-not-started(data-i18n="concepts." + concept)
|
||||||
|
|
||||||
|
mixin progress-members-levels-expanded(memberID)
|
||||||
|
if campaign && userLevelStateMap[memberID]
|
||||||
|
- var i = 0
|
||||||
|
each level, levelID in campaign.get('levels')
|
||||||
|
if userLevelStateMap[memberID][levelID] === 'complete'
|
||||||
|
span.progress-level-cell.progress-level-cell-complete #{i + 1}
|
||||||
|
span.spl= level.name.replace('Course: ', '')
|
||||||
|
+progress-members-popup-completed(i, level)
|
||||||
|
else if userLevelStateMap[memberID][levelID] === 'started'
|
||||||
|
span.progress-level-cell.progress-level-cell-started #{i + 1} #{level.name.replace('Course: ', '')}
|
||||||
|
+progress-members-popup-started(i, level)
|
||||||
|
else
|
||||||
|
span.progress-level-cell #{i + 1} #{level.name.replace('Course: ', '')}
|
||||||
|
- i++
|
||||||
|
|
||||||
|
mixin progress-members-levels-condensed(memberID)
|
||||||
|
if campaign && userLevelStateMap[memberID]
|
||||||
|
- var numLevels = Object.keys(campaign.get('levels')).length
|
||||||
|
- var levelCellWidth = 100.00
|
||||||
|
if numLevels > 0
|
||||||
|
levelCellWidth = 100.00 / numLevels
|
||||||
|
- var i = 0
|
||||||
|
each level, levelID in campaign.get('levels')
|
||||||
|
if userLevelStateMap[memberID][levelID] === 'complete'
|
||||||
|
span.progress-level-cell.progress-level-cell-complete(style="width:#{levelCellWidth}%;") #{i + 1}
|
||||||
|
+progress-members-popup-completed(i, level)
|
||||||
|
else if userLevelStateMap[memberID][levelID] === 'started'
|
||||||
|
span.progress-level-cell.progress-level-cell-started(style="width:#{levelCellWidth}%;") #{i + 1}
|
||||||
|
+progress-members-popup-started(i, level)
|
||||||
|
else
|
||||||
|
break
|
||||||
|
- i++
|
||||||
|
|
||||||
|
mixin progress-members-popup-completed(i, level)
|
||||||
|
.progress-popup-container
|
||||||
|
h3 #{i + 1}. #{level.name.replace('Course: ', '')}
|
||||||
|
p TODO: Time to solve
|
||||||
|
p TODO: Completed on
|
||||||
|
strong Click to view solution.
|
||||||
|
|
||||||
|
mixin progress-members-popup-started(i, level)
|
||||||
|
.progress-popup-container
|
||||||
|
h3 #{i + 1}. #{level.name.replace('Course: ', '')}
|
||||||
|
p TODO: last played on
|
||||||
|
strong Click to view solution.
|
||||||
|
|
||||||
|
mixin invite-tab
|
||||||
|
p Invite students to join this class.
|
||||||
|
p TODO: Student unlock code
|
||||||
|
p TODO: Class capacity
|
||||||
|
textarea.invite-emails(rows=3, placeholder="Enter student emails to invite, one per line")
|
||||||
|
div(style='margin-top:10px;')
|
||||||
|
button.btn.btn-success.btn-invite Send Invites
|
||||||
|
|
||||||
|
mixin levels-tab
|
||||||
|
table.table.table-striped.table-condensed
|
||||||
|
thead
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
th Status
|
||||||
|
th Level
|
||||||
|
th Concepts
|
||||||
|
tbody
|
||||||
|
if campaign
|
||||||
|
each level, levelID in campaign.get('levels')
|
||||||
|
tr
|
||||||
|
td
|
||||||
|
button.btn.btn-success.btn-play-level(data-level-slug=level.slug) Play
|
||||||
|
td
|
||||||
|
if userLevelStateMap[me.id]
|
||||||
|
div= userLevelStateMap[me.id][levelID]
|
||||||
|
td= level.name.replace('Course: ', '')
|
||||||
|
td
|
||||||
|
if levelConceptMap[levelID]
|
||||||
|
each concept in course.get('concepts')
|
||||||
|
if levelConceptMap[levelID][concept]
|
||||||
|
span.spr.progress-level-cell.progress-level-cell-not-started(data-i18n="concepts." + concept)
|
||||||
|
|
||||||
|
mixin settings-dialog
|
||||||
|
.modal#settingsModal
|
||||||
|
.modal-dialog
|
||||||
|
.modal-header
|
||||||
|
button.close(data-dismiss='modal')
|
||||||
|
span ×
|
||||||
|
h3.modal-title Edit Class Settings
|
||||||
|
.modal-body
|
||||||
|
p
|
||||||
|
strong Title
|
||||||
|
p
|
||||||
|
input.settings-name-input(type='text', value="#{courseInstance.get('name') || ''}")
|
||||||
|
p
|
||||||
|
strong Description
|
||||||
|
p
|
||||||
|
textarea.settings-description-input(rows=2)= courseInstance.get('description')
|
||||||
|
p Select programming languages available to the class:
|
||||||
|
p
|
||||||
|
select.form-control.settings-language-select
|
||||||
|
option(value="Python") Python
|
||||||
|
option(value="JavaScript") JavaScript
|
||||||
|
option(value="All Languages") All Languages
|
||||||
|
p
|
||||||
|
input.settings-public-progress(type='checkbox', checked)
|
||||||
|
span.spl Show student progress to everyone in the class
|
||||||
|
.modal-footer
|
||||||
|
button.btn.btn-save-settings(data-i18n="common.save_changes")
|
||||||
|
|
|
@ -98,6 +98,30 @@ block content
|
||||||
a(href="http://discourse.codecombat.com/") the forum
|
a(href="http://discourse.codecombat.com/") the forum
|
||||||
| and discuss your strategies, your triumphs, and your turmoils.
|
| and discuss your strategies, your triumphs, and your turmoils.
|
||||||
|
|
||||||
|
if level.get('name') == 'Ace of Coders'
|
||||||
|
.tournament-blurb
|
||||||
|
h2
|
||||||
|
span(data-i18n="ladder.tournament_ends") Tournament ends
|
||||||
|
//span(data-i18n="ladder.tournament_ended") Tournament ended
|
||||||
|
| #{tournamentTimeLeft}
|
||||||
|
span(data-i18n="ladder.tournament_started") , started
|
||||||
|
| #{tournamentTimeElapsed}
|
||||||
|
p
|
||||||
|
span(data-i18n="ladder.tournament_blurb_ace_of_coders") Battle it out in the frozen glacier in this domination-style mirror match! The tournament began on Wednesday, September 16 and will run until Wednesday, October 14 at 5PM PDT. Check out the details
|
||||||
|
|
|
||||||
|
a(href="http://blog.codecombat.com/ace-of-coders-multiplayer-programming-tournament", data-i18n="ladder.tournament_blurb_blog") on our blog
|
||||||
|
| .
|
||||||
|
//p
|
||||||
|
// strong Tournament ended!
|
||||||
|
// a(href="#winners") Behold the winners
|
||||||
|
// | . Thanks for playing! You can
|
||||||
|
// strong still play
|
||||||
|
// | Ace of Coders as long as you like.
|
||||||
|
//p
|
||||||
|
// | Want to commiserate? Head over to
|
||||||
|
// a(href="http://discourse.codecombat.com/") the forum
|
||||||
|
// | and discuss your strategies, your triumphs, and your turmoils.
|
||||||
|
|
||||||
div#columns.row
|
div#columns.row
|
||||||
div.column.col-md-2
|
div.column.col-md-2
|
||||||
for team in teams
|
for team in teams
|
||||||
|
|
14
app/views/CareersView.coffee
Normal file
14
app/views/CareersView.coffee
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
RootView = require 'views/core/RootView'
|
||||||
|
template = require 'templates/careers'
|
||||||
|
|
||||||
|
module.exports = class CareersView extends RootView
|
||||||
|
id: 'careers-view'
|
||||||
|
template: template
|
||||||
|
|
||||||
|
constructor: (options, @position) ->
|
||||||
|
super options
|
||||||
|
|
||||||
|
getRenderData: ->
|
||||||
|
context = super()
|
||||||
|
context.position = @position
|
||||||
|
context
|
|
@ -51,7 +51,6 @@ module.exports = class ClanDetailsView extends RootView
|
||||||
@clan = new Clan _id: @clanID
|
@clan = new Clan _id: @clanID
|
||||||
@members = new CocoCollection([], { url: "/db/clan/#{@clanID}/members", model: User, comparator: 'nameLower' })
|
@members = new CocoCollection([], { url: "/db/clan/#{@clanID}/members", model: User, comparator: 'nameLower' })
|
||||||
@memberAchievements = new CocoCollection([], { url: "/db/clan/#{@clanID}/member_achievements", model: EarnedAchievement, comparator:'_id' })
|
@memberAchievements = new CocoCollection([], { url: "/db/clan/#{@clanID}/member_achievements", model: EarnedAchievement, comparator:'_id' })
|
||||||
# MemberSessions: only loads creatorName, levelName, codeLanguage, submittedCodeLanguage for each session
|
|
||||||
@memberSessions = new CocoCollection([], { url: "/db/clan/#{@clanID}/member_sessions", model: LevelSession, comparator:'_id' })
|
@memberSessions = new CocoCollection([], { url: "/db/clan/#{@clanID}/member_sessions", model: LevelSession, comparator:'_id' })
|
||||||
|
|
||||||
@listenTo me, 'sync', => @render?()
|
@listenTo me, 'sync', => @render?()
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
RootView = require 'views/core/RootView'
|
Campaign = require 'models/Campaign'
|
||||||
template = require 'templates/courses/course-details'
|
|
||||||
CocoCollection = require 'collections/CocoCollection'
|
CocoCollection = require 'collections/CocoCollection'
|
||||||
Course = require 'models/Course'
|
Course = require 'models/Course'
|
||||||
CourseInstance = require 'models/CourseInstance'
|
CourseInstance = require 'models/CourseInstance'
|
||||||
|
LevelSession = require 'models/LevelSession'
|
||||||
|
RootView = require 'views/core/RootView'
|
||||||
|
template = require 'templates/courses/course-details'
|
||||||
|
User = require 'models/User'
|
||||||
|
utils = require 'core/utils'
|
||||||
|
|
||||||
# TODO: logged out experience
|
# TODO: logged out experience
|
||||||
# TODO: no course instances
|
# TODO: no course instances
|
||||||
|
@ -12,27 +16,186 @@ module.exports = class CourseDetailsView extends RootView
|
||||||
id: 'course-details-view'
|
id: 'course-details-view'
|
||||||
template: template
|
template: template
|
||||||
|
|
||||||
|
events:
|
||||||
|
'change .progress-expand-checkbox': 'onCheckExpandedProgress'
|
||||||
|
'click .btn-play-level': 'onClickPlayLevel'
|
||||||
|
'click .btn-save-settings': 'onClickSaveSettings'
|
||||||
|
'click .progress-member-header': 'onClickMemberHeader'
|
||||||
|
'click .progress-header': 'onClickProgressHeader'
|
||||||
|
'mouseenter .progress-level-cell': 'onMouseEnterPoint'
|
||||||
|
'mouseleave .progress-level-cell': 'onMouseLeavePoint'
|
||||||
|
|
||||||
constructor: (options, @courseID) ->
|
constructor: (options, @courseID) ->
|
||||||
super options
|
super options
|
||||||
@courseInstanceID = options.courseInstanceID
|
@courseInstanceID = utils.getQueryVariable('ciid', false) or options.courseInstanceID
|
||||||
|
@adminMode = me.isAdmin()
|
||||||
|
@memberSort = 'nameAsc'
|
||||||
|
unless me.isAnonymous()
|
||||||
@course = new Course _id: @courseID
|
@course = new Course _id: @courseID
|
||||||
|
@listenTo @course, 'sync', @onCourseSync
|
||||||
@supermodel.loadModel @course, 'course', cache: false
|
@supermodel.loadModel @course, 'course', cache: false
|
||||||
if @courseInstanceID
|
|
||||||
@courseInstance = new CourseInstance _id: @courseInstanceID
|
|
||||||
@supermodel.loadModel @courseInstance, 'course_instance', cache: false
|
|
||||||
else if !me.isAnonymous()
|
|
||||||
@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.course = @course
|
context.adminMode = @adminMode ? false
|
||||||
context.courseInstance = @courseInstance
|
context.campaign = @campaign
|
||||||
|
context.conceptsCompleted = @conceptsCompleted ? {}
|
||||||
|
context.course = @course if @course?.loaded
|
||||||
|
context.courseInstance = @courseInstance if @courseInstance?.loaded
|
||||||
|
context.levelConceptMap = @levelConceptMap ? {}
|
||||||
|
context.memberSort = @memberSort
|
||||||
|
context.memberUserMap = @memberUserMap ? {}
|
||||||
|
context.showExpandedProgress = @showExpandedProgress
|
||||||
|
context.sortedMembers = @sortedMembers ? []
|
||||||
|
context.userConceptStateMap = @userConceptStateMap ? {}
|
||||||
|
context.userLevelStateMap = @userLevelStateMap ? {}
|
||||||
context
|
context
|
||||||
|
|
||||||
onCourseInstancesLoaded: ->
|
onCourseSync: ->
|
||||||
|
# console.log 'onCourseSync'
|
||||||
|
return if @campaign?
|
||||||
|
@campaign = new Campaign _id: @course.get('campaignID')
|
||||||
|
@listenTo @campaign, 'sync', @onCampaignSync
|
||||||
|
@supermodel.loadModel @campaign, 'campaign', cache: false
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onCampaignSync: ->
|
||||||
|
# console.log 'onCampaignSync'
|
||||||
|
if @courseInstanceID
|
||||||
|
@loadCourseInstance(@courseInstanceID)
|
||||||
|
else if !me.isAnonymous()
|
||||||
|
@courseInstances = new CocoCollection([], { url: "/db/user/#{me.id}/course_instances", model: CourseInstance})
|
||||||
|
@listenToOnce @courseInstances, 'sync', @onCourseInstancesSync
|
||||||
|
@supermodel.loadCollection(@courseInstances, 'course_instances')
|
||||||
|
@levelConceptMap = {}
|
||||||
|
for levelID, level of @campaign.get('levels')
|
||||||
|
@levelConceptMap[levelID] ?= {}
|
||||||
|
for concept in level.concepts
|
||||||
|
@levelConceptMap[levelID][concept] = true
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
loadCourseInstance: (courseInstanceID) ->
|
||||||
|
# console.log 'loadCourseInstance'
|
||||||
|
return if @courseInstance?
|
||||||
|
@courseInstance = new CourseInstance _id: courseInstanceID
|
||||||
|
@listenTo @courseInstance, 'sync', @onCourseInstanceSync
|
||||||
|
@supermodel.loadModel @courseInstance, 'course_instance', cache: false
|
||||||
|
|
||||||
|
onCourseInstancesSync: ->
|
||||||
|
# console.log 'onCourseInstancesSync'
|
||||||
if @courseInstances.models.length is 1
|
if @courseInstances.models.length is 1
|
||||||
@courseInstance = @courseInstances.models[0]
|
@loadCourseInstance(@courseInstances.models[0].id)
|
||||||
else if @courseInstances.models.length > 0
|
else if @courseInstances.models.length > 0
|
||||||
@courseInstance = @courseInstances.models[0]
|
@loadCourseInstance(@courseInstances.models[0].id)
|
||||||
|
|
||||||
|
onCourseInstanceSync: ->
|
||||||
|
console.log 'onCourseInstanceSync', @courseInstance.get('description')
|
||||||
|
@adminMode = true if @courseInstance.get('ownerID') is me.id
|
||||||
|
@levelSessions = new CocoCollection([], { url: "/db/course_instance/#{@courseInstance.id}/level_sessions", model: LevelSession, comparator:'_id' })
|
||||||
|
@listenToOnce @levelSessions, 'sync', @onLevelSessionsSync
|
||||||
|
@supermodel.loadCollection @levelSessions, 'level_sessions', cache: false
|
||||||
|
@members = new CocoCollection([], { url: "/db/course_instance/#{@courseInstance.id}/members", model: User, comparator: 'nameLower' })
|
||||||
|
@listenToOnce @members, 'sync', @onMembersSync
|
||||||
|
@supermodel.loadCollection @members, 'members', cache: false
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onLevelSessionsSync: ->
|
||||||
|
# console.log 'onLevelSessionsSync'
|
||||||
|
@userConceptStateMap = {}
|
||||||
|
@userLevelStateMap = {}
|
||||||
|
for levelSession in @levelSessions.models
|
||||||
|
userID = levelSession.get('creator')
|
||||||
|
levelID = levelSession.get('level').original
|
||||||
|
@userConceptStateMap[userID] ?= {}
|
||||||
|
@userLevelStateMap[userID] ?= {}
|
||||||
|
state = if levelSession.get('state')?.complete then 'complete' else 'started'
|
||||||
|
@userLevelStateMap[userID][levelID] = state
|
||||||
|
for concept of @levelConceptMap[levelID]
|
||||||
|
@userConceptStateMap[userID][concept] = state
|
||||||
|
@conceptsCompleted = {}
|
||||||
|
for userID, conceptStateMap of @userConceptStateMap
|
||||||
|
for concept, state of conceptStateMap
|
||||||
|
@conceptsCompleted[concept] ?= 0
|
||||||
|
@conceptsCompleted[concept]++
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onMembersSync: ->
|
||||||
|
# console.log 'onMembersSync'
|
||||||
|
@memberUserMap = {}
|
||||||
|
for user in @members.models
|
||||||
|
@memberUserMap[user.id] = user
|
||||||
|
@sortMembers()
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onCheckExpandedProgress: (e) ->
|
||||||
|
@showExpandedProgress = $('.progress-expand-checkbox').prop('checked')
|
||||||
|
# TODO: why does render reset the checkbox to be unchecked?
|
||||||
|
@render?()
|
||||||
|
$('.progress-expand-checkbox').attr('checked', @showExpandedProgress)
|
||||||
|
|
||||||
|
onClickMemberHeader: (e) ->
|
||||||
|
@memberSort = if @memberSort is 'nameAsc' then 'nameDesc' else 'nameAsc'
|
||||||
|
@sortMembers()
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onClickProgressHeader: (e) ->
|
||||||
|
@memberSort = if @memberSort is 'progressAsc' then 'progressDesc' else 'progressAsc'
|
||||||
|
@sortMembers()
|
||||||
|
@render?()
|
||||||
|
|
||||||
|
onClickPlayLevel: (e) ->
|
||||||
|
levelSlug = $(e.target).data('level-slug')
|
||||||
|
Backbone.Mediator.publish 'router:navigate', {
|
||||||
|
route: "/play/level/#{levelSlug}"
|
||||||
|
viewClass: 'views/play/level/PlayLevelView'
|
||||||
|
viewArgs: [{}, levelSlug]
|
||||||
|
}
|
||||||
|
|
||||||
|
onClickSaveSettings: (e) ->
|
||||||
|
return unless @courseInstance
|
||||||
|
if name = $('.settings-name-input').val()
|
||||||
|
@courseInstance.set('name', name)
|
||||||
|
description = $('.settings-description-input').val()
|
||||||
|
console.log 'onClickSaveSettings', description
|
||||||
|
@courseInstance.set('description', description)
|
||||||
|
@courseInstance.patch()
|
||||||
|
$('#settingsModal').modal('hide')
|
||||||
|
|
||||||
|
onMouseEnterPoint: (e) ->
|
||||||
|
$('.level-popup-container').hide()
|
||||||
|
container = $(e.target).find('.level-popup-container').show()
|
||||||
|
margin = 20
|
||||||
|
offset = $(e.target).offset()
|
||||||
|
scrollTop = $('#page-container').scrollTop()
|
||||||
|
height = container.outerHeight()
|
||||||
|
container.css('left', offset.left + e.offsetX)
|
||||||
|
container.css('top', offset.top + scrollTop - height - margin)
|
||||||
|
|
||||||
|
onMouseLeavePoint: (e) ->
|
||||||
|
$(e.target).find('.level-popup-container').hide()
|
||||||
|
|
||||||
|
sortMembers: ->
|
||||||
|
# Progress sort precedence: most completed concepts, most started concepts, most levels, name sort
|
||||||
|
return unless @campaign and @courseInstance and @memberUserMap
|
||||||
|
@sortedMembers = @courseInstance.get('members')
|
||||||
|
switch @memberSort
|
||||||
|
when "nameDesc"
|
||||||
|
@sortedMembers.sort (a, b) => @memberUserMap[b]?.get('name').localeCompare(@memberUserMap[a]?.get('name'))
|
||||||
|
when "progressAsc"
|
||||||
|
@sortedMembers.sort (a, b) =>
|
||||||
|
for levelID, level of @campaign.get('levels')
|
||||||
|
if @userLevelStateMap[a][levelID] isnt 'complete' and @userLevelStateMap[b][levelID] is 'complete'
|
||||||
|
return -1
|
||||||
|
else if @userLevelStateMap[a][levelID] is 'complete' and @userLevelStateMap[b][levelID] isnt 'complete'
|
||||||
|
return 1
|
||||||
|
0
|
||||||
|
when "progressDesc"
|
||||||
|
@sortedMembers.sort (a, b) =>
|
||||||
|
for levelID, level of @campaign.get('levels')
|
||||||
|
if @userLevelStateMap[a][levelID] isnt 'complete' and @userLevelStateMap[b][levelID] is 'complete'
|
||||||
|
return 1
|
||||||
|
else if @userLevelStateMap[a][levelID] is 'complete' and @userLevelStateMap[b][levelID] isnt 'complete'
|
||||||
|
return -1
|
||||||
|
0
|
||||||
|
else
|
||||||
|
@sortedMembers.sort (a, b) => @memberUserMap[a]?.get('name').localeCompare(@memberUserMap[b]?.get('name'))
|
||||||
|
|
|
@ -66,9 +66,9 @@ module.exports = class LadderView extends RootView
|
||||||
ctx.leagueType = @leagueType
|
ctx.leagueType = @leagueType
|
||||||
ctx.league = @league
|
ctx.league = @league
|
||||||
ctx._ = _
|
ctx._ = _
|
||||||
if tournamentEndDate = {greed: 1402444800000, 'criss-cross': 1410912000000, 'zero-sum': 1428364800000}[@levelID]
|
if tournamentEndDate = {greed: 1402444800000, 'criss-cross': 1410912000000, 'zero-sum': 1428364800000, 'ace-of-coders': 1444867200000}[@levelID]
|
||||||
ctx.tournamentTimeLeft = moment(new Date(tournamentEndDate)).fromNow()
|
ctx.tournamentTimeLeft = moment(new Date(tournamentEndDate)).fromNow()
|
||||||
if tournamentStartDate = {'zero-sum': 1427472000000}[@levelID]
|
if tournamentStartDate = {'zero-sum': 1427472000000, 'ace-of-coders': 1442417400000}[@levelID]
|
||||||
ctx.tournamentTimeElapsed = moment(new Date(tournamentStartDate)).fromNow()
|
ctx.tournamentTimeElapsed = moment(new Date(tournamentStartDate)).fromNow()
|
||||||
ctx.winners = require('./tournament_results')[@levelID]
|
ctx.winners = require('./tournament_results')[@levelID]
|
||||||
ctx
|
ctx
|
||||||
|
|
|
@ -3,7 +3,11 @@ Handler = require '../commons/Handler'
|
||||||
{getCoursesPrice} = require '../../app/core/utils'
|
{getCoursesPrice} = require '../../app/core/utils'
|
||||||
Course = require './Course'
|
Course = require './Course'
|
||||||
CourseInstance = require './CourseInstance'
|
CourseInstance = require './CourseInstance'
|
||||||
|
LevelSession = require '../levels/sessions/LevelSession'
|
||||||
|
LevelSessionHandler = require '../levels/sessions/level_session_handler'
|
||||||
Prepaid = require '../prepaids/Prepaid'
|
Prepaid = require '../prepaids/Prepaid'
|
||||||
|
User = require '../users/User'
|
||||||
|
UserHandler = require '../users/user_handler'
|
||||||
|
|
||||||
CourseInstanceHandler = class CourseInstanceHandler extends Handler
|
CourseInstanceHandler = class CourseInstanceHandler extends Handler
|
||||||
modelClass: CourseInstance
|
modelClass: CourseInstance
|
||||||
|
@ -14,15 +18,18 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
|
||||||
console.warn "Course error: #{user.get('slug')} (#{user._id}): '#{msg}'"
|
console.warn "Course error: #{user.get('slug')} (#{user._id}): '#{msg}'"
|
||||||
|
|
||||||
hasAccess: (req) ->
|
hasAccess: (req) ->
|
||||||
req.method is 'GET' or req.user?.isAdmin()
|
req.method in @allowedMethods or req.user?.isAdmin()
|
||||||
|
|
||||||
hasAccessToDocument: (req, document, method=null) ->
|
hasAccessToDocument: (req, document, method=null) ->
|
||||||
return true if _.find document?.get('members'), (a) -> a.equals(req.user?.get('_id'))
|
return true if document?.get('ownerID')?.equals(req.user?.get('_id'))
|
||||||
|
return true if req.method is 'GET' and _.find document?.get('members'), (a) -> a.equals(req.user?.get('_id'))
|
||||||
req.user?.isAdmin()
|
req.user?.isAdmin()
|
||||||
|
|
||||||
getByRelationship: (req, res, args...) ->
|
getByRelationship: (req, res, args...) ->
|
||||||
relationship = args[1]
|
relationship = args[1]
|
||||||
return @createAPI(req, res) if relationship is 'create'
|
return @createAPI(req, res) if relationship is 'create'
|
||||||
|
return @getLevelSessionsAPI(req, res, args[0]) if args[1] is 'level_sessions'
|
||||||
|
return @getMembersAPI(req, res, args[0]) if args[1] is 'members'
|
||||||
super arguments...
|
super arguments...
|
||||||
|
|
||||||
createAPI: (req, res) ->
|
createAPI: (req, res) ->
|
||||||
|
@ -94,5 +101,24 @@ CourseInstanceHandler = class CourseInstanceHandler extends Handler
|
||||||
Course.find {}, (err, documents) =>
|
Course.find {}, (err, documents) =>
|
||||||
done(err, documents)
|
done(err, documents)
|
||||||
|
|
||||||
|
getLevelSessionsAPI: (req, res, courseInstanceID) ->
|
||||||
|
CourseInstance.findById courseInstanceID, (err, courseInstance) =>
|
||||||
|
return @sendDatabaseError(res, err) if err
|
||||||
|
return @sendNotFoundError(res) unless courseInstance
|
||||||
|
memberIDs = _.map courseInstance.get('members') ? [], (memberID) -> memberID.toHexString?() or memberID
|
||||||
|
LevelSession.find {creator: {$in: memberIDs}}, (err, documents) =>
|
||||||
|
return @sendDatabaseError(res, err) if err?
|
||||||
|
cleandocs = (LevelSessionHandler.formatEntity(req, doc) for doc in documents)
|
||||||
|
@sendSuccess(res, cleandocs)
|
||||||
|
|
||||||
|
getMembersAPI: (req, res, courseInstanceID) ->
|
||||||
|
CourseInstance.findById courseInstanceID, (err, courseInstance) =>
|
||||||
|
return @sendDatabaseError(res, err) if err
|
||||||
|
return @sendNotFoundError(res) unless courseInstance
|
||||||
|
memberIDs = courseInstance.get('members') ? []
|
||||||
|
User.find {_id: {$in: memberIDs}}, (err, users) =>
|
||||||
|
return @sendDatabaseError(res, err) if err
|
||||||
|
cleandocs = (UserHandler.formatEntity(req, doc) for doc in users)
|
||||||
|
@sendSuccess(res, cleandocs)
|
||||||
|
|
||||||
module.exports = new CourseInstanceHandler()
|
module.exports = new CourseInstanceHandler()
|
||||||
|
|
|
@ -200,7 +200,6 @@ UserSchema.statics.unconflictName = unconflictName = (name, done) ->
|
||||||
|
|
||||||
UserSchema.methods.register = (done) ->
|
UserSchema.methods.register = (done) ->
|
||||||
@set('anonymous', false)
|
@set('anonymous', false)
|
||||||
@set('permissions', ['admin']) if not isProduction and not GLOBAL.testing
|
|
||||||
if (name = @get 'name')? and name isnt ''
|
if (name = @get 'name')? and name isnt ''
|
||||||
unconflictName name, (err, uniqueName) =>
|
unconflictName name, (err, uniqueName) =>
|
||||||
return done err if err
|
return done err if err
|
||||||
|
|
Loading…
Reference in a new issue