mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-13 01:01:34 -05:00
Merge remote-tracking branch 'origin/master' into production
This commit is contained in:
commit
7d8024616a
125 changed files with 2398 additions and 1814 deletions
|
@ -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();
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 doesn’t look like you’re 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, there’s nothing we can show you here! Make sure you’re 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, there’s 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 it’s 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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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."
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 that’s engaging and"
|
||||
# motivating: "motivating"
|
||||
motivating: "motivador"
|
||||
# not_tedious: "not tedious."
|
||||
# gaming_is_good: "Studies suggest gaming is good for children’s brains. (it’s 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: "You’re ready to take the next step! Explore hundreds of challenging levels, learn advanced programming skills, and compete in multiplayer arenas!"
|
||||
# create_account_title: "Create an Account"
|
||||
|
@ -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 it’s 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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 that’s engaging and"
|
||||
# motivating: "motivating"
|
||||
# not_tedious: "not tedious."
|
||||
# gaming_is_good: "Studies suggest gaming is good for children’s brains. (it’s 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: "Açı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!"
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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++
|
||||
|
|
|
@ -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'}
|
||||
|
|
|
@ -70,3 +70,6 @@ module.exports =
|
|||
|
||||
'application:service-loaded': c.object {required: ['service']},
|
||||
service: {type: 'string'} # 'segment'
|
||||
|
||||
'test:update': c.object {},
|
||||
state: {type: 'string'}
|
||||
|
|
|
@ -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'}
|
||||
|
|
|
@ -5,4 +5,9 @@
|
|||
margin-bottom: 5px
|
||||
|
||||
p
|
||||
margin-top: 30px
|
||||
margin-top: 30px
|
||||
|
||||
.course-title
|
||||
white-space: nowrap
|
||||
text-overflow: ellipsis
|
||||
overflow: hidden
|
||||
|
|
|
@ -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")
|
||||
|
|
33
app/templates/editor/verifier/verifier-view.jade
Normal file
33
app/templates/editor/verifier/verifier-view.jade
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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/", "/"))
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -116,7 +116,7 @@ class SolutionsNode extends TreemaArrayNode
|
|||
solutions.push({
|
||||
source: source
|
||||
language: language
|
||||
passes: true
|
||||
succeeds: true
|
||||
})
|
||||
|
||||
@set('/', solutions)
|
102
app/views/editor/verifier/VerifierTest.coffee
Normal file
102
app/views/editor/verifier/VerifierTest.coffee
Normal 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
|
35
app/views/editor/verifier/VerifierView.coffee
Normal file
35
app/views/editor/verifier/VerifierView.coffee
Normal 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()
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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: ->
|
||||
|
|
63
headless_client/cluster.coffee
Normal file
63
headless_client/cluster.coffee
Normal 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(' ')
|
|
@ -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
|
||||
|
|
3
headless_client/verifier.js
Normal file
3
headless_client/verifier.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
require('coffee-script');
|
||||
require('coffee-script/register');
|
||||
var server = require('../verifier.coffee');
|
|
@ -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",
|
||||
|
|
|
@ -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'}}));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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) {
|
||||
|
|
40
server/commons/auth.coffee
Normal file
40
server/commons/auth.coffee
Normal 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)
|
||||
)
|
||||
))
|
|
@ -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)
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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()
|
|
@ -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()
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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}"
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)}")
|
||||
|
|
25
server/middleware/achievements.coffee
Normal file
25
server/middleware/achievements.coffee
Normal 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}))
|
|
@ -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)
|
|
@ -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
|
||||
|
|
|
@ -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}))
|
|
@ -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
Loading…
Reference in a new issue