Merge remote-tracking branch 'origin/master' into production

This commit is contained in:
Rob 2016-04-13 15:18:32 -07:00
commit 7d8024616a
125 changed files with 2398 additions and 1814 deletions

View file

@ -312,6 +312,7 @@ self.setupDebugWorldToRunUntilFrame = function (args) {
self.debugWorld = new World(args.userCodeMap);
self.debugWorld.levelSessionIDs = args.levelSessionIDs;
self.debugWorld.submissionCount = args.submissionCount;
self.debugWorld.fixedSeed = args.fixedSeed;
self.debugWorld.flagHistory = args.flagHistory;
self.debugWorld.difficulty = args.difficulty;
if (args.level)
@ -373,6 +374,7 @@ self.runWorld = function runWorld(args) {
self.world = new World(args.userCodeMap);
self.world.levelSessionIDs = args.levelSessionIDs;
self.world.submissionCount = args.submissionCount;
self.world.fixedSeed = args.fixedSeed;
self.world.flagHistory = args.flagHistory || [];
self.world.difficulty = args.difficulty || 0;
if(args.level)
@ -412,15 +414,17 @@ self.onWorldLoaded = function onWorldLoaded() {
self.goalManager.worldGenerationEnded();
var goalStates = self.goalManager.getGoalStates();
var overallStatus = self.goalManager.checkOverallStatus();
if(self.world.ended)
self.postMessage({type: 'end-load-frames', goalStates: goalStates, overallStatus: overallStatus});
var totalFrames = self.world.totalFrames;
if(self.world.ended) {
var lastFrameHash = self.world.frames[totalFrames - 2].hash
self.postMessage({type: 'end-load-frames', goalStates: goalStates, overallStatus: overallStatus, totalFrames: totalFrames, lastFrameHash: lastFrameHash});
}
var t1 = new Date();
var diff = t1 - self.t0;
if(self.world.headless)
return console.log('Headless simulation completed in ' + diff + 'ms.');
var worldEnded = self.world.ended;
var totalFrames = self.world.totalFrames;
var transferableSupported = self.transferableSupported();
try {
var serialized = self.world.serialize();

View file

@ -1,6 +1,6 @@
go = (path, options) -> -> @routeDirectly path, arguments, options
redirect = (path) -> -> @navigate(path, { trigger: true, replace: true })
module.exports = class CocoRouter extends Backbone.Router
initialize: ->
@ -87,6 +87,8 @@ module.exports = class CocoRouter extends Backbone.Router
'editor/poll': go('editor/poll/PollSearchView')
'editor/poll/:articleID': go('editor/poll/PollEditView')
'editor/thang-tasks': go('editor/ThangTasksView')
'editor/verifier': go('editor/verifier/VerifierView')
'editor/verifier/:levelID': go('editor/verifier/VerifierView')
'file/*path': 'routeToServer'
@ -156,7 +158,7 @@ module.exports = class CocoRouter extends Backbone.Router
return @routeDirectly('teachers/RestrictedToTeachersView')
if options.studentsOnly and me.isTeacher()
return @routeDirectly('courses/RestrictedToStudentsView')
path = 'play/CampaignView' if window.serverConfig.picoCTF and not /^(views)?\/?play/.test(path)
path = "views/#{path}" if not _.string.startsWith(path, 'views/')
ViewClass = @tryToLoadModule path
@ -210,7 +212,7 @@ module.exports = class CocoRouter extends Backbone.Router
application.facebookHandler.renderButtons()
application.gplusHandler.renderButtons()
twttr?.widgets?.load?()
activateTab: ->
base = _.string.words(document.location.pathname[1..], '/')[0]
$("ul.nav li.#{base}").addClass('active')

View file

@ -82,7 +82,7 @@ module.exports = class Angel extends CocoClass
clearTimeout @condemnTimeout
when 'end-load-frames'
clearTimeout @condemnTimeout
@beholdGoalStates event.data.goalStates, event.data.overallStatus # Work ends here if we're headless.
@beholdGoalStates event.data.goalStates, event.data.overallStatus, false, event.data.totalFrames, event.data.lastFrameHash # Work ends here if we're headless.
when 'end-preload-frames'
clearTimeout @condemnTimeout
@beholdGoalStates event.data.goalStates, event.data.overallStatus, true
@ -125,10 +125,13 @@ module.exports = class Angel extends CocoClass
else
@log 'Received unsupported message:', event.data
beholdGoalStates: (goalStates, overallStatus, preload=false) ->
beholdGoalStates: (goalStates, overallStatus, preload=false, totalFrames=undefined, lastFrameHash=undefined) ->
return if @aborting
Backbone.Mediator.publish 'god:goals-calculated', goalStates: goalStates, preload: preload, overallStatus: overallStatus, god: @shared.god
@shared.god.trigger 'goals-calculated', goalStates: goalStates, preload: preload, overallStatus: overallStatus
event = goalStates: goalStates, preload: preload, overallStatus: overallStatus, god: @shared.god
event.totalFrames = totalFrames if totalFrames?
event.lastFrameHash = lastFrameHash if lastFrameHash?
Backbone.Mediator.publish 'god:goals-calculated', event
@shared.god.trigger 'goals-calculated', event
@finishWork() if @shared.headless
beholdWorld: (serialized, goalStates, startFrame, endFrame, streamingWorld) ->
@ -274,15 +277,16 @@ module.exports = class Angel extends CocoClass
simulateSync: (work) =>
console?.profile? "World Generation #{(Math.random() * 1000).toFixed(0)}" if imitateIE9?
work.t0 = now()
work.testWorld = testWorld = new World work.userCodeMap
work.testWorld.levelSessionIDs = work.levelSessionIDs
work.testWorld.submissionCount = work.submissionCount
work.testWorld.flagHistory = work.flagHistory ? []
work.testWorld.difficulty = work.difficulty
testWorld.loadFromLevel work.level
work.testWorld.preloading = work.preload
work.testWorld.headless = work.headless
work.testWorld.realTime = work.realTime
work.world = testWorld = new World work.userCodeMap
work.world.levelSessionIDs = work.levelSessionIDs
work.world.submissionCount = work.submissionCount
work.world.fixedSeed = work.fixedSeed
work.world.flagHistory = work.flagHistory ? []
work.world.difficulty = work.difficulty
work.world.loadFromLevel work.level
work.world.preloading = work.preload
work.world.headless = work.headless
work.world.realTime = work.realTime
if @shared.goalManager
testGM = new GoalManager(testWorld)
testGM.setGoals work.goals
@ -295,8 +299,13 @@ module.exports = class Angel extends CocoClass
# If performance was really a priority in IE9, we would rework things to be able to skip this step.
goalStates = testGM?.getGoalStates()
work.testWorld.goalManager.worldGenerationEnded() if work.testWorld.ended
serialized = testWorld.serialize()
work.world.goalManager.worldGenerationEnded() if work.world.ended
if work.headless
@beholdGoalStates goalStates, testGM.checkOverallStatus(), false, work.world.totalFrames, work.world.frames[work.world.totalFrames - 2]?.hash
return
serialized = world.serialize()
window.BOX2D_ENABLED = false
World.deserialize serialized.serializedWorld, @shared.worldClassMap, @shared.lastSerializedWorldFrames, @finishBeholdingWorld(goalStates), serialized.startFrame, serialized.endFrame, work.level
window.BOX2D_ENABLED = true
@ -304,14 +313,14 @@ module.exports = class Angel extends CocoClass
doSimulateWorld: (work) ->
work.t1 = now()
Math.random = work.testWorld.rand.randf # so user code is predictable
Math.random = work.world.rand.randf # so user code is predictable
Aether.replaceBuiltin('Math', Math)
replacedLoDash = _.runInContext(window)
_[key] = replacedLoDash[key] for key, val of replacedLoDash
i = 0
while i < work.testWorld.totalFrames
frame = work.testWorld.getFrame i++
while i < work.world.totalFrames
frame = work.world.getFrame i++
Backbone.Mediator.publish 'god:world-load-progress-changed', progress: 1, god: @shared.god
work.testWorld.ended = true
system.finish work.testWorld.thangs for system in work.testWorld.systems
work.world.ended = true
system.finish work.world.thangs for system in work.world.systems
work.t2 = now()

View file

@ -64,6 +64,7 @@ module.exports = class God extends CocoClass
onTomeCast: (e) ->
return unless e.god is @
@lastSubmissionCount = e.submissionCount
@lastFixedSeed = e.fixedSeed
@lastFlagHistory = (flag for flag in e.flagHistory when flag.source isnt 'code')
@lastDifficulty = e.difficulty
@createWorld e.spells, e.preload, e.realTime
@ -94,6 +95,7 @@ module.exports = class God extends CocoClass
level: @level
levelSessionIDs: @levelSessionIDs
submissionCount: @lastSubmissionCount
fixedSeed: @lastFixedSeed
flagHistory: @lastFlagHistory
difficulty: @lastDifficulty
goals: @angelsShare.goalManager?.getGoals()
@ -126,6 +128,7 @@ module.exports = class God extends CocoClass
level: @level
levelSessionIDs: @levelSessionIDs
submissionCount: @lastSubmissionCount
fixedSeed: @fixedSeed
flagHistory: @lastFlagHistory
difficulty: @lastDifficulty
goals: @goalManager?.getGoals()

View file

@ -247,6 +247,7 @@ module.exports = class LevelBus extends Bus
return if _.isEmpty @changedSessionProperties
# don't let peeking admins mess with the session accidentally
return unless @session.get('multiplayer') or @session.get('creator') is me.id
return if @session.fake
Backbone.Mediator.publish 'level:session-will-save', session: @session
patch = {}
patch[prop] = @session.get(prop) for prop of @changedSessionProperties

View file

@ -33,6 +33,7 @@ module.exports = class LevelLoader extends CocoClass
@team = options.team
@headless = options.headless
@sessionless = options.sessionless
@fakeSessionConfig = options.fakeSessionConfig
@spectateMode = options.spectateMode ? false
@observing = options.observing
@courseID = options.courseID
@ -68,11 +69,46 @@ module.exports = class LevelLoader extends CocoClass
@supermodel.addRequestResource(url: '/picoctf/problems', success: (picoCTFProblems) =>
@level?.picoCTFProblem = _.find picoCTFProblems, pid: @level.get('picoCTFProblem')
).load()
@loadSession() unless @sessionless
if @sessionless
null
else if @fakeSessionConfig?
@loadFakeSession()
else
@loadSession()
@populateLevel()
# Session Loading
loadFakeSession: ->
if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
@sessionDependenciesRegistered = {}
initVals =
level:
original: @level.get('original')
majorVersion: @level.get('version').major
creator: me.id
state:
complete: false
scripts: {}
permissions: [
{target: me.id, access: 'owner'}
{target: 'public', access: 'write'}
]
codeLanguage: @fakeSessionConfig.codeLanguage or me.get('aceConfig')?.language or 'python'
_id: 'A Fake Session ID'
@session = new LevelSession initVals
@session.loaded = true
@fakeSessionConfig.callback? @session, @level
# TODO: set the team if we need to, for multiplayer
# TODO: just finish the part where we make the submit button do what is right when we are fake
# TODO: anything else to make teacher session-less play make sense when we are fake
# TODO: make sure we are not actually calling extra save/patch/put things throwing warnings because we know we are fake and so we shouldn't try to do that
for method in ['save', 'patch', 'put']
@session[method] = -> console.error "We shouldn't be doing a session.#{method}, since it's a fake session."
@session.fake = true
@loadDependenciesForSession @session
loadSession: ->
if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop']
@sessionDependenciesRegistered = {}
@ -171,7 +207,7 @@ module.exports = class LevelLoader extends CocoClass
browser['platform'] = $.browser.platform if $.browser.platform
browser['version'] = $.browser.version if $.browser.version
session.set 'browser', browser
session.patch()
session.patch() unless session.fake
consolidateFlagHistory: ->
state = @session.get('state') ? {}
@ -341,7 +377,7 @@ module.exports = class LevelLoader extends CocoClass
resource.markLoaded() if resource.spriteSheetKeys.length is 0
denormalizeSession: ->
return if @headless or @sessionDenormalized or @spectateMode or @sessionless
return if @headless or @sessionDenormalized or @spectateMode or @sessionless or me.isTeacher()
# This is a way (the way?) PUT /db/level.sessions/undefined was happening
# See commit c242317d9
return if not @session.id

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "العربية", englishDescription: "Arabi
# completed_level: "Completed Level:"
# course: "Course:"
done: "انتهاء"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "български език", englishDescri
# completed_level: "Completed Level:"
# course: "Course:"
done: "Готово"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "На главната" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Català", englishDescription: "Catalan", tr
completed_level: "Nivell completat:"
course: "Curs:"
done: "Fet"
next_level: "Següent nivell:"
next_level: "Següent nivell"
next_game: "Següent joc"
show_menu: "Mostrar menú del joc"
home: "Inici" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "čeština", englishDescription: "Czech", tr
# completed_level: "Completed Level:"
# course: "Course:"
done: "Hotovo"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Domů" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "dansk", englishDescription: "Danish", trans
# completed_level: "Completed Level:"
# course: "Course:"
done: "Færdig"
# next_level: "Next Level:"
# next_level: "Next Level"
next_game: "Næste spil"
show_menu: "Vis spil menu"
home: "Hjem" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Deutsch (Österreich)", englishDescription:
# completed_level: "Completed Level:"
# course: "Course:"
done: "Fertig"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Startseite" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Dütsch (Schwiiz)", englishDescription: "Ge
# completed_level: "Completed Level:"
# course: "Course:"
done: "Fertig"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Deutsch (Deutschland)", englishDescription:
completed_level: "Abgeschlossene Level:"
course: "Kurse:"
done: "Fertig"
next_level: "Nächster Level:"
next_level: "Nächster Level"
next_game: "Nächstes Spiel"
show_menu: "Menü anzeigen"
home: "Startseite" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Ελληνικά", englishDescription: "Gre
completed_level: "Ολοκληρωμένο Επίπεδο:"
course: "Μάθημα:"
done: "Έτοιμο"
next_level: "Επομένο Επίπεδο:"
next_level: "Επομένο Επίπεδο"
next_game: "Επόμενο παιχνίδι"
show_menu: "Εμφάνιση μενού παιχνιδιού"
home: "Αρχική" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "English (UK)", englishDescription: "English
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "English (US)", englishDescription: "English
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -335,10 +335,11 @@
years: "years"
play_level:
level_complete: "Level Complete"
completed_level: "Completed Level:"
course: "Course:"
done: "Done"
next_level: "Next Level:"
next_level: "Next Level"
next_game: "Next game"
show_menu: "Show game menu"
home: "Home" # Not used any more, will be removed soon.
@ -378,6 +379,7 @@
victory_new_item: "New Item"
victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
victory_become_a_viking: "Become a Viking"
victory_no_progress_for_teachers: "Progress is not saved for teachers. But, you can add a student account to your classroom for yourself."
guide_title: "Guide"
tome_cast_button_run: "Run"
tome_cast_button_running: "Running"
@ -1798,4 +1800,4 @@
one_month_coupon: "coupon: choose either Rails or HTML"
one_month_discount: "discount, 30% off: choose either Rails or HTML"
license: "license"
oreilly: "ebook of your choice"
oreilly: "ebook of your choice"

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Esperanto", englishDescription: "Esperanto"
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Español (América Latina)", englishDescrip
completed_level: "Nivel Completado:"
course: "Curso:"
done: "Listo"
next_level: "Siguiente Nivel:"
next_level: "Siguiente Nivel"
next_game: "Siguiente juego"
show_menu: "Mostrar menú de juego"
home: "Inicio" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
# completed_level: "Completed Level:"
# course: "Course:"
done: "Hecho"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Inicio" # Not used any more, will be removed soon.
@ -1506,14 +1506,14 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
loading_error:
could_not_load: "Error al cargar desde el servidor."
connection_failure: "Fallo en la conexión."
# connection_failure_desc: "It doesnt look like youre connected to the internet! Check your network connection and then reload this page."
# login_required: "Login Required"
# login_required_desc: "You need to be logged in to access this page."
connection_failure_desc: "No parece que estés conectado a Internet! Comprueba tu conexión de red y vuelva a cargar esta página."
login_required: "Necesario iniciar sesión"
login_required_desc: "Tiene que estar registrado para acceder a esta página."
unauthorized: "Tienes que haber iniciado sesión. ¿No permites la instalación de cookies?"
forbidden: "No tienes autorización."
# forbidden_desc: "Oh no, theres nothing we can show you here! Make sure youre logged into the correct account, or visit one of the links below to get back to programming!"
forbidden_desc: "Oh, no, no hay nada que le podemos mostrar aquí! Asegúrese de que está conectado a la cuenta correcta, o visita uno de los enlaces siguientes para volver a la programación!"
not_found: "No encontrado."
# not_found_desc: "Hm, theres nothing here. Visit one of the following links to get back to programming!"
not_found_desc: "Hm, no hay nada aquí. Visita uno de los siguientes enlaces para volver a la programación!"
not_allowed: "Método no permitido."
timeout: "Tiempo de espera del servidor superado." # {change}
conflict: "Conflicto de recursos."
@ -1521,7 +1521,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
server_error: "Error del servidor."
unknown: "Error desconocido." # {change}
error: "ERROR"
# general_desc: "Something went wrong, and its probably our fault. Try waiting a bit and then refreshing the page, or visit one of the following links to get back to programming!"
general_desc: "Algo salió mal, y es probable que sea nuestra culpa. Espera un poco y luego actualiza la página, o visita uno de los siguientes enlaces para volver a la programación!"
resources:
level: "Nivel"
@ -1542,16 +1542,16 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
arrays: "Vectores"
basic_syntax: "Sintáxis básica"
boolean_logic: "Lógica booleanos"
# break_statements: "Break Statements"
break_statements: "Sentencias Break"
classes: "Clases"
# continue_statements: "Continue Statements"
continue_statements: "Sentencias Continue"
for_loops: "Bucles For"
functions: "Funciones"
graphics: "Gráficos"
# if_statements: "If Statements"
# input_handling: "Input Handling"
if_statements: "Sentencias if"
input_handling: "Manejo de entradas"
math_operations: "Operaciones matemáticas"
# object_literals: "Object Literals"
object_literals: "Objetos literales"
parameters: "Parámetros"
strings: "Cadenas"
variables: "Variables"
@ -1598,7 +1598,7 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
email_settings_url: "tus ajustes de correo electrónico"
email_description_suffix: "o a través de los enlaces en los correos que te enviemos, puedes cambiar tus preferencias y darte de baja fácilmente en cualquier momento."
cost_title: "Precio"
# cost_description: "CodeCombat is free to play for all of its core levels, with a ${{price}} USD/mo subscription for access to extra level branches and {{gems}} bonus gems per month. You can cancel with a click, and we offer a 100% money-back guarantee."
cost_description: "CodeCombat es un juego gratuito para todos sus niveles básicos, con una suscripción de ${{price}} USD al mes con acceso a niveles adicionales y un bonus de {{gems}} gemas al mes. Puedes cancelar con un clic, y ofrecemos una garantía de reembolso del 100%."
copyrights_title: "Copyrights y Licencias"
contributor_title: "Acuerdo de Licencia del Colaborador"
contributor_description_prefix: "Todas las colaboraciones, tanto en la web como en nuestro repositorio de GitHub, están sujetas a nuestro"
@ -1633,8 +1633,8 @@ module.exports = nativeDescription: "español (ES)", englishDescription: "Spanis
nutshell_title: "En una palabra"
nutshell_description: "Todos los recursos que ofrecemos en el editor de niveles son libres de ser utilizados para crear niveles. Pero nos reservamos el derecho de restringir la distribución de los propios niveles (que se crean en codecombat.com) de modo que se pueda cobrar por ellos en el futuro, si eso es lo que termina sucediendo."
canonical: "La versión inglesa de este documento es la canónica, la definitiva. Si hay alguna diferencia con lo que pueda aparecer en las traducciones, la versión inglesa es la que prevalece sobre las demás."
# third_party_title: "Third Party Services"
# third_party_description: "CodeCombat uses the following third party services (among others):"
third_party_title: "Servicios de terceros"
third_party_description: "CodeCombat utiliza los siguientes servicios de terceros (entre otros):"
ladder_prizes:
title: "Premios del Torneo" # This section was for an old tournament and doesn't need new translations now.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Eesti", englishDescription: "Estonian", tra
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "فارسی", englishDescription: "Persian",
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "suomi", englishDescription: "Finnish", tran
completed_level: "Suoritit tason:"
course: "Kurssi:"
done: "Valmis"
next_level: "Seuraava taso:"
next_level: "Seuraava taso"
next_game: "Seuraava peli"
show_menu: "Näytä pelivalikko"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
completed_level: "Niveau terminé:"
course: "Cours:"
done: "Fait"
next_level: "Niveau Suivant:"
next_level: "Niveau Suivant"
next_game: "Prochain jeu"
show_menu: "Afficher le menu"
home: "Accueil" # Not used any more, will be removed soon.
@ -388,7 +388,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
tip_scrub_shortcut: "Ctrl+[ and Ctrl+] : rembobinage et avance rapide." # {change}
tip_guide_exists: "Cliquez sur le guide en haut de la page pour des informations utiles."
tip_open_source: "CodeCombat est 100% open source !"
tip_tell_friends: "Vous aimez CodeCombat? Parlez de nous à vos amis!"
tip_tell_friends: "Vous aimez CodeCombat? Parlez de nous à vos amis !"
tip_beta_launch: "La beta de CodeCombat a été lancée en Octobre 2013"
tip_think_solution: "Reflechissez à propos de la solution et non du problème."
tip_theory_practice: "En théorie, il n'y a pas de différence entre la théorie et la pratique. Mais en pratique, il y en a. - Yogi Berra"
@ -908,7 +908,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
leave_clan: "Partir du clan"
join_clan: "Rejoindre le clan"
invite_1: "Inviter:"
invite_2: "*Inviter des joueurs au Caln en leur envoyant le lien suivant."
invite_2: "*Inviter des joueurs au Clan en leur envoyant le lien suivant."
members: "Membres"
progress: "Progression"
not_started_1: "Non commencé"
@ -960,8 +960,8 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
average_time: "Temps moyen de jeu par niveau:"
total_time: "Temps total de jeu:"
average_levels: "Nombre de niveaux moyen complétés:"
total_levels: "Total de niveaux complétés:"
furthest_level: "Meilleur niveau complété:"
total_levels: "Total de niveaux complétés :"
furthest_level: "Meilleur niveau complété :"
concepts_covered: "Conceptes Couverts"
students: "Elèves"
students1: "éleves"
@ -995,7 +995,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
creating_for: "Vous créez une classe pour"
for: "pour" # Like in 'for 30 students'
# receive_code: "Afterwards you will receive an unlock code to distribute to your students, which they can use to enroll in your class."
free_trial: "Essai gratuit pour les professeurs!"
free_trial: "Essai gratuit pour les professeurs !"
get_access: "pour obtenir un accès individuel à tous les cours pour évaluation."
questions: "Questions?"
teachers_click: "Professeurs, Clickez Ici"
@ -1005,7 +1005,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
more_in_less: "Apprenez plus en moins de temps"
no_experience: "Aucune expérience en développement requise"
easy_monitor: "Suivez facilement la progression des élèves"
purchase_for_class: "Achetez un cours pour votre classe. C'est très simple de rajouter vos élèves!"
purchase_for_class: "Achetez un cours pour votre classe. C'est très simple de rajouter vos élèves !"
# see_the: "See the"
more_info: "pour plus d'informations."
choose_course: "Choisissez votre cours:"
@ -1016,13 +1016,13 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
enter: "Entrer"
or: "Ou"
topics: "Sujets"
hours_content: "Heures de contenu:"
hours_content: "Heures de contenu :"
get_free: "Obtenez des cours GRATUITS"
enroll_paid: "Inscrire des élèves aux cours payants"
you_have1: "Vous avez"
you_have2: "inscriptions payantes non utilisées"
use_one: "Utilisez 1 inscription payante pour"
use_multiple: "Utilisez des inscriptions payantes pour les élèves suivants:"
use_multiple: "Utilisez des inscriptions payantes pour les élèves suivants :"
already_enrolled: "déjà inscrit"
licenses_remaining: "licenses restantes:"
insufficient_enrollments: "inscriptions payantes insuffisantes"
@ -1038,7 +1038,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
back_classrooms: "Retour à mes classes"
back_courses: "Retour à mes cours"
edit_details: "Modifier les informations de la classe"
enrolled_courses: "inscrit aux cours payants:"
enrolled_courses: "inscrit aux cours payants :"
purchase_enrollments: "Acheter des inscriptions"
remove_student: "enlever l'élève"
assign: "Assigner"
@ -1048,42 +1048,42 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
none: "Aucun"
save: "Sauvegarder"
play_campaign_title: "Jouer la Campagne"
play_campaign_description: "Vous êtes prêts pour la prochaine étape! Explorez des centaines de niveaux stimulants, apprenez al programmation avancée, et rivalisez avec d'autres dans les arènes multijoueurs!"
play_campaign_description: "Vous êtes prêts pour la prochaine étape ! Explorez des centaines de niveaux stimulants, apprenez al programmation avancée, et rivalisez avec d'autres dans les arènes multijoueurs !"
create_account_title: "Créer un compte"
create_account_description: "Inscrivez-vous GRATUITEMENT à CodeCombat et accédez à plus de niveaux, plus de compétences de programmation et plus de fun!"
create_account_description: "Inscrivez-vous GRATUITEMENT à CodeCombat et accédez à plus de niveaux, plus de compétences de programmation et plus de fun !"
preview_campaign_title: "Campagne de démonstration"
preview_campaign_description: "Ayez un aperçu de tout ce dont CodeCombat a à offrir avant de s'enregistrer GRATUITEMENT."
arena: "Arène"
arena_soon_title: "L'Arene arrive prochainement"
arena_soon_description: "Nous travaillons sur une arene multijoueur pour les classes à la fin de"
arena_soon_title: "L'Arène arrive prochainement"
arena_soon_description: "Nous travaillons sur une arène multijoueur pour les classes à la fin de"
not_enrolled1: "Non inscrit"
not_enrolled2: "Demandez à votre professeur de vous inscrire au cours suivant."
next_course: "Cours suivant"
coming_soon1: "Prochainement"
coming_soon2: "Nous travaillons dur pour faire plus de nouveaux cours!"
coming_soon2: "Nous travaillons dur pour faire plus de nouveaux cours !"
available_levels: "Niveaux disponibles"
welcome_to_courses: "Aventurier, bienvenu dans les leçons!"
ready_to_play: "Prêt à jouer?"
welcome_to_courses: "Aventurier, bienvenu dans les leçons !"
ready_to_play: "Prêt à jouer ?"
start_new_game: "Nouvelle Partie"
play_now_learn_header: "Jouer pour apprendre"
play_now_learn_1: "la syntaxe basique pour controller votre personnage"
play_now_learn_2: "les boucles while pour résoudre des problèmes complexes"
play_now_learn_3: "des chaines de caractères & des variables pour personnaliser des actions"
play_now_learn_4: "comment battre un ogre (compétence importante dans la vie!)"
welcome_to_page: "Bienvenu sur la page des Cours!"
play_now_learn_4: "comment battre un ogre (compétence importante dans la vie !)"
welcome_to_page: "Bienvenu sur la page des Cours !"
# completed_hoc: "Amazing! You've completed the Hour of Code course!"
ready_for_more_header: "Motivé pour plus? Jouez au mode campagne!"
ready_for_more_1: "Utilisez des gemmes pour débloquer de nouveaux acessoires!"
ready_for_more_header: "Motivé pour plus ? Jouez au mode campagne !"
ready_for_more_1: "Utilisez des gemmes pour débloquer de nouveaux acessoires !"
ready_for_more_2: "Jouez à travers de nouveaux mondes et challenges"
ready_for_more_3: "Apprenez encore plus de programmation!"
ready_for_more_3: "Apprenez encore plus de programmation !"
saved_games: "Parties enregistrées"
hoc: "Heures de Code"
my_classes: "Mes Classes"
class_added: "Classe ajoutée avec succès!"
class_added: "Classe ajoutée avec succès !"
view_class: "voir la classe"
view_levels: "voir les niveaux"
join_class: "Rejoindre une classe"
ask_teacher_for_code: "Demandez à votre professeur si vous avez un code de classe CodeComabt! Si c'est le cas, veuillez l'entrer ci-dessous:"
ask_teacher_for_code: "Demandez à votre professeur si vous avez un code de classe CodeCombat ! Si c'est le cas, veuillez l'entrer ci-dessous :"
enter_c_code: "<Entrer le Code de la Classe>"
join: "Rejoindre"
joining: "En train de rejoindre la classe"
@ -1092,32 +1092,32 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
start: "Démarrer"
last_level: "Dernier Niveau"
# welcome_to_hoc: "Adventurers, welcome to our Hour of Code!"
logged_in_as: "Connecté en tant que:"
not_you: "Pas vous?"
welcome_back: "Salut aventurier, content de te revoir!"
logged_in_as: "Connecté en tant que :"
not_you: "Pas vous ?"
welcome_back: "Salut aventurier, content de te revoir !"
continue_playing: "Continuer à Jouer"
more_options: "Plus d'options:"
option1_header: "Option 1: Inviter les élèves par email"
option1_header: "Option 1 : Inviter les élèves par email"
option1_body: "Les élèves recevront automatiquement une invitation à rejoindre cette classe, et devront créer un compte avec un nom d'utilisateur et mot de passe."
option2_header: "Option 2: Envoyez l'URL à vos élèves"
option2_header: "Option 2 : Envoyez l'URL à vos élèves"
option2_body: "Il sera demandé aux élèves de saisir une adresse email, un nom d'utilisateur et un mot de passe pour créer un compte."
option3_header: "Option 3: Dirigez les élèves sur codecombat.com/courses"
option3_header: "Option 3 : Dirigez les élèves sur codecombat.com/courses"
option3_body: "Donnez aux élèves le code suivant à spécifier avec une adresse email, un nom d'utilisateur, et un mot de passe lors de la création de compte."
thank_you_pref: "Merci pour votre achat! Vous pouvez maintenant assigner"
thank_you_pref: "Merci pour votre achat ! Vous pouvez maintenant assigner"
thank_you_suff: "plus d'élèves à des cours payants."
return_to_class: "Retourner à la classe"
return_to_course_man: "Retourn à la gestion des cours."
students_not_enrolled: "élève non inscrits"
total_all_classes: "Total Dans Toutes Les Classes"
how_many_enrollments: "De combien d'inscriptions payantes supplémentaire avez-vous besoin?"
each_student_access: "Chaque élève dans une classe aura accès aux cours 2 à 4 une fois qu'ils sont inscrits dans les cours payants. Vous pouvez assignez chaque cours à chacun des élèves individuellement."
return_to_course_man: "Retourner à la gestion des cours."
students_not_enrolled: "élèves non inscrits"
total_all_classes: "Total dans toutes les classes"
how_many_enrollments: "De combien d'inscriptions payantes supplémentaires avez-vous besoin ?"
each_student_access: "Chaque élève dans une classe aura accès aux cours 2 à 4 une fois qu'il sera inscrit dans les cours payants. Vous pouvez assignez chaque cours à chacun des élèves individuellement."
purchase_now: "Achetez Maintenant"
enrollments: "inscriptions"
remove_student1: "Supprimer l'Elève"
are_you_sure: "Etes-vous certain de vouloir supprimer cet élève de cette classe?"
remove_student1: "Supprimer l'élève"
are_you_sure: "Êtes-vous certain de vouloir supprimer cet élève de cette classe ?"
remove_description1: "L'élève n'aura plus accès à cette classe et les classes associées. L'évolution et les personnages ne seront pas supprimés, et l'élève pourra de nouveau rejoindre la classe n'importe quand."
remove_description2: "Une licence payante activée ne sera pas remboursée."
keep_student: "Conserver l'Elève"
keep_student: "Conserver l'élève"
removing_user: "Suppression de l'utilisateur"
to_join_ask: "Pour rejoindre une classe, veuillez demander un code de déverouillage à votre professeur."
join_this_class: "Rejoindre cette classe"
@ -1130,10 +1130,10 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
unique_name: "un nom unique que personne n'a choisi"
pick_something: "choisissez quelque chose dont vous pourrez vous souvenir"
class_code: "Code de la Classe"
optional_ask: "facultatif - demandez à votre professeur de vous en donner un!"
optional_ask: "facultatif - demandez à votre professeur de vous en donner un !"
optional_school: "facultatif - à quelle école allez-vous?"
start_playing: "Commencer à Jouer"
skip_this: "Ignorer cette étape, je créSkip this, I'll create an account later!"
skip_this: "Ignorer cette étape, je créerai un compte ultérieurement !"
welcome: "Bienvenu"
getting_started: "Démarrer les cours"
download_getting_started: "Télécharger le guide de démarrage [PDF]"
@ -1158,13 +1158,13 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
# educator_wiki_mid: "educator wiki"
# educator_wiki_suff: "to browse the guide online."
your_classes: "Vos Classes"
no_classes: "Aucune classe pour le moment!"
no_classes: "Aucune classe pour le moment !"
create_new_class1: "créer une nouvelle classe"
available_courses: "Cours Disponibles"
unused_enrollments: "Inscriptions non utilisées disponibles:"
unused_enrollments: "Inscriptions non utilisées disponibles :"
students_access: "Tous les élèves peuvent accéder gratuitement à l'Introduction aux Sciences Informations. Une inscription par élève est nécessaire pour rejoindre les cours payants de CodeCombat. Une seule inscription est nécessaire par élève pour accéder à tous les cours payants."
active_courses: "cours actifs"
no_students: "Aucun élève pour le moment!"
no_students: "Aucun élève pour le moment !"
add_students1: "ajouter des élèves"
view_edit: "voir/modifier"
students_enrolled: "élèves inscrits"
@ -1237,7 +1237,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
config_thang: "Double-cliquez pour configurer un Thang"
delete: "Supprimer"
duplicate: "Dupliquer"
stop_duplicate: "Arreter la duplication"
stop_duplicate: "Arrêter la duplication"
rotate: "Pivoter"
level_settings_title: "Paramètres"
level_component_tab_title: "Composants actuels"
@ -1366,7 +1366,7 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
games_simulated_by: "Parties que vous avez simulées :"
games_simulated_for: "Parties simulées pour vous :"
games_in_queue: "Parties actuellement en attente :"
games_simulated: "Partie simulée"
games_simulated: "Parties simulées"
games_played: "Parties jouées"
ratio: "Moyenne"
leaderboard: "Classement"
@ -1475,11 +1475,11 @@ module.exports = nativeDescription: "français", englishDescription: "French", t
amount: "Montant (Dollars US)"
declined: "Votre carte a été refusée"
invalid_amount: "Entrez un montant en dollars US."
not_logged_in: "Connectez vous ou créez un compte pour accéder aux factures."
not_logged_in: "Connectez-vous ou créez un compte pour accéder aux factures."
pay: "Paiement de facture"
purchasing: "Achat..."
retrying: "Erreur interne, réessayez"
success: "Paiement accepté, Merci !"
success: "Paiement accepté, merci !"
# account_prepaid:
# purchase_code: "Purchase a Subscription Code"

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Galego", englishDescription: "Galician", tr
# completed_level: "Completed Level:"
# course: "Course:"
done: "Feito"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Inicio" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "עברית", englishDescription: "Hebrew",
completed_level: "שלב שהושלם:"
course: "מסלול:"
done: "סיים"
next_level: "השלב הבא:"
next_level: "השלב הבא"
next_game: "המשחק הבא"
show_menu: "הצג תפריט משחק"
home: "בית" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "मानक हिन्दी", englishDe
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -6,8 +6,8 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
play: "Játssz!" # The big play button that opens up the campaign view.
play_campaign_version: "Játssz a kampányban!" # Shows up under big play button if you only play /courses
old_browser: "Hohó, a böngésződ már túl régi ahhoz, hogy a CodeCombat futhasson rajta. Bocsi!" # Warning that shows up on really old Firefox/Chrome/Safari
old_browser_suffix: "Megpróbálhatod éppen, da valószínűleg nem fog működni.."
ipad_browser: "Rossz hír. CodeCombat nem fut iPadon böngészőben. Jó hír: a hivatalos iPad applikációnk csak az Apple jóváhagyására vár."
old_browser_suffix: "Megpróbálhatod éppen, de valószínűleg nem fog működni.."
ipad_browser: "Rossz hír. A CodeCombat nem fut iPadon böngészőben. Jó hír: a hivatalos iPad applikációnk csak az Apple jóváhagyására vár."
campaign: "Kampány"
for_beginners: "Kezdőknek"
multiplayer: "Többjátékos" # Not currently shown on home page
@ -25,30 +25,30 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
im_a_student: "Diák vagyok"
learn_more: "Tudj meg többet"
classroom_in_a_box: "Egy mindent-egyben megoldás programozás tanításra."
codecombat_is: "CodeCombat a diákoknak egy olyan platform, melyben programozni tanulnak, miközben egy igazi játékot játszanak." # {change}
codecombat_is: "A CodeCombat a diákoknak egy olyan platform, melyben programozni tanulnak, miközben egy igazi játékot játszanak." # {change}
our_courses: "Kurzusaink osztálytermi keretek közötti oktatásra kiválóan alkalmasak, akár informatikában kevésbé jártas tanárok számára is." # {change}
# top_screenshots_hint: "Students write code and see their changes update in real-time"
designed_with: "Tanárok igényeihez tervezve"
real_code: "Valódi, beírandó kódolás"
from_the_first_level: "az első pályától kezdve"
getting_students: "A szintaxis és a helyes struktúrák elsajátításához kritikus, hogy a kód írást rögtön az elején kezdjenek a tanulók."
getting_students: "A szintaxis és a helyes struktúrák elsajátításához kritikus fontosságú, hogy a kódírást rögtön az elején elkezdjék a tanulók."
educator_resources: "Oktatási segédanyagok"
course_guides: "és kurzus útmutatók"
teaching_computer_science: "Programozás oktatása nem igényel drága képesítést, mivel számos eszközzel segítjük az eltérő felkészültségű tanárokat."
teaching_computer_science: "A programozás oktatása nem igényel drága képesítést, mivel számos eszközzel segítjük az eltérő felkészültségű tanárokat."
accessible_to: "Hozzáférhető"
everyone: "mindenki számára"
democratizing: "A programozni tanulás demokratizálása filozófiánk lényege. Mindenki számára hozzáférhetővé kell tenni kódolni tanulást."
democratizing: "A programozni tanulás demokratizálása filozófiánk lényege. Mindenki számára hozzáférhetővé kell tenni ezt az ismeretanyagot."
forgot_learning: "Azt hiszem teljesen megfeledkeztek róla, hogy valójában tanulnak valamit."
wanted_to_do: "Mindig is szerettem volna kódolni, de sosem gondoltam volna, hogy a suliban megtanulhatom."
why_games: "Miért fontos játékokon keresztül tanulni?"
games_reward: "A játékok jutalmazzák a kreatív erőfeszítést."
encourage: "A játék olyan közeg, ami elősegíti az interakciót, a kezdeményezést, és a kísérletezést. Egy jó játék kihívása, hogy idővel egyre jobbak legyünk bizonyos képességekben. Ez ugyanaz a kritikus folyamat, melyen a tanulás során megyünk keresztül."
encourage: "A játék olyan közeg, ami elősegíti az interakciót, a kezdeményezést, és a kísérletezést. Egy jó játék ösztönzi a játékost,hogy idővel egyre jobb legyen bizonyos képességekben. Ez ugyanaz a fontos folyamat, melyen a tanulás során megyünk keresztül."
excel: "A játékok kiválóan jutalmazzák az"
struggle: "alkotó erőfeszítést"
kind_of_struggle: "azt a fajta erőfeszítést, ami olyan tanuláshoz vezet, ami"
motivating: "magával ragadó"
not_tedious: "nem egyhangú."
gaming_is_good: "Kutatások azt sejtetik, hogy a játék jótékony a fejlődő agynak. (Bizony!)"
gaming_is_good: "Kutatások alapján valószínű, hogy a játék jó hatással van a fejlődő agyra. (Bizony!)"
game_based: "A játék-alapú tanító rendszereket"
compared: "összevetve"
conventional: "a hagyományos kiértékelő módszerekkel világos különbséget kapunk: a játékok jobban segítenek a tudás rögzítésében, koncentrálásban és"
@ -315,7 +315,7 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
completed_level: "Teljesített pálya:"
course: "Kurzus:"
done: "Kész"
next_level: "Következő pálya:"
next_level: "Következő pálya"
next_game: "Következő játék"
show_menu: "Játék Menü"
home: "Kezdőlap" # Not used any more, will be removed soon.

View file

@ -375,7 +375,7 @@ module.exports = nativeDescription: "Bahasa Indonesia", englishDescription: "Ind
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
completed_level: "Livello completato:"
course: "Corso:"
done: "Fatto"
next_level: "Prossimo livello:"
next_level: "Prossimo livello"
next_game: "Prossimo gioco"
show_menu: "Visualizza menu gioco"
home: "Pagina iniziale" # Not used any more, will be removed soon.
@ -434,7 +434,7 @@ module.exports = nativeDescription: "Italiano", englishDescription: "Italian", t
tip_strong_opponents: "Anche il più tenace degli avversari ha sempre una debolezza. - Itachi Uchiha"
tip_paper_and_pen: "Prima di iniziare a programmare, puoi sempre progettare con un foglio di carta e una penna."
tip_solve_then_write: "Prima, risolvi il problema. Poi, scrivi il codice. - John Johnson"
# tip_compiler_ignores_comments: "Sometimes I think that the compiler ignores my comments."
tip_compiler_ignores_comments: "A volte penso che il compilatore ignori i miei commenti"
# tip_understand_recursion: "The only way to understand recursion is to understand recursion."
# tip_life_and_polymorphism: "Open Source is like a totally polymorphic heterogeneous structure: All types are welcome."
# tip_mistakes_proof_of_trying: "Mistakes in your code are just proof that you are trying."

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "日本語", englishDescription: "Japanese",
completed_level: "コンプリートレベル:"
course: "コース:"
done: "完了"
next_level: "次のレベル:"
next_level: "次のレベル"
next_game: "次のゲーム"
show_menu: "ゲームメニューを見る"
home: "ホーム" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "한국어", englishDescription: "Korean", t
completed_level: "완료된 레벨:"
course: "코스:"
done: "완료"
next_level: "다음 레벨:"
next_level: "다음 레벨"
next_game: "다음 게임"
show_menu: "게임 매뉴 보이기"
home: "" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "lietuvių kalba", englishDescription: "Lith
completed_level: "Įveiktas Lygis:"
course: "Kursas:"
done: "Gerai"
next_level: "Kitas Lygis:"
next_level: "Kitas Lygis"
next_game: "Kitas žaidimas"
show_menu: "Parodyti žaidimo meniu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Македонски", englishDescription:
# completed_level: "Completed Level:"
# course: "Course:"
done: "Готово"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Дома" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Bahasa Melayu", englishDescription: "Bahasa
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "မြန်မာစကား", englishDes
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Norsk Bokmål", englishDescription: "Norweg
# completed_level: "Completed Level:"
# course: "Course:"
done: "Ferdig"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Hjem" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Nederlands (België)", englishDescription:
completed_level: "Voltooid Level:"
course: "Les:"
done: "Klaar"
next_level: "Volgende Level:"
next_level: "Volgende Level"
next_game: "Volgend spel"
show_menu: "Geef spelmenu weer"
home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Nederlands (Nederland)", englishDescription
completed_level: "Voltooid Level:"
course: "Les:"
done: "Klaar"
next_level: "Volgende Level:"
next_level: "Volgende Level"
next_game: "Volgende spel"
show_menu: "Geef spelmenu weer"
home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Norsk Nynorsk", englishDescription: "Norweg
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "polski", englishDescription: "Polish", tran
completed_level: "Ukończony poziom:"
course: "Kurs:"
done: "Zrobione"
next_level: "Następny poziom:"
next_level: "Następny poziom"
next_game: "Następna gra"
show_menu: "Pokaż menu gry"
home: "Strona główna" # Not used any more, will be removed soon.

View file

@ -14,31 +14,31 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
for_developers: "Para Desenvolvedores" # Not currently shown on home page.
or_ipad: "Ou baixe para iPad"
# new_home:
# slogan: "The most engaging game for learning programming."
new_home:
slogan: "O game mais envolvente para aprender programação."
# classroom_edition: "Classroom Edition:"
# learn_to_code: "Learn to code:"
# teacher: "Teacher"
# student: "Student"
# play_now: "Play Now"
# im_a_teacher: "I'm a Teacher"
# im_a_student: "I'm a Student"
# learn_more: "Learn more"
# classroom_in_a_box: "A classroom in-a-box for teaching computer science."
learn_to_code: "Aprenda a programar:"
teacher: "Professor"
student: "Aluno"
play_now: "Jogue Agora"
im_a_teacher: "Eu sou um professor(a)"
im_a_student: "Eu sou um Aluno"
learn_more: "Aprenda mais"
classroom_in_a_box: "Uma sala de aula in-a-box para o ensino de ciência da computação."
# codecombat_is: "CodeCombat is a platform <strong>for students</strong> to learn computer science while playing through a real game."
# our_courses: "Our courses have been specifically playtested to <strong>excel in the classroom</strong>, even by teachers with little to no prior programming experience."
# top_screenshots_hint: "Students write code and see their changes update in real-time"
# designed_with: "Designed with teachers in mind"
top_screenshots_hint: "Alunos escrevem seus códigos e veem suas mudanças em tempo real."
designed_with: "Desenhado com professores em mente"
# real_code: "Real, typed code"
# from_the_first_level: "from the first level"
from_the_first_level: "do primeiro nível"
# getting_students: "Getting students to typed code as quickly as possible is critical to learning programming syntax and proper structure."
# educator_resources: "Educator resources"
# course_guides: "and course guides"
educator_resources: "Recursos do educador"
course_guides: "e guia dos cursos"
# teaching_computer_science: "Teaching computer science does not require a costly degree, because we provide tools to support educators of all backgrounds."
# accessible_to: "Accessible to"
# everyone: "everyone"
# democratizing: "Democratizing the process of learning coding is at the core of our philosophy. Everyone should be able to learn to code."
# forgot_learning: "I think they actually forgot that they were actually learning something."
accessible_to: "Acessível à"
everyone: "todos"
democratizing: "Democratizar o processo de aprendizagem de codificação é o objectivo da nossa filosofia. Qualquer um deve ser capaz de aprender a programar."
forgot_learning: "Eu acho que eles na realidade esqueceram que eles estão na realidade aprendendo alguma coisa."
# wanted_to_do: " Coding is something I've always wanted to do, and I never thought I would be able to learn it in school."
# why_games: "Why is learning through games important?"
# games_reward: "Games reward the productive struggle."
@ -46,11 +46,11 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# excel: "Games excel at rewarding"
# struggle: "productive struggle"
# kind_of_struggle: "the kind of struggle that results in learning thats engaging and"
# motivating: "motivating"
motivating: "motivador"
# not_tedious: "not tedious."
# gaming_is_good: "Studies suggest gaming is good for childrens brains. (its true!)"
gaming_is_good: "Estudos indicam que jogos são bons para o cérebro das crianças. (é verdade!)"
# game_based: "When game-based learning systems are"
# compared: "compared"
compared: "comparado"
# conventional: "against conventional assessment methods, the difference is clear: games are better at helping students retain knowledge, concentrate and"
# perform_at_higher_level: "perform at a higher level of achievement"
# feedback: "Games also provide real-time feedback that allows students to adjust their solution path and understand concepts more holistically, instead of being limited to just “correct” or “incorrect” answers."
@ -67,17 +67,17 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# request_demo: "Request a Demo"
# create_a_class: "Create a Class"
# setup_a_class: "Set Up a Class"
# have_an_account: "Have an account?"
# log_in: "Log In"
# logged_in_as: "You are currently logged in as"
have_an_account: "Tem uma conta?"
log_in: "Entrar"
logged_in_as: "Você está logado como"
# view_my_classes: "View my classes"
# computer_science: "Computer science courses for all ages"
# show_me_lesson_time: "Show me lesson time estimates for:"
# curriculum: "Total curriculum hours:"
# ffa: "Free for all students"
ffa: "Gratuito para todos os estudantes"
# lesson_time: "Lesson time:"
# coming_soon: "Coming soon!"
# courses_available_in: "Courses are available in JavaScript, Python, and Java (coming soon!)"
coming_soon: "Em breve!"
courses_available_in: "Os cursos estão disponíveis em JavaScript, Python e Java (em breve!)"
# boast: "Boasts riddles that are complex enough to fascinate gamers and coders alike."
# winning: "A winning combination of RPG gameplay and programming homework that pulls off making kid-friendly education legitimately enjoyable."
# run_class: "Everything you need to run a computer science class in your school today, no CS background required."
@ -101,22 +101,22 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
twitter_follow: "Seguir"
teachers: "Professores"
careers: "Carreiras"
# facebook: "Facebook"
# twitter: "Twitter"
facebook: "Facebook"
twitter: "Twitter"
# create_a_class: "Create a Class"
# other: "Other"
# learn_to_code: "Learn to Code!"
# toggle_nav: "Toggle navigation"
# jobs: "Jobs"
# schools: "Schools"
other: "Outro"
learn_to_code: "Aprenda a programar!"
toggle_nav: "Alternar navegação"
jobs: "Empregos"
schools: "Escolas"
# educator_wiki: "Educator Wiki"
# request_quote: "Request a Quote"
# get_involved: "Get Involved"
# open_source: "Open source (GitHub)"
# support: "Support"
# faqs: "FAQs"
# help_pref: "Need help? Email"
# help_suff: "and we'll get in touch!"
get_involved: "Involva-se"
open_source: "Código aberto (GitHub)"
support: "Suporte"
faqs: "FAQs"
help_pref: "Precisa de ajuda? Email"
help_suff: "e nós entraremos em contato!"
modal:
close: "Fechar"
@ -200,14 +200,14 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
school_name: "Nome da Escola e da cidade"
optional: "Opcional"
school_name_placeholder: "Escola de exemplo, Cotia, SP"
# or_sign_up_with: "or sign up with"
# connected_gplus_header: "You've successfully connected with Google+!"
# connected_gplus_p: "Finish signing up so you can log in with your Google+ account."
# gplus_exists: "You already have an account associated with Google+!"
# connected_facebook_header: "You've successfully connected with Facebook!"
# connected_facebook_p: "Finish signing up so you can log in with your Facebook account."
# facebook_exists: "You already have an account associated with Facebook!"
# hey_students: "Students, enter the class code from your teacher."
or_sign_up_with: "ou inscreva-se com"
connected_gplus_header: "Você se conectou com sucesso ao Google+!"
connected_gplus_p: "Conclua sua inscrição para que você possa fazer login com sua conta do Google+."
gplus_exists: "Você já tem uma conta associada com o Google+!"
connected_facebook_header: "Você se conectou com sucesso ao Facebook!"
connected_facebook_p: "Conclua sua inscrição para que você possa fazer login com sua conta do Facebook."
facebook_exists: "Você já tem uma conta associada com o Facebook!"
hey_students: "Estudantes, insira o código de classe do seu professor."
recover:
recover_account_title: "Recuperar conta"
@ -315,7 +315,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
completed_level: "Nivel Completo:"
course: "Curso:"
done: "Pronto"
next_level: "Proximo Nivel:"
next_level: "Proximo Nivel"
next_game: "Próximo jogo"
show_menu: "Mostrar menu do jogo"
home: "Início" # Not used any more, will be removed soon.
@ -434,12 +434,12 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
tip_strong_opponents: "Mesmo o mais forte dos adversários tem sua fraqueza. - Itachi Uchiha"
tip_paper_and_pen: "Antes de começar a programar, você sempre deve planejar com papel e caneta."
tip_solve_then_write: "Primeiro, resolva o problema. Então, escreva o código. - John Johnson"
# tip_compiler_ignores_comments: "Sometimes I think that the compiler ignores my comments."
# tip_understand_recursion: "The only way to understand recursion is to understand recursion."
tip_compiler_ignores_comments: "Em alguns momentos acho que o compilador ignora meus comentários."
tip_understand_recursion: "A única maneira de entender a recursividade é entender recursão."
# tip_life_and_polymorphism: "Open Source is like a totally polymorphic heterogeneous structure: All types are welcome."
# tip_mistakes_proof_of_trying: "Mistakes in your code are just proof that you are trying."
tip_mistakes_proof_of_trying: "Erros no seu código apenas provam que você está tentando."
# tip_adding_orgres: "Rounding up ogres."
# tip_sharpening_swords: "Sharpening the swords."
tip_sharpening_swords: "Afiando as espadas."
# tip_ratatouille: "You must not let anyone define your limits because of where you come from. Your only limit is your soul. - Gusteau, Ratatouille"
# tip_nemo: "When life gets you down, want to know what you've gotta do? Just keep swimming, just keep swimming. - Dory, Finding Nemo"
# tip_internet_weather: "Just move to the internet, it's great here. We get to live inside where the weather is always awesome. - John Green"
@ -448,7 +448,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# tip_luna_lovegood: "Don't worry, you're just as sane as I am. - Luna Lovegood"
# tip_good_idea: "The best way to have a good idea is to have a lot of ideas. - Linus Pauling"
# tip_programming_not_about_computers: "Computer Science is no more about computers than astronomy is about telescopes. - Edsger Dijkstra"
# tip_mulan: "Believe you can, then you will. - Mulan"
tip_mulan: "Acredite que você pode, então você será. - Mulan"
game_menu:
inventory_tab: "Inventário"
@ -514,7 +514,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
feature5: "Vídeo tutorials"
feature6: "Suporte via e-mail Premium"
feature7: "<strong>Clãs</strong> Privados"
# feature8: "<strong>No ads!</strong>"
feature8: "<strong>Sem anúncios!</strong>"
free: "Grátis"
month: "mês"
must_be_logged: "Você deve estar logado primeiro. Por gentileza crie uma conta ou faça o log in no menu acima."
@ -646,18 +646,18 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
editor_config_behaviors_description: "Completar automaticamente colchetes, chaves e aspas."
about:
# main_title: "If you want to learn to program, you need to write (a lot of) code."
# main_description: "At CodeCombat, our job is to make sure you're doing that with a smile on your face."
# mission_link: "Mission"
# team_link: "Team"
# community_link: "Community"
# story_link: "Story"
# careers_link: "Careers"
# press_link: "Press"
# mission_title: "Our mission: make programming accessible to every student on Earth."
# mission_description_1: "<strong>Programming is magic</strong>. It's the ability to create things from pure imagination. We started CodeCombat to give learners the feeling of wizardly power at their fingertips by using <strong>typed code</strong>."
main_title: "Se você quer aprender a programar, você precisa escrever (bastante) código."
main_description: "No CodeCombat, nosso trabalho é assegurar que você está fazendo isso com um sorriso no rosto."
mission_link: "Missão"
team_link: "Time"
community_link: "Comunidade"
story_link: "História"
careers_link: "Carreiras"
press_link: "Pressione"
mission_title: "Nossa missão: fazer programação acessível para todos os estudantes."
mission_description_1: "<strong>Programação é mágica</strong>. É a habilidade de criar coisas apartir da pura imaginação. Criamos o CodeCombat para dar aos alunos a sensação de poder de um mago na ponta de seus dedos enquanto <strong>digita códigos</strong>."
# mission_description_2: "As it turns out, that enables them to learn faster too. WAY faster. It's like having a conversation instead of reading a manual. We want to bring that conversation to every school and to <strong>every student</strong>, because everyone should have the chance to learn the magic of programming."
# team_title: "Meet the CodeCombat team"
team_title: "Conheça o time do CodeCombat"
# team_values: "We value open and respectful dialog, where the best idea wins. Our decisions are grounded in customer research and our process is focused on delivering tangible results for them. Everyone is hands-on, from our CEO to our Github contributors, because we value growth and learning in our team."
nick_title: "Cofundador" # {change}
nick_blurb: "Guru Motivacional"
@ -673,7 +673,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
rob_blurb: "Os paranauês dos códigos"
josh_c_title: "Game Designer"
josh_c_blurb: "Desenha jogos"
# robin_title: "UX Design & Research"
robin_title: "UX Design & Pesquisa"
# robin_blurb: "Scaffolding"
josh_title: "Game Designer"
josh_blurb: "O chão vai tremer"
@ -709,23 +709,23 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# jobs_benefit_4: "Unlimited sick/personal days"
# jobs_benefit_5: "Professional development and continuing education support"
# jobs_benefit_6: "Medical/dental/vision insurance"
# learn_more: "Learn More"
# jobs_custom_title: "Create Your Own"
learn_more: "Aprenda Mais"
jobs_custom_title: "Crie seu próprio"
# jobs_custom_description: "Are you passionate about CodeCombat but don't see a job listed that matches your qualifications? Write us and show how you think you can contribute to our team. We'd love to hear from you!"
# jobs_custom_contact_1: "Send us a note at"
jobs_custom_contact_1: "Envie-nos uma nota em"
# jobs_custom_contact_2: "introducing yourself and we might get in touch in the future!"
# contact_title: "Press & Contact"
# contact_subtitle: "Need more information? Get in touch with us at"
# screenshots_title: "Game Screenshots"
# screenshots_hint: "(click to view full size)"
contact_subtitle: "Precisa de mais informações? Entre em contato conosco em"
screenshots_title: "Game Screenshots"
screenshots_hint: "(clique para ver em tamanho grande)"
# downloads_title: "Download Assets & Information"
# about_codecombat: "About CodeCombat"
about_codecombat: "Sobre CodeCombat"
# logo: "Logo"
# screenshots: "Screenshots"
screenshots: "Screenshots"
# character_art: "Character Art"
# download_all: "Download All"
# previous: "Previous"
# next: "Next"
download_all: "Baixar Tudo"
previous: "Anterior"
next: "Próximo"
# location_title: "We're located in downtown SF:"
teachers:
@ -737,24 +737,24 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
more_info_2: "fórum de professores"
more_info_3: "é um bom lugar para se conectar com ótimos educadores que utilizam o CodeCombat."
# teachers_quote:
teachers_quote:
# name: "Demo Form"
# title: "Request a Demo"
# subtitle: "Get your students started in less than an hour. You'll be able to <strong>create a class, add students, and monitor their progress</strong> as they learn computer science."
# email_exists: "User exists with this email."
# phone_number: "Phone number"
email_exists: "Existe um usuário com este email."
phone_number: "Número de telefone"
# phone_number_help: "Where can we reach you during the workday?"
# role_label: "Your role"
# role_help: "Select your primary role."
# tech_coordinator: "Technology coordinator"
# advisor: "Advisor"
# principal: "Principal"
# superintendent: "Superintendent"
advisor: "Orientador"
principal: "Principal"
superintendent: "Superintendente"
# parent: "Parent"
# organization_label: "Name of School/District"
# city: "City"
# state: "State"
# country: "Country"
organization_label: "Nome da escola/Distrito"
city: "Cidade"
state: "Estado"
country: "País"
# num_students_help: "How many do you anticipate enrolling in CodeCombat?"
# education_level_label: "Education Level of Students"
# education_level_help: "Choose as many as apply."
@ -877,7 +877,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
social_facebook: "Curta o CodeCombat no Facebook"
social_twitter: "Siga o CodeCombat no Twitter"
social_gplus: "Ingresse no CodeCombat no Google+"
# social_slack: "Chat with us in the public CodeCombat Slack channel"
social_slack: "Converse conosco usando o canal público Slack do CodeCombat"
contribute_to_the_project: "Contribuir para o projeto"
clans:
@ -889,7 +889,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
subs_only: "Apenas para assinantes"
create_clan: "Criar novo clã"
private_preview: "Visualizar"
# private_clans: "Private Clans"
private_clans: "Clãs Privados"
public_clans: "Clãs Públicos"
my_clans: "Meus Clãs"
clan_name: "Nome do Clã"
@ -995,31 +995,31 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
creating_for: "Você esta criando uma classe para"
for: "para" # Like in 'for 30 students'
# receive_code: "Afterwards you will receive an unlock code to distribute to your students, which they can use to enroll in your class."
# free_trial: "Free trial for teachers!"
free_trial: "Teste gratuito para professores!"
# get_access: "to get individual access to all courses for evalutaion purposes."
# questions: "Questions?"
# teachers_click: "Teachers Click Here"
# students_click: "Students Click Here"
# courses_on_coco: "Courses on CodeCombat"
questions: "Questões?"
teachers_click: "Professores cliquem aqui"
students_click: "Alunos cliquem aqui"
courses_on_coco: "Cursos no CodeCombat"
# designed_to: "Courses are designed to introduce computer science concepts using CodeCombat's fun and engaging environment. CodeCombat levels are organized around key topics to encourage progressive learning, over the course of 5 hours."
# more_in_less: "Learn more in less time"
more_in_less: "Aprenda mais em menos tempo"
# no_experience: "No coding experience necesssary"
# easy_monitor: "Easily monitor student progress"
# purchase_for_class: "Purchase a course for your entire class. It's easy to sign up your students!"
# see_the: "See the"
# more_info: "for more information."
# choose_course: "Choose Your Course:"
see_the: "Veja o"
more_info: "para mais informação."
choose_course: "Escolha seu Curso:"
# enter_code: "Enter an unlock code to join an existing class"
# enter_code1: "Enter unlock code"
enter_code1: "Insira o código de desbloqueio"
# enroll: "Enroll"
# pick_from_classes: "Pick from your current classes"
# enter: "Enter"
enter: "Entrar"
or: "Ou"
topics: "Tópicos"
hours_content: "Horas de conteúdo:"
get_free: "Obtenha um curso GRÁTIS"
# enroll_paid: "Enroll Students in Paid Courses"
# you_have1: "You have"
you_have1: "Você tem"
# you_have2: "unused paid enrollments"
# use_one: "Use 1 paid enrollment for"
# use_multiple: "Use paid enrollments for the following students:"
@ -1030,23 +1030,23 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# get_enrollments: "Get More Enrollments"
# change_language: "Change Course Language"
# keep_using: "Keep Using"
# switch_to: "Switch To"
# greetings: "Greetings!"
# learn_p: "Learn Python"
# learn_j: "Learn JavaScript"
switch_to: "Mudar para"
greetings: "Saudações!"
learn_p: "Aprenda Python"
learn_j: "Aprenda JavaScript"
# language_cannot_change: "Language cannot be changed once students join a class."
# back_classrooms: "Back to my classrooms"
# back_courses: "Back to my courses"
back_courses: "Voltar aos meus cursos"
# edit_details: "Edit class details"
# enrolled_courses: "enrolled in paid courses:"
# purchase_enrollments: "Purchase Enrollments"
# remove_student: "remove student"
remove_student: "remover aluno"
# assign: "Assign"
# to_assign: "to assign paid courses."
# teacher: "Teacher"
# complete: "Complete"
# none: "None"
# save: "Save"
teacher: "Professor"
complete: "Completo"
none: "Nenhum"
save: "Salvar"
# play_campaign_title: "Play the Campaign"
# play_campaign_description: "Youre ready to take the next step! Explore hundreds of challenging levels, learn advanced programming skills, and compete in multiplayer arenas!"
# create_account_title: "Create an Account"
@ -1054,54 +1054,54 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# preview_campaign_title: "Preview Campaign"
# preview_campaign_description: "Take a sneak peek at all that CodeCombat has to offer before signing up for your FREE account."
# arena: "Arena"
# arena_soon_title: "Arena Coming Soon"
arena_soon_title: "Arena Em breve"
# arena_soon_description: "We are working on a multiplayer arena for classrooms at the end of"
# not_enrolled1: "Not enrolled"
# not_enrolled2: "Ask your teacher to enroll you in the next course."
# next_course: "Next Course"
# coming_soon1: "Coming soon"
next_course: "Próximo Curso"
coming_soon1: "Em breve"
# coming_soon2: "We are hard at work making more courses for you!"
# available_levels: "Available Levels"
# welcome_to_courses: "Adventurers, welcome to Courses!"
# ready_to_play: "Ready to play?"
# start_new_game: "Start New Game"
# play_now_learn_header: "Play now to learn"
# play_now_learn_1: "basic syntax to control your character"
available_levels: "Fases disponíveis"
welcome_to_courses: "Aventureiros, bem vindos aos Cursos!"
ready_to_play: "Pronto para jogar?"
start_new_game: "Começar um novo jogo"
play_now_learn_header: "Jogue agora para aprender"
play_now_learn_1: "sintaxe básica para controlar seu personagem"
# play_now_learn_2: "while loops to solve pesky puzzles"
# play_now_learn_3: "strings & variables to customize actions"
# play_now_learn_4: "how to defeat an ogre (important life skills!)"
# welcome_to_page: "Welcome to your Courses page!"
# completed_hoc: "Amazing! You've completed the Hour of Code course!"
# ready_for_more_header: "Ready for more? Play the campaign mode!"
# ready_for_more_1: "Use gems to unlock new items!"
completed_hoc: "Incrível, você completou o curso Hora do Código!"
ready_for_more_header: "Pronto para mais? Jogue o modo campanha!"
ready_for_more_1: "Use gemas para desbloquear novos items!"
# ready_for_more_2: "Play through brand new worlds and challenges"
# ready_for_more_3: "Learn even more programming!"
# saved_games: "Saved Games"
# hoc: "Hour of Code"
saved_games: "Jogos Salvos"
hoc: "Hora do Código"
# my_classes: "My Classes"
# class_added: "Class successfully added!"
# view_class: "view class"
# view_levels: "view levels"
# join_class: "Join A Class"
# ask_teacher_for_code: "Ask your teacher if you have a CodeCombat class code! If so, enter it below:"
# enter_c_code: "<Enter Class Code>"
# join: "Join"
enter_c_code: "<Insira o código da sala>"
join: "Junte-se"
# joining: "Joining class"
# course_complete: "Course Complete"
# play_arena: "Play Arena"
# start: "Start"
# last_level: "Last Level"
# welcome_to_hoc: "Adventurers, welcome to our Hour of Code!"
# logged_in_as: "Logged in as:"
# not_you: "Not you?"
# welcome_back: "Hi adventurer, welcome back!"
# continue_playing: "Continue Playing"
# more_options: "More options:"
# option1_header: "Option 1: Invite students via email"
course_complete: "Curso Completo"
play_arena: "Jogue Arena"
start: "Começar"
last_level: "Última Fase"
welcome_to_hoc: "Aventureiros, bem vindo à nossa Hora de Código!"
logged_in_as: "Logado como:"
not_you: "Não é você?"
welcome_back: "Olá aventureiro, bem vindo de volta!"
continue_playing: "Continue Jogando"
more_options: "Mais Opções:"
option1_header: "Opção 1: Convide alunos por Email"
# option1_body: "Students will automatically be sent an invitation to join this class, and will need to create an account with a username and password."
# option2_header: "Option 2: Send URL to your students"
option2_header: "Opção 2: Mande a URL para seus alunos"
# option2_body: "Students will be asked to enter an email address, username and password to create an account."
# option3_header: "Option 3: Direct students to codecombat.com/courses"
option3_header: "Opção 3: Direcione alunos para codecombat.com/courses"
# option3_body: "Give students the following passcode to enter along with an email address, username and password when they create an account."
# thank_you_pref: "Thank you for your purchase! You can now assign"
# thank_you_suff: "more students to paid courses."
@ -1113,11 +1113,11 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# each_student_access: "Each student in a class will get access to Courses 2-4 once they are enrolled in paid courses. You may assign each course to each student individually."
# purchase_now: "Purchase Now"
# enrollments: "enrollments"
# remove_student1: "Remove Student"
remove_student1: "Remover Aluno"
# are_you_sure: "Are you sure you want to remove this student from this class?"
# remove_description1: "Student will lose access to this classroom and assigned classes. Progress and gameplay is NOT lost, and the student can be added back to the classroom at any time."
# remove_description2: "The activated paid license will not be returned."
# keep_student: "Keep Student"
keep_student: "Manter Aluno"
# removing_user: "Removing user"
# to_join_ask: "To join a class, ask your teacher for an unlock code."
# join_this_class: "Join Class"
@ -1160,16 +1160,16 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
# your_classes: "Your Classes"
# no_classes: "No classes yet!"
# create_new_class1: "create new class"
# available_courses: "Available Courses"
available_courses: "Cursos Disponíveis"
# unused_enrollments: "Unused enrollments available:"
# students_access: "All students get access to Introduction to Computer Science for free. One enrollment per student is required to assign them to paid CodeCombat courses. A single student does not need multiple enrollments to access all paid courses."
# active_courses: "active courses"
# no_students: "No students yet!"
# add_students1: "add students"
# view_edit: "view/edit"
active_courses: "cursos ativos"
no_students: "Nenhum aluno ainda!"
add_students1: "adicionar alunos"
view_edit: "ver/editar"
# students_enrolled: "students enrolled"
# students_assigned: "students assigned"
# length: "Length:"
length: "Comprimento:"
classes:
archmage_title: "Arquimago"
@ -1303,7 +1303,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
join_desc_3: ", ou encontre-nos em nosso "
join_desc_4: "e começaremos a partir de lá!"
join_url_email: "Envie-nos um email"
# join_url_slack: "public Slack channel"
join_url_slack: "canal público do Slack"
archmage_subscribe_desc: "Receba email sobre novas oportunidades para codificar e anúncios."
artisan_introduction_pref: "Nós devemos contruir níveis adicionais! Pessoas estão clamando por mais conteúdo, e só podemos contruir tantos de nós mesmos. Agora sua estação de trabalho é o nível um; nosso Editor de Níveis é pouco utilizável até mesmo para seus criadores, então fique esperto. Se você tem visões de campanhas abrangendo for-loops para"
artisan_introduction_suf: ", esta classe pode ser para você."
@ -1347,7 +1347,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
ambassador_join_note_strong: "Nota"
ambassador_join_note_desc: "Uma das nossas principais prioridades é a construção de um multijogador onde os jogadores que estão com dificuldade para resolver um nível podem invocar feitiçeiros com nível mais alto para ajudá-los. Esta será uma ótima maneira para os embaixadores fazerem suas tarefas. Vamos mantê-lo informado!"
ambassador_subscribe_desc: "Receba emails sobre atualização do suporte e desenvolvimento do multijogador."
# teacher_subscribe_desc: "Get emails on updates and announcements for teachers."
teacher_subscribe_desc: "Obter e-mails sobre atualizações e anúncios para professores."
changes_auto_save: "As alterações são salvas automaticamente quando você marcar as caixas de seleção."
diligent_scribes: "Nossos Aplicados Escribas:"
powerful_archmages: "Nossos Poderosos Arquimagos:"
@ -1365,7 +1365,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
simulate_games: "Simular Partidas!"
games_simulated_by: "Partidas simuladas por você:"
games_simulated_for: "Partidas simuladas para você:"
# games_in_queue: "Games currently in the queue:"
games_in_queue: "Jogos atualmente na fila:"
games_simulated: "Partidas simuladas"
games_played: "Partidas jogadas"
ratio: "Taxa"
@ -1402,7 +1402,7 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
fight: "Lutem!"
watch_victory: "Assista sua vitória"
defeat_the: "Derrote"
# watch_battle: "Watch the battle"
watch_battle: "Assista a luta"
tournament_started: ", iniciado"
tournament_ends: "Fim do torneio"
tournament_ended: "Torneio encerrado"
@ -1481,25 +1481,25 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
retrying: "Erro de servidor, tentando novamente."
success: "A transação foi completada com sucesso. Obrigado!"
# account_prepaid:
# purchase_code: "Purchase a Subscription Code"
account_prepaid:
purchase_code: "Adquira um código de inscrição"
# purchase_code1: "Subscription Codes can be redeemed to add premium subscription time to one or more CodeCombat accounts."
# purchase_code2: "Each CodeCombat account can only redeem a particular Subscription Code once."
# purchase_code3: "Subscription Code months will be added to the end of any existing subscription on the account."
# users: "Users"
# months: "Months"
# purchase_total: "Total"
users: "Usuários"
months: "Meses"
purchase_total: "Total"
# purchase_button: "Submit Purchase"
# your_codes: "Your Codes"
your_codes: "Seus códigos"
# redeem_codes: "Redeem a Subscription Code"
# prepaid_code: "Prepaid Code"
# lookup_code: "Lookup prepaid code"
# apply_account: "Apply to your account"
# copy_link: "You can copy the code's link and send it to someone."
# quantity: "Quantity"
quantity: "Quantidade"
# redeemed: "Redeemed"
# no_codes: "No codes yet!"
# you_can1: "You can"
no_codes: "Sem códigos ainda!"
you_can1: "Você pode"
# you_can2: "purchase a prepaid code"
# you_can3: "that can be applied to your own account or given to others."
@ -1520,8 +1520,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
bad_input: "Problema de entrada (bad input)."
server_error: "Erro do servidor."
unknown: "Erro desconhecido." # {change}
# error: "ERROR"
# general_desc: "Something went wrong, and its probably our fault. Try waiting a bit and then refreshing the page, or visit one of the following links to get back to programming!"
error: "ERRO"
general_desc: "Algo deu errado, e provavelmente é nossa falha. Tente aguardar um momento e tente novamente atualizando a página, ou visite um dos seguintes links para voltar à programação!"
resources:
level: "Nível"
@ -1633,8 +1633,8 @@ module.exports = nativeDescription: "Português do Brasil", englishDescription:
nutshell_title: "Em poucas palavras"
nutshell_description: "Todos os recursos que oferecemos no Editor de Níveis é livre para usar como quiser para a criação de níveis. Mas nós nos reservamos o direito de restringir a distribuição dos próprios níveis (que são criados em codecombat.com) para que possam ser cobrados no futuro, se é que isso precise acontecer."
canonical: "A versão em inglês deste documento é a versão canônica definitiva. Se houver discrepâncias entre traduções, o documento em inglês tem precedência."
# third_party_title: "Third Party Services"
# third_party_description: "CodeCombat uses the following third party services (among others):"
third_party_title: "Serviços de terceiros"
third_party_description: "CodeCombat usa os seguintes serviços de terceiros(entre outros):"
ladder_prizes:
title: "Prêmios do Torneio" # This section was for an old tournament and doesn't need new translations now.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Português (Portugal)", englishDescription:
completed_level: "Nível Completo:"
course: "Curso:"
done: "Concluir"
next_level: "Próximo Nível:"
next_level: "Próximo Nível"
next_game: "Próximo jogo"
show_menu: "Mostrar o menu do jogo"
home: "Início" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "limba română", englishDescription: "Roman
# completed_level: "Completed Level:"
# course: "Course:"
done: "Gata"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "Acasă" # Not used any more, will be removed soon.

View file

@ -200,13 +200,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
school_name: "Название школы and город"
optional: "не обязательно"
school_name_placeholder: "Школа № 2, город Электросталь, Московская область"
# or_sign_up_with: "or sign up with"
# connected_gplus_header: "You've successfully connected with Google+!"
# connected_gplus_p: "Finish signing up so you can log in with your Google+ account."
# gplus_exists: "You already have an account associated with Google+!"
# connected_facebook_header: "You've successfully connected with Facebook!"
# connected_facebook_p: "Finish signing up so you can log in with your Facebook account."
# facebook_exists: "You already have an account associated with Facebook!"
or_sign_up_with: "или авторизуйтесь через"
connected_gplus_header: "Вы успешно авторизовались через Google+!"
connected_gplus_p: "Теперь можно войти используя аккаунт Google+."
gplus_exists: "У вас уже имеется аккаунт связанный с Google+!"
connected_facebook_header: "Вы успешно авторизовались через Facebook!"
connected_facebook_p: "Теперь можно войти используя аккаунт Facebook."
facebook_exists: "У вас уже имеется аккаунт связанный сh Facebook!"
# hey_students: "Students, enter the class code from your teacher."
recover:
@ -315,7 +315,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
completed_level: "Завершённый уровень:"
course: "Курс:"
done: "Готово"
next_level: "Следующий уровень:"
next_level: "Следующий уровень"
next_game: "Следующая игра"
show_menu: "Показать меню игры"
home: "На главную" # Not used any more, will be removed soon.
@ -434,10 +434,10 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
tip_strong_opponents: "Даже сильнейший противник имеет слабость. - Itachi Uchiha"
tip_paper_and_pen: "Прежде чем начать программировать, вы всегда можете попробовать с листом бумаги и ручкой."
tip_solve_then_write: "Сперва реши задачу, затем пиши код. - Джон Джонсон"
# tip_compiler_ignores_comments: "Sometimes I think that the compiler ignores my comments."
# tip_understand_recursion: "The only way to understand recursion is to understand recursion."
tip_compiler_ignores_comments: "Иногда мне кажется, что компилятор игнорирует мои ошибки."
tip_understand_recursion: "Единственный способ понять рекурсию, это понять рекурсию."
# tip_life_and_polymorphism: "Open Source is like a totally polymorphic heterogeneous structure: All types are welcome."
# tip_mistakes_proof_of_trying: "Mistakes in your code are just proof that you are trying."
tip_mistakes_proof_of_trying: "Ошибка в коде подтвердила твои старания."
# tip_adding_orgres: "Rounding up ogres."
# tip_sharpening_swords: "Sharpening the swords."
# tip_ratatouille: "You must not let anyone define your limits because of where you come from. Your only limit is your soul. - Gusteau, Ratatouille"
@ -646,13 +646,13 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
editor_config_behaviors_description: "Автозавершать квадратные, фигурные скобки и кавычки."
about:
# main_title: "If you want to learn to program, you need to write (a lot of) code."
# main_description: "At CodeCombat, our job is to make sure you're doing that with a smile on your face."
# mission_link: "Mission"
# team_link: "Team"
# community_link: "Community"
# story_link: "Story"
# careers_link: "Careers"
main_title: "Чтобы научиться программировать, необходимо (много) писать код."
main_description: "Наша задача быть уверенными, что вы делаете это с улыбкой на лице."
mission_link: "Миссия"
team_link: "Команда"
community_link: "Сообщество"
story_link: "История"
careers_link: "Карьера"
# press_link: "Press"
# mission_title: "Our mission: make programming accessible to every student on Earth."
# mission_description_1: "<strong>Programming is magic</strong>. It's the ability to create things from pure imagination. We started CodeCombat to give learners the feeling of wizardly power at their fingertips by using <strong>typed code</strong>."
@ -681,7 +681,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
retrostyle_blurb: "Игры в стиле ретро"
jose_title: "Музыка"
jose_blurb: "На взлет"
# community_title: "...and our open-source community"
community_title: "...и наше open-source сообщество"
# community_subtitle: "Over 450 contributors have helped build CodeCombat, with more joining every week!"
# community_description_1: "CodeCombat is a community project, with hundreds of players volunteering to create levels, contribute to our code to add features, fix bugs, playtest, and even translate the game into 50 languages so far. Employees, contributors and the site gain by sharing ideas and pooling effort, as does the open source community in general. The site is built on numerous open source projects, and we are open sourced to give back to the community and provide code-curious players a familiar project to explore and experiment with. Anyone can join the CodeCombat community! Check out our"
# community_description_link: "contribute page"
@ -1190,7 +1190,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
ambassador_title: "Посол"
ambassador_title_description: "(поддержка)"
ambassador_summary: "Приручите наших пользователей форума и давайте рекомендации по их вопросам. Наши Послы представляют CodeCombat миру."
# teacher_title: "Teacher"
teacher_title: "Учитель"
editor:
main_title: "Редакторы CodeCombat"

View file

@ -4,7 +4,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
no_ie: "CodeCombat nefunguje v prehliadači Internet Explorer 8 a jeho starších verziách. Ospravedlňujeme sa." # Warning that only shows up in IE8 and older
no_mobile: "CodeCombat nebol navrhnutý pre mobilné zariadenia a nemusí na nich fungovať správne!" # Warning that shows up on mobile devices
play: "Hraj" # The big play button that opens up the campaign view.
# play_campaign_version: "Play Campaign Version" # Shows up under big play button if you only play /courses
play_campaign_version: "Hraj náborovú verziu" # Shows up under big play button if you only play /courses
old_browser: "Ajaj, prehliadač je príliš starý. CodeCombat na ňom nepôjde. Je nám to ľúto!" # Warning that shows up on really old Firefox/Chrome/Safari
old_browser_suffix: "Skúsiť sa to dá, ale asi to nepôjde."
ipad_browser: "Zlé správy: CodeCombat nebeží na iPade v prehliadači. Dobré správy: naša iPad aplikácia čaká na schválenie od Apple."
@ -26,12 +26,12 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
learn_more: "Ďalšie informácie"
classroom_in_a_box: "Virtuálna trieda pre výuku programovania."
codecombat_is: "CodeCombat je platforma <strong>pre študentov</strong>, kde sa naučia programovať hrou. "
our_courses: "Naše kurzy boli špeciálne testované <strong>v reálnych triedach/strong> a to dokonca aj učiteľmi, ktorí nemali predchádzajúce skúsenosti v programovaní."
our_courses: "Naše kurzy boli špeciálne testované <strong>v reálnych triedach</strong> a to dokonca aj učiteľmi, ktorí nemali predchádzajúce skúsenosti v programovaní."
top_screenshots_hint: "Zmeny v správaní programu vidia študenti v reálnom čase."
designed_with: "Navrhnuté s ohľadom na potreby učiteľov"
real_code: "Skutočný kód"
from_the_first_level: "od úplného začiatku"
getting_students: "Umožniť študentom písať kód, čo najrýchlejšie, je kritické pri výuke syntaxe a správnej štruktúry programu."
getting_students: "Umožniť študentom písať kód, čo najrýchlejšie,čo je kritické pri výuke syntaxe a správnej štruktúry programu."
educator_resources: "Zdroje pre učiteľov"
course_guides: "a príručky ku kurzu"
teaching_computer_science: "Výučbu programovania zvládne s nami každý učiteľ"
@ -69,7 +69,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
setup_a_class: "Nastavenia triedy"
have_an_account: "Máš účet?"
log_in: "Prihlásenie"
logged_in_as: "Si prihlásená ako"
logged_in_as: "Si prihlásený ako"
view_my_classes: "Prehľa mojích tried"
computer_science: "Kurz programovania pre každý vek"
show_me_lesson_time: "Ukáž mi predpokladaný čas kurzu pre:"
@ -85,7 +85,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
nav:
play: "Hraj" # The top nav bar entry where players choose which levels to play
community: "Komunita"
# courses: "Courses"
courses: "Kurzy"
editor: "Editor"
blog: "Blog"
forum: "Fórum"
@ -99,24 +99,24 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
about: "O projekte"
contact: "Kontakt"
twitter_follow: "Sleduj na twitteri"
teachers: "Učitelia"
# careers: "Careers"
# facebook: "Facebook"
# twitter: "Twitter"
# create_a_class: "Create a Class"
# other: "Other"
# learn_to_code: "Learn to Code!"
# toggle_nav: "Toggle navigation"
# jobs: "Jobs"
# schools: "Schools"
# educator_wiki: "Educator Wiki"
# request_quote: "Request a Quote"
# get_involved: "Get Involved"
# open_source: "Open source (GitHub)"
# support: "Support"
# faqs: "FAQs"
# help_pref: "Need help? Email"
# help_suff: "and we'll get in touch!"
teachers: "Moje triedy"
careers: "Práca"
facebook: "Facebook"
twitter: "Twitter"
create_a_class: "Vytvor triedu"
other: "Iné"
learn_to_code: "Nauč sa programovať!"
toggle_nav: "Zmena"
jobs: "Práca"
schools: "Pre školy"
educator_wiki: "Prípravy"
request_quote: "Pridaj školu"
get_involved: "Zapoj sa"
open_source: "Open source (GitHub)"
support: "Podpora"
faqs: "FAQs"
help_pref: "Potrebuješ pomoc? Email"
help_suff: "a ozveme sa."
modal:
close: "Zatvor"
@ -128,14 +128,14 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
diplomat_suggestion:
title: "Pomôžte preložiť CodeCombat!" # This shows up when a player switches to a non-English language using the language selector.
sub_heading: "Potrebujeme tvoje jazykové zručnosti."
# pitch_body: "We develop CodeCombat in English, but we already have players all over the world. Many of them want to play in {English} but don't speak English, so if you can speak both, please consider signing up to be a Diplomat and help translate both the CodeCombat website and all the levels into {English}."
# missing_translations: "Until we can translate everything into {English}, you'll see English when {English} isn't available."
pitch_body: "CodeCombat je vyvíjaný v angličitne, ale hrajú ho hráči z celého sveta. Máme aj hráčov, ktorí potrebujú preklad do slovenčiny. Ak vieš teda po anglicky aj po slovensky, prihlás sa ako diplomat a pomôž s prekladom stránky a úrovní do slovenčiny."
missing_translations: "Pokiaľ bude všetko preložené do slovenčiny, budú nepreložené časti do slovenčiny dostupné v angličtine."
learn_more: "Zisti viac, ako byť Diplomat"
subscribe_as_diplomat: "Prihlásiť sa ako Diplomat"
play:
play_as: "Hraj ako" # Ladder page
# compete: "Compete!" # Course details page
compete: "Súťaž!" # Course details page
spectate: "Sledovať" # Ladder page
players: "hráči" # Hover over a level on /play
hours_played: "odohratých hodín" # Hover over a level on /play
@ -158,7 +158,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
subscription_required: "Vyžaduje sa predplatné"
anonymous: "Anonymný hráč"
level_difficulty: "Obtiažnosť."
# play_classroom_version: "Play Classroom Version" # Choose a level in campaign version that you also can play in one of your courses
play_classroom_version: "Hraj verziu pre triedy" # Choose a level in campaign version that you also can play in one of your courses
campaign_beginner: "Kampaň pre začiatočníkov"
awaiting_levels_adventurer_prefix: "Každy týždeň 5 nových levelov." # {change}
awaiting_levels_adventurer: "Prihlás sa ako Dobrodruh"
@ -166,8 +166,8 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
adjust_volume: "Zmeniť hlasitosť"
campaign_multiplayer: "Aréna pre viacerých hráčov"
campaign_multiplayer_description: "... v ktorej si zmeriaš svoje programátorské sily proti ostatným hráčom."
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
campaign_old_multiplayer: "(zastaralé) Stará aréna hry pre viacej hráčov"
campaign_old_multiplayer_description: "Pozostatky starej kóvacej civilizácie. Nie je možná simulácia pre staré arény bez hrdinov. "
share_progress_modal:
blurb: "Postupuješ míľovými krokmi ! Povedz kamarátom, čo si sa už naučil pomocou CodeCombatu."
@ -197,17 +197,17 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
log_in: "prihlás sa pomocou hesla"
required: "Najskôr sa musíš prihlásiť."
login_switch: "Máš už účet ?"
# school_name: "School Name and City"
# optional: "optional"
# school_name_placeholder: "Example High School, Springfield, IL"
# or_sign_up_with: "or sign up with"
# connected_gplus_header: "You've successfully connected with Google+!"
# connected_gplus_p: "Finish signing up so you can log in with your Google+ account."
# gplus_exists: "You already have an account associated with Google+!"
# connected_facebook_header: "You've successfully connected with Facebook!"
# connected_facebook_p: "Finish signing up so you can log in with your Facebook account."
# facebook_exists: "You already have an account associated with Facebook!"
# hey_students: "Students, enter the class code from your teacher."
school_name: "Meno školy a jej sídlo"
optional: "voliteľné"
school_name_placeholder: "ZŠ Sv. Gorazda, Žilina"
or_sign_up_with: "alebo sa zaregistruj pomocou"
connected_gplus_header: "Úspešne pripojený cez Google+!"
connected_gplus_p: "Ukonči registráciu cez účet Google+!"
gplus_exists: "Už si sa registroval cez Google+!"
connected_facebook_header: "Úspešne pripojený cez Facebook!"
connected_facebook_p: "Ukonči registráciu cez svoj účet na Facebooku."
facebook_exists: "Už máš účet zaregistrovaný cez Facebook!"
hey_students: "Študenti, vložte kód, ktorý vám dal váš učiteľ."
recover:
recover_account_title: "Obnov účet"
@ -243,7 +243,7 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
unwatch: "Zruš sledovanie"
submit_patch: "Odoslať Opravu"
submit_changes: "Odoslať zmeny"
# save_changes: "Save Changes"
save_changes: "Ulož zmeny"
general:
and: "a"
@ -255,9 +255,9 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
accepted: "Prijaté"
rejected: "Zamietnuté"
withdrawn: "Uzatvorené"
# accept: "Accept"
# reject: "Reject"
# withdraw: "Withdraw"
accept: "Prijať"
reject: "Odmietnuť"
withdraw: "Zrušiť"
submitter: "Odosielateľ"
submitted: "Odoslané"
commit_msg: "Popis ukladania"
@ -312,12 +312,12 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
years: "rokov"
play_level:
# completed_level: "Completed Level:"
# course: "Course:"
completed_level: "Ukončená úroveň:"
course: "Kurz:"
done: "Hotovo"
# next_level: "Next Level:"
# next_game: "Next game"
# show_menu: "Show game menu"
next_level: "Ďalšia úroveň:"
next_game: "Ďalšia hra"
show_menu: "Ukáž menu hry"
home: "Domov" # Not used any more, will be removed soon.
level: "Úroveň" # Like "Level: Dungeons of Kithgard"
skip: "Preskočiť"
@ -347,13 +347,13 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
victory_saving_progress: "Stav ukladania"
victory_go_home: "Návrat Domov"
victory_review: "Povedz nám viac!"
# victory_review_placeholder: "How was the level?"
victory_review_placeholder: "Ako sa ti páčilo?"
victory_hour_of_code_done: "Skončil si?"
victory_hour_of_code_done_yes: "Áno, pre dnešok som skončil™!"
victory_experience_gained: "Získaných XP"
victory_gems_gained: "Získaných kryštálov"
# victory_new_item: "New Item"
# 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_new_item: "Nový predmet"
victory_viking_code_school: "No teda, podarilo sa ti prejsť veľmi ťažkú úroveň! Ak nie si vývojar softvéru, tak je najvyšší čas. Si prijatý do Vikingskej školy programovania,kde môžeš ďalej rozvinúť svoje programovacie schopnosti a stať sa profesionálnym webovým vývojarom za 14 týždňov."
victory_become_a_viking: "Staň sa vikingom!"
guide_title: "Návod"
tome_cast_button_run: "Spustiť"
@ -376,11 +376,11 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
time_current: "Teraz:"
time_total: "Max:"
time_goto: "Choď na:"
# non_user_code_problem_title: "Unable to Load Level"
# infinite_loop_title: "Infinite Loop Detected"
# 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."
# check_dev_console: "You can also open the developer console to see what might be going wrong."
# check_dev_console_link: "(instructions)"
non_user_code_problem_title: "Nie je možné nahrať úroveň."
infinite_loop_title: "Odhalená nekonečná slučka"
infinite_loop_description: "Úvodný kód vytvorenia sveta neskončil. Je buď neskutočne pomalý alebo obsahuje nekonečnú slučku. Možná je aj chyba. Skús spustiť program znovu alebo obnov kód do pôvodného stavu. Ak nič nepomôže, oznám nám to, prosím."
check_dev_console: "Môžeš otvoriť aj Nástroje pre vývojárov a pozri sa, v čom by mohla byť chyba."
check_dev_console_link: "(inštrukcie)"
infinite_loop_try_again: "Skús znova"
infinite_loop_reset_level: "Reštartuj level"
infinite_loop_comment_out: "Zakomentovať môj kód"
@ -442,10 +442,10 @@ module.exports = nativeDescription: "slovenčina", englishDescription: "Slovak",
tip_sharpening_swords: "Naostri si meče."
tip_ratatouille: "Nenechaj nikomu definovať svoje hranice len z dôvodu tvojho pôvodu. Tvojím jediným obmedzením si iba ty sám. - Gusteau, Ratatouille"
tip_nemo: "Ak ťa život zráža dolu, chceš vedieť čo ti pomôže? Plávaj, len stále plávaj. - Dory, Finding Nemo"
# tip_internet_weather: "Just move to the internet, it's great here. We get to live inside where the weather is always awesome. - John Green"
# tip_nerds: "Nerds are allowed to love stuff, like jump-up-and-down-in-the-chair-can't-control-yourself love it. - John Green"
# tip_self_taught: "I taught myself 90% of what I've learned. And that's normal! - Hank Green"
# tip_luna_lovegood: "Don't worry, you're just as sane as I am. - Luna Lovegood"
tip_internet_weather: "Choď na internet, je tam skvele. Ži doma, kde je vždy nádherné počasie. - John Green"
tip_nerds: "Nerdi milujú skákanie na stoličku a zo stoličky. Strácajú pritom kontrolu. - John Green"
tip_self_taught: "90% toho, čo potrebujem, som sa naučil sám. A je to normálne! - Hank Green"
tip_luna_lovegood: "Don't worry, you're just as sane as I am. - Luna Lovegood"
# tip_good_idea: "The best way to have a good idea is to have a lot of ideas. - Linus Pauling"
# tip_programming_not_about_computers: "Computer Science is no more about computers than astronomy is about telescopes. - Edsger Dijkstra"
# tip_mulan: "Believe you can, then you will. - Mulan"

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "slovenščina", englishDescription: "Sloven
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "српски", englishDescription: "Serbian
completed_level: "Завршен ниво:"
course: "Курс:"
done: "Урађено"
next_level: "Следећи ниво:"
next_level: "Следећи ниво"
next_game: "Следећа игра"
show_menu: "Види мени игре"
home: "Почетна" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Svenska", englishDescription: "Swedish", tr
completed_level: "Avklarad nivå:"
course: "Lektion:"
done: "Klar"
next_level: "Nästa nivå:"
next_level: "Nästa nivå"
next_game: "Nästa spel"
show_menu: "Visa spelmeny"
home: "Hem" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "ไทย", englishDescription: "Thai", tra
# completed_level: "Completed Level:"
# course: "Course:"
done: "เสร็จสิ้น"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "หน้าแรก" # Not used any more, will be removed soon.

View file

@ -4,7 +4,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
no_ie: "CodeCombat maalesef Internet Explorer 8 veya daha eski sürümlerde çalışmaz." # Warning that only shows up in IE8 and older
no_mobile: "CodeCombat mobil cihazlar için tasarlanmamıştır bu sebeple mobil cihazlarda çalışmayabilir." # Warning that shows up on mobile devices
play: "Oyna" # The big play button that opens up the campaign view.
# play_campaign_version: "Play Campaign Version" # Shows up under big play button if you only play /courses
play_campaign_version: "Sefer Sürümünü Oyna" # Shows up under big play button if you only play /courses
old_browser: "Olamaz, Tarayıcınız CodeCombat'ı çalıştırmak için çok eski. Üzgünüz!" # Warning that shows up on really old Firefox/Chrome/Safari
old_browser_suffix: "Deneyebilirsiniz, ama muhtemelen oyun çalışmayacaktır."
ipad_browser: "Kötü haber: CodeCombat iPad üzerinde tarayıcıda çalışmıyor. İyi haber: İstemci Apple'ın onayını bekliyor."
@ -14,41 +14,41 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
for_developers: "Geliştiriciler için" # Not currently shown on home page.
or_ipad: "Ya da iPad için indir"
# new_home:
# slogan: "The most engaging game for learning programming."
# classroom_edition: "Classroom Edition:"
# learn_to_code: "Learn to code:"
# teacher: "Teacher"
# student: "Student"
# play_now: "Play Now"
# im_a_teacher: "I'm a Teacher"
# im_a_student: "I'm a Student"
# learn_more: "Learn more"
# classroom_in_a_box: "A classroom in-a-box for teaching computer science."
# codecombat_is: "CodeCombat is a platform <strong>for students</strong> to learn computer science while playing through a real game."
# our_courses: "Our courses have been specifically playtested to <strong>excel in the classroom</strong>, even by teachers with little to no prior programming experience."
# top_screenshots_hint: "Students write code and see their changes update in real-time"
# designed_with: "Designed with teachers in mind"
# real_code: "Real, typed code"
# from_the_first_level: "from the first level"
# getting_students: "Getting students to typed code as quickly as possible is critical to learning programming syntax and proper structure."
# educator_resources: "Educator resources"
# course_guides: "and course guides"
# teaching_computer_science: "Teaching computer science does not require a costly degree, because we provide tools to support educators of all backgrounds."
# accessible_to: "Accessible to"
# everyone: "everyone"
# democratizing: "Democratizing the process of learning coding is at the core of our philosophy. Everyone should be able to learn to code."
# forgot_learning: "I think they actually forgot that they were actually learning something."
# wanted_to_do: " Coding is something I've always wanted to do, and I never thought I would be able to learn it in school."
# why_games: "Why is learning through games important?"
# games_reward: "Games reward the productive struggle."
# encourage: "Gaming is a medium that encourages interaction, discovery, and trial-and-error. A good game challenges the player to master skills over time, which is the same critical process students go through as they learn."
# excel: "Games excel at rewarding"
# struggle: "productive struggle"
# kind_of_struggle: "the kind of struggle that results in learning thats engaging and"
# motivating: "motivating"
# not_tedious: "not tedious."
# gaming_is_good: "Studies suggest gaming is good for childrens brains. (its true!)"
new_home:
slogan: "Programlama öğrenmek için en çekici oyun."
classroom_edition: "Sınıf Sürümü:"
learn_to_code: "Kodlama öğren:"
teacher: "Öğretmen"
student: "Öğrenci"
play_now: "Şimdi Oyna"
im_a_teacher: "Ben bir öğretmenim"
im_a_student: "Ben bir öğrenciyim"
learn_more: "Daha fazla öğren"
classroom_in_a_box: "Bilgisayar bilimleri öğrenmek için kutuda bir sınıf."
codecombat_is: "CodeCombat <strong>öğrenciler için</strong> hazırlanmış, gerçek bir oyun oynarken bilgisayar bilimleri öğrenmeyi sağlayan bir platformdur."
our_courses: "Kurslarımız özellikle, önceden hiç programlama tecrübesi olmayan öğretmenler tarafından bile, oynanarak test edilmiştir."
top_screenshots_hint: "Öğrenciler kodlar ve gelişimlerini gerçek zamanlı olarak güncellenerek görürler"
designed_with: "Öğretmenler düşünülerek tasarlanmıştır"
real_code: "Gerçek, yazılmış kod"
from_the_first_level: "ilk levelden itibaren"
getting_students: "Öğrencileri olabildiğince hızlı bir şekilde kodlamaya başlatmak, programlama sözdizimi ve uygun yapıları öğrenmesi için kritiktir."
educator_resources: "Eğitim kaynakları"
course_guides: "ve kurs kılavuzları"
teaching_computer_science: "Bilgisayar bilimleri öğretmek pahalı bir diploma gerektirmez, çünkü her farklı geçmiş deneyimden öğretmeni desteklemek için araçlar sunuyoruz."
accessible_to: "Erişilebilir"
everyone: "herkes"
democratizing: "Kodlamayı öğrenme işlemini demokratikleştirmek felsefemizin temelidir. Herkes kodlama öğrenebilmeli."
forgot_learning: "Aslında birşeyler öğrenmeye çalıştıklarını unuttuklarını düşünüyorum."
wanted_to_do: " Kodlama her zaman yapmak istediğim birşeydi ve hiçbir zaman bunu okulda öğrenebileceğimi düşünmemiştim."
why_games: "Neden oyun ile öğrenmek önemlidir?"
games_reward: "Oyun üretken mücadeleyi ödüllendirir."
encourage: "Oyun etkileşimi, keşfetmeyi ve deneme yanılmayı teşvik eden bir ortamdır. İyi bir oyun oyuncuya, zamanla yeteneklerinde ustalaşması için meydan okur, bu da öğrencinin öğrenirken geçirdiği kritik süreçler ile aynıdır."
excel: "Oyunlar ödüllendirme için mükemmeldir"
struggle: "üretken mücadele"
kind_of_struggle: " öğrenmeye şunları katan bir mücadele: etkileşim ve"
motivating: "motive edici"
not_tedious: "sıkıcı değil."
gaming_is_good: "Araştırmalar oyun oynamanın çocuğum beyin gelişimi için iyi olduğunu söyler. (Bu doğru!)"
# game_based: "When game-based learning systems are"
# compared: "compared"
# conventional: "against conventional assessment methods, the difference is clear: games are better at helping students retain knowledge, concentrate and"
@ -85,7 +85,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
nav:
play: "Oyna" # The top nav bar entry where players choose which levels to play
community: "Topluluk"
# courses: "Courses"
courses: "Kurslar"
editor: "Düzenleyici"
blog: "Blog"
forum: "Forum"
@ -100,23 +100,23 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
contact: "İletişim"
twitter_follow: "Takip et"
teachers: "Öğretmenler"
# careers: "Careers"
# facebook: "Facebook"
# twitter: "Twitter"
# create_a_class: "Create a Class"
# other: "Other"
# learn_to_code: "Learn to Code!"
# toggle_nav: "Toggle navigation"
# jobs: "Jobs"
# schools: "Schools"
# educator_wiki: "Educator Wiki"
# request_quote: "Request a Quote"
# get_involved: "Get Involved"
# open_source: "Open source (GitHub)"
# support: "Support"
# faqs: "FAQs"
# help_pref: "Need help? Email"
# help_suff: "and we'll get in touch!"
careers: "Kariyer"
facebook: "Facebook"
twitter: "Twitter"
create_a_class: "Bir sınıf oluştur"
other: "Diğer"
learn_to_code: "Kodlama öğren!"
toggle_nav: "Menü aç kapa"
jobs: "İşler"
schools: "Schools"
educator_wiki: "Eğitimci Wiki"
request_quote: "Fiyat Teklifi İste"
get_involved: "Katıl"
open_source: "ık Kaynak (GitHub)"
support: "Destek"
faqs: "SSS"
help_pref: "Yardım mı lazım? Emaille"
help_suff: "ve bizimle irtibat kur!"
modal:
close: "Kapat"
@ -135,7 +135,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
play:
play_as: "Olarak Oyna" # Ladder page
# compete: "Compete!" # Course details page
compete: "Tamamla!" # Course details page
spectate: "İzleyici olarak katıl" # Ladder page
players: "oyuncu" # Hover over a level on /play
hours_played: "saat oynandı" # Hover over a level on /play
@ -151,14 +151,14 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
achievements: "Başarımlar" # Tooltip on achievement list button from /play
account: "Hesap" # Tooltip on account button from /play
settings: "Ayarlar" # Tooltip on settings button from /play
# poll: "Poll" # Tooltip on poll button from /play
poll: "Anket" # Tooltip on poll button from /play
next: "İleri" # Go from choose hero to choose inventory before playing a level
change_hero: "Kahramanı Değiştir" # Go back from choose inventory to choose hero
buy_gems: "Değerli Taş Satın Al"
subscription_required: "Abonelik Gerekli"
anonymous: "Anonim Oyuncu"
level_difficulty: "Zorluk: "
# play_classroom_version: "Play Classroom Version" # Choose a level in campaign version that you also can play in one of your courses
play_classroom_version: "Sınıf Sürümünü Oyna" # Choose a level in campaign version that you also can play in one of your courses
campaign_beginner: "Acemi Seferi"
awaiting_levels_adventurer_prefix: "Haftada beş bölüm yayınlıyoruz." # {change}
awaiting_levels_adventurer: "Yeni oyunları ilk oynayan olmak için"
@ -166,7 +166,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
adjust_volume: "Sesi ayarla"
campaign_multiplayer: "Çok Oyunculu Meydanlar"
campaign_multiplayer_description: "Diğer oyuncularla kafa kafaya verip kodlamak için..."
# campaign_old_multiplayer: "(Deprecated) Old Multiplayer Arenas"
campaign_old_multiplayer: "(Kaldırıldı) Eski Çok Oyunculu Arenalar"
# campaign_old_multiplayer_description: "Relics of a more civilized age. No simulations are run for these older, hero-less multiplayer arenas."
share_progress_modal:
@ -197,17 +197,17 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
log_in: "buradan giriş yapabilirsiniz."
required: "Buraya gidebilmeniz için oturum açmanız gerekli."
login_switch: "Zaten bir hesabın var mı?"
# school_name: "School Name and City"
# optional: "optional"
# school_name_placeholder: "Example High School, Springfield, IL"
# or_sign_up_with: "or sign up with"
# connected_gplus_header: "You've successfully connected with Google+!"
# connected_gplus_p: "Finish signing up so you can log in with your Google+ account."
# gplus_exists: "You already have an account associated with Google+!"
# connected_facebook_header: "You've successfully connected with Facebook!"
# connected_facebook_p: "Finish signing up so you can log in with your Facebook account."
# facebook_exists: "You already have an account associated with Facebook!"
# hey_students: "Students, enter the class code from your teacher."
school_name: "Okul İsmi ve Şehir"
optional: "isteğe bağlı"
school_name_placeholder: "Örnek İsim Okul, Çankaya, Ankara"
or_sign_up_with: "ya da şuradan üye ol"
connected_gplus_header: "Google+ ile başarıyla bağlandın!"
connected_gplus_p: "Kayıt işlemini bitir, artık Google+ hesabınla giriş yapabilirsin."
gplus_exists: "Zaten Goolge+ ile ilişkilendirilmiş bir hesabın bulunuyor!"
connected_facebook_header: "Facebook ile başarı ile bağlandın!"
connected_facebook_p: "Kayıt işlemini bitir, artık Facebook hesabınla giriş yapabilirsin."
facebook_exists: "Zaten Facebook ile ilişkilendirilmiş bir hesabın bulunuyor!"
hey_students: "Öğrenciler, öğretmeninizin verdiği sınıf kodunu girin."
recover:
recover_account_title: "Hesabı Kurtar"
@ -255,9 +255,9 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
accepted: "Kabul Edildi"
rejected: "Reddedildi"
withdrawn: "İptal Edildi"
# accept: "Accept"
# reject: "Reject"
# withdraw: "Withdraw"
accept: "Kabul Et"
reject: "Reddet"
withdraw: "Ayrıl"
submitter: "Gönderen"
submitted: "Gönderilme"
commit_msg: "Gönderme İletisi"
@ -312,12 +312,12 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
years: "yıl"
play_level:
# completed_level: "Completed Level:"
# course: "Course:"
completed_level: "Seviyeyi Tamamladın:"
course: "Kurs:"
done: "Bitti"
# next_level: "Next Level:"
# next_game: "Next game"
# show_menu: "Show game menu"
next_level: "Sonraki Seviye:"
next_game: "Sonraki Oyun"
show_menu: "Oyun Menüsünü Göster"
home: "Anasayfa" # Not used any more, will be removed soon.
level: "Bölüm" # Like "Level: Dungeons of Kithgard"
skip: "Atla"
@ -352,7 +352,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
victory_hour_of_code_done_yes: "Evet, Kod Saatimi (Hour of Code) bitirdim!"
victory_experience_gained: "Kazanılan XP"
victory_gems_gained: "Kazanılan Taş"
# victory_new_item: "New Item"
victory_new_item: "Yeni Öğe"
# victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
victory_become_a_viking: "Viking Ol"
guide_title: "Rehber"
@ -378,7 +378,7 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
time_goto: "Git:"
non_user_code_problem_title: "Seviye yüklenemiyor"
infinite_loop_title: "Sonsuz döngü tespit edildi"
# 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: "Dünyayı oluştururken girilen kodun çalışması durmadı. Muhtemelen ya çok yavaştı ya da sonsuz döngü vardı. Veya belki de bir hata vardır. Kodu tekrar çalıştırmayı deneyebilirsin ya da kodu ilk haline resetleyebilirsin. Bu da işe yaramazsa lütfen bizi bilgilendir."
check_dev_console: "Neyin hatali olduğunu görmek icin geliştirici konsolunu da açabilirsin."
check_dev_console_link: "(yönergeler)"
infinite_loop_try_again: "Yeniden Dene"
@ -396,11 +396,11 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
tip_debugging_program: "Eğer hataları ayıklamak programı düzeltmekse, o zaman programlama da hataları bir araya getirmektir. - Edsger W. Dijkstra"
tip_forums: "Forumları dolaş ve bize ne düşündüğünü söyle!"
tip_baby_coders: "Gelecekte bebekler bile Archmage olacak."
# tip_morale_improves: "Loading will continue until morale improves."
# tip_all_species: "We believe in equal opportunities to learn programming for all species."
tip_morale_improves: "Moral artana kadar yükleme devam edecek."
tip_all_species: "Programlama öğrenme fırsatlarının her tür için eşit fırsatlarda olması gerektiğine inanıyoruz."
# tip_reticulating: "Reticulating spines."
# tip_harry: "Yer a Wizard, "
# tip_great_responsibility: "With great coding skill comes great debug responsibility."
tip_harry: "Sen Bir Büyücüsün, "
tip_great_responsibility: "Güçlü kodlama yeteneği, güçlü hata ayıklama sorumluluğu ile birlikte gelir."
# tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep."
tip_binary: "Dünyada sadece 10 çeşit insan vardır: Ikilileri anlayabilenler ve anlayamayanlar."
# tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda"
@ -410,8 +410,8 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
tip_impossible: "Her şey tamamlanana kadar imkansız görünür. - Nelson Mandela"
tip_talk_is_cheap: "Konuşmak kolaydır. Kodunu göster. - Linus Torvalds"
tip_first_language: "Hayatta öğrenebilecegin en feci şey ilk programlama dilindir. - Alan Kay"
# tip_hardware_problem: "Q: How many programmers does it take to change a light bulb? A: None, it's a hardware problem."
# tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
tip_hardware_problem: "S: Bir lambayı değiştirmek için kaç programcı gereklidir? C: Hiç, bu bir donanım sorunudur."
tip_hofstadters_law: "Hofstadter Yasası: Her zaman tahmin ettiğinden daha uzun sürer, Hofstadter yasasını hesaba kattığında bile."
# tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
tip_brute_force: "Süpheye düstüğünde kaba kuvveti kullan. - Ken Thompson"
# tip_extrapolation: "There are only two kinds of people: those that can extrapolate from incomplete data..."
@ -467,18 +467,18 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
multiplayer_caption: "Arkadaşlarla oyna!"
auth_caption: "İlerlemenizi kaydedin."
# leaderboard:
# view_other_solutions: "View Leaderboards"
# scores: "Scores"
# top_players: "Top Players by"
# day: "Today"
# week: "This Week"
# all: "All-Time"
# time: "Time"
# damage_taken: "Damage Taken"
# damage_dealt: "Damage Dealt"
# difficulty: "Difficulty"
# gold_collected: "Gold Collected"
leaderboard:
view_other_solutions: "Skor tahtasını gör"
scores: "Skorlar"
top_players: "En İyi Oyuncular"
day: "Bugün"
week: "Bu Hafta"
all: "Tüm Zamanlar"
time: "Zaman"
damage_taken: "Alınan Hasar"
damage_dealt: "Verilen Hasar"
difficulty: "Zorluk"
gold_collected: "Toplanan Altın"
inventory:
equipped_item: "Giyilmiş"
@ -499,11 +499,11 @@ module.exports = nativeDescription: "Türkçe", englishDescription: "Turkish", t
purchasing: "Ödeniyor..."
declined: "Kartınız reddedildi"
retrying: "Sunucu hatası, tekrar deneniyor."
# prompt_title: "Not Enough Gems"
# prompt_body: "Do you want to get more?"
# prompt_button: "Enter Shop"
# recovered: "Previous gems purchase recovered. Please refresh the page."
# price: "x{{gems}} / mo"
prompt_title: "Yetersiz Taş"
prompt_body: "Daha fazla almak ister misin?"
prompt_button: "Dükkana Gir"
recovered: "Previous gems purchase recovered. Please refresh the page."
price: "x{{gems}} / ay"
# subscribe:
# comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Українська", englishDescription:
# completed_level: "Completed Level:"
# course: "Course:"
done: "Готово"
# next_level: "Next Level:"
# next_level: "Next Level"
next_game: "Наступна гра"
show_menu: "Показати меню гри"
home: "На головну" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "اُردُو", englishDescription: "Urdu",
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "O'zbekcha", englishDescription: "Uzbek", tr
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "Tiếng Việt", englishDescription: "Vietn
completed_level: "Hoàn thành Level:"
course: "Khoá học:"
done: "Hoàn thành"
next_level: "Level tiếp theo:"
next_level: "Level tiếp theo"
next_game: "Game kế tiếp"
show_menu: "Hiện game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "简体中文", englishDescription: "Chinese
completed_level: "完成关卡:"
course: "课程:"
done: "完成"
next_level: "下一个关卡:"
next_level: "下一个关卡"
next_game: "下一场游戏"
show_menu: "显示游戏菜单"
home: "主页" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "吴语", englishDescription: "Wuu (Simplifi
# completed_level: "Completed Level:"
# course: "Course:"
# done: "Done"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
# home: "Home" # Not used any more, will be removed soon.

View file

@ -315,7 +315,7 @@ module.exports = nativeDescription: "吳語", englishDescription: "Wuu (Traditio
# completed_level: "Completed Level:"
# course: "Course:"
done: "妝下落"
# next_level: "Next Level:"
# next_level: "Next Level"
# next_game: "Next game"
# show_menu: "Show game menu"
home: "主頁" # Not used any more, will be removed soon.

View file

@ -248,6 +248,6 @@ module.exports = class Level extends CocoModel
width = c.width if c.width? and c.width > width
height = c.height if c.height? and c.height > height
return {width: width, height: height}
isLadder: ->
return @get('type')?.indexOf('ladder') > -1

View file

@ -23,7 +23,7 @@ module.exports = class SuperModel extends Backbone.Model
console.info "#{_.values(@resources).length} resources."
unfinished = []
for resource in _.values(@resources) when resource
console.info "\t", resource.name, 'loaded', resource.isLoaded
console.info "\t", resource.name, 'loaded', resource.isLoaded, resource.model
unfinished.push resource unless resource.isLoaded
unfinished
@ -158,7 +158,7 @@ module.exports = class SuperModel extends Backbone.Model
# Tracking resources being loaded for this supermodel
finished: ->
return (@progress is 1.0) or (not @denom) or @failed
return (@progress is 1.0) or (not @denom) or @failed
addModelResource: (modelOrCollection, name, fetchOptions, value=1) ->
# Deprecating name. Handle if name is not included
@ -192,8 +192,8 @@ module.exports = class SuperModel extends Backbone.Model
return res
checkName: (name) ->
if _.isString(name)
console.warn("SuperModel name property deprecated. Remove '#{name}' from code.")
#if _.isString(name)
# console.warn("SuperModel name property deprecated. Remove '#{name}' from code.")
storeResource: (resource, value) ->
@rid++

View file

@ -49,6 +49,8 @@ module.exports =
goalStates: goalStatesSchema
preload: {type: 'boolean'}
overallStatus: {type: ['string', 'null'], enum: ['success', 'failure', 'incomplete', null]}
totalFrames: {type: ['integer', 'undefined']}
lastFrameHash: {type: ['number', 'undefined']}
'god:world-load-progress-changed': c.object {required: ['progress', 'god']},
god: {type: 'object'}

View file

@ -70,3 +70,6 @@ module.exports =
'application:service-loaded': c.object {required: ['service']},
service: {type: 'string'} # 'segment'
'test:update': c.object {},
state: {type: 'string'}

View file

@ -12,6 +12,7 @@ module.exports =
preload: {type: 'boolean'}
realTime: {type: 'boolean'}
submissionCount: {type: 'integer'}
fixedSeed: {type: ['integer', 'undefined']}
flagHistory: {type: 'array'}
difficulty: {type: 'integer'}
god: {type: 'object'}

View file

@ -5,4 +5,9 @@
margin-bottom: 5px
p
margin-top: 30px
margin-top: 30px
.course-title
white-space: nowrap
text-overflow: ellipsis
overflow: hidden

View file

@ -20,20 +20,20 @@ block content
.courses.container
- var courses = view.courses.models;
- var i = 0;
while i < courses.length
- var course = courses[i];
- i++;
- var courseIndex = 0;
while courseIndex < courses.length
- var course = courses[courseIndex];
- courseIndex++;
.course.row
.col-sm-9
+course-info(course)
.col-sm-3.hidden
.play-level-form
.col-sm-3
.play-level-form(data-course-id=course.id)
.form-group
label.control-label
span(data-i18n="courses.select_language")
| :
select.form-control
select.language-select.form-control
// TODO: Automate this list @scott
option(value="python")
| Python
@ -51,11 +51,17 @@ block content
label.control-label
span(data-i18n="courses.select_level")
| :
select.form-control
// TODO: Automate this list @scott
option(value='TODO')
| 1. Dungeons of Kithgard
a.btn.btn-lg.btn-primary
select.level-select.form-control
if view.campaigns.loaded
each level, levelIndex in view.campaigns.get(course.get('campaignID')).getLevels().models
option(value=level.get('slug'))
span
= levelIndex + 1
span
| .
span
= level.get('name')
a.play-level-button.btn.btn-lg.btn-primary
span(data-i18n="courses.play_level")
.clearfix
@ -72,7 +78,7 @@ mixin course-info(course)
if course.get('concepts').indexOf(concept) !== course.get('concepts').length - 1
span.spr ,
if me.isTeacher() && view.ownedClassrooms.size()
if me.isTeacher() || view.ownedClassrooms.size()
if view.guideLinks[course.id]
//- a.btn.btn-primary(href=view.guideLinks[course.id] class=(me.isAnonymous() ? 'disabled' : ''))
//- span(data-i18n="courses.print_guide")

View file

@ -0,0 +1,33 @@
extends /templates/base-flat
block content
.container
each test in view.tests
if test.level
h2= test.level.get('name')
small= ' in ' + test.language + ''
div.well(style='width: 300px; float: right')
if test.goals
each v,k in test.goals || []
case v.status
when 'success': div(style='color: green') ✓ #{k}
when 'incomplete': div(style='color: orange') ✘ #{k}
when 'failure': div(style='color: red') ✘ #{k}
default: div(style='color: blue') #{k}
else
h3 Running....
if test.solution
pre(style='margin-right: 350px') #{test.solution.source}
else
h4 Solution not found...
else
h1 Loading Level...
div#tome-view
div#goals-veiw
br
// TODO: show errors
// TODO: frame length
// TODO: show last frame hash

View file

@ -7,7 +7,7 @@
.levels-link-area
a.levels-link(href=homeLink || "/")
.glyphicon.glyphicon-play
span(data-i18n=ladderGame ? "general.ladder" : "nav.play").home-text Levels
span(data-i18n=me.isTeacher() ? "nav.courses" : (ladderGame ? "general.ladder" : "nav.play")).home-text Levels
if isMultiplayerLevel && !observing
.multiplayer-area-container

View file

@ -2,7 +2,7 @@
#close-modal.well.well-sm.well-parchment(data-dismiss="modal")
span.glyphicon.glyphicon-remove
.well.well-sm.well-parchment
h1 Level Complete
h1(data-i18n='play_level.level_complete')
.modal-body
.container-fluid
@ -10,23 +10,32 @@
- var colClass = view.nextLevel ? 'col-sm-7' : 'col-sm-12'
div(class=colClass)
.well.well-sm.well-parchment
h3.text-uppercase Completed Level:
h3.text-uppercase(data-i18n='play_level.completed_level')
h2.text-uppercase.text-center= i18n(view.level.attributes, 'name')
.well.well-sm.well-parchment
h3.text-uppercase Course:
.row
.col-sm-8
h3.text-uppercase.text-center= i18n(view.course.attributes, 'name')
.col-sm-4
- var stats = view.campaign.statsForSessions(view.levelSessions)
h1
span #{stats.levels.numDone}/#{stats.levels.size}
if me.isTeacher()
h3.course-title
span.text-uppercase.spr(data-i18n='play_level.course')
span.text-uppercase.text-center= i18n(view.course.attributes, 'name')
span(data-i18n='play_level.victory_no_progress_for_teachers')
else
h3.text-uppercase(data-i18n='play_level.course')
.row
.col-sm-8
h3.text-uppercase.text-center= i18n(view.course.attributes, 'name')
.col-sm-4
- var stats = view.campaign.statsForSessions(view.levelSessions)
h1
span #{stats.levels.numDone}/#{stats.levels.size}
if view.nextLevel
.col-sm-5
.well.well-sm.well-parchment
h3.text-uppercase Next Level:
h3.text-uppercase
span(data-i18n='play_level.next_level')
span :
h2.text-uppercase= i18n(view.nextLevel.attributes, 'name')
p= i18n(view.nextLevel.attributes, 'description')
@ -37,6 +46,6 @@
// button#continue-btn.btn.btn-illustrated.btn-default.btn-block.btn-lg.text-uppercase View Leaderboards
.col-sm-5
if view.nextLevel
button#next-level-btn.btn.btn-illustrated.btn-primary.btn-block.btn-lg.text-uppercase Next Level
button#next-level-btn.btn.btn-illustrated.btn-primary.btn-block.btn-lg.text-uppercase(data-i18n='play_level.next_level')
else
button#done-btn.btn.btn-illustrated.btn-primary.btn-block.btn-lg.text-uppercase Done
button#done-btn.btn.btn-illustrated.btn-primary.btn-block.btn-lg.text-uppercase(data-i18n='play_level.done')

View file

@ -48,5 +48,5 @@ module.exports = class ContactModal extends ModalView
updateScreenshot: ->
return unless @screenshotURL
screenshotEl = @$el.find('#contact-screenshot').removeClass('secret')
screenshotEl.find('a').prop('href', @screenshotURL)
screenshotEl.find('img').prop('src', @screenshotURL)
screenshotEl.find('a').prop('href', @screenshotURL.replace("http://codecombat.com/", "/"))
screenshotEl.find('img').prop('src', @screenshotURL.replace("http://codecombat.com/", "/"))

View file

@ -3,6 +3,7 @@ app = require 'core/application'
CocoCollection = require 'collections/CocoCollection'
CocoModel = require 'models/CocoModel'
Course = require 'models/Course'
Campaigns = require 'collections/Campaigns'
Classroom = require 'models/Classroom'
Classrooms = require 'collections/Classrooms'
InviteToClassroomModal = require 'views/courses/InviteToClassroomModal'
@ -22,6 +23,7 @@ module.exports = class TeacherCoursesView extends RootView
'click .btn-add-students': 'onClickAddStudents'
'click .create-new-class': 'onClickCreateNewClassButton'
'click .edit-classroom-small': 'onClickEditClassroomSmall'
'click .play-level-button': 'onClickPlayLevel'
guideLinks:
{
@ -43,6 +45,9 @@ module.exports = class TeacherCoursesView extends RootView
@classrooms.comparator = '_id'
@listenToOnce @classrooms, 'sync', @onceClassroomsSync
@supermodel.loadCollection(@classrooms, 'classrooms', {data: {ownerID: me.id}})
@campaigns = new Campaigns()
@campaigns.fetch()
@supermodel.trackCollection(@campaigns)
@courseInstances = new CocoCollection([], { url: "/db/course_instance", model: CourseInstance })
@courseInstances.comparator = 'courseID'
@courseInstances.sliceWithMembers = -> return @filter (courseInstance) -> _.size(courseInstance.get('members')) and courseInstance.get('classroomID')
@ -99,6 +104,14 @@ module.exports = class TeacherCoursesView extends RootView
modal = new ClassroomSettingsModal({classroom: classroom})
@openModalView(modal)
@listenToOnce modal, 'hide', @render
onClickPlayLevel: (e) ->
form = $(e.currentTarget).closest('.play-level-form')
levelSlug = form.find('.level-select').val()
courseID = form.data('course-id')
language = form.find('.language-select').val()
url = "/play/level/#{levelSlug}?course=#{courseID}&codeLanguage=#{language}"
application.router.navigate(url, { trigger: true })
onLoaded: ->
super()

View file

@ -116,7 +116,7 @@ class SolutionsNode extends TreemaArrayNode
solutions.push({
source: source
language: language
passes: true
succeeds: true
})
@set('/', solutions)

View file

@ -0,0 +1,102 @@
CocoClass = require 'core/CocoClass'
SuperModel = require 'models/SuperModel'
{createAetherOptions} = require 'lib/aether_utils'
God = require 'lib/God'
GoalManager = require 'lib/world/GoalManager'
LevelLoader = require 'lib/LevelLoader'
module.exports = class VerifierTest extends CocoClass
constructor: (@levelID, @updateCallback, @supermodel, @language) ->
super()
# TODO: turn this into a Subview
# TODO: listen to Backbone.Mediator.publish 'god:non-user-code-problem', problem: event.data.problem, god: @shared.god from Angel to detect when we can't load the thing
# TODO: listen to the progress report from Angel to show a simulation progress bar (maybe even out of the number of frames we actually know it'll take)
@supermodel ?= new SuperModel()
@language ?= 'python'
@load()
load: ->
@loadStartTime = new Date()
@god = new God maxAngels: 1, headless: true
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, headless: true, fakeSessionConfig: {codeLanguage: @language, callback: @configureSession}
@listenToOnce @levelLoader, 'world-necessities-loaded', @onWorldNecessitiesLoaded
onWorldNecessitiesLoaded: ->
# Called when we have enough to build the world, but not everything is loaded
@grabLevelLoaderData()
unless @solution
@updateCallback? state: 'error'
@error = 'No solution present...'
@state = 'error'
return
me.team = @team = 'humans'
@setupGod()
@initGoalManager()
@register()
configureSession: (session, level) =>
# TODO: reach into and find hero and get the config from the solution
try
hero = _.find level.get("thangs"), id: "Hero Placeholder"
programmable = _.find(hero.components, (x) -> x.config?.programmableMethods?.plan).config.programmableMethods.plan
session.solution = _.find (programmable.solutions ? []), language: session.get('codeLanguage')
session.set 'heroConfig', session.solution.heroConfig
session.set 'code', {'hero-placeholder': plan: session.solution.source}
state = session.get 'state'
state.flagHistory = session.solution.flagHistory
state.difficulty = session.solution.difficulty or 0
session.solution.seed = undefined unless _.isNumber session.solution.seed # TODO: migrate away from submissionCount/sessionID seed objects
catch e
@state = 'error'
@error = "Could not load the session solution for #{level.get('name')}: " + e.toString()
grabLevelLoaderData: ->
@world = @levelLoader.world
@level = @levelLoader.level
@session = @levelLoader.session
@solution = @levelLoader.session.solution
setupGod: ->
@god.setLevel @level.serialize @supermodel, @session
@god.setLevelSessionIDs [@session.id]
@god.setWorldClassMap @world.classMap
@god.lastFlagHistory = @session.get('state').flagHistory
@god.lastDifficulty = @session.get('state').difficulty
@god.lastFixedSeed = @session.solution.seed
@god.lastSubmissionCount = 0
initGoalManager: ->
@goalManager = new GoalManager(@world, @level.get('goals'), @team)
@god.setGoalManager @goalManager
register: ->
@listenToOnce @god, 'infinite-loop', @fail # TODO: have one of these
@listenToOnce @god, 'goals-calculated', @processSingleGameResults
@god.createWorld @generateSpellsObject()
@updateCallback? state: 'running'
processSingleGameResults: (e) ->
@goals = e.goalStates
@frames = e.totalFrames
@lastFrameHash = e.lastFrameHash
@state = 'complete'
@updateCallback? state: @state
fail: (e) ->
@error = 'Failed due to infinate loop.'
@state = 'error'
@updateCallback? state: @state
generateSpellsObject: ->
aetherOptions = createAetherOptions functionName: 'plan', codeLanguage: @session.get('codeLanguage')
spellThang = aether: new Aether aetherOptions
spells = "hero-placeholder/plan": thangs: {'Hero Placeholder': spellThang}, name: 'plan'
source = @session.get('code')['hero-placeholder'].plan
try
spellThang.aether.transpile source
catch e
console.log "Couldn't transpile!\n#{source}\n", e
spellThang.aether.transpile ''
spells

View file

@ -0,0 +1,35 @@
RootView = require 'views/core/RootView'
template = require 'templates/editor/verifier/verifier-view'
VerifierTest = require './VerifierTest'
module.exports = class VerifierView extends RootView
className: 'style-flat'
template: template
id: 'verifier-view'
events:
'input input': 'searchUpdate'
'change input': 'searchUpdate'
constructor: (options, @levelID) ->
super options
# TODO: rework to handle N at a time instead of all at once
# TODO: sort tests by unexpected result first
testLevels = ["dungeons-of-kithgard", "gems-in-the-deep", "shadow-guard", "kounter-kithwise", "crawlways-of-kithgard", "enemy-mine", "illusory-interruption", "forgetful-gemsmith", "signs-and-portents", "favorable-odds", "true-names", "the-prisoner", "banefire", "the-raised-sword", "kithgard-librarian", "fire-dancing", "loop-da-loop", "haunted-kithmaze", "riddling-kithmaze", "descending-further", "the-second-kithmaze", "dread-door", "cupboards-of-kithgard", "hack-and-dash", "known-enemy", "master-of-names", "lowly-kithmen", "closing-the-distance", "tactical-strike", "the-skeleton", "a-mayhem-of-munchkins", "the-final-kithmaze", "the-gauntlet", "radiant-aura", "kithgard-gates", "destroying-angel", "deadly-dungeon-rescue", "kithgard-brawl", "cavern-survival", "breakout", "attack-wisely", "kithgard-mastery", "kithgard-apprentice", "robot-ragnarok", "defense-of-plainswood", "peasant-protection", "forest-fire-dancing"]
#testLevels = testLevels.slice 0, 15
levelIDs = if @levelID then [@levelID] else testLevels
#supermodel = if @levelID then @supermodel else undefined
@tests = []
async.eachSeries levelIDs, (levelID, lnext) =>
async.eachSeries ['python','javascript'], (lang, next) =>
@tests.unshift new VerifierTest levelID, (e) =>
@update(e)
next() if e.state in ['complete', 'error']
, @supermodel, lang
, -> lnext()
update: (event) =>
# TODO: show unworkable tests instead of hiding them
# TODO: destroy them Tests after or something
console.log 'got event', event, 'on some test'
@tests = _.filter @tests, (test) -> test.state isnt 'error'
@render()

View file

@ -75,7 +75,10 @@ module.exports = class ControlBarView extends CocoView
c.spectateGame = @spectateGame
c.observing = @observing
@homeViewArgs = [{supermodel: if @hasReceivedMemoryWarning then null else @supermodel}]
if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder', 'course-ladder']
if me.isTeacher()
@homeLink = "/teachers/courses"
@homeViewClass = "views/courses/TeacherCoursesView"
else if @level.get('type', true) in ['ladder', 'ladder-tutorial', 'hero-ladder', 'course-ladder']
levelID = @level.get('slug')?.replace(/\-tutorial$/, '') or @level.id
@homeLink = '/play/ladder/' + levelID
@homeViewClass = 'views/ladder/LadderView'

View file

@ -135,8 +135,11 @@ module.exports = class PlayLevelView extends RootView
load: ->
@loadStartTime = new Date()
@god = new God debugWorker: true
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @opponentSessionID, team: @getQueryVariable('team'), observing: @observing, courseID: @courseID
@god = new God()
levelLoaderOptions = supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @opponentSessionID, team: @getQueryVariable('team'), observing: @observing, courseID: @courseID
if me.isTeacher()
levelLoaderOptions.fakeSessionConfig = {}
@levelLoader = new LevelLoader levelLoaderOptions
@listenToOnce @levelLoader, 'world-necessities-loaded', @onWorldNecessitiesLoaded
trackLevelLoadEnd: ->
@ -512,7 +515,7 @@ module.exports = class PlayLevelView extends RootView
break
Backbone.Mediator.publish 'tome:cast-spell', {}
onWindowResize: (e) =>
onWindowResize: (e) =>
@endHighlight()
onDisableControls: (e) ->
@ -549,7 +552,7 @@ module.exports = class PlayLevelView extends RootView
@endHighlight()
options = {level: @level, supermodel: @supermodel, session: @session, hasReceivedMemoryWarning: @hasReceivedMemoryWarning, courseID: @courseID, courseInstanceID: @courseInstanceID, world: @world}
ModalClass = if @level.get('type', true) in ['hero', 'hero-ladder', 'hero-coop', 'course', 'course-ladder'] then HeroVictoryModal else VictoryModal
ModalClass = CourseVictoryModal if @isCourseMode()
ModalClass = CourseVictoryModal if @isCourseMode() or me.isTeacher()
ModalClass = PicoCTFVictoryModal if window.serverConfig.picoCTF
victoryModal = new ModalClass(options)
@openModalView(victoryModal)

View file

@ -100,20 +100,23 @@ module.exports = class CourseVictoryModal extends ModalView
triggeredBy: @session.id
achievement: achievement.id
})
ea.save()
# Can't just add models to supermodel because each ea has the same url
ea.sr = @supermodel.addSomethingResource(ea.cid)
@newEarnedAchievements.push ea
@listenToOnce ea, 'sync', (model) ->
model.sr.markLoaded()
if _.all((ea.id for ea in @newEarnedAchievements))
unless me.loading
@supermodel.loadModel(me, {cache: false})
@newEarnedAchievementsResource.markLoaded()
if me.isTeacher()
@newEarnedAchievements.push ea
else
ea.save()
# Can't just add models to supermodel because each ea has the same url
ea.sr = @supermodel.addSomethingResource(ea.cid)
@newEarnedAchievements.push ea
@listenToOnce ea, 'sync', (model) ->
model.sr.markLoaded()
if _.all((ea.id for ea in @newEarnedAchievements))
unless me.loading
@supermodel.loadModel(me, {cache: false})
@newEarnedAchievementsResource.markLoaded()
# have to use a something resource because addModelResource doesn't handle models being upserted/fetched via POST like we're doing here
@newEarnedAchievementsResource = @supermodel.addSomethingResource('earned achievements') if @newEarnedAchievements.length
unless me.isTeacher()
# have to use a something resource because addModelResource doesn't handle models being upserted/fetched via POST like we're doing here
@newEarnedAchievementsResource = @supermodel.addSomethingResource('earned achievements') if @newEarnedAchievements.length
onLoaded: ->
@ -160,9 +163,15 @@ module.exports = class CourseVictoryModal extends ModalView
@showView(@views[index+1])
onNextLevel: ->
link = "/play/level/#{@nextLevel.get('slug')}?course=#{@courseID}&course-instance=#{@courseInstanceID}"
if me.isTeacher()
link = "/play/level/#{@nextLevel.get('slug')}?course=#{@courseID}&codeLanguage=#{me.get('aceConfig').language}"
else
link = "/play/level/#{@nextLevel.get('slug')}?course=#{@courseID}&course-instance=#{@courseInstanceID}"
application.router.navigate(link, {trigger: true})
onDone: ->
link = "/courses/#{@courseID}/#{@courseInstanceID}"
if me.isTeacher()
link = "/teachers/courses"
else
link = "/courses/#{@courseID}/#{@courseInstanceID}"
application.router.navigate(link, {trigger: true})

View file

@ -517,6 +517,17 @@ module.exports = class SpellView extends CocoView
when 'python' then 'while True'
when 'coffeescript' then 'loop'
else 'while true'
# For now, update autocomplete to use hero instead of self/this, if hero is already used in the source.
# Later, we should make this happen all the time - or better yet update the snippets.
source = @getSource()
if /hero/.test(source)
thisToken =
'python': /self/,
'javascript': /this/,
'lua': /self/
if thisToken[e.language] and thisToken[e.language].test(content)
content = content.replace thisToken[e.language], 'hero'
entry =
content: content
meta: $.i18n.t('keyboard_shortcuts.press_enter', defaultValue: 'press enter')
@ -1193,7 +1204,7 @@ module.exports = class SpellView extends CocoView
onSpellBeautify: (e) ->
return unless @spellThang and (@ace.isFocused() or e.spell is @spell)
ugly = @getSource()
pretty = @spellThang.aether.beautify ugly
pretty = @spellThang.aether.beautify(ugly.replace /\bloop\b/g, 'while (__COCO_LOOP_CONSTRUCT__)').replace /while \(__COCO_LOOP_CONSTRUCT__\)/g, 'loop'
@ace.setValue pretty
onMaximizeToggled: (e) ->

View file

@ -169,7 +169,7 @@ module.exports = class TomeView extends CocoView
difficulty = sessionState.difficulty ? 0
if @options.observing
difficulty = Math.max 0, difficulty - 1 # Show the difficulty they won, not the next one.
Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: preload, realTime: realTime, submissionCount: sessionState.submissionCount ? 0, flagHistory: sessionState.flagHistory ? [], difficulty: difficulty, god: @options.god
Backbone.Mediator.publish 'tome:cast-spells', spells: @spells, preload: preload, realTime: realTime, submissionCount: sessionState.submissionCount ? 0, flagHistory: sessionState.flagHistory ? [], difficulty: difficulty, god: @options.god, fixedSeed: @options.fixedSeed
onToggleSpellList: (e) ->
@spellList?.rerenderEntries()

View file

@ -29,7 +29,7 @@ options =
simulateOnlyOneGame: simulateOneGame
options.heapdump = require('heapdump') if options.heapdump
server = if options.testing then 'http://127.0.0.1:3000' else 'https://codecombat.com'
server = if options.testing then 'http://127.0.0.1:3000' else 'http://direct.codecombat.com'
# Use direct instead of live site because jQlone's requests proxy doesn't do caching properly and CloudFlare gets too aggressive.
# Disabled modules
@ -43,22 +43,25 @@ disable = [
# Global emulated stuff
GLOBAL.window = GLOBAL
GLOBAL.document = location: pathname: 'headless_client'
GLOBAL.document =
location:
pathname: 'headless_client'
search: 'esper=1'
GLOBAL.console.debug = console.log
GLOBAL.serverConfig =
picoCTF: false
production: false
try
GLOBAL.Worker = require('webworker-threads').Worker
Worker::removeEventListener = (what) ->
if what is 'message'
@onmessage = -> #This webworker api has only one event listener at a time.
catch
console.log ""
console.log "Headless client needs the webworker-threads package from NPM to function."
console.log "Try installing it with the command:"
console.log ""
console.log " npm install webworker-threads"
console.log ""
process.exit(1)
# Fall back to IE compatibility mode where it runs synchronously with no web worker.
# (Which we will be doing now always because webworker-threads doesn't run in newer node versions.)
eval require('fs').readFileSync('./vendor/scripts/Box2dWeb-2.1.a.3.js', 'utf8')
GLOBAL.Box2D = Box2D
Worker::removeEventListener = (what) ->
if what is 'message'
@onmessage = -> #This webworker api has only one event listener at a time.
GLOBAL.tv4 = require('tv4').tv4
GLOBAL.TreemaUtils = require bowerComponentsPath + 'treema/treema-utils'
GLOBAL.marked = setOptions: ->

View file

@ -0,0 +1,63 @@
child_process = require 'child_process'
chalk = require 'chalk'
_ = require 'lodash'
Promise = require 'bluebird'
path = require 'path'
cores = 4
list = [
"dungeons-of-kithgard", "gems-in-the-deep", "shadow-guard", "kounter-kithwise", "crawlways-of-kithgard",
"enemy-mine", "illusory-interruption", "forgetful-gemsmith", "signs-and-portents", "favorable-odds",
"true-names", "the-prisoner", "banefire", "the-raised-sword", "kithgard-librarian", "fire-dancing",
"loop-da-loop", "haunted-kithmaze", "riddling-kithmaze", "descending-further", "the-second-kithmaze",
"dread-door", "cupboards-of-kithgard", "hack-and-dash", "known-enemy", "master-of-names",
"lowly-kithmen", "closing-the-distance", "tactical-strike", "the-skeleton", "a-mayhem-of-munchkins",
"the-final-kithmaze", "the-gauntlet", "radiant-aura", "kithgard-gates", "destroying-angel", "deadly-dungeon-rescue",
"kithgard-brawl", "cavern-survival", "breakout", "attack-wisely", "kithgard-mastery", "kithgard-apprentice",
"robot-ragnarok", "defense-of-plainswood", "peasant-protection", "forest-fire-dancing"
]
c1 = ["dungeons-of-kithgard", "gems-in-the-deep", "shadow-guard", "enemy-mine", "true-names", "fire-dancing", "loop-da-loop", "haunted-kithmaze", "the-second-kithmaze", "dread-door", "cupboards-of-kithgard", "breakout", "known-enemy", "master-of-names", "a-mayhem-of-munchkins", "the-gauntlet", "the-final-kithmaze", "kithgard-gates", "wakka-maul"]
c2 = ["defense-of-plainswood", "course-winding-trail", "patrol-buster", "endangered-burl", "thumb-biter", "gems-or-death", "village-guard", "thornbush-farm", "back-to-back", "ogre-encampment", "woodland-cleaver", "shield-rush", "range-finder", "peasant-protection", "munchkin-swarm", "forest-fire-dancing", "stillness-in-motion", "the-agrippa-defense", "backwoods-bombardier", "coinucopia", "copper-meadows", "drop-the-flag", "mind-the-trap", "signal-corpse", "rich-forager", "cross-bones"]
list = [].concat(c1, c2)
list = c1
list = _.shuffle(list);
lpad = (s, l, color = 'white') ->
return chalk[color](s.substring(0, l)) if s.length >= l
return chalk[color](s + new Array(l - s.length).join(' '))
chunks = _.groupBy list, (v,i) -> i%cores
_.forEach chunks, (list, cid) ->
console.log(list)
cp = child_process.fork path.join(__dirname, './verifier.js'), list, silent: true
cp.on 'message', (m) ->
return if m.state is 'running'
okay = true
goals = _.map m.observed.goals, (v,k) ->
return lpad('No Goals Set', 15, 'yellow') unless m.solution.goals
lpad(k, 15, if v == m.solution.goals[k] then 'green' else 'red')
extra = []
if m.observed.frameCount == m.solution.frameCount
extra.push lpad('F:' + m.observed.frameCount, 15, 'green')
else
extra.push lpad('F:' + m.observed.frameCount + ' vs ' + m.solution.frameCount , 15, 'red')
okay = false
if m.observed.lastHash == m.solution.lastHash
extra.push lpad('Hash', 5, 'green')
else
extra.push lpad('Hash' , 5, 'red')
okay = false
col = if okay then 'green' else 'red'
if m.state is 'error' or m.error
console.log lpad(m.level, 30, 'red') + lpad(m.language, 15, 'cyan') + chalk.red(m.error)
else
console.log lpad(m.level, 30, col) + lpad(m.language, 15, 'cyan') + ' ' + extra.join(' ') + ' ' + goals.join(' ')

View file

@ -8,8 +8,6 @@ module.exports = $ = (input) ->
append: (input)-> exports: ()->
# Non-standard jQuery stuff. Don't use outside of server.
$._debug = false
$._server = 'https://codecombat.com'
$._cookies = request.jar()
$.when = Deferred.when

View file

@ -0,0 +1,3 @@
require('coffee-script');
require('coffee-script/register');
var server = require('../verifier.coffee');

View file

@ -58,6 +58,7 @@
"aws-sdk": "~2.0.0",
"bayesian-battle": "0.0.7",
"bluebird": "^3.2.1",
"chalk": "^1.1.3",
"co-express": "^1.2.1",
"coffee-script": "1.9.x",
"connect": "2.7.x",

View file

@ -3,30 +3,57 @@
// Set all users with trial requests to a teacher or teacher-like role, depending on trial request.
var hasTrialRequest = {};
var project = {role:1, name:1, email:1, permissions: 1};
db.trial.requests.find().forEach(function(trialRequest) {
print('Inspecting trial request', trialRequest._id);
var role = trialRequest.properties.role || 'teacher';
var user = db.users.findOne({_id: trialRequest.applicant}, {role:1, name:1, email:1});
print(JSON.stringify(user), JSON.stringify(trialRequest.properties), role);
if (!user.role) {
print(db.users.update({_id: trialRequest.applicant}, {$set: {role: role}}));
var user = null;
if(!trialRequest.applicant) {
print('\tNO APPLICANT INCLUDED', JSON.stringify(trialRequest));
if(!trialRequest.properties.email) {
print('\tNO EMAIL EITHER');
return;
}
user = db.users.findOne({emailLower: trialRequest.properties.email.toLowerCase()}, project);
if(!user) {
print('\tUSER WITH EMAIL NOT FOUND, CONTINUE');
return;
}
else {
print("\tOKAY GOT USER, UPDATE TRIAL REQUEST", JSON.stringify(user));
db.trial.requests.update({_id: trialRequest._id}, {$set: {applicant: user._id}});
}
}
else {
user = db.users.findOne({_id: trialRequest.applicant}, project);
}
if (!user.role && (user.permissions||[]).indexOf('admin') === -1) {
print('\tUpdating', JSON.stringify(user), 'to', role);
print(db.users.update({_id: user._id}, {$set: {role: role}}));
}
hasTrialRequest[user._id.str] = true;
});
var teacherRoles = ['teacher', 'technology coordinator', 'advisor', 'principal', 'superintendent'];
// Unset all teacher-like roles for users without a trial request.
// AND removes all remaining users with a teacher-like role from classroom membership (after conversion period)
var hasTrialRequest = {};
var teacherRoles = ['teacher', 'technology coordinator', 'advisor', 'principal', 'superintendent'];
db.trial.requests.find().forEach(function(trialRequest) {
if(!trialRequest.applicant) { return; }
hasTrialRequest[trialRequest.applicant.str] = true;
});
print(Object.keys(hasTrialRequest).length);
db.users.find({'role': {$in: teacherRoles}}, {_id: 1, name: 1, email: 1, role: 1}).forEach(function(user) {
print('Updating user', JSON.stringify(user));
if (!hasTrialRequest.user._id.str) {
print('\tunset role');
//db.users.update({_id: user._id}, {$unset: {role: ''}});
print('Got user with teacher role', user._id);
if (!hasTrialRequest[user._id.str]) {
print('\tUnset role', JSON.stringify(user));
db.users.update({_id: user._id}, {$unset: {role: ''}});
}
else {
return; // TODO: Run when we've moved completely to separate user roles
var count = db.classrooms.count({members: user._id}, {name: 1});
if (count) {
print('\tWill remove from classrooms');
@ -44,9 +71,10 @@ db.classrooms.find({}, {members: 1}).forEach(function(classroom) {
if(!classroom.members) {
return;
}
print('Updating for classroom', classroom._id, 'with members', classroom.members.length);
for (var i in classroom.members) {
var memberID = classroom.members[i];
print('updating member', memberID);
print('\tupdating member', memberID);
print(db.users.update({_id: memberID, role: {$exists: false}}, {$set: {role: 'student'}}));
}
});
}
});

View file

@ -1,8 +1,8 @@
// Upsert new lead data into Close.io
'use strict';
if (process.argv.length !== 5) {
log("Usage: node <script> <Close.io API key> <Intercom 'App ID:API key'> <mongo connection Url>");
if (process.argv.length !== 7) {
log("Usage: node <script> <Close.io general API key> <Close.io mail API key1> <Close.io mail API key2> <Intercom 'App ID:API key'> <mongo connection Url>");
process.exit();
}
@ -24,14 +24,19 @@ const customFieldsToRemove = [
];
// Skip these problematic leads
const leadsToSkip = ['6 sınıflar', 'fdsafd', 'ashtasht', 'matt+20160404teacher3 school', 'sdfdsf'];
const leadsToSkip = ['6 sınıflar', 'fdsafd', 'ashtasht', 'matt+20160404teacher3 school', 'sdfdsf', 'ddddd', 'dsfadsaf', "Nolan's School of Wonders"];
const demoRequestEmailTemplates = ['tmpl_s7BZiydyCHOMMeXAcqRZzqn0fOtk0yOFlXSZ412MSGm', 'tmpl_cGb6m4ssDvqjvYd8UaG6cacvtSXkZY3vj9b9lSmdQrf'];
const createTeacherEmailTemplates = ['tmpl_i5bQ2dOlMdZTvZil21bhTx44JYoojPbFkciJ0F560mn', 'tmpl_CEZ9PuE1y4PRvlYiKB5kRbZAQcTIucxDvSeqvtQW57G'];
const emailDelayMinutes = 27;
const scriptStartTime = new Date();
const closeIoApiKey = process.argv[2];
const intercomAppIdApiKey = process.argv[3];
const closeIoMailApiKeys = [process.argv[3], process.argv[4]]; // Automatic mails sent as API owners
const intercomAppIdApiKey = process.argv[5];
const intercomAppId = intercomAppIdApiKey.split(':')[0];
const intercomApiKey = intercomAppIdApiKey.split(':')[1];
const mongoConnUrl = process.argv[4];
const mongoConnUrl = process.argv[6];
const MongoClient = require('mongodb').MongoClient;
const async = require('async');
const request = require('request');
@ -88,7 +93,12 @@ class Lead {
}
addTrialRequest(email, trial) {
if (!this.contacts[email.toLowerCase()]) this.contacts[email.toLowerCase()] = {};
this.contacts[email.toLowerCase()].name = trial.properties.name;
if (trial.properties.firstName && trial.properties.lastName) {
this.contacts[email.toLowerCase()].name = `${trial.properties.firstName} ${trial.properties.lastName}`;
}
else if (trial.properties.name) {
this.contacts[email.toLowerCase()].name = trial.properties.name;
}
this.contacts[email.toLowerCase()].trial = trial;
}
addUser(email, user) {
@ -98,11 +108,11 @@ class Lead {
const postData = {
display_name: this.name,
name: this.name,
status: 'Not Attempted',
status: 'Auto Attempted',
contacts: this.getContactsPostData(),
custom: {
lastUpdated: new Date(),
'Lead Origin': 'Demo Request'
'Lead Origin': this.getLeadOrigin()
}
};
for (const email in this.contacts) {
@ -121,8 +131,8 @@ class Lead {
// console.log('DEBUG: getLeadPutData', currentLead.name);
const putData = {};
const currentCustom = currentLead.custom || {};
if (currentCustom['Lead Origin'] !== 'Demo Request') {
putData['custom.Lead Origin'] = 'Demo Request';
if (!currentCustom['Lead Origin']) {
putData['custom.Lead Origin'] = this.getLeadOrigin();
}
for (const email in this.contacts) {
@ -145,6 +155,18 @@ class Lead {
}
return putData;
}
getLeadOrigin() {
for (const email in this.contacts) {
const props = this.contacts[email].trial.properties;
switch (props.siteOrigin) {
case 'create teacher':
return 'Create Teacher';
case 'convert teacher':
return 'Convert Teacher';
}
}
return 'Demo Request';
}
getContactsPostData(existingLead) {
const postData = [];
const existingEmails = {};
@ -362,7 +384,7 @@ function updateExistingLead(lead, existingLead, done) {
const tasks = []
for (const newContact of newContacts) {
newContact.lead_id = existingLead.id;
tasks.push(createAddContactFn(newContact));
tasks.push(createAddContactFn(newContact, lead, existingLead));
}
async.parallel(tasks, (err, results) => {
if (err) return done(err);
@ -409,12 +431,27 @@ function saveNewLead(lead, done) {
tasks.push(createAddNoteFn(existingLead.id, newNote));
}
async.parallel(tasks, (err, results) => {
return done(err);
if (err) return done(err);
// Send emails to new contacts
const tasks = [];
for (const contact of existingLead.contacts) {
for (const email of contact.emails) {
if (['create teacher', 'convert teacher'].indexOf(lead.contacts[email.email].trial.properties.siteOrigin) >= 0) {
tasks.push(createSendEmailFn(email.email, existingLead.id, contact.id, getRandomEmailTemplate(createTeacherEmailTemplates)));
}
else {
tasks.push(createSendEmailFn(email.email, existingLead.id, contact.id, getRandomEmailTemplate(demoRequestEmailTemplates)));
}
}
}
async.parallel(tasks, (err, results) => {
return done(err);
});
});
});
}
function createUpdateLeadFn(lead) {
return (done) => {
// console.log('DEBUG: updateLead', lead.name);
@ -441,21 +478,30 @@ function createUpdateLeadFn(lead) {
};
}
function createAddContactFn(postData) {
function createAddContactFn(postData, internalLead, externalLead) {
return (done) => {
// console.log('DEBUG: addContact', postData.lead_id);
const options = {
uri: `https://${closeIoApiKey}:X@app.close.io/api/v1/activity/Contact/`,
uri: `https://${closeIoApiKey}:X@app.close.io/api/v1/contact/`,
body: JSON.stringify(postData)
};
request.post(options, (error, response, body) => {
if (error) return done(error);
const result = JSON.parse(body);
if (result.errors || result['field-errors']) {
console.error(`New Contact POST error for ${leadId}`);
const newContact = JSON.parse(body);
if (newContact.errors || newContact['field-errors']) {
console.error(`New Contact POST error for ${postData.lead_id}`);
console.error(body);
return done();
}
// Send emails to new contact
const email = postData.emails[0].email;
if (['create teacher', 'convert teacher'].indexOf(internalLead.contacts[email].trial.properties.siteOrigin) >= 0) {
return sendMail(email, externalLead.id, newContact.id, getRandomEmailTemplate(createTeacherEmailTemplates), done);
}
else {
return sendMail(email, externalLead.id, newContact.id, getRandomEmailTemplate(demoRequestEmailTemplates), done);
}
return done();
});
};
}
@ -484,6 +530,53 @@ function createAddNoteFn(leadId, newNote) {
};
}
function getRandomEmailTemplate(templates) {
if (templates.length < 0) return '';
return templates[Math.floor(Math.random() * templates.length)];
}
function getRandomEmailApiKey() {
if (closeIoMailApiKeys.length < 0) return;
return closeIoMailApiKeys[Math.floor(Math.random() * closeIoMailApiKeys.length)];
}
function createSendEmailFn(email, leadId, contactId, template) {
return (done) => {
return sendMail(email, leadId, contactId, template, done);
};
}
function sendMail(toEmail, leadId, contactId, template, done) {
// console.log('DEBUG: sendMail', toEmail, leadId, contactId, template);
const dateScheduled = new Date();
dateScheduled.setUTCMinutes(dateScheduled.getUTCMinutes() + emailDelayMinutes);
const postData = {
to: [toEmail],
contact_id: contactId,
lead_id: leadId,
template_id: template,
status: 'scheduled',
date_scheduled: dateScheduled
};
const options = {
uri: `https://${getRandomEmailApiKey()}:X@app.close.io/api/v1/activity/email/`,
body: JSON.stringify(postData)
};
request.post(options, (error, response, body) => {
if (error) return done(error);
const result = JSON.parse(body);
if (result.errors || result['field-errors']) {
const errorMessage = `Send email POST error for ${toEmail} ${leadId} ${contactId}`;
console.error(errorMessage);
console.error(body);
// console.error(postData);
return done(errorMessage);
}
return done();
});
}
function updateLeads(leads, done) {
const tasks = []
for (const name in leads) {

View file

@ -0,0 +1,40 @@
authentication = require 'passport'
LocalStrategy = require('passport-local').Strategy
User = require '../models/User'
config = require '../../server_config'
errors = require '../commons/errors'
module.exports.setup = ->
authentication.serializeUser((user, done) -> done(null, user._id))
authentication.deserializeUser((id, done) ->
User.findById(id, (err, user) -> done(err, user)))
if config.picoCTF
pico = require('../lib/picoctf');
authentication.use new pico.PicoStrategy()
return
authentication.use(new LocalStrategy(
(username, password, done) ->
# kind of a hacky way to make it possible for iPads to 'log in' with their unique device id
if username.length is 36 and '@' not in username # must be an identifier for vendor
q = { iosIdentifierForVendor: username }
else
q = { emailLower: username.toLowerCase() }
User.findOne(q).exec((err, user) ->
return done(err) if err
if not user
return done(new errors.Unauthorized('not found', { property: 'email' }))
passwordReset = (user.get('passwordReset') or '').toLowerCase()
if passwordReset and password.toLowerCase() is passwordReset
User.update {_id: user.get('_id')}, {$unset: {passwordReset: ''}}, {}, ->
return done(null, user)
hash = User.hashPassword(password)
unless user.get('passwordHash') is hash
return done(new errors.Unauthorized('is wrong', { property: 'password' }))
return done(null, user)
)
))

View file

@ -88,6 +88,10 @@ errorResponseSchema = {
type: 'string'
description: 'Property which is related to the error (conflict, validation).'
}
name: {
type: 'string'
description: 'Provided for /auth/name.' # TODO: refactor out
}
}
}
errorProps = _.keys(errorResponseSchema.properties)

View file

@ -24,7 +24,6 @@ module.exports.handlers =
'user_code_problem': 'handlers/user_code_problem_handler'
'user_remark': 'handlers/user_remark_handler'
'mail_sent': 'handlers/mail_sent_handler'
'achievement': 'handlers/achievement_handler'
'earned_achievement': 'handlers/earned_achievement_handler'
'poll': 'handlers/poll_handler'
'prepaid': 'handlers/prepaid_handler'
@ -48,7 +47,6 @@ module.exports.handlerUrlOverrides =
module.exports.routes =
[
'routes/admin'
'routes/auth'
'routes/contact'
'routes/db'
'routes/file'

View file

@ -1,62 +0,0 @@
Achievement = require './../models/Achievement'
Handler = require '../commons/Handler'
class AchievementHandler extends Handler
modelClass: Achievement
# Used to determine which properties requests may edit
editableProperties: [
'name'
'query'
'worth'
'collection'
'description'
'userField'
'proportionalTo'
'icon'
'function'
'related'
'difficulty'
'category'
'rewards'
'i18n'
'i18nCoverage'
]
allowedMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']
jsonSchema = require '../../app/schemas/models/achievement.coffee'
hasAccess: (req) ->
req.method in ['GET', 'PUT'] or req.user?.isAdmin() or req.user?.isArtisan()
hasAccessToDocument: (req, document, method=null) ->
method = (method or req.method).toLowerCase()
return true if method is 'get'
return true if req.user?.isAdmin() or req.user?.isArtisan()
return true if method is 'put' and @isJustFillingTranslations(req, document)
return
get: (req, res) ->
# /db/achievement?related=<ID>
if req.query.related
return @sendForbiddenError(res) if not @hasAccess(req)
Achievement.find {related: req.query.related}, (err, docs) =>
return @sendDatabaseError(res, err) if err
docs = (@formatEntity(req, doc) for doc in docs)
@sendSuccess res, docs
else
super req, res
delete: (req, res, slugOrID) ->
return @sendForbiddenError res unless req.user?.isAdmin() or req.user?.isArtisan()
@getDocumentForIdOrSlug slugOrID, (err, document) => # Check first
return @sendDatabaseError(res, err) if err
return @sendNotFoundError(res) unless document?
document.remove (err, document) =>
return @sendDatabaseError(res, err) if err
@sendNoContent res
getNamesByIDs: (req, res) -> @getNamesByOriginals req, res, true
module.exports = new AchievementHandler()

View file

@ -7,24 +7,10 @@ mongoose = require 'mongoose'
CampaignHandler = class CampaignHandler extends Handler
modelClass: Campaign
editableProperties: [
'name'
'fullName'
'description'
'type'
'i18n'
'i18nCoverage'
'ambientSound'
'backgroundImage'
'backgroundColor'
'backgroundColorTransparent'
'adjacentCampaigns'
'levels'
]
jsonSchema: require '../../app/schemas/models/campaign.schema'
hasAccess: (req) ->
req.method in ['GET', 'PUT'] or req.user?.isAdmin()
req.method in ['GET'] or req.user?.isAdmin()
hasAccessToDocument: (req, document, method=null) ->
return true if req.user?.isAdmin()
@ -124,10 +110,6 @@ CampaignHandler = class CampaignHandler extends Handler
return @sendDatabaseError(res, err) if err
return @sendSuccess(res, (achievement.toObject() for achievement in achievements))
onPutSuccess: (req, doc) ->
docLink = "http://codecombat.com#{req.headers['x-current-path']}"
@sendChangedSlackMessage creator: req.user, target: doc, docLink: docLink
getNamesByIDs: (req, res) -> @getNamesByOriginals req, res, true
module.exports = new CampaignHandler()

View file

@ -10,12 +10,11 @@ UserHandler = require './user_handler'
ClassroomHandler = class ClassroomHandler extends Handler
modelClass: Classroom
jsonSchema: require '../../app/schemas/models/classroom.schema'
allowedMethods: ['GET', 'POST', 'PUT', 'DELETE']
allowedMethods: ['GET', 'PUT', 'DELETE']
hasAccess: (req) ->
return false unless req.user
return true if req.method is 'GET'
return false if req.method is 'POST' and not req.user?.isTeacher()
req.method in @allowedMethods or req.user?.isAdmin()
hasAccessToDocument: (req, document, method=null) ->
@ -27,12 +26,6 @@ ClassroomHandler = class ClassroomHandler extends Handler
return true if isGet and isMember
false
makeNewInstance: (req) ->
instance = super(req)
instance.set 'ownerID', req.user._id
instance.set 'members', []
instance
getByRelationship: (req, res, args...) ->
method = req.method.toLowerCase()
return @inviteStudents(req, res, args[0]) if args[1] is 'invite-members'

View file

@ -164,12 +164,12 @@ PaymentHandler = class PaymentHandler extends Handler
rawReceipt: receipt
localPrice: localPrice
}
validation = @validateDocumentInput(payment.toObject())
if validation.valid is false
@logPaymentError(req, 'Invalid apple payment object.')
return @sendBadInputError(res, validation.errors)
payment.save((err) =>
if err
@logPaymentError(req, 'Apple payment save error.'+err)
@ -250,7 +250,7 @@ PaymentHandler = class PaymentHandler extends Handler
@logPaymentError(req, 'Stripe async load db error. '+err)
return @sendDatabaseError(res, err)
[payment, charge, product] = results
if not product
return @sendNotFoundError(res, 'could not find product with id '+productID)
@ -405,8 +405,7 @@ PaymentHandler = class PaymentHandler extends Handler
sendPaymentSlackMessage: (options) ->
try
message = "#{options.user?.get('name')} bought #{options.payment?.get('amount')} via #{options.payment?.get('service')}"
message += " for #{options.payment.get('description')}" if options.payment?.get('description')
message = "#{options.user?.get('emailLower')} paid #{options.payment?.get('amount')} for #{options.payment.get('description') or '???, no payment description!'}"
slack.sendSlackMessage message, ['tower']
catch e
log.error "Couldn't send Slack message on payment because of error: #{e}"

View file

@ -36,8 +36,8 @@ PrepaidHandler = class PrepaidHandler extends Handler
getCoursePrepaidsAPI: (req, res, code) ->
return @sendSuccess(res, []) unless req.user?.isAdmin()
query = {$and: [
{type: 'course'},
{maxRedeemers: {$ne: "9999"}},
{type: 'course'},
{maxRedeemers: {$ne: "9999"}},
{'properties.courseIDs': {$exists: false}},
{_id: {$gt: cutoffID}}
]}
@ -151,7 +151,7 @@ PrepaidHandler = class PrepaidHandler extends Handler
Product.findOne({name: 'prepaid_subscription'}).exec (err, product) =>
return @sendDatabaseError(res, err) if err
return @sendNotFoundError(res, 'prepaid_subscription product not found') if not product
@purchasePrepaidTerminalSubscription req.user, description, maxRedeemers, months, timestamp, token, product, (err, prepaid) =>
return @sendDatabaseError(res, err) if err
@sendSuccess(res, prepaid.toObject())
@ -213,7 +213,7 @@ PrepaidHandler = class PrepaidHandler extends Handler
if err
@logError(user, "createPayment error: #{JSON.stringify(err)}")
return done(err)
msg = "Prepaid code purchased: #{type} seats=#{maxRedeemers} #{user.get('email')}"
msg = "#{user.get('email')} paid #{payment.get('amount')} for #{type} prepaid redeemers=#{maxRedeemers}"
slack.sendSlackMessage msg, ['tower']
done(null, prepaid)
@ -250,7 +250,7 @@ PrepaidHandler = class PrepaidHandler extends Handler
if err
@logError(user, "createPayment error: #{JSON.stringify(err)}")
return done(err)
msg = "Prepaid code purchased: #{type} users=#{maxRedeemers} months=#{months} #{user.get('email')}"
msg = "#{user.get('email')} paid #{payment.get('amount')} for #{type} prepaid redeemers=#{maxRedeemers} months=#{months}"
slack.sendSlackMessage msg, ['tower']
done(null, prepaid)

View file

@ -184,7 +184,7 @@ class SubscriptionHandler extends Handler
@logSubscriptionError(req.user, "User save error: #{JSON.stringify(err)}")
return @sendDatabaseError(res, err)
try
msg = "Year subscription purchased by #{req.user.get('email')} #{req.user.id}"
msg = "#{req.user.get('email')} paid #{payment.get('amount')} for year campaign subscription"
slack.sendSlackMessage msg, ['tower']
catch error
@logSubscriptionError(req.user, "Year sub sale Slack tower msg error: #{JSON.stringify(error)}")

View file

@ -0,0 +1,25 @@
errors = require '../commons/errors'
wrap = require 'co-express'
database = require '../commons/database'
Achievement = require '../models/Achievement'
module.exports =
fetchByRelated: wrap (req, res, next) ->
related = req.query.related
return next() unless related
achievements = yield Achievement.find {related: related}
achievements = (achievement.toObject({req: req}) for achievement in achievements)
res.status(200).send(achievements)
put: wrap (req, res, next) ->
achievement = yield database.getDocFromHandle(req, Achievement)
if not achievement
throw new errors.NotFound('Document not found.')
hasPermission = req.user.isAdmin() or req.user.isArtisan()
unless hasPermission or database.isJustFillingTranslations(req, achievement)
throw new errors.Forbidden('Must be an admin, artisan or submitting translations to edit an achievement')
database.assignBody(req, achievement)
database.validateDoc(achievement)
achievement = yield achievement.save()
res.status(200).send(achievement.toObject({req: req}))

View file

@ -8,6 +8,9 @@ request = require 'request'
User = require '../models/User'
utils = require '../lib/utils'
mongoose = require 'mongoose'
authentication = require 'passport'
sendwithus = require '../sendwithus'
LevelSession = require '../models/LevelSession'
module.exports =
checkDocumentPermissions: (req, res, next) ->
@ -34,8 +37,26 @@ module.exports =
if not _.size(_.intersection(req.user.get('permissions'), permissions))
return next new errors.Forbidden('You do not have permissions necessary.')
next()
whoAmI: wrap (req, res) ->
if not req.user
user = User.makeNew(req)
yield user.save()
req.logInAsync = Promise.promisify(req.logIn)
yield req.logInAsync(user)
if req.query.callback
res.jsonp(req.user.toObject({req, publicOnly: true}))
else
res.send(req.user.toObject({req, publicOnly: false}))
res.end()
loginByGPlus: wrap (req, res) ->
afterLogin: wrap (req, res, next) ->
activity = req.user.trackActivity 'login', 1
yield req.user.update {activity: activity}
res.status(200).send(req.user.toObject({req: req}))
loginByGPlus: wrap (req, res, next) ->
gpID = req.body.gplusID
gpAT = req.body.gplusAccessToken
throw new errors.UnprocessableEntity('gplusID and gplusAccessToken required.') unless gpID and gpAT
@ -48,9 +69,9 @@ module.exports =
throw new errors.NotFound('No user with that G+ ID') unless user
req.logInAsync = Promise.promisify(req.logIn)
yield req.logInAsync(user)
res.status(200).send(user.formatEntity(req))
next()
loginByFacebook: wrap (req, res) ->
loginByFacebook: wrap (req, res, next) ->
fbID = req.body.facebookID
fbAT = req.body.facebookAccessToken
throw new errors.UnprocessableEntity('facebookID and facebookAccessToken required.') unless fbID and fbAT
@ -63,7 +84,7 @@ module.exports =
throw new errors.NotFound('No user with that Facebook ID') unless user
req.logInAsync = Promise.promisify(req.logIn)
yield req.logInAsync(user)
res.status(200).send(user.formatEntity(req))
next()
spy: wrap (req, res) ->
throw new errors.Unauthorized('You must be logged in to enter espionage mode') unless req.user
@ -94,3 +115,84 @@ module.exports =
req.loginAsync = Promise.promisify(req.login)
yield req.loginAsync user
res.status(200).send(user.toObject({req: req}))
logout: (req, res) ->
req.logout()
res.send({})
reset: wrap (req, res) ->
unless req.body.email
throw new errors.UnprocessableEntity('Need an email specified.', {property: 'email'})
user = yield User.findOne({emailLower: req.body.email.toLowerCase()})
if not user
throw new errors.NotFound('not found', {property: 'email'})
user.set('passwordReset', utils.getCodeCamel())
yield user.save()
context =
email_id: sendwithus.templates.password_reset
recipient:
address: req.body.email
email_data:
tempPassword: user.get('passwordReset')
sendwithus.api.sendAsync = Promise.promisify(sendwithus.api.send)
yield sendwithus.api.sendAsync(context)
res.end()
unsubscribe: wrap (req, res) ->
email = req.query.email
unless email
throw new errors.UnprocessableEntity 'No email provided to unsubscribe.'
email = decodeURIComponent(email)
if req.query.session
# Unsubscribe from just one session's notifications instead.
session = yield LevelSession.findOne({_id: req.query.session})
if not session
throw new errors.NotFound "Level session not found"
session.set 'unsubscribed', true
yield session.save()
res.send "Unsubscribed #{email} from CodeCombat emails for #{session.get('levelName')} #{session.get('team')} ladder updates. Sorry to see you go! <p><a href='/play/ladder/#{session.levelID}#my-matches'>Ladder preferences</a></p>"
res.end()
return
user = yield User.findOne({emailLower: email.toLowerCase()})
if not user
throw new errors.NotFound "No user found with email '#{email}'"
emails = _.clone(user.get('emails')) or {}
msg = ''
if req.query.recruitNotes
emails.recruitNotes ?= {}
emails.recruitNotes.enabled = false
msg = "Unsubscribed #{email} from recruiting emails."
else if req.query.employerNotes
emails.employerNotes ?= {}
emails.employerNotes.enabled = false
msg = "Unsubscribed #{email} from employer emails."
else
msg = "Unsubscribed #{email} from all CodeCombat emails. Sorry to see you go!"
emailSettings.enabled = false for emailSettings in _.values(emails)
emails.generalNews ?= {}
emails.generalNews.enabled = false
emails.anyNotes ?= {}
emails.anyNotes.enabled = false
yield user.update {$set: {emails: emails}}
res.send msg + '<p><a href="/account/settings">Account settings</a></p>'
res.end()
name: wrap (req, res) ->
if not req.params.name
throw new errors.UnprocessableEntity 'No name provided.'
originalName = req.params.name
User.unconflictNameAsync = Promise.promisify(User.unconflictName)
name = yield User.unconflictNameAsync originalName
response = name: name
if originalName is name
res.send 200, response
else
throw new errors.Conflict('Name is taken', response)

View file

@ -7,6 +7,7 @@ mongoose = require 'mongoose'
Campaign = require '../models/Campaign'
parse = require '../commons/parse'
LevelSession = require '../models/LevelSession'
slack = require '../slack'
module.exports =
fetchByType: wrap (req, res, next) ->
@ -19,3 +20,18 @@ module.exports =
campaigns = yield dbq.exec()
campaigns = (campaign.toObject({req: req}) for campaign in campaigns)
res.status(200).send(campaigns)
put: wrap (req, res) ->
campaign = yield database.getDocFromHandle(req, Campaign)
if not campaign
throw new errors.NotFound('Campaign not found.')
hasPermission = req.user.isAdmin()
unless hasPermission or database.isJustFillingTranslations(req, campaign)
throw new errors.Forbidden('Must be an admin or submitting translations to edit a campaign')
database.assignBody(req, campaign)
database.validateDoc(campaign)
campaign = yield campaign.save()
res.status(200).send(campaign.toObject())
docLink = "http://codecombat.com#{req.headers['x-current-path']}"
slack.sendChangedSlackMessage creator: req.user, target: campaign, docLink: docLink

View file

@ -62,3 +62,14 @@ module.exports =
memberObjects = (member.toObject({ req: req, includedPrivates: ["name", "email"] }) for member in members)
res.status(200).send(memberObjects)
post: wrap (req, res) ->
throw new errors.Unauthorized() unless req.user and not req.user.isAnonymous()
throw new errors.Forbidden() unless req.user?.isTeacher()
classroom = database.initDoc(req, Classroom)
classroom.set 'ownerID', req.user._id
classroom.set 'members', []
database.assignBody(req, classroom)
database.validateDoc(classroom)
classroom = yield classroom.save()
res.status(201).send(classroom.toObject({req: req}))

View file

@ -1,4 +1,5 @@
module.exports =
achievements: require './achievements'
auth: require './auth'
classrooms: require './classrooms'
campaigns: require './campaigns'

Some files were not shown because too many files have changed in this diff Show more